]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.C
The bug-fix in revision 16531 introduced another bug. This is the right fix. I did...
[lyx.git] / src / paragraph.C
index afe3b71f346fbed1c9bc8ae624fada0c5f163bc3..a45454a4e9825f716685a6fda78079534152e6ca 100644 (file)
 #include "outputparams.h"
 #include "paragraph_funcs.h"
 #include "ParagraphList_fwd.h"
+
+#include "rowpainter.h"
+
 #include "sgml.h"
 #include "texrow.h"
 #include "vspace.h"
 
+#include "frontends/FontMetrics.h"
+
 #include "insets/insetbibitem.h"
 #include "insets/insetoptarg.h"
 
 #include <stack>
 #include <sstream>
 
-
-namespace lyx {
-
-using support::subst;
-
 using std::distance;
 using std::endl;
 using std::list;
@@ -66,6 +66,11 @@ using std::string;
 using std::ostream;
 using std::ostringstream;
 
+namespace lyx {
+
+using support::contains;
+using support::rsplit;
+using support::subst;
 
 Paragraph::Paragraph()
        : begin_of_body_(0), pimpl_(new Paragraph::Pimpl(this))
@@ -76,12 +81,10 @@ 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))
+       : 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,9 +106,6 @@ 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_;
@@ -599,7 +599,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 +739,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 +799,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 +808,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 +854,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;
        }
        }
@@ -1240,7 +1257,6 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf,
                        if (style->pass_thru)
                                 os.put(c);
                        else
-                                // FIXME UNICODE
                                 os << sgml::escapeChar(c);
                }
                font_old = font;
@@ -1308,7 +1324,8 @@ bool Paragraph::isRightToLeftPar(BufferParams const & bparams) const
 void Paragraph::changeLanguage(BufferParams const & bparams,
                               Language const * from, Language const * to)
 {
-       for (pos_type i = 0; i < size(); ++i) {
+       // change language including dummy font change at the end
+       for (pos_type i = 0; i <= size(); ++i) {
                LyXFont font = getFontSettings(bparams, i);
                if (font.language() == from) {
                        font.setLanguage(to);
@@ -1392,7 +1409,6 @@ docstring const Paragraph::asString(Buffer const & buffer,
 
        for (pos_type i = beg; i < end; ++i) {
                value_type const c = getUChar(buffer.params(), i);
-               // FIXME: isPrintable does not work for lyx::char_type
                if (isPrintable(c))
                        os.put(c);
                else if (c == META_INSET)
@@ -1422,6 +1438,12 @@ bool Paragraph::isChanged(pos_type start, pos_type end) const
 }
 
 
+bool Paragraph::isMergedOnEndOfParDeletion(bool trackChanges) const
+{
+       return pimpl_->isMergedOnEndOfParDeletion(trackChanges);
+}
+
+
 void Paragraph::setChange(Change const & change)
 {
        pimpl_->setChange(change);
@@ -1514,62 +1536,11 @@ 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))
                if (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 && isDigit(c))
+                       // FIXME UNICODE What does this do?
                        return c + (0xb0 - '0');
                else
                        return c;
@@ -1601,16 +1572,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))
@@ -1643,4 +1604,25 @@ bool Paragraph::hfillExpansion(Row const & row, pos_type pos) const
 }
 
 
+bool Paragraph::checkBiblio(bool track_changes)
+{
+       // Add bibitem insets if necessary
+       if (layout()->labeltype != LABEL_BIBLIO)
+               return false;
+
+       bool hasbibitem = !insetlist.empty()
+               // Insist on it being in pos 0
+               && getChar(0) == Paragraph::META_INSET
+               && insetlist.begin()->inset->lyxCode() == InsetBase::BIBITEM_CODE;
+
+       if (hasbibitem)
+               return false;
+
+       InsetBibitem * inset(new InsetBibitem(InsetCommandParams("bibitem")));
+       insertInset(0, static_cast<InsetBase *>(inset),
+               Change(track_changes ? Change::INSERTED : Change::UNCHANGED));
+
+       return true;
+}
+
 } // namespace lyx