]> git.lyx.org Git - lyx.git/blobdiff - src/factory.cpp
Comment.
[lyx.git] / src / factory.cpp
index 71c92ac31193de6ac5db65e0bc6d952082b3dfbb..6d41a5809f1ce11adfea2bdbce6c58cc63d7a677 100644 (file)
@@ -75,7 +75,7 @@ namespace lyx {
 namespace Alert = frontend::Alert;
 
 
-Inset * createInset(Buffer & buf, FuncRequest const & cmd)
+Inset * createInsetHelper(Buffer & buf, FuncRequest const & cmd)
 {
        BufferParams const & params = buf.params();
 
@@ -102,46 +102,44 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
 
                case LFUN_FLEX_INSERT: {
                        string s = cmd.getArg(0);
-                       TextClass const & tclass = params.getTextClass();
-                       InsetLayout const & il = tclass.insetlayout(from_utf8(s));
-                       return new InsetFlex(params, il);
+                       return new InsetFlex(buf, buf.params().documentClassPtr(), s);
                }
 
                case LFUN_NOTE_INSERT: {
                        string arg = cmd.getArg(0);
                        if (arg.empty())
                                arg = "Note";
-                       return new InsetNote(params, arg);
+                       return new InsetNote(buf, arg);
                }
 
                case LFUN_BOX_INSERT: {
                        string arg = cmd.getArg(0);
                        if (arg.empty())
                                arg = "Boxed";
-                       return new InsetBox(params, arg);
+                       return new InsetBox(buf, arg);
                }
 
                case LFUN_BRANCH_INSERT: {
                        docstring arg = cmd.argument();
                        if (arg.empty())
                                arg = from_ascii("none");
-                       return new InsetBranch(params, InsetBranchParams(arg));
+                       return new InsetBranch(buf, InsetBranchParams(arg));
                }
 
                case LFUN_ERT_INSERT:
-                       return new InsetERT(params);
+                       return new InsetERT(buf);
 
                case LFUN_LISTING_INSERT:
-                       return new InsetListings(params);
+                       return new InsetListings(buf);
 
                case LFUN_FOOTNOTE_INSERT:
-                       return new InsetFoot(params);
+                       return new InsetFoot(buf);
 
                case LFUN_MARGINALNOTE_INSERT:
-                       return new InsetMarginal(params);
+                       return new InsetMarginal(buf);
 
                case LFUN_OPTIONAL_INSERT:
-                       return new InsetOptArg(params);
+                       return new InsetOptArg(buf);
 
                case LFUN_BIBITEM_INSERT:
                        return new InsetBibitem(InsetCommandParams(BIBITEM_CODE));
@@ -149,16 +147,16 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
                case LFUN_FLOAT_INSERT: {
                        // check if the float type exists
                        string const argument = to_utf8(cmd.argument());
-                       if (params.getTextClass().floats().typeExist(argument))
-                               return new InsetFloat(params, argument);
+                       if (buf.params().documentClass().floats().typeExist(argument))
+                               return new InsetFloat(buf, argument);
                        lyxerr << "Non-existent float type: " << argument << endl;
                }
 
                case LFUN_FLOAT_WIDE_INSERT: {
                        // check if the float type exists
                        string const argument = to_utf8(cmd.argument());
-                       if (params.getTextClass().floats().typeExist(argument)) {
-                               auto_ptr<InsetFloat> p(new InsetFloat(params, argument));
+                       if (params.documentClass().floats().typeExist(argument)) {
+                               auto_ptr<InsetFloat> p(new InsetFloat(buf, argument));
                                p->wide(true, params);
                                return p.release();
                        }
@@ -169,13 +167,13 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
                case LFUN_WRAP_INSERT: {
                        string const argument = to_utf8(cmd.argument());
                        if (argument == "figure" || argument == "table")
-                               return new InsetWrap(params, argument);
+                               return new InsetWrap(buf, argument);
                        lyxerr << "Non-existent wrapfig type: " << argument << endl;
                        return 0;
                }
 
                case LFUN_INDEX_INSERT:
-                       return new InsetIndex(params);
+                       return new InsetIndex(buf);
 
                case LFUN_NOMENCL_INSERT: {
                        InsetCommandParams icp(NOMENCL_CODE);
@@ -196,13 +194,8 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
                        return new InsetTabular(buf, r, c);
                }
 
-               case LFUN_CAPTION_INSERT: {
-                       auto_ptr<InsetCaption> inset(new InsetCaption(params));
-                       inset->setAutoBreakRows(true);
-                       inset->setDrawFrame(true);
-                       inset->setFrameColor(Color_captionframe);
-                       return inset.release();
-               }
+               case LFUN_CAPTION_INSERT:
+                       return new InsetCaption(buf);
 
                case LFUN_INDEX_PRINT:
                        return new InsetPrintIndex(InsetCommandParams(INDEX_PRINT_CODE));
@@ -214,14 +207,10 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
                        return new InsetTOC(InsetCommandParams(TOC_CODE));
 
                case LFUN_ENVIRONMENT_INSERT:
-                       return new InsetEnvironment(params, cmd.argument());
+                       return new InsetEnvironment(buf, cmd.argument());
 
                case LFUN_INFO_INSERT:
-                       return new InsetInfo(params, to_utf8(cmd.argument()));
-#if 0
-               case LFUN_THEOREM_INSERT:
-                       return new InsetTheorem;
-#endif
+                       return new InsetInfo(buf, to_utf8(cmd.argument()));
 
                case LFUN_INSET_INSERT: {
                        string const name = cmd.getArg(0);
@@ -252,20 +241,20 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
                        case ERT_CODE: {
                                InsetCollapsable::CollapseStatus st;
                                InsetERTMailer::string2params(to_utf8(cmd.argument()), st);
-                               return new InsetERT(params, st);
+                               return new InsetERT(buf, st);
                        }
                                
                        case LISTINGS_CODE: {
                                InsetListingsParams par;
                                InsetListingsMailer::string2params(to_utf8(cmd.argument()), par);
-                               return new InsetListings(params, par);
+                               return new InsetListings(buf, par);
                        }
                        
                        case EXTERNAL_CODE: {
                                InsetExternalParams iep;
                                InsetExternalMailer::string2params(to_utf8(cmd.argument()), buf, iep);
                                auto_ptr<InsetExternal> inset(new InsetExternal);
-                               inset->setParams(iep, buf);
+                               inset->setParams(iep);
                                return inset.release();
                        }
                        
@@ -290,7 +279,7 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
                        }
                        
                        case INDEX_CODE:
-                               return new InsetIndex(params);
+                               return new InsetIndex(buf);
                        
                        case NOMENCL_CODE: {
                                InsetCommandParams icp(code);
@@ -307,7 +296,7 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
                        case REF_CODE: {
                                InsetCommandParams icp(code);
                                InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), icp);
-                               return new InsetRef(icp, buf);
+                               return new InsetRef(buf, icp);
                        }
                        
                        case TOC_CODE: {
@@ -361,9 +350,9 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
 
        } catch (ExceptionMessage const & message) {
                if (message.type_ == ErrorException) {
+                       // This should never happen!
                        Alert::error(message.title_, message.details_);
-                       LyX::cref().emergencyCleanup();
-                       support::abort();
+                       LyX::cref().exit(1);
                } else if (message.type_ == WarningException) {
                        Alert::warning(message.title_, message.details_);
                        return 0;
@@ -374,6 +363,13 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
        return 0;
 }
 
+Inset * createInset(Buffer & buf, FuncRequest const & cmd)
+{
+       Inset * inset = createInsetHelper(buf, cmd);
+       if (inset)
+               inset->setBuffer(buf);
+       return inset;
+}
 
 Inset * readInset(Lexer & lex, Buffer const & buf)
 {
@@ -385,8 +381,6 @@ Inset * readInset(Lexer & lex, Buffer const & buf)
 
        auto_ptr<Inset> inset;
 
-       TextClass const & tclass = buf.params().getTextClass();
-
        lex.next();
        string tmptok = lex.getString();
 
@@ -443,7 +437,7 @@ Inset * readInset(Lexer & lex, Buffer const & buf)
                                break;
                        case REF_CODE:
                                if (!inscmd["name"].empty() || !inscmd["reference"].empty())
-                                       inset.reset(new InsetRef(inscmd, buf));
+                                       inset.reset(new InsetRef(buf, inscmd));
                                break;
                        case TOC_CODE:
                                inset.reset(new InsetTOC(inscmd));
@@ -456,6 +450,7 @@ Inset * readInset(Lexer & lex, Buffer const & buf)
                                        lex.next();
                                return 0;
                }
+               inset->setBuffer(const_cast<Buffer &>(buf));
        } else { 
                // FIXME This branch should be made to use inset codes as the preceding 
                // branch does. Unfortunately, that will take some doing. It requires
@@ -474,58 +469,58 @@ Inset * readInset(Lexer & lex, Buffer const & buf)
                } else if (tmptok == "Graphics") {
                        inset.reset(new InsetGraphics);
                } else if (tmptok == "Note") {
-                       inset.reset(new InsetNote(buf.params(), tmptok));
+                       inset.reset(new InsetNote(buf, tmptok));
                } else if (tmptok == "Box") {
-                       inset.reset(new InsetBox(buf.params(), tmptok));
+                       inset.reset(new InsetBox(buf, tmptok));
                } else if (tmptok == "Flex") {
                        lex.next();
                        string s = lex.getString();
-                       InsetLayout const & il = tclass.insetlayout(from_utf8(s));
-                       inset.reset(new InsetFlex(buf.params(), il));
+                       inset.reset(new InsetFlex(buf, 
+                               buf.params().documentClassPtr(), s));
                } else if (tmptok == "Branch") {
-                       inset.reset(new InsetBranch(buf.params(),
+                       inset.reset(new InsetBranch(buf,
                                                    InsetBranchParams()));
                } else if (tmptok == "Environment") {
                        lex.next();
-                       inset.reset(new InsetEnvironment(buf.params(), lex.getDocString()));
+                       inset.reset(new InsetEnvironment(buf, lex.getDocString()));
                } else if (tmptok == "ERT") {
-                       inset.reset(new InsetERT(buf.params()));
+                       inset.reset(new InsetERT(buf));
                } else if (tmptok == "listings") {
-                       inset.reset(new InsetListings(buf.params()));
+                       inset.reset(new InsetListings(buf));
                } else if (tmptok == "InsetSpace") {
                        inset.reset(new InsetSpace);
                } else if (tmptok == "Tabular") {
                        inset.reset(new InsetTabular(buf));
                } else if (tmptok == "Text") {
-                       inset.reset(new InsetText(buf.params()));
+                       inset.reset(new InsetText(buf));
                } else if (tmptok == "VSpace") {
                        inset.reset(new InsetVSpace);
                } else if (tmptok == "Foot") {
-                       inset.reset(new InsetFoot(buf.params()));
+                       inset.reset(new InsetFoot(buf));
                } else if (tmptok == "Marginal") {
-                       inset.reset(new InsetMarginal(buf.params()));
+                       inset.reset(new InsetMarginal(buf));
                } else if (tmptok == "OptArg") {
-                       inset.reset(new InsetOptArg(buf.params()));
+                       inset.reset(new InsetOptArg(buf));
                } else if (tmptok == "Float") {
                        lex.next();
                        string tmptok = lex.getString();
-                       inset.reset(new InsetFloat(buf.params(), tmptok));
+                       inset.reset(new InsetFloat(buf, tmptok));
                } else if (tmptok == "Wrap") {
                        lex.next();
                        string tmptok = lex.getString();
-                       inset.reset(new InsetWrap(buf.params(), tmptok));
+                       inset.reset(new InsetWrap(buf, tmptok));
 #if 0
                } else if (tmptok == "Theorem") {
                        inset.reset(new InsetList);
 #endif
                } else if (tmptok == "Caption") {
-                       inset.reset(new InsetCaption(buf.params()));
+                       inset.reset(new InsetCaption(buf));
                } else if (tmptok == "Index") {
-                       inset.reset(new InsetIndex(buf.params()));
+                       inset.reset(new InsetIndex(buf));
                } else if (tmptok == "FloatList") {
                        inset.reset(new InsetFloatList);
                } else if (tmptok == "Info") {
-                       inset.reset(new InsetInfo(buf.params()));
+                       inset.reset(new InsetInfo(buf));
                } else {
                        lyxerr << "unknown Inset type '" << tmptok
                               << "'" << endl;
@@ -534,9 +529,14 @@ Inset * readInset(Lexer & lex, Buffer const & buf)
                        return 0;
                }
 
-               inset->read(buf, lex);
+               // Set the buffer reference for proper parsing of some insets
+               // (InsetCollapsable for example)
+               inset->setBuffer(const_cast<Buffer &>(buf));
+               inset->read(lex);
+               // Set again the buffer for insets that are created inside this inset
+               // (InsetMathHull for example).
+               inset->setBuffer(const_cast<Buffer &>(buf));
        }
-
        return inset.release();
 }