]> git.lyx.org Git - lyx.git/blobdiff - src/Row.h
Fix bug #6367: Screen jumps around when using undo/redo
[lyx.git] / src / Row.h
index e93ea8735d8806a8c8479933bf0b1569e4f45589..c26752bde861c7c557630cc3ba41938612dc242b 100644 (file)
--- a/src/Row.h
+++ b/src/Row.h
@@ -5,7 +5,7 @@
  * Licence details can be found in the file COPYING.
  *
  * \author Matthias Ettrich
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  *
  * Full author contact details are available in file CREDITS.
  *
@@ -22,6 +22,8 @@
 
 namespace lyx {
 
+class DocIterator;
+
 /**
  * An on-screen row of text. A paragraph is broken into a
  * RowList for display. Each Row contains position pointers
@@ -32,35 +34,77 @@ public:
        ///
        Row();
        ///
-       Row(pos_type pos);
+       bool changed() const { return changed_; }
+       ///
+       void setChanged(bool c) { changed_ = c; }
+       ///
+       void setCrc(size_type crc) const;
+       /// Set the selection begin and end.
+       /**
+         * This is const because we update the selection status only at draw()
+         * time.
+         */
+       void setSelection(pos_type sel_beg, pos_type sel_end) const;
+       ///
+       bool selection() const;
+       /// Set the selection begin and end and whether the left and/or right
+       /// margins are selected.
+       void setSelectionAndMargins(DocIterator const & beg, 
+               DocIterator const & end) const;
+       
        ///
        void pos(pos_type p);
        ///
-       pos_type pos() const;
+       pos_type pos() const { return pos_; }
        ///
        void endpos(pos_type p);
        ///
-       pos_type endpos() const;
+       pos_type endpos() const { return end_; }
+       ///
+       void setDimension(Dimension const & dim);
        ///
        Dimension const & dimension() const { return dim_; }
        ///
        int height() const { return dim_.height(); }
        ///
-       void width(int w) { dim_.wid = w; }
-       ///
        int width() const { return dim_.wid; }
        ///
-       void ascent(int a) { dim_.asc = a; }
-       ///
        int ascent() const { return dim_.asc; }
        ///
-       void descent(int d) { dim_.des = d; }
-       ///
        int descent() const { return dim_.des; }
+
        /// current debugging only
-       void dump(const char * = "") const;
+       void dump(char const * = "") const;
+
+       /// width of a separator (i.e. space)
+       double separator;
+       /// width of hfills in the label
+       double label_hfill;
+       /// the x position of the row
+       double x;
+       ///
+       mutable pos_type sel_beg;
+       ///
+       mutable pos_type sel_end;
+       ///
+       mutable bool begin_margin_sel;
+       ///
+       mutable bool end_margin_sel;
 
 private:
+       /// Decides whether the margin is selected.
+       /**
+         * \param margin_begin
+         * \param beg
+         * \param end
+         */
+       bool isMarginSelected(bool left_margin, DocIterator const & beg,
+               DocIterator const & end) const;
+
+       /// has the Row appearance changed since last drawing?
+       mutable bool changed_;
+       /// CRC of row contents.
+       mutable size_type crc_;
        /// first pos covered by this row
        pos_type pos_;
        /// one behind last pos covered by this row
@@ -70,21 +114,6 @@ private:
 };
 
 
-class RowMetrics {
-public:
-       RowMetrics();
-       /// width of a separator (i.e. space)
-       double separator;
-       /// width of hfills in the body
-       double hfill;
-       /// width of hfills in the label
-       double label_hfill;
-       /// the x position of the row
-       double x;
-};
-
-
-
 } // namespace lyx
 
 #endif