On Wed, Feb 21, 2007 at 03:12:24PM +0100, Stefan Schimanski wrote:
> Waiting for some comments

Ok. Updated patch attached. The patch is 'clean' C++-wise.
There is no memory problem as far as I can tell.

I also attach a .lyx file containing a simple macro. I personally
find the editing experience inacceptable. I'd like some of the 
others to comment. Maybe the behaviour should be configurable 
on a per-macro base.

Andre'
Index: InsetMathMacro.C
===================================================================
--- InsetMathMacro.C	(revision 17284)
+++ InsetMathMacro.C	(working copy)
@@ -33,6 +33,47 @@
 using std::vector;
 
 
+/// This class is the value of a macro argument, technically 
+/// a wrapper of the cells of MathMacro.
+class MathMacroArgumentValue : public InsetMathDim {
+public:
+	///
+	MathMacroArgumentValue(MathArray const * value) : value_(value) {}
+	///
+	bool metrics(MetricsInfo & mi, Dimension & dim) const;
+	///
+	void draw(PainterInfo &, int x, int y) const;
+	
+private:
+	std::auto_ptr<InsetBase> doClone() const;
+	MathArray const * value_;
+};
+
+
+auto_ptr<InsetBase> MathMacroArgumentValue::doClone() const 
+{
+	return auto_ptr<InsetBase>(new MathMacroArgumentValue(*this));
+}
+
+
+bool MathMacroArgumentValue::metrics(MetricsInfo & mi, Dimension & dim) const 
+{
+	value_->metrics(mi, dim);
+	metricsMarkers2(dim);
+	if (dim_ == dim)
+		return false;
+	dim_ = dim;
+	return true;
+}
+
+
+void MathMacroArgumentValue::draw(PainterInfo & pi, int x, int y) const 
+{
+	value_->draw(pi, x, y);
+}
+
+
+
 MathMacro::MathMacro(docstring const & name, int numargs)
 	: InsetMathNest(numargs), name_(name)
 {}
@@ -63,24 +104,12 @@
 {
 	if (!MacroTable::globalMacros().has(name())) {
 		mathed_string_dim(mi.base.font, "Unknown: " + name(), dim);
-	} else if (editing(mi.base.bv)) {
-		// FIXME UNICODE
-		asArray(MacroTable::globalMacros().get(name()).def(), tmpl_);
-		LyXFont font = mi.base.font;
-		augmentFont(font, from_ascii("lyxtex"));
-		tmpl_.metrics(mi, dim);
-		// FIXME UNICODE
-		dim.wid += mathed_string_width(font, name()) + 10;
-		// FIXME UNICODE
-		int ww = mathed_string_width(font, from_ascii("#1: "));
-		for (idx_type i = 0; i < nargs(); ++i) {
-			MathArray const & c = cell(i);
-			c.metrics(mi);
-			dim.wid  = max(dim.wid, c.width() + ww);
-			dim.des += c.height() + 10;
-		}
 	} else {
-		MacroTable::globalMacros().get(name()).expand(cells_, expanded_);
+		// create MathMacroArgumentValue object pointing to the cells of the macro
+		vector<MathArray> values(nargs());
+		for (size_t i = 0; i != nargs(); ++i) 
+			values[i].insert(0, MathAtom(new MathMacroArgumentValue(&cells_[i])));
+		MacroTable::globalMacros().get(name()).expand(values, expanded_);
 		expanded_.metrics(mi, dim);
 	}
 	metricsMarkers2(dim);
@@ -96,26 +125,6 @@
 	if (!MacroTable::globalMacros().has(name())) {
 		// FIXME UNICODE
 		drawStrRed(pi, x, y, "Unknown: " + name());
-	} else if (editing(pi.base.bv)) {
-		LyXFont font = pi.base.font;
-		augmentFont(font, from_ascii("lyxtex"));
-		int h = y - dim_.ascent() + 2 + tmpl_.ascent();
-		pi.pain.text(x + 3, h, name(), font);
-		int const w = mathed_string_width(font, name());
-		tmpl_.draw(pi, x + w + 12, h);
-		h += tmpl_.descent();
-		Dimension ldim;
-		string t = "#1: ";
-		mathed_string_dim(font, name(), ldim);
-		for (idx_type i = 0; i < nargs(); ++i) {
-			MathArray const & c = cell(i);
-			h += max(c.ascent(), ldim.asc) + 5;
-			c.draw(pi, x + ldim.wid, h);
-			char_type str[] = { '#', '1', ':', '\0' };
-			str[1] += static_cast<char_type>(i);
-			pi.pain.text(x + 3, h, str, font);
-			h += max(c.descent(), ldim.des) + 5;
-		}
 	} else {
 		expanded_.draw(pi, x, y);
 	}
Index: InsetMathMacro.h
===================================================================
--- InsetMathMacro.h	(revision 17284)
+++ InsetMathMacro.h	(working copy)
@@ -20,8 +20,7 @@
 
 
 namespace lyx {
-
-
+  
 /// This class contains the data for a macro.
 class MathMacro : public InsetMathNest {
 public:

Attachment: newfile1.lyx
Description: application/lyx

Reply via email to