- }
- }
-}
-
-
-bool needEnumCounterReset(ParIterator const & it)
-{
- Paragraph const & par = *it;
- BOOST_ASSERT(par.layout()->labeltype == LABEL_ENUMERATE);
- depth_type const cur_depth = par.getDepth();
- ParIterator prev_it = it;
- while (prev_it.pit()) {
- --prev_it.top().pit();
- Paragraph const & prev_par = *prev_it;
- if (prev_par.getDepth() <= cur_depth)
- return prev_par.layout()->labeltype != LABEL_ENUMERATE;
- }
- // start of nested inset: reset
- return true;
-}
-
-
-void setCaptionLabels(Inset & inset, string const & type,
- docstring const label, Counters & counters)
-{
- Text * text = inset.getText(0);
- if (!text)
- return;
-
- ParagraphList & pars = text->paragraphs();
- if (pars.empty())
- return;
-
- docstring const counter = from_ascii(type);
-
- ParagraphList::iterator p = pars.begin();
- for (; p != pars.end(); ++p) {
- InsetList::iterator it2 = p->insetlist.begin();
- InsetList::iterator end2 = p->insetlist.end();
- // Any caption within this float should have the same
- // label prefix but different numbers.
- for (; it2 != end2; ++it2) {
- Inset & icap = *it2->inset;
- // Look deeper just in case.
- setCaptionLabels(icap, type, label, counters);
- if (icap.lyxCode() == Inset::CAPTION_CODE) {
- // We found a caption!
- counters.step(counter);
- int number = counters.value(counter);
- InsetCaption & ic = static_cast<InsetCaption &>(icap);
- ic.setType(type);
- ic.setCount(number);
- ic.setCustomLabel(label);
- }
- }
- }
-}
-
-
-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);