]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.h
Avoid full metrics computation with Update:FitCursor
[lyx.git] / src / TextMetrics.h
index b370b1e3a3b0e950af00630c9aeee1a96442c850..d5606b610a396661046fd56f1a89d5d71acf895f 100644 (file)
 
 #include "support/types.h"
 
+#include <map>
+
 namespace lyx {
 
 class BufferView;
 class Cursor;
 class CursorSlice;
-class DocIterator;
 class MetricsInfo;
 class Text;
 
@@ -38,17 +39,18 @@ class TextMetrics
        void operator=(TextMetrics const &);
 public:
        /// Default constructor (only here for STL containers).
-       TextMetrics() : bv_(0), text_(0), max_width_(0) {}
+       TextMetrics() : bv_(0), text_(0), max_width_(0), tight_(false) {}
        /// The only useful constructor.
        TextMetrics(BufferView *, Text *);
 
        ///
        bool contains(pit_type pit) const;
        ///
-       pit_type firstPit() const;
+       void forget(pit_type pit);
        ///
-       pit_type lastPit() const;
-
+       std::pair<pit_type, ParagraphMetrics const *> first() const;
+       ///
+       std::pair<pit_type, ParagraphMetrics const *> last() const;
        /// is this row the last in the text?
        bool isLastRow(Row const & row) const;
        /// is this row the first in the text?
@@ -61,30 +63,41 @@ public:
        ///
        Point const & origin() const { return origin_; }
 
-
        ///
        ParagraphMetrics const & parMetrics(pit_type) const;
+       ///
+       ParagraphMetrics & parMetrics(pit_type);
+
        ///
        void newParMetricsDown();
        ///
        void newParMetricsUp();
 
+       /// Update metrics up to \c bv_height. Only usable for main text (for now).
+       void updateMetrics(pit_type const anchor_pit, int const anchor_ypos,
+                       int const bv_height);
+
        /// compute text metrics.
-       bool metrics(MetricsInfo & mi, Dimension & dim, int min_width = 0,
-                    bool const expand_on_multipars = true);
+       bool metrics(MetricsInfo const & mi, Dimension & dim, int min_width = 0);
 
        /// The "nodraw" drawing stage for one single paragraph: set the
-       /// positions of the insets contained this paragraph in metrics
+       /// positions of the insets contained in this paragraph in metrics
        /// cache. Related to BufferView::updatePosCache.
        void updatePosCache(pit_type pit) const;
 
-       /// Gets the fully instantiated font at a given position in a paragraph
+       /// Gets the fully instantiated font at a given position in a paragraph.
        /// Basically the same routine as Paragraph::getFont() in Paragraph.cpp.
        /// The difference is that this one is used for displaying, and thus we
        /// are allowed to make cosmetic improvements. For instance make footnotes
        /// smaller. (Asger)
        Font displayFont(pit_type pit, pos_type pos) const;
 
+       /// Gets the fully instantiated label font of a paragraph.
+       /// Basically the same routine as displayFont, but specialized for
+       /// a layout font.
+       Font labelDisplayFont(pit_type pit) const;
+
+
        /// There are currently two font mechanisms in LyX:
        /// 1. The font attributes in a lyxtext, and
        /// 2. The inset-specific font properties, defined in an inset's
@@ -97,11 +110,9 @@ public:
        /// is this position in the paragraph right-to-left?
        bool isRTL(CursorSlice const & sl, bool boundary) const;
        /// is between pos-1 and pos an RTL<->LTR boundary?
-       bool isRTLBoundary(pit_type pit,
-         pos_type pos) const;
+       bool isRTLBoundary(pit_type pit, pos_type pos) const;
        /// would be a RTL<->LTR boundary between pos and the given font?
-       bool isRTLBoundary(pit_type pit,
-         pos_type pos, Font const & font) const;
+       bool isRTLBoundary(pit_type pit, pos_type pos, Font const & font) const;
 
 
        /// Rebreaks the given paragraph.
@@ -122,16 +133,21 @@ public:
        /// current text height.
        int height() const { return dim_.height(); }
 
+       /**
+        * Returns the left beginning of a row starting at \c pos.
+        * This information cannot be taken from the layout object, because
+        * in LaTeX the beginning of the text fits in some cases
+        * (for example sections) exactly the label-width.
+        */
+       int leftMargin(pit_type pit, pos_type pos) const;
+       /// Return the left beginning of a row which is not the first one.
+       /// This is the left margin when there is no indentation.
+       int leftMargin(pit_type pit) const;
+
        ///
        int rightMargin(ParagraphMetrics const & pm) const;
-       ///
        int rightMargin(pit_type const pit) const;
 
-       /// position of the top of the first paragraph.
-       int topPosition() const;
-       /// position of the bottom of the last paragraph.
-       int bottomPosition() const;
-
        ///
        void draw(PainterInfo & pi, int x, int y) const;
 
@@ -141,25 +157,14 @@ private:
        ///
        ParagraphMetrics & parMetrics(pit_type, bool redo_paragraph);
 
-       /**
-        * Returns the left beginning of the text.
-        * This information cannot be taken from the layout object, because
-        * in LaTeX the beginning of the text fits in some cases
-        * (for example sections) exactly the label-width.
-        */
-       int leftMargin(pit_type pit, pos_type pos) const;
-       int leftMargin(pit_type pit) const;
-
        /// the minimum space a manual label needs on the screen in pixels
        int labelFill(Row const & row) const;
 
-       /// FIXME??
-       int labelEnd(pit_type const pit) const;
+       // Turn paragraph oh index \c pit into a single row
+       Row tokenizeParagraph(pit_type pit) const;
 
-       /// sets row.end to the pos value *after* which a row should break.
-       /// for example, the pos after which isNewLine(pos) == true
-       /// \return true when another row is required (after a newline)
-       bool breakRow(Row & row, int right_margin) const;
+       // Break the row produced by tokenizeParagraph() into a list of rows.
+       RowList breakParagraph(Row const & row) const;
 
        // Expands the alignment of row \param row in paragraph \param par
        LyXAlignment getAlign(Paragraph const & par, Row const & row) const;
@@ -225,9 +230,9 @@ public:
        void setCursorFromCoordinates(Cursor & cur, int x, int y);
 
        ///
-       int cursorX(CursorSlice const & cursor, bool boundary) const;
+       int cursorX(CursorSlice const & sl, bool boundary) const;
        ///
-       int cursorY(CursorSlice const & cursor, bool boundary) const;
+       int cursorY(CursorSlice const & sl, bool boundary) const;
 
        ///
        bool cursorHome(Cursor & cur);
@@ -247,7 +252,6 @@ public:
                Dimension & dim) const;
 
 private:
-       friend class BufferView;
 
        /// The BufferView owner.
        BufferView * bv_;
@@ -262,6 +266,8 @@ private:
        mutable ParMetricsCache par_metrics_;
        Dimension dim_;
        int max_width_;
+       /// if true, do not expand insets to max width artificially
+       bool tight_;
        mutable Point origin_;
 
 // temporary public: