X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathData.h;h=2f6ab22acd3967d76fad2b55b1405422343251a6;hb=f2f7ea9edcdafb0e02d91cc2af53185154d41bd8;hp=b808dba5790a43304cca06eea1ef6decada528b3;hpb=de6418f37765fe452f135f96dee6d49897bff215;p=lyx.git diff --git a/src/mathed/MathData.h b/src/mathed/MathData.h index b808dba579..2f6ab22acd 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,26 +15,38 @@ #ifndef MATH_DATA_H #define MATH_DATA_H -#include +#include "Dimension.h" #include "MathAtom.h" -#include "dimension.h" +#include "MathRow.h" + +#include "OutputEnums.h" + +#include "support/strfwd.h" -#include "support/docstream.h" +#include +#include +#include namespace lyx { +class Buffer; class BufferView; +class Cursor; +class DocIterator; class LaTeXFeatures; class ReplaceData; +class MacroContext; +class InsetMathMacro; 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; @@ -50,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) {} + /// + MathData(Buffer * buf, const_iterator from, const_iterator to); + /// + Buffer * buffer() { return buffer_; } /// - MathArray(const_iterator from, const_iterator to); + Buffer const * buffer() const { return buffer_; } /// - void append(MathArray const & ar); + 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); @@ -84,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; @@ -103,10 +120,17 @@ 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; + + /// draw the selection over the cell + void drawSelection(PainterInfo & pi, int x, int y) const; /// redraw cell using cache metrics information void draw(PainterInfo & pi, int x, int y) const; /// rebuild cached metrics information @@ -115,54 +139,86 @@ 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 & bv) const; + int xo(BufferView const & bv) const; /// access to cached y coordinate of last drawing - int yo(BufferView & bv) const; + int yo(BufferView const & bv) const; /// access to cached x coordinate of mid point of last drawing - int xm(BufferView & bv) const { return xo(bv) + dim_.wid / 2; } + int xm(BufferView const & bv) const; /// access to cached y coordinate of mid point of last drawing - int ym(BufferView & bv) const { return yo(bv) + (dim_.des - dim_.asc) / 2; } + int ym(BufferView const & bv) const; /// 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 & bv, 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_; } + /// Italic correction as described in InsetMathScript.h + 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, MathArray const & ar); +odocstream & operator<<(odocstream & os, MathData const & ar); } // namespace lyx