xref: /aoo4110/main/starmath/inc/node.hxx (revision b1cdbd2c)
1  /**************************************************************
2   *
3   * Licensed to the Apache Software Foundation (ASF) under one
4   * or more contributor license agreements.  See the NOTICE file
5   * distributed with this work for additional information
6   * regarding copyright ownership.  The ASF licenses this file
7   * to you under the Apache License, Version 2.0 (the
8   * "License"); you may not use this file except in compliance
9   * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   *
20   *************************************************************/
21  
22  
23  
24  
25  #ifndef NODE_HXX
26  #define NODE_HXX
27  
28  
29  #include <vector>
30  
31  #include "parse.hxx"
32  #include "types.hxx"
33  #include "rect.hxx"
34  #include "format.hxx"
35  
36  
37  #define ATTR_BOLD		0x0001
38  #define ATTR_ITALIC		0x0002
39  
40  #define FNTSIZ_ABSOLUT	1
41  #define FNTSIZ_PLUS 	2
42  #define FNTSIZ_MINUS	3
43  #define FNTSIZ_MULTIPLY 4
44  #define FNTSIZ_DIVIDE	5
45  
46  // flags to interdict respective status changes
47  #define FLG_FONT		0x0001
48  #define FLG_SIZE		0x0002
49  #define FLG_BOLD   		0x0004
50  #define FLG_ITALIC		0x0008
51  #define FLG_COLOR		0x0010
52  #define FLG_VISIBLE		0x0020
53  #define FLG_HORALIGN	0x0040
54  
55  
56  extern SmFormat	*pActiveFormat;
57  
58  class SmDocShell;
59  class SmNode;
60  class SmStructureNode;
61  
62  typedef std::vector< SmNode * > SmNodeArray;
63  typedef std::vector< SmStructureNode * > SmStructureNodeArray;
64  
65  
66  ////////////////////////////////////////////////////////////////////////////////
67  
68  enum SmScaleMode	{ SCALE_NONE, SCALE_WIDTH, SCALE_HEIGHT };
69  
70  enum SmNodeType
71  {
72  	NTABLE,			NBRACE,			NBRACEBODY,		NOPER,			NALIGN,
73  	NATTRIBUT,		NFONT,			NUNHOR,			NBINHOR,		NBINVER,
74  	NBINDIAGONAL,	NSUBSUP,		NMATRIX,		NPLACE,			NTEXT,
75  	NSPECIAL,		NGLYPH_SPECIAL,	NMATH,			NBLANK,			NERROR,
76      NLINE,          NEXPRESSION,    NPOLYLINE,      NROOT,          NROOTSYMBOL,
77      NRECTANGLE,     NVERTICAL_BRACE
78  };
79  
80  
81  ////////////////////////////////////////////////////////////////////////////////
82  
83  
84  class SmNode : public SmRect
85  {
86      SmFace          aFace;
87  
88  	SmToken			aNodeToken;
89  	SmNodeType		eType;
90  	SmScaleMode		eScaleMode;
91  	RectHorAlign	eRectHorAlign;
92  	sal_uInt16			nFlags,
93  					nAttributes;
94  	sal_Bool			bIsPhantom,
95  					bIsDebug;
96  protected:
97  	SmNode(SmNodeType eNodeType, const SmToken &rNodeToken);
98  
99      // index in accessible text -1 if not (yet) applicable
100      sal_Int32       nAccIndex;
101  
102  public:
103  	virtual 			~SmNode();
104  
105      virtual sal_Bool        IsVisible() const;
106  
107      virtual sal_uInt16      GetNumSubNodes() const;
108      virtual SmNode *    GetSubNode(sal_uInt16 nIndex);
GetSubNode(sal_uInt16 nIndex) const109  			const SmNode * GetSubNode(sal_uInt16 nIndex) const
110  			{
111  				return ((SmNode *) this)->GetSubNode(nIndex);
112  			}
113  
114  	virtual SmNode * 	   GetLeftMost();
GetLeftMost() const115  			const SmNode * GetLeftMost() const
116  			{
117  				return ((SmNode *) this)->GetLeftMost();
118  			}
119  
Flags()120  			sal_uInt16 &	Flags() { return nFlags; }
Attributes()121  			sal_uInt16 &	Attributes() { return nAttributes; }
122  
IsDebug() const123  			sal_Bool IsDebug() const { return bIsDebug; }
IsPhantom() const124  			sal_Bool IsPhantom() const { return bIsPhantom; }
125  			void SetPhantom(sal_Bool bIsPhantom);
126  			void SetColor(const Color &rColor);
127  
128  			void SetAttribut(sal_uInt16 nAttrib);
129  			void ClearAttribut(sal_uInt16 nAttrib);
130  
GetFont() const131  			const SmFace & GetFont() const { return aFace; };
GetFont()132  				  SmFace & GetFont()  	   { return aFace; };
133  
134  			void SetFont(const SmFace &rFace);
135  			void SetFontSize(const Fraction &rRelSize, sal_uInt16 nType);
136  			void SetSize(const Fraction &rScale);
137  
138  	virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell);
139  	virtual void PrepareAttributes();
140  
141  #if OSL_DEBUG_LEVEL
142  			void ToggleDebug() const;
143  #endif
144  
145      void         SetRectHorAlign(RectHorAlign eHorAlign, sal_Bool bApplyToSubTree = sal_True );
GetRectHorAlign() const146  	RectHorAlign GetRectHorAlign() const { return eRectHorAlign; }
147  
GetRect() const148  	const SmRect & GetRect() const { return *this; }
GetRect()149  		  SmRect & GetRect() 	   { return *this; }
150  
151  	virtual void Move(const Point &rPosition);
MoveTo(const Point & rPosition)152  	void MoveTo(const Point &rPosition) { Move(rPosition - GetTopLeft()); }
153  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
154  	virtual void CreateTextFromNode(String &rText);
155  
156  #ifdef SM_RECT_DEBUG
157      using   SmRect::Draw;
158  #endif
159  	virtual void Draw(OutputDevice &rDev, const Point &rPosition) const;
160  
161      virtual void    GetAccessibleText( String &rText ) const;
GetAccessibleIndex() const162      sal_Int32       GetAccessibleIndex() const { return nAccIndex; }
163      const SmNode *  FindNodeWithAccessibleIndex(xub_StrLen nAccIndex) const;
164  
GetRow() const165  	sal_uInt16	GetRow() const	  { return (sal_uInt16)aNodeToken.nRow; }
GetColumn() const166  	sal_uInt16	GetColumn() const { return (sal_uInt16)aNodeToken.nCol; }
167  
GetScaleMode() const168  	SmScaleMode		GetScaleMode() const { return eScaleMode; }
SetScaleMode(SmScaleMode eMode)169  	void			SetScaleMode(SmScaleMode eMode) { eScaleMode = eMode; }
170  
171  	virtual void AdaptToX(const OutputDevice &rDev, sal_uLong nWidth);
172  	virtual void AdaptToY(const OutputDevice &rDev, sal_uLong nHeight);
173  
GetType() const174  	SmNodeType		GetType() const  { return eType; }
GetToken() const175  	const SmToken &	GetToken() const { return aNodeToken; }
176  
177  	const SmNode *	FindTokenAt(sal_uInt16 nRow, sal_uInt16 nCol) const;
178  	const SmNode *	FindRectClosestTo(const Point &rPoint) const;
179  
180      // --> 4.7.2010 #i972#
181      virtual long GetFormulaBaseline() const;
182      // <--
183  };
184  
185  
186  ////////////////////////////////////////////////////////////////////////////////
187  
188  
189  class SmStructureNode : public SmNode
190  {
191  	SmNodeArray  aSubNodes;
192  
193  protected:
SmStructureNode(SmNodeType eNodeType,const SmToken & rNodeToken)194  	SmStructureNode(SmNodeType eNodeType, const SmToken &rNodeToken)
195  	:	SmNode(eNodeType, rNodeToken)
196  	{}
197  
198  public:
199              SmStructureNode( const SmStructureNode &rNode );
200  	virtual ~SmStructureNode();
201  
202  	virtual sal_Bool 		IsVisible() const;
203  
204  	virtual sal_uInt16		GetNumSubNodes() const;
SetNumSubNodes(sal_uInt16 nSize)205              void        SetNumSubNodes(sal_uInt16 nSize) { aSubNodes.resize(nSize); }
206  
207      using   SmNode::GetSubNode;
208  	virtual	SmNode * 	GetSubNode(sal_uInt16 nIndex);
209              void SetSubNodes(SmNode *pFirst, SmNode *pSecond, SmNode *pThird = NULL);
210  			void SetSubNodes(const SmNodeArray &rNodeArray);
211  
212      virtual SmStructureNode & operator = ( const SmStructureNode &rNode );
213  
214      virtual void  GetAccessibleText( String &rText ) const;
215  };
216  
217  
218  ////////////////////////////////////////////////////////////////////////////////
219  
220  
221  class SmVisibleNode : public SmNode
222  {
223  protected:
SmVisibleNode(SmNodeType eNodeType,const SmToken & rNodeToken)224  	SmVisibleNode(SmNodeType eNodeType, const SmToken &rNodeToken)
225  	:	SmNode(eNodeType, rNodeToken)
226  	{}
227  
228  public:
229  
230  	virtual sal_Bool 		IsVisible() const;
231  	virtual	sal_uInt16		GetNumSubNodes() const;
232      using   SmNode::GetSubNode;
233  	virtual	SmNode * 	GetSubNode(sal_uInt16 nIndex);
234  };
235  
236  
237  ////////////////////////////////////////////////////////////////////////////////
238  
239  
240  class SmGraphicNode : public SmVisibleNode
241  {
242  protected:
SmGraphicNode(SmNodeType eNodeType,const SmToken & rNodeToken)243  	SmGraphicNode(SmNodeType eNodeType, const SmToken &rNodeToken)
244  	:	SmVisibleNode(eNodeType, rNodeToken)
245  	{}
246  
247  public:
248  
249      virtual void  GetAccessibleText( String &rText ) const;
250  };
251  
252  
253  ////////////////////////////////////////////////////////////////////////////////
254  
255  
256  class SmRectangleNode : public SmGraphicNode
257  {
258  	Size  aToSize;
259  
260  public:
SmRectangleNode(const SmToken & rNodeToken)261  	SmRectangleNode(const SmToken &rNodeToken)
262  	:	SmGraphicNode(NRECTANGLE, rNodeToken)
263  	{}
264  
265  	virtual void AdaptToX(const OutputDevice &rDev, sal_uLong nWidth);
266  	virtual void AdaptToY(const OutputDevice &rDev, sal_uLong nHeight);
267  
268  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
269  
270  #ifdef SM_RECT_DEBUG
271      using   SmRect::Draw;
272  #endif
273  	virtual void Draw(OutputDevice &rDev, const Point &rPosition) const;
274  
275      void CreateTextFromNode(String &rText);
276  };
277  
278  
279  ////////////////////////////////////////////////////////////////////////////////
280  
281  
282  class SmPolyLineNode : public SmGraphicNode
283  {
284  	Polygon		aPoly;
285  	Size		aToSize;
286  	long		nWidth;
287  
288  public:
289  	SmPolyLineNode(const SmToken &rNodeToken);
290  
GetWidth() const291  	long		 GetWidth() const { return nWidth; }
292  
293  	virtual void AdaptToX(const OutputDevice &rDev, sal_uLong nWidth);
294  	virtual void AdaptToY(const OutputDevice &rDev, sal_uLong nHeight);
295  
296  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
297  
298  #ifdef SM_RECT_DEBUG
299      using   SmRect::Draw;
300  #endif
301  	virtual void Draw(OutputDevice &rDev, const Point &rPosition) const;
302  };
303  
304  
305  ////////////////////////////////////////////////////////////////////////////////
306  
307  
308  class SmTextNode : public SmVisibleNode
309  {
310      XubString   aText;
311      sal_uInt16      nFontDesc;
312  
313  protected:
314  	SmTextNode(SmNodeType eNodeType, const SmToken &rNodeToken, sal_uInt16 nFontDescP );
315  
316  public:
317  	SmTextNode(const SmToken &rNodeToken, sal_uInt16 nFontDescP );
318  
GetFontDesc() const319  	sal_uInt16				GetFontDesc() const { return nFontDesc; }
SetText(const XubString & rText)320  	void				SetText(const XubString &rText) { aText = rText; }
GetText() const321  	const XubString &	GetText() const { return aText; }
322  
323  	virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell);
324  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
325  	virtual void CreateTextFromNode(String &rText);
326  
327  #ifdef SM_RECT_DEBUG
328      using   SmRect::Draw;
329  #endif
330  	virtual void Draw(OutputDevice &rDev, const Point &rPosition) const;
331  
332      virtual void  GetAccessibleText( String &rText ) const;
333  };
334  
335  
336  ////////////////////////////////////////////////////////////////////////////////
337  
338  
339  class SmSpecialNode : public SmTextNode
340  {
341      bool    bIsFromGreekSymbolSet;
342  
343  protected:
344      SmSpecialNode(SmNodeType eNodeType, const SmToken &rNodeToken, sal_uInt16 _nFontDesc);
345  
346  public:
347  	SmSpecialNode(const SmToken &rNodeToken);
348  
349  	virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell);
350  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
351  
352  #ifdef SM_RECT_DEBUG
353      using   SmRect::Draw;
354  #endif
355  	virtual void Draw(OutputDevice &rDev, const Point &rPosition) const;
356  };
357  
358  
359  ////////////////////////////////////////////////////////////////////////////////
360  
361  
362  class SmGlyphSpecialNode : public SmSpecialNode
363  {
364  public:
SmGlyphSpecialNode(const SmToken & rNodeToken)365  	SmGlyphSpecialNode(const SmToken &rNodeToken)
366  	:	SmSpecialNode(NGLYPH_SPECIAL, rNodeToken, FNT_MATH)
367  	{}
368  
369  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
370  };
371  
372  
373  ////////////////////////////////////////////////////////////////////////////////
374  
375  
376  class SmMathSymbolNode : public SmSpecialNode
377  {
378  protected:
SmMathSymbolNode(SmNodeType eNodeType,const SmToken & rNodeToken)379  	SmMathSymbolNode(SmNodeType eNodeType, const SmToken &rNodeToken)
380  	:	SmSpecialNode(eNodeType, rNodeToken, FNT_MATH)
381      {
382          xub_Unicode cChar = GetToken().cMathChar;
383          if ((xub_Unicode) '\0' != cChar)
384              SetText( cChar );
385      }
386  
387  public:
388  	SmMathSymbolNode(const SmToken &rNodeToken);
389  
390  	virtual void AdaptToX(const OutputDevice &rDev, sal_uLong nWidth);
391  	virtual void AdaptToY(const OutputDevice &rDev, sal_uLong nHeight);
392  
393  	virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell);
394  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
395  	void CreateTextFromNode(String &rText);
396  };
397  
398  
399  ////////////////////////////////////////////////////////////////////////////////
400  
401  
402  class SmRootSymbolNode : public SmMathSymbolNode
403  {
404      sal_uLong  nBodyWidth;  // width of body (argument) of root sign
405  
406  public:
SmRootSymbolNode(const SmToken & rNodeToken)407      SmRootSymbolNode(const SmToken &rNodeToken)
408      :   SmMathSymbolNode(NROOTSYMBOL, rNodeToken)
409      {}
410  
411      virtual void AdaptToX(const OutputDevice &rDev, sal_uLong nWidth);
412      virtual void AdaptToY(const OutputDevice &rDev, sal_uLong nHeight);
413  
414  #ifdef SM_RECT_DEBUG
415      using   SmRect::Draw;
416  #endif
417      virtual void Draw(OutputDevice &rDev, const Point &rPosition) const;
418  };
419  
420  
421  ////////////////////////////////////////////////////////////////////////////////
422  
423  
424  class SmPlaceNode : public SmMathSymbolNode
425  {
426  public:
SmPlaceNode(const SmToken & rNodeToken)427  	SmPlaceNode(const SmToken &rNodeToken)
428  	:	SmMathSymbolNode(NPLACE, rNodeToken)
429  	{
430  	}
431  
432  	virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell);
433  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
434  };
435  
436  
437  ////////////////////////////////////////////////////////////////////////////////
438  
439  
440  class SmErrorNode : public SmMathSymbolNode
441  {
442  public:
SmErrorNode(SmParseError,const SmToken & rNodeToken)443      SmErrorNode(SmParseError /*eError*/, const SmToken &rNodeToken)
444  	:	SmMathSymbolNode(NERROR, rNodeToken)
445  	{
446  		SetText((xub_Unicode) MS_ERROR);
447  	}
448  
449  	virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell);
450  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
451  };
452  
453  
454  ////////////////////////////////////////////////////////////////////////////////
455  
456  
457  class SmTableNode : public SmStructureNode
458  {
459      // --> 4.7.2010 #i972#
460      long nFormulaBaseline;
461      // <--
462  public:
SmTableNode(const SmToken & rNodeToken)463  	SmTableNode(const SmToken &rNodeToken)
464  	:	SmStructureNode(NTABLE, rNodeToken)
465  	{}
466  
467      using   SmNode::GetLeftMost;
468  	virtual SmNode * GetLeftMost();
469  
470  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
471      virtual long GetFormulaBaseline() const;
472  };
473  
474  
475  ////////////////////////////////////////////////////////////////////////////////
476  
477  
478  class SmLineNode : public SmStructureNode
479  {
480  	sal_Bool  bUseExtraSpaces;
481  
482  protected:
SmLineNode(SmNodeType eNodeType,const SmToken & rNodeToken)483  	SmLineNode(SmNodeType eNodeType, const SmToken &rNodeToken)
484  	:	SmStructureNode(eNodeType, rNodeToken)
485  	{
486  		bUseExtraSpaces = sal_True;
487  	}
488  
489  public:
SmLineNode(const SmToken & rNodeToken)490  	SmLineNode(const SmToken &rNodeToken)
491  	:	SmStructureNode(NLINE, rNodeToken)
492  	{
493  		bUseExtraSpaces = sal_True;
494  	}
495  
SetUseExtraSpaces(sal_Bool bVal)496  	void  SetUseExtraSpaces(sal_Bool bVal) { bUseExtraSpaces = bVal; }
IsUseExtraSpaces() const497  	sal_Bool  IsUseExtraSpaces() const { return bUseExtraSpaces; };
498  
499  	virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell);
500  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
501  };
502  
503  
504  ////////////////////////////////////////////////////////////////////////////////
505  
506  
507  class SmExpressionNode : public SmLineNode
508  {
509  public:
SmExpressionNode(const SmToken & rNodeToken)510  	SmExpressionNode(const SmToken &rNodeToken)
511  	:	SmLineNode(NEXPRESSION, rNodeToken)
512  	{}
513  
514  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
515  	void CreateTextFromNode(String &rText);
516  };
517  
518  
519  ////////////////////////////////////////////////////////////////////////////////
520  
521  
522  class SmUnHorNode : public SmStructureNode
523  {
524  public:
SmUnHorNode(const SmToken & rNodeToken)525  	SmUnHorNode(const SmToken &rNodeToken)
526  	:	SmStructureNode(NUNHOR, rNodeToken)
527  	{
528  		SetNumSubNodes(2);
529  	}
530  
531  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
532  };
533  
534  
535  ////////////////////////////////////////////////////////////////////////////////
536  
537  
538  class SmRootNode : public SmStructureNode
539  {
540  protected:
541  	void   GetHeightVerOffset(const SmRect &rRect,
542  							  long &rHeight, long &rVerOffset) const;
543  	Point  GetExtraPos(const SmRect &rRootSymbol, const SmRect &rExtra) const;
544  
545  public:
SmRootNode(const SmToken & rNodeToken)546  	SmRootNode(const SmToken &rNodeToken)
547  	:	SmStructureNode(NROOT, rNodeToken)
548  	{
549  		SetNumSubNodes(3);
550  	}
551  
552  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
553  	void CreateTextFromNode(String &rText);
554  };
555  
556  
557  ////////////////////////////////////////////////////////////////////////////////
558  
559  
560  class SmBinHorNode : public SmStructureNode
561  {
562  public:
SmBinHorNode(const SmToken & rNodeToken)563  	SmBinHorNode(const SmToken &rNodeToken)
564  	:	SmStructureNode(NBINHOR, rNodeToken)
565  	{
566  		SetNumSubNodes(3);
567  	}
568  
569  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
570  };
571  
572  
573  ////////////////////////////////////////////////////////////////////////////////
574  
575  
576  class SmBinVerNode : public SmStructureNode
577  {
578  public:
SmBinVerNode(const SmToken & rNodeToken)579  	SmBinVerNode(const SmToken &rNodeToken)
580  	:	SmStructureNode(NBINVER, rNodeToken)
581  	{
582  		SetNumSubNodes(3);
583  	}
584  
585      using   SmNode::GetLeftMost;
586  	virtual SmNode * GetLeftMost();
587  
588  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
589  	void CreateTextFromNode(String &rText);
590  };
591  
592  
593  ////////////////////////////////////////////////////////////////////////////////
594  
595  
596  class SmBinDiagonalNode : public SmStructureNode
597  {
598  	sal_Bool	bAscending;
599  
600  	void 	GetOperPosSize(Point &rPos, Size &rSize,
601  						   const Point &rDiagPoint, double fAngleDeg) const;
602  
603  public:
604  	SmBinDiagonalNode(const SmToken &rNodeToken);
605  
IsAscending() const606  	sal_Bool 	IsAscending() const { return bAscending; }
SetAscending(sal_Bool bVal)607  	void 	SetAscending(sal_Bool bVal)  { bAscending = bVal; }
608  
609  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
610  };
611  
612  
613  ////////////////////////////////////////////////////////////////////////////////
614  
615  
616  // enums used to index sub-/supscripts in the 'aSubNodes' array
617  // in 'SmSubSupNode'
618  // See graphic for positions at char:
619  //
620  //		CSUP
621  //
622  // LSUP H  H RSUP
623  //		H  H
624  //		HHHH
625  //		H  H
626  // LSUB H  H RSUB
627  //
628  //		CSUB
629  //
630  enum SmSubSup
631  {	CSUB, CSUP, RSUB, RSUP, LSUB, LSUP
632  };
633  
634  // numbers of entries in the above enum (that is: the number of possible
635  // sub-/supscripts)
636  #define SUBSUP_NUM_ENTRIES 6
637  
638  
639  class SmSubSupNode : public SmStructureNode
640  {
641  	sal_Bool  bUseLimits;
642  
643  public:
SmSubSupNode(const SmToken & rNodeToken)644  	SmSubSupNode(const SmToken &rNodeToken)
645  	:	SmStructureNode(NSUBSUP, rNodeToken)
646  	{
647  		SetNumSubNodes(1 + SUBSUP_NUM_ENTRIES);
648  		bUseLimits = sal_False;
649  	}
650  
GetBody()651  	SmNode *	   GetBody()	{ return GetSubNode(0); }
GetBody() const652  	const SmNode * GetBody() const
653  	{
654  		return ((SmSubSupNode *) this)->GetBody();
655  	}
656  
SetUseLimits(sal_Bool bVal)657  	void  SetUseLimits(sal_Bool bVal) { bUseLimits = bVal; }
IsUseLimits() const658  	sal_Bool  IsUseLimits() const { return bUseLimits; };
659  
GetSubSup(SmSubSup eSubSup)660      SmNode * GetSubSup(SmSubSup eSubSup) { return GetSubNode( sal::static_int_cast< sal_uInt16 >(1 + eSubSup) ); };
661  
662  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
663  	void CreateTextFromNode(String &rText);
664  
665  };
666  
667  
668  ////////////////////////////////////////////////////////////////////////////////
669  
670  
671  class SmBraceNode : public SmStructureNode
672  {
673  public:
SmBraceNode(const SmToken & rNodeToken)674  	SmBraceNode(const SmToken &rNodeToken)
675  	:	SmStructureNode(NBRACE, rNodeToken)
676  	{
677  		SetNumSubNodes(3);
678  	}
679  
680  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
681  	void CreateTextFromNode(String &rText);
682  };
683  
684  
685  ////////////////////////////////////////////////////////////////////////////////
686  
687  
688  class SmBracebodyNode : public SmStructureNode
689  {
690  	long  nBodyHeight;
691  
692  public:
693  	inline SmBracebodyNode(const SmToken &rNodeToken);
694  
695  	virtual void	Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
GetBodyHeight() const696  	long		    GetBodyHeight() const { return nBodyHeight; }
697  };
698  
699  
SmBracebodyNode(const SmToken & rNodeToken)700  inline SmBracebodyNode::SmBracebodyNode(const SmToken &rNodeToken) :
701  	SmStructureNode(NBRACEBODY, rNodeToken)
702  {
703  	nBodyHeight = 0;
704  }
705  
706  
707  ////////////////////////////////////////////////////////////////////////////////
708  
709  
710  class SmVerticalBraceNode : public SmStructureNode
711  {
712  public:
713  	inline SmVerticalBraceNode(const SmToken &rNodeToken);
714  
715  	virtual void	Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
716  };
717  
718  
SmVerticalBraceNode(const SmToken & rNodeToken)719  inline SmVerticalBraceNode::SmVerticalBraceNode(const SmToken &rNodeToken) :
720  	SmStructureNode(NVERTICAL_BRACE, rNodeToken)
721  {
722  	SetNumSubNodes(3);
723  }
724  
725  
726  ////////////////////////////////////////////////////////////////////////////////
727  
728  
729  class SmOperNode : public SmStructureNode
730  {
731  public:
SmOperNode(const SmToken & rNodeToken)732  	SmOperNode(const SmToken &rNodeToken)
733  	:	SmStructureNode(NOPER, rNodeToken)
734  	{
735  		SetNumSubNodes(2);
736  	}
737  
738  	SmNode *	   GetSymbol();
GetSymbol() const739  	const SmNode * GetSymbol() const
740  	{
741  		return ((SmOperNode *) this)->GetSymbol();
742  	}
743  
744  	long CalcSymbolHeight(const SmNode &rSymbol, const SmFormat &rFormat) const;
745  
746  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
747  };
748  
749  
750  ////////////////////////////////////////////////////////////////////////////////
751  
752  
753  class SmAlignNode : public SmStructureNode
754  {
755  public:
SmAlignNode(const SmToken & rNodeToken)756  	SmAlignNode(const SmToken &rNodeToken)
757  	:	SmStructureNode(NALIGN, rNodeToken)
758  	{}
759  
760  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
761  };
762  
763  
764  ////////////////////////////////////////////////////////////////////////////////
765  
766  
767  class SmAttributNode : public SmStructureNode
768  {
769  public:
SmAttributNode(const SmToken & rNodeToken)770  	SmAttributNode(const SmToken &rNodeToken)
771  	:	SmStructureNode(NATTRIBUT, rNodeToken)
772  	{}
773  
774  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
775  	void CreateTextFromNode(String &rText);
776  };
777  
778  
779  ////////////////////////////////////////////////////////////////////////////////
780  
781  
782  class SmFontNode : public SmStructureNode
783  {
784  	sal_uInt16		nSizeType;
785  	Fraction	aFontSize;
786  
787  public:
SmFontNode(const SmToken & rNodeToken)788  	SmFontNode(const SmToken &rNodeToken)
789  	:	SmStructureNode(NFONT, rNodeToken)
790  	{
791  		nSizeType = FNTSIZ_MULTIPLY;
792  		aFontSize = Fraction(1L);
793  	}
794  
795  	void SetSizeParameter(const Fraction &rValue, sal_uInt16 nType);
GetSizeParameter() const796  	const Fraction & GetSizeParameter() const {return aFontSize;}
GetSizeType() const797  	const sal_uInt16& GetSizeType() const {return nSizeType;}
798  
799  	virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell);
800  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
801  	void CreateTextFromNode(String &rText);
802  };
803  
804  
805  ////////////////////////////////////////////////////////////////////////////////
806  
807  
808  class SmMatrixNode : public SmStructureNode
809  {
810  	sal_uInt16	nNumRows,
811  			nNumCols;
812  
813  public:
SmMatrixNode(const SmToken & rNodeToken)814  	SmMatrixNode(const SmToken &rNodeToken)
815  	:	SmStructureNode(NMATRIX, rNodeToken)
816  	{
817  		nNumRows = nNumCols = 0;
818  	}
819  
GetNumRows() const820  	sal_uInt16 GetNumRows() const {return nNumRows;}
GetNumCols() const821  	sal_uInt16 GetNumCols() const {return nNumCols;}
822  	void SetRowCol(sal_uInt16 nMatrixRows, sal_uInt16 nMatrixCols);
823  
824      using   SmNode::GetLeftMost;
825  	virtual SmNode * GetLeftMost();
826  
827  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
828  	void CreateTextFromNode(String &rText);
829  };
830  
831  
832  ////////////////////////////////////////////////////////////////////////////////
833  
834  
835  class SmBlankNode : public SmGraphicNode
836  {
837  	sal_uInt16	nNum;
838  
839  public:
SmBlankNode(const SmToken & rNodeToken)840  	SmBlankNode(const SmToken &rNodeToken)
841  	:	SmGraphicNode(NBLANK, rNodeToken)
842  	{
843  		nNum = 0;
844  	}
845  
846  	void         IncreaseBy(const SmToken &rToken);
Clear()847  	void		 Clear() { nNum = 0; }
848  
849  	virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell);
850  	virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat);
851  };
852  
853  
854  ////////////////////////////////////////////////////////////////////////////////
855  
856  #endif
857  
858  
859