X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Frowpainter.cpp;h=ef81e683aed532eb86d148b4bfcad49feb79c652;hb=27d580b5c057d565b9b4b50c811f6e1fab7f1246;hp=3b7bbe09db2c5b427cbd87ae7b2a4f62873fb71a;hpb=e4808961c94b22cfa90ffb1e038a59e77dbb087e;p=lyx.git diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index 3b7bbe09db..ef81e683ae 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -22,7 +22,6 @@ #include "BufferView.h" #include "Changes.h" #include "Encoding.h" -#include "support/gettext.h" #include "Language.h" #include "Layout.h" #include "LyXRC.h" @@ -30,7 +29,6 @@ #include "MetricsInfo.h" #include "Paragraph.h" #include "ParagraphMetrics.h" -#include "paragraph_funcs.h" #include "ParagraphParameters.h" #include "TextMetrics.h" #include "VSpace.h" @@ -41,6 +39,7 @@ #include "insets/InsetText.h" #include "support/debug.h" +#include "support/gettext.h" #include "support/textutils.h" #include "support/lassert.h" @@ -60,7 +59,7 @@ RowPainter::RowPainter(PainterInfo & pi, pars_(text.paragraphs()), row_(row), pit_(pit), par_(text.paragraphs()[pit]), pm_(text_metrics_.parMetrics(pit)), - bidi_(bidi), erased_(pi_.erased_), + bidi_(bidi), change_(pi_.change_), xo_(x), yo_(y), width_(text_metrics_.width()) { bidi_.computeTables(par_, pi_.base.bv->buffer(), row_); @@ -76,7 +75,7 @@ RowPainter::RowPainter(PainterInfo & pi, FontInfo RowPainter::labelFont() const { - return text_.labelFont(pi_.base.bv->buffer(), par_); + return text_.labelFont(par_); } @@ -106,12 +105,14 @@ void RowPainter::paintInset(Inset const * inset, pos_type const pos) pi_.base.bv->buffer().params().getFont().fontInfo() : font.fontInfo(); pi_.ltr_pos = (bidi_.level(pos) % 2 == 0); - pi_.erased_ = erased_ || par_.isDeleted(pos); - pi_.base.bv->coordCache().insets().add(inset, int(x_), yo_); + pi_.change_ = change_.changed() ? change_ : par_.lookupChange(pos); + + int const x1 = int(x_); + pi_.base.bv->coordCache().insets().add(inset, x1, yo_); // insets are painted completely. Recursive - inset->drawBackground(pi_, int(x_), yo_); - inset->drawSelection(pi_, int(x_), yo_); - inset->draw(pi_, int(x_), yo_); + inset->drawBackground(pi_, x1, yo_); + inset->drawSelection(pi_, x1, yo_); + inset->draw(pi_, x1, yo_); Dimension const & dim = pm_.insetDimension(inset); @@ -123,28 +124,6 @@ void RowPainter::paintInset(Inset const * inset, pos_type const pos) pi_.full_repaint = pi_full_repaint; #ifdef DEBUG_METRICS - int const x1 = int(x_ - dim.width()); - Dimension dim2; - LASSERT(max_witdh_ > 0, /**/); - int right_margin = text_metrics_.rightMargin(pm_); - int const w = max_witdh_ - leftMargin() - right_margin; - MetricsInfo mi(pi_.base.bv, font.fontInfo(), w); - inset->metrics(mi, dim2); - if (dim.wid != dim2.wid) - lyxerr << "Error: inset " << to_ascii(inset->getInsetName()) - << " draw width " << dim.width() - << "> metrics width " << dim2.wid << "." << endl; - if (dim->asc != dim2.asc) - lyxerr << "Error: inset " << to_ascii(inset->getInsetName()) - << " draw ascent " << dim.ascent() - << "> metrics ascent " << dim2.asc << "." << endl; - if (dim2.descent() != dim.des) - lyxerr << "Error: inset " << to_ascii(inset->getInsetName()) - << " draw ascent " << dim.descent() - << "> metrics descent " << dim2.des << "." << endl; - LASSERT(dim2.wid == dim.wid, /**/); - LASSERT(dim2.asc == dim.asc, /**/); - LASSERT(dim2.des == dim.des, /**/); int const x2 = x1 + dim.wid; int const y1 = yo_ + dim.des; int const y2 = yo_ - dim.asc; @@ -325,9 +304,9 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, FontInfo copy = font; if (change_running.changed()) - copy.setColor(change_running.color()); + copy.setPaintColor(change_running.color()); else if (selection) - copy.setColor(Color_selectiontext); + copy.setPaintColor(Color_selectiontext); x_ += pi_.pain.text(int(x_), yo_, s, copy); } @@ -348,6 +327,13 @@ void RowPainter::paintForeignMark(double orig_x, Language const * lang, } +void RowPainter::paintMisspelledMark(double orig_x, int desc) +{ + int const y = yo_ + desc; + pi_.pain.wavyHorizontalLine(int(orig_x), y, int(x_) - int(orig_x), Color_red); +} + + void RowPainter::paintFromPos(pos_type & vpos) { pos_type const pos = bidi_.vis2log(vpos); @@ -375,6 +361,9 @@ void RowPainter::paintFromPos(pos_type & vpos) } paintForeignMark(orig_x, orig_font.language()); + + if (lyxrc.spellcheck_continuously && orig_font.isMisspelled()) + paintMisspelledMark(orig_x, 3); } @@ -403,7 +392,7 @@ void RowPainter::paintChangeBar() void RowPainter::paintAppendix() { // only draw the appendix frame once (for the main text) - if (!par_.params().appendix() || !text_.isMainText(pi_.base.bv->buffer())) + if (!par_.params().appendix() || !text_.isMainText()) return; int y = yo_ - row_.ascent(); @@ -443,7 +432,7 @@ void RowPainter::paintDepthBar() int const w = nestMargin() / 5; int x = int(xo_) + w * i; // only consider the changebar space if we're drawing outermost text - if (text_.isMainText(pi_.base.bv->buffer())) + if (text_.isMainText()) x += changebarMargin(); int const starty = yo_ - row_.ascent(); @@ -513,8 +502,8 @@ void RowPainter::paintFirst() } } - bool const is_rtl = text_.isRTL(buffer, par_); - bool const is_seq = isFirstInSequence(pit_, text_.paragraphs()); + bool const is_rtl = text_.isRTL(par_); + bool const is_seq = text_.isFirstInSequence(pit_); //lyxerr << "paintFirst: " << par_.id() << " is_seq: " << is_seq << endl; // should we print a label? @@ -604,10 +593,42 @@ void RowPainter::paintFirst() } +/** Check if the current paragraph is the last paragraph in a + proof environment */ +static int getEndLabel(pit_type p, Text const & text) +{ + ParagraphList const & pars = text.paragraphs(); + pit_type pit = p; + depth_type par_depth = pars[p].getDepth(); + while (pit != pit_type(pars.size())) { + Layout const & layout = pars[pit].layout(); + int const endlabeltype = layout.endlabeltype; + + if (endlabeltype != END_LABEL_NO_LABEL) { + if (p + 1 == pit_type(pars.size())) + return endlabeltype; + + depth_type const next_depth = + pars[p + 1].getDepth(); + if (par_depth > next_depth || + (par_depth == next_depth && layout != pars[p + 1].layout())) + return endlabeltype; + break; + } + if (par_depth == 0) + break; + pit = text.outerHook(pit); + if (pit != pit_type(pars.size())) + par_depth = pars[pit].getDepth(); + } + return END_LABEL_NO_LABEL; +} + + void RowPainter::paintLast() { - bool const is_rtl = text_.isRTL(pi_.base.bv->buffer(), par_); - int const endlabel = getEndLabel(pit_, text_.paragraphs()); + bool const is_rtl = text_.isRTL(par_); + int const endlabel = getEndLabel(pit_, text_); // paint imaginary end-of-paragraph character @@ -616,7 +637,7 @@ void RowPainter::paintLast() FontMetrics const & fm = theFontMetrics(pi_.base.bv->buffer().params().getFont()); int const length = fm.maxAscent() / 2; - ColorCode col = change.color(); + Color col = change.color(); pi_.pain.line(int(x_) + 1, yo_ + 2, int(x_) + 1, yo_ + 2 - length, col, Painter::line_solid, Painter::line_thick); @@ -628,7 +649,6 @@ void RowPainter::paintLast() pi_.pain.line(int(x_) + 1 - length, yo_ + 2, int(x_) + 1, yo_ + 2, col, Painter::line_solid, Painter::line_thick); } - } // draw an endlabel @@ -660,14 +680,20 @@ void RowPainter::paintLast() FontInfo const font = labelFont(); FontMetrics const & fm = theFontMetrics(font); docstring const & str = par_.layout().endlabelstring(); - double const x = is_rtl ? - x_ - fm.width(str) - : - text_metrics_.rightMargin(pm_) - row_.width(); + double const x = is_rtl ? x_ - fm.width(str) : x_; pi_.pain.text(int(x), yo_, str, font); break; } case END_LABEL_NO_LABEL: + if (lyxrc.paragraph_markers && size_type(pit_ + 1) < pars_.size()) { + docstring const s = docstring(1, char_type(0x00B6)); + FontInfo f = FontInfo(); + FontMetrics const & fm = theFontMetrics(f); + f.setColor(Color_paragraphmarker); + pi_.pain.text(int(x_), yo_, s, f); + x_ += fm.width(s); + } break; } } @@ -675,15 +701,17 @@ void RowPainter::paintLast() void RowPainter::paintOnlyInsets() { + CoordCache const & cache = pi_.base.bv->coordCache(); pos_type const end = row_.endpos(); for (pos_type pos = row_.pos(); pos != end; ++pos) { // If outer row has changed, nested insets are repaint completely. Inset const * inset = par_.getInset(pos); if (!inset) continue; - if (x_ > pi_.base.bv->workWidth()) + if (x_ > pi_.base.bv->workWidth() + || !cache.getInsets().has(inset)) continue; - x_ = pi_.base.bv->coordCache().getInsets().x(inset); + x_ = cache.getInsets().x(inset); bool const pi_selected = pi_.selected; Cursor const & cur = pi_.base.bv->cursor(); @@ -780,7 +808,7 @@ void RowPainter::paintText() Inset const * inset = par_.getInset(pos); bool const highly_editable_inset = inset - && inset->editable() == Inset::HIGHLY_EDITABLE; + && inset->editable(); // If we reach the end of a change or if the author changes, paint it. // We also don't paint across things like tables