X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetinclude.C;h=12315f3cc37c096106535b93d34575e46cb88b3c;hb=3ce727041d6eef7a30ea58d8469ac8042eb20409;hp=556634b91eb848bb9d0554727ddce604b79691c0;hpb=f60992203402cdfe7682dba8166bb09e07e05723;p=lyx.git diff --git a/src/insets/insetinclude.C b/src/insets/insetinclude.C index 556634b91e..12315f3cc3 100644 --- a/src/insets/insetinclude.C +++ b/src/insets/insetinclude.C @@ -8,10 +8,11 @@ #endif #include "frontends/Dialogs.h" - + #include "insetinclude.h" #include "buffer.h" #include "bufferlist.h" +#include "BufferView.h" #include "debug.h" #include "support/filetools.h" #include "lyxrc.h" @@ -20,7 +21,6 @@ #include "gettext.h" #include "support/FileInfo.h" #include "layout.h" -#include "lyxfunc.h" using std::ostream; using std::endl; @@ -29,122 +29,190 @@ using std::pair; extern BufferList bufferlist; +namespace { -static inline -string unique_id() { +string const unique_id() +{ static unsigned int seed = 1000; - std::ostringstream ost; + ostringstream ost; ost << "file" << ++seed; // Needed if we use lyxstring. return ost.str().c_str(); } +} // namespace anon + -InsetInclude::InsetInclude(InsetCommandParams const & p, Buffer const & bf) - : InsetCommand(p), master(&bf) +InsetInclude::InsetInclude(Params const & p) + : params_(p), include_label(unique_id()) +{} + + +InsetInclude::InsetInclude(InsetCommandParams const & p, Buffer const & b) { - flag = InsetInclude::INCLUDE; - noload = false; + params_.cparams = p; + params_.masterFilename_ = b.fileName(); include_label = unique_id(); } InsetInclude::~InsetInclude() { + hideDialog(); +} + + +InsetInclude::Params const & InsetInclude::params() const +{ + return params_; +} + + +bool InsetInclude::Params::operator==(Params const & o) const +{ + if (cparams == o.cparams && flag == o.flag && + noload == o.noload && masterFilename_ == o.masterFilename_) + return true; + + return false; } -Inset * InsetInclude::Clone(Buffer const & buffer) const -{ - InsetInclude * ii = new InsetInclude (params(), buffer); - ii->setNoLoad(isNoLoad()); - // By default, the newly created inset is of `include' type, - // so we do not test this case. - if (isInput()) - ii->setInput(); - else if (isVerb()) { - ii->setVerb(); - ii->setVisibleSpace(isVerbVisibleSpace()); +bool InsetInclude::Params::operator!=(Params const & o) const +{ + return !(*this == o); +} + + +void InsetInclude::set(Params const & p) +{ + params_ = p; + + // Just to be safe... + string command; + + switch (params_.flag) { + case INCLUDE: + command="include"; + break; + case VERB: + command="verbatiminput"; + break; + case INPUT: + command="input"; + break; + case VERBAST: + command="verbatiminput*"; + break; } - return ii; + + params_.cparams.setCmdName(command); } -void InsetInclude::Edit(BufferView * bv, int, int, unsigned int) +Inset * InsetInclude::clone(Buffer const & buffer, bool) const +{ + Params p(params_); + p.masterFilename_ = buffer.fileName(); + + return new InsetInclude(p); +} + + +void InsetInclude::edit(BufferView * bv, int, int, unsigned int) { bv->owner()->getDialogs()->showInclude(this); } -void InsetInclude::Write(Buffer const *, ostream & os) const +void InsetInclude::edit(BufferView * bv, bool) { - os << "Include " << getCommand() << "\n"; + edit(bv, 0, 0, 0); } -void InsetInclude::Read(Buffer const * buf, LyXLex & lex) +void InsetInclude::write(Buffer const *, ostream & os) const { - InsetCommand::Read(buf, lex); - - if (getCmdName() == "include") - setInclude(); - else if (getCmdName() == "input") - setInput(); - else if (contains(getCmdName(), "verbatim")) { - setVerb(); - if (getCmdName() == "verbatiminput*") - setVisibleSpace(true); + os << "Include " << params_.cparams.getCommand() << "\n"; +} + + +void InsetInclude::read(Buffer const *, LyXLex & lex) +{ + params_.cparams.read(lex); + + if (params_.cparams.getCmdName() == "include") + params_.flag = INCLUDE; + else if (params_.cparams.getCmdName() == "input") + params_.flag = INPUT; + /* FIXME: is this logic necessary now ? */ + else if (contains(params_.cparams.getCmdName(), "verbatim")) { + params_.flag = VERB; + if (params_.cparams.getCmdName() == "verbatiminput*") + params_.flag = VERBAST; } } -bool InsetInclude::display() const +bool InsetInclude::display() const { - return !isInput(); + return !(params_.flag == INPUT); } string const InsetInclude::getScreenLabel() const { string temp; - if (isInput()) - temp += _("Input"); - else if (isVerb()) { - temp += _("Verbatim Input"); - if (isVerbVisibleSpace()) temp += '*'; - } else temp += _("Include"); + + switch (params_.flag) { + case INPUT: temp += _("Input"); break; + case VERB: temp += _("Verbatim Input"); break; + case VERBAST: temp += _("Verbatim Input*"); break; + case INCLUDE: temp += _("Include"); break; + } + temp += ": "; - if (getContents().empty()) { - temp+= "???"; - } else { - temp+= getContents(); - } + if (params_.cparams.getContents().empty()) + temp += "???"; + else + temp += params_.cparams.getContents(); + return temp; } +string const InsetInclude::getRelFileBaseName() const +{ + return OnlyFilename(ChangeExtension(params_.cparams.getContents(), string())); +} + + string const InsetInclude::getFileName() const { - return MakeAbsPath(getContents(), + return MakeAbsPath(params_.cparams.getContents(), OnlyPath(getMasterFilename())); } string const InsetInclude::getMasterFilename() const { - return master->fileName(); + return params_.masterFilename_; } bool InsetInclude::loadIfNeeded() const { - if (isNoLoad() || isVerb()) return false; - if (!IsLyXFilename(getFileName())) return false; + if (params_.noload || isVerbatim()) + return false; + + if (!IsLyXFilename(getFileName())) + return false; - if (bufferlist.exists(getFileName())) return true; + if (bufferlist.exists(getFileName())) + return true; // the readonly flag can/will be wrong, not anymore I think. FileInfo finfo(getFileName()); @@ -153,18 +221,19 @@ bool InsetInclude::loadIfNeeded() const } -int InsetInclude::Latex(Buffer const * buffer, ostream & os, +int InsetInclude::latex(Buffer const * buffer, ostream & os, bool /*fragile*/, bool /*fs*/) const { - string incfile(getContents()); + string incfile(params_.cparams.getContents()); // Do nothing if no file name has been specified if (incfile.empty()) return 0; - + if (loadIfNeeded()) { Buffer * tmp = bufferlist.getBuffer(getFileName()); + // FIXME: this should be a GUI warning if (tmp->params.textclass != buffer->params.textclass) { lyxerr << "WARNING: Included file `" << MakeDisplayPath(getFileName()) @@ -178,6 +247,7 @@ int InsetInclude::Latex(Buffer const * buffer, ostream & os, // write it to a file (so far the complete file) string writefile = ChangeExtension(getFileName(), ".tex"); + if (!buffer->tmppath.empty() && !buffer->niceFile) { incfile = subst(incfile, '/','@'); @@ -194,25 +264,25 @@ int InsetInclude::Latex(Buffer const * buffer, ostream & os, tmp->markDepClean(buffer->tmppath); tmp->makeLaTeXFile(writefile, - OnlyPath(getMasterFilename()), + OnlyPath(getMasterFilename()), buffer->niceFile, true); - } + } - if (isVerb()) { - os << '\\' << getCmdName() << '{' << incfile << '}'; - } else if (isInput()) { + if (isVerbatim()) { + os << '\\' << params_.cparams.getCmdName() << '{' << incfile << '}'; + } else if (params_.flag == INPUT) { // \input wants file with extension (default is .tex) if (!IsLyXFilename(getFileName())) { - os << '\\' << getCmdName() << '{' << incfile << '}'; + os << '\\' << params_.cparams.getCmdName() << '{' << incfile << '}'; } else { - os << '\\' << getCmdName() << '{' + os << '\\' << params_.cparams.getCmdName() << '{' << ChangeExtension(incfile, ".tex") << '}'; } } else { // \include don't want extension and demands that the // file really have .tex - os << '\\' << getCmdName() << '{' + os << '\\' << params_.cparams.getCmdName() << '{' << ChangeExtension(incfile, string()) << '}'; } @@ -221,22 +291,22 @@ int InsetInclude::Latex(Buffer const * buffer, ostream & os, } -int InsetInclude::Ascii(Buffer const *, std::ostream & os, int) const +int InsetInclude::ascii(Buffer const *, std::ostream & os, int) const { - if (isVerb()) + if (isVerbatim()) os << GetFileContents(getFileName()); return 0; } -int InsetInclude::Linuxdoc(Buffer const * buffer, ostream & os) const +int InsetInclude::linuxdoc(Buffer const * buffer, ostream & os) const { - string incfile(getContents()); + string incfile(params_.cparams.getContents()); // Do nothing if no file name has been specified if (incfile.empty()) return 0; - + if (loadIfNeeded()) { Buffer * tmp = bufferlist.getBuffer(getFileName()); @@ -255,27 +325,27 @@ int InsetInclude::Linuxdoc(Buffer const * buffer, ostream & os) const lyxerr[Debug::LATEX] << "writefile:" << writefile << endl; tmp->makeLinuxDocFile(writefile, buffer->niceFile, true); - } + } - if (isVerb()) { + if (isVerbatim()) { os << "" << ""; - } else + } else os << '&' << include_label << ';'; return 0; } -int InsetInclude::DocBook(Buffer const * buffer, ostream & os) const +int InsetInclude::docBook(Buffer const * buffer, ostream & os) const { - string incfile(getContents()); + string incfile(params_.cparams.getContents()); // Do nothing if no file name has been specified if (incfile.empty()) return 0; - + if (loadIfNeeded()) { Buffer * tmp = bufferlist.getBuffer(getFileName()); @@ -293,39 +363,39 @@ int InsetInclude::DocBook(Buffer const * buffer, ostream & os) const lyxerr[Debug::LATEX] << "writefile:" << writefile << endl; tmp->makeDocBookFile(writefile, buffer->niceFile, true); - } + } - if (isVerb()) { + if (isVerbatim()) { os << "" << ""; - } else + } else os << '&' << include_label << ';'; return 0; } -void InsetInclude::Validate(LaTeXFeatures & features) const +void InsetInclude::validate(LaTeXFeatures & features) const { - string incfile(getContents()); - string writefile; // = ChangeExtension(getFileName(), ".sgml"); + string incfile(params_.cparams.getContents()); + string writefile; + + Buffer const * const b = bufferlist.getBuffer(getMasterFilename()); - if (!master->tmppath.empty() && !master->niceFile) { + if (b && !b->tmppath.empty() && b->niceFile) { incfile = subst(incfile, '/','@'); - writefile = AddName(master->tmppath, incfile); + writefile = AddName(b->tmppath, incfile); } else writefile = getFileName(); - // Use the relative path. - //writefile = incfile; if (IsLyXFilename(getFileName())) writefile = ChangeExtension(writefile, ".sgml"); features.IncludedFiles[include_label] = writefile; - if (isVerb()) + if (isVerbatim()) features.verbatim = true; // Here we must do the fun stuff... @@ -333,8 +403,9 @@ void InsetInclude::Validate(LaTeXFeatures & features) const // to be loaded: if (loadIfNeeded()) { // a file got loaded - Buffer * tmp = bufferlist.getBuffer(getFileName()); - tmp->validate(features); + Buffer const * const tmp = bufferlist.getBuffer(getFileName()); + if (tmp) + tmp->validate(features); } } @@ -345,7 +416,7 @@ vector const InsetInclude::getLabelList() const if (loadIfNeeded()) { Buffer * tmp = bufferlist.getBuffer(getFileName()); - tmp->setParentName(""); + tmp->setParentName(""); l = tmp->getLabelList(); tmp->setParentName(getMasterFilename()); } @@ -360,7 +431,7 @@ vector > const InsetInclude::getKeys() const if (loadIfNeeded()) { Buffer * tmp = bufferlist.getBuffer(getFileName()); - tmp->setParentName(""); + tmp->setParentName(""); keys = tmp->getBibkeyList(); tmp->setParentName(getMasterFilename()); }