[Libreoffice-commits] core.git: starmath/inc starmath/qa starmath/source

dante (via logerrit) logerrit at kemper.freedesktop.org
Tue Sep 22 09:47:33 UTC 2020


 starmath/inc/node.hxx                           | 1560 +++++++++++++++++-------
 starmath/inc/visitors.hxx                       |   26 
 starmath/qa/cppunit/test_cursor.cxx             |    8 
 starmath/qa/cppunit/test_nodetotextvisitors.cxx |   32 
 starmath/qa/extras/mmlimport-test.cxx           |   46 
 starmath/source/mathmlimport.cxx                |    9 
 starmath/source/node.cxx                        |  593 ---------
 starmath/source/parse.cxx                       |    3 
 starmath/source/visitors.cxx                    |  509 +++++++
 9 files changed, 1787 insertions(+), 999 deletions(-)

New commits:
commit 8c716704df4aaa83fcd198cc8d92cd3e1e542de9
Author:     dante <dante19031999 at gmail.com>
AuthorDate: Wed Jul 15 02:58:57 2020 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Tue Sep 22 11:46:45 2020 +0200

    tdf#38885 Remove createTextFromNode
    
    Change-Id: I85df73e498d61b976ddb908ab1b9c5e368d178cf
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98795
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/starmath/inc/node.hxx b/starmath/inc/node.hxx
index 1e301369c592..c0320e6bef5e 100644
--- a/starmath/inc/node.hxx
+++ b/starmath/inc/node.hxx
@@ -95,9 +95,9 @@ enum class SmNodeType
 
 class SmNode : public SmRect
 {
-    SmFace      maFace;
 
-    SmToken     maNodeToken;
+    SmFace          maFace;
+    SmToken         maNodeToken;
     SmNodeType      meType;
     SmScaleMode     meScaleMode;
     RectHorAlign    meRectHorAlign;
@@ -115,96 +115,304 @@ public:
     SmNode(const SmNode&) = delete;
     SmNode& operator=(const SmNode&) = delete;
 
-    virtual             ~SmNode();
+    virtual ~SmNode();
 
     /**
+     * Checks node visibility.
      * Returns true if this is an instance of SmVisibleNode's subclass, false otherwise.
+     * @return node visibility
      */
-    virtual bool        IsVisible() const = 0;
+    virtual bool IsVisible() const = 0;
 
-    virtual size_t      GetNumSubNodes() const = 0;
-    virtual SmNode *    GetSubNode(size_t nIndex) = 0;
-            const SmNode * GetSubNode(size_t nIndex) const
-            {
-                return const_cast<SmNode *>(this)->GetSubNode(nIndex);
-            }
+    /**
+     * Gets the number of subnodes.
+     * @return number of subnodes
+     */
+    virtual size_t GetNumSubNodes() const = 0;
+
+    /**
+     * Gets the subnode of index nIndex.
+     * @param nIndex
+     * @return subnode of index nIndex
+     */
+    virtual SmNode * GetSubNode(size_t nIndex) = 0;
+    const   SmNode * GetSubNode(size_t nIndex) const
+                     { return const_cast<SmNode *>(this)->GetSubNode(nIndex); }
 
     virtual const SmNode * GetLeftMost() const;
 
-            FontChangeMask &Flags() { return mnFlags; }
-            FontAttribute  &Attributes() { return mnAttributes; }
+    /**
+     * Gets the FontChangeMask flags.
+     * @return FontChangeMask flags
+     */
+    FontChangeMask &Flags() { return mnFlags; }
 
-            bool IsPhantom() const { return mbIsPhantom; }
-            void SetPhantom(bool bIsPhantom);
-            void SetColor(const Color &rColor);
+    /**
+     * Gets the font attributes.
+     * @return font attributes
+     */
+    FontAttribute &Attributes() { return mnAttributes; }
 
-            void SetAttribut(FontAttribute nAttrib);
-            void ClearAttribut(FontAttribute nAttrib);
+    /**
+     * Checks if it is a visible node rendered invisible.
+     * @return rendered visibility
+     */
+    bool IsPhantom() const { return mbIsPhantom; }
 
-            const SmFace & GetFont() const { return maFace; };
-                  SmFace & GetFont()       { return maFace; };
+    /**
+     * Sets the render visibility of a visible node to bIsPhantom.
+     * @param bIsPhantom
+     * @return
+     */
+    void SetPhantom(bool bIsPhantom);
 
-            void SetFont(const SmFace &rFace);
-            void SetFontSize(const Fraction &rRelSize, FontSizeType nType);
-            void SetSize(const Fraction &rScale);
+    /**
+     * Sets the font color.
+     * @param rColor
+     * @return
+     */
+    void SetColor(const Color &rColor);
 
-    /** Prepare preliminary settings about font and text
-     *  (e.g. maFace, meRectHorAlign, mnFlags, mnAttributes, etc.)
+    /**
+     * Sets the font attribute nAttrib.
+     * Check FontAttribute class.
+     * @param nAttrib
+     * @return
+     */
+    void SetAttribut(FontAttribute nAttrib);
+
+    /**
+     * Clears the font attribute nAttrib.
+     * Check FontAttribute class.
+     * @param nAttrib
+     * @return
+     */
+    void ClearAttribut(FontAttribute nAttrib);
+
+    /**
+     * Gets the font.
+     * @return font
+     */
+    const SmFace & GetFont() const { return maFace; };
+          SmFace & GetFont()       { return maFace; };
+
+    /**
+     * Sets the font to rFace.
+     * @param rFace
+     * @return
+     */
+    void SetFont(const SmFace &rFace);
+
+    /**
+     * Sets the font size to rRelSize with type nType.
+     * Check FontSizeType for details.
+     * @param rRelSize
+     * @param nType
+     * @return
+     */
+    void SetFontSize(const Fraction &rRelSize, FontSizeType nType);
+
+    /**
+     * Sets the font size to rRelSize with type FontSizeType::ABSOLUT.
+     * @param rScale
+     * @return
+     */
+    void SetSize(const Fraction &rScale);
+
+    /**
+     * Prepare preliminary settings about font and text
+     * (e.g. maFace, meRectHorAlign, mnFlags, mnAttributes, etc.)
+     * @param rFormat
+     * @param rDocShell
+     * @param nDepth
+     * @return
      */
     virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth);
+
+    /**
+     * Prepare preliminary font attributes
+     * Called on Prepare(...).
+     * @return
+     */
     void PrepareAttributes();
 
-    void         SetRectHorAlign(RectHorAlign eHorAlign, bool bApplyToSubTree = true );
+    /**
+     * Sets the alignment of the text.
+     * Check RectHorAlign class for details.
+     * The subtrees will be affected if bApplyToSubTree.
+     * @param eHorAlign
+     * @param bApplyToSubTree
+     * @return
+     */
+    void SetRectHorAlign(RectHorAlign eHorAlign, bool bApplyToSubTree = true );
+
+    /**
+     * Gets the alignment of the text.
+     * @return alignment of the text
+     */
     RectHorAlign GetRectHorAlign() const { return meRectHorAlign; }
 
+    /**
+     * Parses itself to SmRect.
+     * @return this
+     */
     const SmRect & GetRect() const { return *this; }
 
-    void Move(const Point &rPosition);
-    void MoveTo(const Point &rPosition) { Move(rPosition - GetTopLeft()); }
+    /**
+     * Moves the rectangle by rVector.
+     * @param rVector
+     * @return
+     */
+    void Move(const Point &rVector);
+
+    /**
+     * Moves the rectangle to rPoint, being the top left corner the origin.
+     * @param rPoint
+     * @return
+     */
+    void MoveTo(const Point &rPoint) { Move(rPoint - GetTopLeft()); }
+
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) = 0;
-    virtual void CreateTextFromNode(OUStringBuffer &rText);
 
-    virtual void    GetAccessibleText( OUStringBuffer &rText ) const = 0;
-    sal_Int32       GetAccessibleIndex() const { return mnAccIndex; }
-    void            SetAccessibleIndex(sal_Int32 nAccIndex) { mnAccIndex = nAccIndex; }
-    const SmNode *  FindNodeWithAccessibleIndex(sal_Int32 nAccIndex) const;
+    /**
+     * Appends to rText the node text.
+     * @param rText
+     * @return
+     */
+    virtual void GetAccessibleText( OUStringBuffer &rText ) const = 0;
+
+    /**
+     * Gets the node accessible index.
+     * Used for visual editing.
+     * @return node accessible index
+     */
+    sal_Int32 GetAccessibleIndex() const { return mnAccIndex; }
+
+    /**
+     * Sets the node accessible index to nAccIndex.
+     * Used for visual editing.
+     * @param nAccIndex
+     * @return
+     */
+    void SetAccessibleIndex(sal_Int32 nAccIndex) { mnAccIndex = nAccIndex; }
+
+    /**
+     * Finds the node with accessible index nAccIndex.
+     * Used for visual editing.
+     * @param nAccIndex
+     * @return node with accessible index nAccIndex
+     */
+    const SmNode * FindNodeWithAccessibleIndex(sal_Int32 nAccIndex) const;
+
+    /**
+     * Gets the line in the text where the node is located.
+     * It is used to do the visual <-> text correspondence.
+     * @return line
+     */
+    sal_uInt16 GetRow() const { return sal::static_int_cast<sal_uInt16>(maNodeToken.nRow); }
 
-    sal_uInt16  GetRow() const    { return sal::static_int_cast<sal_uInt16>(maNodeToken.nRow); }
-    sal_uInt16  GetColumn() const { return sal::static_int_cast<sal_uInt16>(maNodeToken.nCol); }
+    /**
+     * Gets the colum of the line in the text where the node is located.
+     * It is used to do the visual <-> text correspondence.
+     * @return colum
+     */
+    sal_uInt16 GetColumn() const { return sal::static_int_cast<sal_uInt16>(maNodeToken.nCol); }
 
-    SmScaleMode     GetScaleMode() const { return meScaleMode; }
-    void            SetScaleMode(SmScaleMode eMode) { meScaleMode = eMode; }
+    /**
+     * Gets the scale mode.
+     * @return scale mode
+     */
+    SmScaleMode GetScaleMode() const { return meScaleMode; }
+
+    /**
+     * Sets the scale mode to eMode.
+     * @param eMode
+     * @return
+     */
+    void SetScaleMode(SmScaleMode eMode) { meScaleMode = eMode; }
 
+    //visual stuff TODO comment
     virtual void AdaptToX(OutputDevice &rDev, sal_uLong nWidth);
     virtual void AdaptToY(OutputDevice &rDev, sal_uLong nHeight);
 
-    SmNodeType      GetType() const  { return meType; }
+    /**
+     * Gets the node type.
+     * @return node type
+     */
+    SmNodeType GetType() const  { return meType; }
+
+    /**
+     * Gets the token.
+     * The token contains the data extracted from the text mode.
+     * Ej: text, type (sub, sup, int,...), row and column,...
+     * @return node type
+     */
     const SmToken & GetToken() const { return maNodeToken; }
+          SmToken & GetToken()       { return maNodeToken; }
 
+    /**
+     * Finds the node from the position in the text.
+     * It is used to do the visual <-> text correspondence.
+     * @param nRow
+     * @param nCol
+     * @return the given node
+     */
     const SmNode *  FindTokenAt(sal_uInt16 nRow, sal_uInt16 nCol) const;
+
+    /**
+     * Finds the closest rectangle in the screen.
+     * @param rPoint
+     * @return the given node
+     */
     const SmNode *  FindRectClosestTo(const Point &rPoint) const;
 
-    /** Accept a visitor
-     * Calls the method for this class on the visitor
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
      */
     virtual void Accept(SmVisitor* pVisitor) = 0;
 
-    /** True if this node is selected */
+    /**
+     * Checks if the node is selected.
+     * @return the node is selected
+     */
     bool IsSelected() const {return mbIsSelected;}
+
+    /**
+     * Sets the node to Selected.
+     * @param Selected
+     * @return
+     */
     void SetSelected(bool Selected) {mbIsSelected = Selected;}
 
-    /** Get the parent node of this node */
-    SmStructureNode* GetParent(){ return mpParentNode; }
+    /**
+     * Gets the parent node of this node.
+     * @return parent node
+     */
     const SmStructureNode* GetParent() const { return mpParentNode; }
-    /** Set the parent node */
-    void SetParent(SmStructureNode* parent){
-        mpParentNode = parent;
-    }
+          SmStructureNode* GetParent()       { return mpParentNode; }
 
-    /** Set the token for this node */
-    void SetToken(SmToken const & token){
-        maNodeToken = token;
-    }
+    /**
+     * Sets the parent node.
+     * @param parent
+     * @return
+     */
+    void SetParent(SmStructureNode* parent){ mpParentNode = parent; }
+
+    /**
+     * Sets the token for this node.
+     * @param token
+     * @return
+     */
+    void SetToken(SmToken const & token){ maNodeToken = token; }
 
 private:
     SmStructureNode* mpParentNode;
@@ -223,57 +431,102 @@ class SmStructureNode : public SmNode
 protected:
     SmStructureNode(SmNodeType eNodeType, const SmToken &rNodeToken, size_t nSize = 0)
         : SmNode(eNodeType, rNodeToken)
-        , maSubNodes(nSize)
-    {}
+        , maSubNodes(nSize) {}
 
 public:
     virtual ~SmStructureNode() override;
 
-    virtual bool        IsVisible() const override;
+    /**
+     * Checks node visibility.
+     * Returns true if this is an instance of SmVisibleNode's subclass, false otherwise.
+     * @return node visibility
+     */
+    virtual bool IsVisible() const override;
 
-    virtual size_t      GetNumSubNodes() const override;
+    /**
+     * Gets the number of subnodes.
+     * @return number of subnodes
+     */
+    virtual size_t GetNumSubNodes() const override;
 
+    /**
+     * Gets the subnode of index nIndex.
+     * @param nIndex
+     * @return subnode of index nIndex
+     */
     using   SmNode::GetSubNode;
-    virtual SmNode *    GetSubNode(size_t nIndex) override;
+    virtual SmNode * GetSubNode(size_t nIndex) override;
+
+    /**
+     * Does the cleaning of the subnodes.
+     * @return
+     */
     void ClearSubNodes();
-            void SetSubNodes(std::unique_ptr<SmNode> pFirst, std::unique_ptr<SmNode> pSecond, std::unique_ptr<SmNode> pThird = nullptr);
-            void SetSubNodes(SmNodeArray&& rNodeArray);
 
+    /**
+     * Sets subnodes, used for opperators.
+     * @param pFirst
+     * @param pSecond
+     * @param pThird
+     * @return
+     */
+    void SetSubNodes(std::unique_ptr<SmNode> pFirst, std::unique_ptr<SmNode> pSecond,
+                     std::unique_ptr<SmNode> pThird = nullptr);
+
+    /**
+     * Sets subnodes.
+     * @param rNodeArray
+     * @return
+     */
+    void SetSubNodes(SmNodeArray&& rNodeArray);
+
+    /**
+     * Appends to rText the node text.
+     * @param rText
+     * @return
+     */
     virtual void  GetAccessibleText( OUStringBuffer &rText ) const override;
 
+    /**
+     * Gets the first subnode.
+     * @return first subnode
+     */
     SmNodeArray::iterator begin() {return maSubNodes.begin();}
+
+    /**
+     * Gets the last subnode.
+     * @return last subnode
+     */
     SmNodeArray::iterator end() {return maSubNodes.end();}
+
+    /**
+     * Gets the last subnode.
+     * @return last subnode
+     */
     SmNodeArray::reverse_iterator rbegin() {return maSubNodes.rbegin();}
+
+    /**
+     * Gets the first subnode.
+     * @return first subnode
+     */
     SmNodeArray::reverse_iterator rend() {return maSubNodes.rend();}
 
-    /** Get the index of a child node
-     *
+    /**
+     * Get the index of the child node pSubNode.
      * Returns -1, if pSubNode isn't a subnode of this.
+     * @param pSubNode
+     * @return index of the child node
      */
-    int IndexOfSubNode(SmNode const * pSubNode)
-    {
-        size_t nSize = GetNumSubNodes();
-        for (size_t i = 0; i < nSize; i++)
-            if (pSubNode == GetSubNode(i))
-                return i;
-        return -1;
-    }
+    int IndexOfSubNode(SmNode const * pSubNode);
 
-    void SetSubNode(size_t nIndex, SmNode* pNode)
-    {
-        size_t size = maSubNodes.size();
-        if (size <= nIndex)
-        {
-            //Resize subnodes array
-            maSubNodes.resize(nIndex + 1);
-            //Set new slots to NULL except at nIndex
-            for (size_t i = size; i < nIndex; i++)
-                maSubNodes[i] = nullptr;
-        }
-        maSubNodes[nIndex] = pNode;
-        if (pNode)
-            pNode->SetParent(this);
-    }
+    /**
+     * Sets the subnode pNode at nIndex.
+     * If necessary increases the subnodes length.
+     * @param nIndex
+     * @param pNode
+     * @return
+     */
+    void SetSubNode(size_t nIndex, SmNode* pNode);
 
 private:
     /** Sets parent on children of this node */
@@ -290,13 +543,28 @@ class SmVisibleNode : public SmNode
 {
 protected:
     SmVisibleNode(SmNodeType eNodeType, const SmToken &rNodeToken)
-    :   SmNode(eNodeType, rNodeToken)
-    {}
+    :   SmNode(eNodeType, rNodeToken) {}
 
 public:
 
+    /**
+     * Checks node visibility.
+     * Returns true if this is an instance of SmVisibleNode's subclass, false otherwise.
+     * @return node visibility
+     */
     virtual bool        IsVisible() const override;
+
+    /**
+     * Gets the number of subnodes.
+     * @return number of subnodes
+     */
     virtual size_t      GetNumSubNodes() const override;
+
+    /**
+     * Gets the subnode of index nIndex.
+     * @param nIndex
+     * @return subnode of index nIndex
+     */
     using   SmNode::GetSubNode;
     virtual SmNode *    GetSubNode(size_t nIndex) override;
 };
@@ -306,11 +574,15 @@ class SmGraphicNode : public SmVisibleNode
 {
 protected:
     SmGraphicNode(SmNodeType eNodeType, const SmToken &rNodeToken)
-    :   SmVisibleNode(eNodeType, rNodeToken)
-    {}
+    :   SmVisibleNode(eNodeType, rNodeToken) {}
 
 public:
 
+    /**
+     * Appends to rText the node text.
+     * @param rText
+     * @return
+     */
     virtual void  GetAccessibleText( OUStringBuffer &rText ) const override;
 };
 
@@ -328,12 +600,24 @@ public:
         : SmGraphicNode(SmNodeType::Rectangle, rNodeToken)
     {}
 
+    //visual stuff TODO comment
     virtual void AdaptToX(OutputDevice &rDev, sal_uLong nWidth) override;
     virtual void AdaptToY(OutputDevice &rDev, sal_uLong nHeight) override;
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
 
-    void CreateTextFromNode(OUStringBuffer &rText) override;
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -351,14 +635,36 @@ class SmPolyLineNode final : public SmGraphicNode
 public:
     explicit SmPolyLineNode(const SmToken &rNodeToken);
 
-    long         GetWidth() const { return mnWidth; }
-    tools::Polygon &GetPolygon() { return maPoly; }
+    /**
+     * Gets the width of the rect.
+     * @return width
+     */
+    long GetWidth() const { return mnWidth; }
 
+    /**
+     * Gets the polygon to draw the node.
+     * @return polygon
+     */
+    tools::Polygon &GetPolygon()  { return maPoly; }
+
+    //visual stuff TODO comment
     virtual void AdaptToX(OutputDevice &rDev, sal_uLong nWidth) override;
     virtual void AdaptToY(OutputDevice &rDev, sal_uLong nHeight) override;
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
 
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -369,6 +675,8 @@ public:
  */
 class SmTextNode : public SmVisibleNode
 {
+
+protected:
     OUString   maText;
     sal_uInt16 mnFontDesc;
     /** Index within text where the selection starts
@@ -386,42 +694,115 @@ protected:
 public:
     SmTextNode(const SmToken &rNodeToken, sal_uInt16 nFontDescP );
 
-    sal_uInt16              GetFontDesc() const { return mnFontDesc; }
-    void                SetText(const OUString &rText) { maText = rText; }
-    const OUString &    GetText() const { return maText; }
-    /** Change the text of this node, including the underlying token */
-    void                ChangeText(const OUString &rText) {
-        maText = rText;
-        SmToken token = GetToken();
-        token.aText = rText;
-        SetToken(token); //TODO: Merge this with AdjustFontDesc for better performance
-        AdjustFontDesc();
-    }
-    /** Try to guess the correct FontDesc, used during visual editing */
-    void                AdjustFontDesc();
-    /** Index within GetText() where the selection starts
-     * @remarks Only valid of SmNode::IsSelected() is true
-     */
-    sal_Int32           GetSelectionStart() const {return mnSelectionStart;}
-    /** Index within GetText() where the selection end
-     * @remarks Only valid of SmNode::IsSelected() is true
-     */
-    sal_Int32           GetSelectionEnd() const {return mnSelectionEnd;}
-    /** Set the index within GetText() where the selection starts */
-    void                SetSelectionStart(sal_Int32 index) {mnSelectionStart = index;}
-    /** Set the index within GetText() where the selection end */
-    void                SetSelectionEnd(sal_Int32 index) {mnSelectionEnd = index;}
-
-    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override;
+    /**
+     * Returns the font type being used (text, variabla, symbol, ...).
+     * @retutn font type
+     */
+    sal_uInt16 GetFontDesc() const { return mnFontDesc; }
+
+    /**
+     * Sets the font type to fontdesc.
+     * Definitions are on format.hxx.
+     * @param fontdesc
+     * @return
+     */
+    void SetFontDesc(sal_uInt16 fontdesc) { mnFontDesc=fontdesc; }
+
+    /**
+     * Sets the node text to rText.
+     * @param rText
+     * @return
+     */
+    void SetText(const OUString &rText) { maText = rText; }
+
+    /**
+     * Gets the node text.
+     * @return node text
+     */
+    const OUString & GetText() const { return maText; }
+          OUString & GetText()       { return maText; }
+
+    /**
+     * Change the text of this node, including the underlying token to rText.
+     * @param rText
+     * @return
+     */
+    void ChangeText(const OUString &rText);
+
+    /**
+     * Try to guess the correct FontDesc, used during visual editing
+     * @return
+     */
+    void AdjustFontDesc();
+
+    /**
+     * Index within GetText() where the selection starts.
+     * @remarks Only valid of SmNode::IsSelected() is true.
+     * @return index.
+     */
+    sal_Int32 GetSelectionStart() const { return mnSelectionStart; }
+
+    /**
+     * Index within GetText() where the selection ends.
+     * @remarks Only valid of SmNode::IsSelected() is true.
+     * @return index.
+     */
+    sal_Int32 GetSelectionEnd() const  {return mnSelectionEnd; }
+
+    /**
+     * Sets the index within GetText() where the selection starts to index.
+     * @param index
+     * @return
+     */
+    void SetSelectionStart(sal_Int32 index) {mnSelectionStart = index;}
+
+    /**
+     * Sets the index within GetText() where the selection ends to index.
+     * @param index
+     * @return
+     */
+    void SetSelectionEnd(sal_Int32 index) {mnSelectionEnd = index;}
+
+    /**
+     * Prepare preliminary settings about font and text
+     * (e.g. maFace, meRectHorAlign, mnFlags, mnAttributes, etc.)
+     * @param rFormat
+     * @param rDocShell
+     * @param nDepth
+     * @return
+     */
+    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell,
+                         int nDepth) override;
+
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    virtual void CreateTextFromNode(OUStringBuffer &rText) override;
 
+    /**
+     * Appends to rText the node text.
+     * @param rText
+     * @return
+     */
     virtual void  GetAccessibleText( OUStringBuffer &rText ) const override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
+
     /**
-      Converts the character from StarMath's private area symbols to a matching Unicode
-      character, if necessary. To be used when converting GetText() to a normal text.
-    */
+     * Converts the character from StarMath's private area symbols to a matching Unicode
+     * character, if necessary. To be used when converting GetText() to a normal text.
+     * @param nIn
+     * @return unicode char
+     */
     static sal_Unicode ConvertSymbolToUnicode(sal_Unicode nIn);
 };
 
@@ -443,9 +824,31 @@ protected:
 public:
     explicit SmSpecialNode(const SmToken &rNodeToken);
 
-    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override;
+    /**
+     * Prepare preliminary settings about font and text
+     * (e.g. maFace, meRectHorAlign, mnFlags, mnAttributes, etc.)
+     * @param rFormat
+     * @param rDocShell
+     * @param nDepth
+     * @return
+     */
+    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell,
+                         int nDepth) override;
+
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
 
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -466,7 +869,20 @@ public:
         : SmSpecialNode(SmNodeType::GlyphSpecial, rNodeToken, FNT_MATH)
     {}
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -482,19 +898,41 @@ protected:
     :   SmSpecialNode(eNodeType, rNodeToken, FNT_MATH)
     {
         sal_Unicode cChar = GetToken().cMathChar;
-        if (u'\0' != cChar)
-            SetText(OUString(cChar));
+        if (u'\0' != cChar) SetText(OUString(cChar));
     }
 
 public:
     explicit SmMathSymbolNode(const SmToken &rNodeToken);
 
+    //visual stuff TODO comment
     virtual void AdaptToX(OutputDevice &rDev, sal_uLong nWidth) override;
     virtual void AdaptToY(OutputDevice &rDev, sal_uLong nHeight) override;
 
-    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override;
+    /**
+     * Prepare preliminary settings about font and text
+     * (e.g. maFace, meRectHorAlign, mnFlags, mnAttributes, etc.)
+     * @param rFormat
+     * @param rDocShell
+     * @param nDepth
+     * @return
+     */
+    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell,
+                         int nDepth) override;
+
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void CreateTextFromNode(OUStringBuffer &rText) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -526,14 +964,25 @@ class SmRootSymbolNode final : public SmMathSymbolNode
 public:
     explicit SmRootSymbolNode(const SmToken &rNodeToken)
         : SmMathSymbolNode(SmNodeType::RootSymbol, rNodeToken)
-        , mnBodyWidth(0)
-    {
-    }
+        , mnBodyWidth(0) { }
 
+    /**
+     * Gets the body width.
+     * Allows to know how long is the root and paint it.
+     * @return body width
+     */
     sal_uLong GetBodyWidth() const {return mnBodyWidth;};
+
+    //visual stuff TODO comment
     virtual void AdaptToX(OutputDevice &rDev, sal_uLong nHeight) override;
     virtual void AdaptToY(OutputDevice &rDev, sal_uLong nHeight) override;
 
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -548,13 +997,34 @@ class SmPlaceNode final : public SmMathSymbolNode
 {
 public:
     explicit SmPlaceNode(const SmToken &rNodeToken)
-        : SmMathSymbolNode(SmNodeType::Place, rNodeToken)
-    {
-    }
-    SmPlaceNode() : SmMathSymbolNode(SmNodeType::Place, SmToken(TPLACE, MS_PLACE, "<?>")) {};
+        : SmMathSymbolNode(SmNodeType::Place, rNodeToken) { }
+    SmPlaceNode() : SmMathSymbolNode(SmNodeType::Place, SmToken(TPLACE, MS_PLACE, "<?>")) { };
 
-    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override;
+    /**
+     * Prepare preliminary settings about font and text
+     * (e.g. maFace, meRectHorAlign, mnFlags, mnAttributes, etc.)
+     * @param rFormat
+     * @param rDocShell
+     * @param nDepth
+     * @return
+     */
+    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell,
+                         int nDepth) override;
+
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -568,13 +1038,33 @@ class SmErrorNode final : public SmMathSymbolNode
 {
 public:
     explicit SmErrorNode(const SmToken &rNodeToken)
-        : SmMathSymbolNode(SmNodeType::Error, rNodeToken)
-    {
-        SetText(OUString(MS_ERROR));
-    }
+                : SmMathSymbolNode(SmNodeType::Error, rNodeToken) { SetText(OUString(MS_ERROR)); }
+
+    /**
+     * Prepare preliminary settings about font and text
+     * (e.g. maFace, meRectHorAlign, mnFlags, mnAttributes, etc.)
+     * @param rFormat
+     * @param rDocShell
+     * @param nDepth
+     * @return
+     */
+    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell,
+                         int nDepth) override;
 
-    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override;
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -592,15 +1082,30 @@ class SmTableNode final : public SmStructureNode
 public:
     explicit SmTableNode(const SmToken &rNodeToken)
         : SmStructureNode(SmNodeType::Table, rNodeToken)
-        , mnFormulaBaseline(0)
-    {
-    }
+        , mnFormulaBaseline(0) { }
 
     virtual const SmNode * GetLeftMost() const override;
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
+
+    /**
+     * Gets the formula baseline.
+     * @return formula baseline
+     */
     long GetFormulaBaseline() const;
 
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -617,22 +1122,55 @@ class SmLineNode : public SmStructureNode
 protected:
     SmLineNode(SmNodeType eNodeType, const SmToken &rNodeToken)
         : SmStructureNode(eNodeType, rNodeToken)
-        , mbUseExtraSpaces(true)
-    {
-    }
+        , mbUseExtraSpaces(true) { }
 
 public:
     explicit SmLineNode(const SmToken &rNodeToken)
         : SmStructureNode(SmNodeType::Line, rNodeToken)
-        , mbUseExtraSpaces(true)
-    {
-    }
+        , mbUseExtraSpaces(true) { }
 
+    /**
+     * Sets if it going to use extra spaces.
+     * It is used to set if there has to be space between node while rendering.
+     * By default it is true.
+     * @param bVal
+     * @return
+     */
     void  SetUseExtraSpaces(bool bVal) { mbUseExtraSpaces = bVal; }
+
+    /**
+     * Checks if it is using extra spaces.
+     * It is used for calculating space between nodes when rendering.
+     * By default it is true.
+     * @return is using extra spaces
+     */
     bool  IsUseExtraSpaces() const { return mbUseExtraSpaces; };
 
-    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override;
+    /**
+     * Prepare preliminary settings about font and text
+     * (e.g. maFace, meRectHorAlign, mnFlags, mnAttributes, etc.)
+     * @param rFormat
+     * @param rDocShell
+     * @param nDepth
+     * @return
+     */
+    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell,
+                         int nDepth) override;
+
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -647,11 +1185,22 @@ class SmExpressionNode final : public SmLineNode
 {
 public:
     explicit SmExpressionNode(const SmToken &rNodeToken)
-        : SmLineNode(SmNodeType::Expression, rNodeToken)
-    {}
+        : SmLineNode(SmNodeType::Expression, rNodeToken) { }
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void CreateTextFromNode(OUStringBuffer &rText) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -664,11 +1213,22 @@ class SmUnHorNode final : public SmStructureNode
 {
 public:
     explicit SmUnHorNode(const SmToken &rNodeToken)
-        : SmStructureNode(SmNodeType::UnHor, rNodeToken, 2)
-    {
-    }
+        : SmStructureNode(SmNodeType::UnHor, rNodeToken, 2) { }
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -688,20 +1248,49 @@ class SmRootNode final : public SmStructureNode
 {
 public:
     explicit SmRootNode(const SmToken &rNodeToken)
-        : SmStructureNode(SmNodeType::Root, rNodeToken, 3)
-    {
-    }
+        : SmStructureNode(SmNodeType::Root, rNodeToken, 3) { }
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void CreateTextFromNode(OUStringBuffer &rText) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 
-    SmNode* Argument();
-    const SmNode* Argument() const;
-    SmRootSymbolNode* Symbol();
-    const SmRootSymbolNode* Symbol() const;
-    SmNode* Body();
-    const SmNode* Body() const;
+    /**
+     * Returns the node containing the data of the order of the root.
+     * @return order data
+     */
+    const SmNode* Argument() const { return const_cast<SmRootNode *>(this)->Argument(); }
+          SmNode* Argument()       { assert( GetNumSubNodes() == 3 ); return GetSubNode( 0 ); }
+
+    /**
+     * Returns the node containing the data of the character used for the root.
+     * @return symbol data
+     */
+    const SmRootSymbolNode* Symbol() const { return const_cast<SmRootNode *>(this)->Symbol(); }
+          SmRootSymbolNode* Symbol()       { assert( GetNumSubNodes() == 3 );
+                                             assert( GetSubNode( 1 )->GetType()
+                                                        == SmNodeType::RootSymbol );
+                                             return static_cast< SmRootSymbolNode* >
+                                                ( GetSubNode( 1 )); }
+
+    /**
+     * Returns the node containing the data inside the root.
+     * @return body data
+     */
+    const SmNode* Body() const { return const_cast<SmRootNode *>(this)->Body(); }
+          SmNode* Body()       { assert( GetNumSubNodes() == 3 ); return GetSubNode( 2 ); }
+
 };
 
 
@@ -720,19 +1309,44 @@ class SmBinHorNode final : public SmStructureNode
 {
 public:
     explicit SmBinHorNode(const SmToken &rNodeToken)
-        : SmStructureNode(SmNodeType::BinHor, rNodeToken, 3)
-    {
-    }
+        : SmStructureNode(SmNodeType::BinHor, rNodeToken, 3) { }
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 
-    SmNode* Symbol();
-    const SmNode* Symbol() const;
-    SmNode* LeftOperand();
-    const SmNode* LeftOperand() const;
-    SmNode* RightOperand();
-    const SmNode* RightOperand() const;
+    /**
+     * Returns the node containing the data of the binary opperator.
+     * @return symbol data
+     */
+    const SmNode* Symbol() const { return const_cast<SmBinHorNode *>(this)->Symbol(); }
+          SmNode* Symbol()       { assert( GetNumSubNodes() == 3 ); return GetSubNode( 1 ); }
+
+    /**
+     * Returns the node containing the data of the left opperand.
+     * @return left opperand data
+     */
+    const SmNode* LeftOperand() const { return const_cast<SmBinHorNode *>(this)->LeftOperand(); }
+          SmNode* LeftOperand()       { assert( GetNumSubNodes() == 3 ); return GetSubNode( 0 ); }
+
+    /**
+     * Returns the node containing the data of the right opperand.
+     * @return right opperand data
+     */
+    const SmNode* RightOperand() const { return const_cast<SmBinHorNode *>(this)->RightOperand(); }
+          SmNode* RightOperand()       { assert( GetNumSubNodes() == 3 ); return GetSubNode( 2 ); }
 };
 
 
@@ -752,14 +1366,24 @@ class SmBinVerNode final : public SmStructureNode
 {
 public:
     explicit SmBinVerNode(const SmToken &rNodeToken)
-        : SmStructureNode(SmNodeType::BinVer, rNodeToken, 3)
-    {
-    }
+        : SmStructureNode(SmNodeType::BinVer, rNodeToken, 3) { }
 
     virtual const SmNode * GetLeftMost() const override;
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void CreateTextFromNode(OUStringBuffer &rText) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -778,20 +1402,56 @@ class SmBinDiagonalNode final : public SmStructureNode
 {
     bool mbAscending;
 
-    void    GetOperPosSize(Point &rPos, Size &rSize,
-                           const Point &rDiagPoint, double fAngleDeg) const;
+    /**
+     * Returns the position and size of the diagonal line by reference.
+     * @param rPos
+     * @param rSize
+     * @param rDiagPoint
+     * @param fAngleDeg
+     * @return position and size of the diagonal line
+     */
+    void GetOperPosSize(Point &rPos, Size &rSize, const Point &rDiagPoint, double fAngleDeg) const;
 
 public:
     explicit SmBinDiagonalNode(const SmToken &rNodeToken)
         : SmStructureNode(SmNodeType::BinDiagonal, rNodeToken, 3)
-        , mbAscending(false)
-    {
-    }
+        , mbAscending(false) { }
 
+    /**
+     * Checks if it is of ascending type.
+     * Ascending:
+     *     / b
+     *    /
+     * a /
+     * Descending:
+     * a \
+     *    \
+     *     \ b
+     * @return ascending.
+     */
     bool    IsAscending() const { return mbAscending; }
+
+    /**
+     * Sets if the wideslash is ascending to bVal.
+     * @param bVal
+     * @return
+     */
     void    SetAscending(bool bVal)  { mbAscending = bVal; }
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -843,33 +1503,68 @@ class SmSubSupNode final : public SmStructureNode
 public:
     explicit SmSubSupNode(const SmToken &rNodeToken)
         : SmStructureNode(SmNodeType::SubSup, rNodeToken, 1 + SUBSUP_NUM_ENTRIES)
-        , mbUseLimits(false)
-    {
-    }
+        , mbUseLimits(false) { }
 
-    /** Get body (Not NULL) */
-    SmNode *       GetBody()    { return GetSubNode(0); }
-    /** Get body (Not NULL) */
-    const SmNode * GetBody() const
-    {
-        return const_cast<SmSubSupNode *>(this)->GetBody();
-    }
+    /**
+     * Returns the node with the data of what has to be superindex or subindex.
+     * @return body data
+     */
+    const SmNode * GetBody() const { return const_cast<SmSubSupNode *>(this)->GetBody(); }
+          SmNode * GetBody()       { return GetSubNode(0); }
 
-    void  SetUseLimits(bool bVal) { mbUseLimits = bVal; }
+    /**
+     * Checks if it is going to be used for a limit.
+     * Example lim from { x towar 0 } { {sin x}over x } = 1
+     * @return is a limit
+     */
     bool  IsUseLimits() const { return mbUseLimits; };
 
-    /** Get super- or subscript
+    /**
+     * Sets if it is going to be used for a limit to bVal.
+     * @param bVal
+     * @return
+     */
+    void  SetUseLimits(bool bVal) { mbUseLimits = bVal; }
+
+    /**
+     * Gets the node with the data of what has to be superindex or subindex.
+     * The position to check is given by eSubSup.
      * @remarks this method may return NULL.
+     * @param eSubSup
+     * @return body data
      */
-    SmNode * GetSubSup(SmSubSup eSubSup) { return GetSubNode(1 + eSubSup); };
-    const SmNode * GetSubSup(SmSubSup eSubSup) const { return const_cast< SmSubSupNode* >( this )->GetSubSup( eSubSup ); }
+     const SmNode * GetSubSup(SmSubSup eSubSup) const { return const_cast< SmSubSupNode* >
+                                                            ( this )->GetSubSup( eSubSup ); }
+           SmNode * GetSubSup(SmSubSup eSubSup)       { return GetSubNode(1 + eSubSup); };
 
-    /** Set the body */
+    /**
+     * Sets the node with the data of what has to be superindex or subindex.
+     * @param pScript
+     */
     void SetBody(SmNode* pBody) { SetSubNode(0, pBody); }
+
+     /**
+     * Sets the node with the data of what has to be superindex or subindex.
+     * The position to check is given by eSubSup.
+     * @param eSubSup
+     * @param pScript
+     */
     void SetSubSup(SmSubSup eSubSup, SmNode* pScript) { SetSubNode( 1 + eSubSup, pScript); }
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void CreateTextFromNode(OUStringBuffer &rText) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 
 };
@@ -892,19 +1587,53 @@ class SmBraceNode final : public SmStructureNode
 {
 public:
     explicit SmBraceNode(const SmToken &rNodeToken)
-        : SmStructureNode(SmNodeType::Brace, rNodeToken, 3)
-    {
-    }
+        : SmStructureNode(SmNodeType::Brace, rNodeToken, 3) { }
+
+    /**
+     * Returns the node containing the data of the opening brace.
+     * @return opening brace data
+     */
+    const SmMathSymbolNode* OpeningBrace() const { return const_cast<SmBraceNode *>
+                                                       (this)->OpeningBrace(); }
+    SmMathSymbolNode* OpeningBrace()             { assert( GetNumSubNodes() == 3 );
+                                                   assert( GetSubNode( 0 )->GetType()
+                                                               == SmNodeType::Math );
+                                                   return static_cast< SmMathSymbolNode* >
+                                                       ( GetSubNode( 0 )); }
 
-    SmMathSymbolNode* OpeningBrace();
-    const SmMathSymbolNode* OpeningBrace() const;
-    SmNode* Body();
-    const SmNode* Body() const;
-    SmMathSymbolNode* ClosingBrace();
-    const SmMathSymbolNode* ClosingBrace() const;
+    /**
+     * Returns the node containing the data of what is between braces.
+     * @return body data
+     */
+    const SmNode* Body() const { return const_cast<SmBraceNode *>(this)->Body(); }
+    SmNode* Body()             { assert( GetNumSubNodes() == 3 ); return GetSubNode( 1 ); }
+
+    /**
+     * Returns the node containing the data of the closing brace.
+     * @return closing brace data
+     */
+    const SmMathSymbolNode* ClosingBrace() const { return const_cast<SmBraceNode *>
+                                                       (this)->ClosingBrace(); }
+    SmMathSymbolNode* ClosingBrace()             { assert( GetNumSubNodes() == 3 );
+                                                   assert( GetSubNode( 2 )->GetType()
+                                                               == SmNodeType::Math );
+                                                   return static_cast< SmMathSymbolNode* >
+                                                       ( GetSubNode( 2 )); }
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void CreateTextFromNode(OUStringBuffer &rText) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -925,12 +1654,23 @@ class SmBracebodyNode final : public SmStructureNode
 public:
     explicit SmBracebodyNode(const SmToken &rNodeToken)
         : SmStructureNode(SmNodeType::Bracebody, rNodeToken)
-        , mnBodyHeight(0)
-    {
-    }
+        , mnBodyHeight(0) { }
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void    Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
     long GetBodyHeight() const { return mnBodyHeight; }
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -950,25 +1690,53 @@ public:
 class SmVerticalBraceNode final : public SmStructureNode
 {
 public:
-    explicit inline SmVerticalBraceNode(const SmToken &rNodeToken);
+    explicit SmVerticalBraceNode(const SmToken &rNodeToken)
+    : SmStructureNode(SmNodeType::VerticalBrace, rNodeToken, 3) { }
 
-    SmNode* Body();
-    const SmNode* Body() const;
-    SmMathSymbolNode* Brace();
-    const SmMathSymbolNode* Brace() const;
-    SmNode* Script();
-    const SmNode* Script() const;
+    /**
+     * Returns the node containing the data of what the brace is pointing for.
+     * body { script }
+     * @return body data
+     */
+    const SmNode* Body() const { return const_cast<SmVerticalBraceNode *>(this)->Body(); }
+    SmNode* Body()             { assert( GetNumSubNodes() == 3 ); return GetSubNode( 0 ); }
 
-    virtual void    Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void Accept(SmVisitor* pVisitor) override;
-};
+    /**
+     * Returns the node containing the data of the brace.
+     * @return brace data
+     */
+    const SmMathSymbolNode* Brace() const { return const_cast<SmVerticalBraceNode *>
+                                                (this)->Brace(); }
+          SmMathSymbolNode* Brace()       { assert( GetNumSubNodes() == 3 );
+                                            assert( GetSubNode( 1 )->GetType()
+                                                        == SmNodeType::Math );
+                                            return static_cast< SmMathSymbolNode* >
+                                                ( GetSubNode( 1 )); }
 
+    /**
+     * Returns the node containing the data of what is in the brace.
+     * body { script }
+     * @return opening brace data
+     */
+    const SmNode* Script() const { return const_cast<SmVerticalBraceNode *>(this)->Script(); }
+          SmNode* Script()       { assert( GetNumSubNodes() == 3 ); return GetSubNode( 2 ); }
 
-inline SmVerticalBraceNode::SmVerticalBraceNode(const SmToken &rNodeToken)
-    : SmStructureNode(SmNodeType::VerticalBrace, rNodeToken, 3)
-{
-}
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
+    virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
 
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
+    void Accept(SmVisitor* pVisitor) override;
+};
 
 /** Operation Node
  *
@@ -984,19 +1752,39 @@ class SmOperNode final : public SmStructureNode
 {
 public:
     explicit SmOperNode(const SmToken &rNodeToken)
-        : SmStructureNode(SmNodeType::Oper, rNodeToken, 2)
-    {
-    }
+        : SmStructureNode(SmNodeType::Oper, rNodeToken, 2) { }
 
-    SmNode *       GetSymbol();
-    const SmNode * GetSymbol() const
-    {
-        return const_cast<SmOperNode *>(this)->GetSymbol();
-    }
+    /**
+     * Returns the node with the opperator data
+     * @return opperator data
+     */
+    const SmNode * GetSymbol() const { return const_cast<SmOperNode *>(this)->GetSymbol(); }
+          SmNode * GetSymbol();
 
+    /**
+     * Returns the height of the node in base to the symbol
+     * ( rSymbol contains the opperator data )
+     * and the font format ( rFormat ).
+     * @param rSymbol
+     * @param rFormat
+     * @return node's height
+     */
     long CalcSymbolHeight(const SmNode &rSymbol, const SmFormat &rFormat) const;
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -1009,10 +1797,22 @@ class SmAlignNode final : public SmStructureNode
 {
 public:
     explicit SmAlignNode(const SmToken &rNodeToken)
-        : SmStructureNode(SmNodeType::Align, rNodeToken)
-    {}
+        : SmStructureNode(SmNodeType::Align, rNodeToken) { }
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -1031,17 +1831,37 @@ class SmAttributNode final : public SmStructureNode
 {
 public:
     explicit SmAttributNode(const SmToken &rNodeToken)
-        : SmStructureNode(SmNodeType::Attribut, rNodeToken, 2)
-    {}
+        : SmStructureNode(SmNodeType::Attribut, rNodeToken, 2) {}
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void CreateTextFromNode(OUStringBuffer &rText) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 
-    SmNode* Attribute();
-    const SmNode* Attribute() const;
-    SmNode* Body();
-    const SmNode* Body() const;
+    /**
+     * Gets the attribute data.
+     * @return attribute data
+     */
+    const SmNode* Attribute() const { return const_cast<SmAttributNode *>(this)->Attribute(); }
+          SmNode* Attribute()       { assert( GetNumSubNodes() == 2 ); return GetSubNode( 0 ); }
+
+    /**
+     * Gets the body data ( the nodes affected by the attribute ).
+     * @return body data
+     */
+    const SmNode* Body() const { return const_cast<SmAttributNode *>(this)->Body(); }
+          SmNode* Body()      { assert( GetNumSubNodes() == 2 ); return GetSubNode( 1 ); }
 };
 
 
@@ -1058,17 +1878,56 @@ public:
     explicit SmFontNode(const SmToken &rNodeToken)
         : SmStructureNode(SmNodeType::Font, rNodeToken)
         , meSizeType(FontSizeType::MULTIPLY)
-        , maFontSize(1)
-    {
-    }
+        , maFontSize(1) { }
+
+    /**
+     * Sets font size to rValue in nType mode.
+     * Check FontSizeType for details.
+     * @param rValue
+     * @param nType
+     * @return
+     */
+    void SetSizeParameter(const Fraction &rValue, FontSizeType nType)
+                            { meSizeType = nType; maFontSize = rValue; }
 
-    void SetSizeParameter(const Fraction &rValue, FontSizeType nType);
+    /**
+     * Returns the font size.
+     * @return font size.
+     */
     const Fraction & GetSizeParameter() const {return maFontSize;}
+
+    /**
+     * Returns the font size type.
+     * Check FontSizeType for details.
+     * @return font size type.
+     */
     FontSizeType GetSizeType() const {return meSizeType;}
 
-    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override;
+    /**
+     * Prepare preliminary settings about font and text
+     * (e.g. maFace, meRectHorAlign, mnFlags, mnAttributes, etc.)
+     * @param rFormat
+     * @param rDocShell
+     * @param nDepth
+     * @return
+     */
+    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell,
+                         int nDepth) override;
+
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void CreateTextFromNode(OUStringBuffer &rText) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -1087,18 +1946,45 @@ public:
     explicit SmMatrixNode(const SmToken &rNodeToken)
         : SmStructureNode(SmNodeType::Matrix, rNodeToken)
         , mnNumRows(0)
-        , mnNumCols(0)
-    {
-    }
+        , mnNumCols(0) { }
 
+    /**
+     * Gets the number of rows of the matrix.
+     * @return rows number
+     */
     sal_uInt16 GetNumRows() const {return mnNumRows;}
+
+    /**
+     * Gets the number of columns of the matrix.
+     * @return columns number
+     */
     sal_uInt16 GetNumCols() const {return mnNumCols;}
-    void SetRowCol(sal_uInt16 nMatrixRows, sal_uInt16 nMatrixCols);
+
+    /**
+     * Sets the dimensions of the matrix.
+     * @param nMatrixRows
+     * @param nMatrixCols
+     * @return
+     */
+    void SetRowCol(sal_uInt16 nMatrixRows, sal_uInt16 nMatrixCols)
+                     { mnNumRows = nMatrixRows; mnNumCols = nMatrixCols; }
 
     virtual const SmNode * GetLeftMost() const override;
 
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
     virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void CreateTextFromNode(OUStringBuffer &rText) override;
+
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
     void Accept(SmVisitor* pVisitor) override;
 };
 
@@ -1114,157 +2000,41 @@ class SmBlankNode final : public SmGraphicNode
 public:
     explicit SmBlankNode(const SmToken &rNodeToken)
         : SmGraphicNode(SmNodeType::Blank, rNodeToken)
-        , mnNum(0)
-    {
-    }
+        , mnNum(0) { }
 
     void         IncreaseBy(const SmToken &rToken, sal_uInt32 nMultiplyBy = 1);
     void         Clear() { mnNum = 0; }
     sal_uInt16   GetBlankNum() const { return mnNum; }
     void         SetBlankNum(sal_uInt16 nNumber) { mnNum = nNumber; }
 
-    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override;
-    virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
-    void Accept(SmVisitor* pVisitor) override;
-    virtual void CreateTextFromNode(OUStringBuffer &rText) override;
-};
-
-
-inline SmNode* SmRootNode::Argument()
-{
-    assert( GetNumSubNodes() == 3 );
-    return GetSubNode( 0 );
-}
-inline const SmNode* SmRootNode::Argument() const
-{
-    return const_cast< SmRootNode* >( this )->Argument();
-}
-inline SmRootSymbolNode* SmRootNode::Symbol()
-{
-    assert( GetNumSubNodes() == 3 );
-    assert( GetSubNode( 1 )->GetType() == SmNodeType::RootSymbol );
-    return static_cast< SmRootSymbolNode* >( GetSubNode( 1 ));
-}
-inline const SmRootSymbolNode* SmRootNode::Symbol() const
-{
-    return const_cast< SmRootNode* >( this )->Symbol();
-}
-inline SmNode* SmRootNode::Body()
-{
-    assert( GetNumSubNodes() == 3 );
-    return GetSubNode( 2 );
-}
-inline const SmNode* SmRootNode::Body() const
-{
-    return const_cast< SmRootNode* >( this )->Body();
-}
-
-
-inline SmNode* SmBinHorNode::Symbol()
-{
-    assert( GetNumSubNodes() == 3 );
-    return GetSubNode( 1 );
-}
-inline const SmNode* SmBinHorNode::Symbol() const
-{
-    return const_cast< SmBinHorNode* >( this )->Symbol();
-}
-inline SmNode* SmBinHorNode::LeftOperand()
-{
-    assert( GetNumSubNodes() == 3 );
-    return GetSubNode( 0 );
-}
-inline const SmNode* SmBinHorNode::LeftOperand() const
-{
-    return const_cast< SmBinHorNode* >( this )->LeftOperand();
-}
-inline SmNode* SmBinHorNode::RightOperand()
-{
-    assert( GetNumSubNodes() == 3 );
-    return GetSubNode( 2 );
-}
-inline const SmNode* SmBinHorNode::RightOperand() const
-{
-    return const_cast< SmBinHorNode* >( this )->RightOperand();
-}
+    /**
+     * Prepare preliminary settings about font and text
+     * (e.g. maFace, meRectHorAlign, mnFlags, mnAttributes, etc.)
+     * @param rFormat
+     * @param rDocShell
+     * @param nDepth
+     * @return
+     */
+    virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell,
+                         int nDepth) override;
 
-inline SmNode* SmAttributNode::Attribute()
-{
-    assert( GetNumSubNodes() == 2 );
-    return GetSubNode( 0 );
-}
-inline const SmNode* SmAttributNode::Attribute() const
-{
-    return const_cast< SmAttributNode* >( this )->Attribute();
-}
-inline SmNode* SmAttributNode::Body()
-{
-    assert( GetNumSubNodes() == 2 );
-    return GetSubNode( 1 );
-}
-inline const SmNode* SmAttributNode::Body() const
-{
-    return const_cast< SmAttributNode* >( this )->Body();
-}
+    /**
+     * Prepares the SmRect to render.
+     * @param rDev
+     * @param rFormat
+     * @return
+     */
+    virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override;
 
-inline SmMathSymbolNode* SmBraceNode::OpeningBrace()
-{
-    assert( GetNumSubNodes() == 3 );
-    assert( GetSubNode( 0 )->GetType() == SmNodeType::Math );
-    return static_cast< SmMathSymbolNode* >( GetSubNode( 0 ));
-}
-inline const SmMathSymbolNode* SmBraceNode::OpeningBrace() const
-{
-    return const_cast< SmBraceNode* >( this )->OpeningBrace();
-}
-inline SmNode* SmBraceNode::Body()
-{
-    assert( GetNumSubNodes() == 3 );
-    return GetSubNode( 1 );
-}
-inline const SmNode* SmBraceNode::Body() const
-{
-    return const_cast< SmBraceNode* >( this )->Body();
-}
-inline SmMathSymbolNode* SmBraceNode::ClosingBrace()
-{
-    assert( GetNumSubNodes() == 3 );
-    assert( GetSubNode( 2 )->GetType() == SmNodeType::Math );
-    return static_cast< SmMathSymbolNode* >( GetSubNode( 2 ));
-}
-inline const SmMathSymbolNode* SmBraceNode::ClosingBrace() const
-{
-    return const_cast< SmBraceNode* >( this )->ClosingBrace();
-}
+    /**
+     * Accept a visitor.
+     * Calls the method for this class on the visitor.
+     * @param pVisitor
+     * @return
+     */
+    void Accept(SmVisitor* pVisitor) override;
 
-inline SmNode* SmVerticalBraceNode::Body()
-{
-    assert( GetNumSubNodes() == 3 );
-    return GetSubNode( 0 );
-}
-inline const SmNode* SmVerticalBraceNode::Body() const
-{
-    return const_cast< SmVerticalBraceNode* >( this )->Body();
-}
-inline SmMathSymbolNode* SmVerticalBraceNode::Brace()
-{
-    assert( GetNumSubNodes() == 3 );
-    assert( GetSubNode( 1 )->GetType() == SmNodeType::Math );
-    return static_cast< SmMathSymbolNode* >( GetSubNode( 1 ));
-}
-inline const SmMathSymbolNode* SmVerticalBraceNode::Brace() const
-{
-    return const_cast< SmVerticalBraceNode* >( this )->Brace();
-}
-inline SmNode* SmVerticalBraceNode::Script()
-{
-    assert( GetNumSubNodes() == 3 );
-    return GetSubNode( 2 );
-}
-inline const SmNode* SmVerticalBraceNode::Script() const
-{
-    return const_cast< SmVerticalBraceNode* >( this )->Script();
-}
+};
 
 #endif
 
diff --git a/starmath/inc/visitors.hxx b/starmath/inc/visitors.hxx
index 3f903aba8820..1591d3757860 100644
--- a/starmath/inc/visitors.hxx
+++ b/starmath/inc/visitors.hxx
@@ -438,21 +438,37 @@ public:
     void Visit( SmRectangleNode* pNode ) override;
     void Visit( SmVerticalBraceNode* pNode ) override;
 private:
-    /** Extract text from a pNode that constitutes a line */
+
+    /**
+      * Extract text from a pNode that constitutes a line.
+      * @param pNode
+      * @return
+      */
     void LineToText( SmNode* pNode ) {
         Separate( );
-        if( pNode )
-            pNode->Accept( this );
+        if( pNode ) pNode->Accept( this );
         Separate( );
     }
+
+    /**
+      * Appends rText to the OUStringBuffer ( maCmdText ).
+      * @param rText
+      * @return
+      */
     void Append( const OUString &rText ) {
         maCmdText.append( rText );
     }
-    /** Append a blank for separation, if needed */
+
+    /**
+     * Append a blank for separation, if needed.
+     * It is needed if last char is not ' '.
+     * @return
+     */
     void Separate( ){
-        if( maCmdText.isEmpty() || maCmdText[ maCmdText.getLength() - 1 ] != ' ' )
+        if( !maCmdText.isEmpty() && maCmdText[ maCmdText.getLength() - 1 ] != ' ' )
             maCmdText.append(' ');
     }
+
     /** Output text generated from the pNodes */
     OUStringBuffer maCmdText;
 };
diff --git a/starmath/qa/cppunit/test_cursor.cxx b/starmath/qa/cppunit/test_cursor.cxx
index 200af93f2849..8cf0bced8eb8 100644
--- a/starmath/qa/cppunit/test_cursor.cxx
+++ b/starmath/qa/cppunit/test_cursor.cxx
@@ -84,7 +84,7 @@ void Test::testCopyPaste()
     aCursor.Move(pOutputDevice, MoveRight);
     aCursor.Paste();
 
-    CPPUNIT_ASSERT_EQUAL(OUString(" { a * b + c * b } "), xDocShRef->GetText());
+    CPPUNIT_ASSERT_EQUAL(OUString("{ a * b + c * b }"), xDocShRef->GetText());
 }
 
 void Test::testCopySelectPaste()
@@ -110,7 +110,7 @@ void Test::testCopySelectPaste()
     aCursor.Move(pOutputDevice, MoveRight, false);
     aCursor.Paste();
 
-    CPPUNIT_ASSERT_EQUAL(OUString(" { b + c * b + c } "), xDocShRef->GetText());
+    CPPUNIT_ASSERT_EQUAL(OUString("{ b + c * b + c }"), xDocShRef->GetText());
 }
 
 void Test::testCutPaste()
@@ -132,7 +132,7 @@ void Test::testCutPaste()
     aCursor.Move(pOutputDevice, MoveRight);
     aCursor.Paste();
 
-    CPPUNIT_ASSERT_EQUAL(OUString(" { a + c * b } "), xDocShRef->GetText());
+    CPPUNIT_ASSERT_EQUAL(OUString("{ a + c * b }"), xDocShRef->GetText());
 }
 
 void Test::testCutSelectPaste()
@@ -158,7 +158,7 @@ void Test::testCutSelectPaste()
     aCursor.Move(pOutputDevice, MoveRight, false);
     aCursor.Paste();
 
-    CPPUNIT_ASSERT_EQUAL(OUString(" { b + c * } "), xDocShRef->GetText());
+    CPPUNIT_ASSERT_EQUAL(OUString("{ b + c * }"), xDocShRef->GetText());
 }
 
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
diff --git a/starmath/qa/cppunit/test_nodetotextvisitors.cxx b/starmath/qa/cppunit/test_nodetotextvisitors.cxx
index 0faf69ee9d87..72a78abaf1d5 100644
--- a/starmath/qa/cppunit/test_nodetotextvisitors.cxx
+++ b/starmath/qa/cppunit/test_nodetotextvisitors.cxx
@@ -114,16 +114,16 @@ void Test::SimpleUnaryOp()
     parseandparseagain("-+4", "Minus/plus");
     parseandparseagain("neg a", "Boolean 'not'");
     parseandparseagain("fact a", "Factorial");
-    parseandparseagain(" - { 1 over 2 } ", "BinVer in Unary 1");
-    ParseAndCheck(" - { 1 over 2 } ", " - { 1 over 2 } ", "BinVer in Unary 1");
-    parseandparseagain(" { - { 1 over 2 } } ", "BinVer in Unary 2");
-    parseandparseagain(" - 1 over 2 ", "Unary in BinVer as numerator 1");
-    parseandparseagain(" { - 1 } over 2 ", "Unary in BinVer as numerator 2");
-    parseandparseagain(" 1 over - 2 ", "Unary in BinVer as denominator 1");
-    parseandparseagain(" 1 over { - 2 } ", "Unary in BinVer as denominator 2");
-    parseandparseagain(" 2 { - 1 over 2 } ", "Mixed number with Unary in denominator 1");
-    parseandparseagain(" 2 { - 1 } over 2 ", "Mixed number with Unary in denominator 2");
-    parseandparseagain(" - 1 + 2 ", "Unary in BinHor");
+    parseandparseagain("- { 1 over 2 }", "BinVer in Unary 1");
+    ParseAndCheck("- { 1 over 2 }", "- { 1 over 2 }", "BinVer in Unary 1");
+    parseandparseagain("{- { 1 over 2 } }", "BinVer in Unary 2");
+    parseandparseagain("- 1 over 2", "Unary in BinVer as numerator 1");
+    parseandparseagain("{ - 1 } over 2", "Unary in BinVer as numerator 2");
+    parseandparseagain("1 over - 2", "Unary in BinVer as denominator 1");
+    parseandparseagain("1 over { - 2 }", "Unary in BinVer as denominator 2");
+    parseandparseagain("2 { - 1 over 2 }", "Mixed number with Unary in denominator 1");
+    parseandparseagain("2 { - 1 } over 2", "Mixed number with Unary in denominator 2");
+    parseandparseagain("- 1 + 2", "Unary in BinHor");
 }
 
 void Test::SimpleBinaryOp()
@@ -227,8 +227,8 @@ void Test::SimpleOperators()
     parseandparseagain("prod{a}", "Product");
     parseandparseagain("coprod{a}", "Coproduct");
     parseandparseagain("int from {r_0} to {r_t} a", "Upper and lower bounds shown with integral (from & to)");
-    ParseAndCheck("int csup {r_0} csub {r_t} a", "int csup { r _ 0 } csub { r _ t } a ", "Upper and lower bounds shown with integral (csub & csup)");
-    ParseAndCheck("sum csup { size 8 { x - 1 } } csub { size 8 a } b ", "sum csup { size 8 { x - 1 } } csub { size 8 a } b ", "Sum with sized upper and lower bounds");
+    ParseAndCheck("int csup {r_0} csub {r_t} a", "int csup { r _ 0 } csub { r _ t } a", "Upper and lower bounds shown with integral (csub & csup)");
+    ParseAndCheck("sum csup { size 8 { x - 1 } } csub { size 8 a } b", "sum csup { size 8 { x - 1 } } csub { size 8 a } b", "Sum with sized upper and lower bounds");
     parseandparseagain("int{a}", "Integral");
     parseandparseagain("intd_{1}^{2}{x dx}", "Dynamically-sized integral");
     parseandparseagain("iint{a}", "Double integral");
@@ -523,7 +523,7 @@ void Test::testBinomInBinHor()
     aCursor.InsertElement(PlusElement);
     aCursor.InsertText("d");
 
-    sExpected += " { { binom a b + c } + d } ";
+    sExpected += "{ { binom a b + c } + d }";
     CPPUNIT_ASSERT_EQUAL_MESSAGE("Binom Node in BinHor Node", sExpected, xDocShRef->GetText());
 }
 
@@ -551,7 +551,7 @@ void Test::testBinVerInUnary()
     aCursor.Move(pOutputDevice, MoveDown);
     aCursor.InsertText("2");
 
-    sExpected += " - { 1 over 2 } ";
+    sExpected += "- { 1 over 2 }";
     CPPUNIT_ASSERT_EQUAL_MESSAGE("Binary Vertical in Unary Operator", sExpected, xDocShRef->GetText());
 }
 
@@ -576,7 +576,7 @@ void Test::testBinHorInSubSup()
     aCursor.InsertElement(PlusElement);
     aCursor.InsertText("d");
 
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("BinHor in SubSup", OUString(" { a ^ { b + c } + d } "), xDocShRef->GetText());
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("BinHor in SubSup", OUString("{ a ^ { b + c } + d }"), xDocShRef->GetText());
 }
 
 void Test::testUnaryInMixedNumberAsNumerator()
@@ -615,7 +615,7 @@ void Test::testUnaryInMixedNumberAsNumerator()
     aCursor.InsertElement(PlusElement);
     aCursor.InsertText("4");
 
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Unary in mixed number as Numerator", OUString(" { 2 { - 1 over 2 } + 4 } "), xDocShRef->GetText());
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Unary in mixed number as Numerator", OUString("{ 2 { - 1 over 2 } + 4 }"), xDocShRef->GetText());
 }
 
 void Test::testMiscEquivalent()
diff --git a/starmath/qa/extras/mmlimport-test.cxx b/starmath/qa/extras/mmlimport-test.cxx
index 5ed9bc86f50a..279dbd56e4ad 100644
--- a/starmath/qa/extras/mmlimport-test.cxx
+++ b/starmath/qa/extras/mmlimport-test.cxx
@@ -96,66 +96,66 @@ void Test::tearDown()
 void Test::testColor()
 {
     loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/color.mml"));
-    CPPUNIT_ASSERT_EQUAL(OUString("{{color black b}"
-                                  " {color white w}"
-                                  " {color red r}"
-                                  " {color green g}"
-                                  " {color blue b}"
-                                  " {color yellow y}"
-                                  " {color silver s}"
-                                  " {color gray g}"
-                                  " {color maroon m}"
-                                  " {color purple p}"
-                                  " {color lime l}"
-                                  " {color olive o}"
-                                  " {color navy n}"
-                                  " {color teal t}"
-                                  " {color aqua a}"
-                                  " {color fuchsia f}}"),
+    CPPUNIT_ASSERT_EQUAL(OUString("{ color black b"
+                                  " color white w"
+                                  " color red r"
+                                  " color green g"
+                                  " color blue b"
+                                  " color yellow y"
+                                  " color silver s"
+                                  " color gray g"
+                                  " color maroon m"
+                                  " color purple p"
+                                  " color lime l"
+                                  " color olive o"
+                                  " color navy n"
+                                  " color teal t"
+                                  " color aqua a"
+                                  " color fuchsia f }"),
                          mxDocShell->GetText());
 }
 
 void Test::testSimple()
 {
     loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/simple.mml"));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", OUString("left ( {a + b} right )^2"), mxDocShell->GetText());
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", OUString("left ( { a + b } right ) ^ 2"), mxDocShell->GetText());
 }
 
 void Test::testNsPrefixMath()
 {
     loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/ns-prefix-math.mml"));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", OUString("left ( {a + b} right )^2"), mxDocShell->GetText());
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", OUString("left ( { a + b } right ) ^ 2"), mxDocShell->GetText());
 }
 
 void Test::testMaction()
 {
     loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/maction.mml"));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", OUString("matrix {1 ## 2 ## 3}"), mxDocShell->GetText());
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", OUString("matrix{ 1 ## 2 ## 3 }"), mxDocShell->GetText());
 }
 
 void Test::testMspace()
 {
     loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/mspace.mml"));
-    CPPUNIT_ASSERT_EQUAL(OUString("{a b ~ c ~~``` d}"), mxDocShell->GetText());
+    CPPUNIT_ASSERT_EQUAL(OUString("{ a b ~ c ~~``` d }"), mxDocShell->GetText());
 }
 
 void Test::testtdf99556()
 {
     loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/tdf99556-1.mml"));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", OUString("sqrt { {} }"), mxDocShell->GetText());
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("loaded text", OUString("sqrt { }"), mxDocShell->GetText());
 }
 
 void Test::testTdf103430()
 {
     loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/tdf103430.mml"));
-    CPPUNIT_ASSERT_EQUAL(OUString("{{nitalic d}^2 {nitalic {color blue y}}} over {{nitalic d} {font sans {bold {italic {color red x}}}}}"),
+    CPPUNIT_ASSERT_EQUAL(OUString("{ { nitalic d ^ 2 nitalic color blue y } over { nitalic d font sans bold italic color red x } }"),
                          mxDocShell->GetText());
 }
 
 void Test::testTdf103500()
 {
     loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/tdf103500.mml"));
-    CPPUNIT_ASSERT_EQUAL(OUString("{{ int csub a csup b {1 over x ` {nitalic d} x}} = {intd csub a csup b {1 over y ` {nitalic d} y}}}"),
+    CPPUNIT_ASSERT_EQUAL(OUString("{ { int csup b csub a { { 1 over x } ` nitalic d x } } = { intd csup b csub a { { 1 over y } ` nitalic d y } } }"),
                          mxDocShell->GetText());
 }
 
diff --git a/starmath/source/mathmlimport.cxx b/starmath/source/mathmlimport.cxx
index b367b9943374..76b82a5d519b 100644
--- a/starmath/source/mathmlimport.cxx
+++ b/starmath/source/mathmlimport.cxx
@@ -71,6 +71,7 @@ one go*/
 #include <smdll.hxx>
 #include <unomodel.hxx>
 #include <utility.hxx>
+#include <visitors.hxx>
 
 using namespace ::com::sun::star::beans;
 using namespace ::com::sun::star::container;
@@ -462,17 +463,13 @@ void SmXMLImport::endDocument()
 
         if (pModel)
         {
-            SmDocShell *pDocShell =
-                static_cast<SmDocShell*>(pModel->GetObjectShell());
+            SmDocShell *pDocShell = static_cast<SmDocShell*>(pModel->GetObjectShell());
             auto pTreeTmp = pTree.get();
             pDocShell->SetFormulaTree(static_cast<SmTableNode *>(pTree.release()));
             if (aText.isEmpty())  //If we picked up no annotation text
             {
-                OUStringBuffer aStrBuf;
                 // Get text from imported formula
-                pTreeTmp->CreateTextFromNode(aStrBuf);
-                aStrBuf.stripEnd(' ');
-                aText = aStrBuf.makeStringAndClear();
+                SmNodeToTextVisitor tmpvisitor( pTreeTmp, aText );
             }
 
             // Convert symbol names
diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx
index 526b2e3ee010..e894ad84b6d8 100644
--- a/starmath/source/node.cxx
+++ b/starmath/source/node.cxx
@@ -140,7 +140,6 @@ void SmNode::SetFont(const SmFace &rFace)
 {
     if (!(Flags() & FontChangeMask::Face))
         GetFont() = rFace;
-
     ForEachNonNull(this, [&rFace](SmNode *pNode){pNode->SetFont(rFace);});
 }
 
@@ -244,27 +243,14 @@ void SmNode::Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int n
     ForEachNonNull(this, [&rFormat, &rDocShell, nDepth](SmNode *pNode){pNode->Prepare(rFormat, rDocShell, nDepth + 1);});
 }
 
-void SmNode::Move(const Point& rPosition)
+void SmNode::Move(const Point& rVector)
 {
-    if (rPosition.X() == 0  &&  rPosition.Y() == 0)
+    if (rVector.X() == 0  &&  rVector.Y() == 0)
         return;
 
-    SmRect::Move(rPosition);
+    SmRect::Move(rVector);
 
-    ForEachNonNull(this, [&rPosition](SmNode *pNode){pNode->Move(rPosition);});
-}
-
-void SmNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    auto nSize = GetNumSubNodes();
-    if (nSize > 1)
-        rText.append("{");
-    ForEachNonNull(this, [&rText](SmNode *pNode){pNode->CreateTextFromNode(rText);});
-    if (nSize > 1)
-    {
-        rText.stripEnd(' ');
-        rText.append("} ");
-    }
+    ForEachNonNull(this, [&rVector](SmNode *pNode){pNode->Move(rVector);});
 }
 
 void SmNode::AdaptToX(OutputDevice &/*rDev*/, sal_uLong /*nWidth*/)
@@ -441,6 +427,31 @@ void SmStructureNode::ClaimPaternity()
     ForEachNonNull(this, [this](SmNode *pNode){pNode->SetParent(this);});
 }
 
+int SmStructureNode::IndexOfSubNode(SmNode const * pSubNode)
+{
+    size_t nSize = GetNumSubNodes();
+    for (size_t i = 0; i < nSize; i++)
+        if (pSubNode == GetSubNode(i))
+            return i;
+    return -1;
+}
+
+void SmStructureNode::SetSubNode(size_t nIndex, SmNode* pNode)
+{
+    size_t size = maSubNodes.size();
+    if (size <= nIndex)
+    {
+        //Resize subnodes array
+        maSubNodes.resize(nIndex + 1);
+        //Set new slots to NULL except at nIndex
+        for (size_t i = size; i < nIndex; i++)
+            maSubNodes[i] = nullptr;
+    }
+    maSubNodes[nIndex] = pNode;
+    if (pNode)
+        pNode->SetParent(this);
+}
+
 bool SmVisibleNode::IsVisible() const
 {
     return true;
@@ -461,32 +472,6 @@ void SmGraphicNode::GetAccessibleText( OUStringBuffer &rText ) const
     rText.append(GetToken().aText);
 }
 
-void SmExpressionNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    size_t nSize = GetNumSubNodes();
-    if (nSize > 1)
-        rText.append("{");
-    for (size_t i = 0; i < nSize; ++i)
-    {
-        SmNode *pNode = GetSubNode(i);
-        if (pNode)
-        {
-            pNode->CreateTextFromNode(rText);
-            //Just a bit of foo to make unary +asd -asd +-asd -+asd look nice
-            if (pNode->GetType() == SmNodeType::Math)
-                if ((nSize != 2) || rText.isEmpty() ||
-                    (rText[rText.getLength() - 1] != '+' && rText[rText.getLength() - 1] != '-') )
-                    rText.append(" ");
-        }
-    }
-
-    if (nSize > 1)
-    {
-        rText.stripEnd(' ');
-        rText.append("} ");
-    }
-}
-
 void SmTableNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
     // arranges all subnodes in one column
 {
@@ -760,27 +745,6 @@ void SmRootNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
         ExtendBy(*pExtra, RectCopyMBL::This, true);
 }
 
-
-void SmRootNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    SmNode *pExtra = GetSubNode(0);
-    if (pExtra)
-    {
-        rText.append("nroot ");
-        pExtra->CreateTextFromNode(rText);
-    }
-    else
-        rText.append("sqrt ");
-
-    if (!pExtra && GetSubNode(2)->GetNumSubNodes() > 1)
-        rText.append("{ ");
-
-    GetSubNode(2)->CreateTextFromNode(rText);
-
-    if (!pExtra && GetSubNode(2)->GetNumSubNodes() > 1)
-        rText.append("} ");
-}
-
 /**************************************************************************/
 
 
@@ -880,15 +844,6 @@ void SmBinVerNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
     ExtendBy(*pDenom, RectCopyMBL::None).ExtendBy(*pLine, RectCopyMBL::None, pLine->GetCenterY());
 }
 
-void SmBinVerNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    SmNode *pNum   = GetSubNode(0),
-           *pDenom = GetSubNode(2);
-    pNum->CreateTextFromNode(rText);
-    rText.append("over ");
-    pDenom->CreateTextFromNode(rText);
-}
-
 const SmNode * SmBinVerNode::GetLeftMost() const
 {
     return this;
@@ -1256,100 +1211,8 @@ void SmSubSupNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
     }
 }
 
-void SmSubSupNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    SmNode *pNode;
-    GetSubNode(0)->CreateTextFromNode(rText);
-
-    if (nullptr != (pNode = GetSubNode(LSUB+1)))
-    {
-        rText.append("lsub ");
-        pNode->CreateTextFromNode(rText);
-    }
-    if (nullptr != (pNode = GetSubNode(LSUP+1)))
-    {
-        rText.append("lsup ");
-        pNode->CreateTextFromNode(rText);
-    }
-    if (nullptr != (pNode = GetSubNode(CSUB+1)))
-    {
-        rText.append("csub ");
-        pNode->CreateTextFromNode(rText);
-    }
-    if (nullptr != (pNode = GetSubNode(CSUP+1)))
-    {
-        rText.append("csup ");
-        pNode->CreateTextFromNode(rText);
-    }
-    if (nullptr != (pNode = GetSubNode(RSUB+1)))
-    {
-        rText.stripEnd(' ');
-        rText.append("_");
-        pNode->CreateTextFromNode(rText);
-    }
-    if (nullptr != (pNode = GetSubNode(RSUP+1)))
-    {
-        rText.stripEnd(' ');
-        rText.append("^");
-        pNode->CreateTextFromNode(rText);
-    }
-}
-
-
 /**************************************************************************/
 
-void SmBraceNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    if (GetScaleMode() == SmScaleMode::Height)
-        rText.append("left ");
-    {
-        OUStringBuffer aStrBuf;
-        OpeningBrace()->CreateTextFromNode(aStrBuf);
-        OUString aStr = aStrBuf.makeStringAndClear();
-        aStr = comphelper::string::strip(aStr, ' ');
-        aStr = comphelper::string::stripStart(aStr, '\\');
-        if (!aStr.isEmpty())
-        {
-            if (aStr == "divides")
-                rText.append("lline");
-            else if (aStr == "parallel")
-                rText.append("ldline");
-            else if (aStr == "<")
-                rText.append("langle");
-            else
-                rText.append(aStr);
-            rText.append(" ");
-        }
-        else
-            rText.append("none ");
-    }
-    Body()->CreateTextFromNode(rText);
-    if (GetScaleMode() == SmScaleMode::Height)
-        rText.append("right ");
-    {
-        OUStringBuffer aStrBuf;
-        ClosingBrace()->CreateTextFromNode(aStrBuf);
-        OUString aStr = aStrBuf.makeStringAndClear();
-        aStr = comphelper::string::strip(aStr, ' ');
-        aStr = comphelper::string::stripStart(aStr, '\\');
-        if (!aStr.isEmpty())
-        {
-            if (aStr == "divides")
-                rText.append("rline");
-            else if (aStr == "parallel")
-                rText.append("rdline");
-            else if (aStr == ">")
-                rText.append("rangle");
-            else
-                rText.append(aStr);
-            rText.append(" ");
-        }
-        else
-            rText.append("none ");
-    }
-    rText.append(" ");
-}
-
 void SmBraceNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
 {
     SmNode *pLeft  = OpeningBrace(),
@@ -1716,144 +1579,6 @@ void SmAttributNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
     ExtendBy(*pAttr, RectCopyMBL::This, true);
 }
 
-void SmFontNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    rText.append("{");
-    sal_Int32 nc,r,g,b;
-
-    switch (GetToken().eType)
-    {
-        case TBOLD:
-            rText.append("bold ");
-            break;
-        case TNBOLD:
-            rText.append("nbold ");
-            break;
-        case TITALIC:
-            rText.append("italic ");
-            break;
-        case TNITALIC:
-            rText.append("nitalic ");
-            break;
-        case TPHANTOM:
-            rText.append("phantom ");
-            break;
-        case TSIZE:
-            {
-                rText.append("size ");
-                switch (meSizeType)
-                {
-                    case FontSizeType::PLUS:
-                        rText.append("+");
-                        break;
-                    case FontSizeType::MINUS:
-                        rText.append("-");
-                        break;
-                    case FontSizeType::MULTIPLY:
-                        rText.append("*");
-                        break;
-                    case FontSizeType::DIVIDE:
-                        rText.append("/");
-                        break;
-                    case FontSizeType::ABSOLUT:
-                    default:
-                        break;
-                }
-                rText.append(::rtl::math::doubleToUString(
-                            static_cast<double>(maFontSize),
-                            rtl_math_StringFormat_Automatic,
-                            rtl_math_DecimalPlaces_Max, '.', true));
-                rText.append(" ");
-            }
-            break;
-        case TBLACK:
-            rText.append("color black ");
-            break;
-        case TWHITE:
-            rText.append("color white ");
-            break;
-        case TRED:
-            rText.append("color red ");
-            break;
-        case TGREEN:
-            rText.append("color green ");
-            break;
-        case TBLUE:
-            rText.append("color blue ");
-            break;
-        case TCYAN:
-            rText.append("color cyan ");
-            break;
-        case TMAGENTA:
-            rText.append("color magenta ");
-            break;
-        case TYELLOW:
-            rText.append("color yellow ");
-            break;
-        case TTEAL:
-            rText.append("color teal ");
-            break;
-        case TSILVER:
-            rText.append("color silver ");
-            break;
-        case TGRAY:
-            rText.append("color gray ");
-            break;
-        case TMAROON:
-            rText.append("color maroon ");
-            break;
-        case TPURPLE:
-            rText.append("color purple ");
-            break;
-        case TLIME:
-            rText.append("color lime ");
-            break;
-        case TOLIVE:
-            rText.append("color olive ");
-            break;
-        case TNAVY:
-            rText.append("color navy ");
-            break;
-        case TAQUA:
-            rText.append("color aqua ");
-            break;
-        case TFUCHSIA:
-            rText.append("color fuchsia ");
-            break;
-        case TRGB:
-            rText.append("color rgb ");
-            nc = GetToken().aText.toInt32();
-            b = nc % 256;
-            nc /= 256;
-            g = nc % 256;
-            nc /= 256;
-            r = nc % 256;
-            rText.append(r);
-            rText.append(" ");
-            rText.append(g);
-            rText.append(" ");
-            rText.append(b);
-            rText.append(" ");
-            break;
-        case TSANS:
-            rText.append("font sans ");
-            break;
-        case TSERIF:
-            rText.append("font serif ");
-            break;
-        case TFIXED:
-            rText.append("font fixed ");
-            break;
-        default:
-            break;
-    }
-    if (GetNumSubNodes() > 1)
-        GetSubNode(1)->CreateTextFromNode(rText);
-
-    rText.stripEnd(' ');
-    rText.append("} ");
-}
-
 void SmFontNode::Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth)
 {
     //! prepare subnodes first
@@ -1883,7 +1608,7 @@ void SmFontNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
     SmNode *pNode = GetSubNode(1);
     assert(pNode);
     sal_Int32 nc;
-    Color col_perso_rgb_color (0);
+    Color col_perso_rgb_color = COL_AUTO;
 
     switch (GetToken().eType)
     {   case TSIZE :
@@ -1902,23 +1627,23 @@ void SmFontNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
         case TNBOLD :   ClearAttribut(FontAttribute::Bold);   break;
         case TNITALIC : ClearAttribut(FontAttribute::Italic); break;
 
-        case TBLACK :   SetColor(COL_BLACK);     break;
-        case TWHITE :   SetColor(COL_WHITE);     break;
+        case TBLACK :   SetColor(COL_BLACK);         break;
+        case TWHITE :   SetColor(COL_WHITE);         break;
         case TRED :     SetColor(COL_LIGHTRED);      break;
-        case TGREEN :   SetColor(COL_GREEN);     break;
+        case TGREEN :   SetColor(COL_GREEN);         break;
         case TBLUE :    SetColor(COL_LIGHTBLUE);     break;
         case TCYAN :    SetColor(COL_LIGHTCYAN);     break; // as in Calc
         case TMAGENTA : SetColor(COL_LIGHTMAGENTA);  break; // as in Calc
-        case TYELLOW :  SetColor(COL_YELLOW);    break;
-        case TTEAL :    SetColor(COL_CYAN);  break;
-        case TSILVER :  SetColor(COL_LIGHTGRAY);  break;
-        case TGRAY :    SetColor(COL_GRAY);  break;
-        case TMAROON :  SetColor(COL_RED);  break;
-        case TPURPLE :  SetColor(COL_MAGENTA);  break;
-        case TLIME :    SetColor(COL_LIGHTGREEN);  break;
-        case TOLIVE :   SetColor(COL_BROWN);  break;
-        case TNAVY :    SetColor(COL_BLUE);  break;
-        case TAQUA :    SetColor(COL_LIGHTCYAN);  break;
+        case TYELLOW :  SetColor(COL_YELLOW);        break;
+        case TTEAL :    SetColor(COL_CYAN);          break;
+        case TSILVER :  SetColor(COL_LIGHTGRAY);     break;
+        case TGRAY :    SetColor(COL_GRAY);          break;
+        case TMAROON :  SetColor(COL_RED);           break;
+        case TPURPLE :  SetColor(COL_MAGENTA);       break;
+        case TLIME :    SetColor(COL_LIGHTGREEN);    break;
+        case TOLIVE :   SetColor(COL_BROWN);         break;
+        case TNAVY :    SetColor(COL_BLUE);          break;
+        case TAQUA :    SetColor(COL_LIGHTCYAN);     break;
         case TFUCHSIA : SetColor(COL_LIGHTMAGENTA);  break;
         case TRGB :
             nc = GetToken().aText.toInt32();
@@ -1939,14 +1664,6 @@ void SmFontNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
     SmRect::operator = (pNode->GetRect());
 }
 
-
-void SmFontNode::SetSizeParameter(const Fraction& rValue, FontSizeType eType)
-{
-    meSizeType = eType;
-    maFontSize = rValue;
-}
-
-
 /**************************************************************************/
 
 
@@ -2085,6 +1802,12 @@ SmTextNode::SmTextNode( const SmToken &rNodeToken, sal_uInt16 nFontDescP )
 {
 }
 
+void SmTextNode::ChangeText(const OUString &rText) {
+    maText = rText;
+    GetToken().aText = rText;
+    AdjustFontDesc();
+}
+
 void SmTextNode::Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth)
 {
     SmNode::Prepare(rFormat, rDocShell, nDepth);
@@ -2125,52 +1848,6 @@ void SmTextNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
     SmRect::operator = (SmRect(aTmpDev, &rFormat, maText, GetFont().GetBorderWidth()));
 }
 
-void SmTextNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    bool bQuoted=false;
-    if (GetToken().eType == TTEXT)
-    {
-        rText.append("\"");
-        bQuoted=true;
-    }
-    else
-    {
-        SmParser aParseTest;
-        auto pTable = aParseTest.Parse(GetToken().aText);
-        assert(pTable->GetType() == SmNodeType::Table);
-        bQuoted=true;
-        if (pTable->GetNumSubNodes() == 1)
-        {
-            SmNode *pResult = pTable->GetSubNode(0);
-            if ( (pResult->GetType() == SmNodeType::Line) &&
-                (pResult->GetNumSubNodes() == 1) )
-            {
-                pResult = pResult->GetSubNode(0);
-                if (pResult->GetType() == SmNodeType::Text)
-                    bQuoted=false;
-            }
-        }
-
-        if ((GetToken().eType == TIDENT) && (GetFontDesc() == FNT_FUNCTION))
-        {
-            //Search for existing functions and remove extraneous keyword
-            rText.append("func ");
-        }
-        else if (bQuoted)
-            rText.append("italic ");
-
-        if (bQuoted)
-            rText.append("\"");
-
-    }
-
-    rText.append(GetToken().aText);
-
-    if (bQuoted)
-        rText.append("\"");
-    rText.append(" ");
-}
-
 void SmTextNode::GetAccessibleText( OUStringBuffer &rText ) const
 {
     rText.append(maText);
@@ -2183,27 +1860,23 @@ void SmTextNode::AdjustFontDesc()
     else if(GetToken().eType == TFUNC)
         mnFontDesc = FNT_FUNCTION;
     else {
-        SmTokenType nTok;
         const SmTokenTableEntry *pEntry = SmParser::GetTokenTableEntry( maText );
         if (pEntry && pEntry->nGroup == TG::Function) {
-            nTok = pEntry->eType;
+            GetToken().eType = pEntry->eType;
             mnFontDesc = FNT_FUNCTION;
         } else {
             sal_Unicode firstChar = maText[0];
             if( ('0' <= firstChar && firstChar <= '9') || firstChar == '.' || firstChar == ',') {
                 mnFontDesc = FNT_NUMBER;
-                nTok = TNUMBER;
+                GetToken().eType = TNUMBER;
             } else if (maText.getLength() > 1) {
                 mnFontDesc = FNT_VARIABLE;
-                nTok = TIDENT;
+                GetToken().eType = TIDENT;
             } else {
                 mnFontDesc = FNT_VARIABLE;
-                nTok = TCHARACTER;
+                GetToken().eType = TCHARACTER;
             }
         }
-        SmToken tok = GetToken();
-        tok.eType = nTok;
-        SetToken(tok);
     }
 }
 
@@ -2242,26 +1915,6 @@ sal_Unicode SmTextNode::ConvertSymbolToUnicode(sal_Unicode nIn)
 
 /**************************************************************************/
 
-void SmMatrixNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    rText.append("matrix {");
-    for (size_t i = 0;  i < mnNumRows; ++i)
-    {
-        for (size_t j = 0;  j < mnNumCols; ++j)
-        {
-            SmNode *pNode = GetSubNode(i * mnNumCols + j);
-            if (pNode)
-                pNode->CreateTextFromNode(rText);
-            if (j != mnNumCols - 1U)
-                rText.append("# ");
-        }
-        if (i != mnNumRows - 1U)
-            rText.append("## ");
-    }
-    rText.stripEnd(' ');
-    rText.append("} ");
-}
-
 void SmMatrixNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
 {
     SmNode *pNode;
@@ -2360,14 +2013,6 @@ void SmMatrixNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
     }
 }
 
-
-void SmMatrixNode::SetRowCol(sal_uInt16 nMatrixRows, sal_uInt16 nMatrixCols)
-{
-    mnNumRows = nMatrixRows;
-    mnNumCols = nMatrixCols;
-}
-
-
 const SmNode * SmMatrixNode::GetLeftMost() const
 {
     return this;
@@ -2481,124 +2126,6 @@ void SmMathSymbolNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
     SmRect::operator = (SmRect(aTmpDev, &rFormat, rText, GetFont().GetBorderWidth()));
 }
 
-void SmMathSymbolNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    sal_Unicode cChar = GetToken().cMathChar;
-    if (cChar == MS_INT && GetScaleMode() == SmScaleMode::Height)
-        rText.append("intd ");
-    else
-        MathType::LookupChar(cChar, rText, 3);
-}
-
-void SmRectangleNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    switch (GetToken().eType)
-    {
-    case TUNDERLINE:
-        rText.append("underline ");
-        break;
-    case TOVERLINE:
-        rText.append("overline ");
-        break;
-    case TOVERSTRIKE:
-        rText.append("overstrike ");
-        break;
-    default:
-        break;
-    }
-}
-
-void SmAttributNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    SmNode *pNode;
-    assert(GetNumSubNodes() == 2);
-    rText.append("{");
-    sal_Unicode nLast=0;
-    if (nullptr != (pNode = Attribute()))
-    {
-        OUStringBuffer aStr;
-        pNode->CreateTextFromNode(aStr);
-        if (aStr.getLength() > 1)
-            rText.append(aStr);
-        else
-        {
-            nLast = aStr[0];
-            switch (nLast)
-            {
-            case MS_BAR: // MACRON
-                rText.append("overline ");
-                break;
-            case MS_DOT: // DOT ABOVE
-                rText.append("dot ");
-                break;
-            case 0x2dc: // SMALL TILDE
-                rText.append("widetilde ");
-                break;
-            case MS_DDOT: // DIAERESIS
-                rText.append("ddot ");
-                break;
-            case 0xE082:
-                break;
-            case 0xE09B:
-            case MS_DDDOT: // COMBINING THREE DOTS ABOVE
-                rText.append("dddot ");
-                break;
-            case MS_ACUTE: // ACUTE ACCENT
-            case MS_COMBACUTE: // COMBINING ACUTE ACCENT
-                rText.append("acute ");
-                break;
-            case MS_GRAVE: // GRAVE ACCENT
-            case MS_COMBGRAVE: // COMBINING GRAVE ACCENT
-                rText.append("grave ");
-                break;
-            case MS_CHECK: // CARON
-            case MS_COMBCHECK: // COMBINING CARON
-                rText.append("check ");
-                break;
-            case MS_BREVE: // BREVE
-            case MS_COMBBREVE: // COMBINING BREVE
-                rText.append("breve ");
-                break;
-            case MS_CIRCLE: // RING ABOVE
-            case MS_COMBCIRCLE: // COMBINING RING ABOVE
-                rText.append("circle ");
-                break;
-            case MS_RIGHTARROW: // RIGHTWARDS ARROW
-            case MS_VEC: // COMBINING RIGHT ARROW ABOVE
-                rText.append("vec ");
-                break;
-            case MS_HARPOON: // COMBINING RIGHT HARPOON ABOVE
-                rText.append("harpoon ");
-                break;
-            case MS_TILDE: // TILDE
-            case MS_COMBTILDE: // COMBINING TILDE
-                rText.append("tilde ");
-                break;
-            case MS_HAT: // CIRCUMFLEX ACCENT
-            case MS_COMBHAT: // COMBINING CIRCUMFLEX ACCENT
-                rText.append("hat ");
-                break;
-            case MS_COMBBAR: // COMBINING MACRON
-                rText.append("bar ");
-                break;
-            default:
-                rText.append(OUStringChar(nLast));
-                break;
-            }
-        }
-    }
-
-    if (nullptr != (pNode = Body()))
-        pNode->CreateTextFromNode(rText);
-
-    rText.stripEnd(' ');
-
-    if (nLast == 0xE082)
-        rText.append(" overbrace {}");
-
-    rText.append("} ");
-}
-
 /**************************************************************************/
 
 static bool lcl_IsFromGreekSymbolSet( const OUString &rTokenText )
@@ -2812,20 +2339,6 @@ void SmBlankNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat)
     SetWidth(nSpace);
 }
 
-void SmBlankNode::CreateTextFromNode(OUStringBuffer &rText)
-{
-    if (mnNum <= 0)
-        return;
-    sal_uInt16 nWide = mnNum / 4;
-    sal_uInt16 nNarrow = mnNum % 4;
-    for (sal_uInt16 i = 0; i < nWide; i++)
-        rText.append("~");
-    for (sal_uInt16 i = 0; i < nNarrow; i++)
-        rText.append("`");
-    rText.append(" ");
-}
-
-
 /**************************************************************************/
 //Implementation of all accept methods for SmVisitor
 
diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx
index a51d65fbbc94..e931c494b649 100644
--- a/starmath/source/parse.cxx
+++ b/starmath/source/parse.cxx
@@ -1681,8 +1681,8 @@ std::unique_ptr<SmNode> SmParser::DoOper()
 
         case TOPER :
             NextToken();
-
             OSL_ENSURE(m_aCurToken.eType == TSPECIAL, "Sm: wrong token");
+            m_aCurToken.eType = TOPER;
             pNode.reset(new SmGlyphSpecialNode(m_aCurToken));
             break;
 
@@ -2176,6 +2176,7 @@ std::unique_ptr<SmTextNode> SmParser::DoFunction()
     {
         case TFUNC:
             NextToken();    // skip "FUNC"-statement
+            m_aCurToken.eType = TFUNC;
             [[fallthrough]];
 
         case TSIN :
diff --git a/starmath/source/visitors.cxx b/starmath/source/visitors.cxx
index 5362551fe5f8..f663dcfb2d27 100644
--- a/starmath/source/visitors.cxx
+++ b/starmath/source/visitors.cxx
@@ -15,6 +15,7 @@
 #include "tmpdevice.hxx"
 #include <cursor.hxx>
 #include <cassert>
+#include "mathtype.hxx"
 
 // SmDefaultingVisitor
 
@@ -1918,6 +1919,7 @@ void SmSelectionDrawingVisitor::Visit( SmTextNode* pNode )
 SmNodeToTextVisitor::SmNodeToTextVisitor( SmNode* pNode, OUString &rText )
 {
     pNode->Accept( this );
+    maCmdText.stripEnd(' ');
     rText = maCmdText.makeStringAndClear();
 }
 

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list