}
-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.
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();
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 = 1000;
+ int iterations = 0;
+ Cursor & cur = d->cursor_;
+ 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.reset();
+ 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, ' ');
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)