X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetexternal.C;h=fd5fe30017f1c40deb2e1380df6d4912eb95d9e1;hb=26f1a5bfcae4b7fd7b946a1884c396d842b24925;hp=dd735bef019050e615cdd27337d03afe06181369;hpb=26349384b2ed4c0225be623d7293f2d47de9dbad;p=lyx.git diff --git a/src/insets/insetexternal.C b/src/insets/insetexternal.C index dd735bef01..fd5fe30017 100644 --- a/src/insets/insetexternal.C +++ b/src/insets/insetexternal.C @@ -1,29 +1,28 @@ -/* This file is part of - * ====================================================== +/** + * \file insetexternal.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * LyX, The Document Processor + * \author Asger Alstrup Nielsen * - * Copyright 1995 Matthias Ettrich - * Copyright 1995-2001 The LyX Team. - * - * ====================================================== */ + * Full author contact details are available in file CREDITS + */ #include -#ifdef __GNUG__ -#pragma implementation -#endif #include "insetexternal.h" #include "ExternalTemplate.h" #include "BufferView.h" #include "buffer.h" -#include "frontends/LyXView.h" +#include "funcrequest.h" #include "lyx_main.h" #include "LaTeXFeatures.h" #include "gettext.h" #include "debug.h" +#include "lyxlex.h" +#include "frontends/LyXView.h" #include "frontends/Dialogs.h" #include "support/filetools.h" @@ -52,16 +51,52 @@ InsetExternal::InsetExternal() InsetExternal::~InsetExternal() { lyx::unlink(tempname_); - hideDialog(); + InsetExternalMailer mailer(*this); + mailer.hideDialog(); } -InsetExternal::Params InsetExternal::params() const +InsetExternal::Params const & InsetExternal::params() const { return params_; } +dispatch_result InsetExternal::localDispatch(FuncRequest const & cmd) +{ + dispatch_result result = UNDISPATCHED; + + switch (cmd.action) { + case LFUN_INSET_MODIFY: { + InsetExternal::Params p; + InsetExternalMailer::string2params(cmd.argument, p); + if (p.filename.empty()) + break; + + setFromParams(p); + cmd.view()->updateInset(this); + result = DISPATCHED; + } + break; + + case LFUN_INSET_DIALOG_UPDATE: { + InsetExternalMailer mailer(*this); + mailer.updateDialog(cmd.view()); + } + break; + + case LFUN_MOUSE_RELEASE: + edit(cmd.view(), cmd.x, cmd.y, cmd.button()); + break; + + default: + break; + } + + return result; +} + + void InsetExternal::setFromParams(Params const & p) { params_.filename = p.filename; @@ -76,11 +111,10 @@ string const InsetExternal::editMessage() const } -void InsetExternal::edit(BufferView * bv, - int /*x*/, int /*y*/, mouse_button::state) +void InsetExternal::edit(BufferView * bv, int, int, mouse_button::state) { - view_ = bv; - view_->owner()->getDialogs()->showExternal(this); + InsetExternalMailer mailer(*this); + mailer.showDialog(bv); } @@ -121,15 +155,15 @@ void InsetExternal::read(Buffer const *, LyXLex & lex) } // Parse string format... - string::size_type const pos1 = format.find(","); + string::size_type const pos1 = format.find(','); params_.templ = ExternalTemplateManager::get().getTemplateByName(format.substr(0, pos1)); string::size_type const pos2 = format.find("\",\"", pos1); params_.filename = format.substr(pos1 + 2, pos2 - (pos1 + 2)); params_.parameters = format.substr(pos2 + 3, format.length() - (pos2 + 4)); lyxerr[Debug::INFO] << "InsetExternal::Read: " << params_.templ.lyxName - << " " << params_.filename - << " " << params_.parameters << endl; + << ' ' << params_.filename + << ' ' << params_.parameters << endl; } @@ -171,7 +205,7 @@ int InsetExternal::linuxdoc(Buffer const * buf, ostream & os) const } -int InsetExternal::docbook(Buffer const * buf, ostream & os) const +int InsetExternal::docbook(Buffer const * buf, ostream & os, bool) const { return write("DocBook", buf, os); } @@ -223,7 +257,7 @@ void InsetExternal::executeCommand(string const & s, Systemcall one; if (lyxerr.debugging()) { lyxerr << "Executing '" << s << "' in '" - << buffer->filePath() << "'" << endl; + << buffer->filePath() << '\'' << endl; } one.startscript(Systemcall::Wait, s); } @@ -242,7 +276,6 @@ string const InsetExternal::doSubstitution(Buffer const * buffer, result = subst(result, "$$Basename", basename); result = subst(result, "$$Parameters", params_.parameters); result = subst(result, "$$FPath", filepath); - result = ReplaceEnvironmentPath(result); result = subst(result, "$$Tempname", tempname_); result = subst(result, "$$Sysdir", system_lyxdir); @@ -292,8 +325,8 @@ void InsetExternal::updateExternal(string const & format, FileInfo fi(params_.filename); FileInfo fi2(resultfile); if (fi2.exist() && fi.exist() && - ::difftime(fi2.getModificationTime(), - fi.getModificationTime()) >= 0) { + difftime(fi2.getModificationTime(), + fi.getModificationTime()) >= 0) { lyxerr[Debug::FILES] << resultfile << " is up to date" << endl; return; @@ -330,17 +363,61 @@ void InsetExternal::editExternal() const } -bool operator==(InsetExternal::Params const & left, - InsetExternal::Params const & right) +string const InsetExternalMailer::name_("external"); + +InsetExternalMailer::InsetExternalMailer(InsetExternal & inset) + : inset_(inset) +{} + + +string const InsetExternalMailer::inset2string() const { - return ((left.filename == right.filename) && - (left.parameters == right.parameters) && - (left.templ.lyxName == right.templ.lyxName)); + return params2string(inset_.params()); +} + + +void InsetExternalMailer::string2params(string const & in, + InsetExternal::Params & params) +{ + params = InsetExternal::Params(); + + istringstream data(in); + LyXLex lex(0,0); + lex.setStream(data); + + if (lex.isOK()) { + lex.next(); + string const token = lex.getString(); + if (token != name_) + return; + } + + // This is part of the inset proper that is usually swallowed + // by Buffer::readInset + if (lex.isOK()) { + lex.next(); + string const token = lex.getString(); + if (token != "External") + return; + } + + if (lex.isOK()) { + InsetExternal inset; + inset.read(0, lex); + params = inset.params(); + } } -bool operator!=(InsetExternal::Params const & left, - InsetExternal::Params const & right) +string const +InsetExternalMailer::params2string(InsetExternal::Params const & params) { - return !(left == right); + InsetExternal inset; + inset.setFromParams(params); + ostringstream data; + data << name_ << ' '; + inset.write(0, data); + data << "\\end_inset\n"; + + return data.str(); }