]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.C
Scons: handle the case when qt4 is in system directories
[lyx.git] / src / paragraph.C
index 23d34acac9191927f73c1381a21c8a46382ca050..ee256c90af60e01abd461754079e027dbada8f81 100644 (file)
@@ -56,6 +56,8 @@
 
 namespace lyx {
 
+using lyx::support::contains;
+using lyx::support::rsplit;
 using support::subst;
 
 using std::distance;
@@ -67,6 +69,88 @@ using std::ostream;
 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))
 {
@@ -76,12 +160,11 @@ Paragraph::Paragraph()
 
 
 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();
@@ -103,15 +186,14 @@ Paragraph & Paragraph::operator=(Paragraph const & par)
                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;
 }
@@ -599,7 +681,10 @@ depth_type Paragraph::getMaxDepthAfter() const
 
 char Paragraph::getAlign() const
 {
-       return params().align();
+       if (params().align() == LYX_ALIGN_LAYOUT)
+               return layout()->align;
+       else
+               return params().align();
 }
 
 
@@ -736,7 +821,21 @@ string const corrected_env(string const & suffix, string const & env,
                output += correction(env);
        else
                output += env;
-       return output + "}";
+       output += "}";
+       if (suffix == "\\begin")
+               output += "\n";
+       return output;
+}
+
+
+int adjust_column_count(string const & str, int oldcol)
+{
+       if (!contains(str, "\n"))
+               return oldcol + str.size();
+       else {
+               string tmp;
+               return rsplit(str, tmp, '\n').size();
+       }
 }
 
 } // namespace anon
@@ -782,7 +881,7 @@ int Paragraph::startTeXParParams(BufferParams const & bparams,
                else
                        output = corrected_env("\\begin", "flushright", ownerCode());
                os << from_ascii(output);
-               column += output.size();
+               column = adjust_column_count(output, column);
                break;
        } case LYX_ALIGN_RIGHT: {
                string output;
@@ -791,13 +890,13 @@ int Paragraph::startTeXParParams(BufferParams const & bparams,
                else
                        output = corrected_env("\\begin", "flushleft", ownerCode());
                os << from_ascii(output);
-               column += output.size();
+               column = adjust_column_count(output, column);
                break;
        } case LYX_ALIGN_CENTER: {
                string output;
                output = corrected_env("\\begin", "center", ownerCode());
                os << from_ascii(output);
-               column += output.size();
+               column = adjust_column_count(output, column);
                break;
        }
        }
@@ -837,26 +936,26 @@ int Paragraph::endTeXParParams(BufferParams const & bparams,
        case LYX_ALIGN_LEFT: {
                string output;
                if (getParLanguage(bparams)->babel() != "hebrew")
-                       output = corrected_env("\\par\\end", "flushleft", ownerCode());
+                       output = corrected_env("\n\\par\\end", "flushleft", ownerCode());
                else
-                       output = corrected_env("\\par\\end", "flushright", ownerCode());
+                       output = corrected_env("\n\\par\\end", "flushright", ownerCode());
                os << from_ascii(output);
-               column += output.size();
+               column = adjust_column_count(output, column);
                break;
        } case LYX_ALIGN_RIGHT: {
                string output;
                if (getParLanguage(bparams)->babel() != "hebrew")
-                       output = corrected_env("\\par\\end", "flushright", ownerCode());
+                       output = corrected_env("\n\\par\\end", "flushright", ownerCode());
                else
-                       output = corrected_env("\\par\\end", "flushleft", ownerCode());
+                       output = corrected_env("\n\\par\\end", "flushleft", ownerCode());
                os << from_ascii(output);
-               column += output.size();
+               column = adjust_column_count(output, column);
                break;
        } case LYX_ALIGN_CENTER: {
                string output;
-               output = corrected_env("\\par\\end", "center", ownerCode());
+               output = corrected_env("\n\\par\\end", "center", ownerCode());
                os << from_ascii(output);
-               column += output.size();
+               column = adjust_column_count(output, column);
                break;
        }
        }
@@ -1519,58 +1618,6 @@ bool Paragraph::allowEmpty() const
 }
 
 
-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))
@@ -1607,16 +1654,6 @@ char_type Paragraph::transformChar(char_type c, pos_type pos) const
 }
 
 
-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))