]> git.lyx.org Git - lyx.git/blob - src/lyxlayout.C
Bug fix; ensure that all is Ok after the combox is moved with
[lyx.git] / src / lyxlayout.C
1 /**
2  * \file lyxlayout.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Lars Gullik Bjønnes
7  * \author Jean-Marc Lasgouttes
8  * \author André Pönitz
9  *
10  * Full author contact details are available in file CREDITS.
11  */
12
13 #include <config.h>
14
15 #include "lyxlayout.h"
16 #include "lyxtextclass.h"
17 #include "lyxlex.h"
18 #include "debug.h"
19
20 #include "support/lstrings.h"
21
22 using lyx::support::subst;
23 using lyx::support::trim;
24
25 using std::endl;
26 using std::string;
27
28
29 //  The order of the LayoutTags enum is no more important. [asierra300396]
30 // Tags indexes.
31 enum LayoutTags {
32         LT_ALIGN = 1,
33         LT_ALIGNPOSSIBLE,
34         LT_MARGIN,
35         LT_BOTTOMSEP,
36         LT_COMMANDDEPTH,
37         LT_COPYSTYLE,
38         LT_DEPENDSON,
39         LT_OBSOLETEDBY,
40         //LT_EMPTY,
41         LT_END,
42         //LT_ENVIRONMENT_DEFAULT,
43         //LT_FANCYHDR,
44         LT_FILL_BOTTOM,
45         LT_FILL_TOP,
46         //LT_FIRST_COUNTER,
47         LT_FONT,
48         LT_FREE_SPACING,
49         LT_PASS_THRU,
50         //LT_HEADINGS,
51         LT_ITEMSEP,
52         LT_KEEPEMPTY,
53         LT_LABEL_BOTTOMSEP,
54         LT_LABELFONT,
55         LT_TEXTFONT,
56         LT_LABELINDENT,
57         LT_LABELSEP,
58         LT_LABELSTRING,
59         LT_LABELSTRING_APPENDIX,
60         LT_LABELCOUNTER,
61         LT_LABELTYPE,
62         LT_ENDLABELSTRING,
63         LT_ENDLABELTYPE,
64         LT_LATEXNAME,
65         LT_LATEXPARAM,
66         LT_OPTARGS,
67         LT_LATEXTYPE,
68         LT_LATEXHEADER,
69         LT_LATEXFOOTER,
70         LT_LATEXPARAGRAPH,
71         LT_LEFTMARGIN,
72         LT_NEED_PROTECT,
73         LT_NEWLINE,
74         LT_NEXTNOINDENT,
75         LT_PARINDENT,
76         LT_PARSEP,
77         LT_PARSKIP,
78         //LT_PLAIN,
79         LT_PREAMBLE,
80         LT_RIGHTMARGIN,
81         LT_SPACING,
82         LT_TOPSEP,
83         LT_TOCLEVEL,
84         LT_INNERTAG,
85         LT_LABELTAG,
86         LT_ITEMTAG,
87         LT_INTITLE // keep this last!
88 };
89
90 /////////////////////
91
92 // Constructor for layout
93 LyXLayout::LyXLayout ()
94 {
95         margintype = MARGIN_STATIC;
96         latextype = LATEX_PARAGRAPH;
97         intitle = false;
98         optionalargs = 0;
99         needprotect = false;
100         keepempty = false;
101         font = LyXFont(LyXFont::ALL_INHERIT);
102         labelfont = LyXFont(LyXFont::ALL_INHERIT);
103         resfont = LyXFont(LyXFont::ALL_SANE);
104         reslabelfont = LyXFont(LyXFont::ALL_SANE);
105         nextnoindent = false;
106         parskip = 0.0;
107         itemsep = 0;
108         topsep = 0.0;
109         bottomsep = 0.0;
110         labelbottomsep = 0.0;
111         parsep = 0;
112         align = LYX_ALIGN_BLOCK;
113         alignpossible = LYX_ALIGN_BLOCK;
114         labeltype = LABEL_NO_LABEL;
115         endlabeltype = END_LABEL_NO_LABEL;
116         // Should or should not. That is the question.
117         // spacing.set(Spacing::OneHalf);
118         fill_top = false;
119         fill_bottom = false;
120         newline_allowed = true;
121         free_spacing = false;
122         pass_thru = false;
123         is_environment = false;
124         toclevel = 0;
125         commanddepth = 0;
126 }
127
128
129 // Reads a layout definition from file
130 bool LyXLayout::Read(LyXLex & lexrc, LyXTextClass const & tclass)
131 {
132         // This table is sorted alphabetically [asierra 30March96]
133         keyword_item layoutTags[] = {
134                 { "align",          LT_ALIGN },
135                 { "alignpossible",  LT_ALIGNPOSSIBLE },
136                 { "bottomsep",      LT_BOTTOMSEP },
137                 { "commanddepth",   LT_COMMANDDEPTH },
138                 { "copystyle",      LT_COPYSTYLE },
139                 { "dependson",      LT_DEPENDSON },
140                 { "end",            LT_END },
141                 { "endlabelstring", LT_ENDLABELSTRING },
142                 { "endlabeltype",   LT_ENDLABELTYPE },
143                 { "fill_bottom",    LT_FILL_BOTTOM },
144                 { "fill_top",       LT_FILL_TOP },
145                 { "font",           LT_FONT },
146                 { "freespacing",    LT_FREE_SPACING },
147                 { "innertag",       LT_INNERTAG },
148                 { "intitle",        LT_INTITLE },
149                 { "itemsep",        LT_ITEMSEP },
150                 { "itemtag",        LT_ITEMTAG },
151                 { "keepempty",      LT_KEEPEMPTY },
152                 { "labelbottomsep", LT_LABEL_BOTTOMSEP },
153                 { "labelcounter",   LT_LABELCOUNTER },
154                 { "labelfont",      LT_LABELFONT },
155                 { "labelindent",    LT_LABELINDENT },
156                 { "labelsep",       LT_LABELSEP },
157                 { "labelstring",    LT_LABELSTRING },
158                 { "labelstringappendix", LT_LABELSTRING_APPENDIX },
159                 { "labeltag",       LT_LABELTAG },
160                 { "labeltype",      LT_LABELTYPE },
161                 { "latexfooter",    LT_LATEXFOOTER },
162                 { "latexheader",    LT_LATEXHEADER },
163                 { "latexname",      LT_LATEXNAME },
164                 { "latexparagraph", LT_LATEXPARAGRAPH },
165                 { "latexparam",     LT_LATEXPARAM },
166                 { "latextype",      LT_LATEXTYPE },
167                 { "leftmargin",     LT_LEFTMARGIN },
168                 { "margin",         LT_MARGIN },
169                 { "needprotect",    LT_NEED_PROTECT },
170                 { "newline",        LT_NEWLINE },
171                 { "nextnoindent",   LT_NEXTNOINDENT },
172                 { "obsoletedby",    LT_OBSOLETEDBY },
173                 { "optionalargs",   LT_OPTARGS },
174                 { "parindent",      LT_PARINDENT },
175                 { "parsep",         LT_PARSEP },
176                 { "parskip",        LT_PARSKIP },
177                 { "passthru",       LT_PASS_THRU },
178                 { "preamble",       LT_PREAMBLE },
179                 { "rightmargin",    LT_RIGHTMARGIN },
180                 { "spacing",        LT_SPACING },
181                 { "textfont",       LT_TEXTFONT },
182                 { "toclevel",       LT_TOCLEVEL },
183                 { "topsep",         LT_TOPSEP }
184         };
185
186         bool error = false;
187         bool finished = false;
188         lexrc.pushTable(layoutTags, LT_INTITLE);
189         // parse style section
190         while (!finished && lexrc.isOK() && !error) {
191                 int le = lexrc.lex();
192                 // See comment in lyxrc.C.
193                 switch (le) {
194                 case LyXLex::LEX_FEOF:
195                         continue;
196
197                 case LyXLex::LEX_UNDEF:         // parse error
198                         lexrc.printError("Unknown layout tag `$$Token'");
199                         error = true;
200                         continue;
201                 default: break;
202                 }
203                 switch (static_cast<LayoutTags>(le)) {
204                 case LT_END:            // end of structure
205                         finished = true;
206                         break;
207
208                 case LT_COPYSTYLE:     // initialize with a known style
209                         if (lexrc.next()) {
210                                 string const style = lexrc.getString();
211
212                                 if (tclass.hasLayout(style)) {
213                                         string const tmpname = name_;
214                                         this->operator=(*tclass[style]);
215                                         name_ = tmpname;
216                                 } else {
217                                         lyxerr << "Cannot copy unknown style `"
218                                                << style << "'\n"
219                                                << "All layouts so far:"
220                                                << endl;
221                                         LyXTextClass::const_iterator it =
222                                                 tclass.begin();
223                                         LyXTextClass::const_iterator end =
224                                                 tclass.end();
225                                         for (; it != end; ++it) {
226                                                 lyxerr << (*it)->name()
227                                                        << endl;
228                                         }
229
230                                         //lexrc.printError("Cannot copy known "
231                                         //               "style `$$Token'");
232                                 }
233                         }
234                         break;
235
236                 case LT_OBSOLETEDBY:     // replace with a known style
237                         if (lexrc.next()) {
238                                 string const style = lexrc.getString();
239
240                                 if (tclass.hasLayout(style)) {
241                                         string const tmpname = name_;
242                                         this->operator=(*tclass[style]);
243                                         name_ = tmpname;
244                                         if (obsoleted_by().empty())
245                                                 obsoleted_by_ = style;
246                                 } else {
247                                         lyxerr << "Cannot replace with unknown style `" << style << '\'' << endl;
248
249                                         //lexrc.printError("Cannot replace with"
250                                         //               " unknown style "
251                                         //               "`$$Token'");
252                                 }
253                         }
254                         break;
255
256                 case LT_DEPENDSON:
257                         if (lexrc.next())
258                                 depends_on_ = lexrc.getString();
259                         break;
260
261                 case LT_MARGIN:         // margin style definition.
262                         readMargin(lexrc);
263                         break;
264
265                 case LT_LATEXTYPE:      // LaTeX style definition.
266                         readLatexType(lexrc);
267                         break;
268
269                 case LT_LATEXHEADER:    // header for environments
270                         lexrc.next();
271                         latexheader = lexrc.getString();
272                         break;
273
274                 case LT_LATEXFOOTER:    // footer for environments
275                         lexrc.next();
276                         latexfooter = lexrc.getString();
277                         break;
278
279                 case LT_LATEXPARAGRAPH:
280                         lexrc.next();
281                         latexparagraph = lexrc.getString();
282                         break;
283
284                 case LT_INTITLE:
285                         intitle = lexrc.next() && lexrc.getInteger();
286                         break;
287
288                 case LT_TOCLEVEL:
289                         lexrc.next();
290                         toclevel = lexrc.getInteger();
291                         break;
292
293                 case LT_OPTARGS:
294                         if (lexrc.next())
295                                 optionalargs = lexrc.getInteger();
296                         break;
297
298                 case LT_NEED_PROTECT:
299                         needprotect = lexrc.next() && lexrc.getInteger();
300                         break;
301
302                 case LT_KEEPEMPTY:
303                         keepempty = lexrc.next() && lexrc.getInteger();
304                         break;
305
306                 case LT_FONT:
307                         font.lyxRead(lexrc);
308                         labelfont= font;
309                         break;
310
311                 case LT_TEXTFONT:
312                         font.lyxRead(lexrc);
313                         break;
314
315                 case LT_LABELFONT:
316                         labelfont.lyxRead(lexrc);
317                         break;
318
319                 case LT_NEXTNOINDENT:   // Indent next paragraph?
320                         if (lexrc.next() && lexrc.getInteger())
321                                 nextnoindent = true;
322                         else
323                                 nextnoindent = false;
324                         break;
325
326                 case LT_COMMANDDEPTH:
327                         lexrc.next();
328                         commanddepth = lexrc.getInteger();
329                         break;
330
331                 case LT_LATEXNAME:
332                         if (lexrc.next())
333                                 latexname_ = lexrc.getString();
334                         break;
335
336                 case LT_LATEXPARAM:
337                         if (lexrc.next())
338                                 latexparam_ = subst(lexrc.getString(), "&quot;", "\"");
339                         break;
340
341                 case LT_INNERTAG:
342                         if (lexrc.next())
343                                 innertag_ = lexrc.getString();
344                         break;
345
346                 case LT_LABELTAG:
347                         if (lexrc.next())
348                                 labeltag_ = lexrc.getString();
349                         break;
350
351                 case LT_ITEMTAG:
352                         if (lexrc.next())
353                                 itemtag_ = lexrc.getString();
354                         break;
355
356                 case LT_PREAMBLE:
357                         preamble_ = lexrc.getLongString("EndPreamble");
358                         break;
359
360                 case LT_LABELTYPE:
361                         readLabelType(lexrc);
362                         break;
363
364                 case LT_ENDLABELTYPE:
365                         readEndLabelType(lexrc);
366                         break;
367
368                 case LT_LEFTMARGIN:     // left margin type
369                         if (lexrc.next())
370                                 leftmargin = lexrc.getString();
371                         break;
372
373                 case LT_RIGHTMARGIN:    // right margin type
374                         if (lexrc.next())
375                                 rightmargin = lexrc.getString();
376                         break;
377
378                 case LT_LABELINDENT:    // label indenting flag
379                         if (lexrc.next())
380                                 labelindent = lexrc.getString();
381                         break;
382
383                 case LT_PARINDENT:      // paragraph indent. flag
384                         if (lexrc.next())
385                                 parindent = lexrc.getString();
386                         break;
387
388                 case LT_PARSKIP:        // paragraph skip size
389                         if (lexrc.next())
390                                 parskip = lexrc.getFloat();
391                         break;
392
393                 case LT_ITEMSEP:        // item separation size
394                         if (lexrc.next())
395                                 itemsep = lexrc.getFloat();
396                         break;
397
398                 case LT_TOPSEP:         // top separation size
399                         if (lexrc.next())
400                                 topsep = lexrc.getFloat();
401                         break;
402
403                 case LT_BOTTOMSEP:      // bottom separation size
404                         if (lexrc.next())
405                                 bottomsep = lexrc.getFloat();
406                         break;
407
408                 case LT_LABEL_BOTTOMSEP: // label bottom separation size
409                         if (lexrc.next())
410                                 labelbottomsep = lexrc.getFloat();
411                         break;
412
413                 case LT_LABELSEP:       // label separator
414                         if (lexrc.next()) {
415                                 labelsep = subst(lexrc.getString(), 'x', ' ');
416                         }
417                         break;
418
419                 case LT_PARSEP:         // par. separation size
420                         if (lexrc.next())
421                                 parsep = lexrc.getFloat();
422                         break;
423
424                 case LT_FILL_TOP:       // fill top flag
425                         if (lexrc.next())
426                                 fill_top = lexrc.getInteger();
427                         break;
428
429                 case LT_FILL_BOTTOM:    // fill bottom flag
430                         if (lexrc.next())
431                                 fill_bottom = lexrc.getInteger();
432                         break;
433
434                 case LT_NEWLINE:        // newlines allowed?
435                         if (lexrc.next())
436                                 newline_allowed = lexrc.getInteger();
437                         break;
438
439                 case LT_ALIGN:          // paragraph align
440                         readAlign(lexrc);
441                         break;
442                 case LT_ALIGNPOSSIBLE:  // paragraph allowed align
443                         readAlignPossible(lexrc);
444                         break;
445
446                 case LT_LABELSTRING:    // label string definition
447                         if (lexrc.next())
448                                 labelstring_ = trim(lexrc.getString());
449                         break;
450
451                 case LT_ENDLABELSTRING: // endlabel string definition
452                         if (lexrc.next())
453                                 endlabelstring_ = trim(lexrc.getString());
454                         break;
455
456                 case LT_LABELSTRING_APPENDIX: // label string appendix definition
457                         if (lexrc.next())
458                                 labelstring_appendix_ = trim(lexrc.getString());
459                         break;
460
461                 case LT_LABELCOUNTER: // name of counter to use
462                         if (lexrc.next())
463                                 counter = trim(lexrc.getString());
464                         break;
465
466                 case LT_FREE_SPACING:   // Allow for free spacing.
467                         if (lexrc.next())
468                                 free_spacing = lexrc.getInteger();
469                         break;
470
471                 case LT_PASS_THRU:      // Allow for pass thru.
472                         if (lexrc.next())
473                                 pass_thru = lexrc.getInteger();
474                         break;
475
476                 case LT_SPACING: // setspace.sty
477                         readSpacing(lexrc);
478                         break;
479                 }
480         }
481         lexrc.popTable();
482
483         if (labelstring_appendix_.empty())
484                 labelstring_appendix_ = labelstring_;
485         return error;
486 }
487
488
489 enum AlignTags {
490         AT_BLOCK = 1,
491         AT_LEFT,
492         AT_RIGHT,
493         AT_CENTER,
494         AT_LAYOUT
495 };
496
497
498 void LyXLayout::readAlign(LyXLex & lexrc)
499 {
500         keyword_item alignTags[] = {
501                 { "block",  AT_BLOCK },
502                 { "center", AT_CENTER },
503                 { "layout", AT_LAYOUT },
504                 { "left",   AT_LEFT },
505                 { "right",  AT_RIGHT }
506         };
507
508         pushpophelper pph(lexrc, alignTags, AT_LAYOUT);
509         int le = lexrc.lex();
510         switch (le) {
511         case LyXLex::LEX_UNDEF:
512                 lexrc.printError("Unknown alignment `$$Token'");
513                 return;
514         default: break;
515         };
516         switch (static_cast<AlignTags>(le)) {
517         case AT_BLOCK:
518                 align = LYX_ALIGN_BLOCK;
519                 break;
520         case AT_LEFT:
521                 align = LYX_ALIGN_LEFT;
522                 break;
523         case AT_RIGHT:
524                 align = LYX_ALIGN_RIGHT;
525                 break;
526         case AT_CENTER:
527                 align = LYX_ALIGN_CENTER;
528                 break;
529         case AT_LAYOUT:
530                 align = LYX_ALIGN_LAYOUT;
531                 break;
532         }
533 }
534
535
536 void LyXLayout::readAlignPossible(LyXLex & lexrc)
537 {
538         keyword_item alignTags[] = {
539                 { "block",  AT_BLOCK },
540                 { "center", AT_CENTER },
541                 { "layout", AT_LAYOUT },
542                 { "left",   AT_LEFT },
543                 { "right",  AT_RIGHT }
544         };
545
546         lexrc.pushTable(alignTags, AT_LAYOUT);
547         alignpossible = LYX_ALIGN_NONE;
548         int lineno = lexrc.getLineNo();
549         do {
550                 int le = lexrc.lex();
551                 switch (le) {
552                 case LyXLex::LEX_UNDEF:
553                         lexrc.printError("Unknown alignment `$$Token'");
554                         continue;
555                 default: break;
556                 };
557                 switch (static_cast<AlignTags>(le)) {
558                 case AT_BLOCK:
559                         alignpossible |= LYX_ALIGN_BLOCK;
560                         break;
561                 case AT_LEFT:
562                         alignpossible |= LYX_ALIGN_LEFT;
563                         break;
564                 case AT_RIGHT:
565                         alignpossible |= LYX_ALIGN_RIGHT;
566                         break;
567                 case AT_CENTER:
568                         alignpossible |= LYX_ALIGN_CENTER;
569                         break;
570                 case AT_LAYOUT:
571                         alignpossible |= LYX_ALIGN_LAYOUT;
572                         break;
573                 }
574         } while (lineno == lexrc.getLineNo());
575         lexrc.popTable();
576 }
577
578
579 enum LabelTypeTags {
580         LA_NO_LABEL = 1,
581         LA_MANUAL,
582         LA_TOP_ENVIRONMENT,
583         LA_CENTERED_TOP_ENVIRONMENT,
584         LA_STATIC,
585         LA_SENSITIVE,
586         LA_COUNTER,
587         LA_ENUMERATE,
588         LA_ITEMIZE,
589         LA_BIBLIO
590 };
591
592
593 void LyXLayout::readLabelType(LyXLex & lexrc)
594 {
595         keyword_item labelTypeTags[] = {
596         { "bibliography",             LA_BIBLIO },
597         { "centered_top_environment", LA_CENTERED_TOP_ENVIRONMENT },
598         { "counter",                  LA_COUNTER },
599         { "enumerate",                LA_ENUMERATE },
600         { "itemize",                  LA_ITEMIZE },
601         { "manual",                   LA_MANUAL },
602         { "no_label",                 LA_NO_LABEL },
603         { "sensitive",                LA_SENSITIVE },
604         { "static",                   LA_STATIC },
605         { "top_environment",          LA_TOP_ENVIRONMENT }
606         };
607
608         pushpophelper pph(lexrc, labelTypeTags, LA_BIBLIO);
609         int le = lexrc.lex();
610         switch (le) {
611         case LyXLex::LEX_UNDEF:
612                 lexrc.printError("Unknown labeltype tag `$$Token'");
613                 return;
614         default: break;
615         }
616         switch (static_cast<LabelTypeTags>(le)) {
617         case LA_NO_LABEL:
618                 labeltype = LABEL_NO_LABEL;
619                 break;
620         case LA_MANUAL:
621                 labeltype = LABEL_MANUAL;
622                 break;
623         case LA_TOP_ENVIRONMENT:
624                 labeltype = LABEL_TOP_ENVIRONMENT;
625                 break;
626         case LA_CENTERED_TOP_ENVIRONMENT:
627                 labeltype = LABEL_CENTERED_TOP_ENVIRONMENT;
628                 break;
629         case LA_STATIC:
630                 labeltype = LABEL_STATIC;
631                 break;
632         case LA_SENSITIVE:
633                 labeltype = LABEL_SENSITIVE;
634                 break;
635         case LA_COUNTER:
636                 labeltype = LABEL_COUNTER;
637                 break;
638         case LA_ENUMERATE:
639                 labeltype = LABEL_ENUMERATE;
640                 break;
641         case LA_ITEMIZE:
642                 labeltype = LABEL_ITEMIZE;
643                 break;
644         case LA_BIBLIO:
645                 labeltype = LABEL_BIBLIO;
646                 break;
647         }
648 }
649
650
651 namespace {
652
653 keyword_item endlabelTypeTags[] = {
654         { "box",        END_LABEL_BOX },
655         { "filled_box", END_LABEL_FILLED_BOX },
656         { "no_label",   END_LABEL_NO_LABEL },
657         { "static",     END_LABEL_STATIC }
658 };
659
660 } // namespace anon
661
662
663 void LyXLayout::readEndLabelType(LyXLex & lexrc)
664 {
665         pushpophelper pph(lexrc, endlabelTypeTags,
666                           END_LABEL_ENUM_LAST-END_LABEL_ENUM_FIRST+1);
667         int le = lexrc.lex();
668         switch (le) {
669         case LyXLex::LEX_UNDEF:
670                 lexrc.printError("Unknown labeltype tag `$$Token'");
671                 break;
672         case END_LABEL_STATIC:
673         case END_LABEL_BOX:
674         case END_LABEL_FILLED_BOX:
675         case END_LABEL_NO_LABEL:
676                 endlabeltype = static_cast<LYX_END_LABEL_TYPES>(le);
677                 break;
678         default:
679                 lyxerr << "Unhandled value " << le
680                        << " in LyXLayout::readEndLabelType." << endl;
681                 break;
682         }
683 }
684
685
686 void LyXLayout::readMargin(LyXLex & lexrc)
687 {
688         keyword_item marginTags[] = {
689                 { "dynamic",           MARGIN_DYNAMIC },
690                 { "first_dynamic",     MARGIN_FIRST_DYNAMIC },
691                 { "manual",            MARGIN_MANUAL },
692                 { "right_address_box", MARGIN_RIGHT_ADDRESS_BOX },
693                 { "static",            MARGIN_STATIC }
694         };
695
696         pushpophelper pph(lexrc, marginTags, MARGIN_RIGHT_ADDRESS_BOX);
697
698         int le = lexrc.lex();
699         switch (le) {
700         case LyXLex::LEX_UNDEF:
701                 lexrc.printError("Unknown margin type tag `$$Token'");
702                 return;
703         case MARGIN_STATIC:
704         case MARGIN_MANUAL:
705         case MARGIN_DYNAMIC:
706         case MARGIN_FIRST_DYNAMIC:
707         case MARGIN_RIGHT_ADDRESS_BOX:
708                 margintype = static_cast<LYX_MARGIN_TYPE>(le);
709                 break;
710         default:
711                 lyxerr << "Unhandled value " << le
712                        << " in LyXLayout::readMargin." << endl;
713                 break;
714         }
715 }
716
717
718 void LyXLayout::readLatexType(LyXLex & lexrc)
719 {
720         keyword_item latexTypeTags[] = {
721                 { "bib_environment",  LATEX_BIB_ENVIRONMENT },
722                 { "command",          LATEX_COMMAND },
723                 { "environment",      LATEX_ENVIRONMENT },
724                 { "item_environment", LATEX_ITEM_ENVIRONMENT },
725                 { "list_environment", LATEX_LIST_ENVIRONMENT },
726                 { "paragraph",        LATEX_PARAGRAPH }
727         };
728
729         pushpophelper pph(lexrc, latexTypeTags, LATEX_LIST_ENVIRONMENT);
730         int le = lexrc.lex();
731         switch (le) {
732         case LyXLex::LEX_UNDEF:
733                 lexrc.printError("Unknown latextype tag `$$Token'");
734                 return;
735         case LATEX_PARAGRAPH:
736         case LATEX_COMMAND:
737         case LATEX_ENVIRONMENT:
738         case LATEX_ITEM_ENVIRONMENT:
739         case LATEX_BIB_ENVIRONMENT:
740         case LATEX_LIST_ENVIRONMENT:
741                 latextype = static_cast<LYX_LATEX_TYPES>(le);
742                 break;
743         default:
744                 lyxerr << "Unhandled value " << le
745                        << " in LyXLayout::readLatexType." << endl;
746                 break;
747         }
748 }
749
750
751 enum SpacingTags {
752         ST_SPACING_SINGLE = 1,
753         ST_SPACING_ONEHALF,
754         ST_SPACING_DOUBLE,
755         ST_OTHER
756 };
757
758
759 void LyXLayout::readSpacing(LyXLex & lexrc)
760 {
761         keyword_item spacingTags[] = {
762                 {"double",  ST_SPACING_DOUBLE },
763                 {"onehalf", ST_SPACING_ONEHALF },
764                 {"other",   ST_OTHER },
765                 {"single",  ST_SPACING_SINGLE }
766         };
767
768         pushpophelper pph(lexrc, spacingTags, ST_OTHER);
769         int le = lexrc.lex();
770         switch (le) {
771         case LyXLex::LEX_UNDEF:
772                 lexrc.printError("Unknown spacing token `$$Token'");
773                 return;
774         default: break;
775         }
776         switch (static_cast<SpacingTags>(le)) {
777         case ST_SPACING_SINGLE:
778                 spacing.set(Spacing::Single);
779                 break;
780         case ST_SPACING_ONEHALF:
781                 spacing.set(Spacing::Onehalf);
782                 break;
783         case ST_SPACING_DOUBLE:
784                 spacing.set(Spacing::Double);
785                 break;
786         case ST_OTHER:
787                 lexrc.next();
788                 spacing.set(Spacing::Other, lexrc.getFloat());
789                 break;
790         }
791 }
792
793
794 string const & LyXLayout::name() const
795 {
796         return name_;
797 }
798
799
800 void LyXLayout::setName(string const & n)
801 {
802         name_ = n;
803 }
804
805
806 string const & LyXLayout::obsoleted_by() const
807 {
808         return obsoleted_by_;
809 }
810
811
812 string const & LyXLayout::depends_on() const
813 {
814         return depends_on_;
815 }