#include "math_nestinset.h"
#include "math_arrayinset.h"
+#include "math_boxinset.h"
#include "math_braceinset.h"
#include "math_commentinset.h"
#include "math_data.h"
#include "math_hullinset.h"
#include "math_mathmlstream.h"
#include "math_macroarg.h"
-#include "math_mboxinset.h"
+//#include "math_mboxinset.h"
#include "math_parser.h"
#include "math_scriptinset.h"
#include "math_spaceinset.h"
using std::istringstream;
-
-namespace {
-
-// local global
-int first_x;
-int first_y;
-
-} // namespace anon
-
-
-
-
MathNestInset::MathNestInset(idx_type nargs)
: cells_(nargs), lock_(false)
{}
// absolute again when actually drawing the cursor. What a mess.
BOOST_ASSERT(ptr_cmp(&sl.inset(), this));
MathArray const & ar = sl.cell();
- if (!theCoords.arrays_.has(&ar)) {
- // this can (semi-)legally happen if we jsut created this cell
+ if (!theCoords.getArrays().has(&ar)) {
+ // this can (semi-)legally happen if we just created this cell
// and it never has been drawn before. So don't ASSERT.
//lyxerr << "no cached data for array " << &ar << endl;
x = 0;
y = 0;
return;
}
- Point const pt = theCoords.arrays_.xy(&ar);
- if (!theCoords.insets_.has(this)) {
+ Point const pt = theCoords.getArrays().xy(&ar);
+ if (!theCoords.getInsets().has(this)) {
// same as above
//lyxerr << "no cached data for inset " << this << endl;
x = 0;
y = 0;
return;
}
- Point const pt2 = theCoords.insets_.xy(this);
+ Point const pt2 = theCoords.getInsets().xy(this);
//lyxerr << "retrieving position cache for MathArray "
// << pt.x_ << ' ' << pt.y_ << std::endl;
x = pt.x_ - pt2.x_ + ar.pos2x(sl.pos());
x += 2;
}
+
void MathNestInset::metrics(MetricsInfo const & mi) const
{
MetricsInfo m = mi;
case LFUN_UPSEL:
case LFUN_UP:
+ // FIXME Tried to use clearTargetX and macroModeClose, crashed on cur.up()
+ if (cur.inMacroMode()) {
+ // Make Helge happy
+ cur.macroModeClose();
+ break;
+ }
cur.selHandle(cmd.action == LFUN_UPSEL);
if (!cur.up())
cmd = FuncRequest(LFUN_FINISHED_UP);
+ // fixes bug 1598. Please check!
+ cur.normalize();
break;
case LFUN_DOWNSEL:
case LFUN_DOWN:
+ if (cur.inMacroMode()) {
+ cur.macroModeClose();
+ break;
+ }
cur.selHandle(cmd.action == LFUN_DOWNSEL);
if (!cur.down())
cmd = FuncRequest(LFUN_FINISHED_DOWN);
+ // fixes bug 1598. Please check!
+ cur.normalize();
break;
case LFUN_MOUSE_DOUBLE:
cur.clearTargetX();
if (cur.pos() != cur.lastpos()) {
cur.pos() = cur.lastpos();
- } else if (cur.col() != cur.lastcol()) {
+ } else if (ncols() && (cur.col() != cur.lastcol())) {
cur.idx() = cur.idx() - cur.col() + cur.lastcol();
cur.pos() = cur.lastpos();
} else if (cur.idx() != cur.lastidx()) {
break;
cur.macroModeClose();
selClearOrDel(cur);
- cur.plainInsert(MathAtom(new MathMBoxInset(cur.bv())));
+ //cur.plainInsert(MathAtom(new MathMBoxInset(cur.bv())));
+ cur.plainInsert(MathAtom(new MathBoxInset("mbox")));
cur.posLeft();
cur.pushLeft(*cur.nextInset());
#else
recordUndo(cur, Undo::ATOMIC);
interpret(cur, '\\');
break;
-
+
case LFUN_SUBSCRIPT:
// interpret this as if a _ was typed
recordUndo(cur, Undo::ATOMIC);
interpret(cur, '_');
break;
-
+
case LFUN_SUPERSCRIPT:
// interpret this as if a ^ was typed
recordUndo(cur, Undo::ATOMIC);
// FIXME: We probably should swap parts of "math-insert" and "self-insert"
// handling such that "self-insert" works on "arbitrary stuff" too, and
// math-insert only handles special math things like "matrix".
- case LFUN_INSERT_MATH:
+ case LFUN_INSERT_MATH: {
recordUndo(cur, Undo::ATOMIC);
- cur.niceInsert(cmd.argument);
+ MathArray ar;
+ asArray(cmd.argument, ar);
+ if (ar.size() == 1 && (ar[0].nucleus()->asNestInset())) {
+ cur.handleNest(ar[0]);
+ } else
+ cur.niceInsert(cmd.argument);
break;
+ }
case LFUN_DIALOG_SHOW_NEW_INSET: {
string const & name = cmd.argument;
void MathNestInset::lfunMousePress(LCursor & cur, FuncRequest & cmd)
{
- lyxerr << "lfunMousePress: buttons: " << cmd.button() << endl;
+ //lyxerr << "## lfunMousePress: buttons: " << cmd.button() << endl;
if (cmd.button() == mouse_button::button1) {
- first_x = cmd.x;
- first_y = cmd.y;
- lyxerr << "lfunMousePress: setting cursor to: " << cur << endl;
+ //lyxerr << "## lfunMousePress: setting cursor to: " << cur << endl;
cur.resetAnchor();
cur.bv().cursor() = cur;
}
// only select with button 1
if (cmd.button() == mouse_button::button1) {
LCursor & bvcur = cur.bv().cursor();
- if (abs(cmd.x - first_x) + abs(cmd.y - first_y) > 4
- && bvcur.anchor_.hasPart(cur)) {
- first_x = cmd.x;
- first_y = cmd.y;
-
+ if (bvcur.anchor_.hasPart(cur)) {
+ //lyxerr << "## lfunMouseMotion: cursor: " << cur << endl;
bvcur.setCursor(cur);
bvcur.selection() = true;
- } else
+ //lyxerr << "MOTION " << bvcur << endl;
+ }
+ else {
cur.undispatched();
+ }
}
}
void MathNestInset::lfunMouseRelease(LCursor & cur, FuncRequest & cmd)
{
- lyxerr << "lfunMouseRelease: buttons: " << cmd.button() << endl;
+ //lyxerr << "## lfunMouseRelease: buttons: " << cmd.button() << endl;
if (cmd.button() == mouse_button::button1) {
//cur.bv().stuffClipboard(cur.grabSelection());