#include "math_symbolinset.h"
#include "math_support.h"
#include "math_unknowninset.h"
+#include "ref_inset.h"
#include "BufferView.h"
#include "CutAndPaste.h"
#include "frontends/Dialogs.h"
#include "frontends/LyXView.h"
#include "frontends/Painter.h"
+#include "frontends/nullpainter.h"
#include <sstream>
using lyx::cap::copySelection;
using lyx::cap::grabAndEraseSelection;
using lyx::cap::cutSelection;
-using lyx::cap::pasteSelection;
using lyx::cap::replaceSelection;
using lyx::cap::selClearOrDel;
void MathNestInset::drawSelection(PainterInfo & pi, int x, int y) const
{
- // FIXME: hack to get position cache warm
- draw(pi, x, y);
-
// this should use the x/y values given, not the cached values
LCursor & cur = pi.base.bv->cursor();
if (!cur.selection())
if (!ptr_cmp(&cur.inset(), this))
return;
+ // FIXME: hack to get position cache warm
+ static NullPainter nop;
+ PainterInfo pinop(pi);
+ pinop.pain = nop;
+ draw(pinop, x, y);
+
CursorSlice s1 = cur.selBegin();
CursorSlice s2 = cur.selEnd();
//lyxerr << "MathNestInset::drawing selection: "
}
-void MathNestInset::notifyCursorLeaves(LCursor & /*cur*/)
+void MathNestInset::notifyCursorLeaves(LCursor & cur)
{
#ifdef WITH_WARNINGS
#warning look here
size_t n = 0;
istringstream is(cmd.argument);
is >> n;
- pasteSelection(cur, n);
+ string const selection = lyx::cap::getSelection(cur.buffer(), n);
+ cur.niceInsert(selection);
cur.clearSelection(); // bug 393
cur.bv().switchKeyMap();
finishUndo();
}
case LFUN_CUT:
+ recordUndo(cur);
cutSelection(cur, true, true);
cur.message(_("Cut"));
// Prevent stale position >= size crash
+ // Probably not necessary anymore, see eraseSelection (gb 2005-10-09)
cur.normalize();
break;
case LFUN_DELETE_WORD_BACKWARD:
case LFUN_BACKSPACE:
- recordUndo(cur, Undo::ATOMIC);
+ if (cur.pos() == 0)
+ // delete whole cell
+ recordUndoInset(cur, Undo::ATOMIC);
+ else
+ recordUndo(cur, Undo::ATOMIC);
cur.backspace();
break;
case LFUN_DELETE:
recordUndo(cur);
cur.erase();
- cmd = FuncRequest(LFUN_FINISHED_LEFT);
- cur.undispatched();
break;
case LFUN_ESCAPE:
if (cur.selection())
cur.clearSelection();
else {
- cmd = FuncRequest(LFUN_FINISHED_LEFT);
+ cmd = FuncRequest(LFUN_FINISHED_RIGHT);
cur.undispatched();
}
break;
break;
case LFUN_SELFINSERT:
- recordUndo(cur);
if (cmd.argument.size() != 1) {
+ recordUndo(cur);
cur.insert(cmd.argument);
break;
}
- if (!interpret(cur, cmd.argument[0])) {
+ // Don't record undo steps if we are in macro mode and
+ // cmd.argument is the next character of the macro name.
+ // Otherwise we'll get an invalid cursor if we undo after
+ // the macro was finished and the macro is a known command,
+ // e.g. sqrt. LCursor::macroModeClose replaces in this case
+ // the MathUnknownInset with name "frac" by an empty
+ // MathFracInset -> a pos value > 0 is invalid.
+ // A side effect is that an undo before the macro is finished
+ // undoes the complete macro, not only the last character.
+ if (!cur.inMacroMode())
+ recordUndo(cur);
+
+ // spacial handling of space. If we insert an inset
+ // via macro mode, we want to put the cursor inside it
+ // if relevant. Think typing "\frac<space>".
+ if (cmd.argument[0] == ' '
+ && cur.inMacroMode() && cur.macroName() != "\\"
+ && cur.macroModeClose()) {
+ MathAtom const atom = cur.prevAtom();
+ if (atom->asNestInset() && atom->nargs() > 0) {
+ cur.posLeft();
+ cur.pushLeft(*cur.nextInset());
+ }
+ } else if (!interpret(cur, cmd.argument[0])) {
cmd = FuncRequest(LFUN_FINISHED_RIGHT);
cur.undispatched();
}
int cell(0);
if (cmd.argument == "\\root")
cell = 1;
- if (ar.size() == 1 && (ar[0].nucleus()->asNestInset())) {
+ // math macros are nest insets and may have 0 cells.
+ // handleNest would crash in this case.
+ if (ar.size() == 1 && (ar[0].nucleus()->asNestInset()) &&
+ ar[0].nucleus()->nargs() > MathInset::idx_type(cell)) {
cur.handleNest(ar[0], cell);
} else
cur.niceInsert(cmd.argument);
case LFUN_DIALOG_SHOW_NEW_INSET: {
string const & name = cmd.argument;
string data;
-#if 0
if (name == "ref") {
RefInset tmp(name);
data = tmp.createDialogStr(name);
}
-#endif
cur.bv().owner()->getDialogs().show(name, data, 0);
break;
}
- case LFUN_INSET_APPLY: {
- string const name = cmd.getArg(0);
- InsetBase * base = cur.bv().owner()->getDialogs().getOpenInset(name);
-
- if (base) {
- FuncRequest fr(LFUN_INSET_MODIFY, cmd.argument);
- base->dispatch(cur, fr);
- break;
- }
- MathArray ar;
- if (createMathInset_fromDialogStr(cmd.argument, ar)) {
- cur.insert(ar);
- break;
- }
- cur.undispatched();
- break;
- }
-
default:
MathDimInset::doDispatch(cur, cmd);
break;
//lyxerr << "## lfunMousePress: buttons: " << cmd.button() << endl;
if (cmd.button() == mouse_button::button1) {
//lyxerr << "## lfunMousePress: setting cursor to: " << cur << endl;
- cur.resetAnchor();
- cur.bv().cursor() = cur;
+ cur.bv().mouseSetCursor(cur);
}
if (cmd.button() == mouse_button::button2) {
--cur.pos();
MathScriptInset * inset = cur.nextAtom().nucleus()->asScriptInset();
cur.push(*inset);
+ inset->ensure(up);
cur.idx() = inset->idxOfScript(up);
cur.pos() = cur.lastpos();
} else {