-void setCaptions(Paragraph & par, TextClass const & textclass)
-{
- if (par.insetlist.empty())
- return;
-
- Counters & counters = textclass.counters();
-
- InsetList::iterator it = par.insetlist.begin();
- InsetList::iterator end = par.insetlist.end();
- for (; it != end; ++it) {
- Inset & inset = *it->inset;
- if (inset.lyxCode() == Inset::FLOAT_CODE
- || inset.lyxCode() == Inset::WRAP_CODE) {
- docstring const name = inset.name();
- if (name.empty())
- continue;
-
- Floating const & fl = textclass.floats().getType(to_ascii(name));
- // FIXME UNICODE
- string const & type = fl.type();
- docstring const label = from_utf8(fl.name());
- setCaptionLabels(inset, type, label, counters);
- }
- else if (inset.lyxCode() == Inset::TABULAR_CODE
- && static_cast<InsetTabular &>(inset).tabular.isLongTabular()) {
- // FIXME: are "table" and "Table" the correct type and label?
- setCaptionLabels(inset, "table", from_ascii("Table"), counters);
- }
- else if (inset.lyxCode() == Inset::LISTINGS_CODE)
- setCaptionLabels(inset, "listing", from_ascii("Listing"), counters);
- else if (inset.lyxCode() == Inset::INCLUDE_CODE)
- // if this include inset contains lstinputlisting, and has a caption
- // it will increase the 'listing' counter by one
- static_cast<InsetInclude &>(inset).updateCounter(counters);
- }
-}
-
-// set the label of a paragraph. This includes the counters.
-void setLabel(Buffer const & buf, ParIterator & it, TextClass const & textclass)
-{
- Paragraph & par = *it;
- Layout_ptr const & layout = par.layout();
- Counters & counters = textclass.counters();
-
- if (par.params().startOfAppendix()) {
- // FIXME: only the counter corresponding to toplevel
- // sectionning should be reset
- counters.reset();
- counters.appendix(true);
- }
- par.params().appendix(counters.appendix());
-
- // Compute the item depth of the paragraph
- par.itemdepth = getItemDepth(it);
-
- if (layout->margintype == MARGIN_MANUAL) {
- if (par.params().labelWidthString().empty())
- par.params().labelWidthString(par.translateIfPossible(layout->labelstring(), buf.params()));
- } else {
- par.params().labelWidthString(docstring());
- }
-
- // Optimisation: setLabel() can be called for each for each
- // paragraph of the document. So we make the string static to
- // avoid the repeated instanciation.
- static docstring itemlabel;
-
- // is it a layout that has an automatic label?
- if (layout->labeltype == LABEL_COUNTER) {
- if (layout->toclevel <= buf.params().secnumdepth
- && (layout->latextype != LATEX_ENVIRONMENT
- || isFirstInSequence(it.pit(), it.plist()))) {
- counters.step(layout->counter);
- par.params().labelString(
- par.expandLabel(layout, buf.params()));
- } else
- par.params().labelString(docstring());
-
- } else if (layout->labeltype == LABEL_ITEMIZE) {
- // At some point of time we should do something more
- // clever here, like:
- // par.params().labelString(
- // buf.params().user_defined_bullet(par.itemdepth).getText());
- // for now, use a simple hardcoded label
- switch (par.itemdepth) {
- case 0:
- itemlabel = char_type(0x2022);
- break;
- case 1:
- itemlabel = char_type(0x2013);
- break;
- case 2:
- itemlabel = char_type(0x2217);
- break;
- case 3:
- itemlabel = char_type(0x2219); // or 0x00b7
- break;
- }
- par.params().labelString(itemlabel);
-
- } else if (layout->labeltype == LABEL_ENUMERATE) {
- // FIXME
- // Yes I know this is a really, really! bad solution
- // (Lgb)
- docstring enumcounter = from_ascii("enum");
-
- switch (par.itemdepth) {
- case 2:
- enumcounter += 'i';
- case 1:
- enumcounter += 'i';
- case 0:
- enumcounter += 'i';
- break;
- case 3:
- enumcounter += "iv";
- break;
- default:
- // not a valid enumdepth...
- break;
- }
-
- // Maybe we have to reset the enumeration counter.
- if (needEnumCounterReset(it))
- counters.reset(enumcounter);
-
- counters.step(enumcounter);
-
- string format;
-
- switch (par.itemdepth) {
- case 0:
- format = N_("\\arabic{enumi}.");
- break;
- case 1:
- format = N_("(\\alph{enumii})");
- break;
- case 2:
- format = N_("\\roman{enumiii}.");
- break;
- case 3:
- format = N_("\\Alph{enumiv}.");
- break;
- default:
- // not a valid enumdepth...
- break;
- }
-
- 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);
-
- par.params().labelString(
- par.translateIfPossible(layout->labelstring(), buf.params()));
- // In biblio shouldn't be following counters but...
- } else if (layout->labeltype == LABEL_SENSITIVE) {
- // Search for the first float or wrap inset in the iterator
- size_t i = it.depth();
- Inset * in = 0;
- while (i > 0) {
- --i;
- Inset::Code const code = it[i].inset().lyxCode();
- if (code == Inset::FLOAT_CODE ||
- code == Inset::WRAP_CODE) {
- in = &it[i].inset();
- break;
- }
- }
- // FIXME Can Inset::name() return an empty name for wide or
- // float insets? If not we can put the definition of type
- // inside the if (in) clause and use that instead of
- // if (!type.empty()).
- docstring type;
- if (in)
- type = in->name();
-
- if (!type.empty()) {
- Floating const & fl = textclass.floats().getType(to_ascii(type));
- // FIXME UNICODE
- counters.step(from_ascii(fl.type()));
-
- // Doesn't work... yet.
- par.params().labelString(par.translateIfPossible(
- bformat(from_ascii("%1$s #:"), from_utf8(fl.name())),
- buf.params()));
- } else {
- // par->SetLayout(0);
- par.params().labelString(par.translateIfPossible(
- layout->labelstring(), buf.params()));
- }
-
- } else if (layout->labeltype == LABEL_NO_LABEL)
- par.params().labelString(docstring());
- else
- par.params().labelString(
- par.translateIfPossible(layout->labelstring(), buf.params()));
-}
-
-} // anon namespace
-
-
-void updateLabels(Buffer const & buf, bool childonly)
-{
- Buffer const * const master = buf.getMasterBuffer();
- // Use the master text class also for child documents
- TextClass const & textclass = master->params().getTextClass();
-
- if (!childonly) {
- // If this is a child document start with the master
- if (master != &buf) {
- updateLabels(*master);
- return;
- }
-
- // start over the counters
- textclass.counters().reset();
- }
-
- ParIterator const end = par_iterator_end(buf.inset());
-
- for (ParIterator it = par_iterator_begin(buf.inset()); it != end; ++it) {
- // reduce depth if necessary
- if (it.pit()) {
- Paragraph const & prevpar = it.plist()[it.pit() - 1];
- it->params().depth(min(it->params().depth(),
- prevpar.getMaxDepthAfter()));
- } else
- it->params().depth(0);
-
- // set the counter for this paragraph
- setLabel(buf, it, textclass);
-
- // It is better to set the captions after setLabel because
- // the caption number might need the section number in the
- // future.
- setCaptions(*it, textclass);
-
- // Now included docs
- InsetList::const_iterator iit = it->insetlist.begin();
- InsetList::const_iterator end = it->insetlist.end();
- for (; iit != end; ++iit) {
- if (iit->inset->lyxCode() == Inset::INCLUDE_CODE)
- static_cast<InsetInclude const *>(iit->inset)
- ->updateLabels(buf);