#include "FloatList.h"
#include "language.h"
#include "ParagraphParameters.h"
+#include "support/LAssert.h"
using std::copy;
using std::find;
}
+namespace {
+
+LyXFont const realizeFont(LyXFont const & font,
+ Buffer const * buf,
+ Paragraph * par)
+{
+ LyXFont tmpfont(font);
+ Paragraph::depth_type par_depth = par->getDepth();
+
+ // Resolve against environment font information
+ while (par && par_depth && !tmpfont.resolved()) {
+ par = par->outerHook();
+ if (par) {
+ tmpfont.realize(textclasslist.
+ Style(buf->params.textclass,
+ par->getLayout()).font,
+ buf->params.language);
+ par_depth = par->getDepth();
+ }
+ }
+
+ tmpfont.realize(textclasslist.TextClass(buf->params.textclass).defaultfont(),
+ buf->params.language);
+
+ return tmpfont;
+}
+
+}
+
+
// Gets the fully instantiated font at a given position in a paragraph
// Basically the same routine as Paragraph::getFont() in paragraph.C.
// The difference is that this one is used for displaying, and thus we
LyXFont const LyXText::getFont(Buffer const * buf, Paragraph * par,
Paragraph::size_type pos) const
{
+ lyx::Assert(pos >= 0);
+
LyXLayout const & layout =
textclasslist.Style(buf->params.textclass, par->getLayout());
-
+
Paragraph::depth_type par_depth = par->getDepth();
// We specialize the 95% common case:
if (!par_depth) {
- if (pos >= 0){
- // 95% goes here
- if (layout.labeltype == LABEL_MANUAL
- && pos < beginningOfMainBody(buf, par)) {
+ if (layout.labeltype == LABEL_MANUAL
+ && pos < beginningOfMainBody(buf, par)) {
// 1% goes here
- LyXFont f = par->getFontSettings(buf->params,
- pos);
- return f.realize(layout.reslabelfont, buf->params.language);
- } else {
- LyXFont f = par->getFontSettings(buf->params, pos);
- return f.realize(layout.resfont, buf->params.language);
- }
-
+ LyXFont f = par->getFontSettings(buf->params,
+ pos);
+ return f.realize(layout.reslabelfont, buf->params.language);
} else {
- // 5% goes here.
- // process layoutfont for pos == -1 and labelfont for pos < -1
- if (pos == -1)
- return layout.resfont;
- else
- return layout.reslabelfont;
+ LyXFont f = par->getFontSettings(buf->params, pos);
+ return f.realize(layout.resfont, buf->params.language);
}
}
-
+
// The uncommon case need not be optimized as much
-
- LyXFont layoutfont, tmpfont;
-
- if (pos >= 0){
- // 95% goes here
- if (pos < beginningOfMainBody(buf, par)) {
- // 1% goes here
- layoutfont = layout.labelfont;
- } else {
- // 99% goes here
- layoutfont = layout.font;
- }
- tmpfont = par->getFontSettings(buf->params, pos);
- tmpfont.realize(layoutfont, buf->params.language);
+
+ LyXFont layoutfont;
+
+ if (pos < beginningOfMainBody(buf, par)) {
+ // 1% goes here
+ layoutfont = layout.labelfont;
} else {
- // 5% goes here.
- // process layoutfont for pos == -1 and labelfont for pos < -1
- if (pos == -1)
- tmpfont = layout.font;
- else
- tmpfont = layout.labelfont;
+ // 99% goes here
+ layoutfont = layout.font;
}
- // Resolve against environment font information
- while (par && par_depth && !tmpfont.resolved()) {
- par = par->outerHook();
- if (par) {
- tmpfont.realize(textclasslist.
- Style(buf->params.textclass,
- par->getLayout()).font,
- buf->params.language);
- par_depth = par->getDepth();
- }
+ LyXFont tmpfont = par->getFontSettings(buf->params, pos);
+ tmpfont.realize(layoutfont, buf->params.language);
+
+ return realizeFont(tmpfont, buf, par);
+}
+
+
+LyXFont const LyXText::getLayoutFont(Buffer const * buf, Paragraph * par) const
+{
+ LyXLayout const & layout =
+ textclasslist.Style(buf->params.textclass, par->getLayout());
+
+ Paragraph::depth_type par_depth = par->getDepth();
+
+ if (!par_depth) {
+ return layout.resfont;
}
- tmpfont.realize(textclasslist.TextClass(buf->params.textclass).defaultfont(),
- buf->params.language);
+ return realizeFont(layout.font, buf, par);
+}
- return tmpfont;
+
+LyXFont const LyXText::getLabelFont(Buffer const * buf, Paragraph * par) const
+{
+ LyXLayout const & layout =
+ textclasslist.Style(buf->params.textclass, par->getLayout());
+
+ Paragraph::depth_type par_depth = par->getDepth();
+
+ if (!par_depth) {
+ return layout.reslabelfont;
+ }
+
+ return realizeFont(layout.labelfont, buf, par);
}
static_cast<UpdatableInset *>(inset);
uinset->setFont(bv, fnt, toggleall, true);
}
- font = inset->convertFont(font);
}
}
Paragraph::size_type pos, LyXFont const & fnt)
{
LyXFont font(fnt);
- // Let the insets convert their font
- if (par->getChar(pos) == Paragraph::META_INSET) {
- font = par->getInset(pos)->convertFont(font);
- }
LyXLayout const & layout =
textclasslist.Style(buf->params.textclass,
// Determine basis font
LyXFont layoutfont;
if (cursor.pos() < beginningOfMainBody(bview->buffer(),
- cursor.par()))
- layoutfont = getFont(bview->buffer(), cursor.par(),-2);
- else
- layoutfont = getFont(bview->buffer(), cursor.par(),-1);
+ cursor.par())) {
+ layoutfont = getLabelFont(bview->buffer(),
+ cursor.par());
+ } else {
+ layoutfont = getLayoutFont(bview->buffer(),
+ cursor.par());
+ }
// Update current font
real_current_font.update(font, toggleall);
// and sel_end cursor
setUndo(bview, Undo::EDIT,
- selection.start.par(),
- selection.end.par()->next());
+ selection.start.par(), selection.end.par()->next());
freezeUndo();
cursor = selection.start;
while (cursor.par() != selection.end.par() ||
- (cursor.pos() < selection.end.pos())) {
+ (cursor.pos() < selection.end.pos()))
+ {
if (cursor.pos() < cursor.par()->size()) {
// an open footnote should behave
// like a closed one
clearSelection();
setSelection(bview);
setCursor(bview, tmpcursor.par(), tmpcursor.pos(), true,
- tmpcursor.boundary());
+ tmpcursor.boundary());
}
}
-void LyXText::cutSelection(BufferView * bview, bool doclear)
+void LyXText::cutSelection(BufferView * bview, bool doclear, bool realcut)
{
// Stuff what we got on the clipboard. Even if there is no selection.
endpar = selection.end.par();
int pos = selection.end.pos();
CutAndPaste::cutSelection(selection.start.par(), &endpar,
- selection.start.pos(), pos,
- bview->buffer()->params.textclass, doclear);
+ selection.start.pos(), pos,
+ bview->buffer()->params.textclass, doclear,
+ realcut);
selection.end.pos(pos);
} else {
endpar = selection.end.par();
int pos = selection.end.pos();
CutAndPaste::cutSelection(selection.start.par(), &endpar,
- selection.start.pos(), pos,
- bview->buffer()->params.textclass, doclear);
+ selection.start.pos(), pos,
+ bview->buffer()->params.textclass, doclear,
+ realcut);
cursor.par(endpar);
selection.end.par(endpar);
selection.end.pos(pos);
}
// Cut the selection
- cutSelection(bview);
+ cutSelection(bview, true, false);
unFreezeUndo();
}
void LyXText::setCursor(BufferView * bview, Paragraph * par,
- Paragraph::size_type pos,
- bool setfont, bool boundary) const
+ Paragraph::size_type pos,
+ bool setfont, bool boundary) const
{
LyXCursor old_cursor = cursor;
setCursorIntern(bview, par, pos, setfont, boundary);
bview->buffer()->params.textclass,
row->par()->getLayout())
.labelsep,
- getFont(bview->buffer(), row->par(), -2));
+ getLabelFont(bview->buffer(), row->par()));
if (row->par()->isLineSeparator(main_body-1))
x -= singleWidth(bview, row->par(),main_body-1);
}
bool setfont, bool boundary) const
{
InsetText * it = static_cast<InsetText *>(par->inInset());
- if (it && (it != inset_owner)) {
- it->getLyXText(bview)->setCursorIntern(bview, par, pos, setfont,
- boundary);
- } else {
- setCursor(bview, cursor, par, pos, boundary);
- if (setfont)
- setCurrentFont(bview);
+ if (it) {
+ if (it != inset_owner) {
+ lyxerr << "InsetText is " << it << endl;
+ lyxerr << "inset_owner is " << inset_owner << endl;
+#warning I belive this code is wrong. (Lgb)
+#warning Jürgen, have a look at this. (Lgb)
+#warning Hmmm, I guess you are right but we
+#warning should verify when this is needed
+ // Jürgen, would you like to have a look?
+ // I guess we need to move the outer cursor
+ // and open and lock the inset (bla bla bla)
+ // stuff I don't know... so can you have a look?
+ // (Lgb)
+ // I moved the lyxerr stuff in here so we can see if this
+ // is actually really needed and where!
+ // (Jug)
+ it->getLyXText(bview)->setCursorIntern(bview, par, pos, setfont,
+ boundary);
+ return;
+ }
}
+
+ setCursor(bview, cursor, par, pos, boundary);
+ if (setfont)
+ setCurrentFont(bview);
}
{
LyXCursor old_cursor = cursor;
-#if 0
- // Get the row first.
-
- Row * row = getRowNearY(y);
-
- bool bound = false;
- int column = getColumnNearX(bview, row, x, bound);
-
- cursor.par(row->par());
- cursor.pos(row->pos() + column);
- cursor.x(x);
- cursor.y(y + row->baseline());
- cursor.row(row);
- cursor.boundary(bound);
-#else
setCursorFromCoordinates(bview, cursor, x, y);
-#endif
setCurrentFont(bview);
deleteEmptyParagraphMechanism(bview, old_cursor);
}
void LyXText::status(BufferView * bview, LyXText::text_status st) const
{
-#if 0
- if ((status_ != NEED_MORE_REFRESH)
- || (status_ == NEED_MORE_REFRESH)
- && (st != NEED_VERY_LITTLE_REFRESH)) {
- status_ = st;
- if (inset_owner && st != UNCHANGED) {
- bview->text->status(bview, NEED_VERY_LITTLE_REFRESH);
- }
- }
-#else
-#warning Please tell what the intention is here. (Lgb)
- // The above does not make any sense, I changed it to what is here,
- // but it still does not make much sense. (Lgb)
-#warning Sure have a look now! (Jug)
// well as much as I know && binds more then || so the above and the
// below are identical (this for your known use of parentesis!)
// Now some explanation:
}
}
}
-#endif
}