This patch solves some problems with painting selections in Insets.
These are:
- multiline selections paint in left margin of the main text (bug 5270),
- the margins to the left and right side of the inset are not correct,
- wrong painting of e.g. a multiline selection of a caption in a float.

I renamed the Row::left_margin_sel back to Row::begin_margin_sel because
of RTL text.

I added a FIXME to BufferView::leftMargin and ::rightMargin that they
are different for RTL texts.

I did some cosmetics (lines <= 80 char, consts).

Vincent
Index: src/BufferView.h
===================================================================
--- src/BufferView.h	(revision 26708)
+++ src/BufferView.h	(working copy)
@@ -92,9 +92,11 @@
 	///
 	void setFullScreen(bool full_screen) { full_screen_ = full_screen; }
 
+	//FIXME: In RTL text this is the left-margin
 	/// right margin
 	int rightMargin() const;
 
+	//FIXME: In RTL text this is the right-margin
 	/// left margin
 	int leftMargin() const;
 
Index: src/TextMetrics.cpp
===================================================================
--- src/TextMetrics.cpp	(revision 26708)
+++ src/TextMetrics.cpp	(working copy)
@@ -2025,9 +2025,9 @@
 		// whether this row is the first or last and update the margins.
 		if (row.selection()) {
 			if (row.sel_beg == 0)
-				row.left_margin_sel = sel_beg.pit() < pit;
+				row.begin_margin_sel = sel_beg.pit() < pit;
 			if (row.sel_end == sel_end_par.lastpos())
-				row.right_margin_sel = sel_end.pit() > pit;
+				row.end_margin_sel = sel_end.pit() > pit;
 		}
 
 		// Row signature; has row changed since last paint?
@@ -2108,27 +2108,30 @@
 	cur.boundary(begin_boundary);
 	int x1 = cursorX(beg.top(), begin_boundary);
 	int x2 = cursorX(end.top(), end_boundary);
-	int y1 = bv_->getPos(cur, cur.boundary()).y_ - row.ascent();
-	int y2 = y1 + row.height();
+	int const y1 = bv_->getPos(cur, cur.boundary()).y_ - row.ascent();
+	int const y2 = y1 + row.height();
 
+	int const rm = text_->isMainText(buffer) ? bv_->rightMargin() : 0;
+	int const lm = text_->isMainText(buffer) ? bv_->leftMargin() : 0;
+
 	// draw the margins
-	if (row.left_margin_sel) {
+	if (row.begin_margin_sel) {
 		if (text_->isRTL(buffer, beg.paragraph())) {
-			int const w = width() - bv_->leftMargin() - x1;
-			pi.pain.fillRectangle(x + x1, y1, w, y2 - y1, Color_selection);
+			pi.pain.fillRectangle(x + x1, y1,  width() - rm - x1, y2 - y1,
+				Color_selection);
 		} else {
-			int const rm = bv_->rightMargin();
-			pi.pain.fillRectangle(rm, y1, x1 - rm, y2 - y1, Color_selection);
+			pi.pain.fillRectangle(x + lm, y1, x1 - lm, y2 - y1,
+				Color_selection);
 		}
 	}
 
-	if (row.right_margin_sel) {
+	if (row.end_margin_sel) {
 		if (text_->isRTL(buffer, beg.paragraph())) {
-			int rm = bv_->rightMargin();
-			pi.pain.fillRectangle(x + rm, y1, x2 - rm, y2 - y1, Color_selection);
+			pi.pain.fillRectangle(x + lm, y1, x2 - lm, y2 - y1,
+				Color_selection);
 		} else {
-			int lm = bv_->leftMargin();
-			pi.pain.fillRectangle(x + x2, y1, width() - lm - x2, y2 - y1, Color_selection);
+			pi.pain.fillRectangle(x + x2, y1, width() - rm - x2, y2 - y1,
+				Color_selection);
 		}
 	}
 
@@ -2146,13 +2149,13 @@
 		// descend into insets and which does not go into the
 		// next line. Compare the logic with the original cursorForward
 
-		// if left of boundary -> just jump to right side
-		// but for RTL boundaries don't, because: abc|DDEEFFghi -> abcDDEEF|Fghi
+		// if left of boundary -> just jump to right side, but
+		// for RTL boundaries don't, because: abc|DDEEFFghi -> abcDDEEF|Fghi
 		if (cur.boundary()) {
 			cur.boundary(false);
 		}	else if (isRTLBoundary(cur.pit(), cur.pos() + 1)) {
-			// in front of RTL boundary -> Stay on this side of the boundary because:
-			//   ab|cDDEEFFghi -> abc|DDEEFFghi
+			// in front of RTL boundary -> Stay on this side of the boundary
+			// because:  ab|cDDEEFFghi -> abc|DDEEFFghi
 			++cur.pos();
 			cur.boundary(true);
 			drawNow = true;
Index: src/Row.h
===================================================================
--- src/Row.h	(revision 26708)
+++ src/Row.h	(working copy)
@@ -87,9 +87,9 @@
 	///
 	mutable pos_type sel_end;
 	///
-	mutable bool left_margin_sel;
+	mutable bool begin_margin_sel;
 	///
-	mutable bool right_margin_sel;
+	mutable bool end_margin_sel;
 
 private:
 	/// Decides whether the margin is selected.
Index: src/Row.cpp
===================================================================
--- src/Row.cpp	(revision 26708)
+++ src/Row.cpp	(working copy)
@@ -29,7 +29,7 @@
 Row::Row()
 	: separator(0), label_hfill(0), x(0),
 	sel_beg(-1), sel_end(-1),
-	left_margin_sel(false), right_margin_sel(false), 
+	begin_margin_sel(false), end_margin_sel(false), 
 	changed_(false), crc_(0), pos_(0), end_(0)
 {}
 
@@ -93,8 +93,8 @@
 	setSelection(beg.pos(), end.pos());
 	
 	if (selection()) {
-		right_margin_sel = isMarginSelected(false, beg, end);
-		left_margin_sel = isMarginSelected(true, beg, end);
+		end_margin_sel = isMarginSelected(false, beg, end);
+		begin_margin_sel = isMarginSelected(true, beg, end);
 	}
 }
 

Reply via email to