#include "frontends/LyXView.h"
#include "undo_funcs.h"
#include "buffer.h"
+#include "buffer_funcs.h"
#include "bufferparams.h"
#include "errorlist.h"
#include "gettext.h"
LyXCursor tmpcursor;
setCursor(tmpcursor, start, 0);
- //redoParagraphs(tmpcursor, &(*pastend));
redoParagraphs(tmpcursor, pastend);
// We need to actually move the text->cursor. I don't
void LyXText::redoHeightOfParagraph()
{
- RowList::iterator tmprow = cursor.row();
+ RowList::iterator tmprow = cursorRow();
int y = cursor.y() - tmprow->baseline();
setHeightOfRow(tmprow);
void LyXText::redoDrawingOfParagraph(LyXCursor const & cur)
{
- RowList::iterator tmprow = cur.row();
+ RowList::iterator tmprow = getRow(cur);
int y = cur.y() - tmprow->baseline();
setHeightOfRow(tmprow);
}
-// deletes and inserts again all paragaphs between the cursor
+// deletes and inserts again all paragraphs between the cursor
// and the specified par
// This function is needed after SetLayout and SetFont etc.
void LyXText::redoParagraphs(LyXCursor const & cur,
ParagraphList::iterator endpit)
{
- RowList::iterator tmprit = cur.row();
+ RowList::iterator tmprit = getRow(cur);
int y = cur.y() - tmprit->baseline();
ParagraphList::iterator first_phys_pit;
if (tmprit == rows().begin()) {
// A trick/hack for UNDO.
// This is needed because in an UNDO/REDO we could have
- // changed the ownerParagrah() so the paragraph inside
+ // changed the ownerParagraph() so the paragraph inside
// the row is NOT my really first par anymore.
// Got it Lars ;) (Jug 20011206)
first_phys_pit = ownerParagraphs().begin();
}
if (prevrit != rows().end()) {
setHeightOfRow(prevrit);
- const_cast<LyXText *>(this)->postPaint(y - prevrit->height());
+ postPaint(y - prevrit->height());
} else {
setHeightOfRow(rows().begin());
- const_cast<LyXText *>(this)->postPaint(0);
+ postPaint(0);
}
if (tmprit != rows().end())
setHeightOfRow(tmprit);
void LyXText::fullRebreak()
+{
+ need_break_row = rows().begin();
+ partialRebreak();
+ setCursorIntern(cursor.par(), cursor.pos());
+}
+
+
+void LyXText::partialRebreak()
{
if (rows().empty()) {
init(bv());
// need the selection cursor:
void LyXText::setSelection()
{
- bool const lsel = selection.set();
-
- if (!selection.set()) {
- last_sel_cursor = selection.cursor;
- selection.start = selection.cursor;
- selection.end = selection.cursor;
- }
-
- selection.set(true);
-
- // first the toggling area
- if (cursor.y() < last_sel_cursor.y()
- || (cursor.y() == last_sel_cursor.y()
- && cursor.x() < last_sel_cursor.x())) {
- toggle_end_cursor = last_sel_cursor;
- toggle_cursor = cursor;
- } else {
- toggle_end_cursor = cursor;
- toggle_cursor = last_sel_cursor;
- }
-
- last_sel_cursor = cursor;
-
- // and now the whole selection
-
- if (selection.cursor.par() == cursor.par())
- if (selection.cursor.pos() < cursor.pos()) {
- selection.end = cursor;
- selection.start = selection.cursor;
- } else {
- selection.end = selection.cursor;
- selection.start = cursor;
- }
- else if (selection.cursor.y() < cursor.y() ||
- (selection.cursor.y() == cursor.y()
- && selection.cursor.x() < cursor.x())) {
- selection.end = cursor;
- selection.start = selection.cursor;
- }
- else {
- selection.end = selection.cursor;
- selection.start = cursor;
- }
-
- // a selection with no contents is not a selection
- if (selection.start.par() == selection.end.par() &&
- selection.start.pos() == selection.end.pos())
- selection.set(false);
+ bool const lsel = TextCursor::setSelection();
if (inset_owner && (selection.set() || lsel))
inset_owner->setUpdateStatus(bv(), InsetText::SELECTION);
}
-string const LyXText::selectionAsString(Buffer const * buffer,
- bool label) const
-{
- if (!selection.set()) return string();
-
- // should be const ...
- ParagraphList::iterator startpit = selection.start.par();
- ParagraphList::iterator endpit = selection.end.par();
- pos_type const startpos(selection.start.pos());
- pos_type const endpos(selection.end.pos());
-
- if (startpit == endpit) {
- return startpit->asString(buffer, startpos, endpos, label);
- }
-
- string result;
-
- // First paragraph in selection
- result += startpit->asString(buffer, startpos, startpit->size(), label) + "\n\n";
-
- // The paragraphs in between (if any)
- ParagraphList::iterator pit = boost::next(startpit);
- for (; pit != endpit; ++pit) {
- result += pit->asString(buffer, 0, pit->size(), label) + "\n\n";
- }
-
- // Last paragraph in selection
- result += endpit->asString(buffer, 0, endpos, label);
-
- return result;
-}
-
void LyXText::clearSelection()
{
- selection.set(false);
- selection.mark(false);
- last_sel_cursor = selection.end = selection.start = selection.cursor = cursor;
+ TextCursor::clearSelection();
+
// reset this in the bv_owner!
if (bv_owner && bv_owner->text)
bv_owner->text->xsel_cache.set(false);
void LyXText::cursorHome()
{
- setCursor(cursor.par(), cursor.row()->pos());
+ setCursor(cursor.par(), cursorRow()->pos());
}
if (cursor.par()->empty())
return;
- RowList::iterator rit = cursor.row();
+ RowList::iterator rit = cursorRow();
RowList::iterator next_rit = boost::next(rit);
ParagraphList::iterator pit = rit->par();
pos_type last_pos = lastPos(*this, rit);
while (tmppit != boost::prior(selection.start.par())) {
setCursor(tmppit, 0);
- postPaint(cursor.y() - cursor.row()->baseline());
+ postPaint(cursor.y() - cursorRow()->baseline());
ParagraphList::iterator pit = cursor.par();
ParagraphParameters & params = pit->params();
// CHECK if this is really needed. (Lgb)
bv()->buffer()->params.getLyXTextClass().counters().reset();
- for (; pit != ownerParagraphs().end(); ++pit) {
+ ParagraphList::iterator beg = ownerParagraphs().begin();
+ ParagraphList::iterator end = ownerParagraphs().end();
+ for (; pit != end; ++pit) {
while (rowit->par() != pit)
++rowit;
string const oldLabel = pit->params().labelString();
size_t maxdepth = 0;
- if (pit != ownerParagraphs().begin())
+ if (pit != beg)
maxdepth = boost::prior(pit)->getMaxDepthAfter();
if (pit->params().depth() > maxdepth)
int endpos = selection.end.pos();
boost::tie(endpit, endpos) = realcut ?
- CutAndPaste::cutSelection(ownerParagraphs(),
+ CutAndPaste::cutSelection(bv()->buffer()->params,
+ ownerParagraphs(),
selection.start.par(), endpit,
selection.start.pos(), endpos,
bv()->buffer()->params.textclass,
doclear)
- : CutAndPaste::eraseSelection(ownerParagraphs(),
+ : CutAndPaste::eraseSelection(bv()->buffer()->params,
+ ownerParagraphs(),
selection.start.par(), endpit,
selection.start.pos(), endpos,
doclear);
}
-void LyXText::pasteSelection()
+void LyXText::pasteSelection(size_t sel_index)
{
// this does not make sense, if there is nothing to paste
if (!CutAndPaste::checkPastePossible())
ErrorList el;
boost::tie(ppp, endpit) =
- CutAndPaste::pasteSelection(ownerParagraphs(),
+ CutAndPaste::pasteSelection(*bv()->buffer(),
+ ownerParagraphs(),
cursor.par(), cursor.pos(),
bv()->buffer()->params.textclass,
- el);
- bv()->setErrorList(el);
+ sel_index, el);
+ parseErrors(*bv()->buffer(), el);
bv()->showErrorList(_("Paste"));
redoParagraphs(cursor, endpit);
selection.start.pos());
// Insert the new string
- for (string::const_iterator cit = str.begin(); cit != str.end(); ++cit) {
+ string::const_iterator cit = str.begin();
+ string::const_iterator end = str.end();
+ for (; cit != end; ++cit) {
selection.end.par()->insertChar(pos, (*cit), font);
++pos;
}
{
string linestr(str);
bool newline_inserted = false;
- for (string::size_type i = 0; i < linestr.length(); ++i) {
+ string::size_type const siz = linestr.length();
+
+ for (string::size_type i = 0; i < siz; ++i) {
if (linestr[i] == '\n') {
if (newline_inserted) {
// we know that \r will be ignored by
// check the special right address boxes
if (pit->layout()->margintype == MARGIN_RIGHT_ADDRESS_BOX) {
tmpcursor.par(pit);
- tmpcursor.row(row);
tmpcursor.y(y);
tmpcursor.x(0);
tmpcursor.x_fix(0);
}
}
- cur.row(row);
// y is now the beginning of the cursor row
y += row->baseline();
// y is now the cursor baseline
--pos;
else // potentional bug... BUG (Lgb)
if (pit->isSeparator(pos)) {
- if (pos > cursor.row()->pos() &&
+ if (pos > cursorRow()->pos() &&
bidi_level(pos) % 2 ==
bidi_level(pos - 1) % 2)
--pos;
boundary = false;
// This (rtl_support test) is not needed, but gives
// some speedup if rtl_support=false
+ RowList::iterator next_rit = boost::next(rit);
+
bool const lastrow = lyxrc.rtl_support &&
- (boost::next(rit) == rowlist_.end() ||
- boost::next(rit)->par() != rit_par);
+ (next_rit == rowlist_.end() ||
+ next_rit->par() != rit_par);
+
// If lastrow is false, we don't need to compute
// the value of rtl.
bool const rtl = (lastrow)
* and the next row is filled by an inset that spans an entire
* row.
*/
- bool beforeFullRowInset(LyXText & lt, LyXCursor const & cur) {
- RowList::iterator row = cur.row();
+ bool beforeFullRowInset(LyXText & lt, LyXCursor const & cur)
+ {
+ RowList::iterator row = lt.getRow(cur);
if (boost::next(row) == lt.rows().end())
return false;
+
Row const & next = *boost::next(row);
if (next.pos() != cur.pos() || next.par() != cur.par())
if (cur.pos() == cur.par()->size()
|| !cur.par()->isInset(cur.pos()))
return false;
+
Inset const * inset = cur.par()->getInset(cur.pos());
if (inset->needFullRow() || inset->display())
return true;
+
return false;
}
}
cur.pos(row->pos() + column);
cur.x(x);
cur.y(y + row->baseline());
- cur.row(row);
if (beforeFullRowInset(*this, cur)) {
- pos_type last = lastPrintablePos(*this, row);
- float x = getCursorX(boost::next(row), cur.pos(), last, bound);
+ pos_type const last = lastPrintablePos(*this, row);
+ RowList::iterator next_row = boost::next(row);
+
+ float x = getCursorX(next_row, cur.pos(), last, bound);
cur.ix(int(x));
- cur.iy(y + row->height() + boost::next(row)->baseline());
- cur.irow(boost::next(row));
+ cur.iy(y + row->height() + next_row->baseline());
+ cur.irow(next_row);
} else {
cur.iy(cur.y());
cur.ix(cur.x());
{
#if 1
int x = cursor.x_fix();
- int y = cursor.y() - cursor.row()->baseline() - 1;
+ int y = cursor.y() - cursorRow()->baseline() - 1;
setCursorFromCoordinates(x, y);
if (!selecting) {
int topy = top_y();
}
#else
setCursorFromCoordinates(bv(), cursor.x_fix(),
- cursor.y() - cursor.row()->baseline() - 1);
+ cursor.y() - cursorRow()->baseline() - 1);
#endif
}
{
#if 1
int x = cursor.x_fix();
- int y = cursor.y() - cursor.row()->baseline() +
- cursor.row()->height() + 1;
+ int y = cursor.y() - cursorRow()->baseline() +
+ cursorRow()->height() + 1;
setCursorFromCoordinates(x, y);
- if (!selecting && cursor.row() == cursor.irow()) {
+ if (!selecting && cursorRow() == cursor.irow()) {
int topy = top_y();
int y1 = cursor.iy() - topy;
int y2 = y1;
}
#else
setCursorFromCoordinates(bv(), cursor.x_fix(),
- cursor.y() - cursor.row()->baseline()
- + cursor.row()->height() + 1);
+ cursor.y() - cursorRow()->baseline()
+ + cursorRow()->height() + 1);
#endif
}
void LyXText::cursorDownParagraph()
{
- if (boost::next(cursor.par()) != ownerParagraphs().end()) {
- setCursor(boost::next(cursor.par()), 0);
+ ParagraphList::iterator par = cursor.par();
+ ParagraphList::iterator next_par = boost::next(par);
+
+ if (next_par != ownerParagraphs().end()) {
+ setCursor(next_par, 0);
} else {
- setCursor(cursor.par(), cursor.par()->size());
+ setCursor(par, par->size());
}
}
return false;
// Do not delete empty paragraphs with keepempty set.
- if (old_cursor.par()->layout()->keepempty)
+ if (old_cursor.par()->allowEmpty())
return false;
// only do our magic if we changed paragraph
selection.cursor.par() == old_cursor.par()
&& selection.cursor.pos() == old_cursor.pos());
- if (old_cursor.row() != rows().begin()) {
+ if (getRow(old_cursor) != rows().begin()) {
RowList::iterator
- prevrow = boost::prior(old_cursor.row());
- const_cast<LyXText *>(this)->postPaint(old_cursor.y() - old_cursor.row()->baseline() - prevrow->height());
+ prevrow = boost::prior(getRow(old_cursor));
+ postPaint(old_cursor.y() - getRow(old_cursor)->baseline() - prevrow->height());
tmpcursor = cursor;
cursor = old_cursor; // that undo can restore the right cursor position
#warning FIXME. --end() iterator is usable here
cursor = tmpcursor;
// delete old row
- removeRow(old_cursor.row());
+ removeRow(getRow(old_cursor));
// delete old par
ownerParagraphs().erase(old_cursor.par());
* the parindent that can occur or dissappear.
* The next row can change its height, if
* there is another layout before */
- if (boost::next(prevrow) != rows().end()) {
- breakAgain(boost::next(prevrow));
+ RowList::iterator tmprit = boost::next(prevrow);
+ if (tmprit != rows().end()) {
+ breakAgain(tmprit);
updateCounters();
}
setHeightOfRow(prevrow);
} else {
- RowList::iterator nextrow = boost::next(old_cursor.row());
- const_cast<LyXText *>(this)->postPaint(
- old_cursor.y() - old_cursor.row()->baseline());
+ RowList::iterator nextrow = boost::next(getRow(old_cursor));
+ postPaint(old_cursor.y() - getRow(old_cursor)->baseline());
tmpcursor = cursor;
cursor = old_cursor; // that undo can restore the right cursor position
cursor = tmpcursor;
// delete old row
- removeRow(old_cursor.row());
+ removeRow(getRow(old_cursor));
// delete old par
ownerParagraphs().erase(old_cursor.par());
// We are an inset's lyxtext. Tell the top-level lyxtext
// it needs to update the row we're in.
LyXText * t = bv()->text;
- t->postRowPaint(t->cursor.row(), t->cursor.y() - t->cursor.row()->baseline());
+ t->postRowPaint(t->cursorRow(), t->cursor.y() - t->cursorRow()->baseline());
}
// We are an inset's lyxtext. Tell the top-level lyxtext
// it needs to update the row we're in.
LyXText * t = bv()->text;
- t->postRowPaint(t->cursor.row(), t->cursor.y() - t->cursor.row()->baseline());
+ t->postRowPaint(t->cursorRow(), t->cursor.y() - t->cursorRow()->baseline());
}