]> git.lyx.org Git - lyx.git/blobdiff - src/factory.C
reduce number of calls to LyXText::getFont
[lyx.git] / src / factory.C
index 747fc7a5897ba2b85ac26b88280c94690b4dbe66..9b3258a59351e31c8699750d7f8949ac8ad1a471 100644 (file)
@@ -40,7 +40,6 @@
 #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/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 <boost/assert.hpp>
 
+#include <sstream>
+
 using lyx::support::compare_ascii_no_case;
 
 using std::auto_ptr;
@@ -70,9 +69,8 @@ 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) {
@@ -85,13 +83,14 @@ InsetOld * createInset(FuncRequest const & cmd)
        case LFUN_INSERT_PAGEBREAK:
                return new InsetPagebreak;
 
-       case LFUN_INSET_MINIPAGE:
-               return new InsetMinipage(params);
-
        case LFUN_INSERT_CHARSTYLE: {
                string s = cmd.getArg(0);
-               CharStyles::iterator found_cs = params.getLyXTextClass().charstyle(s);
-               return new InsetCharStyle(params, found_cs);
+               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_INSERT_NOTE: {
@@ -112,7 +111,7 @@ InsetOld * createInset(FuncRequest const & cmd)
                string arg = cmd.getArg(0);
                if (arg.empty())
                        arg = "none";
-               return new InsetBranch(params, arg);
+               return new InsetBranch(params, InsetBranchParams(arg));
        }
 
        case LFUN_INSET_ERT:
@@ -157,19 +156,12 @@ 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();
+               return new InsetIndex(icp);
 
-               if (icp.getContents().empty()) {
-                       lv->getDialogs().show("index", data, 0);
-               } else {
-                       lv->dispatch(FuncRequest(bv, LFUN_INSET_APPLY, data));
-               }
-               return 0;
        }
 
        case LFUN_TABULAR_INSERT:
@@ -181,19 +173,19 @@ InsetOld * createInset(FuncRequest const & cmd)
                        if (c <= 0) c = 2;
                        return new InsetTabular(*bv->buffer(), r, c);
                }
-               bv->owner()->getDialogs().show("tabularcreate");
                return 0;
 
-       case LFUN_INSET_CAPTION: 
-       if (!bv->innerInset()) {
-               auto_ptr<InsetCaption> inset(new InsetCaption(params));
-               inset->setOwner(bv->innerInset());
-               inset->setAutoBreakRows(true);
-               inset->setDrawFrame(InsetText::LOCKED);
-               inset->setFrameColor(LColor::captionframe);
-               return inset.release();
+       case LFUN_INSET_CAPTION: {
+               UpdatableInset * up = bv->cursor().inset().asUpdatableInset();
+               if (!up) {
+                       auto_ptr<InsetCaption> inset(new InsetCaption(params));
+                       inset->setAutoBreakRows(true);
+                       inset->setDrawFrame(true);
+                       inset->setFrameColor(LColor::captionframe);
+                       return inset.release();
+               }
+               return 0;
        }
-       return 0;
 
        case LFUN_INDEX_PRINT:
                return new InsetPrintIndex(InsetCommandParams("printindex"));
@@ -217,17 +209,20 @@ 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);
+                       InsetCommandMailer::string2params(name, cmd.argument,
+                                                         icp);
                        return new InsetCitation(icp);
 
                } else if (name == "ert") {
@@ -236,7 +231,7 @@ InsetOld * createInset(FuncRequest const & cmd)
                        return new InsetERT(params, st);
 
                } else if (name == "external") {
-                       Buffer const & buffer = *cmd.view()->buffer();
+                       Buffer const & buffer = *bv->buffer();
                        InsetExternalParams iep;
                        InsetExternalMailer::string2params(cmd.argument,
                                                           buffer, iep);
@@ -245,7 +240,7 @@ InsetOld * createInset(FuncRequest const & cmd)
                        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);
@@ -260,27 +255,32 @@ InsetOld * createInset(FuncRequest const & cmd)
 
                } 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") {
@@ -324,7 +324,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") {
@@ -332,10 +332,10 @@ InsetOld * readInset(LyXLex & lex, Buffer const & buf)
                       << endl;
        }
 
-       auto_ptr<InsetOld> inset;
+       auto_ptr<InsetBase> inset;
 
        LyXTextClass tclass = buf.params().getLyXTextClass();
-               
+
        lex.next();
        string tmptok = lex.getString();
 
@@ -397,24 +397,28 @@ InsetOld * readInset(LyXLex & lex, Buffer const & buf)
                } else if (tmptok == "External") {
                        inset.reset(new InsetExternal);
                } else if (tmptok == "FormulaMacro") {
-                       inset.reset(new InsetFormulaMacro);
+                       inset.reset(new MathMacroTemplate);
                } else if (tmptok == "Formula") {
-                       inset.reset(new InsetFormula);
+                       inset.reset(new MathHullInset);
                } else if (tmptok == "Graphics") {
                        inset.reset(new InsetGraphics);
                } else if (tmptok == "Note") {
                        inset.reset(new InsetNote(buf.params(), tmptok));
-               } else if (tmptok == "Boxed" || tmptok == "ovalbox"
-                       || tmptok == "Shadowbox" || tmptok == "Doublebox"
-                       || tmptok == "Ovalbox" || tmptok == "Frameless") {
+               } 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);
-                       inset.reset(new InsetCharStyle(buf.params(), found_cs));
+                       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.reset(new InsetBranch(buf.params(), string()));
+                       inset.reset(new InsetBranch(buf.params(),
+                                                   InsetBranchParams()));
                } else if (tmptok == "Include") {
                        InsetCommandParams p("Include");
                        inset.reset(new InsetInclude(p));
@@ -437,8 +441,6 @@ InsetOld * readInset(LyXLex & lex, Buffer const & buf)
                        inset.reset(new InsetMarginal(buf.params()));
                } else if (tmptok == "OptArg") {
                        inset.reset(new InsetOptArg(buf.params()));
-               } else if (tmptok == "Minipage") {
-                       inset.reset(new InsetMinipage(buf.params()));
                } else if (tmptok == "Float") {
                        lex.next();
                        string tmptok = lex.getString();
@@ -466,6 +468,17 @@ InsetOld * readInset(LyXLex & lex, Buffer const & buf)
                }
 
                inset->read(buf, lex);
+
+#ifdef WITH_WARNINGS
+#warning hack..
+#endif
+               if (inset->lyxCode() == InsetBase::MATHMACRO_CODE) {
+                       MathMacroTemplate const * tmpl =
+                               static_cast<MathMacroTemplate*>(inset.get());
+                       MacroTable::globalMacros().insert
+                               (tmpl->name(), tmpl->asMacroData());
+                       lyxerr << "creating local macro " << tmpl->name() << endl;
+               }
        }
 
        return inset.release();