LyXParagraph::LyXParagraph()
{
text.reserve(500); // is this number too big?
-
for (int i = 0; i < 10; ++i) setCounter(i , 0);
appendix = false;
enumdepth = 0;
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;
font1 = font2;
}
- value_type c = GetChar(i);
+ value_type const c = GetChar(i);
switch (c) {
case META_INSET:
{
// 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 = ' ';
insetlist.erase(it);
}
}
+
text.erase(text.begin() + pos);
// Erase entries in the tables.
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;
}
}
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);
}
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(),
void LyXParagraph::InsertInset(LyXParagraph::size_type pos,
Inset * inset)
{
- LyXFont f(LyXFont::ALL_INHERIT);
+ LyXFont const f(LyXFont::ALL_INHERIT);
InsertInset(pos, inset, f);
}
"position does not exist. "
<< pos << " (" << static_cast<int>(pos)
<< ")" << endl;
- }
- else if (pos > 0) {
+ } else if (pos > 0) {
return GetFontSettings(bparams, pos - 1);
}
#else
//return LyXFont(LyXFont::ALL_INHERIT);
}
+
// Gets uninstantiated font setting at position 0
LyXFont const LyXParagraph::GetFirstFontSettings() 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
{
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));
}
}
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;
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
}
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);
}
#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);
}
&& 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 "=="
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;
// 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
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();
}
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;
}
case LYX_ALIGN_SPECIAL:
break;
case LYX_ALIGN_LEFT:
+ if (moving_arg)
+ os << "\\protect";
if (getParLanguage(bparams)->babel() != "hebrew") {
os << "\\raggedright ";
column+= 13;
}
break;
case LYX_ALIGN_RIGHT:
+ if (moving_arg)
+ os << "\\protect";
if (getParLanguage(bparams)->babel() != "hebrew") {
os << "\\raggedleft ";
column+= 12;
}
break;
case LYX_ALIGN_CENTER:
+ if (moving_arg)
+ os << "\\protect";
os << "\\centering ";
column+= 11;
break;
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)
/// 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);
}
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;
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);
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',' ');
}
}
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();
}
}
}
}
}
+
+
+void LyXParagraph::fitToSize()
+{
+ TextContainer tmp(text.begin(), text.end());
+ text.swap(tmp);
+}
+
+
+void LyXParagraph::setContentsFromPar(LyXParagraph * par)
+{
+ text = par->text;
+}