X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph.C;h=a17825476c65a166f6a23ddba048acc2e5826316;hb=bf6b9d1e189a13789308944d4d60f3ec994627b4;hp=d3e63a193bedfd955a5f3c2fbb18fd5cfb715b1e;hpb=adaef99e60e28eba8c413a3472cc71e234718af0;p=lyx.git diff --git a/src/paragraph.C b/src/paragraph.C index d3e63a193b..a17825476c 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -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(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; +}