X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetinclude.C;h=f2e598dffcbcc15e16ba4aa92ca45df7c4707b47;hb=dbd7a961fc46bb10c85bdd8c7fb6626477ae63d8;hp=cafba467dd0afa6ff3e53119ef5516d1c37b12fb;hpb=1d7d3cc4afa2205c801ccc2aa71c7ac59359dc5f;p=lyx.git diff --git a/src/insets/insetinclude.C b/src/insets/insetinclude.C index cafba467dd..f2e598dffc 100644 --- a/src/insets/insetinclude.C +++ b/src/insets/insetinclude.C @@ -1,465 +1,444 @@ #include -#include - #ifdef __GNUG__ #pragma implementation #endif -#include FORMS_H_LOCATION -#include "filedlg.h" #include "insetinclude.h" #include "buffer.h" #include "bufferlist.h" +#include "BufferView.h" #include "debug.h" -#include "support/filetools.h" #include "lyxrc.h" #include "LyXView.h" #include "LaTeXFeatures.h" -#include "lyx_gui_misc.h" // CancelCloseBoxCB #include "gettext.h" -#include "include_form.h" +#include "lyxtextclasslist.h" + +#include "frontends/Dialogs.h" + +#include "support/filetools.h" #include "support/FileInfo.h" -#include "layout.h" +#include "support/lstrings.h" + +#include -extern BufferView * current_view; -extern LyXRC * lyxrc; +using std::ostream; +using std::endl; +using std::vector; +using std::pair; + extern BufferList bufferlist; -extern void UpdateInset(Inset * inset, bool mark_dirty = true); +namespace { -FD_include * create_form_include(void) +string const unique_id() { - FL_OBJECT * obj; - FD_include * fdui = (FD_include *) fl_calloc(1, sizeof(FD_include)); - - fdui->include = fl_bgn_form(FL_NO_BOX, 340, 210); - obj = fl_add_box(FL_UP_BOX, 0, 0, 340, 210, ""); - obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 70, 160, 90, ""); - fdui->browsebt = obj = fl_add_button(FL_NORMAL_BUTTON, 230, 30, 100, 30, idex(_("Browse|#B"))); - fl_set_button_shortcut(obj, scex(_("Browse|#B")), 1); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - fl_set_object_callback(obj, include_cb, 0); - fdui->flag1 = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 180, 70, 150, 30, idex(_("Don't typeset|#D"))); - fl_set_button_shortcut(obj, scex(_("Don't typeset|#D")), 1); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - obj = fl_add_button(FL_RETURN_BUTTON, 120, 170, 100, 30, _("OK")); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - fl_set_object_callback(obj, include_cb, 1); - obj = fl_add_button(FL_NORMAL_BUTTON, 230, 170, 100, 30, idex(_("Cancel|^["))); - fl_set_button_shortcut(obj, scex(_("Cancel|^[")), 1); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - fl_set_object_callback(obj, include_cb, 2); - obj = fl_add_button(FL_NORMAL_BUTTON, 230, 130, 100, 30, idex(_("Load|#L"))); - fl_set_button_shortcut(obj, scex(_("Load|#L")), 1); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - fl_set_object_callback(obj, include_cb, 5); - fdui->input = obj = fl_add_input(FL_NORMAL_INPUT, 10, 30, 210, 30, idex(_("File name:|#F"))); - fl_set_input_shortcut(obj, scex(_("File name:|#F")), 1); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT); - fdui->flag41 = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 180, 100, 150, 30, idex(_("Visible space|#s"))); - fl_set_button_shortcut(obj, scex(_("Visible space|#s")), 1); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - - fdui->include_grp = fl_bgn_group(); - fdui->flag4 = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 130, 160, 30, idex(_("Verbatim|#V"))); - fl_set_button_shortcut(obj, scex(_("Verbatim|#V")), 1); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - fl_set_object_callback(obj, include_cb, 10); - fdui->flag2 = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 100, 160, 30, idex(_("Use input|#i"))); - fl_set_button_shortcut(obj, scex(_("Use input|#i")), 1); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - fl_set_object_callback(obj, include_cb, 11); - fdui->flag3 = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 10, 70, 160, 30, idex(_("Use include|#U"))); - fl_set_button_shortcut(obj, scex(_("Use include|#U")), 1); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - fl_set_object_callback(obj, include_cb, 11); - fl_end_group(); - - fl_end_form(); - - //fdui->include->fdui = fdui; - - return fdui; + static unsigned int seed = 1000; + + ostringstream ost; + ost << "file" << ++seed; + + // Needed if we use lyxstring. + return ost.str().c_str(); } -/*---------------------------------------*/ +} // namespace anon + + +InsetInclude::InsetInclude(Params const & p) + : params_(p), include_label(unique_id()) +{} -FD_include * form = 0; -extern "C" void include_cb(FL_OBJECT *, long arg) +InsetInclude::InsetInclude(InsetCommandParams const & p, Buffer const & b) + : include_label(unique_id()) { - - InsetInclude * inset = static_cast(form->include->u_vdata); - switch (arg) { - case 0: - { - // Should browsing too be disabled in RO-mode? - LyXFileDlg fileDlg; - string mpath = OnlyPath(inset->getMasterFilename()); - string ext; - - if (fl_get_button(form->flag2)) // Use Input Button - ext = "*.tex"; - else if (fl_get_button(form->flag4)) // Verbatim all files - ext = "*"; - else - ext = "*.lyx"; - // launches dialog - fileDlg.SetButton(0, _("Documents"), lyxrc->document_path); - - // Use by default the master's path - string filename = fileDlg.Select(_("Select Child Document"), - mpath, ext, - inset->getContents()); - XFlush(fl_get_display()); - - // check selected filename - if (!filename.empty()) { - string filename2 = MakeRelPath(filename, - mpath); - if (prefixIs(filename2, "..")) - fl_set_input(form->input, - filename.c_str()); - else - fl_set_input(form->input, - filename2.c_str()); - } - break; - } + params_.cparams = p; + params_.masterFilename_ = b.fileName(); +} - case 1: - if(!current_view->buffer()->isReadonly()) { - inset->setContents(fl_get_input(form->input)); - // don't typeset - inset->setNoLoad(fl_get_button(form->flag1)); - if (fl_get_button(form->flag2)) - inset->setInput(); - else if (fl_get_button(form->flag3)) - inset->setInclude(); - else if (fl_get_button(form->flag4)) { - inset->setVerb(); - inset->setVisibleSpace(fl_get_button(form->flag41)); - } - - fl_hide_form(form->include); - UpdateInset(inset); - break; - } // fall through - - case 2: - fl_hide_form(form->include); - break; - case 5: - if(!current_view->buffer()->isReadonly()) { - inset->setContents(fl_get_input(form->input)); - inset->setNoLoad(fl_get_button(form->flag1)); - if (fl_get_button(form->flag2)) - inset->setInput(); - else if (fl_get_button(form->flag3)) - inset->setInclude(); - else if (fl_get_button(form->flag4)) { - inset->setVerb(); - inset->setVisibleSpace(fl_get_button(form->flag41)); - } - - fl_hide_form(form->include); - UpdateInset(inset); - current_view->owner()->getLyXFunc()->Dispatch(LFUN_CHILDOPEN, inset->getContents().c_str()); - } - break; - - case 10: - fl_activate_object(form->flag41); - fl_set_object_lcol(form->flag41, FL_BLACK); - break; - case 11: - fl_deactivate_object(form->flag41); - fl_set_object_lcol(form->flag41, FL_INACTIVE); - fl_set_button(form->flag41, 0); - break; - } + +InsetInclude::~InsetInclude() +{ + hideDialog(); } -InsetInclude::InsetInclude(string const & fname, Buffer * bf) - : InsetCommand("include") +InsetInclude::Params const & InsetInclude::params() const { - master = bf; - setContents(fname); - flag = InsetInclude::INCLUDE; - noload = false; + return params_; } -InsetInclude::~InsetInclude() +bool InsetInclude::Params::operator==(Params const & o) const { - if (form && form->include->u_vdata == this) { - // this inset is in the popup so hide the popup - // and remove the reference to this inset. ARRae - if (form->include) { - if (form->include->visible) { - fl_hide_form(form->include); - } - fl_free_form(form->include); - } - fl_free(form); - form = 0; - } + if (cparams == o.cparams && flag == o.flag && + noload == o.noload && masterFilename_ == o.masterFilename_) + return true; + + return false; } -InsetInclude * InsetInclude::Clone() const -{ - InsetInclude * ii = new InsetInclude (contents, master); - 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()); - } - return ii; + +bool InsetInclude::Params::operator!=(Params const & o) const +{ + return !(*this == o); } -void InsetInclude::Edit(int, int) + +void InsetInclude::set(Params const & p) { - if(current_view->buffer()->isReadonly()) - WarnReadonly(); + params_ = p; - if (!form) { - form = create_form_include(); - fl_set_form_atclose(form->include, IgnoreCloseBoxCB, 0); - } - form->include->u_vdata = this; - - fl_set_input(form->input, contents.c_str()); - fl_set_button(form->flag1, int(isNoLoad())); - fl_set_button(form->flag2, int(isInput())); - fl_set_button(form->flag3, int(isInclude())); - fl_set_button(form->flag4, int(isVerb())); - if (isVerb()) - fl_set_button(form->flag41, int(isVerbVisibleSpace())); - else { - fl_set_button(form->flag41, 0); - fl_deactivate_object(form->flag41); - fl_set_object_lcol(form->flag41, FL_INACTIVE); - } - - if (form->include->visible) { - fl_raise_form(form->include); - } else { - fl_show_form(form->include, FL_PLACE_MOUSE, FL_FULLBORDER, - _("Include")); + // 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; } + + params_.cparams.setCmdName(command); } -void InsetInclude::Write(FILE * file) +Inset * InsetInclude::clone(Buffer const & buffer, bool) const { - fprintf(file, "Include %s\n", getCommand().c_str()); + Params p(params_); + p.masterFilename_ = buffer.fileName(); + + return new InsetInclude(p); } -void InsetInclude::Read(LyXLex & lex) +void InsetInclude::edit(BufferView * bv, int, int, unsigned int) { - InsetCommand::Read(lex); - - if (getCmdName() == "include") - setInclude(); - else if (getCmdName() == "input") - setInput(); - else if (contains(getCmdName(), "verbatim")) { - setVerb(); - if (getCmdName() == "verbatiminput*") - setVisibleSpace(true); + bv->owner()->getDialogs()->showInclude(this); +} + + +void InsetInclude::edit(BufferView * bv, bool) +{ + edit(bv, 0, 0, 0); +} + + +void InsetInclude::write(Buffer const *, ostream & os) const +{ + 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; } } -string InsetInclude::getScreenLabel() const +bool InsetInclude::display() const +{ + return !(params_.flag == INPUT); +} + + +string const InsetInclude::getScreenLabel(Buffer const *) 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 (contents.empty()) { - temp+= "???"; - } else { - temp+= contents; - } + if (params_.cparams.getContents().empty()) + temp += "???"; + else + temp += params_.cparams.getContents(); + return temp; } -bool InsetInclude::loadIfNeeded() const +string const InsetInclude::getRelFileBaseName() const { - if (isNoLoad() || isVerb()) return false; - if (!IsLyXFilename(getFileName())) return false; - - if (bufferlist.exists(getFileName())) return true; - - // the readonly flag can/will be wrong, not anymore I think. - FileInfo finfo(getFileName()); - bool ro = !finfo.writable(); - return ( bufferlist.readFile(getFileName(), ro) != 0 ); + return OnlyFilename(ChangeExtension(params_.cparams.getContents(), string())); } + +string const InsetInclude::getFileName() const +{ + return MakeAbsPath(params_.cparams.getContents(), + OnlyPath(getMasterFilename())); +} -int InsetInclude::Latex(FILE * file, signed char /*fragile*/) + +string const InsetInclude::getMasterFilename() const { - string include_file; - signed char dummy = 0; - Latex(include_file, dummy); - fprintf(file, "%s", include_file.c_str()); - return 0; + return params_.masterFilename_; } -int InsetInclude::Latex(string & file, signed char /*fragile*/) +bool InsetInclude::loadIfNeeded() const { - string writefile, incfile; + if (params_.noload || isVerbatim()) + return false; + + if (!IsLyXFilename(getFileName())) + return false; + + if (bufferlist.exists(getFileName())) + return true; + + // the readonly flag can/will be wrong, not anymore I think. + FileInfo finfo(getFileName()); + if (!finfo.isOK()) + return false; + + return bufferlist.readFile(getFileName(), !finfo.writable()) != 0; +} + +int InsetInclude::latex(Buffer const * buffer, ostream & os, + bool /*fragile*/, bool /*fs*/) const +{ + string incfile(params_.cparams.getContents()); + // Do nothing if no file name has been specified - if (contents.empty()) + if (incfile.empty()) return 0; - - // Use += to force a copy of contents (JMarc) - incfile += contents; - + if (loadIfNeeded()) { - Buffer *tmp = bufferlist.getBuffer(getFileName()); + Buffer * tmp = bufferlist.getBuffer(getFileName()); - if (tmp->params.textclass != master->params.textclass) { - lyxerr << "ERROR: Cannot handle include file `" + // FIXME: this should be a GUI warning + if (tmp->params.textclass != buffer->params.textclass) { + lyxerr << "WARNING: Included file `" << MakeDisplayPath(getFileName()) - << "' which has textclass `" - << textclasslist.NameOfClass(tmp->params.textclass) - << "' instead of `" - << textclasslist.NameOfClass(master->params.textclass) + << "' has textclass `" + << textclasslist[tmp->params.textclass].name() + << "' while parent file has textclass `" + << textclasslist[buffer->params.textclass].name() << "'." << endl; - return 0; + //return 0; } // write it to a file (so far the complete file) - writefile = ChangeExtension(getFileName(), ".tex", false); - if (!master->tmppath.empty() - && !master->niceFile) { + string writefile = ChangeExtension(getFileName(), ".tex"); + + if (!buffer->tmppath.empty() + && !buffer->niceFile) { incfile = subst(incfile, '/','@'); - #ifdef __EMX__ +#ifdef __EMX__ incfile = subst(incfile, ':', '$'); - #endif - writefile = AddName(master->tmppath, incfile); +#endif + writefile = AddName(buffer->tmppath, incfile); } else writefile = getFileName(); - writefile = ChangeExtension(writefile, ".tex", false); + writefile = ChangeExtension(writefile, ".tex"); lyxerr[Debug::LATEX] << "incfile:" << incfile << endl; lyxerr[Debug::LATEX] << "writefile:" << writefile << endl; - tmp->markDepClean(master->tmppath); + tmp->markDepClean(buffer->tmppath); tmp->makeLaTeXFile(writefile, - OnlyPath(getMasterFilename()), - master->niceFile, true); - } - - if (isVerb()) { - file += '\\'; - file += command + '{'; - file += incfile + '}'; - } - else if (isInput()) { + OnlyPath(getMasterFilename()), + buffer->niceFile, true); + } + + if (isVerbatim()) { + os << '\\' << params_.cparams.getCmdName() << '{' << incfile << '}'; + } else if (params_.flag == INPUT) { // \input wants file with extension (default is .tex) if (!IsLyXFilename(getFileName())) { - file += '\\'; - file += command + '{'; - file += incfile + '}'; + os << '\\' << params_.cparams.getCmdName() << '{' << incfile << '}'; } else { - file += '\\'; - file += command + '{'; - file += ChangeExtension(incfile, ".tex", false) - + '}'; + os << '\\' << params_.cparams.getCmdName() << '{' + << ChangeExtension(incfile, ".tex") + << '}'; } } else { // \include don't want extension and demands that the // file really have .tex - file += '\\'; - file += command + '{'; - file += ChangeExtension(incfile, string(), false) - + '}'; + os << '\\' << params_.cparams.getCmdName() << '{' + << ChangeExtension(incfile, string()) + << '}'; } return 0; } -void InsetInclude::Validate(LaTeXFeatures & features) const +int InsetInclude::ascii(Buffer const *, ostream & os, int) const { - if (isVerb()) - features.verbatim = true; + if (isVerbatim()) + os << GetFileContents(getFileName()); + return 0; +} - // Here we must do the fun stuff... - // Load the file in the include if it needs - // to be loaded: + +int InsetInclude::linuxdoc(Buffer const * buffer, ostream & os) const +{ + string incfile(params_.cparams.getContents()); + + // Do nothing if no file name has been specified + if (incfile.empty()) + return 0; + if (loadIfNeeded()) { - // a file got loaded Buffer * tmp = bufferlist.getBuffer(getFileName()); - tmp->validate(features); + + // write it to a file (so far the complete file) + string writefile = ChangeExtension(getFileName(), ".sgml"); + if (!buffer->tmppath.empty() && buffer->niceFile) { + incfile = subst(incfile, '/','@'); + writefile = AddName(buffer->tmppath, incfile); + } else + writefile = getFileName(); + + if (IsLyXFilename(getFileName())) + writefile = ChangeExtension(writefile, ".sgml"); + + lyxerr[Debug::LATEX] << "incfile:" << incfile << endl; + lyxerr[Debug::LATEX] << "writefile:" << writefile << endl; + + tmp->makeLinuxDocFile(writefile, buffer->niceFile, true); } + + if (isVerbatim()) { + os << ""; + } else + os << '&' << include_label << ';'; + + return 0; } -string InsetInclude::getLabel(int) const +int InsetInclude::docbook(Buffer const * buffer, ostream & os) const { - string label; - string parentname; - + 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()); + + // write it to a file (so far the complete file) + string writefile = ChangeExtension(getFileName(), ".sgml"); + if (!buffer->tmppath.empty() && buffer->niceFile) { + incfile = subst(incfile, '/','@'); + writefile = AddName(buffer->tmppath, incfile); + } else + writefile = getFileName(); + if (IsLyXFilename(getFileName())) + writefile = ChangeExtension(writefile, ".sgml"); + + lyxerr[Debug::LATEX] << "incfile:" << incfile << endl; + lyxerr[Debug::LATEX] << "writefile:" << writefile << endl; + + tmp->makeDocBookFile(writefile, buffer->niceFile, true); + } + + if (isVerbatim()) { + os << ""; + } else + os << '&' << include_label << ';'; - if (loadIfNeeded()) { - Buffer * tmp = bufferlist.getBuffer(getFileName()); - tmp->setParentName(""); - label = tmp->getReferenceList('\n'); - tmp->setParentName(getMasterFilename()); - } - - return label; + return 0; } -int InsetInclude::GetNumberOfLabels() const { - string label; - int nl; +void InsetInclude::validate(LaTeXFeatures & features) const +{ - if (loadIfNeeded()) { - Buffer * tmp = bufferlist.getBuffer(getFileName()); - tmp->setParentName(""); - label = tmp->getReferenceList('\n'); - tmp->setParentName(getMasterFilename()); - } - nl = (label.empty())? 0: 1; - - return nl; + string incfile(params_.cparams.getContents()); + string writefile; + + Buffer const * const b = bufferlist.getBuffer(getMasterFilename()); + + if (b && !b->tmppath.empty() && b->niceFile && !isVerbatim()) { + incfile = subst(incfile, '/','@'); + writefile = AddName(b->tmppath, incfile); + } else + writefile = getFileName(); + + if (IsLyXFilename(getFileName())) + writefile = ChangeExtension(writefile, ".sgml"); + + features.includeFile(include_label, writefile); + + if (isVerbatim()) + features.require("verbatim"); + + // Here we must do the fun stuff... + // Load the file in the include if it needs + // to be loaded: + if (loadIfNeeded()) { + // a file got loaded + Buffer const * const tmp = bufferlist.getBuffer(getFileName()); + if (tmp) + tmp->validate(features); + } } -string InsetInclude::getKeys() const +vector const InsetInclude::getLabelList() const { - string lst; + vector l; + + if (loadIfNeeded()) { + Buffer * tmp = bufferlist.getBuffer(getFileName()); + tmp->setParentName(""); + l = tmp->getLabelList(); + tmp->setParentName(getMasterFilename()); + } + + return l; +} + + +vector > const InsetInclude::getKeys() const +{ + vector > keys; if (loadIfNeeded()) { - Buffer *tmp = bufferlist.getBuffer(getFileName()); - tmp->setParentName(""); - lst = tmp->getBibkeyList(','); + Buffer * tmp = bufferlist.getBuffer(getFileName()); + tmp->setParentName(""); + keys = tmp->getBibkeyList(); tmp->setParentName(getMasterFilename()); } - return lst; + return keys; }