#include <config.h>
#include <lyxrc.h>
-#ifdef __GNUG__
-#pragma implementation
-#endif
#include "support/lstrings.h"
#include "support/LAssert.h"
+#include "support/limited_stack.h"
#include "debug.h"
#include "frontends/Painter.h"
#include "math_cursor.h"
// matheds own cut buffer
-string theCutBuffer;
+limited_stack<string> theCutBuffer;
MathCursor::MathCursor(InsetFormulaBase * formula, bool front)
bool MathCursor::popLeft()
{
- //cerr << "Leaving atom to the left\n";
+ //lyxerr << "Leaving atom to the left\n";
if (depth() <= 1) {
if (depth() == 1)
par()->notifyCursorLeaves(idx());
bool MathCursor::popRight()
{
- //cerr << "Leaving atom "; par()->write(cerr, false); cerr << " right\n";
+ //lyxerr << "Leaving atom "; par()->write(cerr, false); cerr << " right\n";
if (depth() <= 1) {
if (depth() == 1)
par()->notifyCursorLeaves(idx());
}
-void MathCursor::backspace()
+bool MathCursor::backspace()
{
autocorrect_ = false;
if (selection_) {
selDel();
- return;
+ return true;
}
if (pos() == 0) {
+ if (par()->ncols() == 1 &&
+ par()->nrows() == 1 &&
+ depth() == 1 &&
+ size() == 0)
+ return false;
pullArg();
- return;
+ return true;
}
if (inMacroMode()) {
MathUnknownInset * p = activeMacro();
if (p->name().size() > 1) {
p->setName(p->name().substr(0, p->name().size() - 1));
- return;
+ return true;
}
}
--pos();
plainErase();
+ return true;
}
-void MathCursor::erase()
+bool MathCursor::erase()
{
autocorrect_ = false;
if (inMacroMode())
- return;
+ return true;
if (selection_) {
selDel();
- return;
+ return true;
}
// delete empty cells if possible
if (array().empty())
if (par()->idxDelete(idx()))
- return;
+ return true;
// old behaviour when in last position of cell
if (pos() == size()) {
- par()->idxGlue(idx());
- return;
+ if (par()->ncols() == 1 && par()->nrows() == 1 && depth() == 1 && size() == 0)
+ return false;
+ else{
+ par()->idxGlue(idx());
+ return true;
+ }
}
plainErase();
+ return true;
}
{
dump("selCopy");
if (selection_) {
- theCutBuffer = grabSelection();
+ theCutBuffer.push(grabSelection());
selection_ = false;
} else {
- theCutBuffer.erase();
+ //theCutBuffer.erase();
}
}
void MathCursor::selCut()
{
dump("selCut");
- theCutBuffer = grabAndEraseSelection();
+ theCutBuffer.push(grabAndEraseSelection());
}
}
-void MathCursor::selPaste()
+void MathCursor::selPaste(int n)
{
dump("selPaste");
selClearOrDel();
- paste(theCutBuffer);
+ if (n < theCutBuffer.size())
+ paste(theCutBuffer[n]);
//grabSelection();
selection_ = false;
}
}
-void MathCursor::drawSelection(MathPainterInfo & pi) const
+void MathCursor::drawSelection(PainterInfo & pi) const
{
if (!selection_)
return;
}
}
- // try current cell
+ // try current cell for e.g. text insets
+ if (par()->idxUpDown2(idx(), pos(), up, targetx_))
+ return true;
+
//xarray().boundingBox(xlow, xhigh, ylow, yhigh);
//if (up)
// yhigh = yo - 4;
it.back().getPos(xo, yo);
if (xlow <= xo && xo <= xhigh && ylow <= yo && yo <= yhigh) {
double d = (x - xo) * (x - xo) + (y - yo) * (y - yo);
+ //lyxerr << "x: " << x << " y: " << y << " d: " << endl;
// '<=' in order to take the last possible position
// this is important for clicking behind \sum in e.g. '\sum_i a'
if (d <= best_dist) {
it.back().setPos(0);
MathIterator et = Cursor_;
et.back().setPos(it.cell().size());
- while (1) {
+ for (int i = 0; ; ++i) {
int xo, yo;
it.back().getPos(xo, yo);
double d = (x - xo) * (x - xo) + (y - yo) * (y - yo);
// '<=' in order to take the last possible position
// this is important for clicking behind \sum in e.g. '\sum_i a'
+ lyxerr << "i: " << i << " d: " << d << " best: " << best_dist << endl;
if (d <= best_dist) {
best_dist = d;
Cursor_ = it;
return pos() != size();
}
- if (c == '#') {
- insert(c);
- return true;
- }
-
- if (c == '{' || c == '}') {
- niceInsert(createMathInset(string(1, c)));
- return true;
- }
-
- if (c == '$') {
- insert(createMathInset("$"));
+ if (c == '{' || c == '}' || c == '#' || c == '&' || c == '$') {
+ createMathInset(string(1, c));
return true;
}
}
-MathInset::result_type MathCursor::dispatch(FuncRequest const & cmd)
-{
+dispatch_result MathCursor::dispatch(FuncRequest const & cmd)
+{
+ // mouse clicks are somewhat special
+ // check
+ switch (cmd.action) {
+ case LFUN_MOUSE_PRESS:
+ case LFUN_MOUSE_MOTION:
+ case LFUN_MOUSE_RELEASE:
+ case LFUN_MOUSE_DOUBLE: {
+ MathCursorPos & pos = Cursor_.back();
+ dispatch_result res = UNDISPATCHED;
+ int x = 0, y = 0;
+ getPos(x, y);
+ if (x < cmd.x && hasPrevAtom()) {
+ res = prevAtom().nucleus()->dispatch(cmd, pos.idx_, pos.pos_);
+ if (res != UNDISPATCHED)
+ return res;
+ }
+ if (x > cmd.x && hasNextAtom()) {
+ res = nextAtom().nucleus()->dispatch(cmd, pos.idx_, pos.pos_);
+ if (res != UNDISPATCHED)
+ return res;
+ }
+ }
+ default:
+ break;
+ }
+
for (int i = Cursor_.size() - 1; i >= 0; --i) {
MathCursorPos & pos = Cursor_[i];
- MathInset::result_type
- res = pos.par_->dispatch(cmd, pos.idx_, pos.pos_);
- if (res != MathInset::UNDISPATCHED) {
- if (res == MathInset::DISPATCHED_POP) {
+ dispatch_result res = pos.par_->dispatch(cmd, pos.idx_, pos.pos_);
+ if (res != UNDISPATCHED) {
+ if (res == DISPATCHED_POP) {
Cursor_.shrink(i + 1);
selClear();
}
return res;
}
}
- return MathInset::UNDISPATCHED;
+ return UNDISPATCHED;
}