From ff8fcc268af9b32f7c80939ac276c60b6a873e4c Mon Sep 17 00:00:00 2001 From: Stefan Schimanski Date: Thu, 7 Jun 2007 19:50:02 +0000 Subject: [PATCH] * no_bidi_isboundary.patch: added isRTLBoundary as a replacement to several references to the Text::bidi object. (fixes #3790, #3801, #3809) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18704 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Text.cpp | 2 +- src/Text.h | 7 +++++++ src/Text2.cpp | 6 +++--- src/Text3.cpp | 48 +++++++++++++++++++++++++++++++++++++-------- src/TextMetrics.cpp | 2 +- 5 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/Text.cpp b/src/Text.cpp index 3bac412353..444c46ff98 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -1524,7 +1524,7 @@ void Text::drawRowSelection(PainterInfo & pi, int x, Row const & row, // but for RTL boundaries don't, because: abc|DDEEFFghi -> abcDDEEF|Fghi if (cur.boundary()) { cur.boundary(false); - } else if (bidi.isBoundary(buffer, cur.paragraph(), cur.pos() + 1)) { + } else if (isRTLBoundary(buffer, cur.paragraph(), cur.pos() + 1)) { // in front of RTL boundary -> Stay on this side of the boundary because: // ab|cDDEEFFghi -> abc|DDEEFFghi ++cur.pos(); diff --git a/src/Text.h b/src/Text.h index a6d4a745e4..503bdee356 100644 --- a/src/Text.h +++ b/src/Text.h @@ -335,6 +335,13 @@ public: bool isRTL(Buffer const &, Paragraph const & par) const; /// is this position in the paragraph right-to-left? bool isRTL(Buffer const & buffer, CursorSlice const & sl, bool boundary) const; + /// is between pos-1 and pos an RTL<->LTR boundary? + bool isRTLBoundary(Buffer const & buffer, Paragraph const & par, + pos_type pos) const; + /// would be a RTL<->LTR boundary between pos and the given font? + bool isRTLBoundary(Buffer const & buffer, Paragraph const & par, + pos_type pos, Font const & font) const; + /// bool checkAndActivateInset(Cursor & cur, bool front); diff --git a/src/Text2.cpp b/src/Text2.cpp index bbb2c4233b..66baea12cc 100644 --- a/src/Text2.cpp +++ b/src/Text2.cpp @@ -795,7 +795,7 @@ void Text::setCurrentFont(Cursor & cur) real_current_font = getFont(cur.buffer(), par, pos); if (cur.pos() == cur.lastpos() - && bidi.isBoundary(cur.buffer(), par, cur.pos()) + && isRTLBoundary(cur.buffer(), par, cur.pos()) && !cur.boundary()) { Language const * lang = par.getParLanguage(bufparams); current_font.setLanguage(lang); @@ -1037,7 +1037,7 @@ bool Text::cursorRight(Cursor & cur) // if left of boundary -> just jump to right side // but for RTL boundaries don't, because: abc|DDEEFFghi -> abcDDEEF|Fghi if (cur.boundary() && - !bidi.isBoundary(cur.buffer(), cur.paragraph(), cur.pos())) + !isRTLBoundary(cur.buffer(), cur.paragraph(), cur.pos())) return setCursor(cur, cur.pit(), cur.pos(), true, false); // next position is left of boundary, @@ -1066,7 +1066,7 @@ bool Text::cursorRight(Cursor & cur) // in front of RTL boundary? Stay on this side of the boundary because: // ab|cDDEEFFghi -> abc|DDEEFFghi - if (bidi.isBoundary(cur.buffer(), cur.paragraph(), cur.pos() + 1)) + if (isRTLBoundary(cur.buffer(), cur.paragraph(), cur.pos() + 1)) return setCursor(cur, cur.pit(), cur.pos() + 1, true, true); // move right diff --git a/src/Text3.cpp b/src/Text3.cpp index e935f3db8a..85187f50fa 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -99,7 +99,6 @@ namespace { Font freefont(Font::ALL_IGNORE); bool toggleall = false; - void toggleAndShow(Cursor & cur, Text * text, Font const & font, bool toggleall = true) { @@ -108,13 +107,10 @@ namespace { if (font.language() != ignore_language || font.number() != Font::IGNORE) { Paragraph & par = cur.paragraph(); - text->bidi.computeTables(par, cur.buffer(), cur.textRow()); - if (cur.boundary() != - text->bidi.isBoundary(cur.buffer(), par, - cur.pos(), - text->real_current_font)) + if (cur.boundary() != text->isRTLBoundary(cur.buffer(), par, + cur.pos(), text->real_current_font)) text->setCursor(cur, cur.pit(), cur.pos(), - false, !cur.boundary()); + false, !cur.boundary()); } } @@ -301,7 +297,7 @@ bool Text::isRTL(Buffer const & buffer, Paragraph const & par) const bool Text::isRTL(Buffer const & buffer, CursorSlice const & sl, bool boundary) const { - if (!sl.text()) + if (!lyxrc.rtl_support && !sl.text()) return false; int correction = 0; @@ -313,6 +309,42 @@ bool Text::isRTL(Buffer const & buffer, CursorSlice const & sl, bool boundary) c } +bool Text::isRTLBoundary(Buffer const & buffer, Paragraph const & par, + pos_type pos) const +{ + if (!lyxrc.rtl_support) + return false; + + // no RTL boundary at line start + if (pos == 0) + return false; + + bool left = getFont(buffer, par, pos - 1).isVisibleRightToLeft(); + bool right; + if (pos == par.size()) + right = par.isRightToLeftPar(buffer.params()); + else + right = getFont(buffer, par, pos).isVisibleRightToLeft(); + return left != right; +} + + +bool Text::isRTLBoundary(Buffer const & buffer, Paragraph const & par, + pos_type pos, Font const & font) const +{ + if (!lyxrc.rtl_support) + return false; + + bool left = font.isVisibleRightToLeft(); + bool right; + if (pos == par.size()) + right = par.isRightToLeftPar(buffer.params()); + else + right = getFont(buffer, par, pos).isVisibleRightToLeft(); + return left != right; +} + + void Text::dispatch(Cursor & cur, FuncRequest & cmd) { LYXERR(Debug::ACTION) << "Text::dispatch: cmd: " << cmd << endl; diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 622ca32688..6f3d6a300c 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -893,7 +893,7 @@ pos_type TextMetrics::getColumnNearX(pit_type const pit, bool const rtl = (text_->bidi.level(c) % 2 == 1); if (left_side == rtl) { ++c; - boundary = text_->bidi.isBoundary(buffer, par, c); + boundary = text_->isRTLBoundary(buffer, par, c); } }