*/
#include <config.h>
+#include <lyxrc.h>
#ifdef __GNUG__
#pragma implementation
#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"
{
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
}
// 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)));
}
}
#endif
-UpdatableInset * MathCursor::asHyperActiveInset() const
-{
- return par()->asHyperActiveInset();
-}
-
-
bool MathCursor::isInside(MathInset const * p) const
{
for (unsigned i = 0; i < Cursor_.size(); ++i)
bool MathCursor::openable(MathAtom const & t, bool sel) const
{
- if (t->isHyperActive())
- return true;
-
if (!t->isActive())
return false;
lastcode_ = LM_TC_MIN;
if (hasPrevAtom() && openable(prevAtom(), sel)) {
- if (prevAtom()->isHyperActive()) {
- lyxerr << "entering hyperactive inset\n";
- }
pushRight(prevAtom());
return true;
}
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;
}
void MathCursor::insert(char c, MathTextCodes t)
{
//lyxerr << "inserting '" << c << "'\n";
+ selClearOrDel();
plainInsert(MathAtom(new MathCharInset(c, t)));
}
if (t->nargs())
selCut();
else
- selDel();
+ selClearOrDel();
}
plainInsert(t);
dump("selCopy");
if (selection_) {
theSelection.grab(*this);
- selClear();
+ //selClear();
}
}
void MathCursor::selPaste()
{
dump("selPaste");
+ selClearOrDel();
theSelection.paste(*this);
//theSelection.grab(*this);
- //selClear();
+ selClear();
}
}
+void MathCursor::selClearOrDel()
+{
+ if (lyxrc.auto_region_delete)
+ selDel();
+ else
+ selClear();
+}
+
+
void MathCursor::selGet(MathArray & ar)
{
dump("selGet");
#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();
}
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);
+ }
}
}
up ? yo - 4 : formula()->yhigh()
);
}
-
+
// any improvement so far?
int xnew, ynew;
getPos(xnew, ynew);
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;
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);
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;
// 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()) {
bool MathCursor::interpret(char c)
{
+ //lyxerr << "interpret 2: '" << c << "'\n";
if (inMacroArgMode()) {
--pos();
plainErase();
// 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