X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Frowpainter.cpp;h=080ef43f648a82ebfda240eee0e8f1da57d998d5;hb=77713af55868140483a1a7f5704dd93b97dbe116;hp=a0b554e676ae0e5a59a1934c6f602af1a3b22ad2;hpb=2d66dbb6788aa29c270ea021af217e2b00e3c33e;p=lyx.git diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index a0b554e676..080ef43f64 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" @@ -76,7 +75,11 @@ RowPainter::RowPainter(PainterInfo & pi, FontInfo RowPainter::labelFont() const { - return text_.labelFont(pi_.base.bv->buffer(), par_); + FontInfo f = text_.labelFont(par_); + // selected text? + if (row_.begin_margin_sel || pi_.selected) + f.setPaintColor(Color_selectiontext); + return f; } @@ -225,7 +228,12 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, Change const & change_running = par_.lookupChange(pos); // selected text? - bool const selection = pos >= row_.sel_beg && pos < row_.sel_end; + bool const selection = (pos >= row_.sel_beg && pos < row_.sel_end) + || pi_.selected; + + // spelling correct? + bool const spell_state = + lyxrc.spellcheck_continuously && par_.isMisspelled(pos); char_type prev_char = ' '; // collect as much similar chars as we can @@ -239,6 +247,12 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, // Selection ends or starts here. break; + bool const new_spell_state = + lyxrc.spellcheck_continuously && par_.isMisspelled(pos); + if (new_spell_state != spell_state) + // Spell checker state changed here. + break; + Change const & change = par_.lookupChange(pos); if (!change_running.isSimilarTo(change)) // Track change type or author has changed. @@ -328,7 +342,18 @@ void RowPainter::paintForeignMark(double orig_x, Language const * lang, } -void RowPainter::paintFromPos(pos_type & vpos) +void RowPainter::paintMisspelledMark(double orig_x, int desc, bool changed) +{ + // derive the offset from zoom factor specified by user in percent + // if changed the misspelled marker gets placed slightly lower than normal + // to avoid drawing at the same vertical offset + int const offset = int(1.5 * lyxrc.zoom / 100.0); // [percent] + int const y = yo_ + desc + (changed ? offset : 0); + pi_.pain.line(int(orig_x), y, int(x_), y, Color_red, Painter::line_onoffdash, 1.0); +} + + +void RowPainter::paintFromPos(pos_type & vpos, bool changed) { pos_type const pos = bidi_.vis2log(vpos); Font const orig_font = text_metrics_.displayFont(pit_, pos); @@ -343,6 +368,10 @@ void RowPainter::paintFromPos(pos_type & vpos) bool const arabic = lang == "arabic_arabtex" || lang == "arabic_arabi" || lang == "farsi"; + // spelling correct? + bool const misspelled_ = + lyxrc.spellcheck_continuously && par_.isMisspelled(pos); + // draw as many chars as we can if ((!hebrew && !arabic) || (hebrew && !Encodings::isHebrewComposeChar(c)) @@ -355,6 +384,10 @@ void RowPainter::paintFromPos(pos_type & vpos) } paintForeignMark(orig_x, orig_font.language()); + + if (lyxrc.spellcheck_continuously && misspelled_) { + paintMisspelledMark(orig_x, 2, changed); + } } @@ -383,7 +416,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(); @@ -423,7 +456,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(); @@ -466,35 +499,34 @@ int RowPainter::paintAppendixStart(int y) void RowPainter::paintFirst() { - ParagraphParameters const & parparams = par_.params(); + ParagraphParameters const & pparams = par_.params(); + Buffer const & buffer = pi_.base.bv->buffer(); + BufferParams const & bparams = buffer.params(); + Layout const & layout = par_.layout(); int y_top = 0; // start of appendix? - if (parparams.startOfAppendix()) + if (pparams.startOfAppendix()) y_top += paintAppendixStart(yo_ - row_.ascent() + 2 * defaultRowHeight()); - Buffer const & buffer = pi_.base.bv->buffer(); - Layout const & layout = par_.layout(); - - if (buffer.params().paragraph_separation == BufferParams::ParagraphSkipSeparation) { - if (pit_ != 0) { - if (layout.latextype == LATEX_PARAGRAPH - && !par_.getDepth()) { - y_top += buffer.params().getDefSkip().inPixels(*pi_.base.bv); - } else { - Layout const & playout = pars_[pit_ - 1].layout(); - if (playout.latextype == LATEX_PARAGRAPH - && !pars_[pit_ - 1].getDepth()) { - // is it right to use defskip here, too? (AS) - y_top += buffer.params().getDefSkip().inPixels(*pi_.base.bv); - } + if (bparams.paragraph_separation == BufferParams::ParagraphSkipSeparation + && pit_ != 0) { + if (layout.latextype == LATEX_PARAGRAPH + && !par_.getDepth()) { + y_top += bparams.getDefSkip().inPixels(*pi_.base.bv); + } else { + Layout const & playout = pars_[pit_ - 1].layout(); + if (playout.latextype == LATEX_PARAGRAPH + && !pars_[pit_ - 1].getDepth()) { + // is it right to use defskip here, too? (AS) + y_top += bparams.getDefSkip().inPixels(*pi_.base.bv); } } } - 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? @@ -515,10 +547,10 @@ void RowPainter::paintFirst() // the top. if (layout.counter == "chapter") { double spacing_val = 1.0; - if (!parparams.spacing().isDefault()) { - spacing_val = parparams.spacing().getValue(); + if (!pparams.spacing().isDefault()) { + spacing_val = pparams.spacing().getValue(); } else { - spacing_val = buffer.params().spacing().getValue(); + spacing_val = bparams.spacing().getValue(); } int const labeladdon = int(fm.maxHeight() * layout.spacing.getValue() * spacing_val); @@ -555,10 +587,10 @@ void RowPainter::paintFirst() docstring const str = par_.labelString(); if (!str.empty()) { double spacing_val = 1.0; - if (!parparams.spacing().isDefault()) - spacing_val = parparams.spacing().getValue(); + if (!pparams.spacing().isDefault()) + spacing_val = pparams.spacing().getValue(); else - spacing_val = buffer.params().spacing().getValue(); + spacing_val = bparams.spacing().getValue(); FontMetrics const & fm = theFontMetrics(font); @@ -584,10 +616,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 @@ -599,16 +663,15 @@ void RowPainter::paintLast() 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); + Painter::line_solid, 3); if (change.deleted()) { pi_.pain.line(int(x_) + 1 - length, yo_ + 2, int(x_) + 1 + length, - yo_ + 2, col, Painter::line_solid, Painter::line_thick); + yo_ + 2, col, Painter::line_solid, 3); } else { pi_.pain.line(int(x_) + 1 - length, yo_ + 2, int(x_) + 1, - yo_ + 2, col, Painter::line_solid, Painter::line_thick); + yo_ + 2, col, Painter::line_solid, 3); } - } // draw an endlabel @@ -640,14 +703,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; } } @@ -670,7 +739,7 @@ void RowPainter::paintOnlyInsets() bool const pi_selected = pi_.selected; Cursor const & cur = pi_.base.bv->cursor(); if (cur.selection() && cur.text() == &text_ - && cur.anchor().text() == &text_) + && cur.normalAnchor().text() == &text_) pi_.selected = row_.sel_beg <= pos && row_.sel_end > pos; paintInset(inset, pos); pi_.selected = pi_selected; @@ -762,7 +831,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 @@ -774,8 +843,7 @@ void RowPainter::paintText() int const y_bar = change_running.deleted() ? yo_ - fm.maxAscent() / 3 : yo_ + fm.maxAscent() / 6; pi_.pain.line(change_last_x, y_bar, int(x_), y_bar, - change_running.color(), Painter::line_solid, - Painter::line_thin); + change_running.color(), Painter::line_solid, 0.5); // Change might continue with a different author or type if (change.changed() && !highly_editable_inset) { @@ -812,7 +880,7 @@ void RowPainter::paintText() bool const pi_selected = pi_.selected; Cursor const & cur = pi_.base.bv->cursor(); if (cur.selection() && cur.text() == &text_ - && cur.anchor().text() == &text_) + && cur.normalAnchor().text() == &text_) pi_.selected = row_.sel_beg <= pos && row_.sel_end > pos; paintInset(inset, pos); pi_.selected = pi_selected; @@ -820,7 +888,7 @@ void RowPainter::paintText() } else { // paint as many characters as possible. - paintFromPos(vpos); + paintFromPos(vpos, change_running.changed()); } // Is the inline completion after character? @@ -835,7 +903,7 @@ void RowPainter::paintText() int const y_bar = change_running.deleted() ? yo_ - fm.maxAscent() / 3 : yo_ + fm.maxAscent() / 6; pi_.pain.line(change_last_x, y_bar, int(x_), y_bar, - change_running.color(), Painter::line_solid, Painter::line_thin); + change_running.color(), Painter::line_solid, 0.5); change_running.setUnchanged(); } }