Angus Leeming <[EMAIL PROTECTED]> writes: | Lars Gullik Bjønnes wrote: >> Hrmmpff! black-mail tactics! > | Hey, you started it. (Whine!) | I counter your counter with one of my own.
But I am the only one able to counter your counter with a counter counter patch. >> I guess ok. | Aughhhhh. Thanks Lars. and now you must have a look again.
? counter-2.diff ? counter.diff ? deptherror.diff ? deptherror.lyx ? kystskipper-a-1.lyx ? morectrs.lyx ? src/insets/insetenv.o.lock Index: po/POTFILES.in =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/po/POTFILES.in,v retrieving revision 1.358 diff -u -p -r1.358 POTFILES.in --- po/POTFILES.in 7 Oct 2003 21:44:58 -0000 1.358 +++ po/POTFILES.in 8 Oct 2003 12:55:44 -0000 @@ -188,6 +188,7 @@ src/mathed/ref_inset.C src/paragraph.C src/paragraph_funcs.C src/rowpainter.C +src/support/path_defines.C src/text.C src/text2.C src/text3.C Index: src/paragraph.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.C,v retrieving revision 1.328 diff -u -p -r1.328 paragraph.C --- src/paragraph.C 6 Oct 2003 15:42:29 -0000 1.328 +++ src/paragraph.C 8 Oct 2003 12:55:44 -0000 @@ -54,7 +54,6 @@ using std::ostringstream; Paragraph::Paragraph() : y(0), pimpl_(new Paragraph::Pimpl(this)) { - enumdepth = 0; itemdepth = 0; params().clear(); } @@ -63,7 +62,6 @@ Paragraph::Paragraph() Paragraph::Paragraph(Paragraph const & lp) : y(0), text_(lp.text_), pimpl_(new Paragraph::Pimpl(*lp.pimpl_, this)) { - enumdepth = 0; itemdepth = 0; // this is because of the dummy layout of the paragraphs that // follow footnotes @@ -93,7 +91,6 @@ void Paragraph::operator=(Paragraph cons delete pimpl_; pimpl_ = new Pimpl(*lp.pimpl_, this); - enumdepth = lp.enumdepth; itemdepth = lp.itemdepth; // this is because of the dummy layout of the paragraphs that // follow footnotes Index: src/paragraph.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.h,v retrieving revision 1.108 diff -u -p -r1.108 paragraph.h --- src/paragraph.h 7 Oct 2003 06:45:24 -0000 1.108 +++ src/paragraph.h 8 Oct 2003 12:55:45 -0000 @@ -136,10 +136,7 @@ public: void layout(LyXLayout_ptr const & new_layout); /// - char enumdepth; - - /// - char itemdepth; + signed char itemdepth; /// InsetBibitem * bibitem() const; // ale970302 Index: src/text2.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text2.C,v retrieving revision 1.470 diff -u -p -r1.470 text2.C --- src/text2.C 6 Oct 2003 15:42:40 -0000 1.470 +++ src/text2.C 8 Oct 2003 12:55:45 -0000 @@ -858,9 +858,77 @@ string expandLabel(LyXTextClass const & return textclass.counters().counterLabel(fmt); } +void incrementItemDepth(ParagraphList::iterator pit, + ParagraphList::iterator first_pit, + int labelType) +{ + int const cur_depth = pit->getDepth(); + ParagraphList::iterator prev_pit = boost::prior(pit); + while (true) { + int const prev_depth = prev_pit->getDepth(); + int const prev_labeltype = prev_pit->layout()->labeltype; + if (prev_depth == 0 && cur_depth > 0) { + if (prev_labeltype == labelType) { + pit->itemdepth = prev_pit->itemdepth + 1; + } + break; + } else if (prev_depth < cur_depth) { + if (prev_labeltype == labelType) { + pit->itemdepth = prev_pit->itemdepth + 1; + break; + } + } else if (prev_depth == cur_depth) { + if (prev_labeltype == labelType) { + pit->itemdepth = prev_pit->itemdepth; + break; + } + } + if (prev_pit == first_pit) + break; + + --prev_pit; + } } +void resetEnumCounterIfNeeded(ParagraphList::iterator pit, + ParagraphList::iterator firstpit, + Counters & counters) +{ + if (pit == firstpit) + return; + + int const cur_depth = pit->getDepth(); + ParagraphList::iterator prev_pit = boost::prior(pit); + while (true) { + int const prev_depth = prev_pit->getDepth(); + int const prev_labeltype = prev_pit->layout()->labeltype; + if (prev_depth <= cur_depth) { + if (prev_labeltype != LABEL_ENUMERATE) { + switch (pit->itemdepth) { + case 0: + counters.reset("enumi"); + case 1: + counters.reset("enumii"); + case 2: + counters.reset("enumiii"); + case 3: + counters.reset("enumiv"); + } + } + break; + } + + if (prev_pit == firstpit) + break; + + --prev_pit; + } +} + +} // anon namespace + + // set the counter of a paragraph. This includes the labels void LyXText::setCounter(Buffer const & buf, ParagraphList::iterator pit) { @@ -868,49 +936,25 @@ void LyXText::setCounter(Buffer const & LyXTextClass const & textclass = bufparams.getLyXTextClass(); LyXLayout_ptr const & layout = pit->layout(); - if (pit != ownerParagraphs().begin()) { + // Always reset + pit->itemdepth = 0; + + if (pit == ownerParagraphs().begin()) { + pit->params().appendix(pit->params().startOfAppendix()); + } else { pit->params().appendix(boost::prior(pit)->params().appendix()); if (!pit->params().appendix() && pit->params().startOfAppendix()) { pit->params().appendix(true); textclass.counters().reset(); } - pit->enumdepth = boost::prior(pit)->enumdepth; - pit->itemdepth = boost::prior(pit)->itemdepth; - } else { - pit->params().appendix(pit->params().startOfAppendix()); - pit->enumdepth = 0; - pit->itemdepth = 0; - } - - // Maybe we have to increment the enumeration depth. - // Bibliographies can't have their depth changed ie. they - // are always of depth 0 - if (pit != ownerParagraphs().begin() - && boost::prior(pit)->getDepth() < pit->getDepth() - && boost::prior(pit)->layout()->labeltype == LABEL_ENUMERATE - && pit->enumdepth < 3 - && layout->labeltype != LABEL_BIBLIO) { - pit->enumdepth++; - } - // Maybe we have to increment the enumeration depth. - // Bibliographies can't have their depth changed ie. they - // are always of depth 0 - if (pit != ownerParagraphs().begin() - && boost::prior(pit)->getDepth() < pit->getDepth() - && boost::prior(pit)->layout()->labeltype == LABEL_ITEMIZE - && pit->itemdepth < 3 - && layout->labeltype != LABEL_BIBLIO) { - pit->itemdepth++; - } - - // Maybe we have to decrement the enumeration depth, see note above - if (pit != ownerParagraphs().begin() - && boost::prior(pit)->getDepth() > pit->getDepth() - && layout->labeltype != LABEL_BIBLIO) { - pit->enumdepth = depthHook(pit, ownerParagraphs(), - pit->getDepth())->enumdepth; + // Maybe we have to increment the enumeration depth. + incrementItemDepth(pit, ownerParagraphs().begin(), + LABEL_ENUMERATE); + // Maybe we have to increment the itemization depth. + incrementItemDepth(pit, ownerParagraphs().begin(), + LABEL_ITEMIZE); } // erase what was there before @@ -930,22 +974,40 @@ void LyXText::setCounter(Buffer const & textclass.counters().step(layout->counter); string label = expandLabel(textclass, layout, pit->params().appendix()); pit->params().labelString(label); - textclass.counters().reset("enum"); } else if (layout->labeltype == LABEL_ITEMIZE) { // At some point of time we should do something more clever here, // like: // pit->params().labelString( // bufparams.user_defined_bullet(pit->itemdepth).getText()); // for now, use a static label - pit->params().labelString("*"); - textclass.counters().reset("enum"); + string itemlabel; + switch (pit->itemdepth) { + case 0: + itemlabel = "*"; + break; + case 1: + itemlabel = "-"; + break; + case 2: + itemlabel = "@"; + break; + case 3: + itemlabel = "·"; + break; + } + + pit->params().labelString(itemlabel); } else if (layout->labeltype == LABEL_ENUMERATE) { + // Maybe we have to reset the enumeration counter. + resetEnumCounterIfNeeded(pit, ownerParagraphs().begin(), + textclass.counters()); + // FIXME // Yes I know this is a really, really! bad solution // (Lgb) string enumcounter = "enum"; - switch (pit->enumdepth) { + switch (pit->itemdepth) { case 2: enumcounter += 'i'; case 1: @@ -1022,20 +1084,6 @@ void LyXText::setCounter(Buffer const & } pit->params().labelString(s); - // reset the enumeration counter. They are always reset - // when there is any other layout between - // Just fall-through between the cases so that all - // enum counters deeper than enumdepth is also reset. - switch (pit->enumdepth) { - case 0: - textclass.counters().reset("enumi"); - case 1: - textclass.counters().reset("enumii"); - case 2: - textclass.counters().reset("enumiii"); - case 3: - textclass.counters().reset("enumiv"); - } } }
-- Lgb