X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathData.h;h=a1ce7a6df0e720aae0099f4df7f134814bd8da1c;hb=cdc847fd304019a19425a0d5d9d42a556a937097;hp=9889b1a2f0da4679042efa8580ff07538533bee5;hpb=e89625ef28143545a511cdabc67dee8b7be1b216;p=lyx.git diff --git a/src/mathed/MathData.h b/src/mathed/MathData.h index 9889b1a2f0..a1ce7a6df0 100644 --- a/src/mathed/MathData.h +++ b/src/mathed/MathData.h @@ -5,8 +5,9 @@ * 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. */ @@ -14,21 +15,38 @@ #ifndef MATH_DATA_H #define MATH_DATA_H -#include -#include +#include "Dimension.h" #include "MathAtom.h" -#include "dimension.h" +#include "MathRow.h" + +#include "OutputEnums.h" + +#include "support/strfwd.h" + +#include +#include +#include + + +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; -class MathArray : private std::vector { +class MathData : private std::vector { public: /// re-use inhertited stuff typedef std::vector base_type; @@ -45,23 +63,27 @@ public: using base_type::pop_back; using base_type::back; using base_type::front; - using base_type::swap; /// typedef size_type idx_type; typedef size_type pos_type; public: /// - MathArray(); + MathData(Buffer * buf = 0) : minasc_(0), mindes_(0), slevel_(0), + sshift_(0), kerning_(0), buffer_(buf) {} /// - MathArray(const_iterator from, const_iterator to); + MathData(Buffer * buf, const_iterator from, const_iterator to); /// - void append(MathArray const & ar); + Buffer * buffer() { return buffer_; } + /// + Buffer const * buffer() const { return buffer_; } + /// + void append(MathData const & ar); /// inserts single atom at position pos void insert(size_type pos, MathAtom const & at); /// inserts multiple atoms at position pos - void insert(size_type pos, MathArray const & ar); + void insert(size_type pos, MathData const & ar); /// erase range from pos1 to pos2 void erase(iterator pos1, iterator pos2); @@ -79,18 +101,18 @@ public: /// void replace(ReplaceData &); /// - void substitute(MathArray const & m); + void substitute(MathData const & m); /// looks for exact match - bool match(MathArray const & ar) const; + bool match(MathData const & ar) const; /// looks for inclusion match starting at pos - bool matchpart(MathArray const & ar, pos_type pos) const; + bool matchpart(MathData const & ar, pos_type pos) const; /// looks for containment, return == size mean not found - size_type find(MathArray const & ar) const; + size_type find(MathData const & ar) const; /// looks for containment, return == size mean not found - size_type find_last(MathArray const & ar) const; + size_type find_last(MathData const & ar) const; /// - bool contains(MathArray const & ar) const; + bool contains(MathData const & ar) const; /// void validate(LaTeXFeatures &) const; @@ -98,10 +120,15 @@ public: MathAtom & operator[](pos_type); /// checked read access MathAtom const & operator[](pos_type) const; - /// rebuild cached metrics information - void metrics(MetricsInfo & mi) 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; + /// + Dimension const & dimension(BufferView const &) const; + /// redraw cell using cache metrics information void draw(PainterInfo & pi, int x, int y) const; /// rebuild cached metrics information @@ -110,52 +137,88 @@ 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() const; + int xo(BufferView const & bv) const; /// access to cached y coordinate of last drawing - int yo() const; + int yo(BufferView const & bv) const; /// access to cached x coordinate of mid point of last drawing - int xm() const { return xo() + dim_.wid / 2; } + int xm(BufferView const & bv) const; /// access to cached y coordinate of mid point of last drawing - int ym() const { return yo() + (dim_.des - dim_.asc) / 2; } + int ym(BufferView const & bv) const; /// write access to coordinate; - void setXY(int x, int y) const; + void setXY(BufferView & bv, int x, int y) const; /// returns x coordinate of given position in the array - int pos2x(size_type pos) const; - /// returns position of given x coordinate - int pos2x(size_type pos, int glue) const; + int pos2x(BufferView const * bv, size_type pos) 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(int x, int y) const; - - /// ascent of this cell above the baseline - int ascent() const { return dim_.asc; } - /// descent of this cell below the baseline - int descent() const { return dim_.des; } - /// height of the cell - int height() const { return dim_.asc + dim_.des; } - /// width of this cell - int width() const { return dim_.wid; } - /// dimensions of cell - Dimension const & dim() const { return dim_; } - /// dimensions of cell - void setDim(Dimension const & d) const { dim_ = d; } + int dist(BufferView const & bv, int x, int y) const; + + /// minimum ascent offset for superscript + int minasc() const { return minasc_; } + /// minimum descent offset for subscript + int mindes() const { return mindes_; } + /// level above/below which super/subscript should extend + int slevel() const { return slevel_; } + /// additional super/subscript shift + int sshift() const { return sshift_; } + /// superscript 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_; + mutable int mindes_; + mutable int slevel_; + mutable int sshift_; + mutable int kerning_; + Buffer * buffer_; + + /// cached object that describes typeset data + mutable std::map mrow_cache_; private: /// is this an exact match at this position? - bool find1(MathArray const & ar, size_type pos) const; + bool find1(MathData const & ar, size_type pos) const; - /// cached dimensions of cell - mutable Dimension dim_; + /// + void detachMacroParameters(DocIterator * dit, const size_type macroPos); + /// + void attachMacroParameters(Cursor * cur, const size_type macroPos, + const size_type macroNumArgs, const int macroOptionals, + const bool fromInitToNormalMode, const bool interactiveInit, + const size_t appetite); + /// + void collectOptionalParameters(Cursor * cur, + const size_type numOptionalParams, std::vector & params, + size_t & pos, MathAtom & scriptToPutAround, + const pos_type macroPos, const int thisPos, const int thisSlice); + /// + void collectParameters(Cursor * cur, + const size_type numParams, std::vector & params, + size_t & pos, MathAtom & scriptToPutAround, + const pos_type macroPos, const int thisPos, const int thisSlice, + const size_t appetite); }; /// -std::ostream & operator<<(std::ostream & os, MathArray const & ar); +std::ostream & operator<<(std::ostream & os, MathData const & ar); +/// +odocstream & operator<<(odocstream & os, MathData const & ar); + +} // namespace lyx #endif