Should be uncontroversial. This removes/hides some stuff from the Cursor
and MathHullInset which was part of the old mathed<->texted 'interface'

Moreover, it fixes a crash when leaving formulas with Up or Down and
makes the Cursor up/down ready for general use.
? .cursor.C.swp
? 1.diff
? mathed/.math_hullinset.C.swp
? mathed/.math_hullinset.h.swp
Index: cursor.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor.C,v
retrieving revision 1.74
diff -u -p -r1.74 cursor.C
--- cursor.C    18 Mar 2004 13:57:13 -0000      1.74
+++ cursor.C    18 Mar 2004 15:58:52 -0000
@@ -35,8 +35,8 @@
 #include "insets/insettext.h"
 
 #include "mathed/math_data.h"
-#include "mathed/math_hullinset.h"
 #include "mathed/math_support.h"
+#include "mathed/math_inset.h"
 
 #include "support/limited_stack.h"
 #include "support/std_sstream.h"
@@ -60,6 +60,26 @@ using std::swap;
 limited_stack<string> theCutBuffer;
 
 
+namespace {
+
+void region(CursorSlice const & i1, CursorSlice const & i2,
+       LCursor::row_type & r1, LCursor::row_type & r2,
+       LCursor::col_type & c1, LCursor::col_type & c2)
+{
+       InsetBase & p = i1.inset();
+       c1 = p.col(i1.idx_);
+       c2 = p.col(i2.idx_);
+       if (c1 > c2)
+               swap(c1, c2);
+       r1 = p.row(i1.idx_);
+       r2 = p.row(i2.idx_);
+       if (r1 > r2)
+               swap(r1, r2);
+}
+
+}
+
+
 LCursor::LCursor(BufferView & bv)
        : DocumentIterator(), bv_(&bv), anchor_(),
          cached_y_(0), x_target_(-1), selection_(false), mark_(false)
@@ -174,12 +194,9 @@ bool LCursor::popLeft()
 {
        BOOST_ASSERT(!empty());
        //lyxerr << "Leaving inset to the left" << endl;
-       if (depth() <= 1) {
-               if (depth() == 1)
-                       inset().notifyCursorLeaves(idx());
-               return false;
-       }
        inset().notifyCursorLeaves(idx());
+       if (depth() == 1)
+               return false;
        pop();
        return true;
 }
@@ -189,12 +206,9 @@ bool LCursor::popRight()
 {
        BOOST_ASSERT(!empty());
        //lyxerr << "Leaving inset to the right" << endl;
-       if (depth() <= 1) {
-               if (depth() == 1)
-                       inset().notifyCursorLeaves(idx());
-               return false;
-       }
        inset().notifyCursorLeaves(idx());
+       if (depth() == 1)
+               return false;
        pop();
        ++pos();
        return true;
@@ -204,12 +218,12 @@ bool LCursor::popRight()
 int LCursor::currentMode()
 {
        BOOST_ASSERT(!empty());
-       for (int i = size() - 1; i >= 1; --i) {
+       for (int i = size() - 1; i >= 0; --i) {
                int res = operator[](i).inset().currentMode();
-               if (res != MathInset::UNDECIDED_MODE)
+               if (res != InsetBase::UNDECIDED_MODE)
                        return res;
        }
-       return MathInset::TEXT_MODE;
+       return InsetBase::TEXT_MODE;
 }
 
 
@@ -396,26 +410,6 @@ void LCursor::info(std::ostream & os) co
 }
 
 
-namespace {
-
-void region(CursorSlice const & i1, CursorSlice const & i2,
-       LCursor::row_type & r1, LCursor::row_type & r2,
-       LCursor::col_type & c1, LCursor::col_type & c2)
-{
-       InsetBase & p = i1.inset();
-       c1 = p.col(i1.idx_);
-       c2 = p.col(i2.idx_);
-       if (c1 > c2)
-               swap(c1, c2);
-       r1 = p.row(i1.idx_);
-       r2 = p.row(i2.idx_);
-       if (r1 > r2)
-               swap(r1, r2);
-}
-
-}
-
-
 string LCursor::grabSelection()
 {
        if (!selection())
@@ -637,14 +631,8 @@ bool positionable(DocumentIterator const
 
 void LCursor::setScreenPos(int x, int y)
 {
-       bool res = bruteFind(x, y, formula()->xlow(), formula()->xhigh(),
-               formula()->ylow(), formula()->yhigh());
-       if (!res) {
-               // this can happen on creation of "math-display"
-               idx() = 0;
-               pos() = 0;
-       }
-       clearTargetX();
+       x_target() = x;
+       bruteFind(x, y, 0, bv().workWidth(), 0, bv().workHeight());
 }
 
 
@@ -903,17 +891,6 @@ int LCursor::targetX() const
 }
 
 
-MathHullInset * LCursor::formula() const
-{
-       for (int i = size() - 1; i >= 1; --i) {
-               MathInset * inset = operator[](i).inset().asMathInset();
-               if (inset && inset->asHullInset())
-                       return static_cast<MathHullInset *>(inset);
-       }
-       return 0;
-}
-
-
 void LCursor::adjust(pos_type from, int diff)
 {
        if (pos() > from)
@@ -1032,6 +1009,7 @@ bool LCursor::goUpDown(bool up)
        // fragile. A distance of one pixel or a '<' vs '<=' _really
        // matters. So fiddle around with it only if you think you know
        // what you are doing!
+
   int xo = 0;
        int yo = 0;
        getPos(xo, yo);
@@ -1098,13 +1076,9 @@ bool LCursor::goUpDown(bool up)
                // no such inset found, just take something "above"
                //lyxerr << "updown: handled by strange case" << endl;
                if (!popLeft()) {
-                       return
-                               bruteFind(xo, yo,
-                                       formula()->xlow(),
-                                       formula()->xhigh(),
-                                       up ? formula()->ylow() : yo + 4,
-                                       up ? yo - 4 : formula()->yhigh()
-                               );
+                       int ylow  = up ? 0 : yo + 1;
+                       int yhigh = up ? yo - 1 : bv().workHeight();
+                       return bruteFind(xo, yo, 0, bv().workWidth(), ylow, yhigh);
                }
 
                // any improvement so far?
@@ -1118,34 +1092,47 @@ bool LCursor::goUpDown(bool up)
 
 bool LCursor::bruteFind(int x, int y, int xlow, int xhigh, int ylow, int yhigh)
 {
-       DocumentIterator best_cursor;
-       double best_dist = 1e10;
+       BOOST_ASSERT(!empty());
+       ParagraphList::iterator beg;
+       ParagraphList::iterator end;
+       CursorSlice bottom = operator[](0); 
+       LyXText * text = bottom.text();
+       BOOST_ASSERT(text);
+       getParsInRange(text->paragraphs(), ylow, yhigh, beg, end);
 
        DocumentIterator it = insetBegin(bv().buffer()->inset());
-       DocumentIterator et = insetEnd();
-       while (1) {
+       DocumentIterator et;
+       lyxerr << "x: " << x << " y: " << y << endl;
+       lyxerr << "xlow: " << xlow << " ylow: " << ylow << endl;
+       lyxerr << "xhigh: " << xhigh << " yhigh: " << yhigh << endl;
+
+       it.par() = text->parOffset(beg);
+       //et.par() = text->parOffset(end);
+
+       double best_dist = 10e10;
+       DocumentIterator best_cursor = it;
+
+       for ( ; it != et; it.forwardPos()) {
                // avoid invalid nesting when selecting
                if (!selection() || positionable(it, anchor_)) {
-                       int xo, yo;
+                       int xo = 0, yo = 0;
                        CursorSlice & cur = it.back();
                        cur.inset().getCursorPos(cur, xo, yo);
                        if (xlow <= xo && xo <= xhigh && ylow <= yo && yo <= yhigh) {
                                double d = (x - xo) * (x - xo) + (y - yo) * (y - yo);
-                               //lyxerr << "x: " << x << " y: " << y << " d: " << 
endl;
+                               lyxerr << "xo: " << xo << " yo: " << yo << " d: " << d 
<< endl;
                                // '<=' in order to take the last possible position
                                // this is important for clicking behind \sum in e.g. 
'\sum_i a'
                                if (d <= best_dist) {
+                                       lyxerr << "*" << endl;
                                        best_dist   = d;
                                        best_cursor = it;
                                }
                        }
                }
-
-               if (it == et)
-                       break;
-               it.forwardPos();
        }
 
+       lyxerr << "best_dist: " << best_dist << " cur:\n" << best_cursor << endl;
        if (best_dist < 1e10)
                setCursor(best_cursor, false);
        return best_dist < 1e10;
Index: cursor.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor.h,v
retrieving revision 1.47
diff -u -p -r1.47 cursor.h
--- cursor.h    18 Mar 2004 12:53:32 -0000      1.47
+++ cursor.h    18 Mar 2004 15:58:52 -0000
@@ -23,7 +23,6 @@ class FuncStatus;
 class FuncRequest;
 
 // these should go
-class MathHullInset;
 class MathUnknownInset;
 class MathGridInset;
 class Encoding;
@@ -257,8 +256,6 @@ public:
        MathGridInset * enclosingGrid(idx_type & idx) const;
        /// adjust anchor position after deletions/insertions
        void adjust(pos_type from, int diff);
-       ///
-       MathHullInset * formula() const;
        /// current offset in the top cell
        /// interpret name a name of a macro
        void macroModeClose();
@@ -306,10 +303,6 @@ public:
 
        /// moves position somehow up or down
        bool goUpDown(bool up);
-       /// moves position closest to (x, y) in given box
-       bool bruteFind(int x, int y, int xlow, int xhigh, int ylow, int yhigh);
-       /// moves position closest to (x, y) in current cell
-       void bruteFind2(int x, int y);
 
        /// the name of the macro we are currently inputting
        std::string macroName();
@@ -319,6 +312,12 @@ public:
        bool openable(MathAtom const &) const;
        ///
        Encoding const * getEncoding() const;
+
+private:
+       /// moves position closest to (x, y) in current cell
+       void bruteFind2(int x, int y);
+       /// moves position closest to (x, y) in given box
+       bool bruteFind(int x, int y, int xlow, int xhigh, int ylow, int yhigh);
 };
 
 #endif // LYXCURSOR_H
Index: mathed/math_hullinset.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_hullinset.C,v
retrieving revision 1.124
diff -u -p -r1.124 math_hullinset.C
--- mathed/math_hullinset.C     18 Mar 2004 12:53:43 -0000      1.124
+++ mathed/math_hullinset.C     18 Mar 2004 15:58:53 -0000
@@ -909,30 +909,6 @@ string MathHullInset::fileInsetLabel() c
 #include "support/lyxlib.h"
 
 
-int MathHullInset::ylow() const
-{
-       return yo_ - dim_.asc;
-}
-
-
-int MathHullInset::yhigh() const
-{
-       return yo_ + dim_.des;
-}
-
-
-int MathHullInset::xlow() const
-{
-       return xo_;
-}
-
-
-int MathHullInset::xhigh() const
-{
-       return xo_ + dim_.wid;
-}
-
-
 // simply scrap this function if you want
 void MathHullInset::mutateToText()
 {
@@ -987,18 +963,6 @@ void MathHullInset::handleFont2(LCursor 
 string const MathHullInset::editMessage() const
 {
        return _("Math editor mode");
-}
-
-
-void MathHullInset::insetUnlock(BufferView & bv)
-{
-       if (bv.cursor().inMathed()) {
-               if (bv.cursor().inMacroMode())
-                       bv.cursor().macroModeClose();
-       }
-       if (bv.buffer())
-               generatePreview(*bv.buffer());
-       bv.update();
 }
 
 
Index: mathed/math_hullinset.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_hullinset.h,v
retrieving revision 1.51
diff -u -p -r1.51 math_hullinset.h
--- mathed/math_hullinset.h     18 Mar 2004 12:53:43 -0000      1.51
+++ mathed/math_hullinset.h     18 Mar 2004 15:58:53 -0000
@@ -154,22 +154,10 @@ private:
 // Incorporate me
 //
 public:
-       /// lowest x coordinate
-       int xlow() const;
-       /// highest x coordinate
-       int xhigh() const;
-       /// lowest y coordinate
-       int ylow() const;
-       /// highest y coordinate
-       int yhigh() const;
-
-
        /// what appears in the minibuffer when opening
        virtual std::string const editMessage() const;
        ///
        virtual void getCursorDim(int &, int &) const;
-       ///
-       virtual void insetUnlock(BufferView & bv);
 
        /// To allow transparent use of math editing functions
        //virtual void status(FuncRequest &);
@@ -193,28 +181,11 @@ public:
        ///
        Code lyxCode() const;
 
-private:
-       /// common base for handling accents
-       void handleAccent(BufferView & bv, std::string const & arg,
-               std::string const & name);
-
 protected:
-
-       /** Find the PreviewLoader, add a LaTeX snippet to it and
-        *  start the loading process.
-        *
-        *  Most insets have no interest in this capability, so the method
-        *  defaults to empty.
-        */
-       virtual void generatePreview(Buffer const &) const {}
-
        ///
        void handleFont(LCursor &, std::string const & arg, std::string const & font);
        ///
        void handleFont2(LCursor &, std::string const & arg);
 };
 
-// We don't really want to mess around with mathed stuff outside mathed.
-// So do it here.
-void mathDispatch(LCursor & cur, FuncRequest & cmd);
 #endif

Reply via email to