* FontList:

- clear(): new
- set(): simplify a bit.

* Paragraph(): optimize appendString() and resetFonts().


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21259 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Abdelrazak Younes 2007-10-29 12:21:58 +00:00
parent 3a7509a901
commit aeebc6565c
3 changed files with 30 additions and 16 deletions

View File

@ -139,22 +139,36 @@ void FontList::set(pos_type pos, Font const & font)
iterator beg = list_.begin();
iterator it = beg;
iterator endit = list_.end();
bool found = false;
for (; it != endit; ++it) {
if (it->pos() >= pos)
if (it->pos() >= pos) {
found = true;
break;
}
size_t const i = distance(beg, it);
bool notfound = (it == endit);
if (!notfound && list_[i].font() == font)
}
if (found && it->font() == font)
return;
bool begin = pos == 0 || notfound ||
(i > 0 && list_[i - 1].pos() == pos - 1);
size_t const i = distance(beg, it);
// Is position pos is a beginning of a font block?
bool end = !notfound && list_[i].pos() == pos;
bool begin = pos == 0 || !found
|| (i > 0 && list_[i - 1].pos() == pos - 1);
// Is position pos is the end of a font block?
if (begin && end) { // A single char block
bool end = found && list_[i].pos() == pos;
if (!begin && !end) {
// The general case: The block is splitted into 3 blocks
list_.insert(list_.begin() + i,
FontTable(pos - 1, list_[i].font()));
list_.insert(list_.begin() + i + 1,
FontTable(pos, font));
return;
}
if (begin && end) {
// A single char block
if (i + 1 < list_.size() &&
list_[i + 1].font() == font) {
// Merge the singleton block with the next block
@ -179,11 +193,6 @@ void FontList::set(pos_type pos, Font const & font)
list_[i + 1].font() == font))
list_.insert(list_.begin() + i + 1,
FontTable(pos, font));
} else { // The general case. The block is splitted into 3 blocks
list_.insert(list_.begin() + i,
FontTable(pos - 1, list_[i].font()));
list_.insert(list_.begin() + i + 1,
FontTable(pos, font));
}
}

View File

@ -84,6 +84,8 @@ public:
///
bool empty() const { return list_.empty(); }
///
void clear() { return list_.clear(); }
///
void erase(pos_type pos);
///
iterator fontIterator(pos_type pos);

View File

@ -1230,7 +1230,8 @@ void Paragraph::appendString(docstring const & s, Font const & font,
// track change
d->changes_.insert(change, i);
}
d->fontlist_.setRange(oldsize, newsize, font);
d->fontlist_.set(oldsize, font);
d->fontlist_.set(newsize - 1, font);
}
@ -1276,7 +1277,9 @@ bool Paragraph::insetAllowed(InsetCode code)
void Paragraph::resetFonts(Font const & font)
{
d->fontlist_.setRange(0, d->text_.size(), font);
d->fontlist_.clear();
d->fontlist_.set(0, font);
d->fontlist_.set(d->text_.size() - 1, font);
}
// Gets uninstantiated font setting at position.