Transfer and bug fix LFUN_BUFFER_BEGIN/END_SELECT to BufferView.cpp

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23512 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Abdelrazak Younes 2008-03-06 15:39:30 +00:00
parent 5a9653203f
commit a4d5b78430
6 changed files with 38 additions and 129 deletions

View File

@ -902,14 +902,9 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd)
case LFUN_SCREEN_UP:
case LFUN_SCREEN_DOWN:
case LFUN_SCROLL:
flag.enabled(true);
break;
// FIXME: LFUN_SCREEN_DOWN_SELECT should be removed from
// everywhere else before this can enabled:
case LFUN_SCREEN_UP_SELECT:
case LFUN_SCREEN_DOWN_SELECT:
flag.enabled(false);
flag.enabled(true);
break;
case LFUN_LAYOUT_TABULAR:
@ -1311,26 +1306,37 @@ bool BufferView::dispatch(FuncRequest const & cmd)
lfunScroll(cmd);
break;
case LFUN_SCREEN_UP_SELECT:
case LFUN_SCREEN_DOWN_SELECT: {
// Those two are not ready yet for consumption.
return false;
case LFUN_SCREEN_UP_SELECT: {
cur.selHandle(true);
size_t initial_depth = cur.depth();
Point const p = getPos(cur, cur.boundary());
scroll(cmd.action == LFUN_SCREEN_UP_SELECT? - height_ : height_);
// FIXME: We need to verify if the cursor stayed within an inset...
//cur.reset(buffer_.inset());
d->text_metrics_[&buffer_.text()].editXY(cur, p.x_, p.y_);
cur.finishUndo();
while (cur.depth() > initial_depth) {
cur.forwardInset();
if (isTopScreen()) {
lyx::dispatch(FuncRequest(LFUN_BUFFER_BEGIN_SELECT));
cur.finishUndo();
break;
}
// FIXME: we need to do a redraw again because of the selection
// But no screen update is needed.
d->update_strategy_ = NoScreenUpdate;
buffer_.changed();
int y = getPos(cur, cur.boundary()).y_;
int const ymin = y - height_ + defaultRowHeight();
while (y > ymin && cur.up())
y = getPos(cur, cur.boundary()).y_;
cur.finishUndo();
processUpdateFlags(Update::SinglePar | Update::FitCursor);
break;
}
case LFUN_SCREEN_DOWN_SELECT: {
cur.selHandle(true);
if (isBottomScreen()) {
lyx::dispatch(FuncRequest(LFUN_BUFFER_END_SELECT));
cur.finishUndo();
break;
}
int y = getPos(cur, cur.boundary()).y_;
int const ymax = y + height_ - defaultRowHeight();
while (y < ymax && cur.down())
y = getPos(cur, cur.boundary()).y_;
cur.finishUndo();
processUpdateFlags(Update::SinglePar | Update::FitCursor);
break;
}

View File

@ -1554,7 +1554,7 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
if (pit() + 1 >= int(text()->paragraphs().size()) &&
row + 1 >= int(pm.rows().size()))
return false;
}
}
// with and without selection are handled differently
if (!selection()) {
@ -1587,7 +1587,10 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
top().pos() = min(tm.x2pos(pit(), row - 1, xo), top().lastpos());
} else if (pit() > 0) {
--pit();
ParagraphMetrics const & pmcur = bv_->parMetrics(text(), pit());
TextMetrics & tm = bv_->textMetrics(text());
if (!tm.contains(pit()))
tm.newParMetricsUp();
ParagraphMetrics const & pmcur = tm.parMetrics(pit());
top().pos() = min(tm.x2pos(pit(), pmcur.rows().size() - 1, xo), top().lastpos());
}
} else {
@ -1595,6 +1598,9 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
top().pos() = min(tm.x2pos(pit(), row + 1, xo), top().lastpos());
} else if (pit() + 1 < int(text()->paragraphs().size())) {
++pit();
TextMetrics & tm = bv_->textMetrics(text());
if (!tm.contains(pit()))
tm.newParMetricsDown();
top().pos() = min(tm.x2pos(pit(), 0, xo), top().lastpos());
}
}

View File

@ -604,25 +604,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
needsUpdate |= cursorDownParagraph(cur);
break;
case LFUN_SCREEN_UP_SELECT:
needsUpdate |= cur.selHandle(true);
if (cur.pit() == 0 && cur.textRow().pos() == 0)
cur.undispatched();
else {
tm.cursorPrevious(cur);
}
break;
case LFUN_SCREEN_DOWN_SELECT:
needsUpdate |= cur.selHandle(true);
if (cur.pit() == cur.lastpit()
&& cur.textRow().endpos() == cur.lastpos())
cur.undispatched();
else {
tm.cursorNext(cur);
}
break;
case LFUN_LINE_BEGIN:
case LFUN_LINE_BEGIN_SELECT:
needsUpdate |= cur.selHandle(cmd.action == LFUN_LINE_BEGIN_SELECT);
@ -2137,8 +2118,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
case LFUN_DOWN_SELECT:
case LFUN_PARAGRAPH_UP_SELECT:
case LFUN_PARAGRAPH_DOWN_SELECT:
case LFUN_SCREEN_UP_SELECT:
case LFUN_SCREEN_DOWN_SELECT:
case LFUN_LINE_BEGIN_SELECT:
case LFUN_LINE_END_SELECT:
case LFUN_WORD_FORWARD_SELECT:

View File

@ -32,7 +32,6 @@
#include "InsetList.h"
#include "Layout.h"
#include "Length.h"
#include "LyXFunc.h"
#include "LyXRC.h"
#include "MetricsInfo.h"
#include "paragraph_funcs.h"
@ -1611,73 +1610,6 @@ int TextMetrics::cursorY(CursorSlice const & sl, bool boundary) const
}
void TextMetrics::cursorPrevious(Cursor & cur)
{
if (bv_->isTopScreen()) {
lyx::dispatch(FuncRequest(cur.selection()
? LFUN_BUFFER_BEGIN_SELECT : LFUN_BUFFER_BEGIN));
cur.finishUndo();
cur.updateFlags(Update::None);
return;
}
pos_type cpos = cur.pos();
pit_type cpar = cur.pit();
// Memorize current position.
Point p = bv_->getPos(cur, cur.boundary());
// Scroll one full page.
lyx::dispatch(FuncRequest(LFUN_SCROLL, "page up"));
// Try to place the cursor to the same coordinates.
setCursorFromCoordinates(cur, p.x_, p.y_);
// And move one line up in order to acknowledge in inset movement and/or
// selection.
cur.dispatch(FuncRequest(cur.selection()? LFUN_UP_SELECT: LFUN_UP));
if (cpar == cur.pit() && cpos == cur.pos())
// we have a row which is taller than the workarea. The
// simplest solution is to move to the previous row instead.
cur.dispatch(FuncRequest(cur.selection()? LFUN_UP_SELECT: LFUN_UP));
cur.finishUndo();
cur.updateFlags(Update::Force | Update::FitCursor);
}
void TextMetrics::cursorNext(Cursor & cur)
{
if (bv_->isBottomScreen()) {
lyx::dispatch(FuncRequest(cur.selection()
? LFUN_BUFFER_END_SELECT : LFUN_BUFFER_END));
cur.finishUndo();
cur.updateFlags(Update::None);
return;
}
pos_type cpos = cur.pos();
pit_type cpar = cur.pit();
// Memorize current position.
Point p = bv_->getPos(cur, cur.boundary());
// Scroll one full page.
lyx::dispatch(FuncRequest(LFUN_SCROLL, "page down"));
// Try to place the cursor to the same coordinates.
setCursorFromCoordinates(cur, p.x_, p.y_);
// And move one line down in order to acknowledge in inset movement and/or
// selection.
cur.dispatch(FuncRequest(cur.selection()? LFUN_DOWN_SELECT: LFUN_DOWN));
if (cpar == cur.pit() && cpos == cur.pos())
// we have a row which is taller than the workarea. The
// simplest solution is to move to the next row instead.
cur.dispatch(
FuncRequest(cur.selection()? LFUN_DOWN_SELECT: LFUN_DOWN));
cur.finishUndo();
cur.updateFlags(Update::Force | Update::FitCursor);
}
// the cursor set functions have a special mechanism. When they
// realize you left an empty paragraph, they will delete it.

View File

@ -211,10 +211,6 @@ public:
int cursorY(CursorSlice const & cursor,
bool boundary) const;
///
void cursorPrevious(Cursor & cur);
///
void cursorNext(Cursor & cur);
///
bool cursorHome(Cursor & cur);
///

View File

@ -665,16 +665,6 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd)
}
break;
case LFUN_SCREEN_UP_SELECT:
cmd = FuncRequest(LFUN_FINISHED_BACKWARD);
cur.undispatched();
break;
case LFUN_SCREEN_DOWN_SELECT:
cmd = FuncRequest(LFUN_FINISHED_FORWARD);
cur.undispatched();
break;
case LFUN_CELL_FORWARD:
cur.updateFlags(Update::Decoration | Update::FitCursor);
cur.inset().idxNext(cur);