text()->setCursor(
std::distance(text()->paragraphs().begin(), it.getPar()),
it.getPos());
- text()->selection.cursor = text()->cursor;
+ text()->anchor() = text()->cursor();
update();
return;
}
return 0;
return t->cursorPar()->getFont(
buffer()->params(),
- t->cursor.pos(),
+ t->cursor().pos(),
outerFont(t->cursorPar(), t->paragraphs())
).language()->encoding();
}
owner_->message(_("Formatting document..."));
- lyxerr << "### resizeCurrentBuffer: text " << bv_->text() << endl;
- if (!bv_->text())
+ LyXText * text = bv_->text();
+ lyxerr << "### resizeCurrentBuffer: text " << text << endl;
+ if (!text)
return;
- par = bv_->text()->cursor.par();
- pos = bv_->text()->cursor.pos();
- selstartpar = bv_->text()->selStart().par();
- selstartpos = bv_->text()->selStart().pos();
- selendpar = bv_->text()->selEnd().par();
- selendpos = bv_->text()->selEnd().pos();
- selection = bv_->text()->selection.set();
- mark_set = bv_->text()->selection.mark();
- bv_->text()->textwidth_ = bv_->workWidth();
- bv_->text()->fullRebreak();
+ par = text->cursor().par();
+ pos = text->cursor().pos();
+ selstartpar = text->selStart().par();
+ selstartpos = text->selStart().pos();
+ selendpar = text->selEnd().par();
+ selendpos = text->selEnd().pos();
+ selection = text->selection.set();
+ mark_set = text->selection.mark();
+ text->textwidth_ = bv_->workWidth();
+ text->fullRebreak();
update();
if (par != -1) {
- bv_->text()->selection.set(true);
+ text->selection.set(true);
// At this point just to avoid the Delete-Empty-Paragraph-
// Mechanism when setting the cursor.
- bv_->text()->selection.mark(mark_set);
+ text->selection.mark(mark_set);
if (selection) {
- bv_->text()->setCursor(selstartpar, selstartpos);
- bv_->text()->selection.cursor = bv_->text()->cursor;
- bv_->text()->setCursor(selendpar, selendpos);
- bv_->text()->setSelection();
- bv_->text()->setCursor(par, pos);
+ text->setCursor(selstartpar, selstartpos);
+ text->anchor() = text->cursor();
+ text->setCursor(selendpar, selendpos);
+ text->setSelection();
+ text->setCursor(par, pos);
} else {
- bv_->text()->setCursor(par, pos);
- bv_->text()->selection.cursor = bv_->text()->cursor;
- bv_->text()->selection.set(false);
+ text->setCursor(par, pos);
+ text->anchor() = text->cursor();
+ text->selection.set(false);
}
}
}
if (!xsel_cache_.set ||
- text->cursor != xsel_cache_.cursor ||
- text->selection.cursor != xsel_cache_.selection_cursor)
+ text->cursor() != xsel_cache_.cursor ||
+ text->anchor() != xsel_cache_.anchor)
{
- xsel_cache_.cursor = text->cursor;
- xsel_cache_.selection_cursor = text->selection.cursor;
+ xsel_cache_.cursor = text->cursor();
+ xsel_cache_.anchor = text->anchor();
xsel_cache_.set = text->selection.set();
sel = text->selectionAsString(*bv_->buffer(), false);
if (!sel.empty())
return;
saved_positions[i] = Position(buffer_->fileName(),
bv_->text()->cursorPar()->id(),
- bv_->text()->cursor.pos());
+ bv_->text()->cursor().pos());
if (i > 0)
owner_->message(bformat(_("Saved bookmark %1$s"), tostr(i)));
}
LyXCursor cursor = bv_->getLyXText()->cursor;
Buffer::inset_iterator it =
find_if(Buffer::inset_iterator(
- cursorPar(), cursor.pos()),
+ cursorPar(), cursor().pos()),
buffer_->inset_iterator_end(),
lyx::compare_memfun(&Inset::lyxCode, code));
return it != buffer_->inset_iterator_end() ? (*it) : 0;
}
if (cursor_par_seen) {
if (beg.getPar() == text->cursorPar()
- && beg.getPos() >= text->cursor.pos()) {
+ && beg.getPos() >= text->cursor().pos()) {
break;
} else if (beg.getPar() != text->cursorPar()) {
break;
bool BufferView::Pimpl::insertInset(InsetOld * inset, string const & lout)
{
// not quite sure if we want this...
- bv_->text()->recUndo(bv_->text()->cursor.par());
+ bv_->text()->recUndo(bv_->text()->cursor().par());
freezeUndo();
bv_->text()->clearSelection();
string const & from, string const & to)
{
bool need_update = false;
- LyXCursor cursor = bv_->text()->cursor;
- LyXCursor tmpcursor = cursor;
- cursor.par(tmpcursor.par());
- cursor.pos(tmpcursor.pos());
+ LyXCursor cur = bv_->text()->cursor();
ParIterator end = bv_->buffer()->par_iterator_end();
for (ParIterator it = bv_->buffer()->par_iterator_begin();
// FIXME
- // The test it.size()==1 was needed to prevent crashes.
- // How to set the cursor correctly when it.size()>1 ??
+ // The test it.size() == 1 was needed to prevent crashes.
+ // How to set the cursor correctly when it.size() > 1 ??
if (it.size() == 1) {
bv_->text()->setCursorIntern(bv_->text()->parOffset(it.pit()), 0);
bv_->text()->redoParagraph(bv_->text()->cursorPar());
}
}
}
- bv_->text()->setCursorIntern(cursor.par(), cursor.pos());
+ bv_->text()->setCursorIntern(cur.par(), cur.pos());
return need_update;
}
/// this is used to handle XSelection events in the right manner
struct {
LyXCursor cursor;
- LyXCursor selection_cursor;
+ LyXCursor anchor;
bool set;
} xsel_cache_;
///
+
+2004-01-13 André Pönitz <poenitz@gmx.net>
+
+ * textcursor.[Ch]:
+ * lyxtext.h: hide cursor and selection anchor behind accessor function
+
+ * BufferView.C:
+ * BufferView_pimpl.[Ch]:
+ * PosIterator.C:
+ * bufferview_funcs.C:
+ * cursor.h:
+ * lyxfind.C:
+ * lyxfunc.C:
+ * text.C:
+ * text2.C:
+ * text3.C:
+ * undo.C: adjust
+
2004-01-08 Alfredo Braunstein <abraunst@lyx.org>
* text2.C (undoSpan): add and use
PosIterator::PosIterator(BufferView & bv)
{
LyXText * text = bv.getLyXText();
- lyx::pos_type pos = text->cursor.pos();
+ lyx::pos_type pos = text->cursor().pos();
ParagraphList::iterator pit = text->cursorPar();
ParIterator par = bv.buffer()->par_iterator_begin();
LyXText * text = bv->getLyXText();
Buffer * buffer = bv->buffer();
- LyXCursor const & c = text->cursor;
+ LyXCursor const & c = text->cursor();
bool const show_change = buffer->params().tracking_changes
- && text->cursor.pos() != text->cursorPar()->size()
+ && text->cursor().pos() != text->cursorPar()->size()
&& text->cursorPar()->lookupChange(c.pos()) != Change::UNCHANGED;
if (show_change) {
#ifdef DEVEL_VERSION
ParagraphList::iterator pit = text->cursorPar();
state << _(", Paragraph: ") << pit->id();
- state << _(", Position: ") << text->cursor.pos();
- RowList::iterator rit = pit->getRow(text->cursor.pos());
+ state << _(", Position: ") << text->cursor().pos();
+ RowList::iterator rit = pit->getRow(text->cursor().pos());
state << bformat(_(", Row b:%1$d e:%2$d"), rit->pos(), rit->endpos());
state << _(", Inset: ");
InsetOld * inset = pit->inInset();
LyXText * text = par.text(*bv->buffer());
par.lockPath(bv);
- //hack for the chicken and egg problem
+ // hack for the chicken and egg problem
if (par.inset())
bv->top_y(par.outerPar()->y);
bv->update();
text->setSelectionRange(length);
text->setSelection();
if (backwards)
- std::swap(text->cursor, text->selection.cursor);
+ std::swap(text->cursor(), text->anchor());
}
bv->fitCursor();
void pop(int depth);
/// pop one level off the cursor
void pop();
+ /// access to cursor 'tip'
+ CursorSlice & top() { return data_.back(); }
+ /// access to cursor 'tip'
+ CursorSlice const & top() const { return data_.back(); }
+
/// set the cell the cursor is in
void cell(int);
/// return the cell this cursor is in
collapseParagraphs(bv);
if (!text_.selection.set())
- text_.selection.cursor = text_.cursor;
+ text_.anchor() = text_.cursor();
bv->owner()->view_state_changed();
bv->owner()->updateMenubar();
bv->owner()->updateToolbar();
- if (old_par != text_.cursor.par()) {
+ if (old_par != text_.cursor().par()) {
bv->owner()->setLayout(text_.cursorPar()->layout()->name());
- old_par = text_.cursor.par();
+ old_par = text_.cursor().par();
}
}
text->replaceSelectionWithString(replacestr);
text->setSelectionRange(replacestr.length());
- text->cursor = fw ? text->selEnd() : text->selStart();
+ text->cursor() = fw ? text->selEnd() : text->selStart();
bv->buffer()->markDirty();
find(bv, searchstr, cs, mw, fw);
keyseq.clear();
// copied verbatim from do_accent_char
view()->update();
- view()->getLyXText()->selection.cursor = view()->getLyXText()->cursor;
+ view()->getLyXText()->anchor() = view()->getLyXText()->cursor();
}
///
int cursorY(LyXCursor const & cursor) const;
+ /// the topmost cursor slice
+ LyXCursor & cursor();
+ /// the topmost cursor slice
+ LyXCursor const & cursor() const;
+ /// access to the selection anchor
+ LyXCursor & anchor();
+ /// access to the selection anchor
+ LyXCursor const & anchor() const;
+
+
public:
///
int height;
{
// allow only if at start or end, or all previous is new text
ParagraphList::iterator cpit = cursorPar();
- if (cursor.pos() && cursor.pos() != cpit->size()
- && cpit->isChangeEdited(0, cursor.pos()))
+ if (cursor().pos() && cursor().pos() != cpit->size()
+ && cpit->isChangeEdited(0, cursor().pos()))
return;
LyXTextClass const & tclass =
return;
// a layout change may affect also the following paragraph
- recUndo(cursor.par(), parOffset(undoSpan(cpit)) - 1);
+ recUndo(cursor().par(), parOffset(undoSpan(cpit)) - 1);
// Always break behind a space
// It is better to erase the space (Dekel)
- if (cursor.pos() < cpit->size() && cpit->isLineSeparator(cursor.pos()))
- cpit->erase(cursor.pos());
+ if (cursor().pos() < cpit->size() && cpit->isLineSeparator(cursor().pos()))
+ cpit->erase(cursor().pos());
// break the paragraph
if (keep_layout)
// but we can fix this in 1.3.0 (Jug 20020509)
bool const isempty = cpit->allowEmpty() && cpit->empty();
::breakParagraph(bv()->buffer()->params(), paragraphs, cpit,
- cursor.pos(), keep_layout);
+ cursor().pos(), keep_layout);
cpit = cursorPar();
ParagraphList::iterator next_par = boost::next(cpit);
// well this is the caption hack since one caption is really enough
if (layout->labeltype == LABEL_SENSITIVE) {
- if (!cursor.pos())
+ if (!cursor().pos())
// set to standard-layout
cpit->applyLayout(tclass.defaultLayout());
else
// move one row up!
// This touches only the screen-update. Otherwise we would may have
// an empty row on the screen
- RowList::iterator crit = cpit->getRow(cursor.pos());
- if (cursor.pos() && crit->pos() == cursor.pos()
- && !cpit->isNewline(cursor.pos() - 1))
+ RowList::iterator crit = cpit->getRow(cursor().pos());
+ if (cursor().pos() && crit->pos() == cursor().pos()
+ && !cpit->isNewline(cursor().pos() - 1))
{
cursorLeft(bv());
}
// This check is necessary. Otherwise the new empty paragraph will
// be deleted automatically. And it is more friendly for the user!
- if (cursor.pos() || isempty)
+ if (cursor().pos() || isempty)
setCursor(next_par, 0);
else
setCursor(cpit, 0);
{
clearSelection();
redoParagraph(cursorPar());
- setCursorIntern(cursor.par(), cursor.pos());
+ setCursorIntern(cursor().par(), cursor().pos());
}
// same Paragraph one to the right and make a rebreak
void LyXText::insertChar(char c)
{
- recordUndo(Undo::INSERT, this, cursor.par(), cursor.par());
+ recordUndo(Undo::INSERT, this, cursor().par(), cursor().par());
// When the free-spacing option is set for the current layout,
// disable the double-space checking
if (current_font.number() == LyXFont::ON) {
if (!IsDigit(c) && !contains(number_operators, c) &&
!(contains(number_seperators, c) &&
- cursor.pos() >= 1 &&
- cursor.pos() < cursorPar()->size() &&
- getFont(cursorPar(), cursor.pos()).number() == LyXFont::ON &&
- getFont(cursorPar(), cursor.pos() - 1).number() == LyXFont::ON)
+ cursor().pos() >= 1 &&
+ cursor().pos() < cursorPar()->size() &&
+ getFont(cursorPar(), cursor().pos()).number() == LyXFont::ON &&
+ getFont(cursorPar(), cursor().pos() - 1).number() == LyXFont::ON)
)
number(); // Set current_font.number to OFF
} else if (IsDigit(c) &&
real_current_font.isVisibleRightToLeft()) {
number(); // Set current_font.number to ON
- if (cursor.pos() > 0) {
- char const c = cursorPar()->getChar(cursor.pos() - 1);
+ if (cursor().pos() > 0) {
+ char const c = cursorPar()->getChar(cursor().pos() - 1);
if (contains(number_unary_operators, c) &&
- (cursor.pos() == 1 ||
- cursorPar()->isSeparator(cursor.pos() - 2) ||
- cursorPar()->isNewline(cursor.pos() - 2))
+ (cursor().pos() == 1 ||
+ cursorPar()->isSeparator(cursor().pos() - 2) ||
+ cursorPar()->isNewline(cursor().pos() - 2))
) {
setCharFont(
cursorPar(),
- cursor.pos() - 1,
+ cursor().pos() - 1,
current_font);
} else if (contains(number_seperators, c) &&
- cursor.pos() >= 2 &&
+ cursor().pos() >= 2 &&
getFont(
cursorPar(),
- cursor.pos() - 2).number() == LyXFont::ON) {
+ cursor().pos() - 2).number() == LyXFont::ON) {
setCharFont(
cursorPar(),
- cursor.pos() - 1,
+ cursor().pos() - 1,
current_font);
}
}
LyXFont rawtmpfont = current_font;
if (!freeSpacing && IsLineSeparatorChar(c)) {
- if ((cursor.pos() > 0
- && cursorPar()->isLineSeparator(cursor.pos() - 1))
- || (cursor.pos() > 0
- && cursorPar()->isNewline(cursor.pos() - 1))
- || (cursor.pos() == 0)) {
+ if ((cursor().pos() > 0
+ && cursorPar()->isLineSeparator(cursor().pos() - 1))
+ || (cursor().pos() > 0
+ && cursorPar()->isNewline(cursor().pos() - 1))
+ || (cursor().pos() == 0)) {
static bool sent_space_message = false;
if (!sent_space_message) {
- if (cursor.pos() == 0)
+ if (cursor().pos() == 0)
bv()->owner()->message(_("You cannot insert a space at the beginning of a paragraph. Please read the Tutorial."));
else
bv()->owner()->message(_("You cannot type two spaces this way. Please read the Tutorial."));
// Here case LyXText::InsertInset already inserted the character
if (c != Paragraph::META_INSET)
- cursorPar()->insertChar(cursor.pos(), c);
+ cursorPar()->insertChar(cursor().pos(), c);
- setCharFont(cursorPar(), cursor.pos(), rawtmpfont);
+ setCharFont(cursorPar(), cursor().pos(), rawtmpfont);
current_font = rawtmpfont;
real_current_font = realtmpfont;
redoParagraph(cursorPar());
- setCursor(cursor.par(), cursor.pos() + 1, false, cursor.boundary());
+ setCursor(cursor().par(), cursor().pos() + 1, false, cursor().boundary());
charInserted();
}
void LyXText::cursorRightOneWord()
{
- cursorRightOneWord(cursor);
- setCursor(cursorPar(), cursor.pos());
+ cursorRightOneWord(cursor());
+ setCursor(cursorPar(), cursor().pos());
}
// of prior word, not to end of next prior word.
void LyXText::cursorLeftOneWord()
{
- LyXCursor tmpcursor = cursor;
+ LyXCursor tmpcursor = cursor();
cursorLeftOneWord(tmpcursor);
setCursor(getPar(tmpcursor), tmpcursor.pos());
}
void LyXText::selectWord(word_location loc)
{
- LyXCursor from = cursor;
- LyXCursor to = cursor;
+ LyXCursor from = cursor();
+ LyXCursor to = cursor();
getWord(from, to, loc);
- if (cursor != from)
+ if (cursor() != from)
setCursor(from.par(), from.pos());
if (to == from)
return;
- selection.cursor = cursor;
+ anchor() = cursor();
setCursor(to.par(), to.pos());
setSelection();
}
if (cursorPar()->empty())
cursorRight(bv());
else {
- LyXCursor tmpcursor = cursor;
+ LyXCursor tmpcursor = cursor();
selection.set(true); // to avoid deletion
cursorRightOneWord();
setCursor(tmpcursor, tmpcursor.par(), tmpcursor.pos());
- selection.cursor = cursor;
- cursor = tmpcursor;
+ anchor() = cursor();
+ cursor() = tmpcursor;
setSelection();
cutSelection(true, false);
}
if (cursorPar()->empty())
cursorLeft(bv());
else {
- LyXCursor tmpcursor = cursor;
+ LyXCursor tmpcursor = cursor();
selection.set(true); // to avoid deletion
cursorLeftOneWord();
setCursor(tmpcursor, tmpcursor.par(), tmpcursor.pos());
- selection.cursor = cursor;
- cursor = tmpcursor;
+ anchor() = cursor();
+ cursor() = tmpcursor;
setSelection();
cutSelection(true, false);
}
// Paragraph is empty, so we just go to the right
cursorRight(bv());
} else {
- LyXCursor tmpcursor = cursor;
+ LyXCursor tmpcursor = cursor();
selection.set(true); // to avoid deletion
cursorEnd();
setCursor(tmpcursor, tmpcursor.par(), tmpcursor.pos());
- selection.cursor = cursor;
- cursor = tmpcursor;
+ anchor() = cursor();
+ cursor() = tmpcursor;
setSelection();
// What is this test for ??? (JMarc)
if (!selection.set())
from = selStart();
to = selEnd();
} else {
- from = cursor;
+ from = cursor();
getWord(from, to, lyx::PARTIAL_WORD);
setCursor(to.par(), to.pos() + 1);
}
void LyXText::Delete()
{
// this is a very easy implementation
- LyXCursor old_cursor = cursor;
+ LyXCursor old_cursor = cursor();
// just move to the right
cursorRight(true);
// 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()) {
recordUndo(Undo::DELETE, this, old_cursor.par());
backspace();
}
ParagraphList::iterator pit = cursorPar();
pos_type lastpos = pit->size();
- 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.
// left and let the DeleteEmptyParagraphMechanism
// handle the actual deletion of the paragraph.
- if (cursor.par()) {
+ if (cursor().par()) {
cursorLeft(bv());
// the layout things can change the height of a row !
redoParagraph();
}
}
- if (cursor.par() != 0)
- recordUndo(Undo::DELETE, this, cursor.par() - 1, cursor.par());
+ if (cursor().par() != 0)
+ recordUndo(Undo::DELETE, this, cursor().par() - 1, cursor().par());
ParagraphList::iterator tmppit = cursorPar();
// 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() != 0) {
+ if (cursor().par() != 0) {
// steps into the above paragraph.
- setCursorIntern(cursor.par() - 1,
- getPar(cursor.par() - 1)->size(),
+ setCursorIntern(cursor().par() - 1,
+ getPar(cursor().par() - 1)->size(),
false);
}
&& cpit->getAlign() == tmppit->getAlign()) {
mergeParagraph(bufparams, buf.paragraphs(), cpit);
- if (cursor.pos() && cpit->isSeparator(cursor.pos() - 1))
- cursor.pos(cursor.pos() - 1);
+ if (cursor().pos() && cpit->isSeparator(cursor().pos() - 1))
+ cursor().pos(cursor().pos() - 1);
// the counters may have changed
updateCounters();
- setCursor(cursor.par(), cursor.pos(), false);
+ setCursor(cursor().par(), cursor().pos(), false);
}
} else {
// this is the code for a normal backspace, not pasting
// any paragraphs
- recordUndo(Undo::DELETE, this, cursor.par());
+ recordUndo(Undo::DELETE, this, cursor().par());
// 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(cursor.par(), cursor.pos() - 1,
- false, cursor.boundary());
- cursorPar()->erase(cursor.pos());
+ setCursorIntern(cursor().par(), cursor().pos() - 1,
+ false, cursor().boundary());
+ cursorPar()->erase(cursor().pos());
}
lastpos = cursorPar()->size();
- if (cursor.pos() == lastpos)
+ if (cursor().pos() == lastpos)
setCurrentFont();
redoParagraph();
- setCursor(cursor.par(), cursor.pos(), false, cursor.boundary());
+ setCursor(cursor().par(), cursor().pos(), false, cursor().boundary());
}
ParagraphList::iterator LyXText::cursorPar() const
{
- return getPar(cursor.par());
+ return getPar(cursor().par());
}
RowList::iterator LyXText::cursorRow() const
{
- return cursorPar()->getRow(cursor.pos());
+ return cursorPar()->getRow(cursor().pos());
}
void LyXText::fullRebreak()
{
redoParagraphs(paragraphs().begin(), paragraphs().end());
- selection.cursor = cursor;
+ anchor() = cursor();
}
}
-void LyXText::cursorLeftOneWord(LyXCursor & cursor)
+void LyXText::cursorLeftOneWord(LyXCursor & cur)
{
// treat HFills, floats and Insets as words
ParagraphList::iterator pit = cursorPar();
- size_t pos = cursor.pos();
+ size_t pos = cur.pos();
while (pos &&
(pit->isSeparator(pos - 1) ||
--pos;
}
- cursor.par(parOffset(pit));
- cursor.pos(pos);
+ cur.par(parOffset(pit));
+ cur.pos(pos);
}
-void LyXText::cursorRightOneWord(LyXCursor & cursor)
+void LyXText::cursorRightOneWord(LyXCursor & cur)
{
// treat floats, HFills and Insets as words
ParagraphList::iterator pit = cursorPar();
- pos_type pos = cursor.pos();
+ pos_type pos = cur.pos();
if (pos == pit->size() &&
boost::next(pit) != paragraphs().end()) {
}
}
- cursor.par(parOffset(pit));
- cursor.pos(pos);
+ cur.par(parOffset(pit));
+ cur.pos(pos);
}
int LyXText::cursorX() const
{
- return cursorX(cursor);
+ return cursorX(cursor());
}
int LyXText::cursorY() const
{
- return cursorY(cursor);
+ return cursorY(cursor());
}
return par.y + row.y_offset() + row.baseline();
}
+
+LyXCursor & LyXText::cursor()
+{
+ return cursor_;
+}
+
+
+LyXCursor const & LyXText::cursor() const
+{
+ return cursor_;
+}
+
+
+LyXCursor & LyXText::anchor()
+{
+ return anchor_;
+}
+
+
+LyXCursor const & LyXText::anchor() const
+{
+ return anchor_;
+}
+
+
redoParagraphs(beg, end);
setCursorIntern(0, 0);
- selection.cursor = cursor;
+ anchor() = cursor();
updateCounters();
}
InsetOld * LyXText::getInset() const
{
ParagraphList::iterator pit = cursorPar();
- pos_type const pos = cursor.pos();
+ pos_type const pos = cursor().pos();
if (pos < pit->size() && pit->isInset(pos)) {
return pit->getInset(pos);
// do we want to keep this?? (JMarc)
if (!isHighlyEditableInset(inset))
- recUndo(cursor.par());
+ recUndo(cursor().par());
if (inset->isOpen())
inset->close();
if (!selection.set()) {
// Determine basis font
LyXFont layoutfont;
- if (cursor.pos() < cursorPar()->beginOfBody())
+ if (cursor().pos() < cursorPar()->beginOfBody())
layoutfont = getLabelFont(cursorPar());
else
layoutfont = getLayoutFont(cursorPar());
void LyXText::cursorHome()
{
ParagraphList::iterator cpit = cursorPar();
- setCursor(cpit, cpit->getRow(cursor.pos())->pos());
+ setCursor(cpit, cpit->getRow(cursor().pos())->pos());
}
void LyXText::cursorEnd()
{
ParagraphList::iterator cpit = cursorPar();
- pos_type end = cpit->getRow(cursor.pos())->endpos();
+ pos_type end = cpit->getRow(cursor().pos())->endpos();
// if not on the last row of the par, put the cursor before
// the final space
setCursor(cpit, end == cpit->size() ? end : end - 1);
// Try implicit word selection
// If there is a change in the language the implicit word selection
// is disabled.
- LyXCursor resetCursor = cursor;
+ LyXCursor resetCursor = cursor();
bool implicitSelection =
font.language() == ignore_language
&& font.number() == LyXFont::IGNORE
//and cursor is set to the original position.
if (implicitSelection) {
clearSelection();
- cursor = resetCursor;
- selection.cursor = cursor;
+ cursor() = resetCursor;
+ anchor() = cursor();
}
}
// Try implicit word selection
// If there is a change in the language the implicit word selection
// is disabled.
- LyXCursor const reset_cursor = cursor;
+ LyXCursor const reset_cursor = cursor();
bool const implicitSelection =
selectWordWhenUnderCursor(lyx::PREVIOUS_WORD);
idxstring = selectionAsString(*bv()->buffer(), false);
// Reset cursors to their original position.
- cursor = reset_cursor;
- selection.cursor = cursor;
+ cursor() = reset_cursor;
+ anchor() = cursor();
// Clear the implicit selection.
if (implicitSelection)
if (!cursorPar()->insetAllowed(inset->lyxCode()))
return;
- recUndo(cursor.par());
+ recUndo(cursor().par());
freezeUndo();
- cursorPar()->insertInset(cursor.pos(), inset);
+ cursorPar()->insertInset(cursor().pos(), inset);
// Just to rebreak and refresh correctly.
// The character will not be inserted a second time
insertChar(Paragraph::META_INSET);
// cutSelection can invalidate the cursor so we need to set
// it anew. (Lgb)
// we prefer the end for when tracking changes
- cursor.pos(endpos);
- cursor.par(parOffset(endpit));
+ cursor().pos(endpos);
+ cursor().par(parOffset(endpit));
// need a valid cursor. (Lgb)
clearSelection();
if (!CutAndPaste::checkPastePossible())
return;
- recUndo(cursor.par());
+ recUndo(cursor().par());
ParagraphList::iterator endpit;
PitPosPair ppp;
boost::tie(ppp, endpit) =
CutAndPaste::pasteSelection(*bv()->buffer(),
paragraphs(),
- cursorPar(), cursor.pos(),
+ cursorPar(), cursor().pos(),
bv()->buffer()->params().textclass,
sel_index, el);
bufferErrors(*bv()->buffer(), el);
clearSelection();
- selection.cursor = cursor;
+ anchor() = cursor();
setCursor(ppp.first, ppp.second);
setSelection();
updateCounters();
if (!length)
return;
- selection.cursor = cursor;
+ anchor() = cursor();
while (length--)
cursorRight(true);
setSelection();
// simple replacing. The font of the first selected character is used
void LyXText::replaceSelectionWithString(string const & str)
{
- recUndo(cursor.par());
+ recUndo(cursor().par());
freezeUndo();
// Get font setting before we cut
void LyXText::insertStringAsLines(string const & str)
{
ParagraphList::iterator pit = cursorPar();
- pos_type pos = cursor.pos();
+ pos_type pos = cursor().pos();
ParagraphList::iterator endpit = boost::next(cursorPar());
- recUndo(cursor.par());
+ recUndo(cursor().par());
// only to be sure, should not be neccessary
clearSelection();
bv()->buffer()->insertStringAsLines(pit, pos, current_font, str);
redoParagraphs(cursorPar(), endpit);
- selection.cursor = cursor;
+ anchor() = cursor();
setCursor(pit, pos);
setSelection();
}
bool LyXText::setCursor(paroffset_type par, pos_type pos, bool setfont,
bool boundary)
{
- LyXCursor old_cursor = cursor;
+ LyXCursor old_cursor = cursor();
setCursorIntern(par, pos, setfont, boundary);
return deleteEmptyParagraphMechanism(old_cursor);
}
void LyXText::setCursorIntern(paroffset_type par,
pos_type pos, bool setfont, bool boundary)
{
- setCursor(cursor, par, pos, boundary);
+ setCursor(cursor(), par, pos, boundary);
bv()->x_target(cursorX() + xo_);
if (setfont)
setCurrentFont();
void LyXText::setCurrentFont()
{
- pos_type pos = cursor.pos();
+ pos_type pos = cursor().pos();
ParagraphList::iterator pit = cursorPar();
- if (cursor.boundary() && pos > 0)
+ if (cursor().boundary() && pos > 0)
--pos;
if (pos > 0) {
current_font = pit->getFontSettings(bufparams, pos);
real_current_font = getFont(pit, pos);
- if (cursor.pos() == pit->size() &&
- bidi.isBoundary(*bv()->buffer(), *pit, cursor.pos()) &&
- !cursor.boundary()) {
+ if (cursor().pos() == pit->size() &&
+ bidi.isBoundary(*bv()->buffer(), *pit, cursor().pos()) &&
+ !cursor().boundary()) {
Language const * lang =
pit->getParLanguage(bufparams);
current_font.setLanguage(lang);
void LyXText::setCursorFromCoordinates(int x, int y)
{
- LyXCursor old_cursor = cursor;
- setCursorFromCoordinates(cursor, x, y);
+ LyXCursor old_cursor = cursor();
+ setCursorFromCoordinates(cursor(), x, y);
setCurrentFont();
deleteEmptyParagraphMechanism(old_cursor);
}
bool LyXText::checkAndActivateInset(bool front)
{
- if (cursor.pos() == cursorPar()->size())
+ if (cursor().pos() == cursorPar()->size())
return false;
- InsetOld * inset = cursorPar()->getInset(cursor.pos());
+ InsetOld * inset = cursorPar()->getInset(cursor().pos());
if (!isHighlyEditableInset(inset))
return false;
inset->edit(bv(), front);
{
ParagraphList::iterator c_par = cursorPar();
if (boost::next(c_par) == paragraphs().end()
- && cursor.pos() >= c_par->size())
+ && cursor().pos() >= c_par->size())
return DispatchResult(false, FINISHED_RIGHT);
if (activate_inset && checkAndActivateInset(front))
return DispatchResult(true, true);
DispatchResult LyXText::moveLeftIntern(bool front,
bool activate_inset, bool selecting)
{
- if (cursor.par() == 0 && cursor.pos() <= 0)
+ if (cursor().par() == 0 && cursor().pos() <= 0)
return DispatchResult(false, FINISHED);
cursorLeft(true);
if (!selecting)
bool LyXText::cursorLeft(bool internal)
{
- if (cursor.pos() > 0) {
- bool boundary = cursor.boundary();
- setCursor(cursor.par(), cursor.pos() - 1, true, false);
+ if (cursor().pos() > 0) {
+ bool boundary = cursor().boundary();
+ setCursor(cursor().par(), cursor().pos() - 1, true, false);
if (!internal && !boundary &&
- bidi.isBoundary(*bv()->buffer(), *cursorPar(), cursor.pos() + 1))
- setCursor(cursor.par(), cursor.pos() + 1, true, true);
+ bidi.isBoundary(*bv()->buffer(), *cursorPar(), cursor().pos() + 1))
+ setCursor(cursor().par(), cursor().pos() + 1, true, true);
return true;
}
- if (cursor.par() != 0) {
+ if (cursor().par() != 0) {
// steps into the paragraph above
- setCursor(cursor.par() - 1, boost::prior(cursorPar())->size());
+ setCursor(cursor().par() - 1, boost::prior(cursorPar())->size());
return true;
}
bool LyXText::cursorRight(bool internal)
{
- if (!internal && cursor.boundary()) {
- setCursor(cursor.par(), cursor.pos(), true, false);
+ if (!internal && cursor().boundary()) {
+ setCursor(cursor().par(), cursor().pos(), true, false);
return true;
}
- if (cursor.pos() != cursorPar()->size()) {
- setCursor(cursor.par(), cursor.pos() + 1, true, false);
+ if (cursor().pos() != cursorPar()->size()) {
+ setCursor(cursor().par(), cursor().pos() + 1, true, false);
if (!internal && bidi.isBoundary(*bv()->buffer(), *cursorPar(),
- cursor.pos()))
- setCursor(cursor.par(), cursor.pos(), true, true);
+ cursor().pos()))
+ setCursor(cursor().par(), cursor().pos(), true, true);
return true;
}
- if (cursor.par() + 1 != int(paragraphs().size())) {
- setCursor(cursor.par() + 1, 0);
+ if (cursor().par() + 1 != int(paragraphs().size())) {
+ setCursor(cursor().par() + 1, 0);
return true;
}
void LyXText::cursorUpParagraph()
{
ParagraphList::iterator cpit = cursorPar();
- if (cursor.pos() > 0)
+ if (cursor().pos() > 0)
setCursor(cpit, 0);
else if (cpit != paragraphs().begin())
setCursor(boost::prior(cpit), 0);
// MISSING
// If the pos around the old_cursor were spaces, delete one of them.
- if (old_cursor.par() != cursor.par()
- || old_cursor.pos() != cursor.pos()) {
+ if (old_cursor.par() != cursor().par()
+ || old_cursor.pos() != cursor().pos()) {
// Only if the cursor has really moved
if (old_cursor.pos() > 0
// automated way in LyXCursor code. (JMarc 26/09/2001)
#endif
// correct all cursors held by the LyXText
- fixCursorAfterDelete(cursor, old_cursor);
- fixCursorAfterDelete(selection.cursor, old_cursor);
+ fixCursorAfterDelete(cursor(), old_cursor);
+ fixCursorAfterDelete(anchor(), old_cursor);
return false;
}
}
return false;
// only do our magic if we changed paragraph
- if (old_cursor.par() == cursor.par())
+ if (old_cursor.par() == cursor().par())
return false;
// record if we have deleted a paragraph
deleted = true;
bool selection_position_was_oldcursor_position =
- selection.cursor.par() == old_cursor.par()
- && selection.cursor.pos() == old_cursor.pos();
+ anchor().par() == old_cursor.par()
+ && anchor().pos() == old_cursor.pos();
- tmpcursor = cursor;
- cursor = old_cursor; // that undo can restore the right cursor position
+ tmpcursor = cursor();
+ cursor() = old_cursor; // that undo can restore the right cursor position
ParagraphList::iterator endpit = boost::next(old_pit);
while (endpit != paragraphs().end() && endpit->getDepth())
++endpit;
recUndo(parOffset(old_pit), parOffset(endpit) - 1);
- cursor = tmpcursor;
+ cursor() = tmpcursor;
// cache cursor pit
ParagraphList::iterator tmppit = cursorPar();
// delete old par
paragraphs().erase(old_pit);
// update cursor par offset
- cursor.par(parOffset(tmppit));
+ cursor().par(parOffset(tmppit));
redoParagraph();
if (selection_position_was_oldcursor_position) {
// correct selection
- selection.cursor = cursor;
+ anchor() = cursor();
}
}
if (old_pit->stripLeadingSpaces()) {
redoParagraph(old_pit);
- selection.cursor = cursor;
+ anchor() = cursor();
}
return false;
}
if (font.language() != ignore_language ||
font.number() != LyXFont::IGNORE) {
- LyXCursor & cursor = text->cursor;
+ LyXCursor & cur = text->cursor();
Paragraph & par = *text->cursorPar();
text->bidi.computeTables(par, *bv->buffer(),
- *par.getRow(cursor.pos()));
- if (cursor.boundary() !=
+ *par.getRow(cur.pos()));
+ if (cur.boundary() !=
text->bidi.isBoundary(*bv->buffer(), par,
- cursor.pos(),
+ cur.pos(),
text->real_current_font))
- text->setCursor(cursor.par(), cursor.pos(),
- false, !cursor.boundary());
+ text->setCursor(cur.par(), cur.pos(),
+ false, !cur.boundary());
}
}
LyXText * lt = bv->getLyXText();
// if (!lt->selection.set())
-// lt->selection.cursor = lt->cursor;
+// lt->selection.cursor = lt->cursor();
if (selecting || lt->selection.mark())
lt->setSelection();
{
ParagraphList::iterator end = paragraphs().end();
ParagraphList::iterator pit = cursorPar();
- pos_type pos = cursor.pos();
+ pos_type pos = cursor().pos();
InsetOld * inset;
do {
clearSelection();
string contents;
- if (same_content && cursor.pos() < cursorPar()->size()
- && cursorPar()->isInset(cursor.pos())) {
- InsetOld const * inset = cursorPar()->getInset(cursor.pos());
+ if (same_content && cursor().pos() < cursorPar()->size()
+ && cursorPar()->isInset(cursor().pos())) {
+ InsetOld const * inset = cursorPar()->getInset(cursor().pos());
if (find(codes.begin(), codes.end(), inset->lyxCode())
!= codes.end())
contents = static_cast<InsetCommand const *>(inset)->getContents();
}
if (!gotoNextInset(codes, contents)) {
- if (cursor.pos() || cursorPar() != paragraphs().begin()) {
- LyXCursor tmp = cursor;
- cursor.par(0);
- cursor.pos(0);
+ if (cursor().pos() || cursorPar() != paragraphs().begin()) {
+ LyXCursor tmp = cursor();
+ cursor().par(0);
+ cursor().pos(0);
if (!gotoNextInset(codes, contents)) {
- cursor = tmp;
+ cursor() = tmp;
bv()->owner()->message(_("No more insets"));
}
} else {
}
}
bv()->update();
- selection.cursor = cursor;
+ anchor() = cursor();
}
case LFUN_RIGHTSEL:
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
if (rtl())
cursorLeft(bv);
else
case LFUN_LEFTSEL:
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
if (rtl())
cursorRight(bv);
else
case LFUN_UPSEL:
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
cursorUp(true);
finishChange(bv, true);
break;
case LFUN_DOWNSEL:
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
cursorDown(true);
finishChange(bv, true);
break;
case LFUN_UP_PARAGRAPHSEL:
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
cursorUpParagraph();
finishChange(bv, true);
break;
case LFUN_DOWN_PARAGRAPHSEL:
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
cursorDownParagraph();
finishChange(bv, true);
break;
case LFUN_PRIORSEL:
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
cursorPrevious();
finishChange(bv, true);
break;
case LFUN_NEXTSEL:
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
cursorNext();
finishChange(bv, true);
break;
case LFUN_HOMESEL:
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
cursorHome();
finishChange(bv, true);
break;
case LFUN_ENDSEL:
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
cursorEnd();
finishChange(bv, true);
break;
break;
case LFUN_WORDSEL: {
- LyXCursor cur1 = cursor;
+ LyXCursor cur1 = cursor();
LyXCursor cur2;
getWord(cur1, cur2, lyx::WHOLE_WORD);
setCursor(cur1.par(), cur1.pos());
lyx::pos_type body = cursorPar()->beginOfBody();
// Not allowed by LaTeX (labels or empty par)
- if (cursor.pos() <= body)
+ if (cursor().pos() <= body)
break;
replaceSelection(bv->getLyXText());
case LFUN_DELETE:
if (!selection.set()) {
Delete();
- selection.cursor = cursor;
+ anchor() = cursor();
// It is possible to make it a lot faster still
// just comment out the line below...
} else {
case LFUN_DELETE_SKIP:
// Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
if (!selection.set()) {
- if (cursor.pos() == cursorPar()->size()) {
+ if (cursor().pos() == cursorPar()->size()) {
cursorRight(bv);
cursorLeft(bv);
Delete();
- selection.cursor = cursor;
+ anchor() = cursor();
} else {
Delete();
- selection.cursor = cursor;
+ anchor() = cursor();
}
} else {
cutSelection(true, false);
if (!selection.set()) {
if (bv->owner()->getIntl().getTransManager().backspace()) {
backspace();
- selection.cursor = cursor;
+ anchor() = cursor();
// It is possible to make it a lot faster still
// just comment out the line below...
}
case LFUN_BACKSPACE_SKIP:
// Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
if (!selection.set()) {
- LyXCursor cur = cursor;
+ LyXCursor cur = cursor();
backspace();
- selection.cursor = cur;
+ anchor() = cur;
} else {
cutSelection(true, false);
}
replaceSelection(bv->getLyXText());
breakParagraph(bv->buffer()->paragraphs(), 0);
bv->update();
- selection.cursor = cursor;
+ anchor() = cursor();
bv->switchKeyMap();
bv->owner()->view_state_changed();
break;
replaceSelection(bv->getLyXText());
breakParagraph(bv->buffer()->paragraphs(), 1);
bv->update();
- selection.cursor = cursor;
+ anchor() = cursor();
bv->switchKeyMap();
bv->owner()->view_state_changed();
break;
// When at the beginning of a paragraph, remove
// indentation and add a "defskip" at the top.
// Otherwise, do the same as LFUN_BREAKPARAGRAPH.
- LyXCursor cur = cursor;
+ LyXCursor cur = cursor();
replaceSelection(bv->getLyXText());
if (cur.pos() == 0) {
ParagraphParameters & params = getPar(cur)->params();
breakParagraph(bv->buffer()->paragraphs(), 0);
}
bv->update();
- selection.cursor = cur;
+ anchor() = cur;
bv->switchKeyMap();
bv->owner()->view_state_changed();
break;
case LFUN_MARK_OFF:
clearSelection();
bv->update();
- selection.cursor = cursor;
+ anchor() = cursor();
cmd.message(N_("Mark off"));
break;
clearSelection();
selection.mark(true);
bv->update();
- selection.cursor = cursor;
+ anchor() = cursor();
cmd.message(N_("Mark on"));
break;
selection.mark(true);
cmd.message(N_("Mark set"));
}
- selection.cursor = cursor;
+ anchor() = cursor();
bv->update();
break;
break;
case LFUN_TRANSPOSE_CHARS:
- recUndo(cursor.par());
+ recUndo(cursor().par());
redoParagraph();
bv->update();
break;
if (in_inset_)
return DispatchResult(false);
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
cursorTop();
finishChange(bv, true);
break;
if (in_inset_)
return DispatchResult(false);
if (!selection.set())
- selection.cursor = cursor;
+ anchor() = cursor();
cursorBottom();
finishChange(bv, true);
break;
case LFUN_QUOTE: {
replaceSelection(bv->getLyXText());
ParagraphList::iterator pit = cursorPar();
- lyx::pos_type pos = cursor.pos();
+ lyx::pos_type pos = cursor().pos();
char c;
if (!pos)
c = ' ';
for (int i = 0; i < datetmp_len; i++)
insertChar(datetmp[i]);
- selection.cursor = cursor;
+ anchor() = cursor();
moveCursor(bv, false);
break;
}
if (cmd.button() == mouse_button::button1) {
selection_possible = true;
cursorHome();
- selection.cursor = cursor;
+ anchor() = cursor();
cursorEnd();
setSelection();
bv->haveSelection(selection.set());
}
setCursorFromCoordinates(cmd.x, cmd.y);
- selection.cursor = cursor;
+ anchor() = cursor();
finishUndo();
bv->x_target(cursorX() + xo_);
bv->owner()->getIntl().getTransManager().
TranslateAndInsert(*cit, this);
- selection.cursor = cursor;
+ anchor() = cursor();
moveCursor(bv, false);
// real_current_font.number can change so we need to
*/
#include <config.h>
-#include <algorithm>
#include "textcursor.h"
LyXCursor const & TextCursor::selStart() const
{
if (!selection.set())
- return cursor;
- return std::min(selection.cursor, cursor);
+ return cursor_;
+ // can't use std::min as this creates a new object
+ return anchor_ < cursor_ ? anchor_ : cursor_;
}
LyXCursor const & TextCursor::selEnd() const
{
if (!selection.set())
- return cursor;
- return std::max(selection.cursor, cursor);
+ return cursor_;
+ return anchor_ > cursor_ ? anchor_ : cursor_;
}
LyXCursor & TextCursor::selStart()
{
- TextCursor const & t = *this;
- return const_cast<LyXCursor &>(t.selStart());
+ if (!selection.set())
+ return cursor_;
+ return anchor_ < cursor_ ? anchor_ : cursor_;
}
LyXCursor & TextCursor::selEnd()
{
- TextCursor const & t = *this;
- return const_cast<LyXCursor &>(t.selEnd());
+ if (!selection.set())
+ return cursor_;
+ return anchor_ > cursor_ ? anchor_ : cursor_;
}
{
selection.set(true);
// a selection with no contents is not a selection
- if (cursor.par() == selection.cursor.par() &&
- cursor.pos() == selection.cursor.pos())
- {
+ if (cursor_.par() == anchor_.par() && cursor_.pos() == anchor_.pos())
selection.set(false);
- }
}
{
selection.set(false);
selection.mark(false);
- selection.cursor = cursor;
+ anchor_ = cursor_;
}
void mark(bool m) {
mark_ = m;
}
- LyXCursor cursor; // the other end of the selection
private:
bool set_; // former selection
bool mark_; // former mark_set
void clearSelection();
// actual cursor position
- LyXCursor cursor;
+ LyXCursor cursor_;
+ // the other end of the selection
+ LyXCursor anchor_;
Selection selection;
int textnum;
ParIterator pit = text2pit(buf, text, textnum);
stack.push(Undo(kind, textnum, pit.index(),
- first_par, end_par, text->cursor.par(), text->cursor.pos()));
+ first_par, end_par, text->cursor().par(), text->cursor().pos()));
lyxerr << "undo record: " << stack.top() << std::endl;
// record the relevant paragraphs
<< std::endl;
// set cursor again to force the position to be the right one
- text->cursor.par(undo.cursor_par);
- text->cursor.pos(undo.cursor_pos);
+ text->cursor().par(undo.cursor_par);
+ text->cursor().pos(undo.cursor_pos);
// clear any selection
text->clearSelection();
- text->selection.cursor = text->cursor;
+ text->anchor() = text->cursor();
text->updateCounters();
// rebreak the entire lyxtext
otherstack.top().pars.insert(otherstack.top().pars.begin(), first, last);
}
LyXText * text = pit.text(buf);
- otherstack.top().cursor_pos = text->cursor.pos();
- otherstack.top().cursor_par = text->cursor.par();
+ otherstack.top().cursor_pos = text->cursor().pos();
+ otherstack.top().cursor_par = text->cursor().par();
lyxerr << " undo other: " << otherstack.top() << std::endl;
}
void recordUndo(BufferView * bv, Undo::undo_kind kind)
{
- recordUndo(kind, bv->text(), bv->text()->cursor.par());
+ recordUndo(kind, bv->text(), bv->text()->cursor().par());
}