diff --git a/src/mathed/formulabase.C b/src/mathed/formulabase.C index e4e308a40e..d6e350fd81 100644 --- a/src/mathed/formulabase.C +++ b/src/mathed/formulabase.C @@ -573,12 +573,16 @@ dispatch_result InsetFormulaBase::localDispatch(FuncRequest const & cmd) break; } - case LFUN_PASTE: + case LFUN_PASTE: { + int n = 0; + istringstream is(cmd.argument.c_str()); + is >> n; if (was_macro) mathcursor->macroModeClose(); bv->lockedInsetStoreUndo(Undo::EDIT); - mathcursor->selPaste(); + mathcursor->selPaste(n); break; + } case LFUN_CUT: bv->lockedInsetStoreUndo(Undo::DELETE); diff --git a/src/mathed/math_cursor.C b/src/mathed/math_cursor.C index 95dd31f494..3be9d00658 100644 --- a/src/mathed/math_cursor.C +++ b/src/mathed/math_cursor.C @@ -21,6 +21,7 @@ #include "support/lstrings.h" #include "support/LAssert.h" +#include "support/limited_stack.h" #include "debug.h" #include "frontends/Painter.h" #include "math_cursor.h" @@ -58,7 +59,7 @@ using std::isalpha; // matheds own cut buffer -string theCutBuffer; +limited_stack theCutBuffer; MathCursor::MathCursor(InsetFormulaBase * formula, bool front) @@ -544,10 +545,10 @@ void MathCursor::selCopy() { dump("selCopy"); if (selection_) { - theCutBuffer = grabSelection(); + theCutBuffer.push(grabSelection()); selection_ = false; } else { - theCutBuffer.erase(); + //theCutBuffer.erase(); } } @@ -555,7 +556,7 @@ void MathCursor::selCopy() void MathCursor::selCut() { dump("selCut"); - theCutBuffer = grabAndEraseSelection(); + theCutBuffer.push(grabAndEraseSelection()); } @@ -569,11 +570,12 @@ void MathCursor::selDel() } -void MathCursor::selPaste() +void MathCursor::selPaste(int n) { dump("selPaste"); selClearOrDel(); - paste(theCutBuffer); + if (n < theCutBuffer.size()) + paste(theCutBuffer[n]); //grabSelection(); selection_ = false; } @@ -1239,18 +1241,8 @@ bool MathCursor::interpret(char c) 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; } diff --git a/src/mathed/math_cursor.h b/src/mathed/math_cursor.h index 6e33ddf5bf..91ab25e470 100644 --- a/src/mathed/math_cursor.h +++ b/src/mathed/math_cursor.h @@ -149,8 +149,8 @@ public: void selCut(); /// void selDel(); - /// - void selPaste(); + /// pastes n-th element of cut buffer + void selPaste(int n); /// void selHandle(bool); /// diff --git a/src/mathed/math_parser.C b/src/mathed/math_parser.C index 61e2290f31..57d04f882e 100644 --- a/src/mathed/math_parser.C +++ b/src/mathed/math_parser.C @@ -86,6 +86,7 @@ namespace { MathInset::mode_type asMode(MathInset::mode_type oldmode, string const & str) { + lyxerr << "handling mode: '" << str << "'\n"; if (str == "mathmode") return MathInset::MATH_MODE; if (str == "textmode" || str == "forcetext") @@ -601,6 +602,8 @@ void Parser::parse1(MathGridInset & grid, unsigned flags, grid.asHullInset()->numbered(cellrow, numbered); //dump(); + //lyxerr << " flags: " << flags << "\n"; + //lyxerr << " mode: " << mode << "\n"; //lyxerr << "grid: " << grid << endl; while (good()) { @@ -608,23 +611,22 @@ void Parser::parse1(MathGridInset & grid, unsigned flags, #ifdef FILEDEBUG lyxerr << "t: " << t << " flags: " << flags << "\n"; + lyxerr << "mode: " << mode << "\n"; cell->dump(); lyxerr << "\n"; #endif if (flags & FLAG_ITEM) { - skipSpaces(); - flags &= ~FLAG_ITEM; - if (t.cat() == catBegin) { + if (t.cat() == catBegin) { // skip the brace and collect everything to the next matching // closing brace - flags |= FLAG_BRACE_LAST; - continue; + parse1(grid, FLAG_BRACE_LAST, mode, numbered); + return; } // handle only this single token, leave the loop if done - flags |= FLAG_LEAVE; + flags = FLAG_LEAVE; } @@ -842,9 +844,8 @@ void Parser::parse1(MathGridInset & grid, unsigned flags, // is a version for display attached? skipSpaces(); MathArray ar2; - if (nextToken().cat() == catBegin) { + if (nextToken().cat() == catBegin) parse(ar2, FLAG_ITEM, MathInset::MATH_MODE); - } cell->push_back(MathAtom(new MathMacroTemplate(name, nargs, ar1, ar2))); } @@ -1212,8 +1213,10 @@ void Parser::parse1(MathGridInset & grid, unsigned flags, MathAtom at = createMathInset(t.cs()); MathInset::mode_type m = mode; //if (m == MathInset::UNDECIDED_MODE) + lyxerr << "default creation: m1: " << m << "\n"; if (at->currentMode() != MathInset::UNDECIDED_MODE) m = at->currentMode(); + lyxerr << "default creation: m2: " << m << "\n"; MathInset::idx_type start = 0; // this fails on \bigg[...\bigg] //MathArray opt;