X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbuffer_funcs.cpp;h=66ba0dc797a6ea75700de8a74735fa8cd9bc9fab;hb=58ab972f714309aa87e7d956ceda00e18337875f;hp=502b8f35e512cb57d7e28b7c7d8851f2739a42d3;hpb=601a8e0192b60274ab316c0bfa31811d236c972e;p=lyx.git diff --git a/src/buffer_funcs.cpp b/src/buffer_funcs.cpp index 502b8f35e5..66ba0dc797 100644 --- a/src/buffer_funcs.cpp +++ b/src/buffer_funcs.cpp @@ -23,9 +23,14 @@ #include "Floating.h" #include "FloatList.h" #include "gettext.h" +#include "InsetIterator.h" #include "Language.h" #include "LaTeX.h" +#include "Layout.h" +#include "LyX.h" +#include "lyxlayout_ptr_fwd.h" #include "TextClass.h" +#include "TextClassList.h" #include "Paragraph.h" #include "paragraph_funcs.h" #include "ParagraphList.h" @@ -33,17 +38,15 @@ #include "ParIterator.h" #include "LyXVC.h" #include "TexRow.h" +#include "Text.h" #include "TocBackend.h" #include "VCBackend.h" #include "frontends/alert.h" #include "insets/InsetBibitem.h" -#include "insets/InsetCaption.h" #include "insets/InsetInclude.h" -#include "insets/InsetTabular.h" -#include "support/convert.h" #include "support/filetools.h" #include "support/fs_extras.h" #include "support/lyxlib.h" @@ -345,7 +348,7 @@ depth_type getDepth(DocIterator const & it) depth_type getItemDepth(ParIterator const & it) { Paragraph const & par = *it; - LYX_LABEL_TYPES const labeltype = par.layout()->labeltype; + LabelType const labeltype = par.layout()->labeltype; if (labeltype != LABEL_ENUMERATE && labeltype != LABEL_ITEMIZE) return 0; @@ -409,7 +412,7 @@ void setLabel(Buffer const & buf, ParIterator & it) { TextClass const & textclass = buf.params().getTextClass(); Paragraph & par = it.paragraph(); - Layout_ptr const & layout = par.layout(); + LayoutPtr const & layout = par.layout(); Counters & counters = textclass.counters(); if (par.params().startOfAppendix()) { @@ -430,8 +433,8 @@ void setLabel(Buffer const & buf, ParIterator & it) par.params().labelWidthString(docstring()); } - // is it a layout that has an automatic label? - if (layout->labeltype == LABEL_COUNTER) { + switch(layout->labeltype) { + case LABEL_COUNTER: if (layout->toclevel <= buf.params().secnumdepth && (layout->latextype != LATEX_ENVIRONMENT || isFirstInSequence(it.pit(), it.plist()))) { @@ -440,8 +443,9 @@ void setLabel(Buffer const & buf, ParIterator & it) par.expandLabel(layout, buf.params())); } else par.params().labelString(docstring()); + break; - } else if (layout->labeltype == LABEL_ITEMIZE) { + case LABEL_ITEMIZE: { // At some point of time we should do something more // clever here, like: // par.params().labelString( @@ -463,10 +467,11 @@ void setLabel(Buffer const & buf, ParIterator & it) break; } par.params().labelString(itemlabel); + break; + } - } else if (layout->labeltype == LABEL_ENUMERATE) { - // FIXME - // Yes I know this is a really, really! bad solution + case LABEL_ENUMERATE: { + // FIXME: Yes I know this is a really, really! bad solution // (Lgb) docstring enumcounter = from_ascii("enum"); @@ -515,16 +520,10 @@ void setLabel(Buffer const & buf, ParIterator & it) par.params().labelString(counters.counterLabel( par.translateIfPossible(from_ascii(format), buf.params()))); - } else if (layout->labeltype == LABEL_BIBLIO) {// ale970302 - counters.step(from_ascii("bibitem")); - int number = counters.value(from_ascii("bibitem")); - if (par.bibitem()) - par.bibitem()->setCounter(number); + break; + } - par.params().labelString( - par.translateIfPossible(layout->labelstring(), buf.params())); - // In biblio shouldn't be following counters but... - } else if (layout->labeltype == LABEL_SENSITIVE) { + case LABEL_SENSITIVE: { string const & type = counters.current_float(); docstring full_label; if (type.empty()) @@ -535,17 +534,28 @@ void setLabel(Buffer const & buf, ParIterator & it) counters.step(from_utf8(type)); full_label = bformat(from_ascii("%1$s %2$s:"), name, - convert(counters.value(from_utf8(type)))); + counters.theCounter(from_utf8(type))); } else full_label = bformat(from_ascii("%1$s #:"), name); } par.params().labelString(full_label); + break; + } - } else if (layout->labeltype == LABEL_NO_LABEL) + case LABEL_NO_LABEL: par.params().labelString(docstring()); - else + break; + + case LABEL_MANUAL: + case LABEL_TOP_ENVIRONMENT: + case LABEL_CENTERED_TOP_ENVIRONMENT: + case LABEL_STATIC: + case LABEL_BIBLIO: par.params().labelString( - par.translateIfPossible(layout->labelstring(), buf.params())); + par.translateIfPossible(layout->labelstring(), + buf.params())); + break; + } } } // anon namespace @@ -576,6 +586,8 @@ void updateLabels(Buffer const & buf, ParIterator & parit) } +// FIXME: buf should should be const because updateLabels() modifies +// the contents of the paragraphs. void updateLabels(Buffer const & buf, bool childonly) { Buffer const * const master = buf.getMasterBuffer(); @@ -593,15 +605,29 @@ void updateLabels(Buffer const & buf, bool childonly) textclass.counters().reset(); } + Buffer & cbuf = const_cast(buf); + + if (buf.text().empty()) { + // FIXME: we don't call continue with updateLabels() + // here because it crashes on newly created documents. + // But the TocBackend needs to be initialised + // nonetheless so we update the tocBackend manually. + cbuf.tocBackend().update(); + return; + } + // do the real work ParIterator parit = par_iterator_begin(buf.inset()); - parit.forwardPos(); updateLabels(buf, parit); - Buffer & cbuf = const_cast(buf); cbuf.tocBackend().update(); if (!childonly) cbuf.structureChanged(); + // FIXME + // the embedding signal is emitted with structureChanged signal + // this is inaccurate so these two will be separated later. + //cbuf.embeddedFiles().update(); + //cbuf.embeddingChanged(); } @@ -614,4 +640,33 @@ void checkBufferStructure(Buffer & buffer, ParIterator const & par_it) } } +textclass_type defaultTextclass() +{ + // We want to return the article class. if `first' is + // true in the returned pair, then `second' is the textclass + // number; if it is false, second is 0. In both cases, second + // is what we want. + return textclasslist.numberOfClass("article").second; +} + + +void loadChildDocuments(Buffer const & buf) +{ + bool parse_error = false; + + for (InsetIterator it = inset_iterator_begin(buf.inset()); it; ++it) { + if (it->lyxCode() != Inset::INCLUDE_CODE) + continue; + InsetInclude const & inset = static_cast(*it); + InsetCommandParams const & ip = inset.params(); + Buffer * child = loadIfNeeded(buf, ip); + if (!child) + continue; + parse_error |= !child->errorList("Parse").empty(); + loadChildDocuments(*child); + } + + if (use_gui && buf.getMasterBuffer() == &buf) + updateLabels(buf); +} } // namespace lyx