* \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>
-#include "frontends/Painter.h"
-#include "frontends/screen.h"
-#include "frontends/font_metrics.h"
-#include "support/LAssert.h"
-#include "paragraph.h"
-#include "paragraph_funcs.h"
-#include "support/textutils.h"
+#include "rowpainter.h"
-#include "insets/insettext.h"
-#include "ParagraphParameters.h"
-#include "debug.h"
-#include "BufferView.h"
#include "buffer.h"
+#include "bufferparams.h"
+#include "BufferView.h"
+#include "encoding.h"
#include "gettext.h"
#include "language.h"
-#include "encoding.h"
-#include "lyxtext.h"
-#include "rowpainter.h"
+#include "LColor.h"
#include "lyxrc.h"
+#include "lyxrow.h"
#include "lyxrow_funcs.h"
#include "metricsinfo.h"
+#include "paragraph.h"
+#include "paragraph_funcs.h"
+#include "ParagraphParameters.h"
+#include "vspace.h"
-#include <algorithm>
+#include "frontends/font_metrics.h"
+#include "frontends/Painter.h"
+
+#include "insets/insettext.h"
+
+#include "support/textutils.h"
-using namespace lyx::support;
-using std::max;
using lyx::pos_type;
+using std::max;
+using std::string;
extern int PAPER_MARGIN;
extern int CHANGEBAR_MARGIN;
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);
}
{
InsetOld * inset = const_cast<InsetOld*>(pit_->getInset(pos));
- Assert(inset);
+ BOOST_ASSERT(inset);
PainterInfo pi(perv(bv_));
pi.base.font = getFont(pos);
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 = lastPos(*pit_, row_);
LyXFont orig_font = getFont(pos);
// first character
return;
if (orig_font.language() == latex_language)
return;
- if (orig_font.language() == bv_.buffer()->params.language)
+ if (orig_font.language() == bv_.buffer()->params().language)
return;
int const y = yo_ + row_->baseline() + 1;
char const c = pit_->getChar(pos);
- if (IsInsetChar(c)) {
+ if (c == Paragraph::META_INSET) {
paintInset(pos);
++vpos;
paintForeignMark(orig_x, orig_font);
void RowPainter::paintSelection()
{
- bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params);
+ bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params());
// the current selection
int const startx = text_.selection.start.x();
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 = lastPos(*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 = lastPos(*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);
}
Paragraph::depth_type prev_depth = 0;
if (row_ != text_.firstRow()) {
ParagraphList::iterator pit2 = pit_;
- if (row_ == text_.beginRow(pit2))
+ if (row_ == pit2->rows.begin())
--pit2;
prev_depth = pit2->getDepth();
}
Paragraph::depth_type next_depth = 0;
if (row_ != text_.lastRow()) {
ParagraphList::iterator pit2 = pit_;
- if (boost::next(row_) == text_.endRow(pit2))
+ if (boost::next(row_) == pit2->rows.end())
++pit2;
next_depth = pit2->getDepth();
}
int d = 0;
LyXFont font;
- font.setColor(LColor::added_space).decSize().decSize();
+ font.setColor(LColor::added_space);
+ font.decSize();
+ font.decSize();
font_metrics::rectText(str, font, w, a, d);
pain_.rectText(leftx + 2 * arrow_size + 5,
- start + ((end - start) / 2) + d,
- str, font);
+ start + ((end - start) / 2) + d,
+ str, font,
+ LColor::none, LColor::none);
// top arrow
pain_.line(leftx, ty1, midx, ty2, LColor::added_space);
int RowPainter::paintPageBreak(string const & label, int y)
{
LyXFont pb_font;
- pb_font.setColor(LColor::pagebreak).decSize();
+ pb_font.setColor(LColor::pagebreak);
+ pb_font.decSize();
int w = 0;
int a = 0;
int const text_start = int(xo_ + (width_ - w) / 2);
int const text_end = text_start + w;
- pain_.rectText(text_start, y + d, label, pb_font);
+ pain_.rectText(text_start, y + d, label, pb_font, LColor::none, LColor::none);
pain_.line(int(xo_), y, text_start, y,
- LColor::pagebreak, Painter::line_onoffdash);
+ LColor::pagebreak, Painter::line_onoffdash);
pain_.line(text_end, y, int(xo_ + width_), y,
- LColor::pagebreak, Painter::line_onoffdash);
+ LColor::pagebreak, Painter::line_onoffdash);
return 3 * defaultRowHeight();
}
int RowPainter::paintAppendixStart(int y)
{
LyXFont pb_font;
- pb_font.setColor(LColor::appendix).decSize();
+ pb_font.setColor(LColor::appendix);
+ pb_font.decSize();
string const label = _("Appendix");
int w = 0;
int const text_start = int(xo_ + (width_ - w) / 2);
int const text_end = text_start + w;
- pain_.rectText(text_start, y + d, label, pb_font);
+ pain_.rectText(text_start, y + d, label, pb_font, LColor::none, LColor::none);
pain_.line(int(xo_ + 1), y, text_start, y, LColor::appendix);
pain_.line(text_end, y, int(xo_ + width_ - 2), y, LColor::appendix);
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_);
}
}
}
y_top += asc;
}
- bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params);
+ bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params());
// should we print a label?
if (layout->labeltype >= LABEL_STATIC
// this is special code for the chapter layout. This is
// printed in an extra row and has a pagebreak at
// the top.
- if (layout->labeltype == LABEL_COUNTER_CHAPTER) {
- if (buffer->params.secnumdepth >= 0) {
+ if (layout->counter == "chapter") {
+ 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();
y_bottom -= asc;
}
- bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params);
+ bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params());
int const endlabel = getEndLabel(pit_, text_.ownerParagraphs());
// draw an endlabel
void RowPainter::paintText()
{
- pos_type const last = lastPrintablePos(text_, pit_, row_);
+ pos_type const last = lastPos(*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 paintRow(BufferView const & bv, LyXText const & text,
- ParagraphList::iterator pit,
- 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, pit, 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);
- ParagraphList::iterator pit = text.getPar(rit);
- paintRow(bv, text, pit, rit, y + yo, xo, y + text.top_y());
- y += rit->height();
- yf += rit->height();
- ++rit;
- }
- return y;
-}
-