using std::ostringstream;
+ParagraphMetrics::ParagraphMetrics()
+{
+}
+
+
+ParagraphMetrics::ParagraphMetrics(ParagraphMetrics const & pm)
+ : dim_(pm.dim_), rows_(pm.rows_), rowSignature_(pm.rowSignature_)
+{
+}
+
+
+ParagraphMetrics & ParagraphMetrics::operator=(ParagraphMetrics const & pm)
+{
+ rows_ = pm.rows_;
+ dim_ = pm.dim_;
+ rowSignature_ = pm.rowSignature_;
+ return *this;
+}
+
+
+Row & ParagraphMetrics::getRow(pos_type pos, bool boundary)
+{
+ BOOST_ASSERT(!rows().empty());
+
+ // If boundary is set we should return the row on which
+ // the character before is inside.
+ if (pos > 0 && boundary)
+ --pos;
+
+ RowList::iterator rit = rows_.end();
+ RowList::iterator const begin = rows_.begin();
+
+ for (--rit; rit != begin && rit->pos() > pos; --rit)
+ ;
+
+ return *rit;
+}
+
+
+Row const & ParagraphMetrics::getRow(pos_type pos, bool boundary) const
+{
+ BOOST_ASSERT(!rows().empty());
+
+ // If boundary is set we should return the row on which
+ // the character before is inside.
+ if (pos > 0 && boundary)
+ --pos;
+
+ RowList::const_iterator rit = rows_.end();
+ RowList::const_iterator const begin = rows_.begin();
+
+ for (--rit; rit != begin && rit->pos() > pos; --rit)
+ ;
+
+ return *rit;
+}
+
+
+size_t ParagraphMetrics::pos2row(pos_type pos) const
+{
+ BOOST_ASSERT(!rows().empty());
+
+ RowList::const_iterator rit = rows_.end();
+ RowList::const_iterator const begin = rows_.begin();
+
+ for (--rit; rit != begin && rit->pos() > pos; --rit)
+ ;
+
+ return rit - begin;
+}
+
+
+void ParagraphMetrics::dump() const
+{
+ lyxerr << "Paragraph::dump: rows.size(): " << rows_.size() << endl;
+ for (size_t i = 0; i != rows_.size(); ++i) {
+ lyxerr << " row " << i << ": ";
+ rows_[i].dump();
+ }
+}
+
+
Paragraph::Paragraph()
: begin_of_body_(0), pimpl_(new Paragraph::Pimpl(this))
{
Paragraph::Paragraph(Paragraph const & par)
- : itemdepth(par.itemdepth), insetlist(par.insetlist),
- dim_(par.dim_),
- rows_(par.rows_), rowSignature_(par.rowSignature_),
- layout_(par.layout_),
- text_(par.text_), begin_of_body_(par.begin_of_body_),
- pimpl_(new Paragraph::Pimpl(*par.pimpl_, this))
+ : ParagraphMetrics(par),
+ itemdepth(par.itemdepth), insetlist(par.insetlist),
+ layout_(par.layout_),
+ text_(par.text_), begin_of_body_(par.begin_of_body_),
+ pimpl_(new Paragraph::Pimpl(*par.pimpl_, this))
{
//lyxerr << "Paragraph::Paragraph(Paragraph const&)" << endl;
InsetList::iterator it = insetlist.begin();
for (; it != end; ++it)
it->inset = it->inset->clone().release();
- rows_ = par.rows_;
- dim_ = par.dim_;
- rowSignature_ = par.rowSignature_;
layout_ = par.layout();
text_ = par.text_;
begin_of_body_ = par.begin_of_body_;
delete pimpl_;
pimpl_ = new Pimpl(*par.pimpl_, this);
+
+ ParagraphMetrics::operator=(par);
}
return *this;
}
}
-Row & Paragraph::getRow(pos_type pos, bool boundary)
-{
- BOOST_ASSERT(!rows().empty());
-
- // If boundary is set we should return the row on which
- // the character before is inside.
- if (pos > 0 && boundary)
- --pos;
-
- RowList::iterator rit = rows_.end();
- RowList::iterator const begin = rows_.begin();
-
- for (--rit; rit != begin && rit->pos() > pos; --rit)
- ;
-
- return *rit;
-}
-
-
-Row const & Paragraph::getRow(pos_type pos, bool boundary) const
-{
- BOOST_ASSERT(!rows().empty());
-
- // If boundary is set we should return the row on which
- // the character before is inside.
- if (pos > 0 && boundary)
- --pos;
-
- RowList::const_iterator rit = rows_.end();
- RowList::const_iterator const begin = rows_.begin();
-
- for (--rit; rit != begin && rit->pos() > pos; --rit)
- ;
-
- return *rit;
-}
-
-
-size_t Paragraph::pos2row(pos_type pos) const
-{
- BOOST_ASSERT(!rows().empty());
-
- RowList::const_iterator rit = rows_.end();
- RowList::const_iterator const begin = rows_.begin();
-
- for (--rit; rit != begin && rit->pos() > pos; --rit)
- ;
-
- return rit - begin;
-}
-
-
char_type Paragraph::transformChar(char_type c, pos_type pos) const
{
if (!Encodings::is_arabic(c))
}
-void Paragraph::dump() const
-{
- lyxerr << "Paragraph::dump: rows.size(): " << rows_.size() << endl;
- for (size_t i = 0; i != rows_.size(); ++i) {
- lyxerr << " row " << i << ": ";
- rows_[i].dump();
- }
-}
-
-
bool Paragraph::hfillExpansion(Row const & row, pos_type pos) const
{
if (!isHfill(pos))
pos_type first, last;
};
+/// Helper class for Paragraph Metrics.
+/// \todo FIXME: this class deserves its own .[Ch] files.
+/// Then, the storage of such object should be done in \c BufferView
+/// (most probably in the \c CoordCache class along \c Point objects).
+class ParagraphMetrics {
+public:
+ ParagraphMetrics();
+ ParagraphMetrics(ParagraphMetrics const & pm);
+ ParagraphMetrics & operator=(ParagraphMetrics const & pm);
+ ///
+ Row & getRow(pos_type pos, bool boundary);
+ ///
+ Row const & getRow(pos_type pos, bool boundary) const;
+ ///
+ size_t pos2row(pos_type pos) const;
+
+ /// LyXText::redoParagraph updates this
+ Dimension & dim() { return dim_; }
+ /// total height of paragraph
+ unsigned int height() const { return dim_.height(); }
+ /// total width of paragraph, may differ from workwidth
+ unsigned int width() const { return dim_.width(); }
+ /// ascend of paragraph above baseline
+ unsigned int ascent() const { return dim_.ascent(); }
+ /// descend of paragraph below baseline
+ unsigned int descent() const { return dim_.descent(); }
+ /// LyXText updates the rows using this access point
+ RowList & rows() { return rows_; }
+ /// The painter and others use this
+ RowList const & rows() const { return rows_; }
+ ///
+ RowSignature & rowSignature() const { return rowSignature_; }
+
+ /// dump some information to lyxerr
+ void dump() const;
+
+private:
+ ///
+ mutable RowList rows_;
+ ///
+ mutable RowSignature rowSignature_;
+ /// cached dimensions of paragraph
+ Dimension dim_;
+};
+
/// A Paragraph holds all text, attributes and insets in a text paragraph
-class Paragraph {
+/// \todo FIXME: any reference to ParagraphMetrics (including inheritance)
+/// should go in order to complete the Model/View separation of this class.
+class Paragraph: public ParagraphMetrics {
public:
///
enum {
ParagraphParameters & params();
///
ParagraphParameters const & params() const;
-
- ///
- Row & getRow(pos_type pos, bool boundary);
- ///
- Row const & getRow(pos_type pos, bool boundary) const;
- ///
- size_t pos2row(pos_type pos) const;
-
- /// total height of paragraph
- unsigned int height() const { return dim_.height(); }
- /// total width of paragraph, may differ from workwidth
- unsigned int width() const { return dim_.width(); }
- /// ascend of paragraph above baseline
- unsigned int ascent() const { return dim_.ascent(); }
- /// descend of paragraph below baseline
- unsigned int descent() const { return dim_.descent(); }
- /// LyXText updates the rows using this access point
- RowList & rows() { return rows_; }
- /// The painter and others use this
- RowList const & rows() const { return rows_; }
- ///
- RowSignature & rowSignature() const { return rowSignature_; }
///
bool hfillExpansion(Row const & row, pos_type pos) const;
- /// LyXText::redoParagraph updates this
- Dimension & dim() { return dim_; }
-
- /// dump some information to lyxerr
- void dump() const;
-
public:
///
InsetList insetlist;
private:
- /// cached dimensions of paragraph
- Dimension dim_;
-
- ///
- mutable RowList rows_;
- ///
- mutable RowSignature rowSignature_;
///
LyXLayout_ptr layout_;
Pimpl * pimpl_;
};
-
} // namespace lyx
#endif // PARAGRAPH_H