- TextClass const & textclass = buf.params().getTextClass();
- Paragraph & par = it.paragraph();
- 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());
- }
-
- // 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
- docstring itemlabel;
- 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) {
- string const & type = counters.current_float();
- docstring full_label;
- if (type.empty())
- full_label = buf.B_("Senseless!!! ");
- else {
- docstring name = buf.B_(textclass.floats().getType(type).name());
- if (counters.hasCounter(from_utf8(type))) {
- counters.step(from_utf8(type));
- full_label = bformat(from_ascii("%1$s %2$s:"),
- name,
- convert<docstring>(counters.value(from_utf8(type))));
- } else
- full_label = bformat(from_ascii("%1$s #:"), name);
- }
- par.params().labelString(full_label);
-
- } 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, ParIterator & parit)
-{
- BOOST_ASSERT(parit.pit() == 0);
-
- depth_type maxdepth = 0;
- pit_type const lastpit = parit.lastpit();
- for ( ; parit.pit() <= lastpit ; ++parit.pit()) {
- // reduce depth if necessary
- parit->params().depth(min(parit->params().depth(), maxdepth));
- maxdepth = parit->getMaxDepthAfter();
-
- // set the counter for this paragraph
- setLabel(buf, parit);
-
- // Now the insets
- InsetList::const_iterator iit = parit->insetlist.begin();
- InsetList::const_iterator end = parit->insetlist.end();
- for (; iit != end; ++iit) {
- parit.pos() = iit->pos;
- iit->inset->updateLabels(buf, parit);
- }
- }
-
-}