move some cursor handling from insettext.C to text2.C

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8094 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2003-11-17 14:28:18 +00:00
parent 4003db620d
commit 6c38a862ab
5 changed files with 133 additions and 120 deletions

View File

@ -872,16 +872,21 @@ namespace {
theTempCursor = LCursor(bv);
while (true) {
InsetOld * inset_hit = text->checkInsetHit(x, y);
if (!inset_hit)
if (!inset_hit) {
lyxerr << "no further inset hit" << endl;
break;
}
inset = inset_hit;
if (!inset_hit->descendable())
if (!inset_hit->descendable()) {
lyxerr << "not descendable" << endl;
break;
}
text = inset_hit->getText(0);
lyxerr << "Hit inset: " << inset << " at x: " << x
<< " text: " << text << " y: " << y << endl;
theTempCursor.push(static_cast<UpdatableInset*>(inset));
}
lyxerr << "theTempCursor: " << theTempCursor << endl;
return inset;
}

View File

@ -462,23 +462,23 @@ DispatchResult InsetText::priv_dispatch(FuncRequest const & cmd,
break;
case LFUN_RIGHT:
result = moveRight(bv);
result = text_.moveRight();
finishUndo();
break;
case LFUN_LEFT:
finishUndo();
result = moveLeft(bv);
result = text_.moveLeft();
break;
case LFUN_DOWN:
finishUndo();
result = moveDown(bv);
result = text_.moveDown();
break;
case LFUN_UP:
finishUndo();
result = moveUp(bv);
result = text_.moveUp();
break;
case LFUN_PRIOR:
@ -674,73 +674,6 @@ int InsetText::insetInInsetY() const
}
DispatchResult InsetText::moveRight(BufferView * bv)
{
if (text_.cursorPar()->isRightToLeftPar(bv->buffer()->params()))
return moveLeftIntern(bv, false, true, false);
else
return moveRightIntern(bv, true, true, false);
}
DispatchResult InsetText::moveLeft(BufferView * bv)
{
if (text_.cursorPar()->isRightToLeftPar(bv->buffer()->params()))
return moveRightIntern(bv, true, true, false);
else
return moveLeftIntern(bv, false, true, false);
}
DispatchResult InsetText::moveRightIntern(BufferView * bv, bool front,
bool activate_inset, bool selecting)
{
ParagraphList::iterator c_par = cpar();
if (boost::next(c_par) == paragraphs.end() && cpos() >= c_par->size())
return DispatchResult(false, FINISHED_RIGHT);
if (activate_inset && checkAndActivateInset(bv, front))
return DispatchResult(true, true);
text_.cursorRight(bv);
if (!selecting)
text_.clearSelection();
return DispatchResult(true);
}
DispatchResult InsetText::moveLeftIntern(BufferView * bv, bool front,
bool activate_inset, bool selecting)
{
if (cpar() == paragraphs.begin() && cpos() <= 0)
return DispatchResult(false, FINISHED);
text_.cursorLeft(bv);
if (!selecting)
text_.clearSelection();
if (activate_inset && checkAndActivateInset(bv, front))
return DispatchResult(true, true);
return DispatchResult(true);
}
DispatchResult InsetText::moveUp(BufferView * bv)
{
if (crow() == text_.firstRow())
return DispatchResult(false, FINISHED_UP);
text_.cursorUp(bv);
text_.clearSelection();
return DispatchResult(true);
}
DispatchResult InsetText::moveDown(BufferView * bv)
{
if (crow() == text_.lastRow())
return DispatchResult(false, FINISHED_DOWN);
text_.cursorDown(bv);
text_.clearSelection();
return DispatchResult(true);
}
bool InsetText::insertInset(BufferView * bv, InsetOld * inset)
{
inset->setOwner(this);
@ -817,19 +750,6 @@ void InsetText::setFont(BufferView * bv, LyXFont const & font, bool toggleall,
}
bool InsetText::checkAndActivateInset(BufferView * bv, bool front)
{
if (cpos() == cpar()->size())
return false;
InsetOld * inset = cpar()->getInset(cpos());
if (!isHighlyEditableInset(inset))
return false;
inset->edit(bv, front);
updateLocal(bv, false);
return true;
}
void InsetText::markNew(bool track_changes)
{
ParagraphList::iterator pit = paragraphs.begin();

View File

@ -186,31 +186,9 @@ private:
// If the inset is empty set the language of the current font to the
// language to the surronding text (if different).
void sanitizeEmptyText(BufferView *);
///
DispatchResult moveRight(BufferView *);
///
DispatchResult moveLeft(BufferView *);
///
DispatchResult moveRightIntern(BufferView *, bool front,
bool activate_inset = true,
bool selecting = false);
///
DispatchResult moveLeftIntern(BufferView *, bool front,
bool activate_inset = true,
bool selecting = false);
///
DispatchResult moveUp(BufferView *);
///
DispatchResult moveDown(BufferView *);
///
void setCharFont(Buffer const &, int pos, LyXFont const & font);
///
bool checkAndActivateInset(BufferView * bv, bool front);
///
bool checkAndActivateInset(BufferView * bv, int x = 0, int y = 0);
///
void removeNewlines();
///
lyx::pos_type cpos() const;

View File

@ -227,9 +227,9 @@ public:
///
void cursorDown(bool selecting = false);
///
void cursorLeft(bool internal = true);
bool cursorLeft(bool internal = true);
///
void cursorRight(bool internal = true);
bool cursorRight(bool internal = true);
///
void cursorLeftOneWord();
///
@ -444,6 +444,24 @@ public:
///
void cursorRightOneWord(LyXCursor &);
///
DispatchResult moveRight();
///
DispatchResult moveLeft();
///
DispatchResult moveRightIntern(bool front,
bool activate_inset, bool selecting);
///
DispatchResult moveLeftIntern(bool front,
bool activate_inset, bool selecting);
///
DispatchResult moveUp();
///
DispatchResult moveDown();
///
bool checkAndActivateInset(bool front);
private:
/** Cursor related data.
Later this variable has to be removed. There should be now internal

View File

@ -1580,7 +1580,87 @@ void LyXText::setCursorFromCoordinates(LyXCursor & cur, int x, int y)
}
void LyXText::cursorLeft(bool internal)
bool LyXText::checkAndActivateInset(bool front)
{
if (cursor.pos() == cursorPar()->size())
return false;
InsetOld * inset = cursorPar()->getInset(cursor.pos());
if (!isHighlyEditableInset(inset))
return false;
inset->edit(bv(), front);
return true;
}
DispatchResult LyXText::moveRight()
{
if (cursorPar()->isRightToLeftPar(bv()->buffer()->params()))
return moveLeftIntern(false, true, false);
else
return moveRightIntern(true, true, false);
}
DispatchResult LyXText::moveLeft()
{
if (cursorPar()->isRightToLeftPar(bv()->buffer()->params()))
return moveRightIntern(true, true, false);
else
return moveLeftIntern(false, true, false);
}
DispatchResult LyXText::moveRightIntern(bool front, bool activate_inset, bool selecting)
{
ParagraphList::iterator c_par = cursorPar();
if (boost::next(c_par) == ownerParagraphs().end()
&& cursor.pos() >= c_par->size())
return DispatchResult(false, FINISHED_RIGHT);
if (activate_inset && checkAndActivateInset(front))
return DispatchResult(true, true);
cursorRight(bv());
if (!selecting)
clearSelection();
return DispatchResult(true);
}
DispatchResult LyXText::moveLeftIntern(bool front,
bool activate_inset, bool selecting)
{
if (cursor.par() == 0 && cursor.pos() <= 0)
return DispatchResult(false, FINISHED);
cursorLeft(bv());
if (!selecting)
clearSelection();
if (activate_inset && checkAndActivateInset(front))
return DispatchResult(true, true);
return DispatchResult(true);
}
DispatchResult LyXText::moveUp()
{
if (cursorRow() == firstRow())
return DispatchResult(false, FINISHED_UP);
cursorUp(bv());
clearSelection();
return DispatchResult(true);
}
DispatchResult LyXText::moveDown()
{
if (cursorRow() == lastRow())
return DispatchResult(false, FINISHED_DOWN);
cursorDown(bv());
clearSelection();
return DispatchResult(true);
}
bool LyXText::cursorLeft(bool internal)
{
if (cursor.pos() > 0) {
bool boundary = cursor.boundary();
@ -1588,28 +1668,40 @@ void LyXText::cursorLeft(bool internal)
if (!internal && !boundary &&
bidi.isBoundary(*bv()->buffer(), *cursorPar(), cursor.pos() + 1))
setCursor(cursor.par(), cursor.pos() + 1, true, true);
} else if (cursor.par() != 0) {
return true;
}
if (cursor.par() != 0) {
// steps into the paragraph above
setCursor(cursor.par() - 1, boost::prior(cursorPar())->size());
return true;
}
return false;
}
void LyXText::cursorRight(bool internal)
bool LyXText::cursorRight(bool internal)
{
bool const at_end = (cursor.pos() == cursorPar()->size());
bool const at_newline = !at_end &&
cursorPar()->isNewline(cursor.pos());
if (!internal && cursor.boundary() && !at_newline)
if (!internal && cursor.boundary()) {
setCursor(cursor.par(), cursor.pos(), true, false);
else if (!at_end) {
return true;
}
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);
} else if (cursor.par() + 1 != int(ownerParagraphs().size()))
return true;
}
if (cursor.par() + 1 != int(ownerParagraphs().size())) {
setCursor(cursor.par() + 1, 0);
return true;
}
return false;
}