00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef ELEMENTTYPE_H
00022 #define ELEMENTTYPE_H
00023
00024 #include <qfont.h>
00025 #include <qstring.h>
00026 #include <qdom.h>
00027
00028 #include "contextstyle.h"
00029 #include "kformuladefs.h"
00030
00031 class QPainter;
00032
00033 KFORMULA_NAMESPACE_BEGIN
00034
00035 class BasicElement;
00036 class BracketType;
00037 class ComplexElementType;
00038 class InnerElementType;
00039 class MultiElementType;
00040 class OperatorType;
00041 class PunctuationType;
00042 class RelationType;
00043 class SequenceElement;
00044 class SequenceParser;
00045 class TextElement;
00046
00047
00052 class ElementType {
00053 public:
00054 ElementType(SequenceParser* parser);
00055 virtual ~ElementType();
00056
00060 virtual bool isInvisible(const TextElement&) const { return false; }
00061
00066 virtual QString text( SequenceElement* seq ) const;
00067
00071 uint start() const { return from; }
00072
00076 uint end() const { return to; }
00077
00082 virtual luPt getSpaceBefore( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00083 virtual luPt getSpaceAfter( MultiElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00084 virtual luPt getSpaceAfter( OperatorType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00085 virtual luPt getSpaceAfter( RelationType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00086 virtual luPt getSpaceAfter( PunctuationType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00087 virtual luPt getSpaceAfter( BracketType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00088 virtual luPt getSpaceAfter( ComplexElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00089 virtual luPt getSpaceAfter( InnerElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00090
00094 virtual QFont getFont( const ContextStyle& context );
00095
00099 virtual void setUpPainter( const ContextStyle& context, QPainter& painter );
00100
00101
00102 static int getEvilDestructionCount() { return evilDestructionCount; }
00103
00104 virtual void output();
00105
00109 void append( ElementType* );
00110
00111 ElementType* getPrev() const { return prev; }
00112
00113 virtual void saveMathML( SequenceElement* se, QDomDocument doc, QDomElement de );
00114
00115 virtual bool multiElement() const { return false; }
00116
00117 protected:
00118
00119 void setStart( uint start ) { from = start; }
00120 void setEnd( uint end ) { to = end; }
00121
00122 luPt thinSpaceIfNotScript( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00123 luPt mediumSpaceIfNotScript( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00124 luPt thickSpaceIfNotScript( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00125
00126 private:
00127
00132 uint from;
00133
00138 uint to;
00139
00144 ElementType* prev;
00145
00146
00147 static int evilDestructionCount;
00148 };
00149
00150
00155 class SequenceType : public ElementType {
00156 public:
00157 SequenceType( SequenceParser* parser );
00158 ~SequenceType();
00159
00160 virtual void output();
00161 private:
00162
00166 ElementType* last;
00167 };
00168
00169
00173 class MultiElementType : public ElementType {
00174 public:
00175 MultiElementType( SequenceParser* parser );
00176
00177 virtual luPt getSpaceBefore( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00178 virtual luPt getSpaceAfter( OperatorType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00179 virtual luPt getSpaceAfter( RelationType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00180 virtual luPt getSpaceAfter( InnerElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00181
00182 virtual bool multiElement() const { return true; }
00183
00188 virtual QString text( SequenceElement* ) const { return m_text; }
00189
00190 private:
00191
00192 QString m_text;
00193 };
00194
00195
00200 class TextType : public MultiElementType {
00201 public:
00202 TextType( SequenceParser* parser );
00203 virtual void saveMathML( SequenceElement* se, QDomDocument doc, QDomElement de );
00204 };
00205
00206
00210 class NumberType : public MultiElementType {
00211 public:
00212 NumberType(SequenceParser* parser);
00213
00217 virtual QFont getFont(const ContextStyle& context);
00218
00222 virtual void setUpPainter(const ContextStyle& context, QPainter& painter);
00223
00224 virtual void saveMathML( SequenceElement* se, QDomDocument doc, QDomElement de );
00225 };
00226
00227
00231 class SingleElementType : public ElementType {
00232 public:
00233 SingleElementType( SequenceParser* parser );
00234 };
00235
00236
00240 class NameType : public MultiElementType {
00241 public:
00242 NameType( SequenceParser* parser );
00243
00247 virtual QFont getFont( const ContextStyle& context );
00248
00249 virtual void saveMathML( SequenceElement* se, QDomDocument doc, QDomElement de );
00250
00251 private:
00252 };
00253
00254
00255 class AbstractOperatorType : public SingleElementType {
00256 public:
00257 AbstractOperatorType( SequenceParser* parser );
00258
00259 void saveMathML( SequenceElement* se, QDomDocument doc, QDomElement de );
00260 };
00261
00262 class OperatorType : public AbstractOperatorType {
00263 public:
00264 OperatorType( SequenceParser* parser );
00265
00266 virtual luPt getSpaceBefore( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00267 virtual luPt getSpaceAfter( MultiElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00268 virtual luPt getSpaceAfter( BracketType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00269 virtual luPt getSpaceAfter( ComplexElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00270 virtual luPt getSpaceAfter( InnerElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00271
00275 virtual QFont getFont(const ContextStyle& context);
00276
00280 virtual void setUpPainter(const ContextStyle& context, QPainter& painter);
00281 };
00282
00283
00284 class RelationType : public AbstractOperatorType {
00285 public:
00286 RelationType( SequenceParser* parser );
00287
00288 virtual luPt getSpaceBefore( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00289 virtual luPt getSpaceAfter( MultiElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00290 virtual luPt getSpaceAfter( BracketType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00291 virtual luPt getSpaceAfter( ComplexElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00292 virtual luPt getSpaceAfter( InnerElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00293
00297 virtual QFont getFont( const ContextStyle& context );
00298
00302 virtual void setUpPainter( const ContextStyle& context, QPainter& painter );
00303 };
00304
00305
00306 class PunctuationType : public AbstractOperatorType {
00307 public:
00308 PunctuationType( SequenceParser* parser );
00309
00310 virtual luPt getSpaceBefore( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00311 virtual luPt getSpaceAfter( MultiElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00312 virtual luPt getSpaceAfter( RelationType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00313 virtual luPt getSpaceAfter( PunctuationType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00314 virtual luPt getSpaceAfter( BracketType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00315 virtual luPt getSpaceAfter( ComplexElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00316 virtual luPt getSpaceAfter( InnerElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00317
00321 virtual QFont getFont( const ContextStyle& context );
00322
00326 virtual void setUpPainter( const ContextStyle& context, QPainter& painter );
00327 };
00328
00329
00330 class BracketType : public SingleElementType {
00331 public:
00332 BracketType( SequenceParser* parser );
00333
00334 virtual luPt getSpaceBefore( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00335 virtual luPt getSpaceAfter( OperatorType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00336 virtual luPt getSpaceAfter( RelationType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00337 virtual luPt getSpaceAfter( InnerElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00338 };
00339
00340
00341 class ComplexElementType : public SingleElementType {
00342 public:
00343 ComplexElementType( SequenceParser* parser );
00344
00345
00346 virtual luPt getSpaceBefore( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00347 virtual luPt getSpaceAfter( OperatorType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00348 virtual luPt getSpaceAfter( RelationType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00349 virtual luPt getSpaceAfter( InnerElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00350 };
00351
00352
00353 class InnerElementType : public SingleElementType {
00354 public:
00355 InnerElementType( SequenceParser* parser );
00356
00357 virtual luPt getSpaceBefore( const ContextStyle& context, ContextStyle::TextStyle tstyle );
00358 virtual luPt getSpaceAfter( MultiElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00359 virtual luPt getSpaceAfter( OperatorType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00360 virtual luPt getSpaceAfter( RelationType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00361 virtual luPt getSpaceAfter( PunctuationType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00362 virtual luPt getSpaceAfter( BracketType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00363 virtual luPt getSpaceAfter( ComplexElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00364 virtual luPt getSpaceAfter( InnerElementType* type, const ContextStyle& context, ContextStyle::TextStyle tstyle );
00365 };
00366
00367
00368 KFORMULA_NAMESPACE_END
00369
00370 #endif // ELEMENTTYPE_H