X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetexternal.C;h=fd5fe30017f1c40deb2e1380df6d4912eb95d9e1;hb=26f1a5bfcae4b7fd7b946a1884c396d842b24925;hp=6fb09380e78dcadac45ccc82176c20a941545ecf;hpb=44b7b7fc71ee64a6febdd20bd35d5b4db9cab2a0;p=lyx.git diff --git a/src/insets/insetexternal.C b/src/insets/insetexternal.C index 6fb09380e7..fd5fe30017 100644 --- a/src/insets/insetexternal.C +++ b/src/insets/insetexternal.C @@ -1,40 +1,45 @@ -/* 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 - * - * Copyright 1995 Matthias Ettrich - * Copyright 1995-2001 The LyX Team. + * \author Asger Alstrup Nielsen * - * ====================================================== */ + * Full author contact details are available in file CREDITS + */ #include -#ifdef __GNUG__ -#pragma implementation -#endif - -#include -#include #include "insetexternal.h" #include "ExternalTemplate.h" #include "BufferView.h" #include "buffer.h" -#include "LyXView.h" -#include "frontends/Dialogs.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" #include "support/lstrings.h" #include "support/path.h" -#include "support/syscall.h" -#include "gettext.h" -#include "debug.h" +#include "support/systemcall.h" +#include "support/FileInfo.h" + +#include +#include + +using std::ostream; using std::endl; -InsetExternal::InsetExternal() + +InsetExternal::InsetExternal() : view_(0) { tempname_ = lyx::tempName(string(), "lyxext"); @@ -46,22 +51,58 @@ 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; params_.parameters = p.parameters; params_.templ = p.templ; -} +} string const InsetExternal::editMessage() const @@ -70,24 +111,23 @@ string const InsetExternal::editMessage() const } -void InsetExternal::edit(BufferView * bv, - int /*x*/, int /*y*/, unsigned int /*button*/) +void InsetExternal::edit(BufferView * bv, int, int, mouse_button::state) { - view_ = bv; - view_->owner()->getDialogs()->showExternal(this); + InsetExternalMailer mailer(*this); + mailer.showDialog(bv); } void InsetExternal::edit(BufferView * bv, bool) { - edit(bv, 0, 0, 0); + edit(bv, 0, 0, mouse_button::none); } -void InsetExternal::write(Buffer const *, std::ostream & os) const +void InsetExternal::write(Buffer const *, ostream & os) const { - os << "External " << params_.templ.lyxName << ",\"" << params_.filename - << "\",\"" << params_.parameters << "\"\n"; + os << "External " << params_.templ.lyxName << ",\"" + << params_.filename << "\",\"" << params_.parameters << "\"\n"; } @@ -102,7 +142,7 @@ void InsetExternal::read(Buffer const *, LyXLex & lex) } else { lex.printError("InsetExternal: Parse error: `$$Token'"); } - + while (lex.isOK()) { lex.nextToken(); token = lex.getString(); @@ -115,62 +155,57 @@ 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; } int InsetExternal::write(string const & format, - Buffer const * buf, std::ostream & os) const + Buffer const * buf, ostream & os) const { ExternalTemplate const & et = params_.templ; ExternalTemplate::Formats::const_iterator cit = et.formats.find(format); if (cit == et.formats.end()) { lyxerr << "External template format '" << format - << "' not specified in template " << params_.templ.lyxName - << endl; + << "' not specified in template " + << params_.templ.lyxName << endl; return 0; } - - if (et.automaticProduction) { - executeCommand(doSubstitution(buf, - cit->second.updateCommand), - buf); - } - + + updateExternal(format, buf); os << doSubstitution(buf, cit->second.product); return 0; // CHECK (FIXME check what ? - jbl) } int InsetExternal::latex(Buffer const * buf, - std::ostream & os, bool, bool) const + ostream & os, bool, bool) const { return write("LaTeX", buf, os); } -int InsetExternal::ascii(Buffer const * buf, std::ostream & os, int) const +int InsetExternal::ascii(Buffer const * buf, ostream & os, int) const { return write("Ascii", buf, os); } -int InsetExternal::linuxdoc(Buffer const * buf, std::ostream & os) const +int InsetExternal::linuxdoc(Buffer const * buf, ostream & os) const { return write("LinuxDoc", buf, os); } -int InsetExternal::docbook(Buffer const * buf, std::ostream & os) const +int InsetExternal::docbook(Buffer const * buf, ostream & os, bool) const { return write("DocBook", buf, os); } @@ -184,19 +219,19 @@ void InsetExternal::validate(LaTeXFeatures & features) const if (cit == et.formats.end()) return; - + if (!cit->second.requirement.empty()) { features.require(cit->second.requirement); } if (!cit->second.preamble.empty()) { - features.externalPreambles += cit->second.preamble + "\n"; + features.addExternalPreamble(cit->second.preamble + "\n"); } } Inset * InsetExternal::clone(Buffer const &, bool same_id) const { - InsetExternal * inset = new InsetExternal(); + InsetExternal * inset = new InsetExternal; inset->params_ = params_; inset->view_ = view_; if (same_id) @@ -218,35 +253,32 @@ string const InsetExternal::getScreenLabel(Buffer const *) const void InsetExternal::executeCommand(string const & s, Buffer const * buffer) const { - string buf = MakeAbsPath(buffer->fileName()); - string path = OnlyPath(buf); - Path p(path); - Systemcalls one; + Path p(buffer->filePath()); + Systemcall one; if (lyxerr.debugging()) { lyxerr << "Executing '" << s << "' in '" - << path << "'" << endl; + << buffer->filePath() << '\'' << endl; } - one.startscript(Systemcalls::Wait, s); + one.startscript(Systemcall::Wait, s); } string const InsetExternal::doSubstitution(Buffer const * buffer, - string const & s) const + string const & s) const { string result; string const basename = ChangeExtension(params_.filename, string()); - string filepath = ""; - if (buffer && (!buffer->niceFile)) { - filepath = OnlyPath(MakeAbsPath(buffer->fileName())); + string filepath; + if (buffer && !buffer->tmppath.empty() && !buffer->niceFile) { + filepath = buffer->filePath(); } result = subst(s, "$$FName", params_.filename); 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); - + // Handle the $$Contents(filename) syntax if (contains(result, "$$Contents(\"")) { @@ -256,9 +288,7 @@ string const InsetExternal::doSubstitution(Buffer const * buffer, string contents; if (buffer) { // Make sure we are in the directory of the buffer - string const buf = MakeAbsPath(buffer->fileName()); - string const path = OnlyPath(buf); - Path p(path); + Path p(buffer->filePath()); contents = GetFileContents(file); } else { contents = GetFileContents(file); @@ -273,25 +303,47 @@ string const InsetExternal::doSubstitution(Buffer const * buffer, void InsetExternal::updateExternal() const +{ + updateExternal("LaTeX", view_->buffer()); +} + +void InsetExternal::updateExternal(string const & format, + Buffer const * buf) const { ExternalTemplate const & et = params_.templ; ExternalTemplate::Formats::const_iterator cit = - et.formats.find("LaTeX"); - if (cit == et.formats.end()) + et.formats.find(format); + + if (cit == et.formats.end() || + cit->second.updateCommand.empty() || + !et.automaticProduction) return; - - executeCommand(doSubstitution(view_->buffer(), - cit->second.updateCommand), - view_->buffer()); + + if (!cit->second.updateResult.empty()) { + string const resultfile = doSubstitution(buf, + cit->second.updateResult); + FileInfo fi(params_.filename); + FileInfo fi2(resultfile); + if (fi2.exist() && fi.exist() && + difftime(fi2.getModificationTime(), + fi.getModificationTime()) >= 0) { + lyxerr[Debug::FILES] << resultfile + << " is up to date" << endl; + return; + } + } + + executeCommand(doSubstitution(buf, cit->second.updateCommand), buf); } void InsetExternal::viewExternal() const { ExternalTemplate const & et = params_.templ; - if (et.automaticProduction) - updateExternal(); + if (et.viewCommand.empty()) + return; + updateExternal(); executeCommand(doSubstitution(view_->buffer(), et.viewCommand), view_->buffer()); @@ -301,27 +353,71 @@ void InsetExternal::viewExternal() const void InsetExternal::editExternal() const { ExternalTemplate const & et = params_.templ; - if (et.automaticProduction) - updateExternal(); + if (et.editCommand.empty()) + return; + updateExternal(); executeCommand(doSubstitution(view_->buffer(), et.editCommand), view_->buffer()); } -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()); } -bool operator!=(InsetExternal::Params const & left, - InsetExternal::Params const & right) +void InsetExternalMailer::string2params(string const & in, + InsetExternal::Params & params) { - return !(left == right); + 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(); + } } + +string const +InsetExternalMailer::params2string(InsetExternal::Params const & params) +{ + InsetExternal inset; + inset.setFromParams(params); + ostringstream data; + data << name_ << ' '; + inset.write(0, data); + data << "\\end_inset\n"; + + return data.str(); +}