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

Reply via email to