]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.C
some source cleanup from John
[lyx.git] / src / paragraph.C
index d3e63a193bedfd955a5f3c2fbb18fd5cfb715b1e..a17825476c65a166f6a23ddba048acc2e5826316 100644 (file)
@@ -69,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;
@@ -93,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;
@@ -261,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:
                {
@@ -404,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(*current_view->buffer());
+                       minibuffer_inset = GetInset(pos)->Clone(buffer);
                } else {
                        minibuffer_inset = 0;
                        minibuffer_char = ' ';
@@ -555,6 +556,7 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos)
                                insetlist.erase(it);
                        }
                }
+
                text.erase(text.begin() + pos);
 
                // Erase entries in the tables.
@@ -566,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;
                        }
                }
 
@@ -607,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);
 }
 
@@ -633,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(),
@@ -656,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);
 }
 
@@ -828,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
@@ -843,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
 {
@@ -1006,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
 {
@@ -1155,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));
        }
 }
 
@@ -1469,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;
                
@@ -1692,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
@@ -1962,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);
                 }
@@ -2023,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);
                 }
@@ -2062,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 "=="
@@ -2190,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;
@@ -2358,25 +2408,21 @@ 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->babel() != doc_language->babel() &&
            (!par
@@ -2407,7 +2453,11 @@ LyXParagraph * LyXParagraph::TeXOnePar(Buffer const * buf,
                        break;
        default:
                // we don't need it for the last paragraph!!!
+               // 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();
                }
@@ -2533,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;
                        }
 
@@ -2550,6 +2602,8 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf,
                        case LYX_ALIGN_SPECIAL:
                                break;
                        case LYX_ALIGN_LEFT:
+                               if (moving_arg)
+                                       os << "\\protect";
                                if (getParLanguage(bparams)->babel() != "hebrew") {
                                        os << "\\raggedright ";
                                        column+= 13;
@@ -2559,6 +2613,8 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf,
                                }
                                break;
                        case LYX_ALIGN_RIGHT:
+                               if (moving_arg)
+                                       os << "\\protect";
                                if (getParLanguage(bparams)->babel() != "hebrew") {
                                        os << "\\raggedleft ";
                                        column+= 12;
@@ -2568,6 +2624,8 @@ bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf,
                                }
                                break;
                        case LYX_ALIGN_CENTER:
+                               if (moving_arg)
+                                       os << "\\protect";
                                os << "\\centering ";
                                column+= 11;
                                break;
@@ -2811,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)
@@ -3838,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)
        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);
 }
@@ -3865,17 +3923,9 @@ LyXParagraph::getParLanguage(BufferParams const & bparams) const
                return FirstPhysicalPar()->getParLanguage(bparams);
        else
 #endif
-       if (size() > 0) {
-#ifdef DO_USE_DEFAULT_LANGUAGE
-               Language const * lang = GetFirstFontSettings().language();
-
-               if (lang->lang() == "default")
-                       return bparams.language;
-               return lang;
-#else
+       if (size() > 0)
                return GetFirstFontSettings().language();
-#endif
-       } else if (previous)
+       else if (previous)
                return previous->getParLanguage(bparams);
        else
                return bparams.language;
@@ -3925,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);
@@ -3935,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',' ');
                }
        }
 
@@ -3969,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();
                }
        }
 
@@ -4022,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;
+}