Andre Poenitz wrote:

> On Tue, Jun 14, 2005 at 12:11:53PM +0200, Georg Baum wrote:
>> Done. Please test. I also changed inheritance from MathNestInset to
>> MathGridInset in order to get the corner markers.
> 
> That's wrong IIRC. You can add corner markers by calling
> metricsMarkers[2] and drawMarkers[2] to any inset  (the '2'
> version is for corners everywhere, the unadorned version only
> for lower left and lower right corner).

I changed that.

>> Otherwise it is impossible to delete a color inset by pressing
>> backspace at the beginning.
> 
> The responsible code is LCursor::pullArg which should work for e.g.
> any MathNestInset, even for such that are not a MathGridInset.

Of course it does, but it is difficult to navigate to the right position
without markers.

>> The disadvantage of this patch is that user defined colors are not
>> editable in LyX anymore. They are correctly read and written, so that
>> you don't lose data. IMHO the better UI for supported colors outweighs
>> this disadvantage.  What do you think?
> 
> *shrug* It's a rarely used gimmick as far as I am concerned so I really
> don't care. User defined colors means ERT somewhere, so we can expect
> the user to use ERT also when using it...

Then I am going to commit the attached patch provided that Jürgens testing
does not show problems.
  
> The MathHullInset some how should change the 'inherited base color'.
> Don't ask me how this could be achieved exactly.

I hoped you knew that!


Georg
Index: src/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/ChangeLog,v
retrieving revision 1.2199
diff -u -p -r1.2199 ChangeLog
--- src/ChangeLog	9 Jun 2005 15:19:06 -0000	1.2199
+++ src/ChangeLog	14 Jun 2005 09:58:47 -0000
@@ -1,3 +1,7 @@
+2005-06-14  Georg Baum  <[EMAIL PROTECTED]>
+
+	* LColor.[Ch] (getFromLaTeXName): new
+
 2005-06-11  Georg Baum  <[EMAIL PROTECTED]>
 
 	* LaTeXFeatures.C (getPackages): solve amsmath-wasysym conflict
Index: src/LColor.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/LColor.C,v
retrieving revision 1.55
diff -u -p -r1.55 LColor.C
--- src/LColor.C	19 Jan 2005 15:03:27 -0000	1.55
+++ src/LColor.C	14 Jun 2005 09:58:47 -0000
@@ -66,7 +66,8 @@ public:
 		in.x11name   = string(entry.x11name);
 		in.guiname   = string(entry.guiname);
 		infotab[entry.lcolor] = in;
-		transform[string(entry.lyxname)] = int(entry.lcolor);
+		LyXTransform[string(entry.lyxname)] = int(entry.lcolor);
+		LaTeXTransform[string(entry.latexname)] = int(entry.lcolor);
 	}
 
 	///
@@ -75,8 +76,10 @@ public:
 	InfoTab infotab;
 
 	typedef std::map<string, int> Transform;
-	/// the transform between colour name string and integer code.
-	Transform transform;
+	/// the transform between LyX color name string and integer code.
+	Transform LyXTransform;
+	/// the transform between LaTeX color name string and integer code.
+	Transform LaTeXTransform;
 
 };
 
@@ -234,14 +237,14 @@ bool LColor::setColor(LColor::color col,
 bool LColor::setColor(string const & lyxname, string const &x11name)
 {
 	string const lcname = ascii_lowercase(lyxname);
-	if (pimpl_->transform.find(lcname) == pimpl_->transform.end()) {
+	if (pimpl_->LyXTransform.find(lcname) == pimpl_->LyXTransform.end()) {
 		lyxerr[Debug::GUI]
 			<< "LColor::setColor: Unknown color \""
 		       << lyxname << '"' << endl;
 		addColor(static_cast<color>(pimpl_->infotab.size()), lcname);
 	}
 
-	return setColor(static_cast<LColor::color>(pimpl_->transform[lcname]),
+	return setColor(static_cast<LColor::color>(pimpl_->LyXTransform[lcname]),
 			x11name);
 }
 
@@ -268,13 +271,25 @@ void LColor::addColor(LColor::color c, s
 LColor::color LColor::getFromLyXName(string const & lyxname) const
 {
 	string const lcname = ascii_lowercase(lyxname);
-	if (pimpl_->transform.find(lcname) == pimpl_->transform.end()) {
+	if (pimpl_->LyXTransform.find(lcname) == pimpl_->LyXTransform.end()) {
 		lyxerr << "LColor::getFromLyXName: Unknown color \""
 		       << lyxname << '"' << endl;
 		return none;
 	}
 
-	return static_cast<LColor::color>(pimpl_->transform[lcname]);
+	return static_cast<LColor::color>(pimpl_->LyXTransform[lcname]);
+}
+
+
+LColor::color LColor::getFromLaTeXName(string const & latexname) const
+{
+	if (pimpl_->LaTeXTransform.find(latexname) == pimpl_->LaTeXTransform.end()) {
+		lyxerr << "LColor::getFromLaTeXName: Unknown color \""
+		       << latexname << '"' << endl;
+		return none;
+	}
+
+	return static_cast<LColor::color>(pimpl_->LaTeXTransform[latexname]);
 }
 
 
Index: src/LColor.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/LColor.h,v
retrieving revision 1.44
diff -u -p -r1.44 LColor.h
--- src/LColor.h	19 Jan 2005 15:03:27 -0000	1.44
+++ src/LColor.h	14 Jun 2005 09:58:47 -0000
@@ -218,6 +218,8 @@ public:
 	LColor::color getFromGUIName(std::string const & guiname) const;
 	/// \returns the LColor::color associated with the LyX name.
 	LColor::color getFromLyXName(std::string const & lyxname) const;
+	/// \returns the LColor::color associated with the LaTeX name.
+	LColor::color getFromLaTeXName(std::string const & latexname) const;
 private:
 	///
 	void addColor(LColor::color c, std::string const & lyxname) const;
Index: src/mathed/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/ChangeLog,v
retrieving revision 1.499
diff -u -p -r1.499 ChangeLog
--- src/mathed/ChangeLog	9 Jun 2005 12:17:50 -0000	1.499
+++ src/mathed/ChangeLog	14 Jun 2005 10:00:07 -0000
@@ -1,3 +1,23 @@
+2005-06-14  Georg Baum  <[EMAIL PROTECTED]>
+
+	* math_colorinset.C (normalcolor): remove ...
+	* math_colorinset.C (latexcolor): ... and use this new function instead
+	* math_colorinset.C (metrics, draw): Don't draw cell(0), because it
+	is horrible UI
+	* math_colorinset.C (write): Don't write invalid colors
+	* math_colorinset.C: Store always the LaTeXName in cell(0)
+	* math_hullinset.C (handleFont2): adjust to the change above
+	* math_nestinset.C (handleFont2): ditto
+	* math_parser.C (parse): handle \textcolor and \normalcolor
+	* math_factory.C (createMathInset): ditto
+
 2005-06-08  Jean-Marc Lasgouttes  <[EMAIL PROTECTED]>
 
 	* math_hullinset.C (label): avoid warning when assertions are
Index: src/mathed/math_colorinset.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_colorinset.C,v
retrieving revision 1.12
diff -u -p -r1.12 math_colorinset.C
--- src/mathed/math_colorinset.C	9 Apr 2005 11:13:21 -0000	1.12
+++ src/mathed/math_colorinset.C	15 Jun 2005 09:22:45 -0000
@@ -13,29 +13,36 @@
 #include "math_colorinset.h"
 #include "math_data.h"
 #include "math_mathmlstream.h"
+#include "math_streamstr.h"
 #include "math_support.h"
 
 #include "LaTeXFeatures.h"
-#include "LColor.h"
 
 #include "support/std_ostream.h"
 
 using std::auto_ptr;
+using std::string;
 
 
 namespace {
 
-// color "none" (reset to default) needs special treatment
-bool normalcolor(MathArray const & ar)
+/// color "none" (reset to default) needs special treatment
+bool normalcolor(string const & color)
 {
-	return (asString(ar) == "none");
+	return color == "none";
 }
 
 } // namespace anon
 
 
-MathColorInset::MathColorInset(bool oldstyle)
-	: MathNestInset(2), oldstyle_(oldstyle)
+MathColorInset::MathColorInset(bool oldstyle, LColor_color const & color)
+	: MathNestInset(1), oldstyle_(oldstyle),
+	  color_(lcolor.getLaTeXName(color))
+{}
+
+
+MathColorInset::MathColorInset(bool oldstyle, string const & color)
+	: MathNestInset(1), oldstyle_(oldstyle), color_(color)
 {}
 
 
@@ -47,70 +54,50 @@ auto_ptr<InsetBase> MathColorInset::doCl
 
 void MathColorInset::metrics(MetricsInfo & mi, Dimension & dim) const
 {
-	cell(1).metrics(mi, dim);
-	if (editing(mi.base.bv)) {
-		FontSetChanger dummy(mi.base, "textnormal");
-		cell(0).metrics(mi);
-		dim  += cell(0).dim();
-		w_ = mathed_char_width(mi.base.font, '[');
-		dim.asc += 4;
-		dim.des += 4;
-		dim.wid += 2 * w_ + 4;
-		metricsMarkers(dim);
-	}
+	cell(0).metrics(mi, dim);
+	metricsMarkers(dim);
 	dim_ = dim;
 }
 
 
 void MathColorInset::draw(PainterInfo & pi, int x, int y) const
 {
-	int const x0(x);
-	if (editing(pi.base.bv)) {
-		FontSetChanger dummy(pi.base, "textnormal");
-		drawMarkers(pi, x, y);
-		drawStrBlack(pi, x, y, "[");
-		x += w_;
-		cell(0).draw(pi, x, y);
-		x += cell(0).width();
-		drawStrBlack(pi, x, y, "]");
-		x += w_ + 2;
-	}
-
 	LColor_color origcol = pi.base.font.color();
-	pi.base.font.setColor(lcolor.getFromGUIName(asString(cell(0))));
-	cell(1).draw(pi, x, y);
+	pi.base.font.setColor(lcolor.getFromLaTeXName(color_));
+	cell(0).draw(pi, x + 1, y);
 	pi.base.font.setColor(origcol);
-	if (editing(pi.base.bv))
-		setPosCache(pi, x0, y);
+	drawMarkers(pi, x, y);
+	setPosCache(pi, x, y);
 }
 
 
 void MathColorInset::validate(LaTeXFeatures & features) const
 {
 	MathNestInset::validate(features);
-	if (!normalcolor(cell(0)))
+	if (!normalcolor(color_))
 		features.require("color");
 }
 
 
 void MathColorInset::write(WriteStream & os) const
 {
-	if (normalcolor(cell(0)))
-		os << "{\\normalcolor " << cell(1) << '}';
+	if (normalcolor(color_))
+		// reset to default color inside another color inset
+		os << "{\\normalcolor " << cell(0) << '}';
 	else if (oldstyle_)
-		os << "{\\color" << '{' << cell(0) << '}' << cell(1) << '}';
+		os << "{\\color" << '{' << color_ << '}' << cell(0) << '}';
 	else
-		os << "\\textcolor" << '{' << cell(0) << "}{" << cell(1) << '}';
+		os << "\\textcolor" << '{' << color_ << "}{" << cell(0) << '}';
 }
 
 
 void MathColorInset::normalize(NormalStream & os) const
 {
-	os << "[color " << cell(0) << ' ' << cell(1) << ']';
+	os << "[color " << color_ << ' ' << cell(0) << ']';
 }
 
 
 void MathColorInset::infoize(std::ostream & os) const
 {
-	os << "Color: " << cell(0);
+	os << "Color: " << color_;
 }
Index: src/mathed/math_colorinset.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_colorinset.h,v
retrieving revision 1.4
diff -u -p -r1.4 math_colorinset.h
--- src/mathed/math_colorinset.h	23 Nov 2004 23:04:50 -0000	1.4
+++ src/mathed/math_colorinset.h	15 Jun 2005 09:22:45 -0000
@@ -12,17 +12,23 @@
 #ifndef MATH_COLORINSET_H
 #define MATH_COLORINSET_H
 
+#include "LColor.h"
+
 #include "math_nestinset.h"
 
 /// Change colours.
 
 class MathColorInset : public MathNestInset {
 public:
-	///
-	explicit MathColorInset(bool oldstyle);
+	/// Create a color inset from LyX color number
+	explicit MathColorInset(bool oldstyle,
+		LColor_color const & color = LColor::none);
+	/// Create a color inset from LaTeX color name
+	explicit MathColorInset(bool oldstyle, std::string const & color);
 	///
 	void metrics(MetricsInfo & mi, Dimension & dim) const;
 	/// we write extra braces in any case...
+	/// FIXME Why? Are they necessary if oldstyle_ == false?
 	bool extraBraces() const { return true; }
 	///
 	void draw(PainterInfo & pi, int x, int y) const;
@@ -40,6 +46,8 @@ private:
 	mutable int w_;
 	///
 	bool oldstyle_;
+	/// Our color. Only valid LaTeX colors are allowed.
+	std::string color_;
 };
 
 #endif
Index: src/mathed/math_factory.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_factory.C,v
retrieving revision 1.111
diff -u -p -r1.111 math_factory.C
--- src/mathed/math_factory.C	7 Jun 2005 17:21:51 -0000	1.111
+++ src/mathed/math_factory.C	14 Jun 2005 10:00:07 -0000
@@ -323,7 +328,7 @@ MathAtom createMathInset(string const & 
 		return MathAtom(new MathLefteqnInset);
 	if (s == "boldsymbol")
 		return MathAtom(new MathBoldsymbolInset);
-	if (s == "color")
+	if (s == "color" || s == "normalcolor")
 		return MathAtom(new MathColorInset(true));
 	if (s == "textcolor")
 		return MathAtom(new MathColorInset(false));
Index: src/mathed/math_hullinset.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_hullinset.C,v
retrieving revision 1.166
diff -u -p -r1.166 math_hullinset.C
--- src/mathed/math_hullinset.C	9 Jun 2005 12:17:50 -0000	1.166
+++ src/mathed/math_hullinset.C	14 Jun 2005 10:00:08 -0000
@@ -11,6 +11,7 @@
 #include <config.h>
 
 #include "math_charinset.h"
+#include "math_colorinset.h"
 #include "math_data.h"
 #include "math_extern.h"
 #include "math_hullinset.h"
@@ -1214,9 +1303,8 @@ void MathHullInset::handleFont2(LCursor 
 	bool b;
 	bv_funcs::string2font(arg, font, b);
 	if (font.color() != LColor::inherit) {
-		MathAtom at = createMathInset("color");
-		asArray(lcolor.getGUIName(font.color()), at.nucleus()->cell(0));
-		cur.handleNest(at, 1);
+		MathAtom at = MathAtom(new MathColorInset(true, font.color()));
+		cur.handleNest(at, 0);
 	}
 }
 
Index: src/mathed/math_nestinset.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_nestinset.C,v
retrieving revision 1.155
diff -u -p -r1.155 math_nestinset.C
--- src/mathed/math_nestinset.C	9 Jun 2005 09:58:07 -0000	1.155
+++ src/mathed/math_nestinset.C	14 Jun 2005 10:00:08 -0000
@@ -15,6 +15,7 @@
 #include "math_arrayinset.h"
 #include "math_boxinset.h"
 #include "math_braceinset.h"
+#include "math_colorinset.h"
 #include "math_commentinset.h"
 #include "math_data.h"
 #include "math_deliminset.h"
@@ -394,9 +396,8 @@ void MathNestInset::handleFont2(LCursor 
 	bool b;
 	bv_funcs::string2font(arg, font, b);
 	if (font.color() != LColor::inherit) {
-		MathAtom at = createMathInset("color");
-		asArray(lcolor.getGUIName(font.color()), at.nucleus()->cell(0));
-		cur.handleNest(at, 1);
+		MathAtom at = MathAtom(new MathColorInset(true, font.color()));
+		cur.handleNest(at, 0);
 	}
 }
 
Index: src/mathed/math_parser.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_parser.C,v
retrieving revision 1.312
diff -u -p -r1.312 math_parser.C
--- src/mathed/math_parser.C	2 Mar 2005 14:26:12 -0000	1.312
+++ src/mathed/math_parser.C	14 Jun 2005 10:00:08 -0000
@@ -42,6 +42,7 @@ following hack as starting point to writ
 #include "math_arrayinset.h"
 #include "math_braceinset.h"
 #include "math_charinset.h"
+#include "math_colorinset.h"
 #include "math_commentinset.h"
 #include "math_deliminset.h"
 #include "math_envinset.h"
@@ -1207,10 +1224,21 @@ void Parser::parse1(MathGridInset & grid
 		}
 
 		else if (t.cs() == "color") {
-			MathAtom at = createMathInset(t.cs());
-			parse(at.nucleus()->cell(0), FLAG_ITEM, MathInset::TEXT_MODE);
-			parse(at.nucleus()->cell(1), flags, mode);
-			cell->push_back(at);
+			string const color = parse_verbatim_item();
+			cell->push_back(MathAtom(new MathColorInset(true, color)));
+			parse(cell->back().nucleus()->cell(0), flags, mode);
+			return;
+		}
+
+		else if (t.cs() == "textcolor") {
+			string const color = parse_verbatim_item();
+			cell->push_back(MathAtom(new MathColorInset(false, color)));
+			parse(cell->back().nucleus()->cell(0), FLAG_ITEM, MathInset::TEXT_MODE);
+		}
+
+		else if (t.cs() == "normalcolor") {
+			cell->push_back(createMathInset(t.cs()));
+			parse(cell->back().nucleus()->cell(0), flags, mode);
 			return;
 		}
 

Reply via email to