ParagraphList const & pars = text_->paragraphs();
Paragraph const & par = pars[pit];
- LayoutPtr const & layout = par.layout();
+ Layout const & layout = par.layout();
Buffer const & buffer = bv_->buffer();
// FIXME: broken?
BufferParams const & params = buffer.params();
Font f = par.getFontSettings(params, pos);
if (!text_->isMainText(buffer))
applyOuterFont(f);
- bool lab = layout->labeltype == LABEL_MANUAL && pos < body_pos;
+ bool lab = layout.labeltype == LABEL_MANUAL && pos < body_pos;
- FontInfo const & lf = lab ? layout->labelfont : layout->font;
- FontInfo rlf = lab ? layout->reslabelfont : layout->resfont;
+ FontInfo const & lf = lab ? layout.labelfont : layout.font;
+ FontInfo rlf = lab ? layout.reslabelfont : layout.resfont;
// In case the default family has been customized
if (lf.family() == INHERIT_FAMILY)
// The uncommon case need not be optimized as much
FontInfo const & layoutfont = pos < body_pos ?
- layout->labelfont : layout->font;
+ layout.labelfont : layout.font;
Font font = par.getFontSettings(params, pos);
font.fontInfo().realize(layoutfont);
changed |= (old_dim != dim);
}
- Cursor const & cur = bv_->cursor();
- DocIterator sel_beg = cur.selectionBegin();
- DocIterator sel_end = cur.selectionEnd();
- bool selection = cur.selection()
- // This is out text.
- && cur.text() == text_
- // if the anchor is outside, this is not our selection
- && cur.anchor().text() == text_
- && pit >= sel_beg.pit() && pit <= sel_end.pit();
-
- // We care only about visible selection.
- if (selection) {
- if (pit != sel_beg.pit()) {
- sel_beg.pit() = pit;
- sel_beg.pos() = 0;
- }
- if (pit != sel_end.pit()) {
- sel_end.pit() = pit;
- sel_end.pos() = sel_end.lastpos();
- }
- }
-
par.setBeginOfBody();
pos_type first = 0;
size_t row_index = 0;
row.setChanged(false);
row.pos(first);
row.endpos(end);
- if (selection)
- row.setSelection(sel_beg.pos(), sel_end.pos());
- else
- row.setSelection(-1, -1);
row.setDimension(dim);
int const max_row_width = max(dim_.wid, dim.wid);
computeRowMetrics(pit, row, max_row_width);
row.x = leftMargin(max_width_, pit, row.pos());
// is there a manual margin with a manual label
- LayoutPtr const & layout = par.layout();
+ Layout const & layout = par.layout();
- if (layout->margintype == MARGIN_MANUAL
- && layout->labeltype == LABEL_MANUAL) {
+ if (layout.margintype == MARGIN_MANUAL
+ && layout.labeltype == LABEL_MANUAL) {
/// We might have real hfills in the label part
int nlh = numberOfLabelHfills(par, row);
// set x how you need it
int align;
if (par.params().align() == LYX_ALIGN_LAYOUT)
- align = layout->align;
+ align = layout.align;
else
align = par.params().align();
&& (body_pos > end || !par.isLineSeparator(body_pos - 1)))
{
row.x += theFontMetrics(text_->labelFont(buffer, par)).
- width(layout->labelsep);
+ width(layout.labelsep);
if (body_pos <= end)
row.x += row.label_hfill;
}
int TextMetrics::labelEnd(pit_type const pit) const
{
// labelEnd is only needed if the layout fills a flushleft label.
- if (text_->getPar(pit).layout()->margintype != MARGIN_MANUAL)
+ if (text_->getPar(pit).layout().margintype != MARGIN_MANUAL)
return 0;
// return the beginning of the body
return leftMargin(max_width_, pit);
if (pos == end || width < 0)
return end;
- LayoutPtr const & layout = par.layout();
+ Layout const & layout = par.layout();
- if (layout->margintype == MARGIN_RIGHT_ADDRESS_BOX)
+ if (layout.margintype == MARGIN_RIGHT_ADDRESS_BOX)
return addressBreakPoint(pos, par);
pos_type const body_pos = par.beginOfBody();
if (body_pos && i == body_pos) {
FontMetrics const & fm = theFontMetrics(
text_->labelFont(buffer, par));
- int add = fm.width(layout->labelsep);
+ int add = fm.width(layout.labelsep);
if (par.isLineSeparator(i - 1))
add -= singleWidth(pit, i - 1);
if (body_pos > 0 && i == body_pos) {
FontMetrics const & fm = theFontMetrics(
text_->labelFont(buffer, par));
- w += fm.width(par.layout()->labelsep);
+ w += fm.width(par.layout().labelsep);
if (par.isLineSeparator(i - 1))
w -= singleWidth(pit, i - 1);
w = max(w, label_end);
if (body_pos > 0 && body_pos >= end) {
FontMetrics const & fm = theFontMetrics(
text_->labelFont(buffer, par));
- w += fm.width(par.layout()->labelsep);
+ w += fm.width(par.layout().labelsep);
if (end > 0 && par.isLineSeparator(end - 1))
w -= singleWidth(pit, end - 1);
w = max(w, label_end);
// ok, let us initialize the maxasc and maxdesc value.
// Only the fontsize count. The other properties
// are taken from the layoutfont. Nicer on the screen :)
- LayoutPtr const & layout = par.layout();
+ Layout const & layout = par.layout();
// as max get the first character of this row then it can
// increase but not decrease the height. Just some point to
FontMetrics const & fontmetrics = theFontMetrics(font);
// these are minimum values
- double const spacing_val = layout->spacing.getValue()
+ double const spacing_val = layout.spacing.getValue()
* text_->spacing(buffer, par);
//lyxerr << "spacing_val = " << spacing_val << endl;
int maxasc = int(fontmetrics.maxAscent() * spacing_val);
&& par.ownerCode() != ERT_CODE
&& par.ownerCode() != LISTINGS_CODE
&& pit > 0
- && ((layout->isParagraph() && par.getDepth() == 0)
- || (pars[pit - 1].layout()->isParagraph()
+ && ((layout.isParagraph() && par.getDepth() == 0)
+ || (pars[pit - 1].layout().isParagraph()
&& pars[pit - 1].getDepth() == 0)))
{
maxasc += bufparams.getDefSkip().inPixels(*bv_);
// This is special code for the chapter, since the label of this
// layout is printed in an extra row
- if (layout->counter == "chapter"
+ if (layout.counter == "chapter"
&& !par.params().labelString().empty()) {
labeladdon = int(labelfont_metrics.maxHeight()
- * layout->spacing.getValue()
+ * layout.spacing.getValue()
* text_->spacing(buffer, par));
}
// special code for the top label
- if ((layout->labeltype == LABEL_TOP_ENVIRONMENT
- || layout->labeltype == LABEL_BIBLIO
- || layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)
+ if ((layout.labeltype == LABEL_TOP_ENVIRONMENT
+ || layout.labeltype == LABEL_BIBLIO
+ || layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)
&& isFirstInSequence(pit, pars)
&& !par.labelString().empty())
{
labeladdon = int(
labelfont_metrics.maxHeight()
- * layout->spacing.getValue()
+ * layout.spacing.getValue()
* text_->spacing(buffer, par)
- + (layout->topsep + layout->labelbottomsep) * dh);
+ + (layout.topsep + layout.labelbottomsep) * dh);
}
// Add the layout spaces, for example before and after
&& prevpar.getDepth() == par.getDepth()
&& prevpar.getLabelWidthString()
== par.getLabelWidthString()) {
- layoutasc = layout->itemsep * dh;
+ layoutasc = layout.itemsep * dh;
} else if (pit != 0 || first != 0) {
- if (layout->topsep > 0)
- layoutasc = layout->topsep * dh;
+ if (layout.topsep > 0)
+ layoutasc = layout.topsep * dh;
}
prev = outerHook(pit, pars);
if (prev != pit_type(pars.size())) {
- maxasc += int(pars[prev].layout()->parsep * dh);
+ maxasc += int(pars[prev].layout().parsep * dh);
} else if (pit != 0) {
Paragraph const & prevpar = pars[pit - 1];
if (prevpar.getDepth() != 0 ||
prevpar.layout() == layout) {
- maxasc += int(layout->parsep * dh);
+ maxasc += int(layout.parsep * dh);
}
}
}
double unusual = 0;
if (pars[cpit].getDepth() > pars[nextpit].getDepth()) {
- usual = pars[cpit].layout()->bottomsep * dh;
+ usual = pars[cpit].layout().bottomsep * dh;
cpit = depthHook(cpit, pars, pars[nextpit].getDepth());
if (pars[cpit].layout() != pars[nextpit].layout()
|| pars[nextpit].getLabelWidthString() != pars[cpit].getLabelWidthString())
{
- unusual = pars[cpit].layout()->bottomsep * dh;
+ unusual = pars[cpit].layout().bottomsep * dh;
}
layoutdesc = max(unusual, usual);
} else if (pars[cpit].getDepth() == pars[nextpit].getDepth()) {
if (pars[cpit].layout() != pars[nextpit].layout()
|| pars[nextpit].getLabelWidthString() != pars[cpit].getLabelWidthString())
- layoutdesc = int(pars[cpit].layout()->bottomsep * dh);
+ layoutdesc = int(pars[cpit].layout().bottomsep * dh);
}
}
}
pos_type vc = row.pos();
pos_type end = row.endpos();
pos_type c = 0;
- LayoutPtr const & layout = par.layout();
+ Layout const & layout = par.layout();
bool left_side = false;
if (body_pos > 0 && c == body_pos - 1) {
FontMetrics const & fm = theFontMetrics(
text_->labelFont(buffer, par));
- tmpx += row.label_hfill + fm.width(layout->labelsep);
+ tmpx += row.label_hfill + fm.width(layout.labelsep);
if (par.isLineSeparator(body_pos - 1))
tmpx -= singleWidth(pit, body_pos - 1);
}
if (inlineCompletionPos.inTexted()
&& inlineCompletionPos.text() == text_
&& inlineCompletionPos.pit() == pit
- && inlineCompletionPos.pos() >= row_pos
- && inlineCompletionPos.pos() <= end) {
+ && inlineCompletionPos.pos() - 1 >= row_pos
+ && inlineCompletionPos.pos() - 1 < end) {
// draw logically behind the previous character
inlineCompletionVPos = bidi.log2vis(inlineCompletionPos.pos() - 1);
}
if (body_pos > 0 && pos == body_pos - 1) {
FontMetrics const & labelfm = theFontMetrics(
text_->labelFont(buffer, par));
- x += row.label_hfill + labelfm.width(par.layout()->labelsep);
+ x += row.label_hfill + labelfm.width(par.layout().labelsep);
if (par.isLineSeparator(body_pos - 1))
x -= singleWidth(pit, body_pos - 1);
}
}
-void TextMetrics::cursorPrevious(Cursor & cur)
-{
- pos_type cpos = cur.pos();
- pit_type cpar = cur.pit();
-
- int x = cur.x_target();
- setCursorFromCoordinates(cur, x, 0);
- cur.dispatch(FuncRequest(cur.selection()? LFUN_UP_SELECT: LFUN_UP));
-
- if (cpar == cur.pit() && cpos == cur.pos())
- // we have a row which is taller than the workarea. The
- // simplest solution is to move to the previous row instead.
- cur.dispatch(FuncRequest(cur.selection()? LFUN_UP_SELECT: LFUN_UP));
-
- cur.finishUndo();
- cur.updateFlags(Update::Force | Update::FitCursor);
-}
-
-
-void TextMetrics::cursorNext(Cursor & cur)
-{
- pos_type cpos = cur.pos();
- pit_type cpar = cur.pit();
-
- int x = cur.x_target();
- setCursorFromCoordinates(cur, x, cur.bv().workHeight() - 1);
- cur.dispatch(FuncRequest(cur.selection()? LFUN_DOWN_SELECT: LFUN_DOWN));
-
- if (cpar == cur.pit() && cpos == cur.pos())
- // we have a row which is taller than the workarea. The
- // simplest solution is to move to the next row instead.
- cur.dispatch(
- FuncRequest(cur.selection()? LFUN_DOWN_SELECT: LFUN_DOWN));
-
- cur.finishUndo();
- cur.updateFlags(Update::Force | Update::FitCursor);
-}
-
-
// the cursor set functions have a special mechanism. When they
// realize you left an empty paragraph, they will delete it.
Buffer const & buffer = bv_->buffer();
//lyxerr << "TextMetrics::leftMargin: pit: " << pit << " pos: " << pos << endl;
DocumentClass const & tclass = buffer.params().documentClass();
- LayoutPtr const & layout = par.layout();
+ Layout const & layout = par.layout();
- docstring parindent = layout->parindent;
+ docstring parindent = layout.parindent;
int l_margin = 0;
// find the next level paragraph
pit_type newpar = outerHook(pit, pars);
if (newpar != pit_type(pars.size())) {
- if (pars[newpar].layout()->isEnvironment()) {
+ if (pars[newpar].layout().isEnvironment()) {
l_margin = leftMargin(max_width, newpar);
}
- //FIXME Should this check for emptyLayout() as well?
- if (par.layout() == tclass.defaultLayout()) {
+ if (tclass.isDefaultLayout(par.layout())
+ || tclass.isEmptyLayout(par.layout())) {
if (pars[newpar].params().noindent())
parindent.erase();
else
- parindent = pars[newpar].layout()->parindent;
+ parindent = pars[newpar].layout().parindent;
}
}
}
// This happens after sections in standard classes. The 1.3.x
// code compared depths too, but it does not seem necessary
// (JMarc)
- if (par.layout() == tclass.defaultLayout()
- && pit > 0 && pars[pit - 1].layout()->nextnoindent)
+ if (tclass.isDefaultLayout(par.layout())
+ && pit > 0 && pars[pit - 1].layout().nextnoindent)
parindent.erase();
FontInfo const labelfont = text_->labelFont(buffer, par);
FontMetrics const & labelfont_metrics = theFontMetrics(labelfont);
- switch (layout->margintype) {
+ switch (layout.margintype) {
case MARGIN_DYNAMIC:
- if (!layout->leftmargin.empty()) {
+ if (!layout.leftmargin.empty()) {
l_margin += theFontMetrics(buffer.params().getFont()).signedWidth(
- layout->leftmargin);
+ layout.leftmargin);
}
if (!par.labelString().empty()) {
- l_margin += labelfont_metrics.signedWidth(layout->labelindent);
+ l_margin += labelfont_metrics.signedWidth(layout.labelindent);
l_margin += labelfont_metrics.width(par.labelString());
- l_margin += labelfont_metrics.width(layout->labelsep);
+ l_margin += labelfont_metrics.width(layout.labelsep);
}
break;
case MARGIN_MANUAL: {
- l_margin += labelfont_metrics.signedWidth(layout->labelindent);
+ l_margin += labelfont_metrics.signedWidth(layout.labelindent);
// The width of an empty par, even with manual label, should be 0
if (!par.empty() && pos >= par.beginOfBody()) {
if (!par.getLabelWidthString().empty()) {
docstring labstr = par.getLabelWidthString();
l_margin += labelfont_metrics.width(labstr);
- l_margin += labelfont_metrics.width(layout->labelsep);
+ l_margin += labelfont_metrics.width(layout.labelsep);
}
}
break;
case MARGIN_STATIC: {
l_margin += theFontMetrics(buffer.params().getFont()).
- signedWidth(layout->leftmargin) * 4 / (par.getDepth() + 4);
+ signedWidth(layout.leftmargin) * 4 / (par.getDepth() + 4);
break;
}
case MARGIN_FIRST_DYNAMIC:
- if (layout->labeltype == LABEL_MANUAL) {
+ if (layout.labeltype == LABEL_MANUAL) {
if (pos >= par.beginOfBody()) {
- l_margin += labelfont_metrics.signedWidth(layout->leftmargin);
+ l_margin += labelfont_metrics.signedWidth(layout.leftmargin);
} else {
- l_margin += labelfont_metrics.signedWidth(layout->labelindent);
+ l_margin += labelfont_metrics.signedWidth(layout.labelindent);
}
} else if (pos != 0
// Special case to fix problems with
// theorems (JMarc)
- || (layout->labeltype == LABEL_STATIC
- && layout->latextype == LATEX_ENVIRONMENT
+ || (layout.labeltype == LABEL_STATIC
+ && layout.latextype == LATEX_ENVIRONMENT
&& !isFirstInSequence(pit, pars))) {
- l_margin += labelfont_metrics.signedWidth(layout->leftmargin);
- } else if (layout->labeltype != LABEL_TOP_ENVIRONMENT
- && layout->labeltype != LABEL_BIBLIO
- && layout->labeltype !=
+ l_margin += labelfont_metrics.signedWidth(layout.leftmargin);
+ } else if (layout.labeltype != LABEL_TOP_ENVIRONMENT
+ && layout.labeltype != LABEL_BIBLIO
+ && layout.labeltype !=
LABEL_CENTERED_TOP_ENVIRONMENT) {
- l_margin += labelfont_metrics.signedWidth(layout->labelindent);
- l_margin += labelfont_metrics.width(layout->labelsep);
+ l_margin += labelfont_metrics.signedWidth(layout.labelindent);
+ l_margin += labelfont_metrics.width(layout.labelsep);
l_margin += labelfont_metrics.width(par.labelString());
}
break;
for ( ; rit != end; ++rit)
if (rit->fill() < minfill)
minfill = rit->fill();
- l_margin += theFontMetrics(params.getFont()).signedWidth(layout->leftmargin);
+ l_margin += theFontMetrics(params.getFont()).signedWidth(layout.leftmargin);
l_margin += minfill;
#endif
// also wrong, but much shorter.
LyXAlignment align;
if (par.params().align() == LYX_ALIGN_LAYOUT)
- align = layout->align;
+ align = layout.align;
else
align = par.params().align();
// set the correct parindent
if (pos == 0
- && (layout->labeltype == LABEL_NO_LABEL
- || layout->labeltype == LABEL_TOP_ENVIRONMENT
- || layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT
- || (layout->labeltype == LABEL_STATIC
- && layout->latextype == LATEX_ENVIRONMENT
- && !isFirstInSequence(pit, pars)))
+ && (layout.labeltype == LABEL_NO_LABEL
+ || layout.labeltype == LABEL_TOP_ENVIRONMENT
+ || layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT
+ || (layout.labeltype == LABEL_STATIC
+ && layout.latextype == LATEX_ENVIRONMENT
+ && !isFirstInSequence(pit, pars)))
&& align == LYX_ALIGN_BLOCK
&& !par.params().noindent()
// in some insets, paragraphs are never indented
&& !(!par.empty()
&& par.isInset(pos)
&& par.getInset(pos)->display())
- && (par.layout() != tclass.defaultLayout() //should this check emptyLayout()?
- || buffer.params().paragraph_separation ==
- BufferParams::PARSEP_INDENT))
+ && ((tclass.isDefaultLayout(par.layout())
+ || tclass.isEmptyLayout(par.layout()))
+ || buffer.params().paragraph_separation == BufferParams::PARSEP_INDENT)
+ )
{
l_margin += theFontMetrics(buffer.params().getFont()).signedWidth(
parindent);
int const ww = bv_->workHeight();
size_t const nrows = pm.rows().size();
+ Cursor const & cur = bv_->cursor();
+ DocIterator sel_beg = cur.selectionBegin();
+ DocIterator sel_end = cur.selectionEnd();
+ bool selection = cur.selection()
+ // This is our text.
+ && cur.text() == text_
+ // if the anchor is outside, this is not our selection
+ && cur.anchor().text() == text_
+ && pit >= sel_beg.pit() && pit <= sel_end.pit();
+
+ // We care only about visible selection.
+ if (selection) {
+ if (pit != sel_beg.pit()) {
+ sel_beg.pit() = pit;
+ sel_beg.pos() = 0;
+ }
+ if (pit != sel_end.pit()) {
+ sel_end.pit() = pit;
+ sel_end.pos() = sel_end.lastpos();
+ }
+ }
+
for (size_t i = 0; i != nrows; ++i) {
Row const & row = pm.rows()[i];
pi.pain.setDrawingEnabled(inside && original_drawing_state);
RowPainter rp(pi, *text_, pit, row, bidi, x, y);
+ if (selection)
+ row.setSelection(sel_beg.pos(), sel_end.pos());
+ else
+ row.setSelection(-1, -1);
+
// Row signature; has row changed since last paint?
row.setCrc(pm.computeRowSignature(row, bparams));
bool row_has_changed = row.changed();