]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.C
ws changes only
[lyx.git] / src / paragraph.C
index dd5386c8eb7590a5c99138b08e7c397e3f5ebd77..b53949fd30a8556f4d3ec3aee142d3bd0dee2f32 100644 (file)
 #include "gettext.h"
 #include "language.h"
 #include "latexrunparams.h"
+#include "lyxfont.h"
 #include "lyxrc.h"
 #include "lyxrow.h"
 #include "texrow.h"
+#include "vspace.h"
 
 #include "insets/insetbibitem.h"
 #include "insets/insetoptarg.h"
 
 #include "support/lstrings.h"
-#include "support/LAssert.h"
 #include "support/textutils.h"
-
 #include "support/std_sstream.h"
 
+using lyx::pos_type;
 
-using namespace lyx::support;
+using lyx::support::contains;
+using lyx::support::subst;
 
+using std::endl;
+using std::string;
 using std::ostream;
 using std::ostringstream;
-using std::endl;
-
-using lyx::pos_type;
 
 
 Paragraph::Paragraph()
        : y(0), pimpl_(new Paragraph::Pimpl(this))
 {
-       enumdepth = 0;
        itemdepth = 0;
        params().clear();
 }
 
 
 Paragraph::Paragraph(Paragraph const & lp)
-       : y(0), pimpl_(new Paragraph::Pimpl(*lp.pimpl_, this))
+       : y(0), text_(lp.text_), pimpl_(new Paragraph::Pimpl(*lp.pimpl_, this))
 {
-       enumdepth = 0;
        itemdepth = 0;
        // this is because of the dummy layout of the paragraphs that
        // follow footnotes
@@ -87,10 +86,11 @@ void Paragraph::operator=(Paragraph const & lp)
 
        lyxerr << "Paragraph::operator=()" << endl;
 
+       text_ = lp.text_;
+
        delete pimpl_;
        pimpl_ = new Pimpl(*lp.pimpl_, this);
 
-       enumdepth = lp.enumdepth;
        itemdepth = lp.itemdepth;
        // this is because of the dummy layout of the paragraphs that
        // follow footnotes
@@ -282,7 +282,7 @@ void Paragraph::insertInset(pos_type pos, InsetOld * inset,
 }
 
 
-bool Paragraph::insetAllowed(InsetOld::Code code)
+bool Paragraph::insetAllowed(InsetOld_code code)
 {
        //lyxerr << "Paragraph::InsertInsetAllowed" << endl;
        if (pimpl_->inset_owner)
@@ -293,14 +293,14 @@ bool Paragraph::insetAllowed(InsetOld::Code code)
 
 InsetOld * Paragraph::getInset(pos_type pos)
 {
-       Assert(pos < size());
+       BOOST_ASSERT(pos < size());
        return insetlist.get(pos);
 }
 
 
 InsetOld const * Paragraph::getInset(pos_type pos) const
 {
-       Assert(pos < size());
+       BOOST_ASSERT(pos < size());
        return insetlist.get(pos);
 }
 
@@ -309,7 +309,7 @@ InsetOld const * Paragraph::getInset(pos_type pos) const
 LyXFont const Paragraph::getFontSettings(BufferParams const & bparams,
                                         pos_type pos) const
 {
-       Assert(pos <= size());
+       BOOST_ASSERT(pos <= size());
 
        Pimpl::FontList::const_iterator cit = pimpl_->fontlist.begin();
        Pimpl::FontList::const_iterator end = pimpl_->fontlist.end();
@@ -329,7 +329,7 @@ LyXFont const Paragraph::getFontSettings(BufferParams const & bparams,
 
 lyx::pos_type Paragraph::getEndPosOfFontSpan(lyx::pos_type pos) const
 {
-       Assert(pos <= size());
+       BOOST_ASSERT(pos <= size());
 
        Pimpl::FontList::const_iterator cit = pimpl_->fontlist.begin();
        Pimpl::FontList::const_iterator end = pimpl_->fontlist.end();
@@ -362,7 +362,7 @@ LyXFont const Paragraph::getFirstFontSettings() const
 LyXFont const Paragraph::getFont(BufferParams const & bparams, pos_type pos,
                                 LyXFont const & outerfont) const
 {
-       Assert(pos >= 0);
+       BOOST_ASSERT(pos >= 0);
 
        LyXLayout_ptr const & lout = layout();
 
@@ -406,9 +406,9 @@ LyXFont const Paragraph::getLayoutFont(BufferParams const & bparams,
 
 
 /// Returns the height of the highest font in range
-LyXFont::FONT_SIZE
+LyXFont_size
 Paragraph::highestFontInRange(pos_type startpos, pos_type endpos,
-                             LyXFont::FONT_SIZE const def_size) const
+                             LyXFont_size def_size) const
 {
        if (pimpl_->fontlist.empty())
                return def_size;
@@ -484,7 +484,7 @@ Paragraph::getUChar(BufferParams const & bparams, pos_type pos) const
 
 void Paragraph::setFont(pos_type pos, LyXFont const & font)
 {
-       Assert(pos <= size());
+       BOOST_ASSERT(pos <= size());
 
        // First, reduce font against layout/label font
        // Update: The SetCharFont() routine in text2.C already
@@ -685,6 +685,47 @@ InsetBibitem * Paragraph::bibitem() const
 }
 
 
+namespace {
+
+/* paragraphs inside floats need different alignment tags to avoid
+unwanted space */
+
+bool noTrivlistCentering(UpdatableInset const * inset)
+{
+       if (inset && inset->owner()) {
+               InsetOld::Code const code = inset->owner()->lyxCode();
+               return code == InsetOld::FLOAT_CODE ||
+                       code == InsetOld::WRAP_CODE;
+       }
+       return false;
+}
+
+
+string correction(string const & orig)
+{
+       if (orig == "flushleft")
+               return "raggedright";
+       if (orig == "flushright")
+               return "raggedleft";
+       if (orig == "center")
+               return "centering";
+       return orig;
+}
+
+
+string const corrected_env(string const & suffix, string const & env,
+                          UpdatableInset const * inset)
+{
+       string output = suffix + "{";
+       if (noTrivlistCentering(inset))
+               output += correction(env);
+       else
+               output += env;
+       return output + "}";
+}
+
+} // namespace anon
+
 
 // This could go to ParagraphParameters if we want to
 int Paragraph::startTeXParParams(BufferParams const & bparams,
@@ -719,29 +760,34 @@ int Paragraph::startTeXParParams(BufferParams const & bparams,
        case LYX_ALIGN_LAYOUT:
        case LYX_ALIGN_SPECIAL:
                break;
-       case LYX_ALIGN_LEFT:
-               if (getParLanguage(bparams)->babel() != "hebrew") {
-                       os << "\\begin{flushleft}";
-                       column += 17;
-               } else {
-                       os << "\\begin{flushright}";
-                       column += 18;
-               }
+       case LYX_ALIGN_LEFT: {
+               string output;
+               UpdatableInset const * const inset = pimpl_->inset_owner;
+               if (getParLanguage(bparams)->babel() != "hebrew")
+                       output = corrected_env("\\begin", "flushleft", inset);
+               else
+                       output = corrected_env("\\begin", "flushright", inset);
+               os << output;
+               column += output.size();
                break;
-       case LYX_ALIGN_RIGHT:
-               if (getParLanguage(bparams)->babel() != "hebrew") {
-                       os << "\\begin{flushright}";
-                       column += 18;
-               } else {
-                       os << "\\begin{flushleft}";
-                       column += 17;
-               }
+       } case LYX_ALIGN_RIGHT: {
+               string output;
+               UpdatableInset const * const inset = pimpl_->inset_owner;
+               if (getParLanguage(bparams)->babel() != "hebrew")
+                       output = corrected_env("\\begin", "flushright", inset);
+               else
+                       output = corrected_env("\\begin", "flushleft", inset);
+               os << output;
+               column += output.size();
                break;
-       case LYX_ALIGN_CENTER:
-               os << "\\begin{center}";
-               column += 14;
+       } case LYX_ALIGN_CENTER: {
+               string output;
+               output = corrected_env("\\begin", "center", pimpl_->inset_owner);
+               os << output;
+               column += output.size();
                break;
        }
+       }
 
        return column;
 }
@@ -775,29 +821,35 @@ int Paragraph::endTeXParParams(BufferParams const & bparams,
        case LYX_ALIGN_LAYOUT:
        case LYX_ALIGN_SPECIAL:
                break;
-       case LYX_ALIGN_LEFT:
-               if (getParLanguage(bparams)->babel() != "hebrew") {
-                       os << "\\end{flushleft}";
-                       column = 15;
-               } else {
-                       os << "\\end{flushright}";
-                       column = 16;
-               }
+       case LYX_ALIGN_LEFT: {
+               string output;
+               UpdatableInset const * const inset = pimpl_->inset_owner;
+               if (getParLanguage(bparams)->babel() != "hebrew")
+                       output = corrected_env("\\par\\end", "flushleft", inset);
+               else
+                       output = corrected_env("\\par\\end", "flushright", inset);
+               os << output;
+               column += output.size();
                break;
-       case LYX_ALIGN_RIGHT:
-               if (getParLanguage(bparams)->babel() != "hebrew") {
-                       os << "\\end{flushright}";
-                       column+= 16;
-               } else {
-                       os << "\\end{flushleft}";
-                       column = 15;
-               }
+       } case LYX_ALIGN_RIGHT: {
+               string output;
+               UpdatableInset const * const inset = pimpl_->inset_owner;
+               if (getParLanguage(bparams)->babel() != "hebrew")
+                       output = corrected_env("\\par\\end", "flushright", inset);
+               else
+                       output = corrected_env("\\par\\end", "flushleft", inset);
+               os << output;
+               column += output.size();
                break;
-       case LYX_ALIGN_CENTER:
-               os << "\\end{center}";
-               column = 12;
+       } case LYX_ALIGN_CENTER: {
+               string output;
+               output = corrected_env("\\par\\end", "center", pimpl_->inset_owner);
+               os << output;
+               column += output.size();
                break;
        }
+       }
+
        return column;
 }
 
@@ -816,7 +868,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
        LyXLayout_ptr style;
 
        // well we have to check if we are in an inset with unlimited
-       // lenght (all in one row) if that is true then we don't allow
+       // length (all in one row) if that is true then we don't allow
        // any special options in the paragraph and also we don't allow
        // any environment other then "Standard" to be valid!
        bool asdefault =
@@ -1004,6 +1056,17 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
 }
 
 
+namespace {
+
+/// return true if the char is a meta-character for an inset
+inline
+bool IsInsetChar(char c)
+{
+       return (c == Paragraph::META_INSET);
+}
+
+} // namespace anon
+
 
 
 bool Paragraph::isHfill(pos_type pos) const
@@ -1063,7 +1126,10 @@ bool Paragraph::isLetter(pos_type pos) const
 
 bool Paragraph::isWord(pos_type pos) const
 {
-       return IsWordChar(getChar(pos)) ;
+       unsigned char const c = getChar(pos);
+       return !(IsSeparatorChar(c)
+                 || IsKommaChar(c)
+                 || IsInsetChar(c));
 }
 
 
@@ -1160,7 +1226,7 @@ string const Paragraph::asString(Buffer const & buffer,
                        getInset(i)->ascii(buffer, os);
        }
 
-       return STRCONV(os.str());
+       return os.str();
 }
 
 
@@ -1207,14 +1273,14 @@ void Paragraph::cleanChanges()
 
 Change::Type Paragraph::lookupChange(lyx::pos_type pos) const
 {
-       Assert(!size() || pos < size());
+       BOOST_ASSERT(!size() || pos < size());
        return pimpl_->lookupChange(pos);
 }
 
 
 Change const Paragraph::lookupChangeFull(lyx::pos_type pos) const
 {
-       Assert(!size() || pos < size());
+       BOOST_ASSERT(!size() || pos < size());
        return pimpl_->lookupChangeFull(pos);
 }
 
@@ -1256,21 +1322,21 @@ void Paragraph::rejectChange(pos_type start, pos_type end)
 }
 
 
-lyx::pos_type Paragraph::size() const
+Paragraph::value_type Paragraph::getChar(pos_type pos) const
 {
-       return pimpl_->size();
-}
+       // This is in the critical path!
+       pos_type const siz = text_.size();
 
+       BOOST_ASSERT(pos <= siz);
 
-bool Paragraph::empty() const
-{
-       return pimpl_->empty();
-}
-
+       if (pos == siz) {
+               lyxerr << "getChar() on pos " << pos << " in par id "
+                      << id() << " of size " << siz
+                      << "  is a bit silly !" << endl;
+               return '\0';
+       }
 
-Paragraph::value_type Paragraph::getChar(pos_type pos) const
-{
-       return pimpl_->getChar(pos);
+       return text_[pos];
 }
 
 
@@ -1311,12 +1377,13 @@ UpdatableInset * Paragraph::inInset() const
 
 void Paragraph::clearContents()
 {
-       pimpl_->clear();
+       text_.clear();
 }
 
+
 void Paragraph::setChar(pos_type pos, value_type c)
 {
-       pimpl_->setChar(pos, c);
+       text_[pos] = c;
 }