]> git.lyx.org Git - features.git/commitdiff
Embedding: add embedding support for InsetExternal. (params["embed"] is added)
authorBo Peng <bpeng@lyx.org>
Tue, 8 Jan 2008 16:42:28 +0000 (16:42 +0000)
committerBo Peng <bpeng@lyx.org>
Tue, 8 Jan 2008 16:42:28 +0000 (16:42 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@22442 a592a061-630c-0410-9148-cb99ea01b6c8

src/frontends/qt4/GuiExternal.cpp
src/insets/ExternalSupport.cpp
src/insets/InsetExternal.cpp
src/insets/InsetExternal.h

index 0c0f178ba1ad27b839522a8650cb57d5efbe3d83..49fbdeadb776cfc5ec916631d27ccf8f552777d2 100644 (file)
@@ -110,6 +110,8 @@ GuiExternal::GuiExternal(GuiView & lv)
                this, SLOT(change_adaptor()));
        connect(browsePB, SIGNAL(clicked()),
                this, SLOT(browseClicked()));
+       connect(embedCB, SIGNAL(toggled(bool)),
+               this, SLOT(change_adaptor()));
        connect(editPB, SIGNAL(clicked()),
                this, SLOT(editClicked()));
        connect(externalCO, SIGNAL(activated(QString)),
@@ -557,6 +559,7 @@ void GuiExternal::updateContents()
        string const name =
                params_.filename.outputFilename(bufferFilepath());
        fileED->setText(toqstr(name));
+       embedCB->setCheckState(params_.filename.embedded() ? Qt::Checked : Qt::Unchecked);
 
        externalCO->setCurrentIndex(getTemplateNumber(params_.templatename()));
        updateTemplate();
@@ -639,6 +642,7 @@ void GuiExternal::updateTemplate()
 void GuiExternal::applyView()
 {
        params_.filename.set(fromqstr(fileED->text()), bufferFilepath());
+       params_.filename.setEmbed(embedCB->checkState() == Qt::Checked);
 
        params_.settemplate(getTemplate(externalCO->currentIndex()).lyxName);
 
index 0ce66a42e7a176346173f7bc8c67c42badd8d887..0d2615883bd745cf42fe2d99a4a66d58586040f8 100644 (file)
@@ -50,7 +50,7 @@ Template const * getTemplatePtr(InsetExternalParams const & params)
 
 void editExternal(InsetExternalParams const & params, Buffer const & buffer)
 {
-       formats.edit(buffer, params.filename,
+       formats.edit(buffer, params.filename.availableFile(),
                     formats.getFormatFromFile(params.filename));
 }
 
@@ -254,7 +254,7 @@ void updateExternal(InsetExternalParams const & params,
 
                if (from_checksum != temp_checksum) {
                        Mover const & mover = getMover(from_format);
-                       if (!mover.copy(params.filename, temp_file)) {
+                       if (!mover.copy(params.filename.availableFile(), temp_file)) {
                                LYXERR(Debug::EXTERNAL, "external::updateExternal. "
                                        << "Unable to copy " << params.filename << " to " << temp_file);
                                return; // FAILURE
@@ -310,7 +310,7 @@ void updateExternal(InsetExternalParams const & params,
        ErrorList el;
        bool const success =
                theConverters().convert(&buffer, temp_file, abs_to_file,
-                                  params.filename, from_format, to_format, el,
+                                  params.filename.availableFile(), from_format, to_format, el,
                                   Converters::try_default | Converters::try_cache);
 
        if (!success) {
index 5e04597b3a8eb355ce315a7bb14d71ee6b6becc8..38801381fb5902f04494d284b66af1efa7309330 100644 (file)
 #include "MetricsInfo.h"
 #include "OutputParams.h"
 
+#include "frontends/alert.h"
+
 #include "graphics/PreviewLoader.h"
 
+#include "support/ExceptionMessage.h"
 #include "support/filetools.h"
 #include "support/lstrings.h"
 #include "support/lyxlib.h"
@@ -59,6 +62,8 @@ string defaultTemplateName;
 
 namespace lyx {
 
+namespace Alert = frontend::Alert;
+
 extern bool use_gui;
 
 namespace external {
@@ -182,9 +187,10 @@ void InsetExternalParams::write(Buffer const & buffer, ostream & os) const
        os << "External\n"
           << "\ttemplate " << templatename() << '\n';
 
-       if (!filename.empty())
+       if (!filename.empty()) {
                os << "\tfilename " << filename.outputFilename(buffer.filePath()) << '\n';
-
+               os << "\tembed " << (filename.embedded() ? "true" : "false") << '\n';
+       }
        if (display != defaultDisplayType)
                os << "\tdisplay "
                   << external::displayTranslator().find(display)
@@ -241,6 +247,7 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex)
        enum ExternalTags {
                EX_TEMPLATE = 1,
                EX_FILENAME,
+               EX_EMBED,
                EX_DISPLAY,
                EX_LYXSCALE,
                EX_DRAFT,
@@ -264,6 +271,7 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex)
                { "draft",           EX_DRAFT},
                { "extra",           EX_EXTRA },
                { "filename",        EX_FILENAME},
+               { "embed",           EX_EMBED},
                { "height",          EX_HEIGHT },
                { "keepAspectRatio", EX_KEEPASPECTRATIO },
                { "lyxscale",        EX_LYXSCALE},
@@ -292,6 +300,12 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex)
                        filename.set(name, buffer.filePath());
                        break;
                }
+               
+               case EX_EMBED: {
+                       lex.next();
+                       filename.setEmbed(lex.getBool());
+                       break;
+               }
 
                case EX_DISPLAY: {
                        lex.next();
@@ -437,6 +451,15 @@ void InsetExternal::doDispatch(Cursor & cur, FuncRequest & cmd)
                Buffer const & buffer = cur.buffer();
                InsetExternalParams p;
                InsetExternalMailer::string2params(to_utf8(cmd.argument()), buffer, p);
+               if (!p.filename.empty()) {
+                       try {
+                               p.filename.enable(buffer.embeddedFiles().enabled(), &buffer);
+                       } catch (ExceptionMessage const & message) {
+                               Alert::error(message.title_, message.details_);
+                               // do not set parameter if an error happens
+                               break;
+                       }
+               }
                setParams(p, buffer);
                break;
        }
@@ -476,8 +499,18 @@ bool InsetExternal::getStatus(Cursor & cur, FuncRequest const & cmd,
 void InsetExternal::registerEmbeddedFiles(Buffer const &,
        EmbeddedFiles & files) const
 {
-       // temporarily disable embedding for this inset
-       /* files.registerFile(params_.filename, this); */
+       files.registerFile(params_.filename, this);
+}
+
+
+void InsetExternal::updateEmbeddedFile(Buffer const & buf,
+       EmbeddedFile const & file)
+{
+       // when embedding is enabled, change of embedding status leads to actions
+       EmbeddedFile temp = file;
+       temp.enable(buf.embeddedFiles().enabled(), &buf);
+       // this will not be set if an exception is thorwn in enable()
+       params_.filename = temp;
 }
 
 
@@ -532,7 +565,8 @@ graphics::Params get_grfx_params(InsetExternalParams const & eparams)
 {
        graphics::Params gparams;
 
-       gparams.filename = eparams.filename;
+       gparams.filename = eparams.filename.availableFile();
+       gparams.icon = eparams.filename.embedded() ? "pin.png" : "";
        gparams.scale = eparams.lyxscale;
        if (eparams.clipdata.clip)
                gparams.bb = eparams.clipdata.bbox;
@@ -671,8 +705,11 @@ void InsetExternal::write(Buffer const & buffer, ostream & os) const
 void InsetExternal::read(Buffer const & buffer, Lexer & lex)
 {
        InsetExternalParams params;
-       if (params.read(buffer, lex))
+       if (params.read(buffer, lex)) {
+               // exception handling is not needed as long as embedded files are in place.
+               params.filename.enable(buffer.embeddedFiles().enabled(), & buffer);
                setParams(params, buffer);
+       }
 }
 
 
index 993354d328427248b97d81773612bcdeded8f7dc..533eeb92b9c8c1ef3f2f3b8a8c638df0df1e7245 100644 (file)
@@ -80,7 +80,7 @@ public:
        std::string const & templatename() const { return templatename_; }
 
        /// The external file.
-       support::DocFileName filename;
+       EmbeddedFile filename;
        /// How the inset is to be displayed by LyX.
        external::DisplayType display;
        /// The scale of the displayed graphic (if shown).
@@ -150,6 +150,8 @@ public:
        bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const;
        /// external file can be embedded
        void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &) const;
+       ///
+       void updateEmbeddedFile(Buffer const &, EmbeddedFile const &);
 
 protected:
        InsetExternal(InsetExternal const &);