1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
12 #include "attribute.hxx"
15 #include <editeng/editdata.hxx>
17 class SmMlElement final
: public SmRect
23 : m_aElementType(SmMlElementType::NMlEmpty
)
25 , m_aESelection(0, 0, 0, 0)
27 , m_aAttributePosList(0)
29 , m_aParentElement(nullptr)
32 SmImplAttributeType();
37 SmMlElement(SmMlElementType aElementType
)
38 : m_aElementType(aElementType
)
40 , m_aESelection(0, 0, 0, 0)
42 , m_aParentElement(nullptr)
45 SmImplAttributeType();
49 SmMlElement(const SmMlElement
& aElement
)
50 : SmRect(static_cast<SmRect
>(aElement
))
51 , m_aElementType(aElement
.getMlElementType())
52 , m_aText(aElement
.getText())
53 , m_aESelection(aElement
.getESelectionReference())
55 , m_aParentElement(nullptr)
56 , m_nSubElementId(aElement
.getSubElementId())
58 m_aAttributePosList
= std::vector
<SmMlAttributePos
>(aElement
.getAttributeCount());
59 for (size_t i
= 0; i
< aElement
.getAttributeCount(); ++i
)
60 setAttributeForce(i
, aElement
.getAttributePointer(i
));
65 SmMlElementType m_aElementType
;
70 // Location in source code
71 ESelection m_aESelection
;
74 std::vector
<SmMlAttribute
> m_aAttributeList
;
76 // Attribute position list
77 std::vector
<SmMlAttributePos
> m_aAttributePosList
;
80 std::vector
<SmMlElement
*> m_aSubElements
;
83 SmMlElement
* m_aParentElement
;
85 // Child id, so it is possible to iterate
86 size_t m_nSubElementId
;
89 void SmImplAttributeType();
91 public: // Element type
93 * Returns the mathml element type
94 * @return mathml element type
96 SmMlElementType
getMlElementType() const { return m_aElementType
; };
99 * Check if the mathml element is of a given type
100 * @param aElementType
101 * @return is mathml element type
103 bool isMlElementType(SmMlElementType aElementType
) const
105 return m_aElementType
== aElementType
;
108 public: // location in the source
110 * Returns the location in the source code of the node type
113 const ESelection
& getESelection() const { return m_aESelection
; };
116 * Returns the location in the source code of the node type
119 const ESelection
& getESelectionReference() const { return m_aESelection
; };
122 * Sets the location in the source code of the node type
125 void setESelection(ESelection aESelection
) { m_aESelection
= aESelection
; };
128 * Gets the line in the text where the node is located.
129 * It is used to do the visual <-> text correspondence.
132 sal_Int32
GetSourceCodeRow() const { return m_aESelection
.nStartPara
; }
135 * Gets the column of the line in the text where the node is located.
136 * It is used to do the visual <-> text correspondence.
139 sal_Int32
GetSourceCodeColumn() const { return m_aESelection
.nStartPos
; }
141 public: // attributes
143 * Returns the amount of available attributes
144 * @return attribute count
146 size_t getAttributeCount() const { return m_aAttributeList
.size(); };
149 * Gets a given attribute.
150 * If no available returns empty attribute.
151 * @param nAttributePos
152 * @return given attribute.
154 SmMlAttribute
getAttribute(size_t nAttributePos
) const
156 return nAttributePos
< m_aAttributeList
.size() ? m_aAttributeList
[nAttributePos
]
161 * Gets a given attribute.
162 * If no available returns empty attribute.
163 * @param nAttributePos
164 * @return given attribute.
166 SmMlAttribute
getAttribute(SmMlAttributeValueType aAttributeType
) const;
169 * Sets a given attribute.
170 * If no available does nothing.
171 * @param nAttributePos
172 * @return given attribute.
174 void setAttribute(const SmMlAttribute
* aAttribute
);
177 * Set's a given attribute.
178 * If no available does nothing.
179 * @param nAttributePos
180 * @return given attribute.
182 void setAttribute(const SmMlAttribute
& aAttribute
) { setAttribute(&aAttribute
); }
184 /** Checks if an attribute has been manually set
185 * @param aElementType
187 bool isAttributeSet(SmMlAttributeValueType aAttributeType
) const;
189 private: // attributes
191 * Gets a given attribute.
192 * If no available returns empty attribute.
193 * @param nAttributePos
194 * @return given attribute.
196 const SmMlAttribute
* getAttributePointer(size_t nAttributePos
) const
198 return nAttributePos
< m_aAttributeList
.size() ? &m_aAttributeList
[nAttributePos
] : nullptr;
202 * Sets a given attribute.
203 * If no available undefined behaviour.
204 * @param nAttributePos
206 * @return given attribute.
208 void setAttributeForce(size_t nAttributePos
, const SmMlAttribute
* aAttribute
)
210 m_aAttributeList
[nAttributePos
].setMlAttributeValue(aAttribute
);
213 public: // sub elements
215 * Returns the sub elements count
216 * @return sub elements count
218 size_t getSubElementsCount() const { return m_aSubElements
.size(); };
221 * Returns a given sub element
223 * @return sub elements
225 SmMlElement
* getSubElement(size_t nPos
)
227 return nPos
< m_aSubElements
.size() ? m_aSubElements
[nPos
] : nullptr;
231 * Returns a given sub element
233 * @return sub elements
235 const SmMlElement
* getSubElement(size_t nPos
) const
237 return nPos
< m_aSubElements
.size() ? m_aSubElements
[nPos
] : nullptr;
241 * Sets a given sub element
245 void setSubElement(size_t nPos
, SmMlElement
* aElement
);
250 size_t getSubElementId() const { return m_nSubElementId
; }
254 * @param nSubElementId
256 void setSubElementId(size_t nSubElementId
) { m_nSubElementId
= nSubElementId
; }
258 public: // parent elements
260 * Returns the parent element
261 * @return parent element
263 SmMlElement
* getParentElement() { return m_aParentElement
; };
266 * Returns the parent element
267 * @return parent element
269 const SmMlElement
* getParentElement() const { return m_aParentElement
; };
272 * Sets the parent element
273 * No allocation / free is done.
274 * @param aParentElement
276 void setParentElement(SmMlElement
* aParentElement
) { m_aParentElement
= aParentElement
; };
278 public: // text elements
280 * Returns the element text
282 const OUString
& getText() const { return m_aText
; };
285 * Returns the element text
287 void setText(OUString aText
) { m_aText
= aText
; };
290 namespace starmathdatabase
293 * Generates an attribute vector of default values from an attribute position list.
294 * @param aAttributePosList
295 * @return attribute vector
297 std::vector
<SmMlAttribute
> makeMlAttributeList(std::vector
<SmMlAttributePos
> aAttributePosList
);
300 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */