move selStart and selEnd from LyXText to BufferView

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8344 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2004-01-14 15:09:01 +00:00
parent 4eb75f09eb
commit 6238e20d09
9 changed files with 110 additions and 112 deletions

View File

@ -518,3 +518,36 @@ void BufferView::resetAnchor()
{ {
return fullCursor().resetAnchor(); return fullCursor().resetAnchor();
} }
CursorSlice const & BufferView::selStart() const
{
if (!selection().set())
return cursor();
// can't use std::min as this creates a new object
return anchor() < cursor() ? anchor() : cursor();
}
CursorSlice const & BufferView::selEnd() const
{
if (!selection().set())
return cursor();
return anchor() > cursor() ? anchor() : cursor();
}
CursorSlice & BufferView::selStart()
{
if (!selection().set())
return cursor();
return anchor() < cursor() ? anchor() : cursor();
}
CursorSlice & BufferView::selEnd()
{
if (selection().set())
return cursor();
return anchor() > cursor() ? anchor() : cursor();
}

View File

@ -233,6 +233,14 @@ public:
Selection & selection(); Selection & selection();
/// ///
Selection const & selection() const; Selection const & selection() const;
///
CursorSlice & selStart();
///
CursorSlice const & selStart() const;
///
CursorSlice & selEnd();
///
CursorSlice const & selEnd() const;
/// ///
Selection selection_; Selection selection_;

View File

@ -395,10 +395,10 @@ void BufferView::Pimpl::resizeCurrentBuffer()
par = bv_->cursor().par(); par = bv_->cursor().par();
pos = bv_->cursor().pos(); pos = bv_->cursor().pos();
selstartpar = text->selStart().par(); selstartpar = bv_->selStart().par();
selstartpos = text->selStart().pos(); selstartpos = bv_->selStart().pos();
selendpar = text->selEnd().par(); selendpar = bv_->selEnd().par();
selendpos = text->selEnd().pos(); selendpos = bv_->selEnd().pos();
sel = bv_->selection().set(); sel = bv_->selection().set();
mark_set = bv_->selection().mark(); mark_set = bv_->selection().mark();
text->textwidth_ = bv_->workWidth(); text->textwidth_ = bv_->workWidth();
@ -637,8 +637,8 @@ Change const BufferView::Pimpl::getCurrentChange()
if (!bv_->selection().set()) if (!bv_->selection().set())
return Change(Change::UNCHANGED); return Change(Change::UNCHANGED);
return text->getPar(text->selStart()) return text->getPar(bv_->selStart())
->lookupChangeFull(text->selStart().pos()); ->lookupChangeFull(bv_->selStart().pos());
} }

View File

@ -394,8 +394,7 @@ int replace(BufferView * bv,
text->replaceSelectionWithString(replacestr); text->replaceSelectionWithString(replacestr);
text->setSelectionRange(replacestr.length()); text->setSelectionRange(replacestr.length());
text->cursor() = fw ? text->selEnd() : text->selStart(); bv->cursor() = fw ? bv->selEnd() : bv->selStart();
bv->buffer()->markDirty(); bv->buffer()->markDirty();
find(bv, searchstr, cs, mw, fw); find(bv, searchstr, cs, mw, fw);
bv->update(); bv->update();

View File

@ -409,15 +409,6 @@ public:
void setSelection(); void setSelection();
/// ///
void clearSelection(); void clearSelection();
///
CursorSlice & selStart();
///
CursorSlice const & selStart() const;
///
CursorSlice & selEnd();
///
CursorSlice const & selEnd() const;
public: public:
/// ///

View File

@ -391,14 +391,14 @@ void RowPainter::paintSelection()
bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params()); bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params());
// the current selection // the current selection
int const startx = text_.cursorX(text_.selStart()); int const startx = text_.cursorX(bv_.selStart());
int const endx = text_.cursorX(text_.selEnd()); int const endx = text_.cursorX(bv_.selEnd());
int const starty = text_.cursorY(text_.selStart()); int const starty = text_.cursorY(bv_.selStart());
int const endy = text_.cursorY(text_.selEnd()); int const endy = text_.cursorY(bv_.selEnd());
ParagraphList::iterator startpit = text_.getPar(text_.selStart()); ParagraphList::iterator startpit = text_.getPar(bv_.selStart());
ParagraphList::iterator endpit = text_.getPar(text_.selEnd()); ParagraphList::iterator endpit = text_.getPar(bv_.selEnd());
RowList::iterator startrow = startpit->getRow(text_.selStart().pos()); RowList::iterator startrow = startpit->getRow(bv_.selStart().pos());
RowList::iterator endrow = endpit->getRow(text_.selEnd().pos()); RowList::iterator endrow = endpit->getRow(bv_.selEnd().pos());
int const h = row_.height(); int const h = row_.height();
int const row_y = pit_->y + row_.y_offset(); int const row_y = pit_->y + row_.y_offset();
@ -468,9 +468,9 @@ void RowPainter::paintSelection()
} }
if (((startpit != pit_ && startrow != rit_) if (((startpit != pit_ && startrow != rit_)
|| text_.selStart().pos() <= pos) && || bv_.selStart().pos() <= pos) &&
((endpit != pit_ && endrow != rit_) ((endpit != pit_ && endrow != rit_)
|| pos < text_.selEnd().pos())) { || pos < bv_.selEnd().pos())) {
// Here we do not use x_ as xo_ was added to x_. // Here we do not use x_ as xo_ was added to x_.
pain_.fillRectangle(int(old_tmpx), yo_, pain_.fillRectangle(int(old_tmpx), yo_,
int(tmpx - old_tmpx + 1), h, LColor::selection); int(tmpx - old_tmpx + 1), h, LColor::selection);

View File

@ -1127,9 +1127,9 @@ void LyXText::acceptChange()
if (!bv()->selection().set() && cursorPar()->size()) if (!bv()->selection().set() && cursorPar()->size())
return; return;
if (selStart().par() == selEnd().par()) { if (bv()->selStart().par() == bv()->selEnd().par()) {
CursorSlice const & startc = selStart(); CursorSlice const & startc = bv()->selStart();
CursorSlice const & endc = selEnd(); CursorSlice const & endc = bv()->selEnd();
recordUndo(Undo::INSERT, this, startc.par()); recordUndo(Undo::INSERT, this, startc.par());
getPar(startc)->acceptChange(startc.pos(), endc.pos()); getPar(startc)->acceptChange(startc.pos(), endc.pos());
finishUndo(); finishUndo();
@ -1146,9 +1146,9 @@ void LyXText::rejectChange()
if (!bv()->selection().set() && cursorPar()->size()) if (!bv()->selection().set() && cursorPar()->size())
return; return;
if (selStart().par() == selEnd().par()) { if (bv()->selStart().par() == bv()->selEnd().par()) {
CursorSlice const & startc = selStart(); CursorSlice const & startc = bv()->selStart();
CursorSlice const & endc = selEnd(); CursorSlice const & endc = bv()->selEnd();
recordUndo(Undo::INSERT, this, startc.par()); recordUndo(Undo::INSERT, this, startc.par());
getPar(startc)->rejectChange(startc.pos(), endc.pos()); getPar(startc)->rejectChange(startc.pos(), endc.pos());
finishUndo(); finishUndo();
@ -1225,8 +1225,8 @@ void LyXText::changeCase(LyXText::TextCase action)
CursorSlice to; CursorSlice to;
if (bv()->selection().set()) { if (bv()->selection().set()) {
from = selStart(); from = bv()->selStart();
to = selEnd(); to = bv()->selEnd();
} else { } else {
from = cursor(); from = cursor();
getWord(from, to, lyx::PARTIAL_WORD); getWord(from, to, lyx::PARTIAL_WORD);
@ -1511,10 +1511,10 @@ string LyXText::selectionAsString(Buffer const & buffer, bool label) const
return string(); return string();
// should be const ... // should be const ...
ParagraphList::iterator startpit = getPar(selStart()); ParagraphList::iterator startpit = getPar(bv()->selStart());
ParagraphList::iterator endpit = getPar(selEnd()); ParagraphList::iterator endpit = getPar(bv()->selEnd());
size_t const startpos = selStart().pos(); size_t const startpos = bv()->selStart().pos();
size_t const endpos = selEnd().pos(); size_t const endpos = bv()->selEnd().pos();
if (startpit == endpit) if (startpit == endpit)
return startpit->asString(buffer, startpos, endpos, label); return startpit->asString(buffer, startpos, endpos, label);
@ -1959,39 +1959,6 @@ CursorSlice const & LyXText::anchor() const
} }
CursorSlice const & LyXText::selStart() const
{
if (!bv()->selection().set())
return cursor();
// can't use std::min as this creates a new object
return anchor() < cursor() ? anchor() : cursor();
}
CursorSlice const & LyXText::selEnd() const
{
if (!bv()->selection().set())
return cursor();
return anchor() > cursor() ? anchor() : cursor();
}
CursorSlice & LyXText::selStart()
{
if (!bv()->selection().set())
return cursor();
return anchor() < cursor() ? anchor() : cursor();
}
CursorSlice & LyXText::selEnd()
{
if (!bv()->selection().set())
return cursor();
return anchor() > cursor() ? anchor() : cursor();
}
void LyXText::setSelection() void LyXText::setSelection()
{ {
bv()->selection().set(true); bv()->selection().set(true);

View File

@ -333,8 +333,8 @@ void LyXText::setLayout(string const & layout)
return; return;
} }
ParagraphList::iterator start = getPar(selStart().par()); ParagraphList::iterator start = getPar(bv()->selStart().par());
ParagraphList::iterator end = boost::next(getPar(selEnd().par())); ParagraphList::iterator end = boost::next(getPar(bv()->selEnd().par()));
ParagraphList::iterator endpit = setLayout(start, end, layout); ParagraphList::iterator endpit = setLayout(start, end, layout);
redoParagraphs(start, endpit); redoParagraphs(start, endpit);
@ -353,8 +353,8 @@ void getSelectionSpan(LyXText & text,
beg = text.cursorPar(); beg = text.cursorPar();
end = boost::next(beg); end = boost::next(beg);
} else { } else {
beg = text.getPar(text.selStart()); beg = text.getPar(text.bv()->selStart());
end = boost::next(text.getPar(text.selEnd())); end = boost::next(text.getPar(text.bv()->selEnd()));
} }
} }
@ -448,14 +448,14 @@ void LyXText::setFont(LyXFont const & font, bool toggleall)
} }
// ok we have a selection. // ok we have a selection.
recUndo(selStart().par(), selEnd().par()); recUndo(bv()->selStart().par(), bv()->selEnd().par());
freezeUndo(); freezeUndo();
ParagraphList::iterator beg = getPar(selStart().par()); ParagraphList::iterator beg = getPar(bv()->selStart().par());
ParagraphList::iterator end = getPar(selEnd().par()); ParagraphList::iterator end = getPar(bv()->selEnd().par());
PosIterator pos(&paragraphs(), beg, selStart().pos()); PosIterator pos(&paragraphs(), beg, bv()->selStart().pos());
PosIterator posend(&paragraphs(), end, selEnd().pos()); PosIterator posend(&paragraphs(), end, bv()->selEnd().pos());
BufferParams const & params = bv()->buffer()->params(); BufferParams const & params = bv()->buffer()->params();
@ -549,7 +549,7 @@ string LyXText::getStringToIndex()
string idxstring; string idxstring;
if (!bv()->selection().set()) if (!bv()->selection().set())
bv()->owner()->message(_("Nothing to index!")); bv()->owner()->message(_("Nothing to index!"));
else if (selStart().par() != selEnd().par()) else if (bv()->selStart().par() != bv()->selEnd().par())
bv()->owner()->message(_("Cannot index more than one paragraph!")); bv()->owner()->message(_("Cannot index more than one paragraph!"));
else else
idxstring = selectionAsString(*bv()->buffer(), false); idxstring = selectionAsString(*bv()->buffer(), false);
@ -576,11 +576,11 @@ void LyXText::setParagraph(Spacing const & spacing, LyXAlignment align,
string const & labelwidthstring, bool noindent) string const & labelwidthstring, bool noindent)
{ {
// make sure that the depth behind the selection are restored, too // make sure that the depth behind the selection are restored, too
ParagraphList::iterator undopit = undoSpan(getPar(selEnd())); ParagraphList::iterator undopit = undoSpan(getPar(bv()->selEnd()));
recUndo(selStart().par(), parOffset(undopit) - 1); recUndo(bv()->selStart().par(), parOffset(undopit) - 1);
ParagraphList::reverse_iterator pit(getPar(selEnd().par())); ParagraphList::reverse_iterator pit(getPar(bv()->selEnd().par()));
ParagraphList::reverse_iterator beg(getPar(selStart().par())); ParagraphList::reverse_iterator beg(getPar(bv()->selStart().par()));
for (--pit; pit != beg; ++pit) { for (--pit; pit != beg; ++pit) {
ParagraphParameters & params = pit->params(); ParagraphParameters & params = pit->params();
@ -601,7 +601,7 @@ void LyXText::setParagraph(Spacing const & spacing, LyXAlignment align,
params.noindent(noindent); params.noindent(noindent);
} }
redoParagraphs(getPar(selStart()), undopit); redoParagraphs(getPar(bv()->selStart()), undopit);
} }
@ -932,29 +932,29 @@ void LyXText::cutSelection(bool doclear, bool realcut)
if (!bv()->selection().set()) if (!bv()->selection().set())
return; return;
// OK, we have a selection. This is always between selStart() // OK, we have a selection. This is always between bv()->selStart()
// and selEnd() // and bv()->selEnd()
// make sure that the depth behind the selection are restored, too // make sure that the depth behind the selection are restored, too
ParagraphList::iterator begpit = getPar(selStart().par()); ParagraphList::iterator begpit = getPar(bv()->selStart().par());
ParagraphList::iterator endpit = getPar(selEnd().par()); ParagraphList::iterator endpit = getPar(bv()->selEnd().par());
ParagraphList::iterator undopit = undoSpan(endpit); ParagraphList::iterator undopit = undoSpan(endpit);
recUndo(selStart().par(), parOffset(undopit) - 1); recUndo(bv()->selStart().par(), parOffset(undopit) - 1);
int endpos = selEnd().pos(); int endpos = bv()->selEnd().pos();
BufferParams const & bufparams = bv()->buffer()->params(); BufferParams const & bufparams = bv()->buffer()->params();
boost::tie(endpit, endpos) = realcut ? boost::tie(endpit, endpos) = realcut ?
CutAndPaste::cutSelection(bufparams, CutAndPaste::cutSelection(bufparams,
paragraphs(), paragraphs(),
begpit , endpit, begpit , endpit,
selStart().pos(), endpos, bv()->selStart().pos(), endpos,
bufparams.textclass, bufparams.textclass,
doclear) doclear)
: CutAndPaste::eraseSelection(bufparams, : CutAndPaste::eraseSelection(bufparams,
paragraphs(), paragraphs(),
begpit, endpit, begpit, endpit,
selStart().pos(), endpos, bv()->selStart().pos(), endpos,
doclear); doclear);
// sometimes necessary // sometimes necessary
if (doclear) if (doclear)
@ -982,20 +982,20 @@ void LyXText::copySelection()
if (!bv()->selection().set()) if (!bv()->selection().set())
return; return;
// ok we have a selection. This is always between selStart() // ok we have a selection. This is always between bv()->selStart()
// and sel_end cursor // and sel_end cursor
// copy behind a space if there is one // copy behind a space if there is one
while (getPar(selStart())->size() > selStart().pos() while (getPar(bv()->selStart())->size() > bv()->selStart().pos()
&& getPar(selStart())->isLineSeparator(selStart().pos()) && getPar(bv()->selStart())->isLineSeparator(bv()->selStart().pos())
&& (selStart().par() != selEnd().par() && (bv()->selStart().par() != bv()->selEnd().par()
|| selStart().pos() < selEnd().pos())) || bv()->selStart().pos() < bv()->selEnd().pos()))
selStart().pos(selStart().pos() + 1); bv()->selStart().pos(bv()->selStart().pos() + 1);
CutAndPaste::copySelection(getPar(selStart().par()), CutAndPaste::copySelection(getPar(bv()->selStart().par()),
getPar(selEnd().par()), getPar(bv()->selEnd().par()),
selStart().pos(), bv()->selStart().pos(),
selEnd().pos(), bv()->selEnd().pos(),
bv()->buffer()->params().textclass); bv()->buffer()->params().textclass);
} }
@ -1052,16 +1052,16 @@ void LyXText::replaceSelectionWithString(string const & str)
freezeUndo(); freezeUndo();
// Get font setting before we cut // Get font setting before we cut
pos_type pos = selEnd().pos(); pos_type pos = bv()->selEnd().pos();
LyXFont const font = getPar(selStart()) LyXFont const font = getPar(bv()->selStart())
->getFontSettings(bv()->buffer()->params(), ->getFontSettings(bv()->buffer()->params(),
selStart().pos()); bv()->selStart().pos());
// Insert the new string // Insert the new string
string::const_iterator cit = str.begin(); string::const_iterator cit = str.begin();
string::const_iterator end = str.end(); string::const_iterator end = str.end();
for (; cit != end; ++cit) { for (; cit != end; ++cit) {
getPar(selEnd())->insertChar(pos, (*cit), font); getPar(bv()->selEnd())->insertChar(pos, (*cit), font);
++pos; ++pos;
} }

View File

@ -1073,10 +1073,10 @@ DispatchResult LyXText::dispatch(FuncRequest const & cmd)
bool change_layout = (current_layout != layout); bool change_layout = (current_layout != layout);
if (!change_layout && bv->selection().set() && if (!change_layout && bv->selection().set() &&
selStart().par() != selEnd().par()) bv->selStart().par() != bv->selEnd().par())
{ {
ParagraphList::iterator spit = getPar(selStart()); ParagraphList::iterator spit = getPar(bv->selStart());
ParagraphList::iterator epit = boost::next(getPar(selEnd())); ParagraphList::iterator epit = boost::next(getPar(bv->selEnd()));
while (spit != epit) { while (spit != epit) {
if (spit->layout()->name() != current_layout) { if (spit->layout()->name() != current_layout) {
change_layout = true; change_layout = true;