}
-FontInfo const RowPainter::getLabelFont() const
+FontInfo RowPainter::labelFont() const
{
- return text_.getLabelFont(pi_.base.bv->buffer(), par_);
+ return text_.labelFont(pi_.base.bv->buffer(), par_);
}
void RowPainter::paintInset(Inset const * inset, pos_type const pos)
{
- Font const font = text_metrics_.getDisplayFont(pit_, pos);
+ Font const font = text_metrics_.displayFont(pit_, pos);
BOOST_ASSERT(inset);
// Backup full_repaint status because some insets (InsetTabular)
if (!Encodings::isComposeChar_hebrew(c)) {
if (isPrintableNonspace(c)) {
int const width2 = pm_.singleWidth(i,
- text_metrics_.getDisplayFont(pit_, i));
+ text_metrics_.displayFont(pit_, i));
dx = (c == 0x05e8 || // resh
c == 0x05d3) // dalet
? width2 - width
if (!Encodings::isComposeChar_arabic(c)) {
if (isPrintableNonspace(c)) {
int const width2 = pm_.singleWidth(i,
- text_metrics_.getDisplayFont(pit_, i));
+ text_metrics_.displayFont(pit_, i));
dx = (width2 - width) / 2;
}
break;
void RowPainter::paintFromPos(pos_type & vpos)
{
pos_type const pos = bidi_.vis2log(vpos);
- Font const orig_font = text_metrics_.getDisplayFont(pit_, pos);
+ Font const orig_font = text_metrics_.displayFont(pit_, pos);
double const orig_x = x_;
// usual characters, no insets
|| layout->latextype != LATEX_ENVIRONMENT
|| is_seq)) {
- FontInfo const font = getLabelFont();
+ FontInfo const font = labelFont();
FontMetrics const & fm = theFontMetrics(font);
- docstring const str = par_.getLabelstring();
+ docstring const str = par_.labelString();
if (!str.empty()) {
double x = x_;
(layout->labeltype == LABEL_TOP_ENVIRONMENT ||
layout->labeltype == LABEL_BIBLIO ||
layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)) {
- FontInfo const font = getLabelFont();
- if (!par_.getLabelstring().empty()) {
- docstring const str = par_.getLabelstring();
+ FontInfo const font = labelFont();
+ docstring const str = par_.labelString();
+ if (!str.empty()) {
double spacing_val = 1.0;
if (!parparams.spacing().isDefault())
spacing_val = parparams.spacing().getValue();
switch (endlabel) {
case END_LABEL_BOX:
case END_LABEL_FILLED_BOX: {
- FontInfo const font = getLabelFont();
+ FontInfo const font = labelFont();
FontMetrics const & fm = theFontMetrics(font);
int const size = int(0.75 * fm.maxAscent());
int const y = yo_ - size;
}
case END_LABEL_STATIC: {
- FontInfo const font = getLabelFont();
+ FontInfo const font = labelFont();
FontMetrics const & fm = theFontMetrics(font);
docstring const & str = par_.layout()->endlabelstring();
double const x = is_rtl ?
bool is_struckout = false;
int last_strikeout_x = 0;
+ // check for possible inline completion
+ DocIterator const & inlineCompletionPos = pi_.base.bv->inlineCompletionPos();
+ pos_type inlineCompletionVPos = -1;
+ if (inlineCompletionPos.inTexted()
+ && inlineCompletionPos.text() == &text_
+ && inlineCompletionPos.pit() == pit_
+ && inlineCompletionPos.pos() - 1 >= row_.pos()
+ && inlineCompletionPos.pos() - 1 < row_.endpos()) {
+ // draw logically behind the previous character
+ inlineCompletionVPos = bidi_.log2vis(inlineCompletionPos.pos() - 1);
+ }
+
// Use font span to speed things up, see below
FontSpan font_span;
Font font;
// 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; ) {
if (x_ > pi_.base.bv->workWidth())
break;
// Use font span to speed things up, see above
if (vpos < font_span.first || vpos > font_span.last) {
font_span = par_.fontSpan(vpos);
- font = text_metrics_.getDisplayFont(pit_, vpos);
+ font = text_metrics_.displayFont(pit_, vpos);
+
+ // split font span if inline completion is inside
+ if (font_span.first <= inlineCompletionVPos
+ && font_span.last > inlineCompletionVPos)
+ font_span.last = inlineCompletionVPos;
}
const int width_pos = pm_.singleWidth(pos, font);
}
if (body_pos > 0 && pos == body_pos - 1) {
- int const lwidth = theFontMetrics(getLabelFont())
+ int const lwidth = theFontMetrics(labelFont())
.width(layout->labelsep);
x_ += row_.label_hfill + lwidth - width_pos;
}
+
+ // Is the inline completion in front of character?
+ if (font.isRightToLeft() && vpos == inlineCompletionVPos)
+ paintInlineCompletion(font);
if (par_.isSeparator(pos)) {
- Font const orig_font = text_metrics_.getDisplayFont(pit_, pos);
+ Font const orig_font = text_metrics_.displayFont(pit_, pos);
double const orig_x = x_;
x_ += width_pos;
if (pos >= body_pos)
// paint as many characters as possible.
paintFromPos(vpos);
}
+
+ // Is the inline completion after character?
+ if (!font.isRightToLeft() && vpos - 1 == inlineCompletionVPos)
+ paintInlineCompletion(font);
}
// if we reach the end of a struck out range, paint it
}
}
+
+void RowPainter::paintInlineCompletion(Font const & font)
+{
+ docstring completion = pi_.base.bv->inlineCompletion();
+ FontInfo f = font.fontInfo();
+ bool rtl = font.isRightToLeft();
+
+ // draw the unique and the non-unique completion part
+ // Note: this is not time-critical as it is
+ // only done once per screen.
+ size_t uniqueTo = pi_.base.bv->inlineCompletionUniqueChars();
+ docstring s1 = completion.substr(0, uniqueTo);
+ docstring s2 = completion.substr(uniqueTo);
+ ColorCode c1 = Color_inlinecompletion;
+ ColorCode c2 = Color_nonunique_inlinecompletion;
+
+ // right to left?
+ if (rtl) {
+ swap(s1, s2);
+ reverse(s1.begin(), s1.end());
+ reverse(s2.begin(), s2.end());
+ swap(c1, c2);
+ }
+
+ if (s1.size() > 0) {
+ f.setColor(c1);
+ pi_.pain.text(int(x_), yo_, s1, f);
+ x_ += theFontMetrics(font).width(s1);
+ }
+
+ if (s2.size() > 0) {
+ f.setColor(c2);
+ pi_.pain.text(int(x_), yo_, s2, f);
+ x_ += theFontMetrics(font).width(s2);
+ }
+}
+
} // namespace lyx