X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmathed%2Fmath_cursor.C;h=36834e7612654ec9826a7aa0dd2ef95018f9a7f7;hb=06f9f0ea08ddcf13e99ea02cff21471aa2020c9e;hp=3a17efa565f25bcbbc51d12296c72cd0ad73e82f;hpb=1bcc13c757f60d6e73e15c302e1c1843799888b1;p=lyx.git diff --git a/src/mathed/math_cursor.C b/src/mathed/math_cursor.C index 3a17efa565..36834e7612 100644 --- a/src/mathed/math_cursor.C +++ b/src/mathed/math_cursor.C @@ -16,6 +16,7 @@ */ #include +#include #ifdef __GNUG__ #pragma implementation @@ -25,7 +26,7 @@ #include "support/LAssert.h" #include "debug.h" #include "LColor.h" -#include "Painter.h" +#include "frontends/Painter.h" #include "math_cursor.h" #include "formulabase.h" #include "math_arrayinset.h" @@ -130,7 +131,7 @@ struct Selection { if (data_.nargs() == 1) { // single cell/part of cell - cursor.insert(data_.cell(0)); + cursor.paste(data_.cell(0)); } else { // mulitple cells idx_type idx; // index of upper left cell @@ -144,13 +145,13 @@ struct Selection } // append the left over horizontal cells to the last column idx_type i = p->index(row + p->row(idx), p->ncols() - 1); - for (col_type col = numcols; col < data_.ncols(); ++col) + for (col_type col = numcols; col < data_.ncols(); ++col) p->cell(i).push_back(data_.cell(data_.index(row, col))); } // append the left over vertical cells to the last _cell_ idx_type i = p->nargs() - 1; - for (row_type row = numrows; row < data_.nrows(); ++row) - for (col_type col = 0; col < data_.ncols(); ++col) + for (row_type row = numrows; row < data_.nrows(); ++row) + for (col_type col = 0; col < data_.ncols(); ++col) p->cell(i).push_back(data_.cell(data_.index(row, col))); } } @@ -249,12 +250,6 @@ bool MathCursor::popRight() #endif -UpdatableInset * MathCursor::asHyperActiveInset() const -{ - return par()->asHyperActiveInset(); -} - - bool MathCursor::isInside(MathInset const * p) const { for (unsigned i = 0; i < Cursor_.size(); ++i) @@ -266,9 +261,6 @@ bool MathCursor::isInside(MathInset const * p) const bool MathCursor::openable(MathAtom const & t, bool sel) const { - if (t->isHyperActive()) - return true; - if (!t->isActive()) return false; @@ -316,9 +308,6 @@ bool MathCursor::left(bool sel) lastcode_ = LM_TC_MIN; if (hasPrevAtom() && openable(prevAtom(), sel)) { - if (prevAtom()->isHyperActive()) { - lyxerr << "entering hyperactive inset\n"; - } pushRight(prevAtom()); return true; } @@ -339,12 +328,6 @@ bool MathCursor::right(bool sel) lastcode_ = LM_TC_MIN; if (hasNextAtom() && openable(nextAtom(), sel)) { - if (nextAtom()->isHyperActive()) { - lyxerr << "entering hyperactive inset\n"; - int x, y; - getPos(x, y); - nextAtom()->edit(formula()->view(), x, y, 0); - } pushLeft(nextAtom()); return true; } @@ -454,6 +437,7 @@ void MathCursor::plainInsert(MathAtom const & t) void MathCursor::insert(char c, MathTextCodes t) { //lyxerr << "inserting '" << c << "'\n"; + selClearOrDel(); plainInsert(MathAtom(new MathCharInset(c, t))); } @@ -472,7 +456,7 @@ void MathCursor::insert(MathAtom const & t) if (t->nargs()) selCut(); else - selDel(); + selClearOrDel(); } plainInsert(t); @@ -671,7 +655,7 @@ void MathCursor::selCopy() dump("selCopy"); if (selection_) { theSelection.grab(*this); - selClear(); + //selClear(); } } @@ -704,9 +688,10 @@ void MathCursor::selDel() void MathCursor::selPaste() { dump("selPaste"); + selClearOrDel(); theSelection.paste(*this); //theSelection.grab(*this); - //selClear(); + selClear(); } @@ -738,6 +723,15 @@ void MathCursor::selClear() } +void MathCursor::selClearOrDel() +{ + if (lyxrc.auto_region_delete) + selDel(); + else + selClear(); +} + + void MathCursor::selGet(MathArray & ar) { dump("selGet"); @@ -833,6 +827,9 @@ void MathCursor::getPos(int & x, int & y) #warning This should probably take cellXOffset and cellYOffset into account #endif x = xarray().xo() + xarray().pos2x(pos()); + // move cursor visually into empty cells ("blue rectangles"); + if (array().empty()) + x += 2; y = xarray().yo(); } @@ -982,12 +979,14 @@ void MathCursor::normalize() pos() = min(pos(), size()); // remove empty scripts if possible - for (pos_type i = 0; i < size(); ++i) { - MathScriptInset * p = array().at(i)->asScriptInset(); - if (p) { - p->removeEmptyScripts(); - if (p->empty()) - array().erase(i); + if (1) { + for (pos_type i = 0; i < size(); ++i) { + MathScriptInset * p = array().at(i)->asScriptInset(); + if (p) { + p->removeEmptyScripts(); + //if (p->empty()) + // array().erase(i); + } } } @@ -1269,7 +1268,7 @@ bool MathCursor::goUpDown(bool up) up ? yo - 4 : formula()->yhigh() ); } - + // any improvement so far? int xnew, ynew; getPos(xnew, ynew); @@ -1333,9 +1332,6 @@ bool MathCursor::interpret(string const & s) if (s.empty()) return true; - if (s.size() == 1) - return interpret(s[0]); - //lyxerr << "char: '" << s[0] << "' int: " << int(s[0]) << endl; //owner_->getIntl()->getTrans().TranslateAndInsert(s[0], lt); //lyxerr << "trans: '" << s[0] << "' int: " << int(s[0]) << endl; @@ -1375,9 +1371,11 @@ bool MathCursor::interpret(string const & s) return true; } - if (s == "\\over" || s == "\\choose" || s == "\\atop") { + string name = s.substr(1); + + if (name == "over" || name == "choose" || name == "atop") { MathArray ar = array(); - MathAtom t(createMathInset(s.substr(1))); + MathAtom t(createMathInset(name)); t->asNestInset()->cell(0).swap(array()); pos() = 0; niceInsert(t); @@ -1386,7 +1384,7 @@ bool MathCursor::interpret(string const & s) return true; } - latexkeys const * l = in_word_set(s.substr(1)); + latexkeys const * l = in_word_set(name); if (l && (l->token == LM_TK_FONT || l->token == LM_TK_OLDFONT)) { lastcode_ = static_cast(l->id); return true; @@ -1394,19 +1392,28 @@ bool MathCursor::interpret(string const & s) // prevent entering of recursive macros if (formula()->lyxCode() == Inset::MATHMACRO_CODE - && formula()->getInsetName() == s.substr(1)) + && formula()->getInsetName() == name) { lyxerr << "can't enter recursive macro\n"; return true; } - niceInsert(createMathInset(s.substr(1))); + niceInsert(createMathInset(name)); return true; } bool MathCursor::script(bool up) { + // Hack to get \\^ and \\_ working + if (inMacroMode() && macroName() == "\\") { + if (up) + interpret("\\mathcircumflex"); + else + interpret('_'); + return true; + } + macroModeClose(); selCut(); if (hasPrevAtom() && prevAtom()->asScriptInset()) { @@ -1434,6 +1441,7 @@ bool MathCursor::script(bool up) bool MathCursor::interpret(char c) { + //lyxerr << "interpret 2: '" << c << "'\n"; if (inMacroArgMode()) { --pos(); plainErase(); @@ -1451,33 +1459,45 @@ bool MathCursor::interpret(char c) // handle macroMode if (inMacroMode()) { string name = macroName(); + //lyxerr << "interpret name: '" << name << "'\n"; - if (name == "\\" && c == '\\') { - backspace(); - interpret("\\backslash"); - return true; - } - + // extend macro name if possible if (isalpha(c)) { insert(c, LM_TC_TEX); return true; } - macroModeClose(); + // leave macro mode if explicitly requested + if (c == ' ') { + macroModeClose(); + return true; + } - if (c != ' ') - interpret(c); + // handle 'special char' macros + if (name == "\\") { + // remove the '\\' + backspace(); + if (c == '\\') + interpret("\\backslash"); + else + interpret(string("\\") + c); + return true; + } + // leave macro mode and try again + macroModeClose(); + interpret(c); return true; } - if (selection_) { + // just clear selection on pressing the space par + if (selection_ && c == ' ') { selClear(); - if (c == ' ') - return true; - // fall through in the other cases + return true; } + selClearOrDel(); + if (lastcode_ == LM_TC_TEXTRM || par()->asBoxInset()) { // suppress direct insertion of two spaces in a row // the still allows typing 'a' and deleting the 'a', but