]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/MathData.h
Improve the list of equations
[lyx.git] / src / mathed / MathData.h
index e6c4c378a4238f73065cc87e21b13dfa08854a51..a1ce7a6df0e720aae0099f4df7f134814bd8da1c 100644 (file)
@@ -5,8 +5,8 @@
  * Licence details can be found in the file COPYING.
  *
  * \author Alejandro Aguilar Sierra
- * \author André Pönitz
- * \author Lars Gullik Bjønnes
+ * \author André Pönitz
+ * \author Lars Gullik Bjønnes
  * \author Stefan Schimanski
  *
  * Full author contact details are available in file CREDITS.
 #ifndef MATH_DATA_H
 #define MATH_DATA_H
 
-#include <vector>
-
-#include "Cursor.h"
 #include "Dimension.h"
+
 #include "MathAtom.h"
+#include "MathRow.h"
+
+#include "OutputEnums.h"
+
+#include "support/strfwd.h"
 
-#include "support/docstream.h"
+#include <cstddef>
+#include <vector>
+#include <map>
 
 
 namespace lyx {
 
+class Buffer;
 class BufferView;
+class Cursor;
+class DocIterator;
 class LaTeXFeatures;
 class ReplaceData;
+class MacroContext;
 class MathMacro;
 class MetricsInfo;
 class PainterInfo;
+class ParIterator;
 class TextMetricsInfo;
 class TextPainter;
 
@@ -59,9 +69,14 @@ public:
 
 public:
        ///
-       MathData() {}
+       MathData(Buffer * buf = 0) : minasc_(0), mindes_(0), slevel_(0),
+                                    sshift_(0), kerning_(0), buffer_(buf) {}
+       ///
+       MathData(Buffer * buf, const_iterator from, const_iterator to);
+       ///
+       Buffer * buffer() { return buffer_; }
        ///
-       MathData(const_iterator from, const_iterator to);
+       Buffer const * buffer() const { return buffer_; }
        ///
        void append(MathData const & ar);
 
@@ -105,6 +120,10 @@ public:
        MathAtom & operator[](pos_type);
        /// checked read access
        MathAtom const & operator[](pos_type) const;
+
+       /// Add this array to a math row. Return true if contents got added
+       bool addToMathRow(MathRow &, MetricsInfo & mi) const;
+
        /// rebuild cached metrics information
        void metrics(MetricsInfo & mi, Dimension & dim) const;
        ///
@@ -118,6 +137,8 @@ public:
        void drawT(TextPainter & pi, int x, int y) const;
        /// mark cell for re-drawing
        void touch() const;
+       /// approximate the math class of the data
+       MathClass mathClass() const;
 
        /// access to cached x coordinate of last drawing
        int xo(BufferView const & bv) const;
@@ -130,13 +151,9 @@ public:
        /// write access to coordinate;
        void setXY(BufferView & bv, int x, int y) const;
        /// returns x coordinate of given position in the array
-       int pos2x(size_type pos) const;
+       int pos2x(BufferView const * bv, size_type pos) const;
        /// returns position of given x coordinate
-       int pos2x(size_type pos, int glue) const;
-       /// returns position of given x coordinate
-       size_type x2pos(int pos) const;
-       /// returns position of given x coordinate fstarting from a certain pos
-       size_type x2pos(int targetx, int glue) const;
+       size_type x2pos(BufferView const * bv, int targetx) const;
        /// returns distance of this cell to the point given by x and y
        // assumes valid position and size cache
        int dist(BufferView const & bv, int x, int y) const;
@@ -150,10 +167,16 @@ public:
        /// additional super/subscript shift
        int sshift() const { return sshift_; }
        /// superscript kerning
-       int kerning() const { return kerning_; }
+       int kerning(BufferView const *) const { return kerning_; }
        ///
        void swap(MathData & ar) { base_type::swap(ar); }
 
+       /// attach/detach arguments to macros, updating the cur to
+       /// stay visually at the same position (cur==0 is allowed)
+       void updateMacros(Cursor * cur, MacroContext const & mc, UpdateType, int nesting);
+       ///
+       void updateBuffer(ParIterator const &, UpdateType);
+
 protected:
        /// cached values for super/subscript placement
        mutable int minasc_;
@@ -161,30 +184,33 @@ protected:
        mutable int slevel_;
        mutable int sshift_;
        mutable int kerning_;
-       
+       Buffer * buffer_;
+
+       /// cached object that describes typeset data
+       mutable std::map<BufferView*, MathRow> mrow_cache_;
+
 private:
        /// is this an exact match at this position?
        bool find1(MathData const & ar, size_type pos) const;
 
-       /// attach/detach arguments to macros
-       void updateMacros(MetricsInfo & mi);
        ///
-       void detachMacroParameters(Cursor & cur, const size_type macroPos);
+       void detachMacroParameters(DocIterator * dit, const size_type macroPos);
        ///
-       void attachMacroParameters(Cursor & cur, const size_type macroPos, 
+       void attachMacroParameters(Cursor * cur, const size_type macroPos, 
                const size_type macroNumArgs, const int macroOptionals,
-               const bool fromInitToNormalMode, const bool greedy);
+               const bool fromInitToNormalMode, const bool interactiveInit,
+               const size_t appetite);
        ///
-       void collectOptionalParameters(Cursor & cur, 
+       void collectOptionalParameters(Cursor * cur, 
                const size_type numOptionalParams, std::vector<MathData> & params, 
-               size_t & pos, const pos_type macroPos, const int thisPos, const int thisSlice);
-       ///
-       void collectParameters(Cursor & cur, 
-               const size_type numParams, std::vector<MathData> & params, 
                size_t & pos, MathAtom & scriptToPutAround,
                const pos_type macroPos, const int thisPos, const int thisSlice);
        ///
-       mutable std::vector<Dimension> atom_dims_;
+       void collectParameters(Cursor * cur, 
+               const size_type numParams, std::vector<MathData> & params, 
+               size_t & pos, MathAtom & scriptToPutAround,
+               const pos_type macroPos, const int thisPos, const int thisSlice,
+               const size_t appetite);
 };
 
 ///