Fix bug 3889 (justification of Bidi text in the GUI)

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19016 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Dov Feldstern 2007-07-09 17:18:35 +00:00
parent 19e12e5fab
commit 72535633e3
2 changed files with 31 additions and 0 deletions

View File

@ -1718,6 +1718,12 @@ int Text::cursorX(BufferView const & bv, CursorSlice const & sl,
pos_type const row_pos = row.pos(); pos_type const row_pos = row.pos();
pos_type const end = row.endpos(); pos_type const end = row.endpos();
// Spaces at logical line breaks in bidi text must be skipped during
// cursor positioning. However, they may appear visually in the middle
// of a row; they must be skipped, wherever they are...
// * logically "abc_[HEBREW_\nHEBREW]"
// * visually "abc_[_WERBEH\nWERBEH]"
pos_type skipped_sep_vpos = -1;
if (end <= row_pos) if (end <= row_pos)
cursor_vpos = row_pos; cursor_vpos = row_pos;
@ -1743,7 +1749,15 @@ int Text::cursorX(BufferView const & bv, CursorSlice const & sl,
FontMetrics const & labelfm = theFontMetrics( FontMetrics const & labelfm = theFontMetrics(
getLabelFont(buffer, par)); getLabelFont(buffer, par));
// If the last logical character is a separator, skip it, unless
// it's in the last row of a paragraph; see skipped_sep_vpos declaration
if (end > 0 && end < par.size() && par.isSeparator(end - 1))
skipped_sep_vpos = bidi.log2vis(end - 1);
for (pos_type vpos = row_pos; vpos < cursor_vpos; ++vpos) { for (pos_type vpos = row_pos; vpos < cursor_vpos; ++vpos) {
// Skip the separator which is at the logical end of the row
if (vpos == skipped_sep_vpos)
continue;
pos_type pos = bidi.vis2log(vpos); pos_type pos = bidi.vis2log(vpos);
if (body_pos > 0 && pos == body_pos - 1) { if (body_pos > 0 && pos == body_pos - 1) {
// FIXME UNICODE // FIXME UNICODE

View File

@ -734,6 +734,12 @@ void RowPainter::paintLast()
void RowPainter::paintText() void RowPainter::paintText()
{ {
pos_type const end = row_.endpos(); pos_type const end = row_.endpos();
// Spaces at logical line breaks in bidi text must be skipped during
// painting. However, they may appear visually in the middle
// of a row; they must be skipped, wherever they are...
// * logically "abc_[HEBREW_\nHEBREW]"
// * visually "abc_[_WERBEH\nWERBEH]"
pos_type skipped_sep_vpos = -1;
pos_type body_pos = par_.beginOfBody(); pos_type body_pos = par_.beginOfBody();
if (body_pos > 0 && if (body_pos > 0 &&
(body_pos > end || !par_.isLineSeparator(body_pos - 1))) { (body_pos > end || !par_.isLineSeparator(body_pos - 1))) {
@ -751,10 +757,21 @@ void RowPainter::paintText()
Font font; Font font;
Buffer const & buffer = *bv_.buffer(); Buffer const & buffer = *bv_.buffer();
// If the last logical character is a separator, don't paint it, unless
// it's in the last row of a paragraph; see skipped_sep_vpos declaration
if (end > 0 && end < par_.size() && par_.isSeparator(end - 1))
skipped_sep_vpos = bidi_.log2vis(end - 1);
for (pos_type vpos = row_.pos(); vpos < end; ) { for (pos_type vpos = row_.pos(); vpos < end; ) {
if (x_ > bv_.workWidth()) if (x_ > bv_.workWidth())
break; break;
// Skip the separator at the logical end of the row
if (vpos == skipped_sep_vpos) {
++vpos;
continue;
}
pos_type const pos = bidi_.vis2log(vpos); pos_type const pos = bidi_.vis2log(vpos);
if (pos >= par_.size()) { if (pos >= par_.size()) {