} // anon namespace
-BufferView::Pimpl::Pimpl(BufferView * bv, LyXView * owner,
+BufferView::Pimpl::Pimpl(BufferView & bv, LyXView * owner,
int xpos, int ypos, int width, int height)
- : bv_(bv), owner_(owner), buffer_(0), cursor_timeout(400),
+ : bv_(&bv), owner_(owner), buffer_(0), cursor_timeout(400),
using_xterm_cursor(false), cursor_(bv)
{
xsel_cache_.set = false;
if (errorConnection_.connected())
disconnectBuffer();
- errorConnection_ = buf.error.connect(boost::bind(&BufferView::Pimpl::addError, this, _1));
- messageConnection_ = buf.message.connect(boost::bind(&LyXView::message, owner_, _1));
- busyConnection_ = buf.busy.connect(boost::bind(&LyXView::busy, owner_, _1));
- titleConnection_ = buf.updateTitles.connect(boost::bind(&LyXView::updateWindowTitle, owner_));
- timerConnection_ = buf.resetAutosaveTimers.connect(boost::bind(&LyXView::resetAutosaveTimer, owner_));
- readonlyConnection_ = buf.readonly.connect(boost::bind(&BufferView::Pimpl::showReadonly, this, _1));
- closingConnection_ = buf.closing.connect(boost::bind(&BufferView::Pimpl::buffer, this, (Buffer *)0));
+ errorConnection_ =
+ buf.error.connect(boost::bind(&BufferView::Pimpl::addError, this, _1));
+ messageConnection_ =
+ buf.message.connect(boost::bind(&LyXView::message, owner_, _1));
+ busyConnection_ =
+ buf.busy.connect(boost::bind(&LyXView::busy, owner_, _1));
+ titleConnection_ =
+ buf.updateTitles.connect(boost::bind(&LyXView::updateWindowTitle, owner_));
+ timerConnection_ =
+ buf.resetAutosaveTimers.connect(boost::bind(&LyXView::resetAutosaveTimer, owner_));
+ readonlyConnection_ =
+ buf.readonly.connect(boost::bind(&BufferView::Pimpl::showReadonly, this, _1));
+ closingConnection_ =
+ buf.closing.connect(boost::bind(&BufferView::Pimpl::buffer, this, (Buffer *)0));
}
if (!text)
return;
- par = bv_->cursor().par();
- pos = bv_->cursor().pos();
- selstartpar = bv_->selStart().par();
- selstartpos = bv_->selStart().pos();
- selendpar = bv_->selEnd().par();
- selendpos = bv_->selEnd().pos();
- sel = bv_->selection().set();
- mark_set = bv_->selection().mark();
+ LCursor & cur = bv_->cursor();
+ par = cur.par();
+ pos = cur.pos();
+ selstartpar = cur.selStart().par();
+ selstartpos = cur.selStart().pos();
+ selendpar = cur.selEnd().par();
+ selendpos = cur.selEnd().pos();
+ sel = cur.selection();
+ mark_set = cur.mark();
text->textwidth_ = bv_->workWidth();
text->fullRebreak();
update();
if (par != -1) {
- bv_->selection().set(true);
+ cur.selection() = true;
// At this point just to avoid the Delete-Empty-Paragraph-
// Mechanism when setting the cursor.
- bv_->selection().mark(mark_set);
+ cur.mark() = mark_set;
if (sel) {
text->setCursor(selstartpar, selstartpos);
- bv_->resetAnchor();
+ cur.resetAnchor();
text->setCursor(selendpar, selendpos);
- text->setSelection();
+ cur.setSelection();
text->setCursor(par, pos);
} else {
text->setCursor(par, pos);
- bv_->resetAnchor();
- bv_->selection().set(false);
+ cur.resetAnchor();
+ cur.selection() = false;
}
}
if (!available())
return;
- LyXText * text = bv_->getLyXText();
+ LCursor & cur = bv_->cursor();
- if (!bv_->selection().set()) {
+ if (!cur.selection()) {
xsel_cache_.set = false;
return;
}
if (!xsel_cache_.set ||
- bv_->cursor() != xsel_cache_.cursor ||
- bv_->anchor() != xsel_cache_.anchor)
+ cur.cursor_.back() != xsel_cache_.cursor ||
+ cur.anchor_.back() != xsel_cache_.anchor)
{
- xsel_cache_.cursor = bv_->cursor();
- xsel_cache_.anchor = bv_->anchor();
- xsel_cache_.set = bv_->selection().set();
- sel = text->selectionAsString(*bv_->buffer(), false);
+ xsel_cache_.cursor = cur.cursor_.back();
+ xsel_cache_.anchor = cur.anchor_.back();
+ xsel_cache_.set = cur.selection();
+ sel = bv_->getLyXText()->selectionAsString(*bv_->buffer(), false);
if (!sel.empty())
workarea().putClipboard(sel);
}
{
if (available()) {
screen().hideCursor();
- bv_->getLyXText()->clearSelection();
+ bv_->cursor().clearSelection();
xsel_cache_.set = false;
}
}
return Change(Change::UNCHANGED);
LyXText * text = bv_->getLyXText();
+ LCursor & cur = bv_->cursor();
- if (!bv_->selection().set())
+ if (!cur.selection())
return Change(Change::UNCHANGED);
- return text->getPar(bv_->selStart())
- ->lookupChangeFull(bv_->selStart().pos());
+ return text->getPar(cur.selStart())
+ ->lookupChangeFull(cur.selStart().pos());
}
string const fname = saved_positions[i].filename;
- bv_->text()->clearSelection();
+ bv_->cursor().clearSelection();
if (fname != buffer_->fileName()) {
Buffer * b = 0;
{
LyXText * text = bv_->text();
- text->clearSelection();
+ bv_->cursor().clearSelection();
int const half_height = workarea().workHeight() / 2;
int new_y = std::max(0, text->cursorY() - half_height);
// should work for now. Better infrastructure is coming. (Lgb)
Buffer * b = bv_->buffer();
- LyXText * text = bv_->getLyXText();
+ LyXText * text = bv_->getLyXText();
Buffer::inset_iterator beg = b->inset_iterator_begin();
Buffer::inset_iterator end = b->inset_iterator_end();
}
#warning remove me
-LCursor theTempCursor(0);
+CursorBase theTempCursor;
namespace {
lyxerr << "insetFromCoords" << endl;
LyXText * text = bv->text();
InsetOld * inset = 0;
- theTempCursor = LCursor(bv);
+ theTempCursor.clear();
while (true) {
InsetOld * const inset_hit = text->checkInsetHit(x, y);
if (!inset_hit) {
text = inset_hit->getText(cell);
lyxerr << "Hit inset: " << inset << " at x: " << x
<< " text: " << text << " y: " << y << endl;
- theTempCursor.push(static_cast<UpdatableInset*>(inset));
+ theTempCursor.push_back(CursorSlice(inset));
}
- lyxerr << "theTempCursor: " << theTempCursor << endl;
+ //lyxerr << "theTempCursor: " << theTempCursor << endl;
return inset;
}
bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd)
{
+ LCursor & cur = bv_->cursor();
switch (cmd.action) {
case LFUN_MOUSE_MOTION: {
if (!available())
return false;
- FuncRequest cmd1(cmd, bv_);
- UpdatableInset * inset = bv_->fullCursor().innerInset();
+ FuncRequest cmd1 = cmd;
+ InsetBase * inset = cur.inset();
DispatchResult res;
if (inset) {
cmd1.x -= inset->x();
cmd1.y -= inset->y();
- res = inset->dispatch(cmd1);
+ res = inset->dispatch(cur, cmd1);
} else {
cmd1.y += bv_->top_y();
- res = bv_->fullCursor().innerText()->dispatch(cmd1);
+ res = cur.innerText()->dispatch(cur, cmd1);
}
if (bv_->fitCursor() || res.update()) {
bv_->update();
- bv_->fullCursor().updatePos();
+ cur.updatePos();
}
return true;
// built temporary path to inset
InsetOld * inset = insetFromCoords(bv_, cmd.x, cmd.y);
- FuncRequest cmd1(cmd, bv_);
DispatchResult res;
// try to dispatch to that inset
if (inset) {
- FuncRequest cmd2 = cmd1;
+ FuncRequest cmd2 = cmd;
lyxerr << "dispatching action " << cmd2.action
<< " to inset " << inset << endl;
cmd2.x -= inset->x();
cmd2.y -= inset->y();
- res = inset->dispatch(cmd2);
+ res = inset->dispatch(cur, cmd2);
if (res.update()) {
bv_->update();
- bv_->fullCursor().updatePos();
+ cur.updatePos();
}
res.update(false);
switch (res.val()) {
case FINISHED_RIGHT:
case FINISHED_UP:
case FINISHED_DOWN:
- theTempCursor.pop();
- bv_->fullCursor(theTempCursor);
- bv_->fullCursor().innerText()
+ theTempCursor.pop_back();
+ cur.cursor_ = theTempCursor;
+ cur.innerText()
->setCursorFromCoordinates(cmd.x, top_y() + cmd.y);
if (bv_->fitCursor())
bv_->update();
// otherwise set cursor to surrounding LyXText
if (!res.dispatched()) {
- lyxerr << "temp cursor is: " << theTempCursor << endl;
- lyxerr << "dispatching " << cmd1
- << " to surrounding LyXText "
- << theTempCursor.innerText() << endl;
- bv_->fullCursor(theTempCursor);
+ //lyxerr << "temp cursor is: " << theTempCursor << endl;
+ //lyxerr << "dispatching " << cmd
+ // << " to surrounding LyXText "
+ // << theTempCursor.innerText() << endl;
+ cur.cursor_ = theTempCursor;
+ FuncRequest cmd1 = cmd;
cmd1.y += bv_->top_y();
- res = bv_->fullCursor().innerText()->dispatch(cmd1);
+ res = cur.innerText()->dispatch(cur, cmd1);
if (bv_->fitCursor() || res.update())
bv_->update();
}
-bool BufferView::Pimpl::dispatch(FuncRequest const & ev_in)
+bool BufferView::Pimpl::dispatch(FuncRequest const & ev)
{
// Make sure that the cached BufferView is correct.
- FuncRequest ev = ev_in;
- ev.setView(bv_);
-
lyxerr[Debug::ACTION] << "BufferView::Pimpl::Dispatch:"
<< " action[" << ev.action << ']'
<< " arg[" << ev.argument << ']'
<< endl;
LyXTextClass const & tclass = buffer_->params().getLyXTextClass();
+ LCursor & cur = bv_->cursor();
switch (ev.action) {
case LFUN_MATH_IMPORT_SELECTION: // Imports LaTeX from the X selection
case LFUN_MATH_DISPLAY: // Open or create a displayed math inset
case LFUN_MATH_MODE: // Open or create an inlined math inset
- mathDispatch(ev);
+ mathDispatch(cur, ev);
break;
case LFUN_INSET_INSERT: {
// Same as above.
BOOST_ASSERT(false);
- InsetOld * inset = createInset(ev);
+ InsetOld * inset = createInset(bv_, ev);
if (!inset || !insertInset(inset))
delete inset;
break;
}
case LFUN_WORD_FIND:
- lyx::find::find(ev);
+ lyx::find::find(bv_, ev);
break;
case LFUN_WORD_REPLACE:
- lyx::find::replace(ev);
+ lyx::find::replace(bv_, ev);
+ break;
+
+ case LFUN_MARK_OFF:
+ cur.clearSelection();
+ bv_->update();
+ cur.resetAnchor();
+ ev.message(N_("Mark off"));
+ break;
+
+ case LFUN_MARK_ON:
+ cur.clearSelection();
+ cur.mark() = true;
+ bv_->update();
+ cur.resetAnchor();
+ ev.message(N_("Mark on"));
+ break;
+
+ case LFUN_SETMARK:
+ cur.clearSelection();
+ if (cur.mark()) {
+ ev.message(N_("Mark removed"));
+ } else {
+ cur.mark() = true;
+ ev.message(N_("Mark set"));
+ }
+ cur.resetAnchor();
+ bv_->update();
break;
case LFUN_UNKNOWN_ACTION:
break;
default:
- return bv_->getLyXText()->dispatch(FuncRequest(ev, bv_)).dispatched();
+ return cur.dispatch(ev).dispatched();
} // end of switch
return true;
bv_->text()->recUndo(bv_->text()->cursor().par());
freezeUndo();
- bv_->text()->clearSelection();
+ bv_->cursor().clearSelection();
if (!lout.empty()) {
bv_->text()->breakParagraph(bv_->buffer()->paragraphs());
bv_->text()->setLayout(hasLayout ? lres : tclass.defaultLayoutName());
bv_->text()->setParagraph(Spacing(), LYX_ALIGN_LAYOUT, string(), 0);
}
- bv_->fullCursor().innerText()->insertInset(inset);
+ bv_->cursor().innerText()->insertInset(inset);
unFreezeUndo();
return true;
}