bool TextMetrics::metrics(MetricsInfo & mi, Dimension & dim, int min_width)
{
- LASSERT(mi.base.textwidth, /**/);
+ LASSERT(mi.base.textwidth > 0, /**/);
max_width_ = mi.base.textwidth;
// backup old dimension.
Dimension const old_dim = dim_;
if (pos == 0)
return false;
- Paragraph const & par = text_->getPar(pit);
+ Font const & left_font = displayFont(pit, pos - 1);
- bool left = displayFont(pit, pos - 1).isVisibleRightToLeft();
- bool right;
- if (pos == par.size())
- right = par.isRTL(bv_->buffer().params());
- else
- right = displayFont(pit, pos).isVisibleRightToLeft();
- return left != right;
+ return isRTLBoundary(pit, pos, left_font);
}
LYXERR(Debug::INFO, "MacroContext not initialised!"
<< " Going through the buffer again and hope"
<< " the context is better then.");
- updateLabels(bv_->buffer());
+ bv_->buffer().updateLabels();
parPos = text_->macrocontextPosition();
LASSERT(!parPos.empty(), /**/);
parPos.pit() = pit;
InsetList::const_iterator ii = par.insetList().begin();
InsetList::const_iterator iend = par.insetList().end();
for ( ; ii != iend; ++ii) {
- Dimension const & dim = pm.insetDimension(ii->inset);
if (ii->pos >= first && ii->pos < end) {
+ Dimension const & dim = pm.insetDimension(ii->inset);
maxasc = max(maxasc, dim.ascent());
maxdesc = max(maxdesc, dim.descent());
}
if (y >= last->second.position() + int(pm_last.descent())) {
// We are looking for a position that is after the last paragraph in
- // the cache (which is in priciple off-screen, that is before the
+ // the cache (which is in priciple off-screen), that is before the
// visible part.
pit = last->first + 1;
if (pit == int(text_->paragraphs().size()))
}
-Row const & TextMetrics::getRowNearY(int y, pit_type pit) const
+Row const & TextMetrics::getPitAndRowNearY(int y, pit_type & pit,
+ bool assert_in_view, bool up)
{
ParagraphMetrics const & pm = par_metrics_[pit];
for (; rit != rlast; yy += rit->height(), ++rit)
if (yy + rit->height() > y)
break;
+
+ if (assert_in_view && yy + rit->height() != y) {
+ if (!up) {
+ if (rit != pm.rows().begin())
+ --rit;
+ else if (pit != 0) {
+ --pit;
+ newParMetricsUp();
+ ParagraphMetrics const & pm2 = par_metrics_[pit];
+ rit = pm2.rows().end();
+ --rit;
+ }
+ } else {
+ if (rit != rlast)
+ ++rit;
+ else if (pit != int(par_metrics_.size())) {
+ ++pit;
+ newParMetricsDown();
+ ParagraphMetrics const & pm2 = par_metrics_[pit];
+ rit = pm2.rows().begin();
+ }
+ }
+ }
return *rit;
}
// x,y are absolute screen coordinates
// sets cursor recursively descending into nested editable insets
-Inset * TextMetrics::editXY(Cursor & cur, int x, int y)
+Inset * TextMetrics::editXY(Cursor & cur, int x, int y,
+ bool assert_in_view, bool up)
{
if (lyxerr.debugging(Debug::WORKAREA)) {
LYXERR0("TextMetrics::editXY(cur, " << x << ", " << y << ")");
pit_type pit = getPitNearY(y);
LASSERT(pit != -1, return 0);
- Row const & row = getRowNearY(y, pit);
+ Row const & row = getPitAndRowNearY(y, pit, assert_in_view, up);
bool bound = false;
int xx = x; // is modified by getColumnNearX
}
ParagraphList const & pars = text_->paragraphs();
- Inset const * insetBefore = pos? pars[pit].getInset(pos - 1): 0;
+ Inset const * insetBefore = pos ? pars[pit].getInset(pos - 1) : 0;
//Inset * insetBehind = pars[pit].getInset(pos);
// This should be just before or just behind the
case MARGIN_FIRST_DYNAMIC:
if (layout.labeltype == LABEL_MANUAL) {
- if (pos >= par.beginOfBody()) {
+ // if we are at position 0, we are never in the body
+ if (pos > 0 && pos >= par.beginOfBody())
l_margin += labelfont_metrics.signedWidth(layout.leftmargin);
- } else {
+ else
l_margin += labelfont_metrics.signedWidth(layout.labelindent);
- }
} else if (pos != 0
// Special case to fix problems with
// theorems (JMarc)