X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffactory.C;h=c67e34ac28b88c81b1d6222fd9bf361a68b58642;hb=da65e2b7fbe29c5bca2812a56d5bbdb7efb702e5;hp=ca511012583f28f5d116d86c6bff4beeabdf19dc;hpb=57a24ea9124812ddc5108ff1ad304ff61acc826a;p=lyx.git diff --git a/src/factory.C b/src/factory.C index ca51101258..c67e34ac28 100644 --- a/src/factory.C +++ b/src/factory.C @@ -18,12 +18,15 @@ #include "debug.h" #include "FloatList.h" #include "funcrequest.h" +#include "LColor.h" #include "lyxlex.h" +#include "paragraph.h" #include "insets/insetbibitem.h" #include "insets/insetbibtex.h" #include "insets/insetcaption.h" #include "insets/insetcite.h" +#include "insets/insetcharstyle.h" #include "insets/insetenv.h" #include "insets/insetert.h" #include "insets/insetexternal.h" @@ -35,89 +38,116 @@ #include "insets/insetinclude.h" #include "insets/insetindex.h" #include "insets/insetlabel.h" +#include "insets/insetline.h" #include "insets/insetmarginal.h" -#include "insets/insetminipage.h" #include "insets/insetnote.h" +#include "insets/insetbox.h" #include "insets/insetbranch.h" #include "insets/insetoptarg.h" +#include "insets/insetpagebreak.h" #include "insets/insetref.h" #include "insets/insetspace.h" #include "insets/insettabular.h" #include "insets/insettoc.h" #include "insets/inseturl.h" +#include "insets/insetvspace.h" #include "insets/insetwrap.h" -#include "mathed/formulamacro.h" -#include "mathed/formula.h" -#include "frontends/Dialogs.h" -#include "frontends/LyXView.h" +#include "mathed/math_macrotemplate.h" +#include "mathed/math_hullinset.h" + #include "support/lstrings.h" -#include "support/std_sstream.h" + +#include +#include + +#include using lyx::support::compare_ascii_no_case; +using std::auto_ptr; using std::endl; +using std::string; -InsetOld * createInset(FuncRequest const & cmd) +InsetBase * createInset(BufferView * bv, FuncRequest const & cmd) { - BufferView * bv = cmd.view(); BufferParams const & params = bv->buffer()->params(); switch (cmd.action) { - case LFUN_HFILL: - return new InsetHFill(); - - case LFUN_INSET_MINIPAGE: - return new InsetMinipage(params); - - case LFUN_INSERT_NOTE: - { - string arg = cmd.getArg(0); - if (arg.empty()) - arg = "Note"; - return new InsetNote(params, arg); - } - case LFUN_INSERT_BRANCH: - { - string arg = cmd.getArg(0); - if (arg.empty()) - arg = "none"; - return new InsetBranch(params, arg); - } + case LFUN_HFILL_INSERT: + return new InsetHFill; + + case LFUN_LINE_INSERT: + return new InsetLine; + + case LFUN_PAGEBREAK_INSERT: + return new InsetPagebreak; + + case LFUN_CHARSTYLE_INSERT: { + string s = cmd.getArg(0); + LyXTextClass tclass = params.getLyXTextClass(); + CharStyles::iterator found_cs = tclass.charstyle(s); + if (found_cs != tclass.charstyles().end()) + return new InsetCharStyle(params, found_cs); + else + return new InsetCharStyle(params, s); + } + + case LFUN_NOTE_INSERT: { + string arg = cmd.getArg(0); + if (arg.empty()) + arg = "Note"; + return new InsetNote(params, arg); + } + + case LFUN_BOX_INSERT: { + string arg = cmd.getArg(0); + if (arg.empty()) + arg = "Boxed"; + return new InsetBox(params, arg); + } - case LFUN_INSET_ERT: + case LFUN_BRANCH_INSERT: { + string arg = cmd.getArg(0); + if (arg.empty()) + arg = "none"; + return new InsetBranch(params, InsetBranchParams(arg)); + } + + case LFUN_ERT_INSERT: return new InsetERT(params); - case LFUN_INSET_FOOTNOTE: + case LFUN_FOOTNOTE_INSERT: return new InsetFoot(params); - case LFUN_INSET_MARGINAL: + case LFUN_MARGINALNOTE_INSERT: return new InsetMarginal(params); - case LFUN_INSET_OPTARG: + case LFUN_OPTIONAL_INSERT: return new InsetOptArg(params); - case LFUN_INSERT_BIBITEM: + case LFUN_BIBITEM_INSERT: return new InsetBibitem(InsetCommandParams("bibitem")); - case LFUN_INSET_FLOAT: + case LFUN_FLOAT_INSERT: // check if the float type exists if (params.getLyXTextClass().floats().typeExist(cmd.argument)) return new InsetFloat(params, cmd.argument); lyxerr << "Non-existent float type: " << cmd.argument << endl; return 0; - case LFUN_INSET_WIDE_FLOAT: + case LFUN_FLOAT_WIDE_INSERT: // check if the float type exists if (params.getLyXTextClass().floats().typeExist(cmd.argument)) { - InsetFloat * p = new InsetFloat(params, cmd.argument); + auto_ptr p(new InsetFloat(params, cmd.argument)); p->wide(true, params); + return p.release(); } lyxerr << "Non-existent float type: " << cmd.argument << endl; return 0; - case LFUN_INSET_WRAP: + case LFUN_WRAP_INSERT: if (cmd.argument == "figure") return new InsetWrap(params, cmd.argument); lyxerr << "Non-existent floatflt type: " << cmd.argument << endl; @@ -127,45 +157,32 @@ InsetOld * createInset(FuncRequest const & cmd) // Try and generate a valid index entry. InsetCommandParams icp("index"); string const contents = cmd.argument.empty() ? - bv->getLyXText()->getStringToIndex() : + bv->getLyXText()->getStringToIndex(bv->cursor()) : cmd.argument; icp.setContents(contents); - - string data = InsetCommandMailer::params2string("index", icp); - LyXView * lv = bv->owner(); - - if (icp.getContents().empty()) { - lv->getDialogs().show("index", data, 0); - } else { - lv->dispatch(FuncRequest(bv, LFUN_INSET_APPLY, data)); - } - return 0; + return new InsetIndex(icp); } - case LFUN_TABULAR_INSERT: - if (!cmd.argument.empty()) { - std::istringstream ss(cmd.argument); - int r, c; - ss >> r >> c; - if (r <= 0) r = 2; - if (c <= 0) c = 2; - return new InsetTabular(*bv->buffer(), r, c); - } - bv->owner()->getDialogs().show("tabularcreate"); - return 0; + case LFUN_TABULAR_INSERT: { + if (cmd.argument.empty()) + return 0; + std::istringstream ss(cmd.argument); + int r = 0, c = 0; + ss >> r >> c; + if (r <= 0) + r = 2; + if (c <= 0) + c = 2; + return new InsetTabular(*bv->buffer(), r, c); + } - case LFUN_INSET_CAPTION: - if (bv->theLockingInset()) { - lyxerr << "Locking inset code: " - << static_cast(bv->theLockingInset()->lyxCode()); - InsetCaption * inset = new InsetCaption(params); - inset->setOwner(bv->theLockingInset()); - inset->setAutoBreakRows(true); - inset->setDrawFrame(InsetText::LOCKED); - inset->setFrameColor(LColor::captionframe); - return inset; - } - return 0; + case LFUN_CAPTION_INSERT: { + auto_ptr inset(new InsetCaption(params)); + inset->setAutoBreakRows(true); + inset->setDrawFrame(true); + inset->setFrameColor(LColor::captionframe); + return inset.release(); + } case LFUN_INDEX_PRINT: return new InsetPrintIndex(InsetCommandParams("printindex")); @@ -177,10 +194,10 @@ InsetOld * createInset(FuncRequest const & cmd) return new InsetEnvironment(params, cmd.argument); #if 0 - case LFUN_INSET_LIST: + case LFUN_LIST_INSERT: return new InsetList; - case LFUN_INSET_THEOREM: + case LFUN_THEOREM_INSERT: return new InsetTheorem; #endif @@ -189,75 +206,84 @@ InsetOld * createInset(FuncRequest const & cmd) if (name == "bibitem") { InsetCommandParams icp; - InsetCommandMailer::string2params(cmd.argument, icp); + InsetCommandMailer::string2params(name, cmd.argument, + icp); return new InsetBibitem(icp); } else if (name == "bibtex") { InsetCommandParams icp; - InsetCommandMailer::string2params(cmd.argument, icp); + InsetCommandMailer::string2params(name, cmd.argument, + icp); return new InsetBibtex(icp); } else if (name == "citation") { InsetCommandParams icp; - InsetCommandMailer::string2params(cmd.argument, icp); - InsetCitation * inset = new InsetCitation(icp); - inset->setLoadingBuffer(*bv->buffer(), false); - return inset; + InsetCommandMailer::string2params(name, cmd.argument, + icp); + return new InsetCitation(icp); } else if (name == "ert") { - InsetERT * inset = new InsetERT(params); - InsetERT::ERTStatus s; - InsetERTMailer::string2params(cmd.argument, s); - inset->status(bv, s); - return inset; + InsetCollapsable::CollapseStatus st; + InsetERTMailer::string2params(cmd.argument, st); + return new InsetERT(params, st); } else if (name == "external") { - Buffer const & buffer = *cmd.view()->buffer(); - InsetExternal::Params iep; + Buffer const & buffer = *bv->buffer(); + InsetExternalParams iep; InsetExternalMailer::string2params(cmd.argument, buffer, iep); - InsetExternal * inset = new InsetExternal; + auto_ptr inset(new InsetExternal); inset->setParams(iep, buffer); - return inset; + return inset.release(); } else if (name == "graphics") { - Buffer const & buffer = *cmd.view()->buffer(); + Buffer const & buffer = *bv->buffer(); InsetGraphicsParams igp; InsetGraphicsMailer::string2params(cmd.argument, buffer, igp); - InsetGraphics * inset = new InsetGraphics; + auto_ptr inset(new InsetGraphics); inset->setParams(igp); - return inset; + return inset.release(); } else if (name == "include") { - InsetInclude::Params iip; + InsetCommandParams iip; InsetIncludeMailer::string2params(cmd.argument, iip); return new InsetInclude(iip); } else if (name == "index") { InsetCommandParams icp; - InsetCommandMailer::string2params(cmd.argument, icp); + InsetCommandMailer::string2params(name, cmd.argument, + icp); return new InsetIndex(icp); } else if (name == "label") { InsetCommandParams icp; - InsetCommandMailer::string2params(cmd.argument, icp); + InsetCommandMailer::string2params(name, cmd.argument, + icp); return new InsetLabel(icp); } else if (name == "ref") { InsetCommandParams icp; - InsetCommandMailer::string2params(cmd.argument, icp); + InsetCommandMailer::string2params(name, cmd.argument, + icp); return new InsetRef(icp, *bv->buffer()); } else if (name == "toc") { InsetCommandParams icp; - InsetCommandMailer::string2params(cmd.argument, icp); + InsetCommandMailer::string2params(name, cmd.argument, + icp); return new InsetTOC(icp); } else if (name == "url") { InsetCommandParams icp; - InsetCommandMailer::string2params(cmd.argument, icp); + InsetCommandMailer::string2params(name, cmd.argument, + icp); return new InsetUrl(icp); + + } else if (name == "vspace") { + VSpace vspace; + InsetVSpaceMailer::string2params(cmd.argument, vspace); + return new InsetVSpace(vspace); } } @@ -295,7 +321,7 @@ InsetOld * createInset(FuncRequest const & cmd) } -InsetOld * readInset(LyXLex & lex, Buffer const & buf) +InsetBase * readInset(LyXLex & lex, Buffer const & buf) { // consistency check if (lex.getString() != "\\begin_inset") { @@ -303,10 +329,12 @@ InsetOld * readInset(LyXLex & lex, Buffer const & buf) << endl; } - InsetOld * inset = 0; + auto_ptr inset; + + LyXTextClass tclass = buf.params().getLyXTextClass(); lex.next(); - string const tmptok = lex.getString(); + string tmptok = lex.getString(); // test the different insets if (tmptok == "LatexCommand") { @@ -318,21 +346,21 @@ InsetOld * readInset(LyXLex & lex, Buffer const & buf) // This strange command allows LyX to recognize "natbib" style // citations: citet, citep, Citet etc. if (compare_ascii_no_case(cmdName.substr(0,4), "cite") == 0) { - inset = new InsetCitation(inscmd); + inset.reset(new InsetCitation(inscmd)); } else if (cmdName == "bibitem") { lex.printError("Wrong place for bibitem"); - inset = new InsetBibitem(inscmd); + inset.reset(new InsetBibitem(inscmd)); } else if (cmdName == "bibtex") { - inset = new InsetBibtex(inscmd); + inset.reset(new InsetBibtex(inscmd)); } else if (cmdName == "index") { - inset = new InsetIndex(inscmd); + inset.reset(new InsetIndex(inscmd)); } else if (cmdName == "include") { - inset = new InsetInclude(inscmd, buf); + inset.reset(new InsetInclude(inscmd)); } else if (cmdName == "label") { - inset = new InsetLabel(inscmd); + inset.reset(new InsetLabel(inscmd)); } else if (cmdName == "url" || cmdName == "htmlurl") { - inset = new InsetUrl(inscmd); + inset.reset(new InsetUrl(inscmd)); } else if (cmdName == "ref" || cmdName == "eqref" || cmdName == "pageref" @@ -341,80 +369,117 @@ InsetOld * readInset(LyXLex & lex, Buffer const & buf) || cmdName == "prettyref") { if (!inscmd.getOptions().empty() || !inscmd.getContents().empty()) { - inset = new InsetRef(inscmd, buf); + inset.reset(new InsetRef(inscmd, buf)); } } else if (cmdName == "tableofcontents") { - inset = new InsetTOC(inscmd); + inset.reset(new InsetTOC(inscmd)); } else if (cmdName == "listofalgorithms") { - inset = new InsetFloatList("algorithm"); + inset.reset(new InsetFloatList("algorithm")); } else if (cmdName == "listoffigures") { - inset = new InsetFloatList("figure"); + inset.reset(new InsetFloatList("figure")); } else if (cmdName == "listoftables") { - inset = new InsetFloatList("table"); + inset.reset(new InsetFloatList("table")); } else if (cmdName == "printindex") { - inset = new InsetPrintIndex(inscmd); + inset.reset(new InsetPrintIndex(inscmd)); + } else { + lyxerr << "unknown CommandInset '" << cmdName + << "'" << std::endl; + while (lex.isOK() && lex.getString() != "\\end_inset") + lex.next(); + return 0; } } else { if (tmptok == "Quotes") { - inset = new InsetQuotes; + inset.reset(new InsetQuotes); } else if (tmptok == "External") { - inset = new InsetExternal; + inset.reset(new InsetExternal); } else if (tmptok == "FormulaMacro") { - inset = new InsetFormulaMacro; + inset.reset(new MathMacroTemplate); } else if (tmptok == "Formula") { - inset = new InsetFormula; + inset.reset(new MathHullInset); } else if (tmptok == "Graphics") { - inset = new InsetGraphics; - } else if (tmptok == "Note" || tmptok == "Comment" - || tmptok == "Greyedout") { - inset = new InsetNote(buf.params(), tmptok); + inset.reset(new InsetGraphics); + } else if (tmptok == "Note") { + inset.reset(new InsetNote(buf.params(), tmptok)); + } else if (tmptok == "Box") { + inset.reset(new InsetBox(buf.params(), tmptok)); + } else if (tmptok == "CharStyle") { + lex.next(); + string s = lex.getString(); + CharStyles::iterator found_cs = tclass.charstyle(s); + if (found_cs != tclass.charstyles().end()) + inset.reset(new InsetCharStyle(buf.params(), found_cs)); + else { + // "Undefined" inset + inset.reset(new InsetCharStyle(buf.params(), s)); + } } else if (tmptok == "Branch") { - inset = new InsetBranch(buf.params(), tmptok); + inset.reset(new InsetBranch(buf.params(), + InsetBranchParams())); } else if (tmptok == "Include") { InsetCommandParams p("Include"); - inset = new InsetInclude(p, buf); + inset.reset(new InsetInclude(p)); } else if (tmptok == "Environment") { lex.next(); - inset = new InsetEnvironment(buf.params(), lex.getString()); + inset.reset(new InsetEnvironment(buf.params(), lex.getString())); } else if (tmptok == "ERT") { - inset = new InsetERT(buf.params()); + inset.reset(new InsetERT(buf.params())); } else if (tmptok == "InsetSpace") { - inset = new InsetSpace; + inset.reset(new InsetSpace); } else if (tmptok == "Tabular") { - inset = new InsetTabular(buf); + inset.reset(new InsetTabular(buf)); } else if (tmptok == "Text") { - inset = new InsetText(buf.params()); + inset.reset(new InsetText(buf.params())); + } else if (tmptok == "VSpace") { + inset.reset(new InsetVSpace); } else if (tmptok == "Foot") { - inset = new InsetFoot(buf.params()); + inset.reset(new InsetFoot(buf.params())); } else if (tmptok == "Marginal") { - inset = new InsetMarginal(buf.params()); + inset.reset(new InsetMarginal(buf.params())); } else if (tmptok == "OptArg") { - inset = new InsetOptArg(buf.params()); - } else if (tmptok == "Minipage") { - inset = new InsetMinipage(buf.params()); + inset.reset(new InsetOptArg(buf.params())); } else if (tmptok == "Float") { lex.next(); string tmptok = lex.getString(); - inset = new InsetFloat(buf.params(), tmptok); + inset.reset(new InsetFloat(buf.params(), tmptok)); } else if (tmptok == "Wrap") { lex.next(); string tmptok = lex.getString(); - inset = new InsetWrap(buf.params(), tmptok); + inset.reset(new InsetWrap(buf.params(), tmptok)); #if 0 } else if (tmptok == "List") { - inset = new InsetList; + inset.reset(new InsetList); } else if (tmptok == "Theorem") { - inset = new InsetList; + inset.reset(new InsetList); #endif } else if (tmptok == "Caption") { - inset = new InsetCaption(buf.params()); + inset.reset(new InsetCaption(buf.params())); } else if (tmptok == "FloatList") { - inset = new InsetFloatList; + inset.reset(new InsetFloatList); + } else { + lyxerr << "unknown Inset type '" << tmptok + << "'" << std::endl; + while (lex.isOK() && lex.getString() != "\\end_inset") + lex.next(); + return 0; } - if (inset) - inset->read(buf, lex); + inset->read(buf, lex); + +#ifdef WITH_WARNINGS +#warning hack.. +#endif + if (inset->lyxCode() == InsetBase::MATHMACRO_CODE) { + MathMacroTemplate const * tmpl = + static_cast(inset.get()); + MacroTable::globalMacros().insert + (tmpl->name(), tmpl->asMacroData()); + lyxerr[Debug::DEBUG] + << BOOST_CURRENT_FUNCTION + << ": creating local macro " << tmpl->name() + << endl; + } } - return inset; + return inset.release(); }