X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextMetrics.cpp;h=ea8e07fae67ddf732c4f377f918455cf4a3e6a67;hb=8b7584846c4e1a9c87a004fab479722fee7e3013;hp=8a18dd29566d4f3a9958e593ff88252a4e2665c9;hpb=32faa2a27305faa5501234c5ab188c7255a1751e;p=lyx.git diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 8a18dd2956..ea8e07fae6 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -27,7 +27,6 @@ #include "CoordCache.h" #include "Cursor.h" #include "CutAndPaste.h" -#include "FuncRequest.h" #include "HSpace.h" #include "InsetList.h" #include "Layout.h" @@ -134,8 +133,6 @@ TextMetrics::TextMetrics(BufferView * bv, Text * text) dim_.wid = max_width_; dim_.asc = 10; dim_.des = 10; - - //text_->updateBuffer(bv->buffer()); } @@ -306,11 +303,8 @@ bool TextMetrics::isRTL(CursorSlice const & sl, bool boundary) const bool TextMetrics::isRTLBoundary(pit_type pit, pos_type pos) const { - if (!lyxrc.rtl_support) - return false; - // no RTL boundary at paragraph start - if (pos == 0) + if (!lyxrc.rtl_support || pos == 0) return false; Font const & left_font = displayFont(pit, pos - 1); @@ -344,13 +338,6 @@ bool TextMetrics::isRTLBoundary(pit_type pit, pos_type pos, return false; Paragraph const & par = text_->getPar(pit); - bool left = font.isVisibleRightToLeft(); - bool right; - if (pos == par.size()) - right = par.isRTL(bv_->buffer().params()); - else - right = displayFont(pit, pos).isVisibleRightToLeft(); - // no RTL boundary at line break: // abc|\n -> move right -> abc\n (and not: abc\n| // FED FED| FED ) @@ -360,6 +347,13 @@ bool TextMetrics::isRTLBoundary(pit_type pit, pos_type pos, || par.isSeparator(pos - 1))) return false; + bool left = font.isVisibleRightToLeft(); + bool right; + if (pos == par.size()) + right = par.isRTL(bv_->buffer().params()); + else + right = displayFont(pit, pos).isVisibleRightToLeft(); + return left != right; } @@ -404,6 +398,9 @@ bool TextMetrics::redoParagraph(pit_type const pit) LYXERR(Debug::INFO, "MacroContext not initialised!" << " Going through the buffer again and hope" << " the context is better then."); + // FIXME audit updateBuffer calls + // This should not be here, but it is not clear yet where else it + // should be. bv_->buffer().updateBuffer(); parPos = text_->macrocontextPosition(); LASSERT(!parPos.empty(), /**/); @@ -1222,10 +1219,18 @@ pos_type TextMetrics::getColumnNearX(pit_type const pit, return 0; } - // if the first character is a separator, we are in RTL - // text. This character will not be painted on screen + // This (rtl_support test) is not needed, but gives + // some speedup if rtl_support == false + bool const lastrow = lyxrc.rtl_support && row.endpos() == par.size(); + + // If lastrow is false, we don't need to compute + // the value of rtl. + bool const rtl = lastrow ? text_->isRTL(par) : false; + + // if the first character is a separator, and we are in RTL + // text, this character will not be painted on screen // and thus we should not count it and skip to the next. - if (par.isSeparator(bidi.vis2log(vc))) + if (rtl && par.isSeparator(bidi.vis2log(vc))) ++vc; while (vc < end && tmpx <= x) { @@ -1253,13 +1258,7 @@ pos_type TextMetrics::getColumnNearX(pit_type const pit, LASSERT(vc <= end, /**/); // This shouldn't happen. boundary = false; - // This (rtl_support test) is not needed, but gives - // some speedup if rtl_support == false - bool const lastrow = lyxrc.rtl_support && row.endpos() == par.size(); - // If lastrow is false, we don't need to compute - // the value of rtl. - bool const rtl = lastrow ? text_->isRTL(par) : false; if (lastrow && ((rtl && left_side && vc == row.pos() && x < tmpx - 5) || (!rtl && !left_side && vc == end && x > tmpx + 5))) { @@ -2015,14 +2014,15 @@ int TextMetrics::leftMargin(int max_width, && par.getInset(pos)->display()) && (!(tclass.isDefaultLayout(par.layout()) || tclass.isPlainLayout(par.layout())) - || buffer.params().paragraph_separation == BufferParams::ParagraphIndentSeparation) + || buffer.params().paragraph_separation + == BufferParams::ParagraphIndentSeparation) ) { - // use the parindent of the layout when the default indentation is used - // otherwise use the indentation set in the document settings + // use the parindent of the layout when the default indentation is + // used otherwise use the indentation set in the document settings if (buffer.params().getIndentation().asLyXCommand() == "default") - l_margin += theFontMetrics(buffer.params().getFont()).signedWidth( - parindent); + l_margin += theFontMetrics( + buffer.params().getFont()).signedWidth(parindent); else l_margin += buffer.params().getIndentation().inPixels(*bv_); } @@ -2081,7 +2081,7 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type pit, int x, int y) co // This is our text. && cur.text() == text_ // if the anchor is outside, this is not our selection - && cur.anchor().text() == text_ + && cur.normalAnchor().text() == text_ && pit >= sel_beg.pit() && pit <= sel_end.pit(); // We store the begin and end pos of the selection relative to this par @@ -2132,15 +2132,7 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type pit, int x, int y) co // Take this opportunity to spellcheck the row contents. if (row_has_changed && lyxrc.spellcheck_continuously) { - WordLangTuple wl; - // dummy variable, not used. - static docstring_list suggestions; - pos_type from = row.pos(); - pos_type to = row.endpos(); - while (from < row.endpos()) { - text_->getPar(pit).spellCheck(from, to, wl, suggestions, false); - from = to + 1; - } + text_->getPar(pit).spellCheck(); } // Don't paint the row if a full repaint has not been requested @@ -2221,7 +2213,7 @@ void TextMetrics::drawRowSelection(PainterInfo & pi, int x, Row const & row, cur.boundary(begin_boundary); int x1 = cursorX(beg.top(), begin_boundary); int x2 = cursorX(end.top(), end_boundary); - int const y1 = bv_->getPos(cur, cur.boundary()).y_ - row.ascent(); + int const y1 = bv_->getPos(cur).y_ - row.ascent(); int const y2 = y1 + row.height(); int const rm = text_->isMainText() ? bv_->rightMargin() : 0; @@ -2310,8 +2302,10 @@ void TextMetrics::completionPosAndDim(Cursor const & cur, int & x, int & y, wordStart.pos() -= word.length(); // get position on screen of the word start and end - Point lxy = cur.bv().getPos(wordStart, false); - Point rxy = cur.bv().getPos(bvcur, bvcur.boundary()); + //FIXME: Is it necessary to explicitly set this to false? + wordStart.boundary(false); + Point lxy = cur.bv().getPos(wordStart); + Point rxy = cur.bv().getPos(bvcur); // calculate dimensions of the word dim = rowHeight(bvcur.pit(), wordStart.pos(), bvcur.pos(), false);