]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
Streamlining CollapseStatus stuff
[lyx.git] / src / TextClass.cpp
index ffbb600a01e676ace5c8ca849bb59f65233ffaa9..77348f28195423cb21c8e52f181cc95f413939ae 100644 (file)
@@ -104,7 +104,7 @@ bool layout2layout(FileName const & filename, FileName const & tempfile)
 TextClass::TextClass(string const & fn, string const & cln,
                           string const & desc, bool texClassAvail )
        : name_(fn), latexname_(cln), description_(desc),
-         floatlist_(new FloatList), ctrs_(new Counters),
+         floatlist_(new FloatList), counters_(new Counters),
          texClassAvail_(texClassAvail)
 {
        outputType_ = LATEX;
@@ -150,6 +150,7 @@ enum TextClassTags {
        TC_STYLE,
        TC_DEFAULTSTYLE,
        TC_CHARSTYLE,
+       TC_INSETLAYOUT,
        TC_ENVIRONMENT,
        TC_NOSTYLE,
        TC_COLUMNS,
@@ -192,6 +193,7 @@ bool TextClass::read(FileName const & filename, bool merge)
                { "float",           TC_FLOAT },
                { "format",          TC_FORMAT },
                { "input",           TC_INPUT },
+               { "insetlayout",     TC_INSETLAYOUT },
                { "leftmargin",      TC_LEFTMARGIN },
                { "nofloat",         TC_NOFLOAT },
                { "nostyle",         TC_NOSTYLE },
@@ -210,12 +212,12 @@ bool TextClass::read(FileName const & filename, bool merge)
 
        if (!merge)
                LYXERR(Debug::TCLASS) << "Reading textclass "
-                                       << to_utf8(makeDisplayPath(filename.absFilename()))
-                                       << endl;
+                                     << to_utf8(makeDisplayPath(filename.absFilename()))
+                                     << endl;
        else
                LYXERR(Debug::TCLASS) << "Reading input file "
-                                    << to_utf8(makeDisplayPath(filename.absFilename()))
-                                    << endl;
+                                     << to_utf8(makeDisplayPath(filename.absFilename()))
+                                     << endl;
 
        Lexer lexrc(textClassTags,
                sizeof(textClassTags) / sizeof(textClassTags[0]));
@@ -411,6 +413,12 @@ bool TextClass::read(FileName const & filename, bool merge)
                                readCharStyle(lexrc, name);
                        }
                        break;
+               case TC_INSETLAYOUT:
+                       if (lexrc.next()) {
+                               docstring const name = subst(lexrc.getDocString(), '_', ' ');
+                               readInsetLayout(lexrc, name);
+                       }
+                       break;
                case TC_FLOAT:
                        readFloat(lexrc);
                        break;
@@ -606,6 +614,19 @@ enum CharStyleTags {
 };
 
 
+enum InsetLayoutTags {
+       IL_FONT = 1,
+       IL_LABELFONT,
+       IL_LABELSTRING,
+       IL_LATEXTYPE,
+       IL_LATEXNAME,
+       IL_LATEXPARAM,
+       IL_PREAMBLE,
+       IL_END
+};
+
+
+
 void TextClass::readCharStyle(Lexer & lexrc, string const & name)
 {
        keyword_item elementTags[] = {
@@ -683,6 +704,92 @@ void TextClass::readCharStyle(Lexer & lexrc, string const & name)
 }
 
 
+void TextClass::readInsetLayout(Lexer & lexrc, docstring const & name)
+{
+       keyword_item elementTags[] = {
+               { "end", IL_END },
+               { "font", IL_FONT },
+               { "labelfont", IL_LABELFONT },
+               { "labelstring", IL_LABELSTRING },
+               { "latexname", IL_LATEXNAME },
+               { "latexparam", IL_LATEXPARAM },
+               { "latextype", IL_LATEXTYPE },
+               { "preamble", IL_PREAMBLE}
+       };
+
+       lexrc.pushTable(elementTags, IL_END);
+
+       docstring labelstring;
+       string latextype;
+       string latexname;
+       string latexparam;
+       Font font(Font::ALL_INHERIT);
+       Font labelfont(Font::ALL_INHERIT);
+       string preamble;
+
+       bool getout = false;
+       while (!getout && lexrc.isOK()) {
+               int le = lexrc.lex();
+               switch (le) {
+               case Lexer::LEX_UNDEF:
+                       lexrc.printError("Unknown ClassOption tag `$$Token'");
+                       continue;
+               default: break;
+               }
+               switch (static_cast<InsetLayoutTags>(le)) {
+               case IL_LATEXTYPE:
+                       lexrc.next();
+                       latextype = lexrc.getString();
+                       break;
+               case IL_LABELSTRING:
+                       lexrc.next();
+                       labelstring = lexrc.getDocString();
+                       break;
+               case IL_LATEXNAME:
+                       lexrc.next();
+                       latexname = lexrc.getString();
+                       break;
+               case IL_LATEXPARAM:
+                       lexrc.next();
+                       latexparam = subst(lexrc.getString(), "&quot;", "\"");
+                       break;
+               case IL_LABELFONT:
+                       labelfont.lyxRead(lexrc);
+                       labelfont.realize(defaultfont());
+                       break;
+               case IL_FONT:
+                       font.lyxRead(lexrc);
+                       font.realize(defaultfont());
+                       labelfont = font;
+                       break;
+               case IL_PREAMBLE:
+                       preamble = lexrc.getLongString("EndPreamble");
+                       break;
+               case IL_END:
+                       getout = true;
+                       break;
+               }
+       }
+
+       //
+       // Here add element to list if getout == true
+       if (getout) {
+               InsetLayout il;
+               il.labelstring = labelstring;
+               il.latextype = latextype;
+               il.latexname = latexname;
+               il.latexparam = latexparam;
+               il.font = font;
+               il.labelfont = labelfont;
+               il.preamble = from_utf8(preamble);
+               insetlayoutlist_[name] = il;
+       }
+
+       lexrc.popTable();
+}
+
+
+
 enum FloatTags {
        FT_TYPE = 1,
        FT_NAME,
@@ -718,7 +825,7 @@ void TextClass::readFloat(Lexer & lexrc)
        string within;
        string style;
        string name;
-       string listname;
+       string listName;
        bool builtin = false;
 
        bool getout = false;
@@ -734,8 +841,16 @@ void TextClass::readFloat(Lexer & lexrc)
                case FT_TYPE:
                        lexrc.next();
                        type = lexrc.getString();
-                       // Here we could check if this type is already defined
-                       // and modify it with the rest of the vars instead.
+                       if (floatlist_->typeExist(type)) {
+                               Floating const & fl = floatlist_->getType(type);
+                               placement = fl.placement();
+                               ext = fl.ext();
+                               within = fl.within();
+                               style = fl.style();
+                               name = fl.name();
+                               listName = fl.listName();
+                               builtin = fl.builtin();
+                       } 
                        break;
                case FT_NAME:
                        lexrc.next();
@@ -761,7 +876,7 @@ void TextClass::readFloat(Lexer & lexrc)
                        break;
                case FT_LISTNAME:
                        lexrc.next();
-                       listname = lexrc.getString();
+                       listName = lexrc.getString();
                        break;
                case FT_BUILTIN:
                        lexrc.next();
@@ -775,9 +890,12 @@ void TextClass::readFloat(Lexer & lexrc)
 
        // Here if have a full float if getout == true
        if (getout) {
-               Floating newfloat(type, placement, ext, within,
-                                 style, name, listname, builtin);
-               floatlist_->newFloat(newfloat);
+               Floating fl(type, placement, ext, within,
+                           style, name, listName, builtin);
+               floatlist_->newFloat(fl);
+               // each float has its own counter
+               counters_->newCounter(from_ascii(type), from_ascii(within), 
+                                     docstring(), docstring());
        }
 
        lexrc.popTable();
@@ -787,6 +905,8 @@ void TextClass::readFloat(Lexer & lexrc)
 enum CounterTags {
        CT_NAME = 1,
        CT_WITHIN,
+       CT_LABELSTRING,
+       CT_LABELSTRING_APPENDIX,
        CT_END
 };
 
@@ -794,6 +914,8 @@ void TextClass::readCounter(Lexer & lexrc)
 {
        keyword_item counterTags[] = {
                { "end", CT_END },
+               { "labelstring", CT_LABELSTRING },
+               { "labelstringappendix", CT_LABELSTRING_APPENDIX },
                { "name", CT_NAME },
                { "within", CT_WITHIN }
        };
@@ -802,6 +924,8 @@ void TextClass::readCounter(Lexer & lexrc)
 
        docstring name;
        docstring within;
+       docstring labelstring;
+       docstring labelstring_appendix;
 
        bool getout = false;
        while (!getout && lexrc.isOK()) {
@@ -815,14 +939,31 @@ void TextClass::readCounter(Lexer & lexrc)
                switch (static_cast<CounterTags>(le)) {
                case CT_NAME:
                        lexrc.next();
-                       name = from_ascii(lexrc.getString());
+                       name = lexrc.getDocString();
+                       if (counters_->hasCounter(name))
+                               LYXERR(Debug::TCLASS) 
+                                       << "Reading existing counter " 
+                                       << to_utf8(name) << endl;
+                       else
+                               LYXERR(Debug::TCLASS) 
+                                       << "Reading new counter " 
+                                       << to_utf8(name) << endl;
                        break;
                case CT_WITHIN:
                        lexrc.next();
-                       within = from_ascii(lexrc.getString());
+                       within = lexrc.getDocString();
                        if (within == "none")
                                within.erase();
                        break;
+               case CT_LABELSTRING:
+                       lexrc.next();
+                       labelstring = lexrc.getDocString();
+                       labelstring_appendix = labelstring;
+                       break;
+               case CT_LABELSTRING_APPENDIX:
+                       lexrc.next();
+                       labelstring_appendix = lexrc.getDocString();
+                       break;
                case CT_END:
                        getout = true;
                        break;
@@ -830,12 +971,9 @@ void TextClass::readCounter(Lexer & lexrc)
        }
 
        // Here if have a full counter if getout == true
-       if (getout) {
-               if (within.empty())
-                       ctrs_->newCounter(name);
-               else
-                       ctrs_->newCounter(name, within);
-       }
+       if (getout)
+               counters_->newCounter(name, within, 
+                                     labelstring, labelstring_appendix);
 
        lexrc.popTable();
 }
@@ -952,7 +1090,12 @@ FloatList const & TextClass::floats() const
 
 Counters & TextClass::counters() const
 {
-       return *ctrs_.get();
+       return *counters_.get();
+}
+
+InsetLayout const & TextClass::insetlayout(docstring const & name) const 
+{
+       return insetlayoutlist_[name]; 
 }