#include <config.h>
#include <cstdlib>
#include <cctype>
+#include <algorithm>
#ifdef __GNUG__
#pragma implementation "table.h"
#include "lyxtext.h"
#include "support/textutils.h"
#include "insets/insetbib.h"
+#include "insets/insettext.h"
#include "lyx_gui_misc.h"
#include "gettext.h"
#include "bufferparams.h"
#include "LyXView.h"
#include "lyxrow.h"
#include "Painter.h"
+#include "tracer.h"
+#include "font.h"
using std::max;
using std::min;
+using std::endl;
+using std::pair;
static const int LYX_PAPER_MARGIN = 20;
-
-
-// ale070405
extern int bibitemMaxWidth(Painter &, LyXFont const &);
-#define FIX_DOUBLE_SPACE 1
-
static int iso885968x[] = {
0xbc, // 0xa8 = fathatan
0xbd, // 0xa9 = dammatan
0xfe // 0xea = ya
};
+
+inline
bool is_arabic(unsigned char c)
{
return 0xa8 <= c && c <= 0xea && iso885968x[c-0xa8];
}
+
+inline
+bool is_nikud(unsigned char c)
+{
+ return 192 <= c && c <= 210;
+}
+
+
+int LyXText::workWidth(BufferView * bview) const
+{
+ if (inset_owner) {
+ return inset_owner->textWidth(bview->painter());
+ }
+ return bview->workWidth();
+}
+
unsigned char LyXText::TransformChar(unsigned char c, Letter_Form form) const
{
if (is_arabic(c) &&
return c;
}
+
unsigned char LyXText::TransformChar(unsigned char c, LyXParagraph * par,
LyXParagraph::size_type pos) const
{
if (!is_arabic(c))
- return c;
+ if (isdigit(c))
+ return c + (0xb0 - '0');
+ else
+ return c;
bool not_first = (pos > 0 && is_arabic(par->GetChar(pos-1)));
if (pos < par->Last()-1 && is_arabic(par->GetChar(pos+1)))
//
// Lgb
-int LyXText::SingleWidth(LyXParagraph * par,
+int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par,
LyXParagraph::size_type pos) const
{
char c = par->GetChar(pos);
- return SingleWidth(par, pos, c);
+ return SingleWidth(bview, par, pos, c);
}
-int LyXText::SingleWidth(LyXParagraph * par,
+int LyXText::SingleWidth(BufferView * bview, LyXParagraph * par,
LyXParagraph::size_type pos, char c) const
{
- LyXFont font = GetFont(par, pos);
+ LyXFont font = GetFont(bview->buffer(), par, pos);
// The most common case is handled first (Asger)
if (IsPrintable(c)) {
- if (lyxrc.rtl_support && lyxrc.font_norm == "iso8859-6.8x")
- c = TransformChar(c, par, pos);
- return font.width(c);
+ if (font.language()->RightToLeft()) {
+ if (font.language()->lang() == "arabic" &&
+ lyxrc.font_norm == "iso8859-6.8x")
+ c = TransformChar(c, par, pos);
+ else if (font.language()->lang() == "hebrew" &&
+ is_nikud(c))
+ return 0;
+ }
+ return lyxfont::width(c, font);
} else if (IsHfillChar(c)) {
return 3; /* Because of the representation
* as vertical lines */
+#ifndef NEW_INSETS
} else if (c == LyXParagraph::META_FOOTNOTE ||
c == LyXParagraph::META_MARGIN ||
c == LyXParagraph::META_FIG ||
}
font.decSize();
font.decSize();
- return font.stringWidth(fs);
+ return lyxfont::width(fs, font);
+#endif
} else if (c == LyXParagraph::META_INSET) {
- Inset * tmpinset= par->GetInset(pos);
- if (tmpinset)
- return par->GetInset(pos)->width(owner_->painter(),
- font);
- else
+ Inset * tmpinset = par->GetInset(pos);
+ if (tmpinset) {
+ tmpinset->update(bview, font);
+ return tmpinset->width(bview->painter(), font);
+ } else
return 0;
} else if (IsSeparatorChar(c))
c = ' ';
else if (IsNewlineChar(c))
c = 'n';
- return font.width(c);
+ return lyxfont::width(c, font);
}
// Returns the paragraph position of the last character in the specified row
LyXParagraph::size_type LyXText::RowLast(Row const * row) const
{
- if (row->next == 0)
- return row->par->Last() - 1;
- else if (row->next->par != row->par)
- return row->par->Last() - 1;
+ if (row->next() == 0)
+ return row->par()->Last() - 1;
+ else if (row->next()->par() != row->par())
+ return row->par()->Last() - 1;
else
- return row->next->pos - 1;
+ return row->next()->pos() - 1;
}
+LyXParagraph::size_type LyXText::RowLastPrintable(Row const * row) const
+{
+ LyXParagraph::size_type last = RowLast(row);
+ if (last >= row->pos()
+ && row->next()
+ && row->next()->par() == row->par()
+ && row->par()->IsSeparator(last))
+ return last - 1;
+ else
+ return last;
+}
-
-void LyXText::ComputeBidiTables(Row * row) const
+void LyXText::ComputeBidiTables(Buffer const * buf, Row * row) const
{
-
+ bidi_same_direction = true;
if (!lyxrc.rtl_support) {
bidi_start = -1;
return;
}
- LyXParagraph::size_type last = RowLast(row);
- bidi_start = row->pos;
- if (bidi_start > last) {
+ bidi_start = row->pos();
+ bidi_end = RowLastPrintable(row);
+
+ if (bidi_start > bidi_end) {
bidi_start = -1;
return;
}
- if (last + 2 - bidi_start >
+ if (bidi_end + 2 - bidi_start >
static_cast<LyXParagraph::size_type>(log2vis_list.size())) {
LyXParagraph::size_type new_size =
- (last + 2 - bidi_start < 500) ?
- 500 : 2 * (last + 2 - bidi_start);
+ (bidi_end + 2 - bidi_start < 500) ?
+ 500 : 2 * (bidi_end + 2 - bidi_start);
log2vis_list.resize(new_size);
vis2log_list.resize(new_size);
+ bidi_levels.resize(new_size);
}
- vis2log_list[last + 1 - bidi_start] = -1;
- log2vis_list[last + 1 - bidi_start] = -1;
-
- LyXParagraph::size_type main_body = BeginningOfMainBody(row->par);
- if (main_body > 0 && row->pos < main_body - 1 && main_body - 1 <= last
- && row->par->IsLineSeparator(main_body - 1)) {
- // This is needed in case there is a direction change in
- // the label which is continued into the main body
- if (row->par->getParDirection() == LYX_DIR_LEFT_TO_RIGHT) {
- ComputeBidiTablesFromTo(row, bidi_start,
- main_body - 2, 0);
- log2vis_list[main_body - 1 - bidi_start] =
- main_body - 1;
- vis2log_list[main_body - 1 - bidi_start] =
- main_body - 1;
- if (main_body <= last)
- ComputeBidiTablesFromTo(row,
- main_body,last, 0);
- } else {
- ComputeBidiTablesFromTo(row, bidi_start,
- main_body - 2,
- last - main_body + 2);
- log2vis_list[main_body - 1 - bidi_start] =
- last - main_body + 1 + bidi_start;
- vis2log_list[last - main_body + 1 - bidi_start] =
- main_body - 1;
- if (main_body <= last)
- ComputeBidiTablesFromTo(row, main_body,
- last, -main_body);
- }
- } else
- ComputeBidiTablesFromTo(row, bidi_start, last, 0);
-}
-
+ vis2log_list[bidi_end + 1 - bidi_start] = -1;
+ log2vis_list[bidi_end + 1 - bidi_start] = -1;
-void LyXText::ComputeBidiTablesFromTo(Row * row,
- LyXParagraph::size_type from,
- LyXParagraph::size_type to,
- LyXParagraph::size_type offset) const
-{
- LyXParagraph::size_type vpos, old_lpos, stack[2];
- LyXDirection par_direction = row->par->getParDirection();
- LyXDirection direction = par_direction;
- LyXParagraph::size_type lpos = from;
+ LyXParagraph::size_type stack[2];
+ bool rtl_par = row->par()->getParLanguage(buf->params)->RightToLeft();
int level = 0;
+ bool rtl = false;
+ bool rtl0 = false;
+ LyXParagraph::size_type main_body = BeginningOfMainBody(buf, row->par());
+
+ for (LyXParagraph::size_type lpos = bidi_start;
+ lpos <= bidi_end; ++lpos) {
+ bool is_space = row->par()->IsLineSeparator(lpos);
+ LyXParagraph::size_type pos =
+ (is_space && lpos + 1 <= bidi_end &&
+ !row->par()->IsLineSeparator(lpos + 1) &&
+ (!row->par()->table
+ || !row->par()->IsNewline(lpos + 1)) )
+ ? lpos + 1 : lpos;
+ LyXFont font = row->par()->GetFontSettings(buf->params, pos);
+ bool new_rtl = font.isVisibleRightToLeft();
+ bool new_rtl0 = font.isRightToLeft();
+ int new_level;
+
+#ifndef NEW_TABULAR
+ if (row->par()->table && row->par()->IsNewline(lpos)) {
+ new_level = 0;
+ new_rtl = new_rtl0 = false;
+ } else
+#endif
+ if (lpos == main_body - 1
+ && row->pos() < main_body - 1
+ && row->par()->IsLineSeparator(lpos)) {
+ new_level = (rtl_par) ? 1 : 0;
+ new_rtl = new_rtl0 = rtl_par;
+ } else if (new_rtl0)
+ new_level = (new_rtl) ? 1 : 2;
+ else
+ new_level = (rtl_par) ? 2 : 0;
- while (lpos <= to) {
- if (row->par->getLetterDirection(lpos) == direction) {
- log2vis_list[lpos - bidi_start] = direction;
- ++lpos;
- } else {
- if (level == 0 ||
- (level == 1 && direction == LYX_DIR_RIGHT_TO_LEFT
- && row->par->getFont(lpos).direction() ==
- LyXFont::RTL_DIR
- && row->par->getFont(lpos).latex() ==
- LyXFont::ON ) ) {
- // The last check is needed when the
- // char is a space
- stack[level++] = lpos;
- } else {
- old_lpos = stack[--level];
- log2vis_list[old_lpos - bidi_start] =
- log2vis_list[lpos - bidi_start] =
- (old_lpos - lpos) * direction;
- ++lpos;
- }
- direction = static_cast<LyXDirection>(-direction);
+ if (is_space && new_level >= level) {
+ new_level = level;
+ new_rtl = rtl;
+ new_rtl0 = rtl0;
}
+
+ int new_level2 = new_level;
+
+ if (level == new_level && rtl0 != new_rtl0) {
+ --new_level2;
+ log2vis_list[lpos - bidi_start] = (rtl) ? 1 : -1;
+ } else if (level < new_level) {
+ log2vis_list[lpos - bidi_start] = (rtl) ? -1 : 1;
+ if (new_level > rtl_par)
+ bidi_same_direction = false;
+ } else
+ log2vis_list[lpos - bidi_start] = (new_rtl) ? -1 : 1;
+ rtl = new_rtl;
+ rtl0 = new_rtl0;
+ bidi_levels[lpos - bidi_start] = new_level;
+
+ while (level > new_level2) {
+ LyXParagraph::size_type old_lpos =
+ stack[--level];
+ int delta = lpos - old_lpos - 1;
+ if (level % 2)
+ delta = -delta;
+ log2vis_list[lpos - bidi_start] += delta;
+ log2vis_list[old_lpos - bidi_start] += delta;
+ }
+ while (level < new_level)
+ stack[level++] = lpos;
}
while (level > 0) {
- old_lpos = stack[--level];
- log2vis_list[old_lpos - bidi_start] =
- (old_lpos - (to + 1)) * direction;
- direction = static_cast<LyXDirection>(-direction);
+ LyXParagraph::size_type old_lpos = stack[--level];
+ int delta = bidi_end - old_lpos;
+ if (level % 2)
+ delta = -delta;
+ log2vis_list[old_lpos - bidi_start] += delta;
}
- vpos = (par_direction == LYX_DIR_LEFT_TO_RIGHT)
- ? from - 1 : to + 1;
- vpos += offset;
- for (lpos = from; lpos <= to; ++lpos) {
+ LyXParagraph::size_type vpos = bidi_start - 1;
+ for (LyXParagraph::size_type lpos = bidi_start; lpos <= bidi_end; ++lpos) {
vpos += log2vis_list[lpos - bidi_start];
vis2log_list[vpos - bidi_start] = lpos;
log2vis_list[lpos - bidi_start] = vpos;
}
-void LyXText::draw(Row const * row,
+// This method requires a previous call to ComputeBidiTables()
+bool LyXText::IsBoundary(Buffer const * buf, LyXParagraph * par,
+ LyXParagraph::size_type pos) const
+{
+ if (!lyxrc.rtl_support)
+ return false; // This is just for speedup
+
+ if (!bidi_InRange(pos - 1) ||
+ (par->table && par->IsNewline(pos-1)) )
+ return false;
+
+ bool rtl = bidi_level(pos - 1) % 2;
+ bool rtl2 = rtl;
+ if (pos == par->Last() ||
+ (par->table && par->IsNewline(pos)))
+ rtl2 = par->isRightToLeftPar(buf->params);
+ else if (bidi_InRange(pos))
+ rtl2 = bidi_level(pos) % 2;
+ return rtl != rtl2;
+}
+
+
+bool LyXText::IsBoundary(Buffer const * buf, LyXParagraph * par,
+ LyXParagraph::size_type pos,
+ LyXFont const & font) const
+{
+ if (!lyxrc.rtl_support)
+ return false; // This is just for speedup
+
+ bool rtl = font.isVisibleRightToLeft();
+ bool rtl2 = rtl;
+ if (pos == par->Last() ||
+ (par->table && par->IsNewline(pos)))
+ rtl2 = par->isRightToLeftPar(buf->params);
+ else if (bidi_InRange(pos))
+ rtl2 = bidi_level(pos) % 2;
+ return rtl != rtl2;
+}
+
+
+void LyXText::draw(BufferView * bview, Row const * row,
LyXParagraph::size_type & vpos,
- int offset, float & x)
+ int offset, float & x, bool cleared)
{
- Painter & pain = owner_->painter();
+ Painter & pain = bview->painter();
LyXParagraph::size_type pos = vis2log(vpos);
- char c = row->par->GetChar(pos);
+ char c = row->par()->GetChar(pos);
+ float tmpx = x;
if (IsNewlineChar(c)) {
++vpos;
// Draw end-of-line marker
- LyXFont font = GetFont(row->par, pos);
- int wid = font.width('n');
- int asc = font.maxAscent();
- int y = offset + row->baseline;
+ LyXFont font = GetFont(bview->buffer(), row->par(), pos);
+ int wid = lyxfont::width('n', font);
+ int asc = lyxfont::maxAscent(font);
+ int y = offset + row->baseline();
int xp[3], yp[3];
- if (row->par->getLetterDirection(pos) == LYX_DIR_LEFT_TO_RIGHT) {
+ if (bidi_level(pos) % 2 == 0) {
xp[0] = int(x + wid * 0.375);
yp[0] = int(y - 0.875 * asc * 0.75);
return;
}
- LyXFont font = GetFont(row->par, pos);
+ LyXFont font = GetFont(bview->buffer(), row->par(), pos);
LyXFont font2 = font;
-
+#ifndef NEW_INSETS
if (c == LyXParagraph::META_FOOTNOTE
|| c == LyXParagraph::META_MARGIN
|| c == LyXParagraph::META_FIG
switch (c) {
case LyXParagraph::META_MARGIN:
fs = "margin";
- // Draw a sign at the left margin!
- owner_->painter()
- .text((LYX_PAPER_MARGIN - font.width('!'))/2,
- offset + row->baseline, "!", 1, font);
break;
case LyXParagraph::META_FIG:
fs = "fig";
font.decSize();
// calculate the position of the footnotemark
- int y = (row->baseline - font2.maxAscent()
- + font.maxAscent());
+ int y = (row->baseline() - lyxfont::maxAscent(font2)
+ + lyxfont::maxAscent(font));
font.setColor(LColor::footnote);
- float tmpx = x;
-
// draw it and set new x position
pain.text(int(x), offset + y, fs, font);
- x += pain.width(fs, font);
- pain.line(int(tmpx), offset + row->baseline,
- int(x), offset + row->baseline,
+ x += lyxfont::width(fs, font);
+ pain.line(int(tmpx), offset + row->baseline(),
+ int(x), offset + row->baseline(),
LColor::footnote);
++vpos;
return;
- } else if (c == LyXParagraph::META_INSET) {
- Inset * tmpinset = row->par->GetInset(pos);
+ } else
+#endif
+ if (c == LyXParagraph::META_INSET) {
+ Inset * tmpinset = row->par()->GetInset(pos);
if (tmpinset) {
- tmpinset->draw(owner_->painter(), font,
- offset + row->baseline, x);
+ tmpinset->update(bview, font, false);
+ tmpinset->draw(bview, font, offset+row->baseline(), x,
+ cleared);
}
++vpos;
+
+ if (lyxrc.mark_foreign_language &&
+ font.language() != bview->buffer()->params.language_info) {
+ int y = offset + row->height() - 1;
+ pain.line(int(tmpx), y, int(x), y,
+ LColor::language);
+ }
+
return;
}
// So IMHO we should go with the easier and clearer implementation.
// And even if 1024 is a large number here it might overflow, string
// will only overflow if the machine is out of memory...
- bool do_transform = (lyxrc.rtl_support && lyxrc.font_norm == "iso8859-6.8x");
- if (do_transform)
- c = TransformChar(c, row->par, pos);
static string textstring;
textstring = c;
++vpos;
- LyXParagraph::size_type last = RowLast(row);
-
- while (vpos <= last &&
- (pos = vis2log(vpos)) >= 0
- && static_cast<unsigned char>(c = row->par->GetChar(pos)) > ' '
- && font2 == GetFont(row->par, pos)) {
- if (do_transform)
- c = TransformChar(c, row->par, pos);
- textstring += c;
- ++vpos;
+ LyXParagraph::size_type last = RowLastPrintable(row);
+
+ if (font.language()->lang() == "hebrew") {
+ if (is_nikud(c)) {
+ LyXParagraph::size_type vpos2 = vpos;
+ int width = lyxfont::width(c, font2);
+ int dx = 0;
+ while (vpos2 <= last &&
+ (pos = vis2log(vpos2)) >= 0
+ && static_cast<unsigned char>(c = row->par()->GetChar(pos)) > ' '
+ && is_nikud(c))
+ ++vpos2;
+ if (static_cast<unsigned char>(c = row->par()->GetChar(pos)) > ' '
+ && !is_nikud(c)) {
+ int width2 = SingleWidth(bview, row->par(), pos, c);
+ dx = (c == 'ø' || c == 'ã')
+ ? width2 - width : (width2 - width) / 2;
+ }
+ // Draw nikud
+ pain.text(int(x) + dx, offset + row->baseline(),
+ textstring, font);
+ } else {
+ while (vpos <= last &&
+ (pos = vis2log(vpos)) >= 0
+ && static_cast<unsigned char>(c = row->par()->GetChar(pos)) > ' '
+ && !is_nikud(c)
+ && font2 == GetFont(bview->buffer(), row->par(), pos)) {
+ textstring += c;
+ ++vpos;
+ }
+ // Draw text and set the new x position
+ pain.text(int(x), offset + row->baseline(),
+ textstring, font);
+ x += lyxfont::width(textstring, font);
+ }
+ } else if (font.language()->lang() == "arabic" &&
+ lyxrc.font_norm == "iso8859-6.8x") {
+ textstring = TransformChar(c, row->par(), pos);
+ while (vpos <= last &&
+ (pos = vis2log(vpos)) >= 0
+ && static_cast<unsigned char>(c = row->par()->GetChar(pos)) > ' '
+ && font2 == GetFont(bview->buffer(), row->par(), pos)) {
+ c = TransformChar(c, row->par(), pos);
+ textstring += c;
+ ++vpos;
+ }
+ // Draw text and set the new x position
+ pain.text(int(x), offset + row->baseline(), textstring, font);
+ x += lyxfont::width(textstring, font);
+ } else {
+ while (vpos <= last &&
+ (pos = vis2log(vpos)) >= 0
+ && static_cast<unsigned char>(c = row->par()->GetChar(pos)) > ' '
+ && font2 == GetFont(bview->buffer(), row->par(), pos)) {
+ textstring += c;
+ ++vpos;
+ }
+ // Draw text and set the new x position
+ pain.text(int(x), offset + row->baseline(), textstring, font);
+ x += lyxfont::width(textstring, font);
}
- float tmpx = x;
-
- // Draw text and set the new x position
- pain.text(int(x), offset + row->baseline, textstring, font);
- x += pain.width(textstring, font);
// what about underbars?
if (font.underbar() == LyXFont::ON && font.latex() != LyXFont::ON) {
- pain.line(tmpx, offset + row->baseline + 2,
- x, offset + row->baseline + 2);
+ pain.line(int(tmpx), offset + row->baseline() + 2,
+ int(x), offset + row->baseline() + 2);
+ } else if (lyxrc.mark_foreign_language &&
+ font.language() != bview->buffer()->params.language_info) {
+ int y = offset + row->height() - 1;
+ pain.line(int(tmpx), y, int(x), y,
+ LColor::language);
}
// If we want ulem.sty support, drawing
// This information cannot be taken from the layouts-objekt, because in
// LaTeX the beginning of the text fits in some cases (for example sections)
// exactly the label-width.
-int LyXText::LeftMargin(Row const * row) const
+int LyXText::LeftMargin(BufferView * bview, Row const * row) const
{
- LyXLayout const & layout = textclasslist.Style(parameters->textclass,
- row->par->GetLayout());
+ LyXLayout const & layout =
+ textclasslist.Style(bview->buffer()->params.textclass,
+ row->par()->GetLayout());
string parindent = layout.parindent;
-
+
+#ifndef NEW_TABULAR
/* table stuff -- begin */
- if (row->par->table)
- parindent.clear();
+ if (row->par()->table)
+ parindent.erase();
/* table stuff -- end */
-
+#endif
int x = LYX_PAPER_MARGIN;
- x += textclasslist.TextClass(parameters->textclass)
- .defaultfont()
- .signedStringWidth(textclasslist
- .TextClass(parameters->textclass)
- .leftmargin());
-
- if (row->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
+ x += lyxfont::signedWidth(textclasslist
+ .TextClass(bview->buffer()->params.textclass)
+ .leftmargin(),
+ textclasslist
+ .TextClass(bview->buffer()->params.textclass)
+ .defaultfont());
+#ifndef NEW_INSETS
+ if (row->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
LyXFont font(LyXFont::ALL_SANE);
font.setSize(LyXFont::SIZE_SMALL);
- x += font.textWidth("Mwide-figM", 10) + LYX_PAPER_MARGIN/2;
+ x += lyxfont::width("Mwide-figM", font)
+ + LYX_PAPER_MARGIN/2;
}
-
+#endif
// this is the way, LyX handles the LaTeX-Environments.
// I have had this idea very late, so it seems to be a
// later added hack and this is true
- if (!row->par->GetDepth()) {
- if (!row->par->GetLayout()) {
+ if (!row->par()->GetDepth()) {
+ if (!row->par()->GetLayout()) {
// find the previous same level paragraph
- if (row->par->FirstPhysicalPar()->Previous()) {
- LyXParagraph * newpar = row->par
- ->DepthHook(row->par->GetDepth());
+ if (row->par()->FirstPhysicalPar()->Previous()) {
+ LyXParagraph * newpar = row->par()
+ ->DepthHook(row->par()->GetDepth());
if (newpar &&
- textclasslist.Style(parameters->textclass,
+ textclasslist.Style(bview->buffer()->params.textclass,
newpar->GetLayout())
.nextnoindent)
- parindent.clear();
+ parindent.erase();
}
}
} else {
// find the next level paragraph
- LyXParagraph * newpar = row->par->DepthHook(row->par->GetDepth()-1);
+ LyXParagraph * newpar =
+ row->par()->DepthHook(row->par()->GetDepth()-1);
// make a corresponding row. Needed to call LeftMargin()
// check wether it is a sufficent paragraph
- if (newpar && newpar->footnoteflag == row->par->footnoteflag
+ if (newpar && newpar->footnoteflag == row->par()->footnoteflag
&& textclasslist
- .Style(parameters->textclass,
+ .Style(bview->buffer()->params.textclass,
newpar->GetLayout()).isEnvironment()) {
Row dummyrow;
- dummyrow.par = newpar;
- dummyrow.pos = newpar->Last();
- x = LeftMargin(&dummyrow);
+ dummyrow.par(newpar);
+ dummyrow.pos(newpar->Last());
+ x = LeftMargin(bview, &dummyrow);
} else {
// this is no longer an error, because this function
// is used to clear impossible depths after changing
// a layout. Since there is always a redo,
// LeftMargin() is always called
- row->par->FirstPhysicalPar()->depth = 0;
+ row->par()->FirstPhysicalPar()->depth = 0;
}
- if (newpar && !row->par->GetLayout()) {
+ if (newpar && !row->par()->GetLayout()) {
if (newpar->FirstPhysicalPar()->noindent)
- parindent.clear();
+ parindent.erase();
else
parindent = textclasslist
- .Style(parameters->textclass,
+ .Style(bview->buffer()->params.textclass,
newpar->GetLayout()).parindent;
}
}
- LyXFont labelfont = GetFont(row->par, -2);
+ LyXFont labelfont = GetFont(bview->buffer(), row->par(), -2);
switch (layout.margintype) {
case MARGIN_DYNAMIC:
if (!layout.leftmargin.empty()) {
- x += textclasslist
- .TextClass(parameters->textclass)
- .defaultfont()
- .signedStringWidth(layout.leftmargin);
+ x += lyxfont::signedWidth(layout.leftmargin,
+ textclasslist
+ .TextClass(bview->buffer()->params.
+ textclass)
+ .defaultfont());
}
- if (!row->par->GetLabestring().empty()) {
- x += labelfont.signedStringWidth(layout.labelindent);
- x += labelfont.stringWidth(row->par->GetLabestring());
- x += labelfont.stringWidth(layout.labelsep);
+ if (!row->par()->GetLabelstring().empty()) {
+ x += lyxfont::signedWidth(layout.labelindent,
+ labelfont);
+ x += lyxfont::width(row->par()->GetLabelstring(),
+ labelfont);
+ x += lyxfont::width(layout.labelsep, labelfont);
}
break;
case MARGIN_MANUAL:
- x += labelfont.signedStringWidth(layout.labelindent);
- if (row->pos >= BeginningOfMainBody(row->par)) {
- if (!row->par->GetLabelWidthString().empty()) {
- x += labelfont
- .stringWidth(row->par
- ->GetLabelWidthString());
- x += labelfont.stringWidth(layout.labelsep);
+ x += lyxfont::signedWidth(layout.labelindent, labelfont);
+ if (row->pos() >= BeginningOfMainBody(bview->buffer(), row->par())) {
+ if (!row->par()->GetLabelWidthString().empty()) {
+ x += lyxfont::width(row->par()->GetLabelWidthString(),
+ labelfont);
+ x += lyxfont::width(layout.labelsep, labelfont);
}
}
break;
case MARGIN_STATIC:
- x += textclasslist.TextClass(parameters->textclass)
- .defaultfont().signedStringWidth(layout.leftmargin) * 4
- / (row->par->GetDepth() + 4);
+ x += lyxfont::signedWidth(layout.leftmargin, textclasslist.TextClass(bview->buffer()->params.textclass).defaultfont()) * 4
+ / (row->par()->GetDepth() + 4);
break;
case MARGIN_FIRST_DYNAMIC:
if (layout.labeltype == LABEL_MANUAL) {
- if (row->pos >= BeginningOfMainBody(row->par)) {
- x += labelfont
- .signedStringWidth(layout.leftmargin);
+ if (row->pos() >= BeginningOfMainBody(bview->buffer(), row->par())) {
+ x += lyxfont::signedWidth(layout.leftmargin,
+ labelfont);
} else {
- x += labelfont
- .signedStringWidth(layout.labelindent);
+ x += lyxfont::signedWidth(layout.labelindent,
+ labelfont);
}
- } else if (row->pos
+ } else if (row->pos()
// Special case to fix problems with
// theorems (JMarc)
|| (layout.labeltype == LABEL_STATIC
&& layout.latextype == LATEX_ENVIRONMENT
- && ! row->par->IsFirstInSequence())) {
- x += labelfont.signedStringWidth(layout.leftmargin);
+ && ! row->par()->IsFirstInSequence())) {
+ x += lyxfont::signedWidth(layout.leftmargin,
+ labelfont);
} else if (layout.labeltype != LABEL_TOP_ENVIRONMENT
&& layout.labeltype != LABEL_BIBLIO
&& layout.labeltype !=
LABEL_CENTERED_TOP_ENVIRONMENT) {
- x += labelfont.signedStringWidth(layout.labelindent);
- x += labelfont.stringWidth(layout.labelsep);
- x += labelfont.stringWidth(row->par->GetLabestring());
+ x += lyxfont::signedWidth(layout.labelindent,
+ labelfont);
+ x += lyxfont::width(layout.labelsep, labelfont);
+ x += lyxfont::width(row->par()->GetLabelstring(),
+ labelfont);
}
break;
// find the first row of this paragraph
Row const * tmprow = row;
- while (tmprow->previous && tmprow->previous->par == row->par)
- tmprow = tmprow->previous;
+ while (tmprow->previous()
+ && tmprow->previous()->par() == row->par())
+ tmprow = tmprow->previous();
- int minfill = tmprow->fill;
- while (tmprow->next && tmprow->next->par == row->par) {
- tmprow = tmprow->next;
- if (tmprow->fill < minfill)
- minfill = tmprow->fill;
+ int minfill = tmprow->fill();
+ while (tmprow->next() && tmprow->next()->par() == row->par()) {
+ tmprow = tmprow->next();
+ if (tmprow->fill() < minfill)
+ minfill = tmprow->fill();
}
- x += textclasslist.TextClass(parameters->textclass)
- .defaultfont().signedStringWidth(layout.leftmargin);
+ x += lyxfont::signedWidth(layout.leftmargin,
+ textclasslist
+ .TextClass(bview->buffer()->params.textclass)
+ .defaultfont());
x += minfill;
}
break;
}
- if (row->par->pextra_type == LyXParagraph::PEXTRA_INDENT) {
- if (!row->par->pextra_widthp.empty()) {
- x += paperwidth *
- atoi(row->par->pextra_widthp.c_str()) / 100;
- } else if (!row->par->pextra_width.empty()) {
- int xx = VSpace(row->par->pextra_width).inPixels(owner_);
-
- if (xx > paperwidth)
- xx = paperwidth * 80 / 100;
+ if ((workWidth(bview) > 0) &&
+ (row->par()->pextra_type == LyXParagraph::PEXTRA_INDENT))
+ {
+ if (!row->par()->pextra_widthp.empty()) {
+ x += workWidth(bview) *
+ atoi(row->par()->pextra_widthp.c_str()) / 100;
+ } else if (!row->par()->pextra_width.empty()) {
+ int xx = VSpace(row->par()->pextra_width).inPixels(bview);
+ if (xx > workWidth(bview))
+ xx = workWidth(bview) * 80 / 100;
x += xx;
} else { // should not happen
LyXFont font(LyXFont::ALL_SANE);
- x += font.stringWidth("XXXXXX");
+ x += lyxfont::width("XXXXXX", font);
}
}
int align; // wrong type
- if (row->par->FirstPhysicalPar()->align == LYX_ALIGN_LAYOUT)
+ if (row->par()->FirstPhysicalPar()->align == LYX_ALIGN_LAYOUT)
align = layout.align;
else
- align = row->par->FirstPhysicalPar()->align;
+ align = row->par()->FirstPhysicalPar()->align;
// set the correct parindent
- if (row->pos == 0) {
+ if (row->pos() == 0) {
if ((layout.labeltype == LABEL_NO_LABEL
|| layout.labeltype == LABEL_TOP_ENVIRONMENT
|| layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT
|| (layout.labeltype == LABEL_STATIC
&& layout.latextype == LATEX_ENVIRONMENT
- && ! row->par->IsFirstInSequence()))
- && row->par == row->par->FirstPhysicalPar()
+ && ! row->par()->IsFirstInSequence()))
+ && row->par() == row->par()->FirstPhysicalPar()
&& align == LYX_ALIGN_BLOCK
- && !row->par->noindent
- && (row->par->layout ||
- parameters->paragraph_separation ==
+ && !row->par()->noindent
+ && (row->par()->layout ||
+ bview->buffer()->params.paragraph_separation ==
BufferParams::PARSEP_INDENT))
- x += textclasslist.TextClass(parameters->textclass)
- .defaultfont().signedStringWidth(parindent);
+ x += lyxfont::signedWidth(parindent,
+ textclasslist
+ .TextClass(bview->buffer()->params
+ .textclass)
+ .defaultfont());
else if (layout.labeltype == LABEL_BIBLIO) {
// ale970405 Right width for bibitems
- x += bibitemMaxWidth(owner_->painter(),
+ x += bibitemMaxWidth(bview->painter(),
textclasslist
- .TextClass(parameters
- ->textclass)
+ .TextClass(bview->buffer()->params
+ .textclass)
.defaultfont());
}
}
return x;
}
-
-
-int LyXText::RightMargin(Row const * row) const
+
+
+int LyXText::RightMargin(Buffer const * buf, Row const * row) const
{
LyXLayout const & layout =
- textclasslist.Style(parameters->textclass,
- row->par->GetLayout());
+ textclasslist.Style(buf->params.textclass,
+ row->par()->GetLayout());
int x = LYX_PAPER_MARGIN
- + textclasslist
- .TextClass(parameters->textclass)
- .defaultfont()
- .signedStringWidth(textclasslist
- .TextClass(parameters->textclass)
- .rightmargin());
-
- if (row->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
+ + lyxfont::signedWidth(textclasslist
+ .TextClass(buf->params.textclass)
+ .rightmargin(),
+ textclasslist
+ .TextClass(buf->params.textclass)
+ .defaultfont());
+
+#ifndef NEW_INSETS
+ if (row->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
x += LYX_PAPER_MARGIN / 2;
}
-
+#endif
// this is the way, LyX handles the LaTeX-Environments.
// I have had this idea very late, so it seems to be a
// later added hack and this is true
- if (row->par->GetDepth()) {
+ if (row->par()->GetDepth()) {
// find the next level paragraph
- LyXParagraph * newpar = row->par;
+ LyXParagraph * newpar = row->par();
do {
newpar = newpar->FirstPhysicalPar()->Previous();
if (newpar)
newpar = newpar->FirstPhysicalPar();
- } while (newpar && newpar->GetDepth() >= row->par->GetDepth()
- && newpar->footnoteflag == row->par->footnoteflag);
+ } while (newpar && newpar->GetDepth() >= row->par()->GetDepth()
+ && newpar->footnoteflag == row->par()->footnoteflag);
// make a corresponding row. Needed to call LeftMargin()
// check wether it is a sufficent paragraph
- if (newpar && newpar->footnoteflag == row->par->footnoteflag
- && textclasslist.Style(parameters->textclass,
+ if (newpar && newpar->footnoteflag == row->par()->footnoteflag
+ && textclasslist.Style(buf->params.textclass,
newpar->GetLayout())
.isEnvironment()) {
Row dummyrow;
- dummyrow.par = newpar;
- dummyrow.pos = 0;
- x = RightMargin(&dummyrow);
+ dummyrow.par(newpar);
+ dummyrow.pos(0);
+ x = RightMargin(buf, &dummyrow);
} else {
// this is no longer an error, because this function
// is used to clear impossible depths after changing
// a layout. Since there is always a redo,
// LeftMargin() is always called
- row->par->FirstPhysicalPar()->depth = 0;
+ row->par()->FirstPhysicalPar()->depth = 0;
}
}
//lyxerr << "rightmargin: " << layout->rightmargin << endl;
- x += textclasslist.TextClass(parameters->textclass)
- .defaultfont()
- .signedStringWidth(layout.rightmargin) * 4
- / (row->par->GetDepth() + 4);
+ x += lyxfont::signedWidth(layout.rightmargin, textclasslist
+ .TextClass(buf->params.textclass)
+ .defaultfont()) * 4 / (row->par()->GetDepth()
+ + 4);
return x;
}
-int LyXText::LabelEnd (Row const * row) const
+int LyXText::LabelEnd (BufferView * bview, Row const * row) const
{
- if (textclasslist.Style(parameters->textclass,
- row->par->GetLayout()).margintype
+ if (textclasslist.Style(bview->buffer()->params.textclass,
+ row->par()->GetLayout()).margintype
== MARGIN_MANUAL) {
Row tmprow;
tmprow = *row;
- tmprow.pos = row->par->Last();
- return LeftMargin(&tmprow); /* just the beginning
+ tmprow.pos(row->par()->Last());
+ return LeftMargin(bview, &tmprow); /* just the beginning
of the main body */
} else
return 0; /* LabelEnd is only needed, if the
}
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
int LyXText::NumberOfCell(LyXParagraph * par,
LyXParagraph::size_type pos) const
}
-int LyXText::WidthOfCell(LyXParagraph * par,
+int LyXText::WidthOfCell(BufferView * bview, LyXParagraph * par,
LyXParagraph::size_type & pos) const
{
int w = 0;
while (pos < par->Last() && !par->IsNewline(pos)) {
- w += SingleWidth(par, pos);
+ w += SingleWidth(bview, par, pos);
++pos;
}
if (par->IsNewline(pos))
}
-bool LyXText::HitInTable(Row * row, int x) const
+bool LyXText::HitInTable(BufferView * bview, Row * row, int x) const
{
float tmpx;
float fill_separator, fill_hfill, fill_label_hfill;
- if (!row->par->table)
+ if (!row->par()->table)
return false;
- PrepareToPrint(row, tmpx, fill_separator,
+ PrepareToPrint(bview, row, tmpx, fill_separator,
fill_hfill, fill_label_hfill, false);
- return (x > tmpx && x < tmpx + row->par->table->WidthOfTable());
+ return (x > tmpx && x < tmpx + row->par()->table->WidthOfTable());
}
-bool LyXText::MouseHitInTable(int x, long y) const
+bool LyXText::MouseHitInTable(BufferView * bview, int x, long y) const
{
Row * row = GetRowNearY(y);
- return HitInTable(row, x);
+ return HitInTable(bview, row, x);
}
/* table stuff -- end*/
+#endif
// get the next breakpoint in a given paragraph
LyXParagraph::size_type
-LyXText::NextBreakPoint(Row const * row, int width) const
+LyXText::NextBreakPoint(BufferView * bview, Row const * row, int width) const
{
- LyXParagraph * par = row->par;
- LyXParagraph::size_type pos = row->pos;
-
+ LyXParagraph * par = row->par();
+ LyXParagraph::size_type pos = row->pos();
+
+ if (width < 0)
+ return par->Last();
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
if (par->table) {
while (pos < par->size()
&& (!par->IsNewline(pos)
- || !par->table->IsFirstCell(NumberOfCell(par, pos+1)))) {
+ || !par->table->IsFirstCell(NumberOfCell(par, pos + 1)))) {
if (par->GetChar(pos) == LyXParagraph::META_INSET &&
par->GetInset(pos) && par->GetInset(pos)->display()){
par->GetInset(pos)->display(false);
return pos;
}
/* table stuff -- end*/
-
+#endif
// position of the last possible breakpoint
// -1 isn't a suitable value, but a flag
LyXParagraph::size_type last_separator = -1;
- width -= RightMargin(row);
+ width -= RightMargin(bview->buffer(), row);
- LyXParagraph::size_type main_body = BeginningOfMainBody(par);
+ LyXParagraph::size_type main_body = BeginningOfMainBody(bview->buffer(), par);
LyXLayout const & layout =
- textclasslist.Style(parameters->textclass, par->GetLayout());
+ textclasslist.Style(bview->buffer()->params.textclass, par->GetLayout());
LyXParagraph::size_type i = pos;
if (layout.margintype == MARGIN_RIGHT_ADDRESS_BOX) {
LyXParagraph::size_type const last =
par->Last();
// this is the usual handling
- int x = LeftMargin(row);
- while (x < width && i < last) {
+ int x = LeftMargin(bview, row);
+ bool doitonetime = true;
+ while (doitonetime || ((x < width) && (i < last))) {
+ doitonetime = false;
char c = par->GetChar(i);
if (IsNewlineChar(c)) {
last_separator = i;
x = width; // this means break
} else if (c == LyXParagraph::META_INSET &&
- par->GetInset(i) && par->GetInset(i)->display()){
+ par->GetInset(i)) {
+
// check wether a Display() inset is
// valid here. if not, change it to
// non-display
- if (layout.isCommand()
- || (layout.labeltype == LABEL_MANUAL
- && i < BeginningOfMainBody(par))){
+ if (par->GetInset(i)->display() &&
+ (layout.isCommand() ||
+ ((layout.labeltype == LABEL_MANUAL) &&
+ (i < BeginningOfMainBody(bview->buffer(), par))))) {
// display istn't allowd
par->GetInset(i)->display(false);
- x += SingleWidth(par, i, c);
- } else {
- // inset is display. So break the line here
- if (i == pos){
+ x += SingleWidth(bview, par, i, c);
+ } else if (par->GetInset(i)->display() ||
+ par->GetInset(i)->needFullRow()) {
+ // So break the line here
+ if (i == pos) {
if (pos < last-1) {
last_separator = i;
if (IsLineSeparatorChar(par->GetChar(i+1)))
} else
last_separator = i - 1;
x = width; // this means break
+ } else {
+#if 0
+ last_separator = i;
+ x += width;
+#else
+ x += SingleWidth(bview, par, i, c);
+#endif
}
} else {
if (IsLineSeparatorChar(c))
last_separator = i;
- x += SingleWidth(par, i, c);
+ x += SingleWidth(bview, par, i, c);
}
++i;
if (i == main_body) {
- x += GetFont(par, -2).stringWidth(layout.labelsep);
+ x += lyxfont::width(layout.labelsep,
+ GetFont(bview->buffer(), par, -2));
if (par->IsLineSeparator(i - 1))
- x-= SingleWidth(par, i - 1);
- int left_margin = LabelEnd(row);
+ x-= SingleWidth(bview, par, i - 1);
+ int left_margin = LabelEnd(bview, row);
if (x < left_margin)
x = left_margin;
}
// returns the minimum space a row needs on the screen in pixel
-int LyXText::Fill(Row const * row, int paper_width) const
+int LyXText::Fill(BufferView * bview, Row * row, int paper_width) const
{
+ if (paper_width < 0)
+ return 0;
+
int w, fill;
// get the pure distance
- LyXParagraph::size_type last = RowLast(row);
+ LyXParagraph::size_type last = RowLastPrintable(row);
+#ifndef NEW_TABULAR
/* table stuff -- begin */
- if (row->par->table) {
+ if (row->par()->table) {
// for tables FILL does calculate the widthes of each cell in
// the row
- LyXParagraph::size_type pos = row->pos;
- int cell = NumberOfCell(row->par, pos);
+ LyXParagraph::size_type pos = row->pos();
+ int cell = NumberOfCell(row->par(), pos);
w = 0;
do {
- row->par->table->SetWidthOfCell(cell,
- WidthOfCell(row->par,
+ row->par()->table->SetWidthOfCell(cell,
+ WidthOfCell(bview,
+ row->par(),
pos));
++cell;
- } while (pos <= last && !row->par->table->IsFirstCell(cell));
+ } while (pos <= last && !row->par()->table->IsFirstCell(cell));
// don't forget the very last table cell without characters
- if (cell == row->par->table->GetNumberOfCells() - 1)
- row->par->table->SetWidthOfCell(cell,
- WidthOfCell(row->par,
+ if (cell == row->par()->table->GetNumberOfCells() - 1)
+ row->par()->table->SetWidthOfCell(cell,
+ WidthOfCell(bview,
+ row->par(),
pos));
return 0; /* width of table cannot be returned since
* this point. */
}
/* table stuff -- end*/
-
- // if the row ends with newline, this newline will not be relevant
- //if (last >= 0 && row->par->IsNewline(last))
- // --last;
-
- // if the row ends with a space, this space will not be relevant
- if (last >= 0 && row->par->IsLineSeparator(last))
- --last;
+#endif
// special handling of the right address boxes
- if (textclasslist.Style(parameters->textclass,
- row->par->GetLayout()).margintype
+ if (textclasslist.Style(bview->buffer()->params.textclass,
+ row->par()->GetLayout()).margintype
== MARGIN_RIGHT_ADDRESS_BOX) {
- int tmpfill = row->fill;
- row->fill = 0; // the minfill in MarginLeft()
- w = LeftMargin(row);
- row->fill = tmpfill;
+ int tmpfill = row->fill();
+ row->fill(0); // the minfill in MarginLeft()
+ w = LeftMargin(bview, row);
+ row->fill(tmpfill);
} else
- w = LeftMargin(row);
+ w = LeftMargin(bview, row);
- LyXLayout const & layout = textclasslist.Style(parameters->textclass,
- row->par->GetLayout());
+ LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass,
+ row->par()->GetLayout());
LyXParagraph::size_type main_body =
- BeginningOfMainBody(row->par);
- LyXParagraph::size_type i = row->pos;
+ BeginningOfMainBody(bview->buffer(), row->par());
+ LyXParagraph::size_type i = row->pos();
while (i <= last) {
if (main_body > 0 && i == main_body) {
- w += GetFont(row->par, -2).
- stringWidth(layout.labelsep);
- if (row->par->IsLineSeparator(i - 1))
- w -= SingleWidth(row->par, i - 1);
- int left_margin = LabelEnd(row);
+ w += lyxfont::width(layout.labelsep, GetFont(bview->buffer(), row->par(), -2));
+ if (row->par()->IsLineSeparator(i - 1))
+ w -= SingleWidth(bview, row->par(), i - 1);
+ int left_margin = LabelEnd(bview, row);
if (w < left_margin)
w = left_margin;
}
- w += SingleWidth(row->par, i);
+ w += SingleWidth(bview, row->par(), i);
++i;
}
if (main_body > 0 && main_body > last) {
- w += GetFont(row->par, -2).stringWidth(layout.labelsep);
- if (last >= 0 && row->par->IsLineSeparator(last))
- w -= SingleWidth(row->par, last);
- int left_margin = LabelEnd(row);
+ w += lyxfont::width(layout.labelsep, GetFont(bview->buffer(), row->par(), -2));
+ if (last >= 0 && row->par()->IsLineSeparator(last))
+ w -= SingleWidth(bview, row->par(), last);
+ int left_margin = LabelEnd(bview, row);
if (w < left_margin)
w = left_margin;
}
- fill = paper_width - w - RightMargin(row);
+ fill = paper_width - w - RightMargin(bview->buffer(), row);
return fill;
}
// returns the minimum space a manual label needs on the screen in pixel
-int LyXText::LabelFill(Row const * row) const
+int LyXText::LabelFill(BufferView * bview, Row const * row) const
{
- LyXParagraph::size_type last = BeginningOfMainBody(row->par) - 1;
+ LyXParagraph::size_type last = BeginningOfMainBody(bview->buffer(), row->par())-1;
// -1 because a label ends either with a space that is in the label,
// or with the beginning of a footnote that is outside the label.
// environment with a manual label. (Asger)
if (last < 0) last = 0;
- if (row->par->IsLineSeparator(last)) /* a sepearator at this end
+ if (row->par()->IsLineSeparator(last)) /* a sepearator at this end
does not count */
--last;
int w = 0;
- int i = row->pos;
+ int i = row->pos();
while (i <= last) {
- w += SingleWidth(row->par, i);
+ w += SingleWidth(bview, row->par(), i);
++i;
}
int fill = 0;
- if (!row->par->labelwidthstring.empty()) {
- fill = GetFont(row->par, -2)
- .stringWidth(row->par->labelwidthstring) - w;
+ if (!row->par()->labelwidthstring.empty()) {
+ fill = max(lyxfont::width(row->par()->labelwidthstring,
+ GetFont(bview->buffer(), row->par(), -2)) - w,
+ 0);
}
- if (fill < 0)
- fill = 0;
-
return fill;
}
// returns the number of separators in the specified row. The separator
// on the very last column doesnt count
-int LyXText::NumberOfSeparators(Row const * row) const
+int LyXText::NumberOfSeparators(Buffer const * buf, Row const * row) const
{
int last = RowLast(row);
- int p = max(row->pos, BeginningOfMainBody(row->par));
+ int p = max(row->pos(), BeginningOfMainBody(buf, row->par()));
int n = 0;
for (; p < last; ++p) {
- if (row->par->IsSeparator(p)) {
+ if (row->par()->IsSeparator(p)) {
++n;
}
}
// returns the number of hfills in the specified row. The LyX-Hfill is
// a LaTeX \hfill so that the hfills at the beginning and at the end were
// ignored. This is *MUCH* more usefull than not to ignore!
-int LyXText::NumberOfHfills(Row const * row) const
+int LyXText::NumberOfHfills(Buffer const * buf, Row const * row) const
{
int last = RowLast(row);
- int first = row->pos;
+ int first = row->pos();
if (first) { /* hfill *DO* count at the beginning
* of paragraphs! */
- while(first <= last && row->par->IsHfill(first))
+ while(first <= last && row->par()->IsHfill(first))
++first;
}
- first = max(first, BeginningOfMainBody(row->par));
+ first = max(first, BeginningOfMainBody(buf, row->par()));
int n = 0;
for (int p = first; p <= last; ++p) { // last, because the end is ignored!
- if (row->par->IsHfill(p)) {
+ if (row->par()->IsHfill(p)) {
++n;
}
}
// like NumberOfHfills, but only those in the manual label!
-int LyXText::NumberOfLabelHfills(Row const * row) const
+int LyXText::NumberOfLabelHfills(Buffer const * buf, Row const * row) const
{
LyXParagraph::size_type last = RowLast(row);
- LyXParagraph::size_type first = row->pos;
+ LyXParagraph::size_type first = row->pos();
if (first) { /* hfill *DO* count at the beginning
* of paragraphs! */
- while(first < last && row->par->IsHfill(first))
+ while(first < last && row->par()->IsHfill(first))
++first;
}
- last = min(last, BeginningOfMainBody(row->par));
+ last = min(last, BeginningOfMainBody(buf, row->par()));
int n = 0;
for (LyXParagraph::size_type p = first;
p < last; ++p) { // last, because the end is ignored!
- if (row->par->IsHfill(p)) {
+ if (row->par()->IsHfill(p)) {
++n;
}
}
// returns true, if a expansion is needed.
// Rules are given by LaTeX
-bool LyXText::HfillExpansion(Row const * row_ptr,
+bool LyXText::HfillExpansion(Buffer const * buf, Row const * row_ptr,
LyXParagraph::size_type pos) const
{
// by the way, is it a hfill?
- if (!row_ptr->par->IsHfill(pos))
+ if (!row_ptr->par()->IsHfill(pos))
return false;
// at the end of a row it does not count
// at the beginning of a row it does not count, if it is not
// the first row of a paragaph
- if (!row_ptr->pos)
+ if (!row_ptr->pos())
return true;
// in some labels it does not count
- if (textclasslist.Style(parameters->textclass,
- row_ptr->par->GetLayout()).margintype
+ if (textclasslist.Style(buf->params.textclass,
+ row_ptr->par()->GetLayout()).margintype
!= MARGIN_MANUAL
- && pos < BeginningOfMainBody(row_ptr->par))
+ && pos < BeginningOfMainBody(buf, row_ptr->par()))
return false;
// if there is anything between the first char of the row and
// the sepcified position that is not a newline and not a hfill,
// the hfill will count, otherwise not
- LyXParagraph::size_type i = row_ptr->pos;
- while (i < pos && (row_ptr->par->IsNewline(i)
- || row_ptr->par->IsHfill(i)))
+ LyXParagraph::size_type i = row_ptr->pos();
+ while (i < pos && (row_ptr->par()->IsNewline(i)
+ || row_ptr->par()->IsHfill(i)))
++i;
return i != pos;
}
-void LyXText::SetHeightOfRow(Row * row_ptr) const
+void LyXText::SetHeightOfRow(BufferView * bview, Row * row_ptr) const
{
/* get the maximum ascent and the maximum descent */
- int asc, desc, pos;
+ int asc = 0, desc = 0, pos = 0;
float layoutasc = 0;
float layoutdesc = 0;
float tmptop = 0;
LyXFont tmpfont;
- Inset * tmpinset;
+ Inset * tmpinset = 0;
/* this must not happen before the currentrow for clear reasons.
so the trick is just to set the current row onto this row */
long unused_y;
- GetRow(row_ptr->par, row_ptr->pos, unused_y);
+ GetRow(row_ptr->par(), row_ptr->pos(), unused_y);
/* ok , let us initialize the maxasc and maxdesc value.
* This depends in LaTeX of the font of the last character
/* Correction: only the fontsize count. The other properties
are taken from the layoutfont. Nicer on the screen :) */
- LyXParagraph * par = row_ptr->par->LastPhysicalPar();
- LyXParagraph * firstpar = row_ptr->par->FirstPhysicalPar();
+ LyXParagraph * par = row_ptr->par()->LastPhysicalPar();
+ LyXParagraph * firstpar = row_ptr->par()->FirstPhysicalPar();
- LyXLayout const & layout = textclasslist.Style(parameters->textclass,
+ LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass,
firstpar->GetLayout());
- LyXFont font = GetFont(par, par->Last()-1);
+ LyXFont font = GetFont(bview->buffer(), par, par->Last() - 1);
LyXFont::FONT_SIZE size = font.size();
- font = GetFont(par, -1);
+ font = GetFont(bview->buffer(), par, -1);
font.setSize(size);
- LyXFont labelfont = GetFont(par, -2);
+ LyXFont labelfont = GetFont(bview->buffer(), par, -2);
- int maxasc = int(font.maxAscent() *
+ float spacing_val = 1.0;
+ if (!row_ptr->par()->spacing.isDefault()) {
+ spacing_val = row_ptr->par()->spacing.getValue();
+ } else {
+ spacing_val = bview->buffer()->params.spacing.getValue();
+ }
+ //lyxerr << "spacing_val = " << spacing_val << endl;
+
+ int maxasc = int(lyxfont::maxAscent(font) *
layout.spacing.getValue() *
- parameters->spacing.getValue());
- int maxdesc = int(font.maxDescent() *
+ spacing_val);
+ int maxdesc = int(lyxfont::maxDescent(font) *
layout.spacing.getValue() *
- parameters->spacing.getValue());
-
+ spacing_val);
int pos_end = RowLast(row_ptr);
-
int labeladdon = 0;
+ int maxwidth = 0;
// Check if any insets are larger
- for (pos = row_ptr->pos; pos <= pos_end; ++pos) {
- if (row_ptr->par->GetChar(pos) == LyXParagraph::META_INSET) {
- tmpfont = GetFont(row_ptr->par, pos);
- tmpinset = row_ptr->par->GetInset(pos);
- if (tmpinset) {
- asc = tmpinset->ascent(owner_->painter(), tmpfont);
- desc = tmpinset->descent(owner_->painter(), tmpfont);
- if (asc > maxasc)
- maxasc = asc;
- if (desc > maxdesc)
- maxdesc = desc;
- }
- }
+ for (pos = row_ptr->pos(); pos <= pos_end; ++pos) {
+ if (row_ptr->par()->GetChar(pos) == LyXParagraph::META_INSET) {
+ tmpfont = GetFont(bview->buffer(), row_ptr->par(), pos);
+ tmpinset = row_ptr->par()->GetInset(pos);
+ if (tmpinset) {
+ tmpinset->update(bview, tmpfont);
+ asc = tmpinset->ascent(bview->painter(), tmpfont);
+ desc = tmpinset->descent(bview->painter(), tmpfont);
+ maxwidth += tmpinset->width(bview->painter(), tmpfont);
+ maxasc = max(maxasc, asc);
+ maxdesc = max(maxdesc, desc);
+ }
+ } else {
+ maxwidth += SingleWidth(bview, row_ptr->par(), pos);
+ }
}
// Check if any custom fonts are larger (Asger)
// This is not completely correct, but we can live with the small,
// cosmetic error for now.
- LyXFont::FONT_SIZE maxsize = row_ptr->par->HighestFontInRange(row_ptr->pos,
- pos_end);
+ LyXFont::FONT_SIZE maxsize =
+ row_ptr->par()->HighestFontInRange(row_ptr->pos(),
+ pos_end);
if (maxsize > font.size()) {
font.setSize(maxsize);
- asc = font.maxAscent();
- desc = font.maxDescent();
+ asc = lyxfont::maxAscent(font);
+ desc = lyxfont::maxDescent(font);
if (asc > maxasc)
maxasc = asc;
if (desc > maxdesc)
maxdesc = desc;
}
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
- if (row_ptr->par->table){
+ if (row_ptr->par()->table){
// stretch the rows a bit
maxasc += 1;
maxdesc += 1;
}
/* table stuff -- end*/
-
+#endif
+
// This is nicer with box insets:
++maxasc;
++maxdesc;
- row_ptr->ascent_of_text = maxasc;
+ row_ptr->ascent_of_text(maxasc);
/* is it a top line? */
- if (row_ptr->pos == 0
- && row_ptr->par == firstpar) {
+ if (!row_ptr->pos() && (row_ptr->par() == firstpar)) {
/* some parksips VERY EASY IMPLEMENTATION */
- if (parameters->paragraph_separation == BufferParams::PARSEP_SKIP) {
+ if (bview->buffer()->params.paragraph_separation ==
+ BufferParams::PARSEP_SKIP) {
if (layout.isParagraph()
&& firstpar->GetDepth() == 0
&& firstpar->Previous())
- maxasc += parameters->getDefSkip().inPixels(owner_);
+ maxasc += bview->buffer()->params.getDefSkip().inPixels(bview);
else if (firstpar->Previous()
- && textclasslist.Style(parameters->textclass,
+ && textclasslist.Style(bview->buffer()->params.textclass,
firstpar->Previous()->GetLayout()).isParagraph()
&& firstpar->Previous()->GetDepth() == 0)
// is it right to use defskip here too? (AS)
- maxasc += parameters->getDefSkip().inPixels(owner_);
+ maxasc += bview->buffer()->params.getDefSkip().inPixels(bview);
}
/* the paper margins */
- if (!row_ptr->par->previous)
+ if (!row_ptr->par()->previous && bv_owner)
maxasc += LYX_PAPER_MARGIN;
/* add the vertical spaces, that the user added */
if (firstpar->added_space_top.kind() != VSpace::NONE)
- maxasc += int(firstpar->added_space_top.inPixels(owner_));
+ maxasc += int(firstpar->added_space_top.inPixels(bview));
/* do not forget the DTP-lines!
* there height depends on the font of the nearest character */
if (firstpar->line_top)
- maxasc += 2 * GetFont(firstpar, 0).ascent('x');
+ maxasc += 2 * lyxfont::ascent('x', GetFont(bview->buffer(),
+ firstpar, 0));
/* and now the pagebreaks */
if (firstpar->pagebreak_top)
/* this is special code for the chapter, since the label of this
* layout is printed in an extra row */
if (layout.labeltype == LABEL_COUNTER_CHAPTER
- && parameters->secnumdepth>= 0) {
- labeladdon = int(labelfont.maxDescent() *
- layout.spacing.getValue() *
- parameters->spacing.getValue())
- + int(labelfont.maxAscent() *
+ && bview->buffer()->params.secnumdepth >= 0) {
+ float spacing_val = 1.0;
+ if (!row_ptr->par()->spacing.isDefault()) {
+ spacing_val = row_ptr->par()->spacing.getValue();
+ } else {
+ spacing_val = bview->buffer()->params.spacing.getValue();
+ }
+
+ labeladdon = int(lyxfont::maxDescent(labelfont) *
layout.spacing.getValue() *
- parameters->spacing.getValue());
+ spacing_val)
+ + int(lyxfont::maxAscent(labelfont) *
+ layout.spacing.getValue() *
+ spacing_val);
}
/* special code for the top label */
if ((layout.labeltype == LABEL_TOP_ENVIRONMENT
|| layout.labeltype == LABEL_BIBLIO
|| layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)
- && row_ptr->par->IsFirstInSequence()
- && !row_ptr->par->GetLabestring().empty()) {
- labeladdon = int(
- (labelfont.maxAscent() *
- layout.spacing.getValue() *
- parameters->spacing.getValue())
- +(labelfont.maxDescent() *
- layout.spacing.getValue() *
- parameters->spacing.getValue())
- + layout.topsep * DefaultHeight()
- + layout.labelbottomsep * DefaultHeight());
+ && row_ptr->par()->IsFirstInSequence()
+ && !row_ptr->par()->GetLabelstring().empty()) {
+ float spacing_val = 1.0;
+ if (!row_ptr->par()->spacing.isDefault()) {
+ spacing_val = row_ptr->par()->spacing.getValue();
+ } else {
+ spacing_val = bview->buffer()->params.spacing.getValue();
+ }
+
+ labeladdon = int(
+ (lyxfont::maxAscent(labelfont) *
+ layout.spacing.getValue() *
+ spacing_val)
+ +(lyxfont::maxDescent(labelfont) *
+ layout.spacing.getValue() *
+ spacing_val)
+ + layout.topsep * DefaultHeight()
+ + layout.labelbottomsep * DefaultHeight());
}
/* and now the layout spaces, for example before and after a section,
* or between the items of a itemize or enumerate environment */
if (!firstpar->pagebreak_top) {
- LyXParagraph * prev = row_ptr->par->Previous();
+ LyXParagraph * prev = row_ptr->par()->Previous();
if (prev)
- prev = row_ptr->par->DepthHook(row_ptr->par->GetDepth());
+ prev = row_ptr->par()->DepthHook(row_ptr->par()->GetDepth());
if (prev && prev->GetLayout() == firstpar->GetLayout()
&& prev->GetDepth() == firstpar->GetDepth()
&& prev->GetLabelWidthString() == firstpar->GetLabelWidthString())
{
layoutasc = (layout.itemsep * DefaultHeight());
}
- else if (row_ptr->previous) {
+ else if (row_ptr->previous()) {
tmptop = layout.topsep;
- if (row_ptr->previous->par->GetDepth() >= row_ptr->par->GetDepth())
- tmptop-= textclasslist.Style(parameters->textclass, row_ptr->previous->par->GetLayout()).bottomsep;
+ if (row_ptr->previous()->par()->GetDepth() >= row_ptr->par()->GetDepth())
+ tmptop -= textclasslist.Style(bview->buffer()->params.textclass,
+ row_ptr->previous()->par()->
+ GetLayout()).bottomsep;
if (tmptop > 0)
layoutasc = (tmptop * DefaultHeight());
}
- else if (row_ptr->par->line_top){
+ else if (row_ptr->par()->line_top){
tmptop = layout.topsep;
if (tmptop > 0)
layoutasc = (tmptop * DefaultHeight());
}
- prev = row_ptr->par->DepthHook(row_ptr->par->GetDepth()-1);
+ prev = row_ptr->par()->DepthHook(row_ptr->par()->GetDepth()-1);
if (prev) {
- maxasc += int(textclasslist.Style(parameters->textclass,
+ maxasc += int(textclasslist.Style(bview->buffer()->params.textclass,
prev->GetLayout()).parsep * DefaultHeight());
}
else {
}
/* is it a bottom line? */
- if (row_ptr->par->ParFromPos(RowLast(row_ptr) + 1) == par
- && (!row_ptr->next || row_ptr->next->par != row_ptr->par)) {
+ if (row_ptr->par()->ParFromPos(RowLast(row_ptr) + 1) == par
+ && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par())) {
/* the paper margins */
- if (!par->next)
+ if (!par->next && bv_owner)
maxdesc += LYX_PAPER_MARGIN;
/* add the vertical spaces, that the user added */
if (firstpar->added_space_bottom.kind() != VSpace::NONE)
- maxdesc += int(firstpar->added_space_bottom.inPixels(owner_));
+ maxdesc += int(firstpar->added_space_bottom.inPixels(bview));
/* do not forget the DTP-lines!
* there height depends on the font of the nearest character */
if (firstpar->line_bottom)
- maxdesc += 2 * (GetFont(par, par->Last()-1).ascent('x'));
+ maxdesc += 2 * lyxfont::ascent('x', GetFont(bview->buffer(),
+ par, par->Last() - 1));
/* and now the pagebreaks */
if (firstpar->pagebreak_bottom)
/* and now the layout spaces, for example before and after a section,
* or between the items of a itemize or enumerate environment */
- if (!firstpar->pagebreak_bottom && row_ptr->par->Next()) {
- LyXParagraph * nextpar = row_ptr->par->Next();
- LyXParagraph * comparepar = row_ptr->par;
+ if (!firstpar->pagebreak_bottom && row_ptr->par()->Next()) {
+ LyXParagraph * nextpar = row_ptr->par()->Next();
+ LyXParagraph * comparepar = row_ptr->par();
float usual = 0;
float unusual = 0;
if (comparepar->GetDepth() > nextpar->GetDepth()) {
- usual = (textclasslist.Style(parameters->textclass, comparepar->GetLayout()).bottomsep * DefaultHeight());
+ usual = (textclasslist.Style(bview->buffer()->params.textclass, comparepar->GetLayout()).bottomsep * DefaultHeight());
comparepar = comparepar->DepthHook(nextpar->GetDepth());
if (comparepar->GetLayout()!= nextpar->GetLayout()
|| nextpar->GetLabelWidthString() !=
comparepar->GetLabelWidthString())
- unusual = (textclasslist.Style(parameters->textclass, comparepar->GetLayout()).bottomsep * DefaultHeight());
+ unusual = (textclasslist.Style(bview->buffer()->params.textclass, comparepar->GetLayout()).bottomsep * DefaultHeight());
if (unusual > usual)
layoutdesc = unusual;
if (comparepar->GetLayout()!= nextpar->GetLayout()
|| nextpar->GetLabelWidthString() !=
comparepar->GetLabelWidthString())
- layoutdesc = int(textclasslist.Style(parameters->textclass, comparepar->GetLayout()).bottomsep * DefaultHeight());
+ layoutdesc = int(textclasslist.Style(bview->buffer()->params.textclass, comparepar->GetLayout()).bottomsep * DefaultHeight());
}
}
}
maxasc += int(layoutasc * 2 / (2 + firstpar->GetDepth()));
maxdesc += int(layoutdesc * 2 / (2 + firstpar->GetDepth()));
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
- if (row_ptr->par->table){
- maxasc += row_ptr->par->table->
- AdditionalHeight(NumberOfCell(row_ptr->par, row_ptr->pos));
+ if (row_ptr->par()->table){
+ maxasc += row_ptr->par()->table->
+ AdditionalHeight(NumberOfCell(row_ptr->par(), row_ptr->pos()));
}
/* table stuff -- end*/
-
+#endif
/* calculate the new height of the text */
- height -= row_ptr->height;
+ height -= row_ptr->height();
- row_ptr->height = maxasc + maxdesc + labeladdon;
- row_ptr->baseline = maxasc + labeladdon;
+ row_ptr->height(maxasc + maxdesc + labeladdon);
+ row_ptr->baseline(maxasc + labeladdon);
- height += row_ptr->height;
+ height += row_ptr->height();
+ float x, dummy;
+ PrepareToPrint(bview, row_ptr, x, dummy, dummy, dummy);
+ row_ptr->width(maxwidth+x);
+ if (inset_owner) {
+ Row * r = firstrow;
+ width = max(0,workWidth(bview));
+ while(r) {
+ if (r->width() > width)
+ width = r->width();
+ r = r->next();
+ }
+ }
}
/* Appends the implicit specified paragraph behind the specified row,
* start at the implicit given position */
-void LyXText::AppendParagraph(Row * row) const
+void LyXText::AppendParagraph(BufferView * bview, Row * row) const
{
bool not_ready = true;
// The last character position of a paragraph is an invariant so we can
// safely get it here. (Asger)
- int lastposition = row->par->Last();
+ int lastposition = row->par()->Last();
do {
// Get the next breakpoint
- int z = NextBreakPoint(row, paperwidth);
+ int z = NextBreakPoint(bview, row, workWidth(bview));
Row * tmprow = row;
// Insert the new row
if (z < lastposition) {
++z;
- InsertRow(row, row->par, z);
- row = row->next;
+ InsertRow(row, row->par(), z);
+ row = row->next();
- row->height = 0;
+ row->height(0);
} else
not_ready = false;
// Set the dimensions of the row
- tmprow->fill = Fill(tmprow, paperwidth);
- SetHeightOfRow(tmprow);
+ tmprow->fill(Fill(bview, tmprow, workWidth(bview)));
+ SetHeightOfRow(bview, tmprow);
} while (not_ready);
}
-void LyXText::BreakAgain(Row * row) const
+void LyXText::BreakAgain(BufferView * bview, Row * row) const
{
bool not_ready = true;
do {
/* get the next breakpoint */
- LyXParagraph::size_type z =
- NextBreakPoint(row, paperwidth);
+ LyXParagraph::size_type z = NextBreakPoint(bview, row, workWidth(bview));
Row * tmprow = row;
- if (z < row->par->Last() ) {
- if (!row->next || (row->next && row->next->par != row->par)) {
+ if (z < row->par()->Last() ) {
+ if (!row->next() || (row->next() && row->next()->par() != row->par())) {
// insert a new row
++z;
- InsertRow(row, row->par, z);
- row = row->next;
- row->height = 0;
+ InsertRow(row, row->par(), z);
+ row = row->next();
+ row->height(0);
} else {
- row = row->next;
+ row = row->next();
++z;
- if (row->pos == z)
+ if (row->pos() == z)
not_ready = false; // the rest will not change
else {
- row->pos = z;
+ row->pos(z);
}
}
} else {
/* if there are some rows too much, delete them */
/* only if you broke the whole paragraph! */
Row * tmprow2 = row;
- while (tmprow2->next && tmprow2->next->par == row->par) {
- tmprow2 = tmprow2->next;
+ while (tmprow2->next() && tmprow2->next()->par() == row->par()) {
+ tmprow2 = tmprow2->next();
}
while (tmprow2 != row) {
- tmprow2 = tmprow2->previous;
- RemoveRow(tmprow2->next);
+ tmprow2 = tmprow2->previous();
+ RemoveRow(tmprow2->next());
}
not_ready = false;
}
/* set the dimensions of the row */
- tmprow->fill = Fill(tmprow, paperwidth);
- SetHeightOfRow(tmprow);
+ tmprow->fill(Fill(bview, tmprow, workWidth(bview)));
+ SetHeightOfRow(bview, tmprow);
} while (not_ready);
}
-/* this is just a little changed version of break again */
-void LyXText::BreakAgainOneRow(Row * row)
+// this is just a little changed version of break again
+void LyXText::BreakAgainOneRow(BufferView * bview, Row * row)
{
- /* get the next breakpoint */
- LyXParagraph::size_type z = NextBreakPoint(row, paperwidth);
- Row * tmprow = row;
-
- if (z < row->par->Last() ) {
- if (!row->next || (row->next && row->next->par != row->par)) {
- /* insert a new row */
- ++z;
- InsertRow(row, row->par, z);
- row = row->next;
- row->height = 0;
- }
- else {
- row= row->next;
- ++z;
- if (row->pos != z)
- row->pos = z;
- }
- }
- else {
- /* if there are some rows too much, delete them */
- /* only if you broke the whole paragraph! */
- Row * tmprow2 = row;
- while (tmprow2->next && tmprow2->next->par == row->par) {
- tmprow2 = tmprow2->next;
- }
- while (tmprow2 != row) {
- tmprow2 = tmprow2->previous;
- RemoveRow(tmprow2->next);
- }
- }
-
- /* set the dimensions of the row */
- tmprow->fill = Fill(tmprow, paperwidth);
- SetHeightOfRow(tmprow);
+ // get the next breakpoint
+ LyXParagraph::size_type z = NextBreakPoint(bview, row, workWidth(bview));
+ Row * tmprow = row;
+
+ if (z < row->par()->Last() ) {
+ if (!row->next()
+ || (row->next() && row->next()->par() != row->par())) {
+ /* insert a new row */
+ ++z;
+ InsertRow(row, row->par(), z);
+ row = row->next();
+ row->height(0);
+ } else {
+ row= row->next();
+ ++z;
+ if (row->pos() != z)
+ row->pos(z);
+ }
+ } else {
+ // if there are some rows too much, delete them
+ // only if you broke the whole paragraph!
+ Row * tmprow2 = row;
+ while (tmprow2->next()
+ && tmprow2->next()->par() == row->par()) {
+ tmprow2 = tmprow2->next();
+ }
+ while (tmprow2 != row) {
+ tmprow2 = tmprow2->previous();
+ RemoveRow(tmprow2->next());
+ }
+ }
+
+ // set the dimensions of the row
+ tmprow->fill(Fill(bview, tmprow, workWidth(bview)));
+ SetHeightOfRow(bview, tmprow);
}
-void LyXText::BreakParagraph(char keep_layout)
+void LyXText::BreakParagraph(BufferView * bview, char keep_layout)
{
- LyXLayout const & layout = textclasslist.Style(parameters->textclass,
- cursor.par->GetLayout());
-
+ LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass,
+ cursor.par()->GetLayout());
+#ifndef NEW_TABULAR
/* table stuff -- begin */
- if (cursor.par->table) {
+ if (cursor.par()->table) {
// breaking of tables is only allowed at the beginning or the end */
- if (cursor.pos && cursor.pos < cursor.par->size() &&
- !cursor.par->table->ShouldBeVeryLastCell(NumberOfCell(cursor.par, cursor.pos)))
+ if (cursor.pos() && cursor.pos() < cursor.par()->size() &&
+ !cursor.par()->table->ShouldBeVeryLastCell(NumberOfCell(cursor.par(), cursor.pos())))
return; // no breaking of tables allowed
}
/* table stuff -- end */
-
+#endif
// this is only allowed, if the current paragraph is not empty or caption
- if ((cursor.par->Last() <= 0 && !cursor.par->IsDummy())
+ if ((cursor.par()->Last() <= 0 && !cursor.par()->IsDummy())
&&
layout.labeltype!= LABEL_SENSITIVE)
return;
- SetUndo(Undo::INSERT,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
+ SetUndo(bview->buffer(), Undo::INSERT,
+ cursor.par()->ParFromPos(cursor.pos())->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
+#ifndef NEW_TABULAR
/* table stuff -- begin */
- if (cursor.par->table) {
- int cell = NumberOfCell(cursor.par, cursor.pos);
- if (cursor.par->table->ShouldBeVeryLastCell(cell))
- SetCursor(cursor.par, cursor.par->size());
+ if (cursor.par()->table) {
+ int cell = NumberOfCell(cursor.par(), cursor.pos());
+ if (cursor.par()->table->ShouldBeVeryLastCell(cell))
+ SetCursor(bview, cursor.par(), cursor.par()->size());
}
/* table stuff -- end */
-
+#endif
// please break always behind a space
- if (cursor.pos < cursor.par->Last()
- && cursor.par->IsLineSeparator(cursor.pos))
- cursor.pos++;
+ if (cursor.pos() < cursor.par()->Last()
+ && cursor.par()->IsLineSeparator(cursor.pos()))
+ cursor.pos(cursor.pos() + 1);
// break the paragraph
if (keep_layout)
keep_layout = 2;
else
keep_layout = layout.isEnvironment();
- cursor.par->BreakParagraph(cursor.pos, keep_layout);
-
+ cursor.par()->BreakParagraph(bview->buffer()->params, cursor.pos(),
+ keep_layout);
+#ifndef NEW_TABULAR
/* table stuff -- begin */
- if (cursor.par->table){
+ if (cursor.par()->table){
// the table should stay with the contents
- if (!cursor.pos){
- cursor.par->Next()->table = cursor.par->table;
- cursor.par->table = 0;
+ if (!cursor.pos()){
+ cursor.par()->Next()->table = cursor.par()->table;
+ cursor.par()->table = 0;
}
}
/* table stuff -- end */
-
+#endif
// well this is the caption hack since one caption is really enough
- if (layout.labeltype == LABEL_SENSITIVE){
- if (!cursor.pos)
- cursor.par->SetLayout(0); // set to standard-layout
+ if (layout.labeltype == LABEL_SENSITIVE) {
+ if (!cursor.pos())
+ // set to standard-layout
+ cursor.par()->SetLayout(bview->buffer()->params, 0);
else
- cursor.par->Next()->SetLayout(0); // set to standard-layout
+ // set to standard-layout
+ cursor.par()->Next()->SetLayout(bview->buffer()->params, 0);
}
/* if the cursor is at the beginning of a row without prior newline,
* move one row up!
* This touches only the screen-update. Otherwise we would may have
* an empty row on the screen */
- if (cursor.pos && !cursor.row->par->IsNewline(cursor.row->pos -1) &&
- cursor.row->pos == cursor.pos) {
- CursorLeft();
+ if (cursor.pos() && !cursor.row()->par()->IsNewline(cursor.row()->pos() - 1) &&
+ cursor.row()->pos() == cursor.pos()) {
+ CursorLeft(bview);
}
status = LyXText::NEED_MORE_REFRESH;
- refresh_row = cursor.row;
- refresh_y = cursor.y - cursor.row->baseline;
+ refresh_row = cursor.row();
+ refresh_y = cursor.y() - cursor.row()->baseline();
// Do not forget the special right address boxes
if (layout.margintype == MARGIN_RIGHT_ADDRESS_BOX) {
- while (refresh_row->previous &&
- refresh_row->previous->par == refresh_row->par) {
- refresh_row = refresh_row->previous;
- refresh_y -= refresh_row->height;
- }
+ while (refresh_row->previous() &&
+ refresh_row->previous()->par() == refresh_row->par()) {
+ refresh_row = refresh_row->previous();
+ refresh_y -= refresh_row->height();
+ }
}
- RemoveParagraph(cursor.row);
+ RemoveParagraph(cursor.row());
// set the dimensions of the cursor row
- cursor.row->fill = Fill(cursor.row, paperwidth);
+ cursor.row()->fill(Fill(bview, cursor.row(), workWidth(bview)));
- SetHeightOfRow(cursor.row);
+ SetHeightOfRow(bview, cursor.row());
- while (!cursor.par->Next()->table && cursor.par->Next()->Last()
- && cursor.par->Next()->IsNewline(0))
- cursor.par->Next()->Erase(0);
+ while (!cursor.par()->Next()->table && cursor.par()->Next()->Last()
+ && cursor.par()->Next()->IsNewline(0))
+ cursor.par()->Next()->Erase(0);
- InsertParagraph(cursor.par->Next(), cursor.row);
+ InsertParagraph(bview, cursor.par()->Next(), cursor.row());
- UpdateCounters(cursor.row->previous);
+ UpdateCounters(bview, cursor.row()->previous());
/* This check is necessary. Otherwise the new empty paragraph will
* be deleted automatically. And it is more friendly for the user! */
- if (cursor.pos)
- SetCursor(cursor.par->Next(), 0);
+ if (cursor.pos())
+ SetCursor(bview, cursor.par()->Next(), 0);
else
- SetCursor(cursor.par, 0);
+ SetCursor(bview, cursor.par(), 0);
- if (cursor.row->next)
- BreakAgain(cursor.row->next);
+ if (cursor.row()->next())
+ BreakAgain(bview, cursor.row()->next());
need_break_row = 0;
}
-void LyXText::OpenFootnote()
+#ifndef NEW_INSETS
+void LyXText::OpenFootnote(BufferView * bview)
{
LyXParagraph * endpar,* tmppar;
Row * row;
- LyXParagraph * par = cursor.par->ParFromPos(cursor.pos);
+ LyXParagraph * par = cursor.par()->ParFromPos(cursor.pos());
/* if there is no footnote in this paragraph, just return. */
if (!par->next
/* ok, move the cursor right before the footnote */
/* just a little faster than using CursorRight() */
- for (cursor.pos = 0;
- cursor.par->ParFromPos(cursor.pos) != par; cursor.pos++);
+ for (cursor.pos(0);
+ cursor.par()->ParFromPos(cursor.pos()) != par;) {
+ cursor.pos(cursor.pos() + 1);
+ }
+
/* now the cursor is at the beginning of the physical par */
- SetCursor(cursor.par,
- cursor.pos + cursor.par->ParFromPos(cursor.pos)->size());
+ SetCursor(bview, cursor.par(),
+ cursor.pos() + cursor.par()->ParFromPos(cursor.pos())->size());
/* the cursor must be exactly before the footnote */
- par = cursor.par->ParFromPos(cursor.pos);
+ par = cursor.par()->ParFromPos(cursor.pos());
status = LyXText::NEED_MORE_REFRESH;
- refresh_row = cursor.row;
- refresh_y = cursor.y - cursor.row->baseline;
+ refresh_row = cursor.row();
+ refresh_y = cursor.y() - cursor.row()->baseline();
- tmppar = cursor.par;
- endpar = cursor.par->Next();
- row = cursor.row;
+ tmppar = cursor.par();
+ endpar = cursor.par()->Next();
+ row = cursor.row();
- tmppar->OpenFootnote(cursor.pos);
+ tmppar->OpenFootnote(cursor.pos());
RemoveParagraph(row);
/* set the dimensions of the cursor row */
- row->fill = Fill(row, paperwidth);
- SetHeightOfRow(row);
-#warning See comment on top of text.C
+ row->fill(Fill(bview, row, workWidth(bview)));
+ SetHeightOfRow(bview, row);
+ // CHECK See comment on top of text.C
tmppar = tmppar->Next();
while (tmppar != endpar) {
if (tmppar) {
- InsertParagraph(tmppar, row);
- while (row->next && row->next->par == tmppar)
- row = row->next;
+ InsertParagraph(bview, tmppar, row);
+ while (row->next() && row->next()->par() == tmppar)
+ row = row->next();
tmppar = tmppar->Next();
}
}
- SetCursor(par->next, 0);
+ SetCursor(bview, par->next, 0);
sel_cursor = cursor;
}
-
+#endif
+
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
-void LyXText::TableFeatures(int feature, string const & val) const
+void LyXText::TableFeatures(BufferView * bview, int feature, string const & val) const
{
- if (!cursor.par->table)
+ if (!cursor.par()->table)
return; /* this should never happen */
- int actCell = NumberOfCell(cursor.par, cursor.pos);
- SetUndo(Undo::FINISH,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
+ int actCell = NumberOfCell(cursor.par(), cursor.pos());
+ SetUndo(bview->buffer(), Undo::FINISH,
+ cursor.par()->ParFromPos(cursor.pos())->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
switch (feature){
case LyXTable::SET_PWIDTH:
- cursor.par->table->SetPWidth(actCell, val);
+ cursor.par()->table->SetPWidth(actCell, val);
break;
case LyXTable::SET_SPECIAL_COLUMN:
case LyXTable::SET_SPECIAL_MULTI:
- cursor.par->table->SetAlignSpecial(actCell, val, feature);
+ cursor.par()->table->SetAlignSpecial(actCell, val, feature);
break;
default:
break;
}
- RedoParagraph();
+ RedoParagraph(bview);
}
-void LyXText::TableFeatures(int feature) const
+void LyXText::TableFeatures(BufferView * bview, int feature) const
{
int setLines = 0;
int setAlign = LYX_ALIGN_LEFT;
int lineSet;
bool what;
- if (!cursor.par->table)
+ if (!cursor.par()->table)
return; /* this should never happen */
- int actCell = NumberOfCell(cursor.par, cursor.pos);
- SetUndo(Undo::FINISH,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
+ int actCell = NumberOfCell(cursor.par(), cursor.pos());
+ SetUndo(bview->buffer(), Undo::FINISH,
+ cursor.par()->ParFromPos(cursor.pos())->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
switch (feature){
case LyXTable::ALIGN_LEFT:
}
switch (feature){
case LyXTable::APPEND_ROW: {
- LyXParagraph::size_type pos = cursor.pos;
+ LyXParagraph::size_type pos = cursor.pos();
/* move to the next row */
int cell_org = actCell;
// if there is a ContRow following this row I have to add
// the row after the ContRow's
- if ((pos < cursor.par->Last()) &&
- cursor.par->table->RowHasContRow(cell_org)) {
- while((pos < cursor.par->Last()) &&
- !cursor.par->table->IsContRow(cell)) {
- while (pos < cursor.par->Last() &&
- !cursor.par->IsNewline(pos))
+ if ((pos < cursor.par()->Last()) &&
+ cursor.par()->table->RowHasContRow(cell_org)) {
+ while((pos < cursor.par()->Last()) &&
+ !cursor.par()->table->IsContRow(cell)) {
+ while (pos < cursor.par()->Last() &&
+ !cursor.par()->IsNewline(pos))
++pos;
- if (pos < cursor.par->Last())
+ if (pos < cursor.par()->Last())
++pos;
++cell;
}
- while((pos < cursor.par->Last()) &&
- cursor.par->table->IsContRow(cell)) {
- while (pos < cursor.par->Last() &&
- !cursor.par->IsNewline(pos))
+ while((pos < cursor.par()->Last()) &&
+ cursor.par()->table->IsContRow(cell)) {
+ while (pos < cursor.par()->Last() &&
+ !cursor.par()->IsNewline(pos))
++pos;
- if (pos < cursor.par->Last())
+ if (pos < cursor.par()->Last())
++pos;
++cell;
}
cell_org = --cell;
- if (pos < cursor.par->Last())
+ if (pos < cursor.par()->Last())
--pos;
}
- while (pos < cursor.par->Last() &&
- (cell == cell_org || !cursor.par->table->IsFirstCell(cell))){
- while (pos < cursor.par->Last() && !cursor.par->IsNewline(pos))
+ while (pos < cursor.par()->Last() &&
+ (cell == cell_org || !cursor.par()->table->IsFirstCell(cell))){
+ while (pos < cursor.par()->Last() && !cursor.par()->IsNewline(pos))
++pos;
- if (pos < cursor.par->Last())
+ if (pos < cursor.par()->Last())
++pos;
++cell;
}
/* insert the new cells */
- int number = cursor.par->table->NumberOfCellsInRow(cell_org);
- for (int i = 0; i < number; ++i)
- cursor.par->InsertChar(pos, LyXParagraph::META_NEWLINE);
+ int number = cursor.par()->table->NumberOfCellsInRow(cell_org);
+ Language const * lang = cursor.par()->getParLanguage(bview->buffer()->params);
+ LyXFont font(LyXFont::ALL_INHERIT,lang);
+ for (int i = 0; i < number; ++i) {
+ cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE, font);
+ }
/* append the row into the table */
- cursor.par->table->AppendRow(cell_org);
- RedoParagraph();
+ cursor.par()->table->AppendRow(cell_org);
+ RedoParagraph(bview);
return;
}
case LyXTable::APPEND_CONT_ROW: {
- LyXParagraph::size_type pos = cursor.pos;
+ LyXParagraph::size_type pos = cursor.pos();
/* move to the next row */
int cell_org = actCell;
int cell = cell_org;
// if there is already a controw but not for this cell
// the AppendContRow sets only the right values but does
// not actually add a row
- if (cursor.par->table->RowHasContRow(cell_org) &&
- (cursor.par->table->CellHasContRow(cell_org)<0)) {
- cursor.par->table->AppendContRow(cell_org);
- RedoParagraph();
+ if (cursor.par()->table->RowHasContRow(cell_org) &&
+ (cursor.par()->table->CellHasContRow(cell_org)<0)) {
+ cursor.par()->table->AppendContRow(cell_org);
+ RedoParagraph(bview);
return;
}
- while (pos < cursor.par->Last() &&
+ while (pos < cursor.par()->Last() &&
(cell == cell_org
- || !cursor.par->table->IsFirstCell(cell))){
- while (pos < cursor.par->Last() && !cursor.par->IsNewline(pos))
+ || !cursor.par()->table->IsFirstCell(cell))){
+ while (pos < cursor.par()->Last() && !cursor.par()->IsNewline(pos))
++pos;
- if (pos < cursor.par->Last())
+ if (pos < cursor.par()->Last())
++pos;
++cell;
}
/* insert the new cells */
- int number = cursor.par->table->NumberOfCellsInRow(cell_org);
- for (int i = 0; i < number; ++i)
- cursor.par->InsertChar(pos, LyXParagraph::META_NEWLINE);
-
+ int number = cursor.par()->table->NumberOfCellsInRow(cell_org);
+ Language const * lang = cursor.par()->getParLanguage(bview->buffer()->params);
+ LyXFont font(LyXFont::ALL_INHERIT,lang);
+ for (int i = 0; i < number; ++i) {
+ cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE, font);
+ }
+
/* append the row into the table */
- cursor.par->table->AppendContRow(cell_org);
- RedoParagraph();
+ cursor.par()->table->AppendContRow(cell_org);
+ RedoParagraph(bview);
return;
}
case LyXTable::APPEND_COLUMN: {
LyXParagraph::size_type pos = 0;
int cell_org = actCell;
int cell = 0;
+ Language const * lang = cursor.par()->getParLanguage(bview->buffer()->params);
+ LyXFont font(LyXFont::ALL_INHERIT,lang);
do{
- if (pos && (cursor.par->IsNewline(pos-1))){
- if (cursor.par->table->AppendCellAfterCell(cell_org, cell)) {
- cursor.par->InsertChar(pos, LyXParagraph::META_NEWLINE);
- if (pos <= cursor.pos)
- cursor.pos++;
+ if (pos && (cursor.par()->IsNewline(pos-1))){
+ if (cursor.par()->table->AppendCellAfterCell(cell_org, cell)) {
+ cursor.par()->InsertChar(pos,
+ LyXParagraph::META_NEWLINE,
+ font);
+ if (pos <= cursor.pos())
+ cursor.pos(cursor.pos() + 1);
++pos;
}
++cell;
}
++pos;
- } while (pos <= cursor.par->Last());
+ } while (pos <= cursor.par()->Last());
/* remember that the very last cell doesn't end with a newline.
This saves one byte memory per table ;-) */
- if (cursor.par->table->AppendCellAfterCell(cell_org, cell))
- cursor.par->InsertChar(cursor.par->Last(), LyXParagraph::META_NEWLINE);
+ if (cursor.par()->table->AppendCellAfterCell(cell_org, cell)) {
+ LyXParagraph::size_type last = cursor.par()->Last();
+ cursor.par()->InsertChar(last,
+ LyXParagraph::META_NEWLINE, font);
+ }
/* append the column into the table */
- cursor.par->table->AppendColumn(cell_org);
+ cursor.par()->table->AppendColumn(cell_org);
- RedoParagraph();
+ RedoParagraph(bview);
return;
}
case LyXTable::DELETE_ROW:
- if (owner_->the_locking_inset)
- owner_->unlockInset(owner_->the_locking_inset);
- RemoveTableRow(&cursor);
- RedoParagraph();
+ if (bview->the_locking_inset)
+ bview->unlockInset(bview->the_locking_inset);
+ RemoveTableRow(cursor);
+ RedoParagraph(bview);
return;
case LyXTable::DELETE_COLUMN: {
LyXParagraph::size_type pos = 0;
int cell_org = actCell;
int cell = 0;
- if (owner_->the_locking_inset)
- owner_->unlockInset(owner_->the_locking_inset);
+ if (bview->the_locking_inset)
+ bview->unlockInset(bview->the_locking_inset);
do {
- if (!pos || (cursor.par->IsNewline(pos-1))){
- if (cursor.par->table->DeleteCellIfColumnIsDeleted(cell, cell_org)){
+ if (!pos || (cursor.par()->IsNewline(pos-1))){
+ if (cursor.par()->table->DeleteCellIfColumnIsDeleted(cell, cell_org)){
// delete one cell
- while (pos < cursor.par->Last() && !cursor.par->IsNewline(pos))
- cursor.par->Erase(pos);
- if (pos < cursor.par->Last())
- cursor.par->Erase(pos);
+ while (pos < cursor.par()->Last() && !cursor.par()->IsNewline(pos))
+ cursor.par()->Erase(pos);
+ if (pos < cursor.par()->Last())
+ cursor.par()->Erase(pos);
else
- cursor.par->Erase(pos - 1); // the missing newline at the end of a table
+ cursor.par()->Erase(pos - 1); // the missing newline at the end of a table
--pos; // because of pos++ below
}
++cell;
}
++pos;
- } while (pos <= cursor.par->Last());
+ } while (pos <= cursor.par()->Last());
/* delete the column from the table */
- cursor.par->table->DeleteColumn(cell_org);
+ cursor.par()->table->DeleteColumn(cell_org);
/* set the cursor to the beginning of the table, where else? */
- cursor.pos = 0;
- RedoParagraph();
+ cursor.pos(0);
+ RedoParagraph(bview);
return;
}
case LyXTable::TOGGLE_LINE_TOP:
- lineSet = !cursor.par->table->TopLine(actCell);
+ lineSet = !cursor.par()->table->TopLine(actCell);
if (!selection){
- cursor.par->table->SetTopLine(actCell, lineSet);
+ cursor.par()->table->SetTopLine(actCell, lineSet);
} else {
LyXParagraph::size_type i;
int n = -1, m = -2;
- for (i = sel_start_cursor.pos; i <= sel_end_cursor.pos; ++i){
- if ((n = NumberOfCell(sel_start_cursor.par, i)) != m) {
- cursor.par->table->SetTopLine(n, lineSet);
+ for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i){
+ if ((n = NumberOfCell(sel_start_cursor.par(), i)) != m) {
+ cursor.par()->table->SetTopLine(n, lineSet);
m = n;
}
}
}
- RedoParagraph();
+ RedoParagraph(bview);
return;
case LyXTable::TOGGLE_LINE_BOTTOM:
- lineSet = !cursor.par->table->BottomLine(actCell);
+ lineSet = !cursor.par()->table->BottomLine(actCell);
if (!selection){
- cursor.par->table->SetBottomLine(actCell, lineSet);
+ cursor.par()->table->SetBottomLine(actCell, lineSet);
} else {
LyXParagraph::size_type i;
int n = -1, m = -2;
- for (i = sel_start_cursor.pos; i <= sel_end_cursor.pos; ++i) {
- if ((n = NumberOfCell(sel_start_cursor.par, i)) != m) {
- cursor.par->table->SetBottomLine(n, lineSet);
+ for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i) {
+ if ((n = NumberOfCell(sel_start_cursor.par(), i)) != m) {
+ cursor.par()->table->SetBottomLine(n, lineSet);
m = n;
}
}
}
- RedoParagraph();
+ RedoParagraph(bview);
return;
case LyXTable::TOGGLE_LINE_LEFT:
- lineSet = !cursor.par->table->LeftLine(actCell);
+ lineSet = !cursor.par()->table->LeftLine(actCell);
if (!selection){
- cursor.par->table->SetLeftLine(actCell, lineSet);
+ cursor.par()->table->SetLeftLine(actCell, lineSet);
} else {
LyXParagraph::size_type i;
int n = -1, m = -2;
- for (i = sel_start_cursor.pos; i <= sel_end_cursor.pos; ++i){
- if ((n= NumberOfCell(sel_start_cursor.par, i)) != m) {
- cursor.par->table->SetLeftLine(n, lineSet);
+ for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i){
+ if ((n= NumberOfCell(sel_start_cursor.par(), i)) != m) {
+ cursor.par()->table->SetLeftLine(n, lineSet);
m = n;
}
}
}
- RedoParagraph();
+ RedoParagraph(bview);
return;
case LyXTable::TOGGLE_LINE_RIGHT:
- lineSet = !cursor.par->table->RightLine(actCell);
+ lineSet = !cursor.par()->table->RightLine(actCell);
if (!selection){
- cursor.par->table->SetRightLine(actCell, lineSet);
+ cursor.par()->table->SetRightLine(actCell, lineSet);
} else {
int n = -1, m = -2;
- LyXParagraph::size_type i = sel_start_cursor.pos;
- for (; i <= sel_end_cursor.pos; ++i) {
- if ((n= NumberOfCell(sel_start_cursor.par, i)) != m) {
- cursor.par->table->SetRightLine(n, lineSet);
+ LyXParagraph::size_type i = sel_start_cursor.pos();
+ for (; i <= sel_end_cursor.pos(); ++i) {
+ if ((n= NumberOfCell(sel_start_cursor.par(), i)) != m) {
+ cursor.par()->table->SetRightLine(n, lineSet);
m = n;
}
}
}
- RedoParagraph();
+ RedoParagraph(bview);
return;
case LyXTable::ALIGN_LEFT:
case LyXTable::ALIGN_RIGHT:
case LyXTable::ALIGN_CENTER:
if (!selection){
- cursor.par->table->SetAlignment(actCell, setAlign);
+ cursor.par()->table->SetAlignment(actCell, setAlign);
} else {
int n = -1, m = -2;
- LyXParagraph::size_type i = sel_start_cursor.pos;
- for (; i <= sel_end_cursor.pos; ++i) {
- if ((n= NumberOfCell(sel_start_cursor.par, i)) != m) {
- cursor.par->table->SetAlignment(n, setAlign);
+ LyXParagraph::size_type i = sel_start_cursor.pos();
+ for (; i <= sel_end_cursor.pos(); ++i) {
+ if ((n= NumberOfCell(sel_start_cursor.par(), i)) != m) {
+ cursor.par()->table->SetAlignment(n, setAlign);
m = n;
}
}
}
- RedoParagraph();
+ RedoParagraph(bview);
return;
case LyXTable::DELETE_TABLE:
- SetCursorIntern(cursor.par, 0);
- delete cursor.par->table;
- cursor.par->table = 0;
+ SetCursorIntern(bview, cursor.par(), 0);
+ delete cursor.par()->table;
+ cursor.par()->table = 0;
// temporary: Should put table in simple_cut_buffer (with before and after
// dummy-paragraph !!
// not necessar anymore with UNDO :)
for (LyXParagraph::size_type i =
- cursor.par->size() - 1; i >= 0; --i)
- cursor.par->Erase(i);
- RedoParagraph();
+ cursor.par()->size() - 1; i >= 0; --i)
+ cursor.par()->Erase(i);
+ RedoParagraph(bview);
return;
case LyXTable::MULTICOLUMN: {
int number = 0;
// check wether we are completly in a multicol
- int multicol = cursor.par->table->IsMultiColumn(actCell);
- if (multicol && selection && sel_start_cursor.row == sel_end_cursor.row){
- multicol = NumberOfCell(sel_start_cursor.par, sel_start_cursor.pos)
- == NumberOfCell(sel_end_cursor.par, sel_end_cursor.pos);
+ int multicol = cursor.par()->table->IsMultiColumn(actCell);
+ if (multicol && selection && sel_start_cursor.row() == sel_end_cursor.row()) {
+ multicol = NumberOfCell(sel_start_cursor.par(), sel_start_cursor.pos())
+ == NumberOfCell(sel_end_cursor.par(), sel_end_cursor.pos());
}
if (multicol){
- int newlines = cursor.par->table->UnsetMultiColumn(actCell);
- LyXParagraph::size_type pos = cursor.pos;
- while (pos < cursor.par->Last() && !cursor.par->IsNewline(pos))
+ int newlines = cursor.par()->table->UnsetMultiColumn(actCell);
+ LyXParagraph::size_type pos = cursor.pos();
+ while (pos < cursor.par()->Last() && !cursor.par()->IsNewline(pos))
++pos;
for (; newlines; --newlines)
- cursor.par->InsertChar(pos, LyXParagraph::META_NEWLINE);
- RedoParagraph();
+ cursor.par()->InsertChar(pos, LyXParagraph::META_NEWLINE);
+ RedoParagraph(bview);
return;
}
else {
// selection must be in one row (or no selection)
if (!selection){
- cursor.par->table->SetMultiColumn(NumberOfCell(cursor.par,
- cursor.pos),
+ cursor.par()->table->SetMultiColumn(NumberOfCell(cursor.par(),
+ cursor.pos()),
1);
- RedoParagraph();
+ RedoParagraph(bview);
return;
}
else {
- if (sel_start_cursor.row == sel_end_cursor.row){
+ if (sel_start_cursor.row() == sel_end_cursor.row()){
LyXParagraph::size_type i;
number = 1;
- for (i = sel_start_cursor.pos;
- i < sel_end_cursor.pos; ++i){
- if (sel_start_cursor.par->IsNewline(i)){
- sel_start_cursor.par->Erase(i);
+ for (i = sel_start_cursor.pos();
+ i < sel_end_cursor.pos(); ++i){
+ if (sel_start_cursor.par()->IsNewline(i)){
+ sel_start_cursor.par()->Erase(i);
// check for double-blanks
- if ((i && !sel_start_cursor.par->IsLineSeparator(i-1))
+ if ((i && !sel_start_cursor.par()->IsLineSeparator(i-1))
&&
- (i < sel_start_cursor.par->Last()
- && !sel_start_cursor.par->IsLineSeparator(i)))
- sel_start_cursor.par->InsertChar(i, ' ');
+ (i < sel_start_cursor.par()->Last()
+ && !sel_start_cursor.par()->IsLineSeparator(i)))
+ sel_start_cursor.par()->InsertChar(i, ' ');
else {
- sel_end_cursor.pos--;
+ sel_end_cursor.pos(sel_end_cursor.pos() - 1);
--i;
}
++number;
}
}
- cursor.par->table->
- SetMultiColumn(NumberOfCell(sel_start_cursor.par,
- sel_start_cursor.pos),
+ cursor.par()->table->
+ SetMultiColumn(NumberOfCell(sel_start_cursor.par(),
+ sel_start_cursor.pos()),
number);
- cursor.pos = sel_start_cursor.pos;
- RedoParagraph();
+ cursor.pos(sel_start_cursor.pos());
+ RedoParagraph(bview);
return;
}
else {
setLines = 1;
case LyXTable::UNSET_ALL_LINES:
if (!selection){
- cursor.par->table->SetAllLines(NumberOfCell(cursor.par,
- cursor.pos),
+ cursor.par()->table->SetAllLines(NumberOfCell(cursor.par(),
+ cursor.pos()),
setLines);
} else {
LyXParagraph::size_type i;
int n = -1, m = -2;
- for (i = sel_start_cursor.pos; i <= sel_end_cursor.pos; ++i) {
- if ((n= NumberOfCell(sel_start_cursor.par, i)) != m) {
- cursor.par->table->SetAllLines(n, setLines);
+ for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i) {
+ if ((n= NumberOfCell(sel_start_cursor.par(), i)) != m) {
+ cursor.par()->table->SetAllLines(n, setLines);
m = n;
}
}
}
- RedoParagraph();
+ RedoParagraph(bview);
return;
case LyXTable::SET_LONGTABLE:
- cursor.par->table->SetLongTable(true);
+ cursor.par()->table->SetLongTable(true);
return;
case LyXTable::UNSET_LONGTABLE:
- cursor.par->table->SetLongTable(false);
+ cursor.par()->table->SetLongTable(false);
return;
case LyXTable::SET_ROTATE_TABLE:
- cursor.par->table->SetRotateTable(true);
+ cursor.par()->table->SetRotateTable(true);
return;
case LyXTable::UNSET_ROTATE_TABLE:
- cursor.par->table->SetRotateTable(false);
+ cursor.par()->table->SetRotateTable(false);
return;
case LyXTable::SET_ROTATE_CELL:
if (!selection){
- cursor.par->table->SetRotateCell(actCell, true);
+ cursor.par()->table->SetRotateCell(actCell, true);
} else {
LyXParagraph::size_type i;
int n = -1, m = -2;
- for (i = sel_start_cursor.pos; i <= sel_end_cursor.pos; ++i){
- if ((n = NumberOfCell(sel_start_cursor.par, i)) != m) {
- cursor.par->table->SetRotateCell(n, true);
+ for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i){
+ if ((n = NumberOfCell(sel_start_cursor.par(), i)) != m) {
+ cursor.par()->table->SetRotateCell(n, true);
m = n;
}
}
return;
case LyXTable::UNSET_ROTATE_CELL:
if (!selection){
- cursor.par->table->SetRotateCell(actCell, false);
+ cursor.par()->table->SetRotateCell(actCell, false);
} else {
int n = -1, m = -2;
- LyXParagraph::size_type i = sel_start_cursor.pos;
- for (; i <= sel_end_cursor.pos; ++i) {
- if ((n= NumberOfCell(sel_start_cursor.par, i)) != m) {
- cursor.par->table->SetRotateCell(n, false);
+ LyXParagraph::size_type i = sel_start_cursor.pos();
+ for (; i <= sel_end_cursor.pos(); ++i) {
+ if ((n= NumberOfCell(sel_start_cursor.par(), i)) != m) {
+ cursor.par()->table->SetRotateCell(n, false);
m = n;
}
}
}
return;
case LyXTable::SET_LINEBREAKS:
- what = !cursor.par->table->Linebreaks(cursor.par->table->FirstVirtualCell(actCell));
+ what = !cursor.par()->table->Linebreaks(cursor.par()->table->FirstVirtualCell(actCell));
if (!selection){
- cursor.par->table->SetLinebreaks(actCell, what);
+ cursor.par()->table->SetLinebreaks(actCell, what);
} else {
LyXParagraph::size_type i;
int n = -1, m = -2;
- for (i = sel_start_cursor.pos; i <= sel_end_cursor.pos; ++i) {
- if ((n = NumberOfCell(sel_start_cursor.par, i)) != m) {
- cursor.par->table->SetLinebreaks(n, what);
+ for (i = sel_start_cursor.pos(); i <= sel_end_cursor.pos(); ++i) {
+ if ((n = NumberOfCell(sel_start_cursor.par(), i)) != m) {
+ cursor.par()->table->SetLinebreaks(n, what);
m = n;
}
}
}
return;
case LyXTable::SET_LTFIRSTHEAD:
- cursor.par->table->SetLTHead(actCell, true);
+ cursor.par()->table->SetLTHead(actCell, true);
return;
case LyXTable::SET_LTHEAD:
- cursor.par->table->SetLTHead(actCell, false);
+ cursor.par()->table->SetLTHead(actCell, false);
return;
case LyXTable::SET_LTFOOT:
- cursor.par->table->SetLTFoot(actCell, false);
+ cursor.par()->table->SetLTFoot(actCell, false);
return;
case LyXTable::SET_LTLASTFOOT:
- cursor.par->table->SetLTFoot(actCell, true);
+ cursor.par()->table->SetLTFoot(actCell, true);
return;
case LyXTable::SET_LTNEWPAGE:
- what = !cursor.par->table->LTNewPage(actCell);
- cursor.par->table->SetLTNewPage(actCell, what);
+ what = !cursor.par()->table->LTNewPage(actCell);
+ cursor.par()->table->SetLTNewPage(actCell, what);
return;
}
}
-void LyXText::InsertCharInTable(char c)
+void LyXText::InsertCharInTable(BufferView * bview, char c)
{
- Row * row;
- Row * tmprow;
+ Row * row = 0;
+ Row * tmprow = 0;
long y;
bool jumped_over_space;
// Get the font that is used to calculate the baselineskip
LyXParagraph::size_type const lastpos =
- cursor.par->Last();
- LyXFont rawparfont = cursor.par->GetFontSettings(lastpos - 1);
+ cursor.par()->Last();
+ LyXFont rawparfont = cursor.par()->GetFontSettings(bview->buffer()->params,
+ lastpos - 1);
jumped_over_space = false;
if (IsLineSeparatorChar(c)) {
-
-#ifndef FIX_DOUBLE_SPACE
- /* avoid double blanks but insert the new blank because
- * of a possible font change */
- if (cursor.pos < lastpos &&
- cursor.par->IsLineSeparator(cursor.pos)) {
- cursor.par->Erase(cursor.pos);
- jumped_over_space = true;
- } else
-#endif
- if ((cursor.pos > 0 &&
- cursor.par->IsLineSeparator(cursor.pos - 1))
- || (cursor.pos > 0 && cursor.par->IsNewline(cursor.pos - 1))
- || (cursor.pos == 0 &&
- !(cursor.par->Previous()
- && cursor.par->Previous()->footnoteflag
- == LyXParagraph::OPEN_FOOTNOTE)))
+ if ((cursor.pos() > 0 &&
+ cursor.par()->IsLineSeparator(cursor.pos() - 1))
+ || (cursor.pos() > 0 && cursor.par()->IsNewline(cursor.pos() - 1))
+ || (cursor.pos() == 0 &&
+ !(cursor.par()->Previous()
+ && cursor.par()->Previous()->footnoteflag
+ == LyXParagraph::OPEN_FOOTNOTE)))
return;
} else if (IsNewlineChar(c)) {
if (!IsEmptyTableCell()) {
- TableFeatures(LyXTable::APPEND_CONT_ROW);
- CursorDown();
+ TableFeatures(bview, LyXTable::APPEND_CONT_ROW);
+ CursorDown(bview);
}
return;
}
- row = cursor.row;
- y = cursor.y - row->baseline;
+ row = cursor.row();
+ y = cursor.y() - row->baseline();
if (c != LyXParagraph::META_INSET) /* in this case LyXText::InsertInset
* already inserted the character */
- cursor.par->InsertChar(cursor.pos, c);
- SetCharFont(cursor.par, cursor.pos, rawtmpfont);
+ cursor.par()->InsertChar(cursor.pos(), c);
+ SetCharFont(bview->buffer(), cursor.par(), cursor.pos(), rawtmpfont);
if (!jumped_over_space) {
/* refresh the positions */
tmprow = row;
- while (tmprow->next && tmprow->next->par == row->par) {
- tmprow = tmprow->next;
- tmprow->pos++;
+ while (tmprow->next() && tmprow->next()->par() == row->par()) {
+ tmprow = tmprow->next();
+ tmprow->pos(tmprow->pos() + 1);
}
}
- cursor.pos++;
+ cursor.pos(cursor.pos() + 1);
- CheckParagraphInTable(cursor.par, cursor.pos);
+ CheckParagraphInTable(bview, cursor.par(), cursor.pos());
current_font = rawtmpfont;
real_current_font = realtmpfont;
/* check, whether the last character's font has changed. */
- if (cursor.pos && cursor.pos == cursor.par->Last()
+ if (cursor.pos() && cursor.pos() == cursor.par()->Last()
&& rawparfont != rawtmpfont)
- RedoHeightOfParagraph(cursor);
+ RedoHeightOfParagraph(bview, cursor);
}
-void LyXText::CheckParagraphInTable(LyXParagraph * par,
+void LyXText::CheckParagraphInTable(BufferView * bview, LyXParagraph * par,
LyXParagraph::size_type pos)
{
long y;
Row * row = GetRow(par, pos, y);
- int tmpheight = row->height;
- SetHeightOfRow(row);
+ int tmpheight = row->height();
+ SetHeightOfRow(bview, row);
LyXParagraph::size_type tmp_pos = pos;
/* update the table information */
while (tmp_pos && !par->IsNewline(tmp_pos - 1))
--tmp_pos;
if (par->table->SetWidthOfCell(NumberOfCell(par, pos),
- WidthOfCell(par, tmp_pos))) {
+ WidthOfCell(bview, par, tmp_pos))) {
LyXCursor tmpcursor = cursor;
- SetCursorIntern(par, pos);
+ SetCursorIntern(bview, par, pos, false);
/* make a complete redraw */
- RedoDrawingOfParagraph(cursor);
+ RedoDrawingOfParagraph(bview, cursor);
cursor = tmpcursor;
}
else {
/* redraw only the row */
LyXCursor tmpcursor = cursor;
- SetCursorIntern(par, pos);
-#warning See comment on top of text.C
+ SetCursorIntern(bview, par, pos);
+ //CHECK See comment on top of text.C
refresh_y = y;
- refresh_x = cursor.x;
+ refresh_x = cursor.x();
refresh_row = row;
- refresh_pos = cursor.pos;
+ refresh_pos = cursor.pos();
cursor = tmpcursor;
- if (tmpheight == row->height)
+ if (tmpheight == row->height())
status = LyXText::NEED_VERY_LITTLE_REFRESH;
else
status = LyXText::NEED_MORE_REFRESH;
}
- SetCursorIntern(cursor.par, cursor.pos);
+ SetCursorIntern(bview, cursor.par(), cursor.pos(), false,
+ cursor.boundary());
}
-void LyXText::BackspaceInTable()
+void LyXText::BackspaceInTable(BufferView * bview)
{
Row * tmprow, * row;
long y;
LyXFont realtmpfont = real_current_font;
// Get the font that is used to calculate the baselineskip
- int const lastpos = cursor.par->Last();
- LyXFont rawparfont = cursor.par->GetFontSettings(lastpos - 1);
+ int const lastpos = cursor.par()->Last();
+ LyXFont rawparfont = cursor.par()->GetFontSettings(bview->buffer()->params,
+ lastpos - 1);
- if (cursor.pos == 0) {
+ if (cursor.pos() == 0) {
/* no pasting of table paragraphs */
- CursorLeft();
+ CursorLeft(bview);
} else {
/* this is the code for a normal backspace, not pasting
* any paragraphs */
- SetUndo(Undo::DELETE,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
+ SetUndo(bview->buffer(), Undo::DELETE,
+ cursor.par()->ParFromPos(cursor.pos())->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
- CursorLeftIntern();
+ CursorLeftIntern(bview);
/* some insets are undeletable here */
- if (cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET) {
- if (!cursor.par->GetInset(cursor.pos)->Deletable())
+ if (cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET) {
+ if (!cursor.par()->GetInset(cursor.pos())->Deletable())
return;
}
- row = cursor.row;
- y = cursor.y - row->baseline;
+ row = cursor.row();
+ y = cursor.y() - row->baseline();
/* some special code when deleting a newline. */
- if (cursor.par->IsNewline(cursor.pos)) {
+ if (cursor.par()->IsNewline(cursor.pos())) {
/* nothing :-) */
return;
- }
- else {
- cursor.par->Erase(cursor.pos);
+ } else {
+ cursor.par()->Erase(cursor.pos());
/* refresh the positions */
tmprow = row;
- while (tmprow->next && tmprow->next->par == row->par) {
- tmprow = tmprow->next;
- tmprow->pos--;
+ while (tmprow->next()
+ && tmprow->next()->par() == row->par()) {
+ tmprow = tmprow->next();
+ tmprow->pos(tmprow->pos() - 1);
}
-
-#ifndef FIX_DOUBLE_SPACE
- /* delete superfluous blanks */
- if (cursor.pos < cursor.par->Last() - 1 &&
- (cursor.par->IsLineSeparator(cursor.pos))) {
-
- if (cursor.pos == BeginningOfMainBody(cursor.par)
- || !cursor.pos
- || cursor.par->IsLineSeparator(cursor.pos - 1)) {
- cursor.par->Erase(cursor.pos);
- /* refresh the positions */
- tmprow = row;
- while (tmprow->next &&
- tmprow->next->par == row->par) {
- tmprow = tmprow->next;
- tmprow->pos--;
- }
- if (cursor.pos) /* move one character left */
- cursor.pos--;
- }
- }
-#endif
}
- CheckParagraphInTable(cursor.par, cursor.pos);
+ CheckParagraphInTable(bview, cursor.par(), cursor.pos());
/* check, wether the last characters font has changed. */
- if (cursor.pos && cursor.pos == cursor.par->Last()
+ if (cursor.pos() && cursor.pos() == cursor.par()->Last()
&& rawparfont != rawtmpfont)
- RedoHeightOfParagraph(cursor);
+ RedoHeightOfParagraph(bview, cursor);
/* restore the current font
* That is what a user expects! */
current_font = rawtmpfont;
real_current_font = realtmpfont;
}
- SetCursorIntern(cursor.par, cursor.pos);
+ SetCursorIntern(bview, cursor.par(), cursor.pos(), true,
+ cursor.boundary());
+ if (IsBoundary(bview->buffer(), cursor.par(), cursor.pos()) != cursor.boundary())
+ SetCursor(bview, cursor.par(), cursor.pos(), false, !cursor.boundary());
}
/* table stuff -- end*/
+#endif
-/* just a macro to make some thing easier. */
-void LyXText::RedoParagraph() const
+// Just a macro to make some thing easier.
+void LyXText::RedoParagraph(BufferView * bview) const
{
-#if 1
- // I suspect this version will work
- // also.
ClearSelection();
- RedoParagraphs(cursor, cursor.par->Next());
- SetCursorIntern(cursor.par, cursor.pos);
-#else
- LyXCursor tmpcursor = cursor;
- ClearSelection();
- RedoParagraphs(cursor, cursor.par->Next());
- SetCursorIntern(tmpcursor.par, tmpcursor.pos);
-#endif
+ RedoParagraphs(bview, cursor, cursor.par()->Next());
+ SetCursorIntern(bview, cursor.par(), cursor.pos());
}
/* insert a character, moves all the following breaks in the
* same Paragraph one to the right and make a rebreak */
-void LyXText::InsertChar(char c)
+void LyXText::InsertChar(BufferView * bview, char c)
{
- SetUndo(Undo::INSERT,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
+ SetUndo(bview->buffer(), Undo::INSERT,
+ cursor.par()->ParFromPos(cursor.pos())->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
- /* When the free-spacing option is set for the current layout,
- * disable the double-space checking */
+ // When the free-spacing option is set for the current layout,
+ // disable the double-space checking
bool freeSpacing =
- textclasslist.Style(parameters->textclass,
- cursor.row->par->GetLayout()).free_spacing;
+ textclasslist.Style(bview->buffer()->params.textclass,
+ cursor.row()->par()->GetLayout()).free_spacing;
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
- if (cursor.par->table) {
- InsertCharInTable(c);
+ if (cursor.par()->table) {
+ InsertCharInTable(bview, c);
charInserted();
return;
}
/* table stuff -- end*/
-
+#endif
/* First check, if there will be two blanks together or a blank at
the beginning of a paragraph.
I decided to handle blanks like normal characters, the main
// The bug is triggered when we type in a description environment:
// The current_font is not changed when we go from label to main text
// and it should (along with realtmpfont) when we type the space.
-#ifdef WITH_WARNINGS
-#warning There is a bug here! (Asger)
-#endif
+ // CHECK There is a bug here! (Asger)
LyXFont realtmpfont = real_current_font;
LyXFont rawtmpfont = current_font; /* store the current font.
* current font */
// Get the font that is used to calculate the baselineskip
- LyXParagraph::size_type lastpos = cursor.par->Last();
- LyXFont rawparfont = cursor.par->GetFontSettings(lastpos - 1);
+ LyXParagraph::size_type lastpos = cursor.par()->Last();
+ LyXFont rawparfont = cursor.par()->GetFontSettings(bview->buffer()->params,
+ lastpos - 1);
bool jumped_over_space = false;
if (!freeSpacing && IsLineSeparatorChar(c)) {
-#ifndef FIX_DOUBLE_SPACE
- if (cursor.pos < lastpos
- && cursor.par->IsLineSeparator(cursor.pos)) {
- /* the user inserted a space before a space. So we
- * will just make a CursorRight. BUT: The font of this
- * space should be set to current font. That is why
- * we need to rebreak perhaps. If there is a protected
- * blank at the end of a row we have to force
- * a rebreak.*/
-
- owner_->owner()->getMiniBuffer()
- ->Set(_("You cannot type two spaces this way. "
- " Please read the Tutorial."));
-#if 1
- // How can this ever happen?
- if (cursor.pos == RowLast(cursor.row)
- && !IsLineSeparatorChar(c))
- cursor.row->fill = -1; // force rebreak
- cursor.par->Erase(cursor.pos);
- jumped_over_space = true;
-#else
- // Seems to me that this works just as well.
- CursorRight();
- charInserted();
- return;
-#endif
- } else
-#endif
- if ((cursor.pos > 0
- && cursor.par->IsLineSeparator(cursor.pos - 1))
- || (cursor.pos > 0
- && cursor.par->IsNewline(cursor.pos - 1))
- || (cursor.pos == 0
- && !(cursor.par->Previous()
- && cursor.par->Previous()->footnoteflag
+ if ((cursor.pos() > 0
+ && cursor.par()->IsLineSeparator(cursor.pos() - 1))
+ || (cursor.pos() > 0
+ && cursor.par()->IsNewline(cursor.pos() - 1))
+ || (cursor.pos() == 0
+ && !(cursor.par()->Previous()
+ && cursor.par()->Previous()->footnoteflag
== LyXParagraph::OPEN_FOOTNOTE))) {
- if (cursor.pos == 0 )
- owner_->owner()->getMiniBuffer()->Set(_("You cannot insert a space at the beginning of a paragraph. Please read the Tutorial."));
+ if (cursor.pos() == 0 )
+ bview->owner()->getMiniBuffer()->Set(_("You cannot insert a space at the beginning of a paragraph. Please read the Tutorial."));
else
- owner_->owner()->getMiniBuffer()->Set(_("You cannot type two spaces this way. Please read the Tutorial."));
+ bview->owner()->getMiniBuffer()->Set(_("You cannot type two spaces this way. Please read the Tutorial."));
charInserted();
return;
}
} else if (IsNewlineChar(c)) {
- if (cursor.par->FirstPhysicalPar() == cursor.par
- && cursor.pos <= BeginningOfMainBody(cursor.par)) {
+ if (cursor.par()->FirstPhysicalPar() == cursor.par()
+ && cursor.pos() <= BeginningOfMainBody(bview->buffer(), cursor.par())) {
charInserted();
return;
}
* of a paragraph or behind labels.
* TeX does not allow that. */
- if (cursor.pos < cursor.par->Last() &&
- cursor.par->IsLineSeparator(cursor.pos))
- CursorRightIntern(); // newline always after a blank!
- cursor.row->fill = -1; // to force a new break
+ if (cursor.pos() < cursor.par()->Last() &&
+ cursor.par()->IsLineSeparator(cursor.pos()))
+ // newline always after a blank!
+ CursorRightIntern(bview);
+ cursor.row()->fill(-1); // to force a new break
}
// the display inset stuff
- if (cursor.row->par->GetChar(cursor.row->pos) == LyXParagraph::META_INSET
- && cursor.row->par->GetInset(cursor.row->pos)
- && cursor.row->par->GetInset(cursor.row->pos)->display())
- cursor.row->fill = -1; // to force a new break
+ if (cursor.row()->par()->GetChar(cursor.row()->pos()) == LyXParagraph::META_INSET
+ && cursor.row()->par()->GetInset(cursor.row()->pos())
+ && (cursor.row()->par()->GetInset(cursor.row()->pos())->display() ||
+ cursor.row()->par()->GetInset(cursor.row()->pos())->needFullRow()))
+ cursor.row()->fill(-1); // to force a new break
// get the cursor row fist
- Row * row = cursor.row;
- long y = cursor.y - row->baseline;
+ Row * row = cursor.row();
+ long y = cursor.y() - row->baseline();
if (c != LyXParagraph::META_INSET) /* Here case LyXText::InsertInset
* already insertet the character */
- cursor.par->InsertChar(cursor.pos, c);
- SetCharFont(cursor.par, cursor.pos, rawtmpfont);
+ cursor.par()->InsertChar(cursor.pos(), c);
+ SetCharFont(bview->buffer(), cursor.par(), cursor.pos(), rawtmpfont);
if (!jumped_over_space) {
// refresh the positions
Row * tmprow = row;
- while (tmprow->next && tmprow->next->par == row->par) {
- tmprow = tmprow->next;
- tmprow->pos++;
+ while (tmprow->next() && tmprow->next()->par() == row->par()) {
+ tmprow = tmprow->next();
+ tmprow->pos(tmprow->pos() + 1);
}
}
// Is there a break one row above
- if ((cursor.par->IsLineSeparator(cursor.pos)
- || cursor.par->IsNewline(cursor.pos)
- || cursor.row->fill == -1)
- && row->previous && row->previous->par == row->par) {
- LyXParagraph::size_type z = NextBreakPoint(row->previous,
- paperwidth);
- if ( z >= row->pos) {
- row->pos = z + 1;
+ if ((cursor.par()->IsLineSeparator(cursor.pos())
+ || cursor.par()->IsNewline(cursor.pos())
+ || cursor.row()->fill() == -1)
+ && row->previous() && row->previous()->par() == row->par()) {
+ LyXParagraph::size_type z = NextBreakPoint(bview,
+ row->previous(),
+ workWidth(bview));
+ if ( z >= row->pos()) {
+ row->pos(z + 1);
// set the dimensions of the row above
- row->previous->fill = Fill(row->previous, paperwidth);
+ row->previous()->fill(Fill(bview,
+ row->previous(),
+ workWidth(bview)));
- SetHeightOfRow(row->previous);
+ SetHeightOfRow(bview, row->previous());
- y -= row->previous->height;
+ y -= row->previous()->height();
refresh_y = y;
- refresh_row = row->previous;
+ refresh_row = row->previous();
status = LyXText::NEED_MORE_REFRESH;
- BreakAgainOneRow(row);
+ BreakAgainOneRow(bview, row);
current_font = rawtmpfont;
real_current_font = realtmpfont;
- SetCursor(cursor.par, cursor.pos + 1, false);
- /* cursor MUST be in row now */
+ SetCursor(bview, cursor.par(), cursor.pos() + 1,
+ false, cursor.boundary());
+ // cursor MUST be in row now.
- if (row->next && row->next->par == row->par)
- need_break_row = row->next;
+ if (row->next() && row->next()->par() == row->par())
+ need_break_row = row->next();
else
need_break_row = 0;
// check, wether the last characters font has changed.
- if (cursor.pos && cursor.pos == cursor.par->Last()
+ if (cursor.pos() && cursor.pos() == cursor.par()->Last()
&& rawparfont != rawtmpfont)
- RedoHeightOfParagraph(cursor);
+ RedoHeightOfParagraph(bview, cursor);
charInserted();
return;
}
}
- /* recalculate the fill of the row */
- if (row->fill >= 0) /* needed because a newline
+ // recalculate the fill of the row
+ if (row->fill() >= 0) /* needed because a newline
* will set fill to -1. Otherwise
* we would not get a rebreak! */
- row->fill = Fill(row, paperwidth);
- if (row->fill < 0 ) {
+ row->fill(Fill(bview, row, workWidth(bview)));
+ if (row->fill() < 0 ) {
refresh_y = y;
refresh_row = row;
- refresh_x = cursor.x;
- refresh_pos = cursor.pos;
+ refresh_x = cursor.x();
+ refresh_pos = cursor.pos();
status = LyXText::NEED_MORE_REFRESH;
- BreakAgainOneRow(row);
- /* will the cursor be in another row now? */
- if (RowLast(row) <= cursor.pos + 1 && row->next) {
- if (row->next && row->next->par == row->par)
- /* this should
- * always be true */
- row = row->next;
- BreakAgainOneRow(row);
+ BreakAgainOneRow(bview, row);
+ // will the cursor be in another row now?
+ if (RowLast(row) <= cursor.pos() + 1 && row->next()) {
+ if (row->next() && row->next()->par() == row->par())
+ // this should always be true
+ row = row->next();
+ BreakAgainOneRow(bview, row);
}
current_font = rawtmpfont;
real_current_font = realtmpfont;
- SetCursor(cursor.par, cursor.pos + 1, false);
- if (row->next && row->next->par == row->par)
- need_break_row = row->next;
+
+ SetCursor(bview, cursor.par(), cursor.pos() + 1, false,
+ cursor.boundary());
+ if (row->next() && row->next()->par() == row->par())
+ need_break_row = row->next();
else
need_break_row = 0;
} else {
refresh_y = y;
- refresh_x = cursor.x;
+ refresh_x = cursor.x();
refresh_row = row;
- refresh_pos = cursor.pos;
+ refresh_pos = cursor.pos();
- int tmpheight = row->height;
- SetHeightOfRow(row);
- if (tmpheight == row->height)
+ int tmpheight = row->height();
+ SetHeightOfRow(bview, row);
+ if (tmpheight == row->height())
status = LyXText::NEED_VERY_LITTLE_REFRESH;
else
status = LyXText::NEED_MORE_REFRESH;
current_font = rawtmpfont;
real_current_font = realtmpfont;
- SetCursor(cursor.par, cursor.pos + 1, false);
+ SetCursor(bview, cursor.par(), cursor.pos() + 1, false,
+ cursor.boundary());
}
- /* check, wether the last characters font has changed. */
- if (cursor.pos && cursor.pos == cursor.par->Last()
+ // check, wether the last characters font has changed.
+ if (cursor.pos() && cursor.pos() == cursor.par()->Last()
&& rawparfont != rawtmpfont) {
- RedoHeightOfParagraph(cursor);
+ RedoHeightOfParagraph(bview, cursor);
} else {
- /* now the special right address boxes */
- if (textclasslist.Style(parameters->textclass,
- cursor.par->GetLayout()).margintype
+ // now the special right address boxes
+ if (textclasslist.Style(bview->buffer()->params.textclass,
+ cursor.par()->GetLayout()).margintype
== MARGIN_RIGHT_ADDRESS_BOX) {
- RedoDrawingOfParagraph(cursor);
+ RedoDrawingOfParagraph(bview, cursor);
}
}
}
}
-void LyXText::PrepareToPrint(Row * row, float & x,
+
+void LyXText::PrepareToPrint(BufferView * bview,
+ Row * row, float & x,
float & fill_separator,
float & fill_hfill,
float & fill_label_hfill,
bool bidi) const
{
- float nh, nlh, ns;
+ float nlh, ns;
- float w = row->fill;
+ float w = row->fill();
fill_hfill = 0;
fill_label_hfill = 0;
fill_separator = 0;
fill_label_hfill = 0;
- LyXDirection direction = row->par->getParDirection();
+#ifndef NEW_INSETS
+ bool is_rtl = row->par()->isRightToLeftPar(bview->buffer()->params);
- if (direction == LYX_DIR_RIGHT_TO_LEFT) {
- x = RightMargin(row);
- if (row->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
+ if (is_rtl) {
+ x = RightMargin(bview->buffer(), row);
+ if (row->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
LyXFont font(LyXFont::ALL_SANE);
font.setSize(LyXFont::SIZE_SMALL);
- x += font.textWidth("Mwide-figM", 10);
+ x += lyxfont::width("Mwide-figM", font);
}
- }
+ } else
+#endif
+ if (workWidth(bview) > 0)
+ x = LeftMargin(bview, row);
else
- x = LeftMargin(row);
+ x = 0;
- /* is there a manual margin with a manual label */
- if (textclasslist.Style(parameters->textclass,
- row->par->GetLayout()).margintype == MARGIN_MANUAL
- && textclasslist.Style(parameters->textclass,
- row->par->GetLayout()).labeltype == LABEL_MANUAL) {
+ // is there a manual margin with a manual label
+ if (textclasslist.Style(bview->buffer()->params.textclass,
+ row->par()->GetLayout()).margintype == MARGIN_MANUAL
+ && textclasslist.Style(bview->buffer()->params.textclass,
+ row->par()->GetLayout()).labeltype == LABEL_MANUAL) {
- nlh = NumberOfLabelHfills(row) + 1; /* one more since labels
- * are left aligned*/
- if (nlh && !row->par->GetLabelWidthString().empty()) {
- fill_label_hfill = LabelFill(row) / nlh;
+ /* one more since labels are left aligned */
+ nlh = NumberOfLabelHfills(bview->buffer(), row) + 1;
+ if (nlh && !row->par()->GetLabelWidthString().empty()) {
+ fill_label_hfill = LabelFill(bview, row) / nlh;
}
}
- /* are there any hfills in the row? */
- nh = NumberOfHfills(row);
-
+ // are there any hfills in the row?
+ float nh = NumberOfHfills(bview->buffer(), row);
+
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
- if (row->par->table) {
- w = paperwidth - row->par->table->WidthOfTable()
- - x - RightMargin(row);
+ if (row->par()->table) {
+ w = workWidth(bview) - row->par()->table->WidthOfTable()
+ - x - RightMargin(bview->buffer(), row);
nh = 0; /* ignore hfills in tables */
}
/* table stuff -- end*/
-
+#endif
if (nh)
fill_hfill = w /nh;
else {
- /* is it block, flushleft or flushright?
- * set x how you need it */
+ // is it block, flushleft or flushright?
+ // set x how you need it
int align;
- if (row->par->FirstPhysicalPar()->align == LYX_ALIGN_LAYOUT)
- align = textclasslist.Style(parameters->textclass, row->par->GetLayout()).align;
+ if (row->par()->FirstPhysicalPar()->align == LYX_ALIGN_LAYOUT)
+ align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->GetLayout()).align;
else
- align = row->par->FirstPhysicalPar()->align;
+ align = row->par()->FirstPhysicalPar()->align;
- /* center displayed insets */
- if (row->par->GetChar(row->pos) == LyXParagraph::META_INSET
- && row->par->GetInset(row->pos)
- && row->par->GetInset(row->pos)->display())
+ // center displayed insets
+ if (row->par()->GetChar(row->pos()) == LyXParagraph::META_INSET
+ && row->par()->GetInset(row->pos())
+ && row->par()->GetInset(row->pos())->display())
align = LYX_ALIGN_CENTER;
switch (align) {
case LYX_ALIGN_BLOCK:
- ns = NumberOfSeparators(row);
- if (ns && row->next && row->next->par == row->par &&
- !(row->next->par->IsNewline(row->next->pos-1))
- && !(row->next->par->GetChar(row->next->pos) == LyXParagraph::META_INSET
- && row->next->par->GetInset(row->next->pos)
- && row->next->par->GetInset(row->next->pos)->display())
+ ns = NumberOfSeparators(bview->buffer(), row);
+ if (ns && row->next() && row->next()->par() == row->par() &&
+ !(row->next()->par()->IsNewline(row->next()->pos() - 1))
+ && !(row->next()->par()->GetChar(row->next()->pos()) == LyXParagraph::META_INSET
+ && row->next()->par()->GetInset(row->next()->pos())
+ && row->next()->par()->GetInset(row->next()->pos())->display())
)
fill_separator = w / ns;
- else if (direction == LYX_DIR_RIGHT_TO_LEFT)
+ else if (is_rtl)
x += w;
break;
case LYX_ALIGN_RIGHT:
if (!bidi)
return;
- ComputeBidiTables(row);
- if (direction == LYX_DIR_RIGHT_TO_LEFT) {
+ ComputeBidiTables(bview->buffer(), row);
+ if (is_rtl) {
LyXParagraph::size_type main_body =
- BeginningOfMainBody(row->par);
+ BeginningOfMainBody(bview->buffer(), row->par());
LyXParagraph::size_type last = RowLast(row);
- if (row->pos <= last
- && !row->par->table
- && last != vis2log(last)
- && row->par->IsLineSeparator(last)) {
- if (!(main_body > 0 && main_body-1 == last))
- x -= fill_separator+SingleWidth(row->par,last);
- } else if (main_body > 0 &&
- (main_body-1 > last ||
- !row->par->IsLineSeparator(main_body-1))) {
- LyXLayout const & layout = textclasslist.Style(parameters->textclass,
- row->par->GetLayout());
- x += GetFont(row->par, -2).stringWidth(layout.labelsep);
+ if (main_body > 0 &&
+ (main_body-1 > last ||
+ !row->par()->IsLineSeparator(main_body-1))) {
+ LyXLayout const & layout =
+ textclasslist.Style(bview->buffer()->params.textclass,
+ row->par()->GetLayout());
+ x += lyxfont::width(layout.labelsep,
+ GetFont(bview->buffer(), row->par(), -2));
if (main_body-1 <= last)
x += fill_label_hfill;
}
* realize, that you left an empty paragraph, they will delete it.
* They also delete the corresponding row */
-void LyXText::CursorRightOneWord() const
+void LyXText::CursorRightOneWord(BufferView * bview) const
{
// treat floats, HFills and Insets as words
LyXCursor tmpcursor = cursor;
-#warning See comment on top of text.C
+ // CHECK See comment on top of text.C
- if (tmpcursor.pos == tmpcursor.par->Last()
- && tmpcursor.par->Next())
- {
- tmpcursor.par = tmpcursor.par->Next();
- tmpcursor.pos = 0;
+ if (tmpcursor.pos() == tmpcursor.par()->Last()
+ && tmpcursor.par()->Next()) {
+ tmpcursor.par(tmpcursor.par()->Next());
+ tmpcursor.pos(0);
} else {
int steps = 0;
// Skip through initial nonword stuff.
- while ( tmpcursor.pos < tmpcursor.par->Last() &&
- ! tmpcursor.par->IsWord( tmpcursor.pos ) )
+ while ( tmpcursor.pos() < tmpcursor.par()->Last() &&
+ ! tmpcursor.par()->IsWord( tmpcursor.pos() ) )
{
- // printf("Current pos1 %d", tmpcursor.pos) ;
- tmpcursor.pos++;
+ // printf("Current pos1 %d", tmpcursor.pos()) ;
+ tmpcursor.pos(tmpcursor.pos() + 1);
++steps;
}
// Advance through word.
- while ( tmpcursor.pos < tmpcursor.par->Last() &&
- tmpcursor.par->IsWord( tmpcursor.pos ) )
+ while ( tmpcursor.pos() < tmpcursor.par()->Last() &&
+ tmpcursor.par()->IsWord( tmpcursor.pos() ) )
{
- // printf("Current pos2 %d", tmpcursor.pos) ;
- tmpcursor.pos++;
+ // printf("Current pos2 %d", tmpcursor.pos()) ;
+ tmpcursor.pos(tmpcursor.pos() + 1);
++steps;
}
}
- SetCursor(tmpcursor.par, tmpcursor.pos);
+ SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
}
-void LyXText::CursorTab() const
+void LyXText::CursorTab(BufferView * bview) const
{
- if (cursor.par->table) {
- int cell = NumberOfCell(cursor.par, cursor.pos);
- while(cursor.par->table->IsContRow(cell)) {
- CursorUp();
- cell = NumberOfCell(cursor.par, cursor.pos);
+#ifndef NEW_TABULAR
+ if (cursor.par()->table) {
+ int cell = NumberOfCell(cursor.par(), cursor.pos());
+ while(cursor.par()->table->IsContRow(cell)) {
+ CursorUp(bview);
+ cell = NumberOfCell(cursor.par(), cursor.pos());
}
- if (cursor.par->table->ShouldBeVeryLastCell(cell))
- TableFeatures(LyXTable::APPEND_ROW);
+ if (cursor.par()->table->ShouldBeVeryLastCell(cell))
+ TableFeatures(bview, LyXTable::APPEND_ROW);
}
+#endif
LyXCursor tmpcursor = cursor;
- while (tmpcursor.pos < tmpcursor.par->Last()
- && !tmpcursor.par->IsNewline(tmpcursor.pos))
- tmpcursor.pos++;
+ while (tmpcursor.pos() < tmpcursor.par()->Last()
+ && !tmpcursor.par()->IsNewline(tmpcursor.pos()))
+ tmpcursor.pos(tmpcursor.pos() + 1);
- if (tmpcursor.pos == tmpcursor.par->Last()){
- if (tmpcursor.par->Next()) {
- tmpcursor.par = tmpcursor.par->Next();
- tmpcursor.pos = 0;
+ if (tmpcursor.pos() == tmpcursor.par()->Last()){
+ if (tmpcursor.par()->Next()) {
+ tmpcursor.par(tmpcursor.par()->Next());
+ tmpcursor.pos(0);
}
- }
- else
- tmpcursor.pos++;
- SetCursor(tmpcursor.par, tmpcursor.pos);
- if (cursor.par->table) {
- int cell = NumberOfCell(cursor.par, cursor.pos);
- while (cursor.par->table->IsContRow(cell) &&
- !cursor.par->table->ShouldBeVeryLastCell(cell)) {
+ } else
+ tmpcursor.pos(tmpcursor.pos() + 1);
+ SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
+#ifndef NEW_TABULAR
+ if (cursor.par()->table) {
+ int cell = NumberOfCell(cursor.par(), cursor.pos());
+ while (cursor.par()->table->IsContRow(cell) &&
+ !cursor.par()->table->ShouldBeVeryLastCell(cell)) {
tmpcursor = cursor;
- while (tmpcursor.pos < tmpcursor.par->Last()
- && !tmpcursor.par->IsNewline(tmpcursor.pos))
- tmpcursor.pos++;
+ while (tmpcursor.pos() < tmpcursor.par()->Last()
+ && !tmpcursor.par()->IsNewline(tmpcursor.pos()))
+ tmpcursor.pos(tmpcursor.pos() + 1);
- if (tmpcursor.pos == tmpcursor.par->Last()){
- if (tmpcursor.par->Next()) {
- tmpcursor.par = tmpcursor.par->Next();
- tmpcursor.pos = 0;
+ if (tmpcursor.pos() == tmpcursor.par()->Last()){
+ if (tmpcursor.par()->Next()) {
+ tmpcursor.par(tmpcursor.par()->Next());
+ tmpcursor.pos(0);
}
- }
- else
- tmpcursor.pos++;
- SetCursor(tmpcursor.par, tmpcursor.pos);
- cell = NumberOfCell(cursor.par, cursor.pos);
+ } else
+ tmpcursor.pos(tmpcursor.pos() + 1);
+ SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
+ cell = NumberOfCell(cursor.par(), cursor.pos());
}
}
+#endif
}
/* -------> Skip initial whitespace at end of word and move cursor to *start*
of prior word, not to end of next prior word. */
-void LyXText::CursorLeftOneWord() const
+void LyXText::CursorLeftOneWord(BufferView * bview) const
{
// treat HFills, floats and Insets as words
LyXCursor tmpcursor = cursor;
- while (tmpcursor.pos
- && (tmpcursor.par->IsSeparator(tmpcursor.pos - 1)
- || tmpcursor.par->IsKomma(tmpcursor.pos - 1))
- && !(tmpcursor.par->IsHfill(tmpcursor.pos - 1)
- || tmpcursor.par->IsFloat(tmpcursor.pos - 1)
- || tmpcursor.par->IsInset(tmpcursor.pos - 1)))
- tmpcursor.pos--;
-
- if (tmpcursor.pos
- && (tmpcursor.par->IsInset(tmpcursor.pos - 1)
- || tmpcursor.par->IsFloat(tmpcursor.pos - 1)
- || tmpcursor.par->IsHfill(tmpcursor.pos - 1))) {
- tmpcursor.pos--;
- } else if (!tmpcursor.pos) {
- if (tmpcursor.par->Previous()){
- tmpcursor.par = tmpcursor.par->Previous();
- tmpcursor.pos = tmpcursor.par->Last();
+ while (tmpcursor.pos()
+ && (tmpcursor.par()->IsSeparator(tmpcursor.pos() - 1)
+ || tmpcursor.par()->IsKomma(tmpcursor.pos() - 1))
+ && !(tmpcursor.par()->IsHfill(tmpcursor.pos() - 1)
+ || tmpcursor.par()->IsFloat(tmpcursor.pos() - 1)
+ || tmpcursor.par()->IsInset(tmpcursor.pos() - 1)))
+ tmpcursor.pos(tmpcursor.pos() - 1);
+
+ if (tmpcursor.pos()
+ && (tmpcursor.par()->IsInset(tmpcursor.pos() - 1)
+ || tmpcursor.par()->IsFloat(tmpcursor.pos() - 1)
+ || tmpcursor.par()->IsHfill(tmpcursor.pos() - 1))) {
+ tmpcursor.pos(tmpcursor.pos() - 1);
+ } else if (!tmpcursor.pos()) {
+ if (tmpcursor.par()->Previous()){
+ tmpcursor.par(tmpcursor.par()->Previous());
+ tmpcursor.pos(tmpcursor.par()->Last());
}
} else { // Here, tmpcursor != 0
- while (tmpcursor.pos > 0 &&
- tmpcursor.par->IsWord(tmpcursor.pos-1) )
- tmpcursor.pos-- ;
+ while (tmpcursor.pos() > 0 &&
+ tmpcursor.par()->IsWord(tmpcursor.pos()-1) )
+ tmpcursor.pos(tmpcursor.pos() - 1);
}
- SetCursor(tmpcursor.par, tmpcursor.pos);
+ SetCursor(bview, tmpcursor.par(), tmpcursor.pos());
}
/* -------> Select current word. This depends on behaviour of CursorLeftOneWord(), so it is
patched as well. */
-void LyXText::SelectWord()
+void LyXText::SelectWord(BufferView * bview)
{
- /* Move cursor to the beginning, when not already there. */
- if ( cursor.pos
- && !cursor.par->IsSeparator(cursor.pos-1)
- && !cursor.par->IsKomma(cursor.pos-1) )
- CursorLeftOneWord();
+ // Move cursor to the beginning, when not already there.
+ if ( cursor.pos()
+ && !cursor.par()->IsSeparator(cursor.pos()-1)
+ && !cursor.par()->IsKomma(cursor.pos()-1) )
+ CursorLeftOneWord(bview);
- /* set the sel cursor */
+ // set the sel cursor
sel_cursor = cursor;
- while ( cursor.pos < cursor.par->Last()
- && !cursor.par->IsSeparator(cursor.pos)
- && !cursor.par->IsKomma(cursor.pos) )
- cursor.pos++;
- SetCursor( cursor.par, cursor.pos );
+ while ( cursor.pos() < cursor.par()->Last()
+ && !cursor.par()->IsSeparator(cursor.pos())
+ && !cursor.par()->IsKomma(cursor.pos()) )
+ cursor.pos(cursor.pos() + 1);
+ SetCursor(bview, cursor.par(), cursor.pos() );
- /* finally set the selection */
+ // finally set the selection
SetSelection();
}
1: no selection is currently set,
2: the cursor is not at the borders of the word. */
-int LyXText::SelectWordWhenUnderCursor()
+bool LyXText::SelectWordWhenUnderCursor(BufferView * bview)
{
- if ( selection ) return 0;
- if ( cursor.pos < cursor.par->Last()
- && !cursor.par->IsSeparator(cursor.pos)
- && !cursor.par->IsKomma(cursor.pos)
- && cursor.pos
- && !cursor.par->IsSeparator(cursor.pos -1)
- && !cursor.par->IsKomma(cursor.pos -1) ) {
- SelectWord();
- return 1;
+ if (!selection &&
+ cursor.pos() > 0 && cursor.pos() < cursor.par()->Last()
+ && !cursor.par()->IsSeparator(cursor.pos())
+ && !cursor.par()->IsKomma(cursor.pos())
+ && !cursor.par()->IsSeparator(cursor.pos() -1)
+ && !cursor.par()->IsKomma(cursor.pos() -1) ) {
+ SelectWord(bview);
+ return true;
}
- return 0;
+ return false;
}
// This function is only used by the spellchecker for NextWord().
// It doesn't handle LYX_ACCENTs and probably never will.
-char * LyXText::SelectNextWord(float & value)
+char * LyXText::SelectNextWord(BufferView * bview, float & value)
{
- LyXParagraph * tmppar = cursor.par;
+ LyXParagraph * tmppar = cursor.par();
// If this is not the very first word, skip rest of
// current word because we are probably in the middle
// of a word if there is text here.
- if (cursor.pos || cursor.par->previous) {
- while (cursor.pos < cursor.par->Last()
- && cursor.par->IsLetter(cursor.pos))
- cursor.pos++;
+ if (cursor.pos() || cursor.par()->previous) {
+ while (cursor.pos() < cursor.par()->Last()
+ && cursor.par()->IsLetter(cursor.pos()))
+ cursor.pos(cursor.pos() + 1);
}
// Now, skip until we have real text (will jump paragraphs)
- while ((cursor.par->Last() > cursor.pos
- && (!cursor.par->IsLetter(cursor.pos)
- || cursor.par->getFont(cursor.pos).latex() == LyXFont::ON))
- || (cursor.par->Last() == cursor.pos
- && cursor.par->Next())){
- if (cursor.pos == cursor.par->Last()) {
- cursor.par = cursor.par->Next();
- cursor.pos = 0;
- }
- else
- cursor.pos++;
+ while ((cursor.par()->Last() > cursor.pos()
+ && (!cursor.par()->IsLetter(cursor.pos())
+ || cursor.par()->getFont(bview->buffer()->params, cursor.pos())
+ .latex() == LyXFont::ON))
+ || (cursor.par()->Last() == cursor.pos()
+ && cursor.par()->Next())){
+ if (cursor.pos() == cursor.par()->Last()) {
+ cursor.par(cursor.par()->Next());
+ cursor.pos(0);
+ } else
+ cursor.pos(cursor.pos() + 1);
}
// Update the value if we changed paragraphs
- if (cursor.par != tmppar){
- SetCursor(cursor.par, cursor.pos);
- value = float(cursor.y)/float(height);
+ if (cursor.par() != tmppar){
+ SetCursor(bview, cursor.par(), cursor.pos());
+ value = float(cursor.y())/float(height);
}
- /* Start the selection from here */
+ // Start the selection from here
sel_cursor = cursor;
#ifdef HAVE_SSTREAM
- ostringstream latex;
+ std::ostringstream latex;
#else
ostrstream latex;
#endif
- /* and find the end of the word
- (optional hyphens are part of a word) */
- while (cursor.pos < cursor.par->Last()
- && (cursor.par->IsLetter(cursor.pos))
- || (cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET
- && cursor.par->GetInset(cursor.pos) != 0
- && cursor.par->GetInset(cursor.pos)->Latex(latex, 0, false) == 0
+ // and find the end of the word
+ // (optional hyphens are part of a word)
+ while (cursor.pos() < cursor.par()->Last()
+ && (cursor.par()->IsLetter(cursor.pos()))
+ || (cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET
+ && cursor.par()->GetInset(cursor.pos()) != 0
+ && cursor.par()->GetInset(cursor.pos())->Latex(bview->buffer(), latex, false, false) == 0
#ifdef HAVE_SSTREAM
&& latex.str() == "\\-"
#else
- && string(latex.str(), 3) == "\\-" // this is not nice at all
+ && latex.str() // protect against null pointers
+ && string(latex.str(), 3) == "\\-" // this is not nice at all
#endif
))
- cursor.pos++;
+ cursor.pos(cursor.pos() + 1);
#ifndef HAVE_SSTREAM
delete [] latex.str();
// Finally, we copy the word to a string and return it
char * str = 0;
- if (sel_cursor.pos < cursor.pos) {
- str = new char [cursor.pos - sel_cursor.pos + 2];
+ if (sel_cursor.pos() < cursor.pos()) {
+ str = new char [cursor.pos() - sel_cursor.pos() + 2];
LyXParagraph::size_type i, j;
- for (i = sel_cursor.pos, j = 0; i < cursor.pos; ++i) {
- if (cursor.par->GetChar(i) != LyXParagraph::META_INSET)
- str[j++] = cursor.par->GetChar(i);
+ for (i = sel_cursor.pos(), j = 0; i < cursor.pos(); ++i) {
+ if (cursor.par()->GetChar(i) != LyXParagraph::META_INSET)
+ str[j++] = cursor.par()->GetChar(i);
}
str[j] = '\0';
}
// This one is also only for the spellchecker
-void LyXText::SelectSelectedWord()
+void LyXText::SelectSelectedWord(BufferView * bview)
{
- /* move cursor to the beginning */
- SetCursor(sel_cursor.par, sel_cursor.pos);
+ // move cursor to the beginning
+ SetCursor(bview, sel_cursor.par(), sel_cursor.pos());
- /* set the sel cursor */
+ // set the sel cursor
sel_cursor = cursor;
#ifdef HAVE_SSTREAM
- ostringstream latex;
+ std::ostringstream latex;
#else
ostrstream latex;
#endif
- /* now find the end of the word */
- while (cursor.pos < cursor.par->Last()
- && (cursor.par->IsLetter(cursor.pos)
- || (cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET
- && cursor.par->GetInset(cursor.pos) != 0
- && cursor.par->GetInset(cursor.pos)->Latex(latex, 0, false) == 0
+ // now find the end of the word
+ while (cursor.pos() < cursor.par()->Last()
+ && (cursor.par()->IsLetter(cursor.pos())
+ || (cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET
+ && cursor.par()->GetInset(cursor.pos()) != 0
+ && cursor.par()->GetInset(cursor.pos())->Latex(bview->buffer(), latex, false, false) == 0
#ifdef HAVE_SSTREAM
&& latex.str() == "\\-"
#else
&& string(latex.str(), 3) == "\\-"
#endif
)))
- cursor.pos++;
+ cursor.pos(cursor.pos() + 1);
#ifndef HAVE_SSTREAM
delete [] latex.str();
#endif
- SetCursor(cursor.par, cursor.pos);
+ SetCursor(bview, cursor.par(), cursor.pos());
- /* finally set the selection */
+ // finally set the selection
SetSelection();
}
/* -------> Delete from cursor up to the end of the current or next word. */
-void LyXText::DeleteWordForward()
+void LyXText::DeleteWordForward(BufferView * bview)
{
- LyXCursor tmpcursor = cursor;
-
- if (!cursor.par->Last())
- CursorRight();
-#warning See comment on top of text.C
+ if (!cursor.par()->Last())
+ CursorRight(bview);
else {
- /* -------> Skip initial non-word stuff. */
- while ( cursor.pos < cursor.par->Last()
- && (cursor.par->IsSeparator(cursor.pos)
- || cursor.par->IsKomma(cursor.pos)) )
- cursor.pos++;
-
- SetCursorIntern(cursor.par, cursor.pos);
- selection = True; // to avoid deletion
- CursorRightOneWord();
+ LyXCursor tmpcursor = cursor;
+ tmpcursor.row(0); //Â ??
+ selection = true; // to avoid deletion
+ CursorRightOneWord(bview);
+ SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
sel_cursor = cursor;
cursor = tmpcursor;
SetSelection();
/* -----> Great, CutSelection() gets rid of multiple spaces. */
- CutSelection();
+ CutSelection(bview);
}
}
/* -------> Delete from cursor to start of current or prior word. */
-void LyXText::DeleteWordBackward()
+void LyXText::DeleteWordBackward(BufferView * bview)
{
- LyXCursor tmpcursor = cursor;
- if (!cursor.par->Last())
- CursorLeft();
-#warning See comment on top of text.C
- else{
- selection = true; // to avoid deletion
- CursorLeftOneWord();
- sel_cursor = cursor;
- cursor = tmpcursor;
- SetSelection();
- CutSelection();
+ if (!cursor.par()->Last())
+ CursorLeft(bview);
+ else {
+ LyXCursor tmpcursor = cursor;
+ tmpcursor.row(0); // ??
+ selection = true; // to avoid deletion
+ CursorLeftOneWord(bview);
+ SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
+ sel_cursor = cursor;
+ cursor = tmpcursor;
+ SetSelection();
+ CutSelection(bview);
}
}
/* -------> Kill to end of line. */
-void LyXText::DeleteLineForward()
+void LyXText::DeleteLineForward(BufferView * bview)
{
- LyXCursor tmpcursor = cursor;
- if (!cursor.par->Last())
- CursorRight();
-#warning See comment on top of text.C
+ if (!cursor.par()->Last())
+ // Paragraph is empty, so we just go to the right
+ CursorRight(bview);
else {
- CursorEnd();
+ LyXCursor tmpcursor = cursor;
+ // We can't store the row over a regular SetCursor
+ // so we set it to 0 and reset it afterwards.
+ tmpcursor.row(0); //Â ??
+ selection = true; // to avoid deletion
+ CursorEnd(bview);
+ SetCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
sel_cursor = cursor;
cursor = tmpcursor;
SetSelection();
- if (selection == false) {
- DeleteWordForward();
+ // What is this test for ??? (JMarc)
+ if (!selection) {
+ DeleteWordForward(bview);
} else {
- CutSelection();
+ CutSelection(bview);
}
}
}
-// Change the case of a word at cursor position. The meaning of action
-// is:
-// 0 change to lowercase
-// 1 capitalize word
-// 2 change to uppercase
+// Change the case of a word at cursor position.
// This function directly manipulates LyXParagraph::text because there
// is no LyXParagraph::SetChar currently. I did what I could to ensure
// that it is correct. I guess part of it should be moved to
// LyXParagraph, but it will have to change for 1.1 anyway. At least
// it does not access outside of the allocated array as the older
// version did. (JMarc)
-void LyXText::ChangeWordCase(LyXText::TextCase action)
+void LyXText::ChangeWordCase(BufferView * bview, LyXText::TextCase action)
{
- LyXParagraph * tmppar = cursor.par->ParFromPos(cursor.pos);
+ LyXParagraph * tmppar = cursor.par()->ParFromPos(cursor.pos());
- SetUndo(Undo::FINISH, tmppar->previous, tmppar->next);
+ SetUndo(bview->buffer(),Undo::FINISH, tmppar->previous, tmppar->next);
LyXParagraph::size_type tmppos =
- cursor.par->PositionInParFromPos(cursor.pos);
+ cursor.par()->PositionInParFromPos(cursor.pos());
while (tmppos < tmppar->size()) {
- //unsigned char c = tmppar->text[tmppos];
unsigned char c = tmppar->GetChar(tmppos);
if (IsKommaChar(c) || IsLineSeparatorChar(c))
break;
tmppar->SetChar(tmppos, c);
++tmppos;
}
- CheckParagraph(tmppar, tmppos);
- CursorRightOneWord();
+ CheckParagraph(bview, tmppar, tmppos);
+ CursorRightOneWord(bview);
}
-void LyXText::Delete()
+void LyXText::Delete(BufferView * bview)
{
// this is a very easy implementation
LyXCursor old_cursor = cursor;
- int old_cur_par_id = old_cursor.par->id();
- int old_cur_par_prev_id = old_cursor.par->previous ?
- old_cursor.par->previous->id() : 0;
+ int old_cur_par_id = old_cursor.par()->id();
+ int old_cur_par_prev_id = old_cursor.par()->previous ?
+ old_cursor.par()->previous->id() : 0;
// just move to the right
- CursorRightIntern();
+ CursorRightIntern(bview);
-#warning Look at the comment here.
+ // CHECK Look at the comment here.
// This check is not very good...
// The CursorRightIntern calls DeleteEmptyParagrapgMechanism
// and that can very well delete the par or par->previous in
// old_cursor. Will a solution where we compare paragraph id's
//work better?
-#if 1
- if ((cursor.par->previous ? cursor.par->previous->id() : 0)
+ if ((cursor.par()->previous ? cursor.par()->previous->id() : 0)
== old_cur_par_prev_id
- && cursor.par->id() != old_cur_par_id)
+ && cursor.par()->id() != old_cur_par_id)
return; // delete-empty-paragraph-mechanism has done it
-#else
- if (cursor.par->previous == old_cursor.par->previous
- && cursor.par != old_cursor.par)
- return; // delete-empty-paragraph-mechanism has done it
-#endif
+
// if you had success make a backspace
- if (old_cursor.par != cursor.par || old_cursor.pos != cursor.pos) {
+ if (old_cursor.par() != cursor.par() || old_cursor.pos() != cursor.pos()) {
LyXCursor tmpcursor = cursor;
cursor = old_cursor; // to make sure undo gets the right cursor position
- SetUndo(Undo::DELETE,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
+ SetUndo(bview->buffer(), Undo::DELETE,
+ cursor.par()->ParFromPos(cursor.pos())->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
cursor = tmpcursor;
- Backspace();
+ Backspace(bview);
}
}
-void LyXText::Backspace()
+void LyXText::Backspace(BufferView * bview)
{
- LyXParagraph * tmppar;
- Row * tmprow, * row;
- long y;
- int tmpheight;
-
+#ifndef NEW_TABULAR
/* table stuff -- begin */
- if (cursor.par->table) {
- BackspaceInTable();
+ if (cursor.par()->table) {
+ BackspaceInTable(bview);
return;
}
/* table stuff -- end */
+#endif
+ // LyXFont rawtmpfont = current_font;
+ // LyXFont realtmpfont = real_current_font;
+ // We don't need the above variables as calling to SetCursor() with third
+ // argument eqaul to false, will not change current_font & real_current_font
- LyXFont rawtmpfont = current_font;
- LyXFont realtmpfont = real_current_font;
-
// Get the font that is used to calculate the baselineskip
- int const lastpos = cursor.par->Last();
- LyXFont rawparfont = cursor.par->GetFontSettings(lastpos - 1);
+ LyXParagraph::size_type lastpos = cursor.par()->Last();
+ LyXFont rawparfont = cursor.par()->GetFontSettings(bview->buffer()->params,
+ lastpos - 1);
- if (cursor.pos == 0) {
+ if (cursor.pos() == 0) {
+ // The cursor is at the beginning of a paragraph, so the the backspace
+ // will collapse two paragraphs into one.
+
// we may paste some paragraphs
// is it an empty paragraph?
if ((lastpos == 0
- || (lastpos == 1 && cursor.par->IsSeparator(0)))
- && !(cursor.par->Next()
- && cursor.par->footnoteflag ==
- LyXParagraph::NO_FOOTNOTE
- && cursor.par->Next()->footnoteflag ==
- LyXParagraph::OPEN_FOOTNOTE)) {
+ || (lastpos == 1 && cursor.par()->IsSeparator(0)))
+ && !(cursor.par()->Next()
+ && cursor.par()->footnoteflag == LyXParagraph::NO_FOOTNOTE
+ && cursor.par()->Next()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)) {
+ // This is an empty paragraph and we delete it just by moving the cursor one step
+ // left and let the DeleteEmptyParagraphMechanism handle the actual deletion
+ // of the paragraph.
- if (cursor.par->previous) {
- tmppar = cursor.par->previous->FirstPhysicalPar();
- if (cursor.par->GetLayout() == tmppar->GetLayout()
- && cursor.par->footnoteflag == tmppar->footnoteflag
- && cursor.par->GetAlign() == tmppar->GetAlign()) {
-
- tmppar->line_bottom = cursor.par->line_bottom;
- tmppar->added_space_bottom = cursor.par->added_space_bottom;
- tmppar->pagebreak_bottom = cursor.par->pagebreak_bottom;
+ if (cursor.par()->previous) {
+ LyXParagraph * tmppar = cursor.par()->previous->FirstPhysicalPar();
+ if (cursor.par()->GetLayout() == tmppar->GetLayout()
+ && cursor.par()->footnoteflag == tmppar->footnoteflag
+ && cursor.par()->GetAlign() == tmppar->GetAlign()) {
+ // Inherit botom DTD from the paragraph below.
+ // (the one we are deleting)
+ tmppar->line_bottom = cursor.par()->line_bottom;
+ tmppar->added_space_bottom = cursor.par()->added_space_bottom;
+ tmppar->pagebreak_bottom = cursor.par()->pagebreak_bottom;
}
- CursorLeftIntern();
+ CursorLeftIntern(bview);
// the layout things can change the height of a row !
- tmpheight = cursor.row->height;
- SetHeightOfRow(cursor.row);
- if (cursor.row->height != tmpheight) {
- refresh_y = cursor.y - cursor.row->baseline;
- refresh_row = cursor.row;
+ int tmpheight = cursor.row()->height();
+ SetHeightOfRow(bview, cursor.row());
+ if (cursor.row()->height() != tmpheight) {
+ refresh_y = cursor.y() - cursor.row()->baseline();
+ refresh_row = cursor.row();
status = LyXText::NEED_MORE_REFRESH;
}
return;
}
}
- if (cursor.par->ParFromPos(cursor.pos)->previous){
- SetUndo(Undo::DELETE,
- cursor.par->ParFromPos(cursor.pos)->previous->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
+
+ if (cursor.par()->ParFromPos(cursor.pos())->previous){
+ SetUndo(bview->buffer(), Undo::DELETE,
+ cursor.par()->ParFromPos(cursor.pos())->previous->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
+ }
+
+ LyXParagraph * tmppar = cursor.par();
+ Row * tmprow = cursor.row();
+
+ // We used to do CursorLeftIntern() here, but it is
+ // not a good idea since it triggers the auto-delete
+ // mechanism. So we do a CursorLeftIntern()-lite,
+ // without the dreaded mechanism. (JMarc)
+ if (cursor.par()->Previous()) {
+ // steps into the above paragraph.
+ SetCursorIntern(bview, cursor.par()->Previous(),
+ cursor.par()->Previous()->Last(), false);
}
- tmppar = cursor.par;
- tmprow = cursor.row;
- CursorLeftIntern();
-#warning See comment on top of text.C
+
/* 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
*/
- if (cursor.par != tmppar
- && (cursor.par->GetLayout() == tmppar->GetLayout()
- || !tmppar->GetLayout())
- && cursor.par->footnoteflag == tmppar->footnoteflag
+ if (cursor.par() != tmppar
+ && (cursor.par()->GetLayout() == tmppar->GetLayout()
+ || tmppar->GetLayout() == 0 /*standard*/)
+ && cursor.par()->footnoteflag == tmppar->footnoteflag
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
- && !cursor.par->table /* no pasting of tables */
+ && !cursor.par()->table /* no pasting of tables */
/* table stuff -- end*/
- && cursor.par->GetAlign() == tmppar->GetAlign()) {
-
- cursor.par->PasteParagraph();
+#endif
+ && cursor.par()->GetAlign() == tmppar->GetAlign()) {
+
+ RemoveParagraph(tmprow);
+ RemoveRow(tmprow);
+ cursor.par()->PasteParagraph(bview->buffer()->params);
- if (!(cursor.pos &&
- cursor.par->IsSeparator(cursor.pos - 1)))
- cursor.par->InsertChar(cursor.pos, ' ');
+ if (!cursor.pos() || !cursor.par()->IsSeparator(cursor.pos() - 1))
+ ; //cursor.par()->InsertChar(cursor.pos(), ' ');
+ // strangely enough it seems that commenting out the line above removes
+ // most or all of the segfaults. I will however also try to move the
+ // two Remove... lines in front of the PasteParagraph too.
else
- if (cursor.pos)
- cursor.pos--;
+ if (cursor.pos())
+ cursor.pos(cursor.pos() - 1);
status = LyXText::NEED_MORE_REFRESH;
- refresh_row = cursor.row;
- refresh_y = cursor.y - cursor.row->baseline;
+ refresh_row = cursor.row();
+ refresh_y = cursor.y() - cursor.row()->baseline();
// remove the lost paragraph
- RemoveParagraph(tmprow);
- RemoveRow(tmprow);
+ // This one is not safe, since the paragraph that the tmprow and the
+ // following rows belong to has been deleted by the PasteParagraph
+ // above. The question is... could this be moved in front of the
+ // PasteParagraph?
+ //RemoveParagraph(tmprow);
+ //RemoveRow(tmprow);
- AppendParagraph(cursor.row);
- UpdateCounters(cursor.row);
+ // This rebuilds the rows.
+ AppendParagraph(bview, cursor.row());
+ UpdateCounters(bview, cursor.row());
// the row may have changed, block, hfills etc.
- SetCursor(cursor.par, cursor.pos);
+ SetCursor(bview, cursor.par(), cursor.pos(), false);
}
} else {
/* this is the code for a normal backspace, not pasting
* any paragraphs */
- SetUndo(Undo::DELETE,
- cursor.par->ParFromPos(cursor.pos)->previous,
- cursor.par->ParFromPos(cursor.pos)->next);
- CursorLeftIntern();
+ SetUndo(bview->buffer(), Undo::DELETE,
+ cursor.par()->ParFromPos(cursor.pos())->previous,
+ cursor.par()->ParFromPos(cursor.pos())->next);
+ // We used to do CursorLeftIntern() here, but it is
+ // not a good idea since it triggers the auto-delete
+ // mechanism. So we do a CursorLeftIntern()-lite,
+ // without the dreaded mechanism. (JMarc)
+ SetCursorIntern(bview, cursor.par(), cursor.pos()- 1,
+ false, cursor.boundary());
// some insets are undeletable here
- if (cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET) {
- if (!cursor.par->GetInset(cursor.pos)->Deletable())
+ if (cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET) {
+ if (!cursor.par()->GetInset(cursor.pos())->Deletable())
return;
// force complete redo when erasing display insets
- // this is a cruel mathod but save..... Matthias
- if (cursor.par->GetInset(cursor.pos)->display()){
- cursor.par->Erase(cursor.pos);
- RedoParagraph();
+ // this is a cruel method but safe..... Matthias
+ if (cursor.par()->GetInset(cursor.pos())->display() ||
+ cursor.par()->GetInset(cursor.pos())->needFullRow()) {
+ cursor.par()->Erase(cursor.pos());
+ RedoParagraph(bview);
return;
}
}
- row = cursor.row;
- y = cursor.y - row->baseline;
+ Row * row = cursor.row();
+ long y = cursor.y() - row->baseline();
LyXParagraph::size_type z;
/* remember that a space at the end of a row doesnt count
* when calculating the fill */
- if (cursor.pos < RowLast(row) ||
- !cursor.par->IsLineSeparator(cursor.pos)) {
- row->fill += SingleWidth(cursor.par, cursor.pos);
+ if (cursor.pos() < RowLast(row) ||
+ !cursor.par()->IsLineSeparator(cursor.pos())) {
+ row->fill(row->fill() + SingleWidth(bview,
+ cursor.par(),
+ cursor.pos()));
}
/* some special code when deleting a newline. This is similar
* to the behavior when pasting paragraphs */
- if (cursor.pos && cursor.par->IsNewline(cursor.pos)) {
- cursor.par->Erase(cursor.pos);
+ if (cursor.pos() && cursor.par()->IsNewline(cursor.pos())) {
+ cursor.par()->Erase(cursor.pos());
// refresh the positions
- tmprow = row;
- while (tmprow->next && tmprow->next->par == row->par) {
- tmprow = tmprow->next;
- tmprow->pos--;
+ Row * tmprow = row;
+ while (tmprow->next() && tmprow->next()->par() == row->par()) {
+ tmprow = tmprow->next();
+ tmprow->pos(tmprow->pos() - 1);
}
- if (cursor.par->IsLineSeparator(cursor.pos - 1))
- cursor.pos--;
+ if (cursor.par()->IsLineSeparator(cursor.pos() - 1))
+ cursor.pos(cursor.pos() - 1);
- if (cursor.pos < cursor.par->Last() && !cursor.par->IsSeparator(cursor.pos)) {
- cursor.par->InsertChar(cursor.pos, ' ');
+ if (cursor.pos() < cursor.par()->Last() && !cursor.par()->IsSeparator(cursor.pos())) {
+ cursor.par()->InsertChar(cursor.pos(), ' ');
// refresh the positions
tmprow = row;
- while (tmprow->next && tmprow->next->par == row->par) {
- tmprow = tmprow->next;
- tmprow->pos++;
+ while (tmprow->next() && tmprow->next()->par() == row->par()) {
+ tmprow = tmprow->next();
+ tmprow->pos(tmprow->pos() + 1);
}
}
} else {
- cursor.par->Erase(cursor.pos);
+ cursor.par()->Erase(cursor.pos());
// refresh the positions
- tmprow = row;
- while (tmprow->next && tmprow->next->par == row->par) {
- tmprow = tmprow->next;
- tmprow->pos--;
+ Row * tmprow = row;
+ while (tmprow->next()
+ && tmprow->next()->par() == row->par()) {
+ tmprow = tmprow->next();
+ tmprow->pos(tmprow->pos() - 1);
}
-#ifndef FIX_DOUBLE_SPACE
- // delete superfluous blanks
- if (cursor.pos < cursor.par->Last() - 1 &&
- (cursor.par->IsLineSeparator(cursor.pos))) {
-
- if (cursor.pos == BeginningOfMainBody(cursor.par)
- || !cursor.pos
- || cursor.par->IsLineSeparator(cursor.pos - 1)) {
- cursor.par->Erase(cursor.pos);
- // refresh the positions
- tmprow = row;
- while (tmprow->next &&
- tmprow->next->par == row->par) {
- tmprow = tmprow->next;
- tmprow->pos--;
- }
- if (cursor.pos) // move one character left
- cursor.pos--;
- }
- }
-#endif
-
// delete newlines at the beginning of paragraphs
- while (cursor.par->Last() &&
- cursor.par->IsNewline(cursor.pos) &&
- cursor.pos == BeginningOfMainBody(cursor.par)) {
- cursor.par->Erase(cursor.pos);
+ while (cursor.par()->Last() &&
+ cursor.par()->IsNewline(cursor.pos()) &&
+ cursor.pos() == BeginningOfMainBody(bview->buffer(),
+ cursor.par())) {
+ cursor.par()->Erase(cursor.pos());
// refresh the positions
tmprow = row;
- while (tmprow->next &&
- tmprow->next->par == row->par) {
- tmprow = tmprow->next;
- tmprow->pos--;
+ while (tmprow->next() &&
+ tmprow->next()->par() == row->par()) {
+ tmprow = tmprow->next();
+ tmprow->pos(tmprow->pos() - 1);
}
}
}
// is there a break one row above
- if (row->previous && row->previous->par == row->par) {
- z = NextBreakPoint(row->previous, paperwidth);
- if ( z >= row->pos) {
- row->pos = z + 1;
+ if (row->previous() && row->previous()->par() == row->par()) {
+ z = NextBreakPoint(bview, row->previous(),
+ workWidth(bview));
+ if ( z >= row->pos()) {
+ row->pos(z + 1);
- tmprow = row->previous;
+ Row * tmprow = row->previous();
// maybe the current row is now empty
- if (row->pos >= row->par->Last()) {
+ if (row->pos() >= row->par()->Last()) {
// remove it
RemoveRow(row);
need_break_row = 0;
} else {
- BreakAgainOneRow(row);
- if (row->next && row->next->par == row->par)
- need_break_row = row->next;
+ BreakAgainOneRow(bview, row);
+ if (row->next() && row->next()->par() == row->par())
+ need_break_row = row->next();
else
need_break_row = 0;
}
// set the dimensions of the row above
- y -= tmprow->height;
- tmprow->fill = Fill(tmprow, paperwidth);
- SetHeightOfRow(tmprow);
+ y -= tmprow->height();
+ tmprow->fill(Fill(bview, tmprow,
+ workWidth(bview)));
+ SetHeightOfRow(bview, tmprow);
refresh_y = y;
refresh_row = tmprow;
status = LyXText::NEED_MORE_REFRESH;
- current_font = rawtmpfont;
- real_current_font = realtmpfont;
- SetCursor(cursor.par, cursor.pos, false);
+ SetCursor(bview, cursor.par(), cursor.pos(),
+ false, cursor.boundary());
+ //current_font = rawtmpfont;
+ //real_current_font = realtmpfont;
// check, whether the last character's font has changed.
- rawtmpfont = cursor.par->GetFontSettings(cursor.par->Last() - 1);
- if (rawparfont != rawtmpfont)
- RedoHeightOfParagraph(cursor);
+ if (rawparfont !=
+ cursor.par()->GetFontSettings(bview->buffer()->params,
+ cursor.par()->Last() - 1))
+ RedoHeightOfParagraph(bview, cursor);
return;
}
}
// break the cursor row again
- z = NextBreakPoint(row, paperwidth);
+ z = NextBreakPoint(bview, row, workWidth(bview));
if (z != RowLast(row) ||
- (row->next && row->next->par == row->par &&
- RowLast(row) == row->par->Last() - 1)){
+ (row->next() && row->next()->par() == row->par() &&
+ RowLast(row) == row->par()->Last() - 1)){
/* it can happen that a paragraph loses one row
* without a real breakup. This is when a word
* is to long to be broken. Well, I don t care this
* hack ;-) */
- if (row->next && row->next->par == row->par &&
- RowLast(row) == row->par->Last() - 1)
- RemoveRow(row->next);
+ if (row->next() && row->next()->par() == row->par() &&
+ RowLast(row) == row->par()->Last() - 1)
+ RemoveRow(row->next());
refresh_y = y;
refresh_row = row;
status = LyXText::NEED_MORE_REFRESH;
- BreakAgainOneRow(row);
- current_font = rawtmpfont;
- real_current_font = realtmpfont;
- SetCursor(cursor.par, cursor.pos, false);
+ BreakAgainOneRow(bview, row);
+ SetCursor(bview, cursor.par(), cursor.pos(), false, cursor.boundary());
// cursor MUST be in row now
- if (row->next && row->next->par == row->par)
- need_break_row = row->next;
+ if (row->next() && row->next()->par() == row->par())
+ need_break_row = row->next();
else
need_break_row = 0;
} else {
// set the dimensions of the row
- row->fill = Fill(row, paperwidth);
- int tmpheight = row->height;
- SetHeightOfRow(row);
- if (tmpheight == row->height)
+ row->fill(Fill(bview, row, workWidth(bview)));
+ int tmpheight = row->height();
+ SetHeightOfRow(bview, row);
+ if (tmpheight == row->height())
status = LyXText::NEED_VERY_LITTLE_REFRESH;
else
status = LyXText::NEED_MORE_REFRESH;
refresh_y = y;
refresh_row = row;
- current_font = rawtmpfont;
- real_current_font = realtmpfont;
- SetCursor(cursor.par, cursor.pos, false);
+ SetCursor(bview, cursor.par(), cursor.pos(), false, cursor.boundary());
}
}
-
- // restore the current font
- // That is what a user expects!
- current_font = rawtmpfont;
- real_current_font = realtmpfont;
+
+ // current_font = rawtmpfont;
+ // real_current_font = realtmpfont;
+
+ lastpos = cursor.par()->Last();
+ if (cursor.pos() == lastpos) {
+ SetCurrentFont(bview);
+ if (IsBoundary(bview->buffer(), cursor.par(), cursor.pos()) != cursor.boundary())
+ SetCursor(bview, cursor.par(), cursor.pos(), false, !cursor.boundary());
+ }
// check, wether the last characters font has changed.
- rawtmpfont = cursor.par->GetFontSettings(cursor.par->Last() - 1);
- if (rawparfont != rawtmpfont) {
- RedoHeightOfParagraph(cursor);
+ if (rawparfont !=
+ cursor.par()->GetFontSettings(bview->buffer()->params, lastpos - 1)) {
+ RedoHeightOfParagraph(bview, cursor);
} else {
// now the special right address boxes
- if (textclasslist.Style(parameters->textclass,
- cursor.par->GetLayout()).margintype == MARGIN_RIGHT_ADDRESS_BOX) {
- RedoDrawingOfParagraph(cursor);
+ if (textclasslist.Style(bview->buffer()->params.textclass,
+ cursor.par()->GetLayout()).margintype == MARGIN_RIGHT_ADDRESS_BOX) {
+ RedoDrawingOfParagraph(bview, cursor);
}
}
}
-void LyXText::GetVisibleRow(int offset,
- Row * row_ptr, long y)
+void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
+ Row * row_ptr, long y, bool cleared)
{
/* returns a printed row */
- Painter & pain = owner_->painter();
+ Painter & pain = bview->painter();
- LyXDirection direction = row_ptr->par->getParDirection();
- LyXParagraph::size_type vpos, pos, pos_end;
+ bool is_rtl = row_ptr->par()->isRightToLeftPar(bview->buffer()->params);
+ LyXParagraph::size_type last = RowLastPrintable(row_ptr);
+
+ LyXParagraph::size_type vpos, pos;
float x, tmpx;
int y_top, y_bottom;
float fill_separator, fill_hfill, fill_label_hfill;
- LyXParagraph * par, * firstpar;
- LyXFont font;
+
+ LyXFont font(LyXFont::ALL_SANE);
int maxdesc;
- if (row_ptr->height <= 0) {
- lyxerr << "LYX_ERROR: row.height: " << row_ptr->height << endl;
+ if (row_ptr->height() <= 0) {
+ lyxerr << "LYX_ERROR: row.height: "
+ << row_ptr->height() << endl;
return;
}
- PrepareToPrint(row_ptr, x, fill_separator,
+ PrepareToPrint(bview, row_ptr, x, fill_separator,
fill_hfill, fill_label_hfill);
- /* initialize the pixmap */
+ if (inset_owner && (x < 0))
+ x = 0;
+ x += x_offset;
- pain.fillRectangle(0, offset, paperwidth, row_ptr->height);
+ // clear the area where we want to paint/print
+ int ww;
+ ww = bview->workWidth();
+
+ bool clear_area = true;
+ Inset * inset = 0;
+
+ if ((last == row_ptr->pos()) &&
+ (row_ptr->par()->GetChar(row_ptr->pos()) == LyXParagraph::META_INSET) &&
+ (inset=row_ptr->par()->GetInset(row_ptr->pos())))
+ {
+ clear_area = inset->doClearArea();
+ }
+ if (cleared) { // we don't need to clear it's already done!!!
+ clear_area = true;
+ } else if (clear_area) {
+ int w;
+ if (inset_owner)
+ w = inset_owner->width(bview->painter(), font);
+ else
+ w = ww;
+ pain.fillRectangle(x_offset, y_offset, w, row_ptr->height());
+ } else if (inset != 0) {
+ int h = row_ptr->baseline() - inset->ascent(pain, font);
+ if (h > 0) {
+ int w;
+ if (inset_owner)
+ w = inset_owner->width(bview->painter(), font);
+ else
+ w = ww;
+ pain.fillRectangle(x_offset, y_offset, w, h);
+ }
+ }
if (selection) {
- /* selection code */
- if (sel_start_cursor.row == row_ptr &&
- sel_end_cursor.row == row_ptr) {
- if (sel_start_cursor.x < sel_end_cursor.x)
- pain.fillRectangle(sel_start_cursor.x, offset,
- sel_end_cursor.x - sel_start_cursor.x,
- row_ptr->height,
- LColor::selection);
- else
- pain.fillRectangle(sel_end_cursor.x, offset,
- sel_start_cursor.x - sel_end_cursor.x,
- row_ptr->height,
- LColor::selection);
- } else if (sel_start_cursor.row == row_ptr) {
- if (direction == LYX_DIR_LEFT_TO_RIGHT)
- pain.fillRectangle(sel_start_cursor.x, offset,
- paperwidth - sel_start_cursor.x,
- row_ptr->height,
- LColor::selection);
- else
- pain.fillRectangle(0, offset,
- sel_start_cursor.x,
- row_ptr->height,
+ /* selection code */
+ if (bidi_same_direction) {
+ if (sel_start_cursor.row() == row_ptr &&
+ sel_end_cursor.row() == row_ptr) {
+ if (sel_start_cursor.x() < sel_end_cursor.x())
+ pain.fillRectangle(x_offset + sel_start_cursor.x(),
+ y_offset,
+ sel_end_cursor.x() - sel_start_cursor.x(),
+ row_ptr->height(),
+ LColor::selection);
+ else
+ pain.fillRectangle(x_offset + sel_end_cursor.x(),
+ y_offset,
+ sel_start_cursor.x() - sel_end_cursor.x(),
+ row_ptr->height(),
+ LColor::selection);
+ } else if (sel_start_cursor.row() == row_ptr) {
+ if (is_rtl)
+ pain.fillRectangle(x_offset, y_offset,
+ sel_start_cursor.x(),
+ row_ptr->height(),
+ LColor::selection);
+ else
+ pain.fillRectangle(x_offset + sel_start_cursor.x(),
+ y_offset,
+ ww - sel_start_cursor.x(),
+ row_ptr->height(),
+ LColor::selection);
+ } else if (sel_end_cursor.row() == row_ptr) {
+ if (is_rtl)
+ pain.fillRectangle(x_offset + sel_end_cursor.x(),
+ y_offset,
+ ww - sel_end_cursor.x(),
+ row_ptr->height(),
+ LColor::selection);
+ else
+ pain.fillRectangle(x_offset, y_offset,
+ sel_end_cursor.x(),
+ row_ptr->height(),
+ LColor::selection);
+ } else if (y > long(sel_start_cursor.y())
+ && y < long(sel_end_cursor.y())) {
+ pain.fillRectangle(x_offset, y_offset, ww,
+ row_ptr->height(),
LColor::selection);
- } else if (sel_end_cursor.row == row_ptr) {
- if (direction == LYX_DIR_LEFT_TO_RIGHT)
- pain.fillRectangle(0, offset,
- sel_end_cursor.x,
- row_ptr->height,
+ }
+ } else if ( sel_start_cursor.row() != row_ptr &&
+ sel_end_cursor.row() != row_ptr &&
+ y > long(sel_start_cursor.y())
+ && y < long(sel_end_cursor.y())) {
+ pain.fillRectangle(x_offset, y_offset, ww,
+ row_ptr->height(),
+ LColor::selection);
+ } else if (sel_start_cursor.row() == row_ptr ||
+ sel_end_cursor.row() == row_ptr) {
+ float tmpx = x;
+ int cell = 0;
+#ifndef NEW_TABULAR
+ if (row_ptr->par()->table) {
+ cell = NumberOfCell(row_ptr->par(), row_ptr->pos());
+ tmpx += row_ptr->par()->table->GetBeginningOfTextInCell(cell);
+ }
+#endif
+ if ( (sel_start_cursor.row() != row_ptr && !is_rtl) ||
+ (sel_end_cursor.row() != row_ptr && is_rtl))
+ pain.fillRectangle(x_offset, y_offset,
+ int(tmpx),
+ row_ptr->height(),
LColor::selection);
- else
- pain.fillRectangle(sel_end_cursor.x, offset,
- paperwidth - sel_end_cursor.x,
- row_ptr->height,
+#ifndef NEW_TABULAR
+ if (row_ptr->par()->table) {
+ float x_old = x;
+ for (vpos = row_ptr->pos(); vpos <= last; ++vpos) {
+ pos = vis2log(vpos);
+ float old_tmpx = tmpx;
+ if (row_ptr->par()->IsNewline(pos)) {
+ tmpx = x_old + row_ptr->par()->table->WidthOfColumn(cell);
+ x_old = tmpx;
+ ++cell;
+ tmpx += row_ptr->par()->table->GetBeginningOfTextInCell(cell);
+ } else {
+ tmpx += SingleWidth(bview, row_ptr->par(), pos);
+ }
+ if ( (sel_start_cursor.row() != row_ptr ||
+ sel_start_cursor.pos() <= pos) &&
+ (sel_end_cursor.row() != row_ptr ||
+ pos < sel_end_cursor.pos()) )
+ pain.fillRectangle(x_offset + int(old_tmpx),
+ y_offset,
+ int(tmpx - old_tmpx + 1),
+ row_ptr->height(),
+ LColor::selection);
+ }
+ } else {
+#endif
+ LyXParagraph::size_type main_body =
+ BeginningOfMainBody(bview->buffer(),
+ row_ptr->par());
+
+ for (vpos = row_ptr->pos(); vpos <= last; ++vpos) {
+ pos = vis2log(vpos);
+ float old_tmpx = tmpx;
+ if (main_body > 0 && pos == main_body-1) {
+ tmpx += fill_label_hfill +
+ lyxfont::width(textclasslist.Style(bview->buffer()->params.textclass,
+ row_ptr->par()->GetLayout()).labelsep,
+ GetFont(bview->buffer(),row_ptr->par(), -2));
+ if (row_ptr->par()->IsLineSeparator(main_body-1))
+ tmpx -= SingleWidth(bview, row_ptr->par(), main_body-1);
+ }
+ if (HfillExpansion(bview->buffer(), row_ptr, pos)) {
+ tmpx += SingleWidth(bview, row_ptr->par(), pos);
+ if (pos >= main_body)
+ tmpx += fill_hfill;
+ else
+ tmpx += fill_label_hfill;
+ }
+ else if (row_ptr->par()->IsSeparator(pos)) {
+ tmpx += SingleWidth(bview, row_ptr->par(), pos);
+ if (pos >= main_body)
+ tmpx += fill_separator;
+ } else
+ tmpx += SingleWidth(bview, row_ptr->par(), pos);
+
+ if ( (sel_start_cursor.row() != row_ptr ||
+ sel_start_cursor.pos() <= pos) &&
+ (sel_end_cursor.row() != row_ptr ||
+ pos < sel_end_cursor.pos()) )
+ pain.fillRectangle(x_offset + int(old_tmpx),
+ y_offset,
+ int(tmpx - old_tmpx + 1),
+ row_ptr->height(),
+ LColor::selection);
+ }
+#ifndef NEW_TABULAR
+ }
+#endif
+ if ( (sel_start_cursor.row() != row_ptr && is_rtl) ||
+ (sel_end_cursor.row() != row_ptr && !is_rtl) )
+ pain.fillRectangle(x_offset + int(tmpx),
+ y_offset,
+ int(ww - tmpx),
+ row_ptr->height(),
LColor::selection);
-
- } else if (y > sel_start_cursor.y && y < sel_end_cursor.y) {
- pain.fillRectangle(0, offset,
- paperwidth, row_ptr->height,
- LColor::selection);
}
}
-
- if (row_ptr->par->appendix){
- pain.line(1, offset,
- 1, offset + row_ptr->height,
- LColor::appendixline);
- pain.line(paperwidth - 2, offset,
- paperwidth - 2, offset + row_ptr->height,
- LColor::appendixline);
- }
-
- if (row_ptr->par->pextra_type == LyXParagraph::PEXTRA_MINIPAGE) {
- /* draw a marker at the left margin! */
- LyXFont font = GetFont(row_ptr->par, 0);
- int asc = font.maxAscent();
- int x = (LYX_PAPER_MARGIN - font.width('|')) / 2;
- int y1 = (offset + row_ptr->baseline);
- int y2 = (offset + row_ptr->baseline) - asc;
- pain.line(x, y1, x, y2, LColor::minipageline);
- }
- if (row_ptr->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
+
+ int box_x = 0;
+#ifndef NEW_INSETS
+ if (row_ptr->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
LyXFont font(LyXFont::ALL_SANE);
font.setSize(LyXFont::SIZE_FOOTNOTE);
font.setColor(LColor::footnote);
- int box_x = LYX_PAPER_MARGIN;
- box_x += font.textWidth(" wide-tab ", 10);
- if (row_ptr->previous &&
- row_ptr->previous->par->footnoteflag != LyXParagraph::OPEN_FOOTNOTE){
+ box_x = LYX_PAPER_MARGIN + lyxfont::width(" wide-tab ", font);
+ if (row_ptr->previous() &&
+ row_ptr->previous()->par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE){
string fs;
- switch (row_ptr->par->footnotekind) {
+ switch (row_ptr->par()->footnotekind) {
case LyXParagraph::MARGIN:
fs = " margin";
break;
}
pain.fillRectangle(LYX_PAPER_MARGIN,
- offset + 1,
+ y_offset + 1,
box_x - LYX_PAPER_MARGIN,
- int(font.maxAscent()
- + font.maxDescent()),
+ int(lyxfont::maxAscent(font)
+ + lyxfont::maxDescent(font)),
LColor::footnotebg);
- pain.line(LYX_PAPER_MARGIN, offset,
- paperwidth - LYX_PAPER_MARGIN, offset,
+ pain.line(LYX_PAPER_MARGIN, y_offset,
+ workWidth(bview) - LYX_PAPER_MARGIN, y_offset,
LColor::footnoteframe);
pain.text(LYX_PAPER_MARGIN,
- offset + int(font.maxAscent()) + 1,
+ y_offset + int(lyxfont::maxAscent(font)) + 1,
fs, font);
- pain.line(LYX_PAPER_MARGIN, offset,
+ pain.line(LYX_PAPER_MARGIN, y_offset,
LYX_PAPER_MARGIN,
- offset + int(font.maxAscent()
- + font.maxDescent()),
+ y_offset + int(lyxfont::maxAscent(font)
+ + lyxfont::maxDescent(font)),
LColor::footnoteframe);
pain.line(LYX_PAPER_MARGIN,
- offset + int(font.maxAscent()
- + font.maxDescent()) + 1,
+ y_offset + int(lyxfont::maxAscent(font)
+ + lyxfont::maxDescent(font)) + 1,
box_x,
- offset + int(font.maxAscent()
- + font.maxDescent()) + 1,
+ y_offset + int(lyxfont::maxAscent(font)
+ + lyxfont::maxDescent(font)) + 1,
LColor::footnoteframe);
}
/* draw the open floats in a red box */
- pain.line(box_x, offset,
- box_x, offset + row_ptr->height,
+ pain.line(box_x, y_offset,
+ box_x, y_offset + row_ptr->height(),
LColor::footnoteframe);
- pain.line(paperwidth - LYX_PAPER_MARGIN,
- offset,
- paperwidth - LYX_PAPER_MARGIN,
- offset + row_ptr->height,
+ pain.line(workWidth(bview) - LYX_PAPER_MARGIN,
+ y_offset,
+ workWidth(bview) - LYX_PAPER_MARGIN,
+ y_offset + row_ptr->height(),
LColor::footnoteframe);
- } else if (row_ptr->previous &&
- row_ptr->previous->par->footnoteflag
+
+
+ // Draw appendix lines
+ LyXParagraph * p = row_ptr->par()->PreviousBeforeFootnote()->FirstPhysicalPar();
+ if (p->appendix){
+ pain.line(1, y_offset,
+ 1, y_offset + row_ptr->height(),
+ LColor::appendixline);
+ pain.line(workWidth(bview) - 2, y_offset,
+ workWidth(bview) - 2,
+ y_offset + row_ptr->height(),
+ LColor::appendixline);
+ }
+
+ // Draw minipage line
+ bool minipage = p->pextra_type == LyXParagraph::PEXTRA_MINIPAGE;
+ if (minipage)
+ pain.line(LYX_PAPER_MARGIN/5, y_offset,
+ LYX_PAPER_MARGIN/5,
+ y_offset + row_ptr->height() - 1,
+ LColor::minipageline);
+
+ // Draw depth lines
+ int depth = p->GetDepth();
+ for (int i = 1; i <= depth; ++i) {
+ int line_x = (LYX_PAPER_MARGIN / 5) * (i + minipage);
+ pain.line(line_x, y_offset, line_x,
+ y_offset + row_ptr->height() - 1,
+ LColor::depthbar);
+ }
+ } else if (row_ptr->previous() &&
+ row_ptr->previous()->par()->footnoteflag
== LyXParagraph::OPEN_FOOTNOTE) {
LyXFont font(LyXFont::ALL_SANE);
font.setSize(LyXFont::SIZE_FOOTNOTE);
int box_x = LYX_PAPER_MARGIN;
- box_x += font.textWidth(" wide-tab ", 10);
+ box_x += lyxfont::width(" wide-tab ", font);
- pain.line(box_x, offset,
- paperwidth - LYX_PAPER_MARGIN,
- offset, LColor::footnote);
+ pain.line(box_x, y_offset,
+ workWidth(bview) - LYX_PAPER_MARGIN,
+ y_offset, LColor::footnote);
}
+#endif
+ // Draw appendix lines
+ LyXParagraph * firstpar = row_ptr->par()->FirstPhysicalPar();
+ if (firstpar->appendix){
+ pain.line(1, y_offset,
+ 1, y_offset + row_ptr->height(),
+ LColor::appendixline);
+ pain.line(ww - 2, y_offset,
+ ww - 2, y_offset + row_ptr->height(),
+ LColor::appendixline);
+ }
+
+ // Draw minipage line
+ bool minipage = firstpar->pextra_type == LyXParagraph::PEXTRA_MINIPAGE;
+ if (minipage)
+ pain.line(LYX_PAPER_MARGIN/5 + box_x, y_offset,
+ LYX_PAPER_MARGIN/5 + box_x,
+ y_offset + row_ptr->height() - 1,
+ LColor::minipageline);
+
+ // Draw depth lines
+ int depth = firstpar->GetDepth();
+ if (depth > 0) {
+ int next_depth = 0;
+ int prev_depth = 0;
+ if (row_ptr->next())
+ if (row_ptr->par()->footnoteflag ==
+ row_ptr->next()->par()->footnoteflag)
+ next_depth = row_ptr->next()->par()->GetDepth();
+ else if (row_ptr->par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE)
+ next_depth = depth;
+
+ if (row_ptr->previous())
+ if (row_ptr->par()->footnoteflag ==
+ row_ptr->previous()->par()->footnoteflag)
+ prev_depth = row_ptr->previous()->par()->GetDepth();
+ else if (row_ptr->par()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE)
+ prev_depth = depth;
+
+ for (int i = 1; i <= depth; ++i) {
+ int line_x = (LYX_PAPER_MARGIN / 5) * (i + minipage) + box_x;
+ pain.line(line_x, y_offset, line_x,
+ y_offset + row_ptr->height() - 1 - (i - next_depth - 1) * 3,
+ LColor::depthbar);
+
+ if (i > prev_depth)
+ pain.fillRectangle(line_x, y_offset, LYX_PAPER_MARGIN / 5, 2,
+ LColor::depthbar);
+ if (i > next_depth)
+ pain.fillRectangle(line_x,
+ y_offset + row_ptr->height() - 2 - (i - next_depth - 1) * 3,
+ LYX_PAPER_MARGIN / 5, 2,
+ LColor::depthbar);
+ }
+ }
+
LyXLayout const & layout =
- textclasslist.Style(parameters->textclass,
- row_ptr->par->GetLayout());
- firstpar = row_ptr->par->FirstPhysicalPar();
-
+ textclasslist.Style(bview->buffer()->params.textclass,
+ row_ptr->par()->GetLayout());
+
y_top = 0;
- y_bottom = row_ptr->height;
+ y_bottom = row_ptr->height();
/* is it a first row? */
- if (row_ptr->pos == 0
- && row_ptr->par == firstpar) {
+ if (!row_ptr->pos() && (row_ptr->par() == firstpar)) {
/* start of appendix? */
- if (row_ptr->par->start_of_appendix){
- pain.line(1, offset,
- paperwidth - 2, offset,
+ if (row_ptr->par()->start_of_appendix){
+ pain.line(1, y_offset,
+ ww - 2, y_offset,
LColor::appendixline);
}
/* think about the margins */
- if (!row_ptr->previous)
+ if (!row_ptr->previous() && bv_owner)
y_top += LYX_PAPER_MARGIN;
- if (row_ptr->par->pagebreak_top){ /* draw a top pagebreak */
-#if 0
- pain.line(0, offset + y_top + 2 * DefaultHeight(),
- paperwidth,
- offset + y_top + 2 * DefaultHeight(),
- LColor::pagebreak, Painter::line_onoffdash);
-#else
+ if (row_ptr->par()->pagebreak_top){ /* draw a top pagebreak */
LyXFont pb_font;
pb_font.setColor(LColor::pagebreak).decSize();
int w = 0, a = 0, d = 0;
- pain.line(0, offset + y_top + 2*DefaultHeight(),
- paperwidth,
- offset + y_top + 2*DefaultHeight(),
+ pain.line(0, y_offset + y_top + 2*DefaultHeight(),
+ ww,
+ y_offset + y_top + 2 * DefaultHeight(),
LColor::pagebreak,
Painter::line_onoffdash)
.rectText(0,
pb_font,
LColor::background,
LColor::background, false, w, a, d);
- pain.rectText((paperwidth - w)/2,
- offset +y_top + 2*DefaultHeight() +d,
+ pain.rectText((ww - w)/2,
+ y_offset + y_top + 2 * DefaultHeight() + d,
_("Page Break (top)"),
pb_font,
LColor::background,
LColor::background);
-#endif
y_top += 3 * DefaultHeight();
}
- if (row_ptr->par->added_space_top.kind() == VSpace::VFILL) {
+ if (row_ptr->par()->added_space_top.kind() == VSpace::VFILL) {
/* draw a vfill top */
- pain.line(0, offset + 2 + y_top,
- LYX_PAPER_MARGIN, offset + 2 + y_top,
+ pain.line(0, y_offset + 2 + y_top,
+ LYX_PAPER_MARGIN, y_offset + 2 + y_top,
LColor::vfillline);
- pain.line(0, offset + y_top + 3 * DefaultHeight(),
+ pain.line(0, y_offset + y_top + 3 * DefaultHeight(),
LYX_PAPER_MARGIN,
- offset + y_top + 3 * DefaultHeight(),
+ y_offset + y_top + 3 * DefaultHeight(),
LColor::vfillline);
- pain.line(LYX_PAPER_MARGIN / 2, offset + 2 + y_top,
+ pain.line(LYX_PAPER_MARGIN / 2, y_offset + 2 + y_top,
LYX_PAPER_MARGIN / 2,
- offset + y_top + 3 * DefaultHeight(),
+ y_offset + y_top + 3 * DefaultHeight(),
LColor::vfillline);
y_top += 3 * DefaultHeight();
}
/* think about user added space */
- y_top += int(row_ptr->par->added_space_top.inPixels(owner_));
+ y_top += int(row_ptr->par()->added_space_top.inPixels(bview));
/* think about the parskip */
/* some parskips VERY EASY IMPLEMENTATION */
- if (parameters->paragraph_separation == BufferParams::PARSEP_SKIP) {
+ if (bview->buffer()->params.paragraph_separation == BufferParams::PARSEP_SKIP) {
if (layout.latextype == LATEX_PARAGRAPH
&& firstpar->GetDepth() == 0
&& firstpar->Previous())
- y_top += parameters->getDefSkip().inPixels(owner_);
+ y_top += bview->buffer()->params.getDefSkip().inPixels(bview);
else if (firstpar->Previous()
- && textclasslist.Style(parameters->textclass,
+ && textclasslist.Style(bview->buffer()->params.textclass,
firstpar->Previous()->GetLayout()).latextype == LATEX_PARAGRAPH
&& firstpar->Previous()->GetDepth() == 0)
// is it right to use defskip here, too? (AS)
- y_top += parameters->getDefSkip().inPixels(owner_);
+ y_top += bview->buffer()->params.getDefSkip().inPixels(bview);
}
- if (row_ptr->par->line_top) { /* draw a top line */
- y_top += GetFont(row_ptr->par, 0).ascent('x');
+ if (row_ptr->par()->line_top) { /* draw a top line */
+ y_top += lyxfont::ascent('x',
+ GetFont(bview->buffer(),
+ row_ptr->par(), 0));
- pain.line(0, offset + y_top,
- paperwidth, offset + y_top,
+ pain.line(0, y_offset + y_top,
+ ww, y_offset + y_top,
LColor::topline,
Painter::line_solid,
Painter::line_thick);
- y_top += GetFont(row_ptr->par, 0).ascent('x');
+ y_top += lyxfont::ascent('x',GetFont(bview->buffer(),
+ row_ptr->par(), 0));
}
/* should we print a label? */
if (layout.labeltype >= LABEL_STATIC
&& (layout.labeltype != LABEL_STATIC
|| layout.latextype != LATEX_ENVIRONMENT
- || row_ptr->par->IsFirstInSequence())) {
- font = GetFont(row_ptr->par, -2);
- if (!row_ptr->par->GetLabestring().empty()) {
+ || row_ptr->par()->IsFirstInSequence())) {
+ font = GetFont(bview->buffer(), row_ptr->par(), -2);
+ if (!row_ptr->par()->GetLabelstring().empty()) {
tmpx = x;
- string tmpstring = row_ptr->par->GetLabestring();
+ string tmpstring = row_ptr->par()->GetLabelstring();
if (layout.labeltype == LABEL_COUNTER_CHAPTER) {
- if (parameters->secnumdepth >= 0){
+ if (bview->buffer()->params.secnumdepth >= 0) {
/* this is special code for the chapter layout. This is printed in
* an extra row and has a pagebreak at the top. */
- maxdesc = int(font.maxDescent() * layout.spacing.getValue() * parameters->spacing.getValue())
+ float spacing_val = 1.0;
+ if (!row_ptr->par()->spacing.isDefault()) {
+ spacing_val = row_ptr->par()->spacing.getValue();
+ } else {
+ spacing_val = bview->buffer()->params.spacing.getValue();
+ }
+
+ maxdesc = int(lyxfont::maxDescent(font) * layout.spacing.getValue() * spacing_val)
+ int(layout.parsep) * DefaultHeight();
- if (direction == LYX_DIR_RIGHT_TO_LEFT)
- tmpx = paperwidth - LeftMargin(row_ptr) -
- font.stringWidth(tmpstring);
+ if (is_rtl)
+ tmpx = ww - LeftMargin(bview, row_ptr) -
+ lyxfont::width(tmpstring, font);
pain.text(int(tmpx),
- offset + row_ptr->baseline - row_ptr->ascent_of_text - maxdesc,
+ y_offset + row_ptr->baseline() - row_ptr->ascent_of_text() - maxdesc,
tmpstring, font);
}
} else {
- if (direction == LYX_DIR_LEFT_TO_RIGHT)
- tmpx = x - font.stringWidth(layout.labelsep)
- - font.stringWidth(tmpstring);
- else {
- tmpx = paperwidth - LeftMargin(row_ptr)
- + font.stringWidth(layout.labelsep);
- if (row_ptr->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
+ if (is_rtl) {
+ tmpx = ww - LeftMargin(bview, row_ptr)
+ + lyxfont::width(layout.labelsep, font);
+ if (row_ptr->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
LyXFont font(LyXFont::ALL_SANE);
font.setSize(LyXFont::SIZE_SMALL);
- tmpx += font.textWidth("Mwide-figM", 10);
+ tmpx += lyxfont::width("Mwide-fixM", font);
}
- }
+ } else
+ tmpx = x - lyxfont::width(layout.labelsep, font)
+ - lyxfont::width(tmpstring, font);
+
/* draw it! */
pain.text(int(tmpx),
- offset + row_ptr->baseline,
+ y_offset + row_ptr->baseline(),
tmpstring, font);
}
}
} else if (layout.labeltype == LABEL_TOP_ENVIRONMENT ||
layout.labeltype == LABEL_BIBLIO ||
layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) {
- if (row_ptr->par->IsFirstInSequence()) {
- font = GetFont(row_ptr->par, -2);
- if (!row_ptr->par->GetLabestring().empty()) {
- string tmpstring = row_ptr->par->GetLabestring();
-
- maxdesc = int(font.maxDescent() * layout.spacing.getValue() * parameters->spacing.getValue()
+ if (row_ptr->par()->IsFirstInSequence()) {
+ font = GetFont(bview->buffer(),
+ row_ptr->par(), -2);
+ if (!row_ptr->par()->GetLabelstring().empty()) {
+ string tmpstring = row_ptr->par()->GetLabelstring();
+ float spacing_val = 1.0;
+ if (!row_ptr->par()->spacing.isDefault()) {
+ spacing_val = row_ptr->par()->spacing.getValue();
+ } else {
+ spacing_val = bview->buffer()->params.spacing.getValue();
+ }
+
+ maxdesc = int(lyxfont::maxDescent(font) * layout.spacing.getValue() * spacing_val
+ (layout.labelbottomsep * DefaultHeight()));
tmpx = x;
if (layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT){
- tmpx = ( ((direction == LYX_DIR_LEFT_TO_RIGHT)
- ? x : LeftMargin(row_ptr) )
- + paperwidth - RightMargin(row_ptr) ) / 2;
- tmpx -= (font.stringWidth(tmpstring)/2);
- } else if (direction == LYX_DIR_RIGHT_TO_LEFT)
- tmpx = paperwidth - LeftMargin(row_ptr) -
- font.stringWidth(tmpstring);
+ tmpx = ( (is_rtl ? LeftMargin(bview, row_ptr) : x)
+ + ww - RightMargin(bview->buffer(), row_ptr) ) / 2;
+ tmpx -= lyxfont::width(tmpstring, font) / 2;
+ } else if (is_rtl)
+ tmpx = ww - LeftMargin(bview, row_ptr) -
+ lyxfont::width(tmpstring, font);
pain.text(int(tmpx),
- offset + row_ptr->baseline
- - row_ptr->ascent_of_text
+ y_offset + row_ptr->baseline()
+ - row_ptr->ascent_of_text()
- maxdesc,
tmpstring, font);
}
}
}
- if (layout.labeltype == LABEL_BIBLIO && row_ptr->par->bibkey) {
- font = GetFont(row_ptr->par, -1);
- if (direction == LYX_DIR_LEFT_TO_RIGHT)
- tmpx = x - font.stringWidth(layout.labelsep)
- - row_ptr->par->bibkey->width(owner_->painter(), font);
+ if (layout.labeltype == LABEL_BIBLIO && row_ptr->par()->bibkey) {
+ font = GetFont(bview->buffer(), row_ptr->par(), -1);
+ if (is_rtl)
+ tmpx = ww - LeftMargin(bview, row_ptr)
+ + lyxfont::width(layout.labelsep, font);
else
- tmpx = paperwidth - LeftMargin(row_ptr)
- + font.stringWidth(layout.labelsep);
- row_ptr->par->bibkey->draw(owner_->painter(),
- font,
- offset + row_ptr->baseline,
- tmpx);
+ tmpx = x - lyxfont::width(layout.labelsep, font)
+ - row_ptr->par()->bibkey->width(bview->painter(), font);
+ row_ptr->par()->bibkey->draw(bview, font,
+ y_offset + row_ptr->baseline(),
+ tmpx, clear_area);
}
}
/* is it a last row? */
- par = row_ptr->par->LastPhysicalPar();
- if (row_ptr->par->ParFromPos(RowLast(row_ptr) + 1) == par
- && (!row_ptr->next || row_ptr->next->par != row_ptr->par)) {
-
+ LyXParagraph * par = row_ptr->par()->LastPhysicalPar();
+ if ((row_ptr->par()->ParFromPos(last + 1) == par) &&
+ (!row_ptr->next() || (row_ptr->next()->par() != row_ptr->par())))
+ {
/* think about the margins */
- if (!row_ptr->next)
+ if (!row_ptr->next() && bv_owner)
y_bottom -= LYX_PAPER_MARGIN;
/* draw a bottom pagebreak */
if (firstpar->pagebreak_bottom) {
-#if 0
- pain.line(0, offset + y_bottom - 2 * DefaultHeight(),
- paperwidth,
- offset + y_bottom - 2 * DefaultHeight(),
- LColor::pagebreak, Painter::line_onoffdash);
-#else
LyXFont pb_font;
pb_font.setColor(LColor::pagebreak).decSize();
int w = 0, a = 0, d = 0;
pain.line(0,
- offset + y_bottom - 2 * DefaultHeight(),
- paperwidth,
- offset + y_bottom - 2 * DefaultHeight(),
+ y_offset + y_bottom - 2 * DefaultHeight(),
+ ww,
+ y_offset + y_bottom - 2 * DefaultHeight(),
LColor::pagebreak,
Painter::line_onoffdash)
.rectText(0,
pb_font,
LColor::background,
LColor::background, false, w, a, d);
- pain.rectText((paperwidth - w)/2,
- offset +y_top + 2*DefaultHeight() +d,
+ pain.rectText((ww - w) / 2,
+ y_offset + y_top + 2 * DefaultHeight() + d,
_("Page Break (bottom)"),
pb_font,
LColor::background,
LColor::background);
-#endif
y_bottom -= 3 * DefaultHeight();
}
if (firstpar->added_space_bottom.kind() == VSpace::VFILL) {
/* draw a vfill bottom */
- pain.line(0, offset + y_bottom - 3 * DefaultHeight(),
+ pain.line(0, y_offset + y_bottom - 3 * DefaultHeight(),
LYX_PAPER_MARGIN,
- offset + y_bottom - 3 * DefaultHeight(),
+ y_offset + y_bottom - 3 * DefaultHeight(),
LColor::vfillline);
- pain.line(0, offset + y_bottom - 2,
+ pain.line(0, y_offset + y_bottom - 2,
LYX_PAPER_MARGIN,
- offset + y_bottom - 2,
+ y_offset + y_bottom - 2,
LColor::vfillline);
pain.line(LYX_PAPER_MARGIN / 2,
- offset + y_bottom - 3 * DefaultHeight(),
+ y_offset + y_bottom - 3 * DefaultHeight(),
LYX_PAPER_MARGIN / 2,
- offset + y_bottom - 2,
+ y_offset + y_bottom - 2,
LColor::vfillline);
- y_bottom -= 3* DefaultHeight();
+ y_bottom -= 3 * DefaultHeight();
}
/* think about user added space */
- y_bottom -= int(firstpar->added_space_bottom.inPixels(owner_));
+ y_bottom -= int(firstpar->added_space_bottom.inPixels(bview));
if (firstpar->line_bottom) {
/* draw a bottom line */
- y_bottom -= GetFont(par, par->Last() - 1).ascent('x');
- pain.line(0, offset + y_bottom,
- paperwidth, offset + y_bottom,
+ y_bottom -= lyxfont::ascent('x', GetFont(bview->buffer(),
+ par, par->Last() - 1));
+ pain.line(0, y_offset + y_bottom,
+ ww, y_offset + y_bottom,
LColor::topline, Painter::line_solid,
Painter::line_thick);
- y_bottom -= GetFont(par, par->Last() - 1).ascent('x');
+ y_bottom -= lyxfont::ascent('x', GetFont(bview->buffer(),
+ par, par->Last() - 1));
}
// draw an endlabel
- int endlabel = row_ptr->par->GetEndLabel();
- if (endlabel == END_LABEL_BOX ||
- endlabel == END_LABEL_FILLED_BOX) {
- LyXFont font = GetFont(row_ptr->par, RowLast(row_ptr));
- int size = int(0.75*font.maxAscent());
- int y = (offset + row_ptr->baseline) - size;
- int x = (direction == LYX_DIR_LEFT_TO_RIGHT)
- ? paperwidth - LYX_PAPER_MARGIN - size
- : LYX_PAPER_MARGIN;
- if (row_ptr->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
- if (direction == LYX_DIR_LEFT_TO_RIGHT)
- x -= LYX_PAPER_MARGIN/2;
- else {
+ int endlabel = row_ptr->par()->GetEndLabel(bview->buffer()->params);
+ switch (endlabel) {
+ case END_LABEL_BOX:
+ case END_LABEL_FILLED_BOX:
+ {
+ LyXFont font = GetFont(bview->buffer(),
+ row_ptr->par(), last);
+ int size = int(0.75 * lyxfont::maxAscent(font));
+ int y = (y_offset + row_ptr->baseline()) - size;
+ int x = is_rtl ? LYX_PAPER_MARGIN
+ : ww - LYX_PAPER_MARGIN - size;
+ if (row_ptr->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
+ if (is_rtl) {
LyXFont font(LyXFont::ALL_SANE);
font.setSize(LyXFont::SIZE_SMALL);
- x += font.textWidth("Mwide-figM", 10);
- }
- if (row_ptr->fill <= size)
- x += (size - row_ptr->fill + 1) * direction;
+ x += lyxfont::width("Mwide-figM", font);
+ } else
+ x -= LYX_PAPER_MARGIN/2;
+ if (row_ptr->fill() <= size)
+ x += (size - row_ptr->fill() + 1) * (is_rtl ? -1 : 1);
if (endlabel == END_LABEL_BOX) {
pain.line(x, y, x, y + size,
LColor::eolmarker);
} else
pain.fillRectangle(x, y, size, size,
LColor::eolmarker);
+ break;
+ }
+ case END_LABEL_STATIC:
+ {
+ LyXTextClass::LayoutList::size_type layout = row_ptr->par()->GetLayout();
+ string tmpstring = textclasslist.Style(bview->buffer()->params.textclass,
+ layout).endlabelstring();
+ font = GetFont(bview->buffer(), row_ptr->par(), -2);
+ int tmpx = is_rtl ? int(x) - lyxfont::width(tmpstring, font)
+ : ww - RightMargin(bview->buffer(), row_ptr) - row_ptr->fill();
+ pain.text( tmpx, y_offset + row_ptr->baseline(), tmpstring, font);
+ break;
+ }
+ case END_LABEL_NO_LABEL:
+ break;
}
}
/* draw the text in the pixmap */
- pos_end = RowLast(row_ptr);
- vpos = row_ptr->pos;
+ vpos = row_ptr->pos();
+#ifndef NEW_TABULAR
/* table stuff -- begin*/
- if (row_ptr->par->table) {
+ if (row_ptr->par()->table) {
bool on_off;
- int cell = NumberOfCell(row_ptr->par, row_ptr->pos);
+ int cell = NumberOfCell(row_ptr->par(), row_ptr->pos());
float x_old = x;
- x += row_ptr->par->table->GetBeginningOfTextInCell(cell);
+ x += row_ptr->par()->table->GetBeginningOfTextInCell(cell);
- while (vpos <= pos_end) {
+ while (vpos <= last) {
pos = vis2log(vpos);
- if (row_ptr->par->IsNewline(pos)) {
+ if (row_ptr->par()->IsNewline(pos)) {
- x = x_old + row_ptr->par->table->WidthOfColumn(cell);
+ x = x_old + row_ptr->par()->table->WidthOfColumn(cell);
/* draw the table lines, still very simple */
- on_off = !row_ptr->par->table->TopLine(cell);
+ on_off = !row_ptr->par()->table->TopLine(cell);
if ((!on_off ||
- !row_ptr->par->table->TopAlreadyDrawed(cell)) &&
- !row_ptr->par->table->IsContRow(cell))
+ !row_ptr->par()->table->TopAlreadyDrawed(cell)) &&
+ !row_ptr->par()->table->IsContRow(cell))
pain.line(int(x_old),
- offset + row_ptr->baseline - row_ptr->ascent_of_text,
+ y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
int(x),
- offset + row_ptr->baseline - row_ptr->ascent_of_text,
+ y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
LColor::tableline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
- on_off = !row_ptr->par->table->BottomLine(cell);
- if ((!on_off && !row_ptr->par->table->RowHasContRow(cell)) ||
- row_ptr->par->table->VeryLastRow(cell))
+ on_off = !row_ptr->par()->table->BottomLine(cell);
+ if ((!on_off && !row_ptr->par()->table->RowHasContRow(cell)) ||
+ row_ptr->par()->table->VeryLastRow(cell))
pain.line(int(x_old),
- offset + y_bottom - 1,
+ y_offset + y_bottom - 1,
int(x),
- offset + y_bottom - 1,
+ y_offset + y_bottom - 1,
LColor::tableline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
- on_off = !row_ptr->par->table->LeftLine(cell);
+ on_off = !row_ptr->par()->table->LeftLine(cell);
pain.line(int(x_old),
- offset + row_ptr->baseline - row_ptr->ascent_of_text,
+ y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
int(x_old),
- offset + y_bottom - 1,
+ y_offset + y_bottom - 1,
LColor::tableline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
- on_off = !row_ptr->par->table->RightLine(cell);
+ on_off = !row_ptr->par()->table->RightLine(cell);
- pain.line(int(x) - row_ptr->par->table->AdditionalWidth(cell),
- offset + row_ptr->baseline - row_ptr->ascent_of_text,
- int(x) - row_ptr->par->table->AdditionalWidth(cell),
- offset + y_bottom - 1,
+ pain.line(int(x) - row_ptr->par()->table->AdditionalWidth(cell),
+ y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
+ int(x) - row_ptr->par()->table->AdditionalWidth(cell),
+ y_offset + y_bottom - 1,
LColor::tableline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
x_old = x;
/* take care about the alignment and other spaces */
++cell;
- x += row_ptr->par->table->GetBeginningOfTextInCell(cell);
- if (row_ptr->par->table->IsFirstCell(cell))
+ x += row_ptr->par()->table->GetBeginningOfTextInCell(cell);
+ if (row_ptr->par()->table->IsFirstCell(cell))
--cell; // little hack, sorry
++vpos;
- } else if (row_ptr->par->IsHfill(pos)) {
+ } else if (row_ptr->par()->IsHfill(pos)) {
x += 1;
pain.line(int(x),
- offset + row_ptr->baseline - DefaultHeight() / 2,
+ y_offset + row_ptr->baseline() - DefaultHeight() / 2,
int(x),
- offset + row_ptr->baseline,
+ y_offset + row_ptr->baseline(),
LColor::vfillline);
x += 2;
++vpos;
- } else if (row_ptr->par->IsSeparator(pos)) {
+ } else if (row_ptr->par()->IsSeparator(pos)) {
tmpx = x;
- x+= SingleWidth(row_ptr->par, pos);
-#warning Think about this.
-#if 0
- /* -------> Only draw protected spaces when
- * not in free-spacing mode. */
- if (row_ptr->par->GetChar(pos) == LyXParagraph::META_PROTECTED_SEPARATOR && !layout.free_spacing) {
- pain.line(int(tmpx),
- offset + row_ptr->baseline - 3,
- int(tmpx),
- offset + row_ptr->baseline - 1,
- LColor::vfillline);
-
- pain.line(int(tmpx),
- offset + row_ptr->baseline - 1,
- int(x - 2),
- offset + row_ptr->baseline - 1,
- LColor::vfillline);
-
- pain.line(int(x - 2),
- offset + row_ptr->baseline - 3,
- int(x - 2),
- offset + row_ptr->baseline - 1,
- LColor::vfillline);
-
- /* what about underbars? */
- font = GetFont(row_ptr->par, pos);
- if (font.underbar() == LyXFont::ON
- && font.latex() != LyXFont::ON) {
- pain.line(int(tmpx),
- offset + row_ptr->baseline + 2,
- int(x - tmpx),
- offset + row_ptr->baseline + 2);
- }
- }
-#endif
+ x+= SingleWidth(bview,
+ row_ptr->par(), pos);
++vpos;
} else
- draw(row_ptr, vpos, offset, x);
+ draw(bview, row_ptr, vpos, y_offset, x, clear_area);
}
/* do not forget the very last cell. This has no NEWLINE so
* ignored by the code above*/
- if (cell == row_ptr->par->table->GetNumberOfCells()-1){
- x = x_old + row_ptr->par->table->WidthOfColumn(cell);
- on_off = !row_ptr->par->table->TopLine(cell);
+ if (cell == row_ptr->par()->table->GetNumberOfCells() - 1) {
+ x = x_old + row_ptr->par()->table->WidthOfColumn(cell);
+ on_off = !row_ptr->par()->table->TopLine(cell);
if ((!on_off ||
- !row_ptr->par->table->TopAlreadyDrawed(cell)) &&
- !row_ptr->par->table->IsContRow(cell))
+ !row_ptr->par()->table->TopAlreadyDrawed(cell)) &&
+ !row_ptr->par()->table->IsContRow(cell))
pain.line(int(x_old),
- offset + row_ptr->baseline - row_ptr->ascent_of_text,
+ y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
int(x),
- offset + row_ptr->baseline - row_ptr->ascent_of_text,
+ y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
LColor::tableline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
- on_off = !row_ptr->par->table->BottomLine(cell);
- if ((!on_off && !row_ptr->par->table->RowHasContRow(cell)) ||
- row_ptr->par->table->VeryLastRow(cell))
+ on_off = !row_ptr->par()->table->BottomLine(cell);
+ if ((!on_off && !row_ptr->par()->table->RowHasContRow(cell)) ||
+ row_ptr->par()->table->VeryLastRow(cell))
pain.line(int(x_old),
- offset + y_bottom - 1,
+ y_offset + y_bottom - 1,
int(x),
- offset + y_bottom - 1,
+ y_offset + y_bottom - 1,
LColor::tableline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
- on_off = !row_ptr->par->table->LeftLine(cell);
+ on_off = !row_ptr->par()->table->LeftLine(cell);
pain.line(int(x_old),
- offset + row_ptr->baseline - row_ptr->ascent_of_text,
+ y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
int(x_old),
- offset + y_bottom - 1,
+ y_offset + y_bottom - 1,
LColor::tableline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
- on_off = !row_ptr->par->table->RightLine(cell);
+ on_off = !row_ptr->par()->table->RightLine(cell);
- pain.line(int(x) - row_ptr->par->table->AdditionalWidth(cell),
- offset + row_ptr->baseline - row_ptr->ascent_of_text,
- int(x) - row_ptr->par->table->AdditionalWidth(cell),
- offset + y_bottom - 1,
+ pain.line(int(x) - row_ptr->par()->table->AdditionalWidth(cell),
+ y_offset + row_ptr->baseline() - row_ptr->ascent_of_text(),
+ int(x) - row_ptr->par()->table->AdditionalWidth(cell),
+ y_offset + y_bottom - 1,
LColor::tableline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
}
} else {
/* table stuff -- end*/
+#endif
LyXParagraph::size_type main_body =
- BeginningOfMainBody(row_ptr->par);
+ BeginningOfMainBody(bview->buffer(), row_ptr->par());
if (main_body > 0 &&
- (main_body-1 > pos_end ||
- !row_ptr->par->IsLineSeparator(main_body-1)))
+ (main_body-1 > last ||
+ !row_ptr->par()->IsLineSeparator(main_body - 1)))
main_body = 0;
- while (vpos <= pos_end) {
+ while (vpos <= last) {
pos = vis2log(vpos);
- if (main_body > 0 && pos == main_body-1) {
+ if (main_body > 0 && pos == main_body - 1) {
x += fill_label_hfill
- + GetFont(row_ptr->par, -2).stringWidth(layout.labelsep)
- - SingleWidth(row_ptr->par, main_body-1);
+ + lyxfont::width(layout.labelsep,
+ GetFont(bview->buffer(),
+ row_ptr->par(), -2))
+ - SingleWidth(bview,
+ row_ptr->par(),
+ main_body - 1);
}
- if (row_ptr->par->IsHfill(pos)) {
+ if (row_ptr->par() ->IsHfill(pos)) {
x += 1;
pain.line(int(x),
- offset + row_ptr->baseline - DefaultHeight() / 2,
+ y_offset + row_ptr->baseline() - DefaultHeight() / 2,
int(x),
- offset + row_ptr->baseline,
+ y_offset + row_ptr->baseline(),
LColor::vfillline);
- if (HfillExpansion(row_ptr, pos)) {
+ if (HfillExpansion(bview->buffer(),
+ row_ptr, pos)) {
if (pos >= main_body) {
pain.line(int(x),
- offset + row_ptr->baseline - DefaultHeight() / 4,
+ y_offset + row_ptr->baseline() - DefaultHeight() / 4,
int(x + fill_hfill),
- offset + row_ptr->baseline - DefaultHeight() / 4,
+ y_offset + row_ptr->baseline() - DefaultHeight() / 4,
LColor::vfillline,
Painter::line_onoffdash);
x += fill_hfill;
} else {
pain.line(int(x),
- offset + row_ptr->baseline - DefaultHeight() / 4,
+ y_offset + row_ptr->baseline() - DefaultHeight() / 4,
int(x + fill_label_hfill),
- offset + row_ptr->baseline - DefaultHeight() / 4,
+ y_offset + row_ptr->baseline() - DefaultHeight() / 4,
LColor::vfillline,
Painter::line_onoffdash);
x += fill_label_hfill;
}
pain.line(int(x),
- offset + row_ptr->baseline - DefaultHeight() / 2,
+ y_offset + row_ptr->baseline() - DefaultHeight() / 2,
int(x),
- offset + row_ptr->baseline,
+ y_offset + row_ptr->baseline(),
LColor::vfillline);
}
x += 2;
++vpos;
- } else if (row_ptr->par->IsSeparator(pos)) {
- tmpx = x;
- x+= SingleWidth(row_ptr->par, pos);
+ } else if (row_ptr->par()->IsSeparator(pos)) {
+ x += SingleWidth(bview,
+ row_ptr->par(), pos);
if (pos >= main_body)
- x+= fill_separator;
-#warning Think about this
-#if 0
- /* -------> Only draw protected spaces when
- * not in free-spacing mode. */
- if (row_ptr->par->GetChar(pos) == LyXParagraph::META_PROTECTED_SEPARATOR && !layout.free_spacing) {
-
- pain.line(int(tmpx),
- offset + row_ptr->baseline - 3,
- int(tmpx),
- offset + row_ptr->baseline - 1,
- LColor::vfillline);
-
- pain.line(int(tmpx),
- offset + row_ptr->baseline - 1,
- int(x - 2),
- offset + row_ptr->baseline - 1,
- LColor::vfillline);
-
- pain.line(int(x - 2),
- offset + row_ptr->baseline - 3,
- int(x - 2),
- offset + row_ptr->baseline - 1,
- LColor::vfillline);
-
- /* what about underbars? */
- font = GetFont(row_ptr->par, pos);
- if (font.underbar() == LyXFont::ON
- && font.latex() != LyXFont::ON) {
- pain.line(int(tmpx),
- offset + row_ptr->baseline + 2,
- int(x - tmpx),
- offset + row_ptr->baseline + 2);
- }
- }
-#endif
+ x += fill_separator;
++vpos;
} else
- draw(row_ptr, vpos, offset, x);
+ draw(bview, row_ptr, vpos, y_offset, x, clear_area);
}
+#ifndef NEW_TABULAR
}
+#endif
}
int LyXText::DefaultHeight() const
{
LyXFont font(LyXFont::ALL_SANE);
- return int(font.maxAscent() + font.maxDescent() * 1.5);
+ return int(lyxfont::maxAscent(font) + lyxfont::maxDescent(font) * 1.5);
}
/* returns the column near the specified x-coordinate of the row
* x is set to the real beginning of this column */
-int LyXText::GetColumnNearX(Row * row, int & x) const
+int LyXText::GetColumnNearX(BufferView * bview, Row * row, int & x,
+ bool & boundary) const
{
float tmpx = 0.0;
float fill_separator, fill_hfill, fill_label_hfill;
- PrepareToPrint(row, tmpx, fill_separator,
+ PrepareToPrint(bview, row, tmpx, fill_separator,
fill_hfill, fill_label_hfill);
- LyXDirection direction = row->par->getParDirection();
- LyXParagraph::size_type vc = row->pos;
- LyXParagraph::size_type last = RowLast(row);
+ LyXParagraph::size_type vc = row->pos();
+ LyXParagraph::size_type last = RowLastPrintable(row);
LyXParagraph::size_type c = 0;
+ LyXLayout const & layout =
+ textclasslist.Style(bview->buffer()->params.textclass,
+ row->par()->GetLayout());
+ bool left_side = false;
- LyXLayout const & layout = textclasslist.Style(parameters->textclass,
- row->par->GetLayout());
+#ifndef NEW_TABULAR
/* table stuff -- begin */
- if (row->par->table) {
- if (row->next && row->next->par == row->par //the last row doesn't need a newline at the end
- && row->par->IsNewline(last))
- last--;
- int cell = NumberOfCell(row->par, row->pos);
- float x_old = tmpx;
- bool ready = false;
- tmpx += row->par->table->GetBeginningOfTextInCell(cell);
- while (vc <= last
- && (c = vis2log(vc)) >= 0
- && tmpx + (SingleWidth(row->par, c)/2) <= x
- && !ready){
- if (row->par->IsNewline(c)) {
- if (x_old + row->par->table->WidthOfColumn(cell) <= x){
- tmpx = x_old + row->par->table->WidthOfColumn(cell);
- x_old = tmpx;
- ++cell;
- tmpx += row->par->table->GetBeginningOfTextInCell(cell);
- ++vc;
- } else
- ready = true;
- } else {
- tmpx += SingleWidth(row->par, c);
- ++vc;
- }
+ if (row->par()->table) {
+ //the last row doesn't need a newline at the end
+ if (row->next() && row->next()->par() == row->par()
+ && row->par()->IsNewline(last))
+ --last;
+ int cell = NumberOfCell(row->par(), row->pos());
+ float cell_x = tmpx + row->par()->table->WidthOfColumn(cell);
+ tmpx += row->par()->table->GetBeginningOfTextInCell(cell);
+ float last_tmpx = tmpx;
+ while (vc <= last && tmpx <= x) {
+ c = vis2log(vc);
+ last_tmpx = tmpx;
+ if (row->par()->IsNewline(c)) {
+ if (cell_x <= x){
+ ++cell;
+ tmpx = cell_x + row->par()->table->GetBeginningOfTextInCell(cell);
+ cell_x += row->par()->table->WidthOfColumn(cell);
+ ++vc;
+ } else
+ break;
+ } else {
+ tmpx += SingleWidth(bview, row->par(), c);
+ ++vc;
+ }
+ }
+ if (vc > row->pos() && !row->par()->IsNewline(c) &&
+ (tmpx + last_tmpx) / 2 > x) {
+ tmpx = last_tmpx;
+ left_side = true;
}
} else {
/* table stuff -- end*/
- LyXParagraph::size_type main_body = BeginningOfMainBody(row->par);
+#endif
+ LyXParagraph::size_type
+ main_body = BeginningOfMainBody(bview->buffer(), row->par());
float last_tmpx = tmpx;
if (main_body > 0 &&
(main_body-1 > last ||
- !row->par->IsLineSeparator(main_body-1)))
+ !row->par()->IsLineSeparator(main_body - 1)))
main_body = 0;
while (vc <= last && tmpx <= x) {
last_tmpx = tmpx;
if (main_body > 0 && c == main_body-1) {
tmpx += fill_label_hfill +
- GetFont(row->par, -2).stringWidth(layout.labelsep);
- if (row->par->IsLineSeparator(main_body-1))
- tmpx -= SingleWidth(row->par, main_body-1);
+ lyxfont::width(layout.labelsep,
+ GetFont(bview->buffer(), row->par(), -2));
+ if (row->par()->IsLineSeparator(main_body - 1))
+ tmpx -= SingleWidth(bview, row->par(), main_body-1);
}
- tmpx += SingleWidth(row->par, c);
- if (HfillExpansion(row, c)) {
+ if (HfillExpansion(bview->buffer(), row, c)) {
+ x += SingleWidth(bview, row->par(), c);
if (c >= main_body)
tmpx += fill_hfill;
else
tmpx += fill_label_hfill;
}
- else if (c >= main_body
- && row->par->IsSeparator(c)) {
- tmpx+= fill_separator;
- }
+ else if (row->par()->IsSeparator(c)) {
+ tmpx += SingleWidth(bview, row->par(), c);
+ if (c >= main_body)
+ tmpx+= fill_separator;
+ } else
+ tmpx += SingleWidth(bview, row->par(), c);
++vc;
}
- if (vc > row->pos && (tmpx+last_tmpx)/2 > x) {
- vc--;
+ if (vc > row->pos() && (tmpx + last_tmpx) / 2 > x) {
tmpx = last_tmpx;
+ left_side = true;
}
+#ifndef NEW_TABULAR
}
- /* make sure that a last space in a row doesnt count */
- if (row->pos <= last
- && !(!row->next || row->next->par != row->par))
- if (direction == LYX_DIR_LEFT_TO_RIGHT && vc > last
- && row->par->IsLineSeparator(vis2log(last)) ) {
- vc = last;
- tmpx -= fill_separator+SingleWidth(row->par, vis2log(last));
- } else if (direction == LYX_DIR_RIGHT_TO_LEFT
- && vc == row->pos
- && row->par->IsLineSeparator(vis2log(row->pos)) ) {
- vc = row->pos+1;
- tmpx += fill_separator+SingleWidth(row->par, vis2log(row->pos));
- }
+#endif
+
- if (row->pos > last) // Row is empty?
- c = row->pos;
- else if (vc <= last) {
+ if (vc > last + 1) // This shouldn't happen.
+ vc = last + 1;
+
+ boundary = false;
+
+ if (row->pos() > last) // Row is empty?
+ c = row->pos();
+ else if (vc == row->pos() ||
+ (row->par()->table
+ && vc <= last && row->par()->IsNewline(vc-1)) ) {
c = vis2log(vc);
- LyXDirection direction = row->par->getLetterDirection(c);
- if (vc > row->pos && row->par->IsLineSeparator(c)
- && row->par->getLetterDirection(vis2log(vc - 1)) != direction)
- c = vis2log(vc-1);
- if (direction == LYX_DIR_RIGHT_TO_LEFT)
+ if (bidi_level(c) % 2 == 1)
++c;
} else {
- c = vis2log(last)+1;
- if (row->par->getLetterDirection(c - 1) == LYX_DIR_RIGHT_TO_LEFT)
- --c;
+ c = vis2log(vc - 1);
+ bool rtl = (bidi_level(c) % 2 == 1);
+ if (left_side == rtl) {
+ ++c;
+ boundary = IsBoundary(bview->buffer(), row->par(), c);
+ }
}
- if (!row->par->table && row->pos <= last && c > last
- && row->par->IsNewline(last)) {
- if (row->par->getLetterDirection(last) == LYX_DIR_LEFT_TO_RIGHT)
- tmpx -= SingleWidth(row->par, last);
+ if (!row->par()->table && row->pos() <= last && c > last
+ && row->par()->IsNewline(last)) {
+ if (bidi_level(last) % 2 == 0)
+ tmpx -= SingleWidth(bview, row->par(), last);
else
- tmpx += SingleWidth(row->par, last);
+ tmpx += SingleWidth(bview, row->par(), last);
c = last;
}
- c -= row->pos;
+ c -= row->pos();
x = int(tmpx);
return c;
}
-
+
+#ifndef NEW_INSETS
/* turn the selection into a new environment. If there is no selection,
* create an empty environment */
-void LyXText::InsertFootnoteEnvironment(LyXParagraph::footnote_kind kind)
+void LyXText::InsertFootnoteEnvironment(BufferView * bview,
+ LyXParagraph::footnote_kind kind)
{
/* no footnoteenvironment in a footnoteenvironment */
- if (cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
+ if (cursor.par()->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
WriteAlert(_("Impossible operation"),
_("You can't insert a float in a float!"),
_("Sorry."));
}
/* no marginpars in minipages */
if (kind == LyXParagraph::MARGIN
- && cursor.par->pextra_type == LyXParagraph::PEXTRA_MINIPAGE) {
+ && cursor.par()->pextra_type == LyXParagraph::PEXTRA_MINIPAGE) {
WriteAlert(_("Impossible operation"),
_("You can't insert a marginpar in a minipage!"),
_("Sorry."));
dummy_selection = true;
}
- LyXParagraph *tmppar;
+ LyXParagraph * tmppar;
- if (sel_start_cursor.par->table || sel_end_cursor.par->table){
+#ifndef NEW_TABULAR
+ if (sel_start_cursor.par()->table || sel_end_cursor.par()->table){
WriteAlert(_("Impossible operation"), _("Cannot cut table."), _("Sorry."));
return;
}
-
+#endif
/* a test to make sure there is not already a footnote
* in the selection. */
- tmppar = sel_start_cursor.par->ParFromPos(sel_start_cursor.pos);
+ tmppar = sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos());
- while (tmppar != sel_end_cursor.par->ParFromPos(sel_end_cursor.pos) &&
+ while (tmppar != sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos()) &&
tmppar->footnoteflag == LyXParagraph::NO_FOOTNOTE)
tmppar = tmppar->next;
- if (tmppar != sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)
+ if (tmppar != sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos())
|| tmppar->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
WriteAlert(_("Impossible operation"),
_("Float would include float!"),
/* ok we have a selection. This is always between sel_start_cursor
* and sel_end cursor */
- SetUndo(Undo::FINISH,
- sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous,
- sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)->next);
+ SetUndo(bview->buffer(), Undo::FINISH,
+ sel_start_cursor.par()->ParFromPos(sel_start_cursor.pos())->previous,
+ sel_end_cursor.par()->ParFromPos(sel_end_cursor.pos())->next);
- if (sel_end_cursor.pos > 0
- && sel_end_cursor.par->IsLineSeparator(sel_end_cursor.pos - 1))
- sel_end_cursor.pos--; /* please break before a space at
- * the end */
- if (sel_start_cursor.par == sel_end_cursor.par
- && sel_start_cursor.pos > sel_end_cursor.pos)
- sel_start_cursor.pos--;
-
- sel_end_cursor.par->BreakParagraphConservative(sel_end_cursor.pos);
+ if (sel_end_cursor.pos() > 0
+ && sel_end_cursor.par()->IsLineSeparator(sel_end_cursor.pos() - 1))
+ sel_end_cursor.pos(sel_end_cursor.pos() - 1);
+ /* please break before a space at the end */
+ if (sel_start_cursor.par() == sel_end_cursor.par()
+ && sel_start_cursor.pos() > sel_end_cursor.pos())
+ sel_start_cursor.pos(sel_start_cursor.pos() - 1);
+
+ sel_end_cursor.par()->BreakParagraphConservative(bview->buffer()->params, sel_end_cursor.pos());
- sel_end_cursor.par = sel_end_cursor.par->Next();
- sel_end_cursor.pos = 0;
+ sel_end_cursor.par(sel_end_cursor.par()->Next());
+ sel_end_cursor.pos(0);
// don't forget to insert a dummy layout paragraph if necessary
- if (sel_start_cursor.par->GetLayout() != sel_end_cursor.par->layout){
- sel_end_cursor.par->BreakParagraphConservative(0);
- sel_end_cursor.par->layout = LYX_DUMMY_LAYOUT;
- sel_end_cursor.par = sel_end_cursor.par->next;
+ if (sel_start_cursor.par()->GetLayout() != sel_end_cursor.par()->layout){
+ sel_end_cursor.par()->BreakParagraphConservative(bview->buffer()->params, 0);
+ sel_end_cursor.par()->layout = LYX_DUMMY_LAYOUT;
+ sel_end_cursor.par(sel_end_cursor.par()->next);
}
else
- sel_end_cursor.par->layout = LYX_DUMMY_LAYOUT;
+ sel_end_cursor.par()->layout = LYX_DUMMY_LAYOUT;
cursor = sel_end_cursor;
/* please break behind a space, if there is one. The space should
* be erased too */
- if (sel_start_cursor.pos > 0
- && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos - 1))
- sel_start_cursor.pos--;
- if (sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)) {
- sel_start_cursor.par->Erase(sel_start_cursor.pos);
+ if (sel_start_cursor.pos() > 0
+ && sel_start_cursor.par()->IsLineSeparator(sel_start_cursor.pos() - 1))
+ sel_start_cursor.pos(sel_start_cursor.pos() - 1);
+ if (sel_start_cursor.par()->IsLineSeparator(sel_start_cursor.pos())) {
+ sel_start_cursor.par()->Erase(sel_start_cursor.pos());
}
- sel_start_cursor.par->BreakParagraphConservative(sel_start_cursor.pos);
- tmppar = sel_start_cursor.par->Next();
+ sel_start_cursor.par()->BreakParagraphConservative(bview->buffer()->params,
+ sel_start_cursor.pos());
+ tmppar = sel_start_cursor.par()->Next();
if (dummy_selection) {
tmppar->Clear();
|| kind == LyXParagraph::WIDE_FIG
|| kind == LyXParagraph::ALGORITHM) {
pair<bool, LyXTextClass::size_type> lres =
- textclasslist.NumberOfLayout(parameters->textclass,
+ textclasslist.NumberOfLayout(bview->buffer()->params.textclass,
"Caption");
LyXTextClass::size_type lay;
if (lres.first) {
// layout not found
lay = 0; // use default layout "Standard" (0)
}
- tmppar->SetLayout(lay);
+ tmppar->SetLayout(bview->buffer()->params, lay);
}
- }
- else {
- if (sel_start_cursor.pos > 0) {
+ } else {
+ if (sel_start_cursor.pos() > 0) {
/* the footnote-environment should begin with a standard layout.
* Imagine you insert a footnote within an enumeration, you
* certainly do not want an enumerated footnote! */
tmppar->Clear();
- }
- else {
+ } else {
/* this is a exception the user would sometimes expect, I hope */
- sel_start_cursor.par->Clear();
+ sel_start_cursor.par()->Clear();
}
}
- while (tmppar != sel_end_cursor.par) {
+ while (tmppar != sel_end_cursor.par()) {
tmppar->footnoteflag = LyXParagraph::OPEN_FOOTNOTE;
tmppar->footnotekind = kind;
tmppar = tmppar->Next();
- }
+ }
- RedoParagraphs(sel_start_cursor, sel_end_cursor.par->Next());
+ RedoParagraphs(bview, sel_start_cursor, sel_end_cursor.par()->Next());
- SetCursor(sel_start_cursor.par->Next(), 0);
+ SetCursor(bview, sel_start_cursor.par()->Next(), 0);
ClearSelection();
}
-
+#endif
+
// returns pointer to a specified row
Row * LyXText::GetRow(LyXParagraph * par,
LyXParagraph::size_type pos, long & y) const
{
- Row * tmprow;
-
- if (currentrow) {
- if (par == currentrow->par
- || par == currentrow->par->Previous()) {
- // do not dereference par, it may have been deleted
- // already! (Matthias)
-
- // Walk backwards as long as the previous
- // rows par is not par
- while (currentrow->previous
- && currentrow->previous->par != par) {
- currentrow = currentrow->previous;
- currentrow_y -= currentrow->height;
- }
- // Walk backwards as long as the previous
- // rows par _is_ par
- while (currentrow->previous
- && currentrow->previous->par == par) {
- currentrow = currentrow->previous;
- currentrow_y -= currentrow->height;
- }
- }
-
- tmprow = currentrow;
- y = currentrow_y;
- // find the first row of the specified paragraph
- while (tmprow->next
- && tmprow->par != par) {
- y += tmprow->height;
- tmprow = tmprow->next;
- }
-
- if (tmprow->par == par){
- // now find the wanted row
- while (tmprow->pos < pos
- && tmprow->next
- && tmprow->next->par == par
- && tmprow->next->pos <= pos) {
- y += tmprow->height;
- tmprow = tmprow->next;
- }
- currentrow = tmprow;
- currentrow_y = y;
- return tmprow;
- }
- }
-
- tmprow = firstrow;
+ Row * tmprow = firstrow;
y = 0;
+
// find the first row of the specified paragraph
- while (tmprow->next && tmprow->par != par) {
- y += tmprow->height;
- tmprow = tmprow->next;
+ while (tmprow->next() && tmprow->par() != par) {
+ y += tmprow->height();
+ tmprow = tmprow->next();
}
// now find the wanted row
- while (tmprow->pos < pos
- && tmprow->next
- && tmprow->next->par == par
- && tmprow->next->pos <= pos) {
- y += tmprow->height;
- tmprow = tmprow->next;
+ while (tmprow->pos() < pos
+ && tmprow->next()
+ && tmprow->next()->par() == par
+ && tmprow->next()->pos() <= pos) {
+ y += tmprow->height();
+ tmprow = tmprow->next();
}
- currentrow = tmprow;
- currentrow_y = y;
-
return tmprow;
}