This patch moves the counters out into the layout files, but not yet
in the nice way. This does also not reduce much of the hardcoding on
enum names in the source. But is a step towards that goal to have the
styles themselves declare what counter it needs.

Please comment.

diffstat counters-B-1.diff
 lib/layouts/stdclass.inc    |    1
 lib/layouts/stdcounters.inc |   73 +++++++++++++++++++++++++++++++++++++++++
 src/buffer.C                |   13 +------
 src/buffer.h                |    9 -----
 src/counters.C              |   45 +++++--------------------
 src/counters.h              |    4 --
 src/lyxtextclass.C          |   78 +++++++++++++++++++++++++++++++++++++++++---
 src/lyxtextclass.h          |   19 +++++++---
 src/lyxtextclasslist.C      |    1
 src/text2.C                 |   32 +++++++++---------
 10 files changed, 191 insertions(+), 84 deletions(-)

Index: lib/layouts/stdclass.inc
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/layouts/stdclass.inc,v
retrieving revision 1.4
diff -u -p -r1.4 stdclass.inc
--- lib/layouts/stdclass.inc	4 Sep 2002 06:52:25 -0000	1.4
+++ lib/layouts/stdclass.inc	5 Sep 2002 22:49:15 -0000
@@ -43,4 +43,5 @@ Input stdstruct.inc
 Input lyxmacros.inc
 Input stdlayouts.inc
 Input stdfloats.inc
+Input stdcounters.inc
 Input obsolete.inc
Index: lib/layouts/stdcounters.inc
===================================================================
RCS file: lib/layouts/stdcounters.inc
diff -N lib/layouts/stdcounters.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/layouts/stdcounters.inc	5 Sep 2002 22:49:15 -0000
@@ -0,0 +1,73 @@
+# Author : Lars Gullik Bjønnes <[EMAIL PROTECTED]>
+
+# This include file contains all the counters that are defined as standard
+# in most LyX layouts.
+
+
+Counter
+  Name                 part
+End
+
+Counter
+  Name                 chapter
+End
+
+Counter
+  Name                 section
+  Within               chapter
+End
+
+Counter
+  Name                 subsection
+  Within               section
+End
+
+Counter
+  Name                 subsubsection
+  Within               subsection
+End
+
+Counter
+  Name                 paragraph
+  Within               subsubsection
+End
+
+Counter
+  Name                 subparagraph
+  Within               paragraph
+End
+
+Counter
+  Name                 enumi
+End
+
+Counter
+  Name                 enumii
+  Within               enumi
+End
+
+Counter
+  Name                 enumiii
+  Within               enumii
+End
+
+Counter
+  Name                 enumiv
+  Within               enumiii
+End
+
+Counter
+  Name                 bibitem
+End
+
+Counter
+  Name                 figure
+End
+
+Counter
+  Name                 table
+End
+
+Counter
+  Name                 algorithm
+End
Index: src/buffer.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.C,v
retrieving revision 1.383
diff -u -p -r1.383 buffer.C
--- src/buffer.C	3 Sep 2002 16:13:35 -0000	1.383
+++ src/buffer.C	5 Sep 2002 22:49:17 -0000
@@ -20,7 +20,6 @@
 
 #include "buffer.h"
 #include "bufferlist.h"
-#include "counters.h"
 #include "LyXAction.h"
 #include "lyxrc.h"
 #include "lyxlex.h"
@@ -154,7 +153,7 @@ const int LYX_FORMAT = 221;
 Buffer::Buffer(string const & file, bool ronly)
 	: niceFile(true), lyx_clean(true), bak_clean(true),
 	  unnamed(false), dep_clean(0), read_only(ronly),
-	  filename_(file), users(0), ctrs(new Counters)
+	  filename_(file), users(0)
 {
 	lyxerr[Debug::INFO] << "Buffer::Buffer()" << endl;
 	filepath_ = OnlyPath(file);
@@ -1171,7 +1170,7 @@ bool Buffer::readFile(LyXLex & lex, Para
 						     "Use LyX 0.10.x to read this!"));
 					return false;
 				} else {
-					string command = 
+					string command =
 						LibFileSearch("lyx2lyx", "lyx2lyx");
 					if (command.empty()) {
 						Alert::alert(_("ERROR!"),
@@ -3221,7 +3220,7 @@ vector<pair<string, string> > const Buff
 
 	if (!keys.empty())
 		return keys;
- 
+
 	// Might be either using bibtex or a child has bibliography
 	for (inset_iterator it = inset_const_iterator_begin();
 		it != inset_const_iterator_end(); ++it) {
@@ -3337,12 +3336,6 @@ bool Buffer::isMultiLingual()
 			return true;
 
 	return false;
-}
-
-
-Counters & Buffer::counters() const
-{
-	return *ctrs.get();
 }
 
 
Index: src/buffer.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.h,v
retrieving revision 1.112
diff -u -p -r1.112 buffer.h
--- src/buffer.h	21 Aug 2002 07:30:56 -0000	1.112
+++ src/buffer.h	5 Sep 2002 22:49:17 -0000
@@ -27,11 +27,9 @@
 #include "ParagraphList.h"
 #include "paragraph.h"
 
-#include <boost/scoped_ptr.hpp>
 #include <boost/shared_ptr.hpp>
 
 class BufferView;
-class Counters;
 class LyXRC;
 class TeXErrors;
 class LaTeXFeatures;
@@ -311,9 +309,6 @@ public:
 
 	/// Used when typesetting to place errorboxes.
 	TexRow texrow;
-	/// Buffer-wide counter array
-	Counters & counters() const;
-
 private:
 	/// is save needed
 	mutable bool lyx_clean;
@@ -346,10 +341,6 @@ private:
 	    of the buffers in the list of users to do a #updateLayoutChoice#.
 	*/
 	BufferView * users;
-
-	/// The pointer is const although its contents may not be
-	boost::scoped_ptr<Counters> const ctrs;
-
 public:
 	///
 	class inset_iterator {
Index: src/counters.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/counters.C,v
retrieving revision 1.14
diff -u -p -r1.14 counters.C
--- src/counters.C	5 Sep 2002 13:19:33 -0000	1.14
+++ src/counters.C	5 Sep 2002 22:49:17 -0000
@@ -17,6 +17,7 @@
 
 #include "counters.h"
 #include "debug.h"
+
 #include "support/lstrings.h"
 #include "support/LAssert.h"
 
@@ -59,45 +60,19 @@ void Counter::reset()
 	value_ = 0;
 }
 
+
 string Counter::master() const
 {
 	return master_;
 }
 
+
 void Counter::setMaster(string const & m)
 {
 	master_ = m;
 }
 
 
-Counters::Counters()
-{
-	// Ehh, should this take a textclass arg?
-
-	// Sectioning counters:
-	newCounter("part");
-	newCounter("chapter");
-	newCounter("section", "chapter");
-	newCounter("subsection", "section");
-	newCounter("subsubsection", "subsection");
-	newCounter("paragraph", "subsubsection");
-	newCounter("subparagraph", "paragraph");
-
-	// Enumeration counters:
-	newCounter("enumi");
-	newCounter("enumii", "enumi");
-	newCounter("enumiii", "enumii");
-	newCounter("enumiv", "enumiii");
-
-	// Biblio:
-	newCounter("bibitem");
-
-	// Float counters:
-	newCounter("figure");
-	newCounter("table");
-	newCounter("algorithm");
-}
-
 
 void Counters::newCounter(string const & newc)
 {
@@ -109,8 +84,6 @@ void Counters::newCounter(string const &
 		return;
 	}
 	counterList[newc];
-	cit = counterList.find(newc);
-	cit->second.setMaster("");
 }
 
 
@@ -131,9 +104,7 @@ void Counters::newCounter(string const &
 		return;
 	}
 
-	counterList[newc];
-	cit = counterList.find(newc);
-	cit->second.setMaster(masterc);
+	counterList[newc].setMaster(masterc);
 }
 
 
@@ -343,9 +314,11 @@ string Counters::numberLabel(string cons
 		}
 
 	} else if (numbertype == "enumeration") {
-		ostringstream ei, eii, eiii, eiv;
-		//string ei, eiii, eiv;
-		//char eii;
+		ostringstream ei;
+		ostringstream eii;
+		ostringstream eiii;
+		ostringstream eiv;
+
 		if (langtype == "hebrew") {
 			ei << '.' << value("enumi");
 			eii << '(' << hebrewCounter(value("enumii")) << ')';
Index: src/counters.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/counters.h,v
retrieving revision 1.11
diff -u -p -r1.11 counters.h
--- src/counters.h	5 Sep 2002 12:58:09 -0000	1.11
+++ src/counters.h	5 Sep 2002 22:49:17 -0000
@@ -55,10 +55,6 @@ private:
 /// Every instantiation is an array of counters of type Counter.
 class Counters {
 public:
-	///
-	Counters();
-	///
-	//~Counters();
 	/// Add a new counter to array.
 	void newCounter(string const & newc);
 	/// Add new counter having oldc as its master.
Index: src/lyxtextclass.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtextclass.C,v
retrieving revision 1.18
diff -u -p -r1.18 lyxtextclass.C
--- src/lyxtextclass.C	4 Sep 2002 06:52:26 -0000	1.18
+++ src/lyxtextclass.C	5 Sep 2002 22:49:17 -0000
@@ -18,6 +18,7 @@
 #include "lyxtextclass.h"
 #include "debug.h"
 #include "lyxlex.h"
+#include "counters.h"
 
 #include "support/lstrings.h"
 #include "support/LAssert.h"
@@ -48,7 +49,7 @@ struct compare_name {
 
 LyXTextClass::LyXTextClass(string const & fn, string const & cln,
 			   string const & desc)
-	: name_(fn), latexname_(cln), description_(desc)
+	: name_(fn), latexname_(cln), description_(desc), ctrs_(new Counters)
 {
 	outputType_ = LATEX;
 	columns_ = 1;
@@ -108,7 +109,8 @@ enum TextClassTags {
 	TC_PROVIDESURL,
 	TC_LEFTMARGIN,
 	TC_RIGHTMARGIN,
-	TC_FLOAT
+	TC_FLOAT,
+	TC_COUNTER
 };
 
 
@@ -118,6 +120,7 @@ bool LyXTextClass::Read(string const & f
 	keyword_item textClassTags[] = {
 		{ "classoptions",    TC_CLASSOPTIONS },
 		{ "columns",         TC_COLUMNS },
+		{ "counter",         TC_COUNTER },
 		{ "defaultfont",     TC_DEFAULTFONT },
 		{ "defaultstyle",    TC_DEFAULTSTYLE },
 		{ "float",           TC_FLOAT },
@@ -148,7 +151,7 @@ bool LyXTextClass::Read(string const & f
 				     << MakeDisplayPath(filename)
 				     << endl;
 
-	LyXLex lexrc(textClassTags, TC_FLOAT);
+	LyXLex lexrc(textClassTags, TC_COUNTER);
 	bool error = false;
 
 	lexrc.setFile(filename);
@@ -327,6 +330,9 @@ bool LyXTextClass::Read(string const & f
 		case TC_FLOAT:
 			readFloat(lexrc);
 			break;
+		case TC_COUNTER:
+			readCounter(lexrc);
+			break;
 		}
 	}
 
@@ -600,6 +606,64 @@ void LyXTextClass::readFloat(LyXLex & le
 }
 
 
+enum CounterTags {
+	CT_NAME = 1,
+	CT_WITHIN,
+	CT_END
+};
+
+void LyXTextClass::readCounter(LyXLex & lexrc)
+{
+	keyword_item counterTags[] = {
+		{ "end", CT_END },
+		{ "name", CT_NAME },
+		{ "within", CT_WITHIN }
+	};
+
+	lexrc.pushTable(counterTags, CT_END);
+
+	string name;
+	string within;
+
+	bool getout = false;
+	while (!getout && lexrc.isOK()) {
+		int le = lexrc.lex();
+		switch (le) {
+		case LyXLex::LEX_UNDEF:
+			lexrc.printError("Unknown ClassOption tag `$$Token'");
+			continue;
+		default: break;
+		}
+		switch (static_cast<CounterTags>(le)) {
+		case CT_NAME:
+			lexrc.next();
+			name = lexrc.getString();
+			break;
+		case CT_WITHIN:
+			lexrc.next();
+			within = lexrc.getString();
+			if (within == "none")
+				within.erase();
+			break;
+		case CT_END:
+			getout = true;
+			break;
+		}
+	}
+
+	// Here if have a full float if getout == true
+	if (getout) {
+		if (within.empty()) {
+			ctrs_->newCounter(name);
+		} else {
+			ctrs_->newCounter(name, within);
+		}
+	}
+
+	lexrc.popTable();
+}
+
+
 LyXFont const & LyXTextClass::defaultfont() const
 {
 	return defaultfont_;
@@ -714,7 +778,13 @@ FloatList const & LyXTextClass::floats()
 }
 
 
-string const LyXTextClass::defaultLayoutName() const
+Counters & LyXTextClass::counters() const
+{
+	return *ctrs_.get();
+}
+
+
+string const & LyXTextClass::defaultLayoutName() const
 {
 	// This really should come from the actual layout... (Lgb)
 	return defaultlayout_;
Index: src/lyxtextclass.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtextclass.h,v
retrieving revision 1.8
diff -u -p -r1.8 lyxtextclass.h
--- src/lyxtextclass.h	4 Sep 2002 06:52:26 -0000	1.8
+++ src/lyxtextclass.h	5 Sep 2002 22:49:17 -0000
@@ -23,9 +23,12 @@
 
 #include "support/types.h"
 
+#include <boost/shared_ptr.hpp>
+
 #include <vector>
 
 class LyXLex;
+class Counters;
 
 ///
 class LyXTextClass {
@@ -36,9 +39,9 @@ public:
 	typedef LayoutList::const_iterator const_iterator;
 	///
 	explicit
-	LyXTextClass (string const & = string(),
-		      string const & = string(),
-		      string const & = string());
+	LyXTextClass(string const & = string(),
+		     string const & = string(),
+		     string const & = string());
 
 	///
 	const_iterator begin() const { return layoutlist_.begin(); }
@@ -56,6 +59,8 @@ public:
 	///
 	void readFloat(LyXLex &);
 	///
+	void readCounter(LyXLex &);
+	///
 	bool hasLayout(string const & name) const;
 
 	///
@@ -68,9 +73,10 @@ public:
 	FloatList & floats();
 	/// the list of floats defined in the class
 	FloatList const & floats() const;
-
+	/// The Counters present in this textclass.
+	Counters & counters() const;
 	///
-	string const defaultLayoutName() const;
+	string const & defaultLayoutName() const;
 	///
 	LyXLayout_ptr const & defaultLayout() const;
 	///
@@ -191,6 +197,9 @@ private:
 
 	///
 	FloatList floatlist_;
+
+	///
+	boost::shared_ptr<Counters> ctrs_;
 
 	/// Has this layout file been loaded yet?
 	mutable bool loaded;
Index: src/lyxtextclasslist.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtextclasslist.C,v
retrieving revision 1.7
diff -u -p -r1.7 lyxtextclasslist.C
--- src/lyxtextclasslist.C	21 Jul 2002 21:20:56 -0000	1.7
+++ src/lyxtextclasslist.C	5 Sep 2002 22:49:17 -0000
@@ -20,7 +20,6 @@
 #include "debug.h"
 #include "lyxlex.h"
 #include "gettext.h"
-
 #include "frontends/Alert.h"
 
 #include "support/lyxfunctional.h"
Index: src/text2.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text2.C,v
retrieving revision 1.259
diff -u -p -r1.259 text2.C
--- src/text2.C	5 Sep 2002 12:58:09 -0000	1.259
+++ src/text2.C	5 Sep 2002 22:49:19 -0000
@@ -1218,7 +1218,7 @@ void LyXText::setCounter(Buffer const * 
 		par->params().appendix(par->previous()->params().appendix());
 		if (!par->params().appendix() && par->params().startOfAppendix()) {
 			par->params().appendix(true);
-			buf->counters().reset();
+			textclass.counters().reset();
 		}
 		par->enumdepth = par->previous()->enumdepth;
 		par->itemdepth = par->previous()->itemdepth;
@@ -1272,7 +1272,7 @@ void LyXText::setCounter(Buffer const * 
 
 		if (i >= 0 && i <= buf->params.secnumdepth) {
 
-			buf->counters().step(layout->latexname());
+			textclass.counters().step(layout->latexname());
 
 			// Is there a label? Useful for Chapter layout
 			if (!par->params().appendix()) {
@@ -1299,7 +1299,7 @@ void LyXText::setCounter(Buffer const * 
 					langtype = "latin";
 			}
 
-			s << buf->counters()
+			s << textclass.counters()
 				.numberLabel(layout->latexname(),
 					     numbertype, langtype, head);
 
@@ -1308,9 +1308,9 @@ void LyXText::setCounter(Buffer const * 
 			// possible...
 
 			// reset enum counters
-			buf->counters().reset("enum");
+			textclass.counters().reset("enum");
 		} else if (layout->labeltype < LABEL_COUNTER_ENUMI) {
-			buf->counters().reset("enum");
+			textclass.counters().reset("enum");
 		} else if (layout->labeltype == LABEL_COUNTER_ENUMI) {
 			// FIXME
 			// Yes I know this is a really, really! bad solution
@@ -1333,16 +1333,16 @@ void LyXText::setCounter(Buffer const * 
 				break;
 			}
 
-			buf->counters().step(enumcounter);
+			textclass.counters().step(enumcounter);
 
-			s << buf->counters()
+			s << textclass.counters()
 				.numberLabel(enumcounter,
 					     "enumeration", langtype);
 			par->params().labelString(s.str().c_str());
 		}
 	} else if (layout->labeltype == LABEL_BIBLIO) {// ale970302
-		buf->counters().step("bibitem");
-		int number = buf->counters().value("bibitem");
+		textclass.counters().step("bibitem");
+		int number = textclass.counters().value("bibitem");
 		if (!par->bibkey) {
 			InsetCommandParams p("bibitem");
 			par->bibkey = new InsetBibKey(p);
@@ -1374,7 +1374,7 @@ void LyXText::setCounter(Buffer const * 
 				Floating const & fl
 					= textclass.floats().getType(static_cast<InsetFloat*>(in)->type());
 
-				buf->counters().step(fl.type());
+				textclass.counters().step(fl.type());
 
 				// Doesn't work... yet.
 				ostringstream o;
@@ -1394,13 +1394,13 @@ void LyXText::setCounter(Buffer const * 
 		// when there is any other layout between
 		switch (par->enumdepth) {
 		case 0:
-			buf->counters().reset("enumi");
+			textclass.counters().reset("enumi");
 		case 1:
-			buf->counters().reset("enumii");
+			textclass.counters().reset("enumii");
 		case 2:
-			buf->counters().reset("enumiii");
+			textclass.counters().reset("enumiii");
 		case 3:
-			buf->counters().reset("enumiv");
+			textclass.counters().reset("enumiv");
 		}
 	}
 }
@@ -1415,7 +1415,9 @@ void LyXText::updateCounters(BufferView 
 	Row * row = firstrow;
 	par = row->par();
 
-	bview->buffer()->counters().reset();
+	// CHECK if this is really needed. (Lgb)
+	bview->buffer()->params.getLyXTextClass().counters().reset();
+
 	while (par) {
 		while (row->par() != par)
 			row = row->next();

-- 
        Lgb

Reply via email to