]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_cursor.C
OK I'll try guii1 again ...
[lyx.git] / src / mathed / math_cursor.C
index 3a17efa565f25bcbbc51d12296c72cd0ad73e82f..36834e7612654ec9826a7aa0dd2ef95018f9a7f7 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #include <config.h>
+#include <lyxrc.h>
 
 #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<MathTextCodes>(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  '<space>a<space>' and deleting the 'a', but