if (flags == Update::Decoration) {
d->update_strategy_ = DecorationUpdate;
- buffer_.changed();
+ buffer_.changed(false);
return;
}
}
if (flags & Update::Decoration) {
d->update_strategy_ = DecorationUpdate;
- buffer_.changed();
+ buffer_.changed(false);
return;
}
// no screen update is needed.
if (!(flags & Update::FitCursor)) {
// Nothing to do anymore. Trigger a redraw and return
- buffer_.changed();
+ buffer_.changed(false);
return;
}
// updateMetrics() does not update paragraph position
// This is done at draw() time. So we need a redraw!
- buffer_.changed();
+ buffer_.changed(false);
if (fitCursor()) {
// The cursor is off screen so ensure it is visible.
// If the offset is less than 2 screen height, prefer to scroll instead.
if (abs(offset) <= 2 * height_) {
d->anchor_ypos_ -= offset;
- updateMetrics();
- buffer_.changed();
+ buffer_.changed(true);
return;
}
// We reset the cursor because cursorStatus() does not
// work when the cursor is within mathed.
Cursor cur(*this);
- cur.reset(buffer_.inset());
+ cur.reset();
tm.setCursorFromCoordinates(cur, 0, newy);
// update the bufferview cursor and notify insets
// To center the screen on this new position we need the
// paragraph position which is computed at draw() time.
// So we need a redraw!
- buffer_.changed();
+ buffer_.changed(false);
if (fitCursor())
showCursor();
}
void BufferView::showCursor(DocIterator const & dit, bool recenter)
{
if (scrollToCursor(dit, recenter))
- buffer_.changed();
+ buffer_.changed(false);
}
}
-static bool getLocalStatus(Cursor cursor, FuncRequest const & cmd, FuncStatus & status)
-{
- // Try to fix cursor in case it is broken.
- cursor.fixIfBroken();
-
- // This is, of course, a mess. Better create a new doc iterator and use
- // this in Inset::getStatus. This might require an additional
- // BufferView * arg, though (which should be avoided)
- //Cursor safe = *this;
- bool res = false;
- for ( ; cursor.depth(); cursor.pop()) {
- //lyxerr << "\nCursor::getStatus: cmd: " << cmd << endl << *this << endl;
- LASSERT(cursor.idx() <= cursor.lastidx(), /**/);
- LASSERT(cursor.pit() <= cursor.lastpit(), /**/);
- LASSERT(cursor.pos() <= cursor.lastpos(), /**/);
-
- // The inset's getStatus() will return 'true' if it made
- // a definitive decision on whether it want to handle the
- // request or not. The result of this decision is put into
- // the 'status' parameter.
- if (cursor.inset().getStatus(cursor, cmd, status)) {
- res = true;
- break;
- }
- }
- return res;
-}
-
-
bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
{
// Can we use a readonly buffer?
Cursor & cur = d->cursor_;
- // Is this a function that acts on inset at point?
- Inset * inset = cur.nextInset();
- if (lyxaction.funcHasFlag(cmd.action, LyXAction::AtPoint)
- && inset && inset->getStatus(cur, cmd, flag))
- return true;
-
- if (getLocalStatus(cur, cmd, flag))
+ if (cur.getStatus(cmd, flag))
return true;
switch (cmd.action) {
case LFUN_SCROLL:
case LFUN_SCREEN_UP_SELECT:
case LFUN_SCREEN_DOWN_SELECT:
+ case LFUN_INSET_FORALL:
flag.setEnabled(true);
break;
Cursor & cur = d->cursor_;
// Don't dispatch function that does not apply to internal buffers.
- if (buffer_.isInternal() && lyxaction.funcHasFlag(cmd.action, LyXAction::NoInternal))
+ if (buffer_.isInternal()
+ && lyxaction.funcHasFlag(cmd.action, LyXAction::NoInternal))
return false;
// We'll set this back to false if need be.
bool dispatched = true;
- if (cmd.action != LFUN_UNDO && cmd.action != LFUN_REDO)
- buffer_.undo().beginUndoGroup();
+ buffer_.undo().beginUndoGroup();
switch (cmd.action) {
case LFUN_ALL_CHANGES_ACCEPT:
// select complete document
- cur.reset(buffer_.inset());
+ cur.reset();
cur.selHandle(true);
buffer_.text().cursorBottom(cur);
// accept everything in a single step to support atomic undo
case LFUN_ALL_CHANGES_REJECT:
// select complete document
- cur.reset(buffer_.inset());
+ cur.reset();
cur.selHandle(true);
buffer_.text().cursorBottom(cur);
// reject everything in a single step to support atomic undo
break;
}
- case LFUN_WORD_FINDADV:
- findAdv(this, cmd);
+ case LFUN_WORD_FINDADV: {
+ FindAndReplaceOptions opt;
+ istringstream iss(to_utf8(cmd.argument()));
+ iss >> opt;
+ if (findAdv(this, opt))
+ cur.dispatched();
+ else
+ cur.undispatched();
break;
+ }
case LFUN_MARK_OFF:
cur.clearSelection();
p = Point(width_, height_);
Cursor old = cur;
bool const in_texted = cur.inTexted();
- cur.reset(buffer_.inset());
- updateMetrics();
- buffer_.changed();
+ cur.reset();
+ buffer_.changed(true);
d->text_metrics_[&buffer_.text()].editXY(cur, p.x_, p.y_,
true, cmd.action == LFUN_SCREEN_UP);
//FIXME: what to do with cur.x_target()?
break;
}
+
+ // This would be in Buffer class if only Cursor did not
+ // require a bufferview
+ case LFUN_INSET_FORALL: {
+ docstring const name = from_utf8(cmd.getArg(0));
+ string const commandstr = cmd.getLongArg(1);
+ FuncRequest const fr = lyxaction.lookupFunc(commandstr);
+
+ // an arbitrary number to limit number of iterations
+ const int max_iter = 10000;
+ int iterations = 0;
+ Cursor & cur = d->cursor_;
+ Cursor const savecur = cur;
+ cur.reset();
+ if (!cur.nextInset())
+ cur.forwardInset();
+ cur.beginUndoGroup();
+ while(cur && iterations < max_iter) {
+ Inset * ins = cur.nextInset();
+ if (!ins)
+ break;
+ docstring insname = ins->name();
+ while (!insname.empty()) {
+ if (insname == name || name == from_utf8("*")) {
+ cur.recordUndo();
+ lyx::dispatch(fr);
+ ++iterations;
+ break;
+ }
+ size_t const i = insname.rfind(':');
+ if (i == string::npos)
+ break;
+ insname = insname.substr(0, i);
+ }
+ cur.forwardInset();
+ }
+ cur.endUndoGroup();
+ cur = savecur;
+ cur.fixIfBroken();
+ processUpdateFlags(Update::Force);
+
+ if (iterations >= max_iter)
+ cur.errorMessage(bformat(_("`inset-forall' interrupted because number of actions is larger than %1$d"), max_iter));
+ else
+ cur.message(bformat(_("Applied \"%1$s\" to %2$d insets"), from_utf8(commandstr), iterations));
+ break;
+ }
+
+
case LFUN_ALL_INSETS_TOGGLE: {
string action;
string const name = split(to_utf8(cmd.argument()), action, ' ');
Alert::warning(_("Branch already exists"), drtmp.message());
break;
}
- BranchList & branch_list = buffer_.params().branchlist();
- Branch const * branch = branch_list.find(branch_name);
- string const x11hexname = X11hexname(branch->color());
- docstring const str = branch_name + ' ' + from_ascii(x11hexname);
- lyx::dispatch(FuncRequest(LFUN_SET_COLOR, str));
lyx::dispatch(FuncRequest(LFUN_BRANCH_INSERT, branch_name));
break;
}
break;
}
- if (cmd.action != LFUN_UNDO && cmd.action != LFUN_REDO)
- buffer_.undo().endUndoGroup();
+ buffer_.undo().endUndoGroup();
return dispatched;
}
d->xsel_cache_.set = false;
// The buffer did not really change, but this causes the
// redraw we need because we cleared the selection above.
- buffer_.changed();
+ buffer_.changed(false);
}
// This event (moving without mouse click) is not passed further.
// This should be changed if it is further utilized.
- buffer_.changed();
+ buffer_.changed(false);
return;
}
if (scroll_value)
scroll(scroll_step * scroll_value);
}
- updateMetrics();
- buffer_.changed();
+ buffer_.changed(true);
}
buffer_.texrow().getIdFromRow(row, tmpid, tmppos);
- d->cursor_.reset(buffer_.inset());
+ d->cursor_.reset();
if (tmpid == -1)
buffer_.text().setCursor(d->cursor_, 0, 0);
else
// Inset is not at cursor position. Find it in the document.
Cursor cur(*this);
- cur.reset(buffer().inset());
+ cur.reset();
while (cur && cur.nextInset() != inset)
cur.forwardInset();
void BufferView::setCursor(DocIterator const & dit)
{
- d->cursor_.reset(buffer().inset());
+ d->cursor_.reset();
size_t const n = dit.depth();
for (size_t i = 0; i < n; ++i)
dit[i].inset().edit(d->cursor_, true);
d->cursor_ = cur;
buffer_.updateLabels();
-
- updateMetrics();
- buffer_.changed();
+ buffer_.changed(true);
return true;
}
if (!do_selection && d->cursor_.inTexted())
update |= checkDepm(cur, d->cursor_);
- d->cursor_.resetAnchor();
+ if (!do_selection)
+ d->cursor_.resetAnchor();
d->cursor_.setCursor(cur);
d->cursor_.boundary(cur.boundary());
if (do_selection)
res = _("Could not insert document %1$s");
}
- updateMetrics();
- buffer_.changed();
+ buffer_.changed(true);
// emit message signal.
message(bformat(res, disp_fn));
buffer_.errors("Parse");
else
cur.innerText()->insertStringAsLines(cur, tmpstr, cur.current_font);
- updateMetrics();
- buffer_.changed();
+ buffer_.changed(true);
}