#include "BufferParams.h"
#include "BufferView.h"
#include "CoordCache.h"
+#include "Cursor.h"
#include "CutAndPaste.h"
#include "debug.h"
#include "FontIterator.h"
#include "ParIterator.h"
#include "rowpainter.h"
#include "Text.h"
+#include "TextClass.h"
#include "VSpace.h"
#include "mathed/MacroTable.h"
// when layout is set; when material is pasted.
int const moveCursor = par.checkBiblio(buffer.params().trackChanges);
if (moveCursor > 0)
- const_cast<Cursor &>(bv_->cursor()).posRight();
+ const_cast<Cursor &>(bv_->cursor()).posForward();
else if (moveCursor < 0) {
Cursor & cursor = const_cast<Cursor &>(bv_->cursor());
if (cursor.pos() >= -moveCursor)
- cursor.posLeft();
+ cursor.posBackward();
}
// Optimisation: this is used in the next two loops
pit_type TextMetrics::getPitNearY(int y)
{
BOOST_ASSERT(!text_->paragraphs().empty());
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
- << ": y: " << y << " cache size: " << par_metrics_.size()
- << endl;
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
+ << ": y: " << y << " cache size: " << par_metrics_.size());
// look for highest numbered paragraph with y coordinate less than given y
pit_type pit = 0;
}
for (; it != et; ++it) {
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
<< " examining: pit: " << it->first
- << " y: " << it->second.position()
- << endl;
+ << " y: " << it->second.position());
ParagraphMetrics const & pm = par_metrics_[it->first];
}
}
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
- << ": found best y: " << yy << " for pit: " << pit
- << endl;
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
+ << ": found best y: " << yy << " for pit: " << pit);
return pit;
}
ParagraphMetrics const & pm = par_metrics_[pit];
int yy = pm.position() - pm.ascent();
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
- << ": x: " << x
- << " y: " << y
- << " pit: " << pit
- << " yy: " << yy << endl;
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
+ << ": x: " << x << " y: " << y << " pit: " << pit << " yy: " << yy);
int r = 0;
BOOST_ASSERT(pm.rows().size());
Row const & row = pm.rows()[r];
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
- << ": row " << r
- << " from pos: " << row.pos()
- << endl;
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
+ << ": row " << r << " from pos: " << row.pos());
bool bound = false;
int xx = x;
pos_type const pos = row.pos() + getColumnNearX(pit, row, xx, bound);
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
- << ": setting cursor pit: " << pit
- << " pos: " << pos
- << endl;
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
+ << ": setting cursor pit: " << pit << " pos: " << pos);
text_->setCursor(cur, pit, pos, true, bound);
// remember new position.
Paragraph const & par = text_->paragraphs()[pit];
ParagraphMetrics const & pm = par_metrics_[pit];
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
- << ": x: " << x
- << " y: " << y
- << " pit: " << pit
- << endl;
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
+ << ": x: " << x << " y: " << y << " pit: " << pit);
+
InsetList::const_iterator iit = par.insetList().begin();
InsetList::const_iterator iend = par.insetList().end();
for (; iit != iend; ++iit) {
Inset * inset = iit->inset;
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
- << ": examining inset " << inset << endl;
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
+ << ": examining inset " << inset);
if (!bv_->coordCache().getInsets().has(inset)) {
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
- << ": inset has no cached position" << endl;
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
+ << ": inset has no cached position");
return 0;
}
Dimension const & dim = pm.insetDimension(inset);
Point p = bv_->coordCache().getInsets().xy(inset);
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
<< ": xo: " << p.x_ << "..." << p.x_ + dim.wid
- << " yo: " << p.y_ - dim.asc << "..." << p.y_ + dim.des
- << endl;
+ << " yo: " << p.y_ - dim.asc << "..." << p.y_ + dim.des);
if (x >= p.x_
&& x <= p.x_ + dim.wid
&& y >= p.y_ - dim.asc
&& y <= p.y_ + dim.des) {
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
- << ": Hit inset: " << inset << endl;
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION
+ << ": Hit inset: " << inset);
return inset;
}
}
- LYXERR(Debug::DEBUG)
- << BOOST_CURRENT_FUNCTION
- << ": No inset hit. " << endl;
+ LYXERR(Debug::DEBUG, BOOST_CURRENT_FUNCTION << ": No inset hit. ");
return 0;
}
Bidi bidi;
+ bool const original_drawing_state = pi.pain.isDrawingEnabled();
+
y -= rb->ascent();
for (RowList::const_iterator rit = rb; rit != re; ++rit) {
y += rit->ascent();
bool const inside = (y + rit->descent() >= 0
&& y - rit->ascent() < ww);
// it is not needed to draw on screen if we are not inside.
- pi.pain.setDrawingEnabled(inside);
+ pi.pain.setDrawingEnabled(inside && original_drawing_state);
RowPainter rp(pi, *text_, pit, *rit, bidi, x, y);
// Row signature; has row changed since last paint?
if (row_selection) {
DocIterator beg = bv_->cursor().selectionBegin();
DocIterator end = bv_->cursor().selectionEnd();
+ bool const beg_margin = beg.pit() < pit;
+ bool const end_margin = end.pit() > pit;
beg.pit() = pit;
beg.pos() = rit->sel_beg;
- if (pit == end.pit()) {
- end.pos() = rit->sel_end;
- } else {
- end.pit() = pit + 1;
- end.pos() = 0;
- }
- drawSelection(pi, beg, end, x);
+ end.pit() = pit;
+ end.pos() = rit->sel_end;
+ drawRowSelection(pi, x, *rit, beg, end, beg_margin, end_margin);
}
// Instrumentation for testing row cache (see also
// 12 lines lower):
if (lyxerr.debugging(Debug::PAINTING)) {
if (text_->isMainText(bv_->buffer()))
- LYXERR(Debug::PAINTING) << "\n{" << inside <<
- pi.full_repaint << row_has_changed << "}";
+ LYXERR(Debug::PAINTING, "\n{" << inside <<
+ pi.full_repaint << row_has_changed << "}");
else
- LYXERR(Debug::PAINTING) << "[" << inside <<
- pi.full_repaint << row_has_changed << "]";
+ LYXERR(Debug::PAINTING, "[" << inside <<
+ pi.full_repaint << row_has_changed << "]");
}
// Backup full_repaint status and force full repaint
pi.full_repaint = tmp;
}
// Re-enable screen drawing for future use of the painter.
- pi.pain.setDrawingEnabled(true);
+ pi.pain.setDrawingEnabled(original_drawing_state);
//LYXERR(Debug::PAINTING) << "." << endl;
}
-// FIXME: only take care of one row!
-void TextMetrics::drawSelection(PainterInfo & pi,
- DocIterator const & beg, DocIterator const & end, int x) const
-{
- ParagraphMetrics const & pm1 = parMetrics(beg.pit());
- ParagraphMetrics const & pm2 = parMetrics(end.pit());
- Row const & row1 = pm1.getRow(beg.pos(), beg.boundary());
- Row const & row2 = pm2.getRow(end.pos(), end.boundary());
-
- // clip above
- int middleTop;
- bool const clipAbove = (bv_->cursorStatus(beg) == CUR_ABOVE);
- if (clipAbove)
- middleTop = 0;
- else
- middleTop = bv_->getPos(beg, beg.boundary()).y_ + row1.descent();
-
- // clip below
- int middleBottom;
- bool const clipBelow = (bv_->cursorStatus(end) == CUR_BELOW);
- if (clipBelow)
- middleBottom = bv_->workHeight();
- else
- middleBottom = bv_->getPos(end, end.boundary()).y_ - row2.ascent();
-
- // start and end in the same line?
- if (!clipAbove && !clipBelow && &row1 == &row2)
- // then only draw this row's selection
- drawRowSelection(pi, x, row1, beg, end, false, false);
- else {
- if (!clipAbove) {
- // get row end
- DocIterator begRowEnd = beg;
- begRowEnd.pos() = row1.endpos();
- begRowEnd.boundary(true);
-
- // draw upper rectangle
- drawRowSelection(pi, x, row1, beg, begRowEnd, false, true);
- }
-
- if (middleTop < middleBottom) {
- // draw middle rectangle
- pi.pain.fillRectangle(x, middleTop, width(), middleBottom - middleTop,
- Color_selection);
- }
-
- if (!clipBelow) {
- // get row begin
- DocIterator endRowBeg = end;
- endRowBeg.pos() = row2.pos();
- endRowBeg.boundary(false);
-
- // draw low rectangle
- drawRowSelection(pi, x, row2, endRowBeg, end, true, false);
- }
- }
-}
-
-
void TextMetrics::drawRowSelection(PainterInfo & pi, int x, Row const & row,
DocIterator const & beg, DocIterator const & end,
bool drawOnBegMargin, bool drawOnEndMargin) const