]> git.lyx.org Git - lyx.git/blobdiff - src/Row.h
Fix text direction issue for InsetInfo in RTL context
[lyx.git] / src / Row.h
index 0bd4597746616ac5dd03fb3f2a6b57a226f933f4..a42d91d3f18d30e69c38f56edcd6bdda62770fc5 100644 (file)
--- a/src/Row.h
+++ b/src/Row.h
@@ -61,11 +61,22 @@ public:
                        : type(t), pos(p), endpos(p + 1), inset(0),
                          extra(0), font(f), change(ch), final(false) {}
 
-               // Return total width of element, including separator overhead
-               double full_width() const { return dim.wid + extra * countSeparators(); }
                // Return the number of separator in the element (only STRING type)
                int countSeparators() const;
 
+               // Return total width of element, including separator overhead
+               // FIXME: Cache this value or the number of expanders?
+               double full_width() const { return dim.wid + extra * countExpanders(); }
+               // Return the number of expanding characters in the element (only STRING
+               // type).
+               int countExpanders() const;
+               // Return the amount of expansion: the number of expanding characters
+               // that get stretched during justification, times the em of the font
+               // (only STRING type).
+               int expansionAmount() const;
+               // set extra proportionally to the font em value.
+               void setExtra(double extra_per_em);
+
                /** Return position in pixels (from the left) of position
                 * \param i in the row element.
                 */
@@ -125,24 +136,45 @@ public:
 
        ///
        Row();
+       /**
+        * Helper function: set variable \c var to value \c val, and mark
+        * row as changed is the values were different. This is intended
+        * for use when changing members of the row object.
+        */
+       template<class T1, class T2>
+       void change(T1 & var, T2 const val) {
+               if (var != val)
+                       changed(true);
+               var = val;
+       }
+       /**
+        * Helper function: set variable \c var to value \c val, and mark
+        * row as changed is the values were different. This is intended
+        * for use when changing members of the row object.
+        * This is the const version, useful for mutable members.
+        */
+       template<class T1, class T2>
+       void change(T1 & var, T2 const val) const {
+               if (var != val)
+                       changed(true);
+               var = val;
+       }
        ///
        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;
+       void changed(bool c) const { changed_ = c; }
        ///
        bool selection() const;
-       /// Set the selection begin and end and whether the left and/or right
-       /// margins are selected.
+       /**
+        * Set the selection begin and end and whether the left and/or
+        * right margins are selected.
+        * This is const because we update the selection status only at
+        * draw() time.
+        */
        void setSelectionAndMargins(DocIterator const & beg,
                DocIterator const & end) const;
+       /// no selection on this row.
+       void clearSelectionAndMargins() const;
 
        ///
        void pit(pit_type p) { pit_ = p; }
@@ -160,6 +192,10 @@ public:
        void right_boundary(bool b) { right_boundary_ = b; }
        ///
        bool right_boundary() const { return right_boundary_; }
+       ///
+       void flushed(bool b) { flushed_ = b; }
+       ///
+       bool flushed() const { return flushed_; }
 
        ///
        Dimension const & dimension() const { return dim_; }
@@ -181,8 +217,10 @@ public:
 
        // Return the number of separators in the row
        int countSeparators() const;
-       // Set the extra spacing for every separator in STRING elements
-       void setSeparatorExtraWidth(double w);
+       // Set the extra spacing for every expanding character in STRING-type
+       // elements.  \param w is the total amount of extra width for the row to be
+       // distributed among expanders.  \return false if the justification fails.
+       bool setExtraWidth(int w);
 
        ///
        void add(pos_type pos, Inset const * ins, Dimension const & dim,
@@ -230,10 +268,11 @@ public:
         * separator and update endpos if necessary. If all that
         * remains is a large word, cut it to \param width.
         * \param body_pos minimum amount of text to keep.
-        * \param width maximum width of the row
+        * \param width maximum width of the row.
+        * \param available width on next row.
         * \return true if the row has been shortened.
         */
-       bool shortenIfNeeded(pos_type const body_pos, int const width);
+       bool shortenIfNeeded(pos_type const body_pos, int const width, int const next_width);
 
        /**
         * If last element of the row is a string, compute its width
@@ -246,6 +285,15 @@ public:
         * This should be called once the row is completely built.
         */
        void reverseRTL(bool rtl_par);
+       ///
+       bool isRTL() const { return rtl_; }
+       ///
+       bool needsChangeBar() const { return changebar_; }
+       ///
+       void needsChangeBar(bool ncb) { changebar_ = ncb; }
+
+       /// Find row element that contains \c pos, and compute x offset.
+       const_iterator const findElement(pos_type pos, bool boundary, double & x) const;
 
        friend std::ostream & operator<<(std::ostream & os, Row const & row);
 
@@ -273,8 +321,10 @@ private:
          * \param beg
          * \param end
          */
-       bool isMarginSelected(bool left_margin, DocIterator const & beg,
+       bool isMarginSelected(bool left, DocIterator const & beg,
                DocIterator const & end) const;
+       /// Set the selection begin and end.
+       void setSelection(pos_type sel_beg, pos_type sel_end) const;
 
        /**
         * Returns true if a char or string with font \c f and change
@@ -288,18 +338,22 @@ private:
 
        /// has the Row appearance changed since last drawing?
        mutable bool changed_;
-       /// CRC of row contents.
-       mutable size_type crc_;
        /// Index of the paragraph that contains this row
        pit_type pit_;
        /// first pos covered by this row
        pos_type pos_;
        /// one behind last pos covered by this row
        pos_type end_;
-       // Is there is a boundary at the end of the row (display inset...)
+       // Is there a boundary at the end of the row (display inset...)
        bool right_boundary_;
+       // Shall the row be flushed when it is supposed to be justified?
+       bool flushed_;
        /// Row dimension.
        Dimension dim_;
+       /// true when this row lives in a right-to-left paragraph
+       bool rtl_;
+       /// true when a changebar should be drawn in the margin
+       bool changebar_;
 };