: 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.
*/
- double pos2x(pos_type const i) const;
+ double pos2x(pos_type i) const;
/** Return character position that is the closest to
* pixel position \param x. The value \param x is
* adjusted to the actual pixel position.
- */
- pos_type x2pos(int &x) const;
+ * \param select if true, return the right edge when closer.
+ */
+ pos_type x2pos(int & x, bool select = false) const;
/** Break the element if possible, so that its width is less
* than \param w. Returns true on success. When \param force
* is true, the string is cut at any place, other wise it
// Returns the position on right side of the element.
pos_type right_pos() const;
+ //
+ bool isRTL() const { return font.isVisibleRightToLeft(); }
+ // This is true for virtual elements.
+ // Note that we do not use the type here. The two definitions
+ // should be equivalent
+ bool isVirtual() const { return pos == endpos; }
+
// The kind of row element
Type type;
// position of the element in the paragraph
void setSelectionAndMargins(DocIterator const & beg,
DocIterator const & end) const;
+ ///
+ void pit(pit_type p) { pit_ = p; }
+ ///
+ pit_type pit() const { return pit_; }
///
void pos(pos_type p) { pos_ = p; }
///
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_; }
///
int descent() const { return dim_.des; }
+ /// The offset of the left-most cursor position on the row
+ int left_x() const;
+ /// The offset of the right-most cursor position on the row
+ int right_x() const;
+
// 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,
* 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.
*/
- void 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
* This should be called once the row is completely built.
*/
void reverseRTL(bool rtl_par);
+ ///
+ bool isRTL() const { return rtl_; }
+ /// 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);
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_;
};