* \author various
* \author John Levon
*
- * Full author contact details are available in file CREDITS
+ * Full author contact details are available in file CREDITS.
*/
#include <config.h>
using namespace lyx::support;
using std::max;
+using std::endl;
using lyx::pos_type;
extern int PAPER_MARGIN;
public:
/// initialise painter
RowPainter(BufferView const & bv, LyXText const & text,
+ ParagraphList::iterator pit,
RowList::iterator rit, int y_offset, int x_offset, int y);
/// do the painting
RowPainter::RowPainter(BufferView const & bv, LyXText const & text,
- RowList::iterator rit,
+ ParagraphList::iterator pit, RowList::iterator rit,
int y_offset, int x_offset, int y)
: bv_(bv), pain_(bv_.painter()), text_(text), row_(rit),
- pit_(text.getPar(rit)),
- xo_(x_offset), yo_(y_offset), y_(y)
+ pit_(pit), xo_(x_offset), yo_(y_offset), y_(y)
{}
int RowPainter::singleWidth(lyx::pos_type pos, char c) const
{
- return text_.singleWidth(pit_, pos, c);
+ LyXFont const & font = text_.getFont(pit_, pos);
+ return text_.singleWidth(pit_, pos, c, font);
}
void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
{
pos_type pos = text_.vis2log(vpos);
- pos_type const last = lastPrintablePos(text_, pit_, row_);
+ pos_type const last = lastPrintablePos(*pit_, row_);
LyXFont orig_font = getFont(pos);
// first character
int(x_), row_->height(), LColor::selection);
pos_type const body_pos = pit_->beginningOfBody();
- pos_type const last = lastPrintablePos(text_, pit_, row_);
+ pos_type const last = lastPrintablePos(*pit_, row_);
double tmpx = x_;
for (pos_type vpos = row_->pos(); vpos <= last; ++vpos) {
tmpx -= singleWidth(body_pos - 1);
}
- if (hfillExpansion(text_, pit_, row_, pos)) {
+ if (hfillExpansion(*pit_, row_, pos)) {
tmpx += singleWidth(pos);
if (pos >= body_pos)
tmpx += hfill_;
void RowPainter::paintChangeBar()
{
pos_type const start = row_->pos();
- pos_type const end = lastPrintablePos(text_, pit_, row_);
+ pos_type const end = lastPrintablePos(*pit_, row_);
if (!pit_->isChanged(start, end))
return;
- int const height = (boost::next(row_) != text_.rows().end()
- ? row_->height() + boost::next(row_)->top_of_text()
- : row_->baseline());
+ int const height = (row_ == text_.lastRow())
+ ? row_->baseline()
+ : row_->height() + boost::next(row_)->top_of_text();
pain_.fillRectangle(4, yo_, 5, height, LColor::changebar);
}
return;
Paragraph::depth_type prev_depth = 0;
- if (row_ != text_.rows().begin())
- prev_depth = text_.getPar(boost::prior(row_))->getDepth();
- Paragraph::depth_type next_depth = 0;
+ if (row_ != text_.firstRow()) {
+ ParagraphList::iterator pit2 = pit_;
+ if (row_ == pit2->rows.begin())
+ --pit2;
+ prev_depth = pit2->getDepth();
+ }
- RowList::iterator next_row = boost::next(row_);
- if (next_row != text_.rows().end())
- next_depth = text_.getPar(next_row)->getDepth();
+ Paragraph::depth_type next_depth = 0;
+ if (row_ != text_.lastRow()) {
+ ParagraphList::iterator pit2 = pit_;
+ if (boost::next(row_) == pit2->rows.end())
+ ++pit2;
+ next_depth = pit2->getDepth();
+ }
for (Paragraph::depth_type i = 1; i <= depth; ++i) {
int const w = PAPER_MARGIN / 5;
y_top += paintAppendixStart(yo_ + y_top + 2 * defaultRowHeight());
// the top margin
- if (row_ == text_.rows().begin() && !text_.isInInset())
+ if (row_ == text_.firstRow() && !text_.isInInset())
y_top += PAPER_MARGIN;
// draw a top pagebreak
y_top += paintLengthMarker(_("Space above"), parparams.spaceTop(),
yo_ + y_top);
- Buffer const * buffer = bv_.buffer();
+ Buffer const & buffer = *bv_.buffer();
LyXLayout_ptr const & layout = pit_->layout();
- if (buffer->params.paragraph_separation == BufferParams::PARSEP_SKIP) {
+ if (buffer.params.paragraph_separation == BufferParams::PARSEP_SKIP) {
if (pit_ != text_.ownerParagraphs().begin()) {
if (layout->latextype == LATEX_PARAGRAPH
&& !pit_->getDepth()) {
- y_top += buffer->params.getDefSkip().inPixels(bv_);
+ y_top += buffer.params.getDefSkip().inPixels(bv_);
} else {
LyXLayout_ptr const & playout =
boost::prior(pit_)->layout();
if (playout->latextype == LATEX_PARAGRAPH
&& !boost::prior(pit_)->getDepth()) {
// is it right to use defskip here, too? (AS)
- y_top += buffer->params.getDefSkip().inPixels(bv_);
+ y_top += buffer.params.getDefSkip().inPixels(bv_);
}
}
}
// printed in an extra row and has a pagebreak at
// the top.
if (layout->labeltype == LABEL_COUNTER_CHAPTER) {
- if (buffer->params.secnumdepth >= 0) {
+ if (buffer.params.secnumdepth >= 0) {
float spacing_val = 1.0;
if (!parparams.spacing().isDefault()) {
spacing_val = parparams.spacing().getValue();
} else {
- spacing_val = buffer->params.spacing.getValue();
+ spacing_val = buffer.params.spacing.getValue();
}
int const maxdesc =
if (!parparams.spacing().isDefault()) {
spacing_val = parparams.spacing().getValue();
} else {
- spacing_val = buffer->params.spacing.getValue();
+ spacing_val = buffer.params.spacing.getValue();
}
int maxdesc =
int y_bottom = row_->height() - 1;
// the bottom margin
- if (boost::next(row_) == text_.rows().end() && !text_.isInInset())
+ if (row_ == text_.lastRow() && !text_.isInInset())
y_bottom -= PAPER_MARGIN;
int const ww = bv_.workWidth();
void RowPainter::paintText()
{
- pos_type const last = lastPrintablePos(text_, pit_, row_);
+ pos_type const last = lastPrintablePos(*pit_, row_);
pos_type body_pos = pit_->beginningOfBody();
if (body_pos > 0 &&
(body_pos - 1 > last || !pit_->isLineSeparator(body_pos - 1))) {
pain_.line(int(x_), y1, int(x_), y0, LColor::added_space);
- if (hfillExpansion(text_, pit_, row_, pos)) {
+ if (hfillExpansion(*pit_, row_, pos)) {
int const y2 = (y0 + y1) / 2;
if (pos >= body_pos) {
void RowPainter::paint()
{
- width_ = text_.workWidth();
-
- // FIXME: must be a cleaner way here. Aren't these calculations
- // belonging to row metrics ?
- text_.prepareToPrint(pit_, row_, x_, separator_, hfill_, label_hfill_);
+ width_ = text_.workWidth();
+ x_ = row_->x();
+ separator_ = row_->fill_separator();
+ hfill_ = row_->fill_hfill();
+ label_hfill_ = row_->fill_label_hfill();
// FIXME: what is this fixing ?
if (text_.isInInset() && x_ < 0)
if (row_->isParStart())
paintFirst();
- if (isParEnd(text_, pit_, row_))
+ if (isParEnd(*pit_, row_))
paintLast();
// paint text
}
+int paintRows(BufferView const & bv, LyXText const & text,
+ ParagraphList::iterator pit, RowList::iterator rit,
+ int xo, int y, int yf, int yo)
+{
+ //lyxerr << " paintRows: rit: " << &*rit << endl;
+ //const_cast<LyXText&>(text).updateRowPositions();
+ int const yy = yf - y;
+ int const y2 = bv.painter().paperHeight();
+
+ ParagraphList::iterator end = text.ownerParagraphs().end();
+ bool active = false;
+
+ for ( ; pit != end; ++pit) {
+ RowList::iterator row = pit->rows.begin();
+ RowList::iterator rend = pit->rows.end();
+
+ for ( ; row != rend; ++row) {
+ if (row == rit)
+ active = true;
+ if (active) {
+ RowPainter painter(bv, text, pit, row, y + yo, xo, y + bv.top_y());
+ painter.paint();
+ y += row->height();
+ if (yy + y >= y2)
+ return y;
+ } else {
+ //lyxerr << " paintRows: row: " << &*row << " ignored" << endl;
+ }
+ }
+ }
+
+ return y;
+}
+
} // namespace anon
+int paintText(BufferView & bv)
+{
+ int const topy = bv.top_y();
+ ParagraphList::iterator pit;
+ RowList::iterator rit = bv.text->getRowNearY(topy, pit);
+ int y = rit->y() - topy;
+ return paintRows(bv, *bv.text, pit, rit, 0, y, y, 0);
+}
+
+
+void paintTextInset(BufferView & bv, LyXText & text, int x, int baseline)
+{
+ RowList::iterator rit = text.firstRow();
+ RowList::iterator end = text.endRow();
+ ParagraphList::iterator pit = text.ownerParagraphs().begin();
+
+ int y_offset = baseline - rit->ascent_of_text();
+ int y = y_offset;
+ while (rit != end && y + rit->height() <= 0) {
+ y += rit->height();
+ text.nextRow(pit, rit);
+ }
+ if (y_offset < 0)
+ paintRows(bv, text, pit, rit, x, 0, y, y);
+ else
+ paintRows(bv, text, pit, rit, x, 0, y_offset, y_offset);
+}
+
+
int getLengthMarkerHeight(BufferView const & bv, VSpace const & vsp)
{
if (vsp.kind() == VSpace::NONE)
else
return max(min_size, space_size);
}
-
-
-void paintRowsHelper(BufferView const & bv, LyXText const & text,
- RowList::iterator rit, int y_offset, int x_offset, int y)
-{
- // fix up missing metrics() call for main LyXText
- // calling metrics() directly is (a) slow and (b) crashs
- if (&text == bv.text) {
-#if 1
- // make sure all insets are updated
- ParagraphList::iterator pit = text.ownerParagraphs().begin();
- ParagraphList::iterator end = text.ownerParagraphs().end();
-
- // compute inset metrics
- for (; pit != end; ++pit) {
- InsetList & insetList = pit->insetlist;
- InsetList::iterator ii = insetList.begin();
- InsetList::iterator iend = insetList.end();
- for (; ii != iend; ++ii) {
- Dimension dim;
- LyXFont font;
- MetricsInfo mi(perv(bv), font, text.workWidth());
- ii->inset->metrics(mi, dim);
- }
- }
-#else
- LyXFont font;
- Dimension dim;
- MetricsInfo mi(perv(bv), font, text.workWidth());
- const_cast<LyXText&>(text).metrics(mi, dim);
-#endif
- }
-
- RowPainter painter(bv, text, rit, y_offset, x_offset, y);
- painter.paint();
-}
-
-
-int paintRows(BufferView const & bv, LyXText const & text,
- RowList::iterator rit, int xo, int y, int yf, int y2, int yo)
-{
- RowList::iterator end = text.rows().end();
- while (rit != end && yf < y2) {
- //const_cast<LyXText &>(text).setHeightOfRow(rit);
- paintRowsHelper(bv, text, rit, y + yo, xo, y + text.top_y());
- y += rit->height();
- yf += rit->height();
- ++rit;
- }
- return y;
-}
-