#include "LyXRC.h"
#include "MetricsInfo.h"
#include "ParagraphParameters.h"
-#include "rowpainter.h"
+#include "RowPainter.h"
#include "Text.h"
#include "TextClass.h"
#include "VSpace.h"
bool TextMetrics::isRTL(CursorSlice const & sl, bool boundary) const
{
- if (!lyxrc.rtl_support || !sl.text())
+ if (!sl.text())
return false;
int correction = 0;
bool TextMetrics::isRTLBoundary(pit_type pit, pos_type pos) const
{
// no RTL boundary at paragraph start
- if (!lyxrc.rtl_support || pos == 0)
+ if (pos == 0)
return false;
Font const & left_font = displayFont(pit, pos - 1);
bool TextMetrics::isRTLBoundary(pit_type pit, pos_type pos,
Font const & font) const
{
- if (!lyxrc.rtl_support
- // no RTL boundary at paragraph start
- || pos == 0
+ if (// no RTL boundary at paragraph start
+ pos == 0
// if the metrics have not been calculated, then we are not
// on screen and can safely ignore issues about boundaries.
|| !contains(pit))
// FED FED| FED )
if (startpos == pos && endpos == pos && endpos != par.size()
&& (par.isNewline(pos - 1)
+ || par.isEnvSeparator(pos - 1)
|| par.isLineSeparator(pos - 1)
|| par.isSeparator(pos - 1)))
return false;
}
-int TextMetrics::getAlign(Paragraph const & par, pos_type const pos) const
+LyXAlignment TextMetrics::getAlign(Paragraph const & par, pos_type const pos) const
{
Layout const & layout = par.layout();
- int align;
+ LyXAlignment align;
if (par.params().align() == LYX_ALIGN_LAYOUT)
align = layout.align;
else
Paragraph const & par = text_->getPar(pit);
- double w = width - row.right_margin - row.width();
+ double const w = width - row.right_margin - row.width();
// FIXME: put back this assertion when the crash on new doc is solved.
//LASSERT(w >= 0, /**/);
} else if (int(row.width()) < max_width_) {
// is it block, flushleft or flushright?
// set x how you need it
- int const align = getAlign(par, row.pos());
-
- switch (align) {
+ switch (getAlign(par, row.pos())) {
case LYX_ALIGN_BLOCK: {
int const ns = numberOfSeparators(row);
/** If we have separators, and this row has
* not be broken abruptly by a display inset
* or newline, then stretch it */
- if (ns && !row.right_boundary()
+ if (ns && !row.right_boundary()
&& row.endpos() != par.size()) {
setSeparatorWidth(row, w / ns);
row.dimension().wid = width;
row.x += w;
break;
case LYX_ALIGN_CENTER:
- row.dimension().wid = width - w / 2;
+ row.dimension().wid = width - int(w / 2);
row.x += w / 2;
break;
+ case LYX_ALIGN_LEFT:
+ case LYX_ALIGN_NONE:
+ case LYX_ALIGN_LAYOUT:
+ case LYX_ALIGN_SPECIAL:
+ case LYX_ALIGN_DECIMAL:
+ break;
}
}
}
#endif
+ // Finally, handle hfill insets
pos_type const endpos = row.endpos();
pos_type body_pos = par.beginOfBody();
if (body_pos > 0
&& (body_pos > endpos || !par.isLineSeparator(body_pos - 1)))
body_pos = 0;
-
ParagraphMetrics & pm = par_metrics_[pit];
Row::iterator cit = row.begin();
Row::iterator const cend = row.end();
for ( ; cit != cend; ++cit) {
if (row.label_hfill && cit->endpos == body_pos
&& cit->type == Row::SPACE)
- cit->dim.wid -= row.label_hfill * (nlh - 1);
+ cit->dim.wid -= int(row.label_hfill * (nlh - 1));
if (!cit->inset || !cit->inset->isHfill())
continue;
if (pm.hfillExpansion(row, cit->pos))
int TextMetrics::labelFill(pit_type const pit, Row const & row) const
{
Paragraph const & par = text_->getPar(pit);
- LBUFERR(par.beginOfBody() > 0);
+ LBUFERR(par.beginOfBody() > 0 || par.isEnvSeparator(0));
- int w = 0;
+ double w = 0;
Row::const_iterator cit = row.begin();
Row::const_iterator const end = row.end();
// iterate over elements before main body (except the last one,
FontMetrics const & fm
= theFontMetrics(text_->labelFont(par));
- return max(0, fm.width(label) - w);
+ return max(0, fm.width(label) - int(w));
}
int const width = max_width_ - right_margin;
pos_type const body_pos = par.beginOfBody();
row.clear();
- row.x = leftMargin(max_width_, pit, pos);
- row.dimension().wid = row.x;
+ row.dimension().wid = leftMargin(max_width_, pit, pos);
row.right_margin = right_margin;
if (pos >= end || row.width() > width) {
// - Before a display inset
// - After a display inset
Inset const * inset = 0;
- if (par.isNewline(i)
+ if (par.isNewline(i) || par.isEnvSeparator(i)
|| (i + 1 < end && (inset = par.getInset(i + 1))
&& inset->display())
|| (!row.empty() && row.back().inset
++i;
++fi;
}
+ row.finalizeLast();
+ row.endpos(i);
// End of paragraph marker
if (lyxrc.paragraph_markers
row.addVirtual(end, docstring(1, char_type(0x00B6)), f, Change());
}
- row.finalizeLast();
- row.endpos(i);
// if the row is too large, try to cut at last separator.
- row.shorten_if_needed(body_pos, width);
+ row.shortenIfNeeded(body_pos, width);
// if the row ends with a separator that is not at end of
// paragraph, remove it
pos_type pos = row.pos();
boundary = false;
if (row.empty())
- x = row.x;
+ x = int(row.x);
else if (x <= row.x) {
pos = row.front().left_pos();
- x = row.x;
+ x = int(row.x);
} else if (x >= row.width() - row.right_margin) {
pos = row.back().right_pos();
x = row.width() - row.right_margin;
if (w <= x && w + cit->width() > x) {
double x_offset = x - w;
pos = cit->x2pos(x_offset);
- x = x_offset + w;
+ x = int(x_offset + w);
break;
}
w += cit->width();
}
/** This tests for the case where the cursor is set at the end
- * of a row which has been broken due to a display inset on
- * next row. This is indicated by Row::right_boundary.
+ * of a row which has been broken due something else than a
+ * separator (a display inset or a forced breaking of the
+ * row). We know that there is a separator when the end of the
+ * row is larger than the end of its last element.
*/
if (!row.empty() && pos == row.back().endpos
&& row.back().endpos == row.endpos())
- boundary = row.right_boundary();
+ boundary = true;
x += xo;
return pos;
bool boundary = false;
if (end != cur.lastpos()) {
if (!cur.paragraph().isLineSeparator(end-1)
- && !cur.paragraph().isNewline(end-1))
+ && !cur.paragraph().isNewline(end-1)
+ && !cur.paragraph().isEnvSeparator(end-1))
boundary = true;
else
--end;
l_margin = leftMargin(max_width, newpar);
// Remove the parindent that has been added
// if the paragraph was empty.
- if (pars[newpar].empty()) {
+ if (pars[newpar].empty() &&
+ buffer.params().paragraph_separation ==
+ BufferParams::ParagraphIndentSeparation) {
docstring pi = pars[newpar].layout().parindent;
l_margin -= theFontMetrics(
buffer.params().getFont()).signedWidth(pi);
// This happens after sections or environments in standard classes.
// We have to check the previous layout at same depth.
- if (tclass.isDefaultLayout(par.layout()) && pit > 0
- && pars[pit - 1].getDepth() >= par.getDepth()) {
+ if (buffer.params().paragraph_separation ==
+ BufferParams::ParagraphSkipSeparation)
+ parindent.erase();
+ else if (pit > 0 && pars[pit - 1].getDepth() >= par.getDepth()) {
pit_type prev = text_->depthHook(pit, par.getDepth());
- if (pars[prev < pit ? prev : pit - 1].layout().nextnoindent)
+ if (par.layout() == pars[prev].layout()) {
+ if (prev != pit - 1
+ && pars[pit - 1].layout().nextnoindent)
+ parindent.erase();
+ } else if (pars[prev].layout().nextnoindent)
parindent.erase();
}