-/* This file is part of
- * ======================================================
+/**
+ * \file text.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * LyX, The Document Processor
+ * \author Asger Alstrup
+ * \author Lars Gullik Bjønnes
+ * \author Jean-Marc Lasgouttes
+ * \author John Levon
+ * \author André Pönitz
+ * \author Dekel Tsur
+ * \author Jürgen Vigna
*
- * Copyright 1995 Matthias Ettrich
- * Copyright 1995-2001 The LyX Team.
- *
- * ====================================================== */
+ * Full author contact details are available in file CREDITS.
+ */
#include <config.h>
/// left margin
extern int const LEFT_MARGIN = PAPER_MARGIN + CHANGEBAR_MARGIN;
+
+
int bibitemMaxWidth(BufferView *, LyXFont const &);
{
ParagraphList::iterator pit = ownerParagraphs().begin();
ParagraphList::iterator end = ownerParagraphs().end();
- for (int y = 0; pit != end; ++pit) {
+ for (height = 0; pit != end; ++pit) {
RowList::iterator rit = pit->rows.begin();
RowList::iterator rend = pit->rows.end();
for ( ; rit != rend ; rit = ++rit) {
- rit->y(y);
- y += rit->height();
+ rit->y(height);
+ height += rit->height();
}
}
}
-int LyXText::top_y() const
-{
- return anchor_y_;
-}
-
-
-void LyXText::top_y(int newy)
-{
- anchor_y_ = newy;
- lyxerr[Debug::GUI] << "changing reference to offset: " << anchor_y_ << endl;
-}
-
-
int LyXText::workWidth() const
{
return inset_owner ? inset_owner->textWidth() : bv()->workWidth();
void LyXText::computeBidiTables(ParagraphList::iterator pit,
- Buffer const * buf, RowList::iterator row) const
+ Buffer const & buf, RowList::iterator row) const
{
bidi_same_direction = true;
if (!lyxrc.rtl_support) {
pos_type stack[2];
bool const rtl_par =
- pit->isRightToLeftPar(buf->params);
+ pit->isRightToLeftPar(buf.params);
int level = 0;
bool rtl = false;
bool rtl0 = false;
!pit->isLineSeparator(lpos + 1) &&
!pit->isNewline(lpos + 1))
? lpos + 1 : lpos;
- LyXFont font = pit->getFontSettings(buf->params, pos);
+ LyXFont font = pit->getFontSettings(buf.params, pos);
if (pos != lpos && 0 < lpos && rtl0 && font.isRightToLeft() &&
font.number() == LyXFont::ON &&
- pit->getFontSettings(buf->params, lpos - 1).number()
+ pit->getFontSettings(buf.params, lpos - 1).number()
== LyXFont::ON) {
- font = pit->getFontSettings(buf->params, lpos);
+ font = pit->getFontSettings(buf.params, lpos);
is_space = false;
}
// This method requires a previous call to ComputeBidiTables()
-bool LyXText::isBoundary(Buffer const * buf, Paragraph const & par,
+bool LyXText::isBoundary(Buffer const & buf, Paragraph const & par,
pos_type pos) const
{
if (!lyxrc.rtl_support || pos == 0)
bool const rtl = bidi_level(pos - 1) % 2;
bool const rtl2 = bidi_InRange(pos)
? bidi_level(pos) % 2
- : par.isRightToLeftPar(buf->params);
+ : par.isRightToLeftPar(buf.params);
return rtl != rtl2;
}
-bool LyXText::isBoundary(Buffer const * buf, Paragraph const & par,
+bool LyXText::isBoundary(Buffer const & buf, Paragraph const & par,
pos_type pos, LyXFont const & font) const
{
if (!lyxrc.rtl_support)
bool const rtl = font.isVisibleRightToLeft();
bool const rtl2 = bidi_InRange(pos)
? bidi_level(pos) % 2
- : par.isRightToLeftPar(buf->params);
+ : par.isRightToLeftPar(buf.params);
return rtl != rtl2;
}
int LyXText::leftMargin(ParagraphList::iterator pit, Row const & row) const
-{
- InsetOld * ins;
-
- if (row.pos() < pit->size())
- if (pit->getChar(row.pos()) == Paragraph::META_INSET &&
- (ins = pit->getInset(row.pos())) &&
- (ins->needFullRow() || ins->display()))
- return LEFT_MARGIN;
-
+{
LyXTextClass const & tclass =
bv()->buffer()->params.getLyXTextClass();
LyXLayout_ptr const & layout = pit->layout();
int LyXText::rightMargin(ParagraphList::iterator pit,
- Buffer const & buf, Row const & row) const
+ Buffer const & buf, Row const &) const
{
- InsetOld * ins;
-
- if (row.pos() < pit->size())
- if ((pit->getChar(row.pos()) == Paragraph::META_INSET) &&
- (ins = pit->getInset(row.pos())) &&
- (ins->needFullRow() || ins->display()))
- return PAPER_MARGIN;
-
LyXTextClass const & tclass = buf.params.getLyXTextClass();
LyXLayout_ptr const & layout = pit->layout();
Row const & row) const
{
// maximum pixel width of a row.
- int width = workWidth() - rightMargin(pit, *bv()->buffer(), row);
+ int width = workWidth()
+ - rightMargin(pit, *bv()->buffer(), row);
// inset->textWidth() returns -1 via workWidth(),
// but why ?
// pixel width since last breakpoint
int chunkwidth = 0;
- bool fullrow = false;
pos_type i = pos;
chunkwidth += thiswidth;
InsetOld * in = pit->isInset(i) ? pit->getInset(i) : 0;
- fullrow = in && (in->display() || in->needFullRow());
// break before a character that will fall off
// the right of the row
if (x >= width) {
- // if no break before or we are at an inset
- // that will take up a row, break here
- if (point == last || fullrow || chunkwidth >= (width - left)) {
+ // if no break before, break here
+ if (point == last || chunkwidth >= (width - left)) {
if (pos < i)
point = i - 1;
else
continue;
}
- if (!fullrow)
- continue;
-
- // full row insets start at a new row
- if (i == pos) {
- if (pos < last - 1) {
- point = i;
- if (pit->isLineSeparator(i + 1))
- ++point;
- } else {
- // to avoid extra rows
- point = last;
- }
- } else {
- point = i - 1;
- }
-
- return point;
+ continue;
}
if (point == last && x >= width) {
// manual labels cannot be broken in LaTeX. But we
// want to make our on-screen rendering of footnotes
// etc. still break
- if (!fullrow && body_pos && point < body_pos)
+ if (body_pos && point < body_pos)
point = body_pos - 1;
return point;
font = getFont(pit, i);
endPosOfFontSpan = pit->getEndPosOfFontSpan(i);
}
- w += singleWidth(pit, i, c, font);
+ w += singleWidth(pit, i, c, font);
++i;
}
}
} else {
align = pit->params().align();
}
-
- // center displayed insets
InsetOld * inset = 0;
- if (rit->pos() < pit->size()
- && pit->isInset(rit->pos())
- && (inset = pit->getInset(rit->pos()))
- && (inset->display())) // || (inset->scroll() < 0)))
- align = (inset->lyxCode() == InsetOld::MATHMACRO_CODE)
- ? LYX_ALIGN_BLOCK : LYX_ALIGN_CENTER;
// ERT insets should always be LEFT ALIGNED on screen
inset = pit->inInset();
if (inset && inset->owner() &&
switch (align) {
case LYX_ALIGN_BLOCK:
- {
+ {
int const ns = numberOfSeparators(*pit, rit);
RowList::iterator next_row = boost::next(rit);
if (ns
&& next_row != pit->rows.end()
&& !pit->isNewline(next_row->pos() - 1)
- && !(pit->isInset(next_row->pos())
- && pit->getInset(next_row->pos())
- && pit->getInset(next_row->pos())->display())
) {
- fill_separator = w / ns;
+ fill_separator = w / ns;
} else if (is_rtl) {
x += w;
}
}
}
- computeBidiTables(pit, bv()->buffer(), rit);
+ computeBidiTables(pit, *bv()->buffer(), rit);
if (is_rtl) {
pos_type body_pos = pit->beginningOfBody();
pos_type last = lastPos(*pit, rit);
// Pasting is not allowed, if the paragraphs have different
// layout. I think it is a real bug of all other
// word processors to allow it. It confuses the user.
- //Correction: Pasting is always allowed with standard-layout
+ // Correction: Pasting is always allowed with standard-layout
LyXTextClass const & tclass =
bv()->buffer()->params.getLyXTextClass();
RowList::iterator
LyXText::getRow(ParagraphList::iterator pit, pos_type pos) const
{
- RowList::iterator rit = pit->rows.begin();
- RowList::iterator end = pit->rows.end();
-
-#warning Why is this next thing needed? (Andre)
- while (rit != end
- && rit->pos() < pos
- && boost::next(rit) != end
- && boost::next(rit)->pos() <= pos)
- ++rit;
+ RowList::iterator rit = boost::prior(pit->rows.end());
+ RowList::iterator const begin = pit->rows.begin();
- return rit;
-}
-
-
-// returns pointer to a specified row
-RowList::iterator
-LyXText::getRow(ParagraphList::iterator pit, pos_type pos, int & y) const
-{
- y = 0;
-
- if (noRows())
- return firstRow();
-
- ParagraphList::iterator it = ownerParagraphs().begin();
- for ( ; it != pit; ++it) {
- RowList::iterator beg = it->rows.begin();
- RowList::iterator end = it->rows.end();
- for (RowList::iterator rit = beg; rit != end; ++rit)
- y += rit->height();
- }
-
- RowList::iterator rit = pit->rows.begin();
- RowList::iterator end = pit->rows.end();
- while (rit != end
- && rit->pos() < pos
- && boost::next(rit) != end
- && boost::next(rit)->pos() <= pos) {
- y += rit->height();
- ++rit;
- }
+ while (rit != begin && rit->pos() > pos)
+ --rit;
return rit;
}
// returns pointer to some fancy row 'below' specified row
RowList::iterator LyXText::cursorIRow() const
{
- int y = 0;
- return getRow(cursor.par(), cursor.pos(), y);
+ return getRow(cursor.par(), cursor.pos());
}
-RowList::iterator LyXText::getRowNearY(int & y,
+RowList::iterator LyXText::getRowNearY(int y,
ParagraphList::iterator & pit) const
{
//lyxerr << "getRowNearY: y " << y << endl;
- pit = ownerParagraphs().begin();
- RowList::iterator rit = firstRow();
- RowList::iterator rend = endRow();
- for (; rit != rend; nextRow(pit, rit))
- if (rit->y() > y)
- break;
+ pit = boost::prior(ownerParagraphs().end());
+
+ RowList::iterator rit = lastRow();
+ RowList::iterator rbegin = firstRow();
+
+ while (rit != rbegin && static_cast<int>(rit->y()) > y)
+ previousRow(pit, rit);
- previousRow(pit, rit);
- y = rit->y();
return rit;
}