X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetinclude.C;h=12315f3cc37c096106535b93d34575e46cb88b3c;hb=3ce727041d6eef7a30ea58d8469ac8042eb20409;hp=51a0da72a4dadbab3a023545b304eee4db7b0a7f;hpb=27de1486ca34aaad446adb798d71a77d6f6304da;p=lyx.git diff --git a/src/insets/insetinclude.C b/src/insets/insetinclude.C index 51a0da72a4..12315f3cc3 100644 --- a/src/insets/insetinclude.C +++ b/src/insets/insetinclude.C @@ -1,408 +1,401 @@ + #include -#include +#include #ifdef __GNUG__ #pragma implementation #endif -#include FORMS_H_LOCATION -#include "filedlg.h" +#include "frontends/Dialogs.h" + #include "insetinclude.h" #include "buffer.h" #include "bufferlist.h" -#include "error.h" -#include "filetools.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 "FileInfo.h" +#include "support/FileInfo.h" +#include "layout.h" -extern BufferView *current_view; +using std::ostream; +using std::endl; +using std::vector; +using std::pair; -extern LyXRC *lyxrc; 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 -FD_include *form = 0; +InsetInclude::InsetInclude(Params const & p) + : params_(p), include_label(unique_id()) +{} -void include_cb(FL_OBJECT *, long arg) + +InsetInclude::InsetInclude(InsetCommandParams const & p, Buffer const & b) { - - InsetInclude *inset = (InsetInclude*)form->vdata; - switch (arg) { - case 0: - { - // Should browsing too be disabled in RO-mode? - LyXFileDlg fileDlg; - LString mpath = OnlyPath(inset->getMasterFilename()); - LString 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 - LString filename = fileDlg.Select(_("Select Child Document"), - mpath, ext, - inset->getContents()); - XFlush(fl_get_display()); - - // check selected filename - if (!filename.empty()) { - LString filename2 = MakeRelPath(filename, - mpath); - if (filename2.prefixIs("..")) - 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(); + include_label = unique_id(); +} - case 1: - if(!current_view->currentBuffer()->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->currentBuffer()->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->getOwner()->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(LString 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->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; } -Inset * InsetInclude::Clone() -{ - 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 (Inset*)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->currentBuffer()->isReadonly()) - WarnReadonly(); + params_ = p; - if (!form) { - form = create_form_include(); - fl_set_form_atclose(form->include, IgnoreCloseBoxCB, NULL); - } - form->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 (getCmdName().contains("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; } } -LString InsetInclude::getScreenLabel() const +bool InsetInclude::display() const { - LString temp; - if (isInput()) - temp += _("Input"); - else if (isVerb()) { - temp += _("Verbatim Input"); - if (isVerbVisibleSpace()) temp += '*'; - } else temp += _("Include"); + return !(params_.flag == INPUT); +} + + +string const InsetInclude::getScreenLabel() const +{ + string temp; + + 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) != NULL ); + 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 { - LString 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(LString &file, signed char /*fragile*/) +bool InsetInclude::loadIfNeeded() const { - LString 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()); + bool const ro = !finfo.writable(); + return bufferlist.readFile(getFileName(), ro) != 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()); - - if (tmp->params.textclass != master->params.textclass) { - lyxerr.print("ERROR: Cannot handle include file `" - + MakeDisplayPath(getFileName()) - + "' which has textclass `" - + lyxstyle.NameOfClass(tmp->params.textclass) - + "' instead of `" - + lyxstyle.NameOfClass(master->params.textclass) - + "'."); - return 0; + 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()) + << "' has textclass `" + << textclasslist.NameOfClass(tmp->params.textclass) + << "' while parent file has textclass `" + << textclasslist.NameOfClass(buffer->params.textclass) + << "'." << endl; + //return 0; } // write it to a file (so far the complete file) - writefile = ChangeExtension(getFileName(), ".tex", false); - if (!master->tmppath.empty() - && !master->niceFile) { - incfile.subst('/','@'); - #ifdef __EMX__ - incfile.subst(':', '$'); - #endif - writefile = AddName(master->tmppath, incfile); + string writefile = ChangeExtension(getFileName(), ".tex"); + + if (!buffer->tmppath.empty() + && !buffer->niceFile) { + incfile = subst(incfile, '/','@'); +#ifdef __EMX__ + incfile = subst(incfile, ':', '$'); +#endif + writefile = AddName(buffer->tmppath, incfile); } else writefile = getFileName(); - writefile = ChangeExtension(writefile,".tex",false); - lyxerr.debug("incfile:" + incfile, Error::LATEX); - lyxerr.debug("writefile:" + writefile, Error::LATEX); + 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, LString(), false) - + '}'; + os << '\\' << params_.cparams.getCmdName() << '{' + << ChangeExtension(incfile, string()) + << '}'; } return 0; } -void InsetInclude::Validate(LaTeXFeatures& features) const +int InsetInclude::ascii(Buffer const *, std::ostream & os, int) const +{ + if (isVerbatim()) + os << GetFileContents(getFileName()); + return 0; +} + + +int InsetInclude::linuxdoc(Buffer const * buffer, ostream & os) const { - if (isVerb()) + 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->makeLinuxDocFile(writefile, buffer->niceFile, true); + } + + if (isVerbatim()) { + os << "" + << ""; + } else + os << '&' << include_label << ';'; + + return 0; +} + + +int InsetInclude::docBook(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()) { + 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 << ';'; + + return 0; +} + + +void InsetInclude::validate(LaTeXFeatures & features) const +{ + + string incfile(params_.cparams.getContents()); + string writefile; + + Buffer const * const b = bufferlist.getBuffer(getMasterFilename()); + + if (b && !b->tmppath.empty() && b->niceFile) { + incfile = subst(incfile, '/','@'); + writefile = AddName(b->tmppath, incfile); + } else + writefile = getFileName(); + + if (IsLyXFilename(getFileName())) + writefile = ChangeExtension(writefile, ".sgml"); + + features.IncludedFiles[include_label] = writefile; + + if (isVerbatim()) features.verbatim = true; // Here we must do the fun stuff... @@ -410,55 +403,38 @@ 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); } } -LString InsetInclude::getLabel(int) const +vector const InsetInclude::getLabelList() const { - LString label; - LString parentname; - - - if (loadIfNeeded()) { - Buffer *tmp = bufferlist.getBuffer(getFileName()); - tmp->setParentName(""); - label = tmp->getReferenceList('\n'); - tmp->setParentName(getMasterFilename()); - } - - return label; -} - + vector l; -int InsetInclude::GetNumberOfLabels() const { - LString label; - int nl; + if (loadIfNeeded()) { + Buffer * tmp = bufferlist.getBuffer(getFileName()); + tmp->setParentName(""); + l = tmp->getLabelList(); + tmp->setParentName(getMasterFilename()); + } - if (loadIfNeeded()) { - Buffer *tmp = bufferlist.getBuffer(getFileName()); - tmp->setParentName(""); - label = tmp->getReferenceList('\n'); - tmp->setParentName(getMasterFilename()); - } - nl = (label.empty())? 0: 1; - - return nl; + return l; } -LString InsetInclude::getKeys() const +vector > const InsetInclude::getKeys() const { - LString list; + vector > keys; if (loadIfNeeded()) { - Buffer *tmp = bufferlist.getBuffer(getFileName()); - tmp->setParentName(""); - list = tmp->getBibkeyList(','); + Buffer * tmp = bufferlist.getBuffer(getFileName()); + tmp->setParentName(""); + keys = tmp->getBibkeyList(); tmp->setParentName(getMasterFilename()); } - return list; + return keys; }