[EMAIL PROTECTED] (Lars Gullik Bj�nnes) writes:

| and now you must have a look again.

Ok, this is final version. Please have a look and comment.

Unless I get objections this will go in.

? counter-2.diff
? counter-3.diff
? counter.diff
? deptherror.diff
? deptherror.lyx
? kystskipper-a-1.lyx
? morectrs.lyx
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 17:26:26 -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 17:26:27 -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 17:26:27 -0000
@@ -135,11 +135,8 @@ public:
 	///
 	void layout(LyXLayout_ptr const & new_layout);
 
-	///
-	char enumdepth;
-
-	///
-	char itemdepth;
+	/// This is the item depth, only used by enumerate and itemize
+	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.471
diff -u -p -r1.471 text2.C
--- src/text2.C	8 Oct 2003 14:29:12 -0000	1.471
+++ src/text2.C	8 Oct 2003 17:26:28 -0000
@@ -858,59 +858,107 @@ string expandLabel(LyXTextClass const & 
 	return textclass.counters().counterLabel(fmt);
 }
 
+void incrementItemDepth(ParagraphList::iterator pit,
+			ParagraphList::iterator first_pit)
+{
+	int const cur_labeltype = pit->layout()->labeltype;
+
+	if (cur_labeltype != LABEL_ENUMERATE &&
+	    cur_labeltype != LABEL_ITEMIZE)
+		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 == 0 && cur_depth > 0) {
+			if (prev_labeltype == cur_labeltype) {
+				pit->itemdepth = prev_pit->itemdepth + 1;
+			}
+			break;
+		} else if (prev_depth < cur_depth) {
+			if (prev_labeltype == cur_labeltype) {
+				pit->itemdepth = prev_pit->itemdepth + 1;
+				break;
+			}
+		} else if (prev_depth == cur_depth) {
+			if (prev_labeltype == cur_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)
 {
 	BufferParams const & bufparams = buf.params();
 	LyXTextClass const & textclass = bufparams.getLyXTextClass();
 	LyXLayout_ptr const & layout = pit->layout();
+	ParagraphList::iterator first_pit = ownerParagraphs().begin();
+	Counters & counters = textclass.counters();
+
+	// Always reset
+	pit->itemdepth = 0;
 
-	if (pit != ownerParagraphs().begin()) {
+	if (pit == first_pit) {
+		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 item depth.
+		incrementItemDepth(pit, first_pit);
 	}
 
 	// erase what was there before
@@ -927,25 +975,42 @@ void LyXText::setCounter(Buffer const & 
 	if (layout->labeltype == LABEL_COUNTER) {
 		BufferParams const & bufparams = buf.params();
 		LyXTextClass const & textclass = bufparams.getLyXTextClass();
-		textclass.counters().step(layout->counter);
+		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:
+		// 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");
+		//    bufparams.user_defined_bullet(pit->itemdepth).getText());
+		// for now, use a simple hardcoded label
+		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, first_pit, 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:
@@ -961,12 +1026,12 @@ void LyXText::setCounter(Buffer const & 
 			break;
 		}
 
-		textclass.counters().step(enumcounter);
+		counters.step(enumcounter);
 
-		pit->params().labelString(textclass.counters().enumLabel(enumcounter));
+		pit->params().labelString(counters.enumLabel(enumcounter));
 	} else if (layout->labeltype == LABEL_BIBLIO) {// ale970302
-		textclass.counters().step("bibitem");
-		int number = textclass.counters().value("bibitem");
+		counters.step("bibitem");
+		int number = counters.value("bibitem");
 		if (pit->bibitem()) {
 			pit->bibitem()->setCounter(number);
 			pit->params().labelString(layout->labelstring());
@@ -991,7 +1056,7 @@ void LyXText::setCounter(Buffer const & 
 					break;
 				} else {
 					Paragraph const * owner = &ownerPar(buf, in);
-					tmppit = ownerParagraphs().begin();
+					tmppit = first_pit;
 					for ( ; tmppit != end; ++tmppit)
 						if (&*tmppit == owner)
 							break;
@@ -1010,7 +1075,7 @@ void LyXText::setCounter(Buffer const & 
 
 				Floating const & fl = textclass.floats().getType(type);
 
-				textclass.counters().step(fl.type());
+				counters.step(fl.type());
 
 				// Doesn't work... yet.
 				s = bformat(_("%1$s #:"), buf.B_(fl.name()));
@@ -1022,20 +1087,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