#include "BufferList.h"
#include "BufferParams.h"
#include "bufferview_funcs.h"
+#include "callback.h" // added for Dispatch functions
#include "CoordCache.h"
#include "CutAndPaste.h"
#include "debug.h"
#include "InsetIterator.h"
#include "Language.h"
#include "LaTeXFeatures.h"
-#include "callback.h" // added for Dispatch functions
#include "LyX.h"
#include "lyxfind.h"
#include "LyXFunc.h"
#include "Layout.h"
-#include "Text.h"
-#include "TextClass.h"
#include "LyXRC.h"
-#include "Session.h"
+#include "MetricsInfo.h"
#include "Paragraph.h"
#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"
+#include "Session.h"
#include "TexRow.h"
+#include "Text.h"
+#include "TextClass.h"
#include "toc.h"
#include "Undo.h"
#include "VSpace.h"
#include "WordLangTuple.h"
-#include "MetricsInfo.h"
#include "insets/InsetBibtex.h"
#include "insets/InsetCommand.h" // ChangeRefs
#include "frontends/alert.h"
#include "frontends/FileDialog.h"
#include "frontends/FontMetrics.h"
+#include "frontends/Painter.h"
#include "frontends/Selection.h"
#include "graphics/Previews.h"
cursor_.push(buffer_.inset());
cursor_.resetAnchor();
- buffer_.text().setCurrentFont(cursor_);
+ cursor_.setCurrentFont();
if (graphics::Previews::status() != LyXRC::PREVIEW_OFF)
graphics::Previews::get().generateBufferPreviews(buffer_);
void BufferView::setCursorFromScrollbar()
{
- Text & t = buffer_.text();
+ TextMetrics & tm = text_metrics_[&buffer_.text()];
int const height = 2 * defaultRowHeight();
int const first = height;
// We reset the cursor because bv_funcs::status() does not
// work when the cursor is within mathed.
cur.reset(buffer_.inset());
- t.setCursorFromCoordinates(cur, 0, first);
+ tm.setCursorFromCoordinates(cur, 0, first);
cur.clearSelection();
break;
case bv_funcs::CUR_BELOW:
// We reset the cursor because bv_funcs::status() does not
// work when the cursor is within mathed.
cur.reset(buffer_.inset());
- t.setCursorFromCoordinates(cur, 0, last);
+ tm.setCursorFromCoordinates(cur, 0, last);
cur.clearSelection();
break;
case bv_funcs::CUR_INSIDE:
int const newy = min(last, max(y, first));
if (y != newy) {
cur.reset(buffer_.inset());
- t.setCursorFromCoordinates(cur, 0, newy);
+ tm.setCursorFromCoordinates(cur, 0, newy);
}
}
}
// Note: only bottom (document) level pit is set.
setCursor(doc_it);
// set the current font.
- buffer_.text().setCurrentFont(cursor_);
+ cursor_.setCurrentFont();
// center the screen on this new position.
center();
}
void BufferView::translateAndInsert(char_type c, Text * t, Cursor & cur)
{
if (lyxrc.rtl_support) {
- if (cursor_.innerText()->real_current_font.isRightToLeft()) {
+ if (cursor_.real_current_font.isRightToLeft()) {
if (intl_->keymap == Intl::PRIMARY)
intl_->keyMapSec();
} else {
}
-void BufferView::workAreaResize(int width, int height)
+void BufferView::resize(int width, int height)
{
// Update from work area
width_ = width;
height_ = height;
- // The complete text metrics will be redone.
- text_metrics_.clear();
updateMetrics(false);
}
Inset const * BufferView::getCoveringInset(Text const & text, int x, int y)
{
- pit_type pit = text.getPitNearY(*this, y);
+ pit_type pit = text_metrics_[&text].getPitNearY(y);
BOOST_ASSERT(pit != -1);
Paragraph const & par = text.getPar(pit);
//metrics_info_.y1 = ymin of button;
//metrics_info_.y2 = ymax of button;
//
- // Unfortunately, rowpainter.cpp:paintText() does not distinguish
+ // Unfortunately, BufferView::draw() does not distinguish
// between background updates and text updates. So we use the hammer
// solution for now. We could also avoid the updateMetrics() below
// by using the first and last pit of the CoordCache. Have a look
}
// Build temporary cursor.
- Inset * inset = buffer_.text().editXY(cur, cmd.x, cmd.y);
+ Inset * inset = text_metrics_[&buffer_.text()].editXY(cur, cmd.x, cmd.y);
// Put anchor at the same position.
cur.resetAnchor();
void BufferView::updateMetrics(bool singlepar)
{
Text & buftext = buffer_.text();
- TextMetrics & tm = textMetrics(&buftext);
pit_type size = int(buftext.paragraphs().size());
if (anchor_ref_ > int(buftext.paragraphs().size() - 1)) {
// Clear out paragraph metrics to avoid having invalid metrics
// in the cache from paragraphs not relayouted below
- tm.clear();
+ // The complete text metrics will be redone.
+ text_metrics_.clear();
}
+ TextMetrics & tm = textMetrics(&buftext);
+
// If the paragraph metrics has changed, we can not
// use the singlepar optimisation.
if (singlepar
updateMetrics(false);
}
+
+void BufferView::draw(frontend::Painter & pain)
+{
+ Text & text = buffer_.text();
+ bool const select = cursor_.selection();
+
+ PainterInfo pi(this, pain);
+ // Should the whole screen, including insets, be refreshed?
+ // FIXME: We should also distinguish DecorationUpdate to avoid text
+ // drawing if possible. This is not possible to do easily right now
+ // because of the single backing pixmap.
+ pi.full_repaint = select
+ || metrics_info_.update_strategy != SingleParUpdate;
+
+ if (pi.full_repaint)
+ // Clear background (if not delegated to rows)
+ pain.fillRectangle(0, metrics_info_.y1, width_,
+ metrics_info_.y2 - metrics_info_.y1,
+ buffer_.inset().backgroundColor());
+
+ TextMetrics const & tm = text_metrics_[&text];
+
+ if (select)
+ tm.drawSelection(pi, 0, 0);
+
+ int yy = metrics_info_.y1;
+ // draw contents
+ LYXERR(Debug::PAINTING) << "\t\t*** START DRAWING ***" << endl;
+ for (pit_type pit = metrics_info_.p1; pit <= metrics_info_.p2; ++pit) {
+ ParagraphMetrics const & pm = tm.parMetrics(pit);
+ yy += pm.ascent();
+ tm.drawParagraph(pi, pit, 0, yy);
+ yy += pm.descent();
+ }
+ LYXERR(Debug::PAINTING) << "\n\t\t*** END DRAWING ***" << endl;
+
+ // and grey out above (should not happen later)
+// lyxerr << "par ascent: " << text.getPar(metrics_info_.p1).ascent() << endl;
+ if (metrics_info_.y1 > 0
+ && metrics_info_.update_strategy == FullScreenUpdate)
+ pain.fillRectangle(0, 0, width_, metrics_info_.y1, Color::bottomarea);
+
+ // and possibly grey out below
+// lyxerr << "par descent: " << text.getPar(metrics_info_.p1).ascent() << endl;
+ if (metrics_info_.y2 < height_
+ && metrics_info_.update_strategy == FullScreenUpdate)
+ pain.fillRectangle(0, metrics_info_.y2, width_,
+ height_ - metrics_info_.y2, Color::bottomarea);
+}
+
} // namespace lyx