#include <config.h>
-#ifdef __GNUG__
-#pragma implementation "lyxtext.h"
-#endif
-
#include "lyxtext.h"
#include "LString.h"
#include "paragraph.h"
#include "counters.h"
#include "insets/inseterror.h"
-#include "insets/insetbib.h"
+#include "insets/insetbibitem.h"
#include "insets/insetspecialchar.h"
#include "insets/insettext.h"
#include "insets/insetfloat.h"
LyXText::LyXText(BufferView * bv)
: height(0), width(0), first_y(0),
- bv_owner(bv), inset_owner(0), the_locking_inset(0),
- need_break_row(0), refresh_y(0), refresh_row(0),
+ inset_owner(0), the_locking_inset(0), need_break_row(0),
+ refresh_y(0), refresh_row(0), bv_owner(bv),
status_(LyXText::UNCHANGED), firstrow(0), lastrow(0)
{}
LyXText::LyXText(InsetText * inset)
- : height(0), width(0), first_y(0),
- bv_owner(0), inset_owner(inset), the_locking_inset(0),
- need_break_row(0), refresh_y(0), refresh_row(0),
- status_(LyXText::UNCHANGED), firstrow(0), lastrow(0)
+ : height(0), width(0), first_y(0),
+ inset_owner(inset), the_locking_inset(0), need_break_row(0),
+ refresh_y(0), refresh_row(0), bv_owner(0),
+ status_(LyXText::UNCHANGED), firstrow(0), lastrow(0)
{}
// We specialize the 95% common case:
if (!par->getDepth()) {
if (layout->labeltype == LABEL_MANUAL
- && pos < beginningOfMainBody(buf, par)) {
+ && pos < par->beginningOfMainBody()) {
// 1% goes here
LyXFont f = par->getFontSettings(buf->params, pos);
if (par->inInset())
LyXFont layoutfont;
- if (pos < beginningOfMainBody(buf, par)) {
+ if (pos < par->beginningOfMainBody()) {
// 1% goes here
layoutfont = layout->labelfont;
} else {
// Get concrete layout font to reduce against
LyXFont layoutfont;
- if (pos < beginningOfMainBody(buf, par))
+ if (pos < par->beginningOfMainBody())
layoutfont = layout->labelfont;
else
layoutfont = layout->font;
Inset * LyXText::getInset() const
{
- Inset * inset = 0;
- if (cursor.pos() == 0 && cursor.par()->bibkey) {
- inset = cursor.par()->bibkey;
- } else if (cursor.pos() < cursor.par()->size()
+ if (cursor.pos() < cursor.par()->size()
&& cursor.par()->isInset(cursor.pos())) {
- inset = cursor.par()->getInset(cursor.pos());
+ return cursor.par()->getInset(cursor.pos());
}
- return inset;
+ return 0;
}
/* used in setlayout */
// Asger is not sure we want to do this...
-void LyXText::makeFontEntriesLayoutSpecific(Buffer const * buf,
- Paragraph * par)
+void LyXText::makeFontEntriesLayoutSpecific(Buffer const & buf,
+ Paragraph & par)
{
- LyXLayout_ptr const & layout = par->layout();
+ LyXLayout_ptr const & layout = par.layout();
LyXFont layoutfont;
- for (pos_type pos = 0; pos < par->size(); ++pos) {
- if (pos < beginningOfMainBody(buf, par))
+ for (pos_type pos = 0; pos < par.size(); ++pos) {
+ if (pos < par.beginningOfMainBody())
layoutfont = layout->labelfont;
else
layoutfont = layout->font;
- LyXFont tmpfont = par->getFontSettings(buf->params, pos);
+ LyXFont tmpfont = par.getFontSettings(buf.params, pos);
tmpfont.reduce(layoutfont);
- par->setFont(pos, tmpfont);
+ par.setFont(pos, tmpfont);
}
}
do {
par->applyLayout(lyxlayout);
- makeFontEntriesLayoutSpecific(bview->buffer(), par);
+ makeFontEntriesLayoutSpecific(*bview->buffer(), *par);
Paragraph * fppar = par;
fppar->params().spaceTop(lyxlayout->fill_top ?
VSpace(VSpace::VFILL)
: VSpace(VSpace::NONE));
if (lyxlayout->margintype == MARGIN_MANUAL)
par->setLabelWidthString(lyxlayout->labelstring());
- if (lyxlayout->labeltype != LABEL_BIBLIO
- && fppar->bibkey) {
- delete fppar->bibkey;
- fppar->bibkey = 0;
- }
cur.par(par);
par = par->next();
} while (par != epar);
if (!selection.set()) {
// Determine basis font
LyXFont layoutfont;
- if (cursor.pos() < beginningOfMainBody(bview->buffer(),
- cursor.par())) {
+ if (cursor.pos() < cursor.par()->beginningOfMainBody()) {
layoutfont = getLabelFont(bview->buffer(),
cursor.par());
} else {
{
if (!cursor.row()->next()
|| cursor.row()->next()->par() != cursor.row()->par()) {
- setCursor(bview, cursor.par(), rowLast(cursor.row()) + 1);
+ setCursor(bview, cursor.par(), cursor.row()->lastPos() + 1);
} else {
if (!cursor.par()->empty() &&
- (cursor.par()->getChar(rowLast(cursor.row())) == ' '
- || cursor.par()->isNewline(rowLast(cursor.row())))) {
- setCursor(bview, cursor.par(), rowLast(cursor.row()));
+ (cursor.par()->getChar(cursor.row()->lastPos()) == ' '
+ || cursor.par()->isNewline(cursor.row()->lastPos()))) {
+ setCursor(bview, cursor.par(), cursor.row()->lastPos());
} else {
setCursor(bview,cursor.par(),
- rowLast(cursor.row()) + 1);
+ cursor.row()->lastPos() + 1);
}
}
}
}
-pos_type LyXText::beginningOfMainBody(Buffer const * /*buf*/,
- Paragraph const * par) const
-{
- if (par->layout()->labeltype != LABEL_MANUAL)
- return 0;
- else
- return par->beginningOfMainBody();
-}
-
-
// the DTP switches for paragraphs. LyX will store them in the first
// physicla paragraph. When a paragraph is broken, the top settings rest,
// the bottom settings are given to the new one. So I can make shure,
} else if (layout->labeltype == LABEL_BIBLIO) {// ale970302
textclass.counters().step("bibitem");
int number = textclass.counters().value("bibitem");
- if (!par->bibkey) {
- InsetCommandParams p("bibitem");
- par->bibkey = new InsetBibKey(p);
+ if (par->bibitem()) {
+ par->bibitem()->setCounter(number);
+ par->params().labelString(layout->labelstring());
}
- par->bibkey->setCounter(number);
- par->params().labelString(layout->labelstring());
-
// In biblio should't be following counters but...
} else {
string s = layout->labelstring();
// is there a break one row above
if (row->previous() && row->previous()->par() == row->par()) {
- z = nextBreakPoint(bview, row->previous(), workWidth(bview));
+ z = nextBreakPoint(bview, row->previous(), workWidth(*bview));
if (z >= row->pos()) {
// set the dimensions of the row above
y -= row->previous()->height();
}
int const tmpheight = row->height();
- pos_type const tmplast = rowLast(row);
+ pos_type const tmplast = row->lastPos();
refresh_y = y;
refresh_row = row;
breakAgain(bview, row);
- if (row->height() == tmpheight && rowLast(row) == tmplast)
+ if (row->height() == tmpheight && row->lastPos() == tmplast)
status(bview, LyXText::NEED_VERY_LITTLE_REFRESH);
else
status(bview, LyXText::NEED_MORE_REFRESH);
// y is now the cursor baseline
cur.y(y);
- pos_type last = rowLastPrintable(old_row);
+ pos_type last = old_row->lastPrintablePos();
// None of these should happen, but we're scaredy-cats
if (pos > par->size()) {
cursor_vpos = (bidi_level(pos) % 2 == 0)
? log2vis(pos) : log2vis(pos) + 1;
- pos_type main_body =
- beginningOfMainBody(bview->buffer(), row->par());
+ pos_type main_body = row->par()->beginningOfMainBody();
if ((main_body > 0) &&
((main_body-1 > last) ||
!row->par()->isLineSeparator(main_body-1)))
x -= singleWidth(bview,
row->par(), main_body - 1);
}
- if (hfillExpansion(bview->buffer(), row, pos)) {
+ if (row->hfillExpansion(pos)) {
x += singleWidth(bview, row->par(), pos);
if (pos >= main_body)
x += fill_hfill;
cur.row(row);
if (beforeFullRowInset(*row, cur)) {
- pos_type last = rowLastPrintable(row);
+ pos_type last = row->lastPrintablePos();
float x = getCursorX(bview, row->next(), cur.pos(), last, bound);
cur.ix(int(x));
cur.iy(y + row->height() + row->next()->baseline());
}
}
}
+
+
+bool LyXText::isTopLevel() const
+{
+ /// only the top-level lyxtext has a non-null bv owner
+ return bv_owner;
+}
+
+
+bool LyXText::isInInset() const
+{
+ return inset_owner;
+}
+
+
+int defaultRowHeight()
+{
+ LyXFont const font(LyXFont::ALL_SANE);
+ return int(font_metrics::maxAscent(font)
+ + font_metrics::maxDescent(font) * 1.5);
+}