#include "FontList.h"
-#include "BufferParams.h"
-#include "debug.h"
-#include "Language.h"
-#include "LaTeXFeatures.h"
-
#include <boost/next_prior.hpp>
#include <algorithm>
-using std::distance;
-using std::endl;
-using std::string;
-using std::ostream;
+using namespace std;
namespace lyx {
-namespace {
-
-class matchFT
-{
-public:
- /// used by lower_bound and upper_bound
- int operator()(FontTable const & a, FontTable const & b) const {
- return a.pos() < b.pos();
- }
-};
-
-} // anon namespace
FontList::iterator FontList::fontIterator(pos_type pos)
{
- static Font dummy;
- FontTable search_elem(pos, dummy);
- return lower_bound(list_.begin(), list_.end(), search_elem,
- matchFT());
+ FontList::iterator it = list_.begin();
+ FontList::iterator end = list_.end();
+ for (; it != end; ++it) {
+ if (it->pos() >= pos)
+ break;
+ }
+ return it;
}
FontList::const_iterator FontList::fontIterator(pos_type pos) const
{
- static Font dummy;
- FontTable search_elem(pos, dummy);
- return lower_bound(list_.begin(), list_.end(), search_elem,
- matchFT());
+ FontList::const_iterator it = list_.begin();
+ FontList::const_iterator end = list_.end();
+ for (; it != end; ++it) {
+ if (it->pos() >= pos)
+ break;
+ }
+ return it;
}
iterator beg = list_.begin();
if (it != list_.end() && it->pos() == pos
&& (pos == 0
- || (it != beg && boost::prior(it)->pos() == pos - 1))) {
+ || (it != list_.begin() && boost::prior(it)->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 const i = it - beg;
- list_.erase(beg + i);
- it = beg + i;
+ unsigned int const i = it - list_.begin();
+ list_.erase(it);
+ if (i >= list_.size())
+ return;
+ it = list_.begin() + i;
if (i > 0 && i < list_.size() &&
list_[i - 1].font() == list_[i].font()) {
list_.erase(beg + i - 1);
- it = beg + i - 1;
+ it = list_.begin() + i - 1;
}
}
}
+void FontList::setRange(pos_type startpos, pos_type endpos, Font const & font)
+{
+ // FIXME: Optimize!!!
+ for (pos_type pos = startpos; pos != endpos; ++pos)
+ set(pos, font);
+}
+
+
void FontList::set(pos_type pos, Font const & font)
{
// No need to simplify this because it will disappear
// in a new kernel. (Asger)
// Next search font table
- iterator beg = list_.begin();
- iterator it = beg;
- iterator endit = list_.end();
- for (; it != endit; ++it) {
- if (it->pos() >= pos)
- break;
- }
- size_t const i = distance(beg, it);
- bool notfound = (it == endit);
+ List::iterator it = fontIterator(pos);
+ bool const found = it != list_.end();
+ if (found && it->font() == font)
+ // Font is already set.
+ return;
+
+ size_t const i = distance(list_.begin(), it);
+
+ // Is position pos a beginning of a font block?
+ bool const begin = pos == 0 || !found
+ || (i > 0 && list_[i - 1].pos() == pos - 1);
- if (!notfound && list_[i].font() == font)
+ // Is position pos at the end of a font block?
+ bool const 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;
+ }
- bool begin = pos == 0 || notfound ||
- (i > 0 && list_[i - 1].pos() == pos - 1);
- // Is position pos is a beginning of a font block?
- bool end = !notfound && list_[i].pos() == pos;
- // Is position pos is the end of a font block?
- if (begin && end) { // A single char block
+ 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
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));
}
}
-Font_size FontList::highestInRange
- (pos_type startpos, pos_type endpos, Font_size def_size) const
+FontSize FontList::highestInRange(pos_type startpos, pos_type endpos,
+ FontSize def_size) const
{
if (list_.empty())
return def_size;
- const_iterator end_it = list_.begin();
+ List::const_iterator end_it = fontIterator(endpos);
const_iterator const end = list_.end();
- for (; end_it != end; ++end_it) {
- if (end_it->pos() >= endpos)
- break;
- }
-
if (end_it != end)
++end_it;
- FontList::const_iterator cit = list_.begin();
- for (; cit != end; ++cit) {
- if (cit->pos() >= startpos)
- break;
- }
+ List::const_iterator cit = fontIterator(startpos);
- Font::FONT_SIZE maxsize = Font::SIZE_TINY;
+ FontSize maxsize = FONT_SIZE_TINY;
for (; cit != end_it; ++cit) {
- Font::FONT_SIZE size = cit->font().size();
- if (size == Font::INHERIT_SIZE)
+ FontSize size = cit->font().fontInfo().size();
+ if (size == FONT_SIZE_INHERIT)
size = def_size;
- if (size > maxsize && size <= Font::SIZE_HUGER)
+ if (size > maxsize && size <= FONT_SIZE_HUGER)
maxsize = size;
}
return maxsize;
bool FontList::hasChangeInRange(pos_type pos, int len) const
{
- // FIXME: can't we use fontIterator(pos) instead?
- const_iterator cit = list_.begin();
- const_iterator end = list_.end();
- for (; cit != end; ++cit) {
- if (cit->pos() >= pos)
- break;
- }
- if (cit != end && pos + len - 1 > cit->pos())
- return false;
-
- return true;
+ List::const_iterator cit = fontIterator(pos);
+ return cit == list_.end() || pos + len - 1 <= cit->pos();
}
void FontList::validate(LaTeXFeatures & features) const
{
- BufferParams const & bparams = features.bufferParams();
- Language const * doc_language = bparams.language;
-
const_iterator fcit = list_.begin();
const_iterator fend = list_.end();
- for (; fcit != fend; ++fcit) {
- if (fcit->font().noun() == Font::ON) {
- LYXERR(Debug::LATEX) << "font.noun: "
- << fcit->font().noun()
- << endl;
- features.require("noun");
- LYXERR(Debug::LATEX) << "Noun enabled. Font: "
- << to_utf8(fcit->font().stateText(0))
- << endl;
- }
- switch (fcit->font().color()) {
- case Color::none:
- case Color::inherit:
- case Color::ignore:
- // probably we should put here all interface colors used for
- // font displaying! For now I just add this ones I know of (Jug)
- case Color::latex:
- case Color::note:
- break;
- default:
- features.require("color");
- LYXERR(Debug::LATEX) << "Color enabled. Font: "
- << to_utf8(fcit->font().stateText(0))
- << endl;
- }
-
- Language const * language = fcit->font().language();
- if (language->babel() != doc_language->babel() &&
- language != ignore_language &&
- language != latex_language)
- {
- features.useLanguage(language);
- LYXERR(Debug::LATEX) << "Found language "
- << language->lang() << endl;
- }
- }
+ for (; fcit != fend; ++fcit)
+ fcit->font().validate(features);
}
} // namespace lyx