]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.C
some source cleanup from John
[lyx.git] / src / paragraph.C
index b28a66e4d80bab1f967f0bdcf92a5840a1f4c00c..a17825476c65a166f6a23ddba048acc2e5826316 100644 (file)
@@ -50,8 +50,8 @@ using std::reverse;
 int tex_code_break_column = 72;  // needs non-zero initialization. set later.
 // this is a bad idea, but how can LyXParagraph find its buffer to get
 // parameters? (JMarc)
-extern BufferView * current_view;
-extern string bibitemWidest(BufferView *);
+
+extern string bibitemWidest(Buffer const *);
 
 // this is a minibuffer
 static char minibuffer_char;
@@ -59,6 +59,8 @@ static LyXFont minibuffer_font;
 static Inset * minibuffer_inset;
 
 
+extern BufferView * current_view;
+
 // Initialization of the counter for the paragraph id's,
 // declared in lyxparagraph.h
 unsigned int LyXParagraph::paragraph_id = 0;
@@ -67,7 +69,6 @@ unsigned int LyXParagraph::paragraph_id = 0;
 LyXParagraph::LyXParagraph()
 {
        text.reserve(500); // is this number too big?
-
        for (int i = 0; i < 10; ++i) setCounter(i , 0);
        appendix = false;
        enumdepth = 0;
@@ -91,8 +92,8 @@ LyXParagraph::LyXParagraph()
 LyXParagraph::LyXParagraph(LyXParagraph * par)
 {
        text.reserve(500);
-       par->text.resize(par->text.size());
-
+       par->fitToSize();
+       
        for (int i = 0; i < 10; ++i) setCounter(i, 0);
        appendix = false;
        enumdepth = 0;
@@ -242,7 +243,7 @@ void LyXParagraph::writeFile(Buffer const * buf, ostream & os,
        if (bibkey)
                bibkey->Write(buf, os);
 
-       LyXFont font1(LyXFont::ALL_INHERIT, params.language_info);
+       LyXFont font1(LyXFont::ALL_INHERIT, params.language);
 
        int column = 0;
        for (size_type i = 0; i < size(); ++i) {
@@ -259,7 +260,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:
                {
@@ -342,7 +343,7 @@ void LyXParagraph::validate(LaTeXFeatures & features) const
        features.layout[GetLayout()] = true;
 
        // then the fonts
-       Language const * doc_language = params.language_info;
+       Language const * doc_language = params.language;
        
        for (FontList::const_iterator cit = fontlist.begin();
             cit != fontlist.end(); ++cit) {
@@ -368,10 +369,10 @@ void LyXParagraph::validate(LaTeXFeatures & features) const
                }
 
                Language const * language = (*cit).font.language();
-               if (language != doc_language) {
+               if (language->babel() != doc_language->babel()) {
                        features.UsedLanguages.insert(language);
                        lyxerr[Debug::LATEX] << "Found language "
-                                            << language->lang() << endl;
+                                            << language->babel() << endl;
                }
        }
 
@@ -402,15 +403,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();
+                       minibuffer_inset = GetInset(pos)->Clone(buffer);
                } else {
                        minibuffer_inset = 0;
                        minibuffer_char = ' ';
@@ -553,6 +556,7 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos)
                                insetlist.erase(it);
                        }
                }
+
                text.erase(text.begin() + pos);
 
                // Erase entries in the tables.
@@ -564,18 +568,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;
                        }
                }
 
@@ -605,7 +609,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);
 }
 
@@ -631,6 +635,7 @@ void LyXParagraph::InsertChar(LyXParagraph::size_type pos,
        Assert(pos <= size());
 #endif
        text.insert(text.begin() + pos, c);
+
        // Update the font table.
        FontTable search_font(pos, LyXFont());
        for (FontList::iterator it = lower_bound(fontlist.begin(),
@@ -654,7 +659,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);
 }
 
@@ -826,8 +831,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
@@ -841,6 +845,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
 {
@@ -1004,6 +1009,47 @@ LyXParagraph::GetChar(LyXParagraph::size_type pos) const
 }
 
 
+LyXParagraph::value_type
+LyXParagraph::GetUChar(BufferParams const & bparams,
+                      LyXParagraph::size_type pos) const
+{
+       value_type c = GetChar(pos);
+       if (!lyxrc.rtl_support)
+               return c;
+
+       value_type uc = c;
+       switch (c) {
+       case '(':
+               uc = ')';
+               break;
+       case ')':
+               uc = '(';
+               break;
+       case '[':
+               uc = ']';
+               break;
+       case ']':
+               uc = '[';
+               break;
+       case '{':
+               uc = '}';
+               break;
+       case '}':
+               uc = '{';
+               break;
+       case '<':
+               uc = '>';
+               break;
+       case '>':
+               uc = '<';
+               break;
+       }
+       if (uc != c && GetFontSettings(bparams, pos).isRightToLeft())
+               return uc;
+       else
+               return c;
+}
+
 // return an string of the current word, and the end of the word in lastpos.
 string const LyXParagraph::GetWord(LyXParagraph::size_type & lastpos) const
 {
@@ -1153,34 +1199,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));
        }
 }
 
@@ -1467,11 +1514,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;
                
@@ -1610,7 +1659,8 @@ LyXParagraph * LyXParagraph::Clone() const
    
         // ale970302
        if (bibkey)
-               result->bibkey = static_cast<InsetBibKey *>(bibkey->Clone());
+               result->bibkey = static_cast<InsetBibKey *>
+                                (bibkey->Clone(*current_view->buffer()));
        else
                result->bibkey = 0;
     
@@ -1621,7 +1671,7 @@ LyXParagraph * LyXParagraph::Clone() const
        result->insetlist = insetlist;
        for (InsetList::iterator it = result->insetlist.begin();
             it != result->insetlist.end(); ++it)
-               (*it).inset = (*it).inset->Clone();
+               (*it).inset = (*it).inset->Clone(*current_view->buffer());
        return result;
 }
 
@@ -1689,11 +1739,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
@@ -1802,7 +1854,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;
@@ -1959,9 +2011,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);
                 }
@@ -2020,17 +2071,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);
                 }
@@ -2059,7 +2108,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 "=="
@@ -2187,11 +2237,14 @@ int LyXParagraph::GetPositionOfInset(Inset * inset) const
                        return (*cit).pos;
                }
        }
+       if (inset == bibkey)
+               return 0;
+
 #ifndef NEW_INSETS
        // 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;
@@ -2261,12 +2314,13 @@ LyXParagraph * LyXParagraph::TeXOnePar(Buffer const * buf,
        }
 
        Language const * language = getParLanguage(bparams);
-       Language const * doc_language = bparams.language_info;
+       Language const * doc_language = bparams.language;
        Language const * previous_language = previous
                ? previous->getParLanguage(bparams) : doc_language;
-       if (language != doc_language && language != previous_language) {
+       if (language->babel() != doc_language->babel() &&
+           language->babel() != previous_language->babel()) {
                os << subst(lyxrc.language_command_begin, "$$lang",
-                           language->lang())
+                           language->babel())
                   << endl;
                texrow.newline();
        }
@@ -2311,7 +2365,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();
@@ -2354,35 +2408,31 @@ LyXParagraph * LyXParagraph::TeXOnePar(Buffer const * buf,
        // This is necessary because LaTeX (and LyX on the screen)
        // calculates the space between the baselines according
        // to this font. (Matthias)
+       //
+       // Is this really needed ? (Dekel)
+       // We do not need to use to change the font for the last paragraph
+       // or for a command.
        LyXFont font = getFont(bparams, Last() - 1);
-       if (need_par && next) {
-               if (style.resfont.size() != font.size()) {
-                       os << '\\'
-                          << font.latexSize()
-                          << ' ';
-               }
+       bool is_command = textclasslist.Style(bparams.textclass,
+                                             GetLayout()).isCommand();
+       if (style.resfont.size() != font.size() && next && !is_command) {
+               if (!need_par)
+                       os << "{";
+               os << "\\" << font.latexSize() << " \\par}";
+       } else if (need_par) {
                os << "\\par}";
-       } else if (textclasslist.Style(bparams.textclass,
-                                      GetLayout()).isCommand()) {
-               if (style.resfont.size() != font.size()) {
-                       os << '\\'
-                          << font.latexSize()
-                          << ' ';
-               }
-               os << '}';
-       } else if ((style.resfont.size() != font.size()) && next){
-               os << "{\\" << font.latexSize() << " \\par}";
-       }
+       } else if (is_command)
+               os << "}";
 
-       if (language != doc_language &&
+       if (language->babel() != doc_language->babel() &&
            (!par
 #ifndef NEW_INSETS
             || (footnoteflag != NO_FOOTNOTE && par->footnoteflag != footnoteflag)
 #endif
-            || par->getParLanguage(bparams) != language)) {
+            || par->getParLanguage(bparams)->babel() != language->babel())) {
                os << endl 
                   << subst(lyxrc.language_command_end, "$$lang",
-                           doc_language->lang());
+                           doc_language->babel());
        }
        
        switch (style.latextype) {
@@ -2403,17 +2453,11 @@ LyXParagraph * LyXParagraph::TeXOnePar(Buffer const * buf,
                        break;
        default:
                // we don't need it for the last paragraph!!!
-               if (next
-#ifndef NEW_INSETS
-                       && !(    footnoteflag != LyXParagraph::NO_FOOTNOTE
-                     && footnotekind != LyXParagraph::FOOTNOTE
-                     && footnotekind != LyXParagraph::MARGIN)
-#endif
-                       ) {
-                       // don't insert this if we would be adding it
-                       // before or after a table in a float.  This 
-                       // little trick is needed in order to allow
-                       // use of tables in \subfigures or \subtables.
+               // or for tables in floats
+               //   -- effectively creates a \par where there isn't one which
+               //      breaks a \subfigure or \subtable.
+               if (next) {
+//                 && footnoteflag == LyXParagraph::NO_FOOTNOTE) {
                        os << '\n';
                        texrow.newline();
                }
@@ -2539,9 +2583,11 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf,
                        if (style.isCommand()) {
                                os << '{';
                                ++column;
-                       } else if (align != LYX_ALIGN_LAYOUT) {
-                               os << "{\\par";
-                               column += 4;
+                       } else if (align != LYX_ALIGN_LAYOUT && next) {
+                               // We do not need \par here (Dekel)
+                               // os << "{\\par";
+                               os << "{";
+                               ++column;
                                return_value = true;
                        }
 
@@ -2556,7 +2602,9 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf,
                        case LYX_ALIGN_SPECIAL:
                                break;
                        case LYX_ALIGN_LEFT:
-                               if (getParLanguage(bparams)->lang() != "hebrew") {
+                               if (moving_arg)
+                                       os << "\\protect";
+                               if (getParLanguage(bparams)->babel() != "hebrew") {
                                        os << "\\raggedright ";
                                        column+= 13;
                                } else {
@@ -2565,7 +2613,9 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf,
                                }
                                break;
                        case LYX_ALIGN_RIGHT:
-                               if (getParLanguage(bparams)->lang() != "hebrew") {
+                               if (moving_arg)
+                                       os << "\\protect";
+                               if (getParLanguage(bparams)->babel() != "hebrew") {
                                        os << "\\raggedleft ";
                                        column+= 12;
                                } else {
@@ -2574,6 +2624,8 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf,
                                }
                                break;
                        case LYX_ALIGN_CENTER:
+                               if (moving_arg)
+                                       os << "\\protect";
                                os << "\\centering ";
                                column+= 11;
                                break;
@@ -2817,7 +2869,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)
@@ -2928,7 +2980,7 @@ void LyXParagraph::SimpleTeXSpecialChars(Buffer const * buf,
                                } 
                                // Otherwise, we use what LaTeX
                                // provides us.
-                               switch(c) {
+                               switch (c) {
                                case '<':
                                        os << "\\textless{}";
                                        column += 10;
@@ -3175,7 +3227,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;
@@ -3237,7 +3289,7 @@ LyXParagraph * LyXParagraph::TeXEnvironment(Buffer const * buf,
                } else if (style.labeltype == LABEL_BIBLIO) {
                        // ale970405
                        os << "\\begin{" << style.latexname() << "}{"
-                          <<  bibitemWidest(current_view)
+                          <<  bibitemWidest(buf)
                           << "}\n";
                } else if (style.latextype == LATEX_ITEM_ENVIRONMENT) {
 #ifdef FANCY_FOOTNOTE_CODE
@@ -3314,7 +3366,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;
@@ -3625,9 +3677,6 @@ LyXParagraph * LyXParagraph::TeXFootnote(Buffer const * buf,
                                "Footnote in a Footnote -- not supported"
                               << endl;
                }
-//#ifndef HAVE_OSTREAM
-//             delete [] dummy.str();
-//#endif
        }
 
        switch (footnotekind) {
@@ -3847,14 +3896,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);
 }
@@ -3874,16 +3923,12 @@ LyXParagraph::getParLanguage(BufferParams const & bparams) const
                return FirstPhysicalPar()->getParLanguage(bparams);
        else
 #endif
-       if (size() > 0) {
-               Language const * lang = GetFirstFontSettings().language();
-
-               if (lang->lang() == "default")
-                       return bparams.language_info;
-               return lang;
-       } else if (previous)
+       if (size() > 0)
+               return GetFirstFontSettings().language();
+       else if (previous)
                return previous->getParLanguage(bparams);
-
-               return bparams.language_info;
+       else
+               return bparams.language;
 }
 
 
@@ -3897,7 +3942,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);
@@ -3909,7 +3954,7 @@ void LyXParagraph::ChangeLanguage(BufferParams const & bparams,
 
 bool LyXParagraph::isMultiLingual(BufferParams const & bparams)
 {
-       Language const * doc_language = bparams.language_info;
+       Language const * doc_language = bparams.language;
        for (FontList::const_iterator cit = fontlist.begin();
             cit != fontlist.end(); ++cit)
                if ((*cit).font.language() != doc_language)
@@ -3930,7 +3975,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);
@@ -3940,7 +3985,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',' ');
                }
        }
 
@@ -3974,13 +4019,13 @@ string const LyXParagraph::String(Buffer const * buffer,
                s += labelstring + ' ';
 
        for (LyXParagraph::size_type i = beg; i < end; ++i) {
-               value_type c = GetChar(i);
+               value_type c = GetUChar(buffer->params, i);
                if (IsPrintable(c))
                        s += c;
                else if (c == META_INSET) {
                        std::ostringstream ost;
                        GetInset(i)->Ascii(buffer, ost);
-                       s += ost.str();
+                       s += ost.str().c_str();
                }
        }
 
@@ -4027,3 +4072,16 @@ void LyXParagraph::resizeInsetsLyXText(BufferView * bv)
                }
        }
 }
+
+
+void LyXParagraph::fitToSize()
+{
+       TextContainer tmp(text.begin(), text.end());
+       text.swap(tmp);
+}
+
+
+void LyXParagraph::setContentsFromPar(LyXParagraph * par)
+{
+       text = par->text;
+}