-/*
- * File: math_cursor.C
- * Purpose: Interaction for mathed
- * Author: Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
- * Created: January 1996
- * Description: Math interaction for a WYSIWYG math editor.
+/**
+ * \file math_cursor.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * Dependencies: Xlib, XForms
+ * \author Alejandro Aguilar Sierra
+ * \author André Pönitz
*
- * Copyright: 1996, Alejandro Aguilar Sierra
- *
- * Version: 0.8beta, Math & Lyx project.
- *
- * You are free to use and modify this code under the terms of
- * the GNU General Public Licence version 2 or later.
+ * Full author contact details are available in file CREDITS.
*/
#include <config.h>
-#include <lyxrc.h>
-#include "support/lstrings.h"
-#include "support/LAssert.h"
+#include "math_cursor.h"
+#include "lyxrc.h"
#include "support/limited_stack.h"
+#include "dispatchresult.h"
#include "debug.h"
-#include "Lsstream.h"
-#include "frontends/Painter.h"
-#include "math_cursor.h"
+#include "support/std_sstream.h"
#include "formulabase.h"
#include "funcrequest.h"
-#include "math_autocorrect.h"
#include "math_braceinset.h"
#include "math_commentinset.h"
#include "math_charinset.h"
-#include "math_extern.h"
#include "math_factory.h"
-#include "math_fontinset.h"
#include "math_gridinset.h"
-#include "math_iterator.h"
#include "math_macroarg.h"
#include "math_macrotemplate.h"
#include "math_mathmlstream.h"
#include "math_support.h"
#include "math_unknowninset.h"
-#include <algorithm>
-#include <cctype>
+#include <boost/assert.hpp>
//#define FILEDEBUG 1
-using namespace lyx::support;
-
+using std::string;
using std::endl;
+#ifndef CXX_GLOBAL_CSTD
+using std::isalpha;
+#endif
using std::min;
-using std::max;
using std::swap;
-using std::vector;
+
using std::ostringstream;
-using std::isalpha;
// matheds own cut buffer
}
}
- --pos();
- plainErase();
+ if (hasPrevAtom() && prevAtom()->nargs() > 0) {
+ // let's require two backspaces for 'big stuff' and
+ // highlight on the first
+ left(true);
+ } else {
+ --pos();
+ plainErase();
+ }
return true;
}
}
-void MathCursor::handleNest(MathAtom const & a)
+void MathCursor::handleNest(MathAtom const & a, int c)
{
MathAtom at = a;
- asArray(grabAndEraseSelection(), at.nucleus()->cell(0));
+ asArray(grabAndEraseSelection(), at.nucleus()->cell(c));
insert(at);
pushRight(prevAtom());
}
MathAtom const & MathCursor::prevAtom() const
{
- Assert(pos() > 0);
+ BOOST_ASSERT(pos() > 0);
return array()[pos() - 1];
}
MathAtom & MathCursor::prevAtom()
{
- Assert(pos() > 0);
+ BOOST_ASSERT(pos() > 0);
return array()[pos() - 1];
}
MathAtom const & MathCursor::nextAtom() const
{
- Assert(pos() < size());
+ BOOST_ASSERT(pos() < size());
return array()[pos()];
}
MathAtom & MathCursor::nextAtom()
{
- Assert(pos() < size());
+ BOOST_ASSERT(pos() < size());
return array()[pos()];
}
CursorPos & MathCursor::cursor()
{
- Assert(depth());
+ BOOST_ASSERT(depth());
return Cursor_.back();
}
CursorPos const & MathCursor::cursor() const
{
- Assert(depth());
+ BOOST_ASSERT(depth());
return Cursor_.back();
}
xo = targetx_;
// try neigbouring script insets
- // try left
- if (hasPrevAtom()) {
- MathScriptInset const * p = prevAtom()->asScriptInset();
- if (p && p->has(up)) {
- --pos();
- push(nextAtom());
- idx() = up; // the superscript has index 1
- pos() = size();
- ///lyxerr << "updown: handled by scriptinset to the left" << endl;
- return true;
+ if (!selection()) {
+ // try left
+ if (hasPrevAtom()) {
+ MathScriptInset const * p = prevAtom()->asScriptInset();
+ if (p && p->has(up)) {
+ --pos();
+ push(nextAtom());
+ idx() = up; // the superscript has index 1
+ pos() = size();
+ //lyxerr << "updown: handled by scriptinset to the left" << endl;
+ return true;
+ }
}
- }
- // try right
- if (hasNextAtom()) {
- MathScriptInset const * p = nextAtom()->asScriptInset();
- if (p && p->has(up)) {
- push(nextAtom());
- idx() = up;
- pos() = 0;
- ///lyxerr << "updown: handled by scriptinset to the right" << endl;
- return true;
+ // try right
+ if (hasNextAtom()) {
+ MathScriptInset const * p = nextAtom()->asScriptInset();
+ if (p && p->has(up)) {
+ push(nextAtom());
+ idx() = up;
+ pos() = 0;
+ //lyxerr << "updown: handled by scriptinset to the right" << endl;
+ return true;
+ }
}
}
// try to find an inset that knows better then we
while (1) {
- ///lyxerr << "updown: We are in " << *inset() << " idx: " << idx() << endl;
+ //lyxerr << "updown: We are in " << inset() << " idx: " << idx() << endl;
// ask inset first
if (inset()->idxUpDown(idx(), pos(), up, targetx_)) {
// try to find best position within this inset
}
// no such inset found, just take something "above"
- ///lyxerr << "updown: handled by strange case" << endl;
+ //lyxerr << "updown: handled by strange case" << endl;
if (!popLeft())
return
bruteFind(xo, yo,
}
if (c == '{' || c == '}' || c == '#' || c == '&' || c == '$') {
- createMathInset(string(1, c));
+ niceInsert(createMathInset(string(1, c)));
return true;
}
if (hasPrevAtom())
prevAtom()->infoize2(os);
os << " ";
- return STRCONV(os.str());
+ return os.str();
}
Anchor_ = Cursor_;
lyxerr << "unusual Anchor size" << endl;
}
- //lyx::Assert(Anchor_.size() >= cursor.depth());
+ //lyx::BOOST_ASSERT(Anchor_.size() >= cursor.depth());
// use Anchor on the same level as Cursor
CursorPos normal = Anchor_[depth() - 1];
if (depth() < Anchor_.size() && !(normal < cursor())) {
}
-dispatch_result MathCursor::dispatch(FuncRequest const & cmd)
+DispatchResult MathCursor::dispatch(FuncRequest const & cmd)
{
// mouse clicks are somewhat special
// check
case LFUN_MOUSE_RELEASE:
case LFUN_MOUSE_DOUBLE: {
CursorPos & pos = Cursor_.back();
- dispatch_result res = UNDISPATCHED;
- int x = 0, y = 0;
+ int x = 0;
+ int y = 0;
getPos(x, y);
if (x < cmd.x && hasPrevAtom()) {
- res = prevAtom().nucleus()->dispatch(cmd, pos.idx_, pos.pos_);
- if (res != UNDISPATCHED)
+ DispatchResult const res =
+ prevAtom().nucleus()->dispatch(cmd, pos.idx_, pos.pos_);
+ if (res.dispatched())
return res;
}
if (x > cmd.x && hasNextAtom()) {
- res = nextAtom().nucleus()->dispatch(cmd, pos.idx_, pos.pos_);
- if (res != UNDISPATCHED)
+ DispatchResult const res =
+ nextAtom().nucleus()->dispatch(cmd, pos.idx_, pos.pos_);
+ if (res.dispatched())
return res;
}
}
for (int i = Cursor_.size() - 1; i >= 0; --i) {
CursorPos & pos = Cursor_[i];
- dispatch_result res = pos.inset_->dispatch(cmd, pos.idx_, pos.pos_);
- if (res != UNDISPATCHED) {
- if (res == DISPATCHED_POP) {
+ DispatchResult const res =
+ pos.inset_->dispatch(cmd, pos.idx_, pos.pos_);
+ if (res.dispatched()) {
+ if (res.val() == FINISHED) {
Cursor_.shrink(i + 1);
selClear();
}
return res;
}
}
- return UNDISPATCHED;
+ return DispatchResult(false);
}