]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.C
More fixes to insettabular/text (and some missing features added).
[lyx.git] / src / paragraph.C
index 6dc1e816444c9fd7341f349d28b6d2d2309bbafb..e0d4cb9ec28f0ae613c566f60ca9982a8a4c71cd 100644 (file)
@@ -68,8 +68,9 @@ unsigned int LyXParagraph::paragraph_id = 0;
 
 LyXParagraph::LyXParagraph()
 {
+#ifndef HAVE_ROPE
        text.reserve(500); // is this number too big?
-
+#endif
        for (int i = 0; i < 10; ++i) setCounter(i , 0);
        appendix = false;
        enumdepth = 0;
@@ -92,9 +93,11 @@ LyXParagraph::LyXParagraph()
 // This konstruktor inserts the new paragraph in a list.
 LyXParagraph::LyXParagraph(LyXParagraph * par)
 {
+#ifndef HAVE_ROPE
        text.reserve(500);
-       par->text.resize(par->text.size());
-
+#endif
+       par->fitToSize();
+       
        for (int i = 0; i < 10; ++i) setCounter(i, 0);
        appendix = false;
        enumdepth = 0;
@@ -261,7 +264,7 @@ void LyXParagraph::writeFile(Buffer const * buf, ostream & os,
                        font1 = font2;
                }
 
-               value_type c = GetChar(i);
+               value_type const c = GetChar(i);
                switch (c) {
                case META_INSET:
                {
@@ -404,15 +407,17 @@ void LyXParagraph::validate(LaTeXFeatures & features) const
 
 
 // First few functions needed for cut and paste and paragraph breaking.
-void LyXParagraph::CopyIntoMinibuffer(BufferParams const & bparams,
+void LyXParagraph::CopyIntoMinibuffer(Buffer const & buffer,
                                      LyXParagraph::size_type pos) const
 {
+       BufferParams bparams = buffer.params;
+
        minibuffer_char = GetChar(pos);
        minibuffer_font = GetFontSettings(bparams, pos);
        minibuffer_inset = 0;
        if (minibuffer_char == LyXParagraph::META_INSET) {
                if (GetInset(pos)) {
-                       minibuffer_inset = GetInset(pos)->Clone(*current_view->buffer());
+                       minibuffer_inset = GetInset(pos)->Clone(buffer);
                } else {
                        minibuffer_inset = 0;
                        minibuffer_char = ' ';
@@ -555,8 +560,11 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos)
                                insetlist.erase(it);
                        }
                }
+#ifndef HAVE_ROPE
                text.erase(text.begin() + pos);
-
+#else
+               text.erase(text.mutable_begin() + pos);
+#endif
                // Erase entries in the tables.
                FontTable search_font(pos, LyXFont());
                
@@ -566,18 +574,18 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos)
                                    search_font, matchFT());
                if (it != fontlist.end() && (*it).pos == pos &&
                    (pos == 0 || 
-                    (it != fontlist.begin() && (*(it-1)).pos == pos - 1))) {
+                    (it != fontlist.begin() && (*(it - 1)).pos == pos - 1))) {
                        // If it is a multi-character font
                        // entry, we just make it smaller
                        // (see update below), otherwise we
                        // should delete it.
-                       unsigned int i = it - fontlist.begin();
+                       unsigned int const i = it - fontlist.begin();
                        fontlist.erase(fontlist.begin() + i);
                        it = fontlist.begin() + i;
                        if (i > 0 && i < fontlist.size() &&
-                           fontlist[i-1].font == fontlist[i].font) {
-                               fontlist.erase(fontlist.begin() + i-1);
-                               it = fontlist.begin() + i-1;
+                           fontlist[i - 1].font == fontlist[i].font) {
+                               fontlist.erase(fontlist.begin() + i - 1);
+                               it = fontlist.begin() + i - 1;
                        }
                }
 
@@ -607,7 +615,7 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos)
 void LyXParagraph::InsertChar(LyXParagraph::size_type pos,
                              LyXParagraph::value_type c)
 {
-       LyXFont f(LyXFont::ALL_INHERIT);
+       LyXFont const f(LyXFont::ALL_INHERIT);
        InsertChar(pos, c, f);
 }
 
@@ -632,7 +640,11 @@ void LyXParagraph::InsertChar(LyXParagraph::size_type pos,
 #else
        Assert(pos <= size());
 #endif
+#ifndef HAVE_ROPE
        text.insert(text.begin() + pos, c);
+#else
+       text.insert(pos, c);
+#endif
        // Update the font table.
        FontTable search_font(pos, LyXFont());
        for (FontList::iterator it = lower_bound(fontlist.begin(),
@@ -656,7 +668,7 @@ void LyXParagraph::InsertChar(LyXParagraph::size_type pos,
 void LyXParagraph::InsertInset(LyXParagraph::size_type pos,
                               Inset * inset)
 {
-       LyXFont f(LyXFont::ALL_INHERIT);
+       LyXFont const f(LyXFont::ALL_INHERIT);
        InsertInset(pos, inset, f);
 }
 
@@ -828,8 +840,7 @@ LyXFont const LyXParagraph::GetFontSettings(BufferParams const & bparams,
                                "position does not exist. "
                               << pos << " (" << static_cast<int>(pos)
                               << ")" << endl;
-       }
-       else if (pos > 0) {
+       } else if (pos > 0) {
                return GetFontSettings(bparams, pos - 1);
        }
 #else
@@ -843,6 +854,7 @@ LyXFont const LyXParagraph::GetFontSettings(BufferParams const & bparams,
        //return LyXFont(LyXFont::ALL_INHERIT);
 }
 
+
 // Gets uninstantiated font setting at position 0
 LyXFont const LyXParagraph::GetFirstFontSettings() const
 {
@@ -1155,34 +1167,35 @@ void LyXParagraph::SetFont(LyXParagraph::size_type pos,
        bool end = !notfound && fontlist[i].pos == pos;
        // Is position pos is the end of a font block?
        if (begin && end) { // A single char block
-               if (i+1 < fontlist.size() &&
-                   fontlist[i+1].font == font) {
+               if (i + 1 < fontlist.size() &&
+                   fontlist[i + 1].font == font) {
                        // Merge the singleton block with the next block
                        fontlist.erase(fontlist.begin() + i);
-                       if (i > 0 && fontlist[i-1].font == font)
+                       if (i > 0 && fontlist[i - 1].font == font)
                                fontlist.erase(fontlist.begin() + i-1);
-               } else if (i > 0 && fontlist[i-1].font == font) {
+               } else if (i > 0 && fontlist[i - 1].font == font) {
                        // Merge the singleton block with the previous block
-                       fontlist[i-1].pos = pos;
+                       fontlist[i - 1].pos = pos;
                        fontlist.erase(fontlist.begin() + i);
                } else
                        fontlist[i].font = font;
        } else if (begin) {
-               if (i > 0 && fontlist[i-1].font == font)
-                       fontlist[i-1].pos = pos;
+               if (i > 0 && fontlist[i - 1].font == font)
+                       fontlist[i - 1].pos = pos;
                else
                        fontlist.insert(fontlist.begin() + i,
                                        FontTable(pos, font));
        } else if (end) {
                fontlist[i].pos = pos - 1;
-               if (!(i+1 < fontlist.size() &&
-                     fontlist[i+1].font == font))
-                       fontlist.insert(fontlist.begin() + i+1,
+               if (!(i + 1 < fontlist.size() &&
+                     fontlist[i + 1].font == font))
+                       fontlist.insert(fontlist.begin() + i + 1,
                                        FontTable(pos, font));
        } else { // The general case. The block is splitted into 3 blocks
                fontlist.insert(fontlist.begin() + i, 
                                FontTable(pos - 1, fontlist[i].font));
-               fontlist.insert(fontlist.begin() + i+1, FontTable(pos, font));
+               fontlist.insert(fontlist.begin() + i + 1,
+                               FontTable(pos, font));
        }
 }
 
@@ -1469,11 +1482,13 @@ void LyXParagraph::BreakParagraph(BufferParams const & bparams,
                        if (tmp->InsertFromMinibuffer(j - pos))
                                ++j;
                }
-               tmp->text.resize(tmp->text.size());
+
+               tmp->fitToSize();
+
                for (i = pos_end; i >= pos; --i)
                        par->Erase(i - pos_first);
 
-               par->text.resize(par->text.size());
+               par->fitToSize();
 #else
                size_type pos_end = text.size() - 1;
                
@@ -1692,11 +1707,13 @@ void LyXParagraph::BreakParagraphConservative(BufferParams const & bparams,
                        if (tmp->InsertFromMinibuffer(j - pos))
                                ++j;
                }
-               tmp->text.resize(tmp->text.size());
+
+               tmp->fitToSize();
+
                for (size_type i = pos_end; i >= pos; --i)
                        par->Erase(i - pos_first);
 
-               par->text.resize(par->text.size());
+               par->fitToSize();
        }
 #else
        // create a new paragraph
@@ -1805,7 +1822,7 @@ int LyXParagraph::GetEndLabel(BufferParams const & bparams) const
                if (endlabeltype != END_LABEL_NO_LABEL) {
                        LyXParagraph const * last = this;
 #ifndef NEW_INSETS
-                       iffootnoteflag == NO_FOOTNOTE)
+                       if (footnoteflag == NO_FOOTNOTE)
                                last = LastPhysicalPar();
                        else if (next->footnoteflag == NO_FOOTNOTE)
                                return endlabeltype;
@@ -1962,9 +1979,8 @@ void LyXParagraph::SetOnlyLayout(BufferParams const & bparams,
                 }
                 if ((par->pextra_type == PEXTRA_NONE) &&
                     npar && (npar->pextra_type != PEXTRA_NONE)) {
-                        string
-                                p1 = npar->pextra_width,
-                                p2 = npar->pextra_widthp;
+                        string const p1 = npar->pextra_width;
+                       string const p2 = npar->pextra_widthp;
                         npar->SetPExtraType(bparams, npar->pextra_type,
                                             p1, p2);
                 }
@@ -2023,17 +2039,15 @@ void LyXParagraph::SetLayout(BufferParams const & bparams,
 #endif
                 }
                 if (ppar && (ppar->pextra_type != PEXTRA_NONE)) {
-                        string
-                                p1 = ppar->pextra_width,
-                                p2 = ppar->pextra_widthp;
+                        string const p1 = ppar->pextra_width;
+                       string const p2 = ppar->pextra_widthp;
                         ppar->SetPExtraType(bparams, ppar->pextra_type,
                                             p1, p2);
                 }
                 if ((par->pextra_type == PEXTRA_NONE) &&
                     npar && (npar->pextra_type != PEXTRA_NONE)) {
-                        string
-                                p1 = npar->pextra_width,
-                                p2 = npar->pextra_widthp;
+                        string const p1 = npar->pextra_width;
+                       string const p2 = npar->pextra_widthp;
                         npar->SetPExtraType(bparams, npar->pextra_type,
                                             p1, p2);
                 }
@@ -2062,7 +2076,8 @@ int LyXParagraph::BeginningOfMainBody() const
            && GetChar(i) != LyXParagraph::META_NEWLINE
                ) {
                ++i;
-               char previous_char = 0, temp = 0; 
+               char previous_char = 0;
+               char temp = 0; 
                if (i < size()
                    && (previous_char = GetChar(i)) != LyXParagraph::META_NEWLINE) {
                        // Yes, this  ^ is supposed to be "= " not "=="
@@ -2194,7 +2209,7 @@ int LyXParagraph::GetPositionOfInset(Inset * inset) const
        // Think about footnotes.
        if (footnoteflag == LyXParagraph::NO_FOOTNOTE 
            && next && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
-               int further = 
+               int const further = 
                        NextAfterFootnote()->GetPositionOfInset(inset);
                if (further != -1)
                        return text.size() + 1 + further;
@@ -2315,7 +2330,7 @@ LyXParagraph * LyXParagraph::TeXOnePar(Buffer const * buf,
                                ? GetFontSettings(bparams,
                                                  size()-1).isRightToLeft()
                                : language->RightToLeft();
-                       if ( (p = NextAfterFootnote()) != 0 &&
+                       if ((p = NextAfterFootnote()) != 0 &&
                             p->size() > 0 &&
                             p->GetFontSettings(bparams, 0).isRightToLeft() != is_rtl)
                                is_rtl = getParLanguage(bparams)->RightToLeft();
@@ -2811,7 +2826,7 @@ void LyXParagraph::SimpleTeXSpecialChars(Buffer const * buf,
                Inset * inset = GetInset(i);
                if (inset) {
                        bool close = false;
-                       int len = os.tellp();
+                       int const len = os.tellp();
                        if ((inset->LyxCode() == Inset::GRAPHICS_CODE
                             || inset->LyxCode() == Inset::MATH_CODE
                             || inset->LyxCode() == Inset::URL_CODE)
@@ -2922,7 +2937,7 @@ void LyXParagraph::SimpleTeXSpecialChars(Buffer const * buf,
                                } 
                                // Otherwise, we use what LaTeX
                                // provides us.
-                               switch(c) {
+                               switch (c) {
                                case '<':
                                        os << "\\textless{}";
                                        column += 10;
@@ -3169,7 +3184,7 @@ LyXParagraph * LyXParagraph::TeXEnvironment(Buffer const * buf,
                        texrow.newline();
                }
                os << "\\begin{minipage}";
-               switch(pextra_alignment) {
+               switch (pextra_alignment) {
                case MINIPAGE_ALIGN_TOP:
                        os << "[t]";
                        break;
@@ -3308,7 +3323,7 @@ LyXParagraph * LyXParagraph::TeXEnvironment(Buffer const * buf,
                                texrow.newline();
                        }
                        os << "\\begin{minipage}";
-                       switch(par->pextra_alignment) {
+                       switch (par->pextra_alignment) {
                        case MINIPAGE_ALIGN_TOP:
                                os << "[t]";
                                break;
@@ -3619,9 +3634,6 @@ LyXParagraph * LyXParagraph::TeXFootnote(Buffer const * buf,
                                "Footnote in a Footnote -- not supported"
                               << endl;
                }
-//#ifndef HAVE_OSTREAM
-//             delete [] dummy.str();
-//#endif
        }
 
        switch (footnotekind) {
@@ -3841,14 +3853,14 @@ bool LyXParagraph::IsKomma(size_type pos) const
 /// Used by the spellchecker
 bool LyXParagraph::IsLetter(LyXParagraph::size_type pos) const
 {
-       value_type c = GetChar(pos);
+       value_type const c = GetChar(pos);
        if (IsLetterChar(c))
                return true;
        // '\0' is not a letter, allthough every string contains "" (below)
-       ifc == '\0')
+       if (c == '\0')
                return false;
        // We want to pass the ' and escape chars to ispell
-       string extra = lyxrc.isp_esc_chars + '\'';
+       string const extra = lyxrc.isp_esc_chars + '\'';
        char ch[2] = { c, 0 };
        return contains(extra, ch);
 }
@@ -3895,7 +3907,7 @@ bool LyXParagraph::isRightToLeftPar(BufferParams const & bparams) const
 void LyXParagraph::ChangeLanguage(BufferParams const & bparams,
                                  Language const * from, Language const * to)
 {
-       for(size_type i = 0; i < size(); ++i) {
+       for (size_type i = 0; i < size(); ++i) {
                LyXFont font = GetFontSettings(bparams, i);
                if (font.language() == from) {
                        font.setLanguage(to);
@@ -3928,7 +3940,7 @@ string const LyXParagraph::String(Buffer const * buffer, bool label)
        if (label && !labelstring.empty())
 #endif
                s += labelstring + ' ';
-       string::size_type len = s.size();
+       string::size_type const len = s.size();
 
        for (LyXParagraph::size_type i = 0; i < size(); ++i) {
                value_type c = GetChar(i);
@@ -3938,7 +3950,7 @@ string const LyXParagraph::String(Buffer const * buffer, bool label)
                         GetInset(i)->LyxCode() == Inset::MATH_CODE) {
                        std::ostringstream ost;
                        GetInset(i)->Ascii(buffer, ost);
-                       s += subst(ost.str(),'\n',' ');
+                       s += subst(ost.str().c_str(),'\n',' ');
                }
        }
 
@@ -3978,7 +3990,7 @@ string const LyXParagraph::String(Buffer const * buffer,
                else if (c == META_INSET) {
                        std::ostringstream ost;
                        GetInset(i)->Ascii(buffer, ost);
-                       s += ost.str();
+                       s += ost.str().c_str();
                }
        }