#include "TextMetrics.h"
#include "Buffer.h"
-#include "buffer_funcs.h"
#include "BufferParams.h"
#include "BufferView.h"
#include "CoordCache.h"
#include "Cursor.h"
#include "CutAndPaste.h"
-#include "InsetList.h"
-#include "Language.h"
#include "Layout.h"
#include "LyXRC.h"
#include "MetricsInfo.h"
#include "insets/InsetText.h"
-#include "mathed/InsetMathMacroTemplate.h"
+#include "mathed/MacroTable.h"
#include "frontends/FontMetrics.h"
-#include "frontends/Painter.h"
#include "frontends/NullPainter.h"
-#include "support/convert.h"
#include "support/debug.h"
#include "support/lassert.h"
-#include "support/lyxlib.h"
-#include "support/RefChanger.h"
+#include "support/Changer.h"
#include <stdlib.h>
#include <cmath>
}
-bool TextMetrics::metrics(MetricsInfo & mi, Dimension & dim, int min_width,
+bool TextMetrics::metrics(MetricsInfo const & mi, Dimension & dim, int min_width,
bool const expand_on_multipars)
{
LBUFERR(mi.base.textwidth > 0);
|| !contains(pit))
return false;
- ParagraphMetrics & pm = par_metrics_[pit];
+ ParagraphMetrics const & pm = par_metrics_[pit];
// no RTL boundary in empty paragraph
if (pm.rows().empty())
return false;
- pos_type endpos = pm.getRow(pos - 1, false).endpos();
- pos_type startpos = pm.getRow(pos, false).pos();
+ pos_type const endpos = pm.getRow(pos - 1, false).endpos();
+ pos_type const startpos = pm.getRow(pos, false).pos();
// no RTL boundary at line start:
// abc\n -> toggle to RTL -> abc\n (and not: abc\n|
// | | )
|| par.isSeparator(pos - 1)))
return false;
- bool left = font.isVisibleRightToLeft();
+ bool const left = font.isVisibleRightToLeft();
bool right;
if (pos == par.size())
right = par.isRTL(bv_->buffer().params());
first = row.endpos();
++row_index;
- pm.dim().wid = max(pm.dim().wid, row.width());
+ pm.dim().wid = max(pm.dim().wid, row.width() + row.right_margin);
pm.dim().des += row.height();
} while (first < par.size() || need_new_row);
}
// are there any hfills in the row?
- ParagraphMetrics & pm = par_metrics_[row.pit()];
+ ParagraphMetrics const & pm = par_metrics_[row.pit()];
int nh = numberOfHfills(row, pm, par.beginOfBody());
int hfill = 0;
int hfill_rem = 0;
}
LYXERR(Debug::DEBUG, "No inset hit. ");
- return 0;
+ return nullptr;
}
return;
size_t const nrows = pm.rows().size();
// Remember left and right margin for drawing math numbers
- Changer changeleft = make_change(pi.leftx, x + leftMargin(pit));
- Changer changeright = make_change(pi.rightx, x + width() - rightMargin(pit));
+ Changer changeleft = changeVar(pi.leftx, x + leftMargin(pit));
+ Changer changeright = changeVar(pi.rightx, x + width() - rightMargin(pit));
// Use fast lane in nodraw stage.
if (pi.pain.isNull()) {
LYXERR(Debug::PAINTING, "Clear rect@("
<< max(row_x, 0) << ", " << y - row.ascent() << ")="
<< width() << " x " << row.height());
- // FIXME: this is a hack. We clear an amount equal to
- // cursor width. This will not work if the caret has a
- // ridiculous width like 6. (see ticket #10797)
- // This is the same formula as in GuiWorkArea.
- int const caret_width = lyxrc.cursor_width
- ? lyxrc.cursor_width
- : 1 + int((lyxrc.currentZoom + 50) / 200.0);
- pi.pain.fillRectangle(max(row_x, 0), y - row.ascent(),
- width() + caret_width,
- row.height(), pi.background_color);
+ pi.pain.fillRectangle(row_x, y - row.ascent(),
+ width(), row.height(), pi.background_color);
}
// Instrumentation for testing row cache (see also
void TextMetrics::completionPosAndDim(Cursor const & cur, int & x, int & y,
Dimension & dim) const
{
- Cursor const & bvcur = cur.bv().cursor();
+ DocIterator from = cur.bv().cursor();
+ DocIterator to = from;
+ text_->getWord(from.top(), to.top(), PREVIOUS_WORD);
- // get word in front of cursor
- docstring word = text_->previousWord(bvcur.top());
- DocIterator wordStart = bvcur;
- wordStart.pos() -= word.length();
-
- // calculate dimensions of the word
- Row row;
- row.pit(bvcur.pit());
- row.pos(wordStart.pos());
- row.endpos(bvcur.pos());
- setRowHeight(row);
- dim = row.dim();
+ // The vertical dimension of the word
+ Font const font = displayFont(cur.pit(), from.pos());
+ FontMetrics const & fm = theFontMetrics(font);
+ // the +1's below are related to the extra pixels added in setRowHeight
+ dim.asc = fm.maxAscent() + 1;
+ dim.des = fm.maxDescent() + 1;
// get position on screen of the word start and end
//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);
+ from.boundary(false);
+ Point lxy = cur.bv().getPos(from);
+ Point rxy = cur.bv().getPos(to);
dim.wid = abs(rxy.x_ - lxy.x_);
// calculate position of word