summaryrefslogtreecommitdiffstats
path: root/starmath/inc/mathml/attribute.hxx
blob: 946e9f463e9c1cd5e65526960845b0c6bec87c98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

#pragma once

#include "def.hxx"

/* All possible data needed to do the job outside mathml limits */
// Ml prefix means it is part of mathml standard
// NMl means it is not part of mathml standard but needed info to work

/* Union for storing the mathml attribute value */
/*************************************************************************************************/

union SmMlAttributeValue {
    SmMlAttributeValue(){};

    struct SmMlAccent m_aAccent;
    struct SmMlDir m_aDir;
    struct SmMlDisplaystyle m_aDisplaystyle;
    struct SmMlFence m_aFence;
    struct SmMlForm m_aForm;
    struct SmMlHref m_aHref;
    struct SmMlLspace m_aLspace;
    struct SmMlMathbackground m_aMathbackground;
    struct SmMlMathcolor m_aMathcolor;
    struct SmMlMathsize m_aMathsize;
    struct SmMlMathvariant m_aMathvariant;
    struct SmMlMaxsize m_aMaxsize;
    struct SmMlMinsize m_aMinsize;
    struct SmMlMovablelimits m_aMovablelimits;
    struct SmMlRspace m_aRspace;
    struct SmMlSeparator m_aSeparator;
    struct SmMlStretchy m_aStretchy;
    struct SmMlSymmetric m_aSymmetric;
};

/* Class managing the attribute value */
/*************************************************************************************************/

class SmMlAttribute
{
private:
    SmMlAttributeValueType m_aSmMlAttributeValueType;
    SmMlAttributeValue m_aAttributeValue;
    bool m_bSet;

private:
    void clearPreviousAttributeValue();
    void setDefaultAttributeValue();
    void setAttributeValue(const SmMlAttribute* aMlAttribute);

public:
    SmMlAttribute()
        : m_aSmMlAttributeValueType(SmMlAttributeValueType::NMlEmpty)
        , m_bSet(false){};

    ~SmMlAttribute() { clearPreviousAttributeValue(); };

    SmMlAttribute(SmMlAttributeValueType)
        : m_aSmMlAttributeValueType(SmMlAttributeValueType::NMlEmpty)
        , m_bSet(false)
    {
        setDefaultAttributeValue();
    };

    SmMlAttribute(const SmMlAttribute& aMlAttribute)
        : m_aSmMlAttributeValueType(SmMlAttributeValueType::NMlEmpty)
        , m_bSet(aMlAttribute.isSet())
    {
        setAttributeValue(&aMlAttribute);
    }

    SmMlAttribute(const SmMlAttribute* aMlAttribute)
        : m_aSmMlAttributeValueType(SmMlAttributeValueType::NMlEmpty)
        , m_bSet(aMlAttribute->isSet())
    {
        setAttributeValue(aMlAttribute);
    }

public:
    /** Check if the attribute has been set
    */
    bool isSet() const { return m_bSet; }

    /** Set if the attribute has been set
    */
    void setSet(bool bSet) { m_bSet = bSet; }

public:
    /**
      * Returns the type of attribute we are dealing with.
      * Attribute Value Type
      */
    SmMlAttributeValueType getMlAttributeValueType() const { return m_aSmMlAttributeValueType; };

    /**
      * Checks if the attribute contains information.
      * Attribute Value Type
      */
    bool isNullAttribute() const
    {
        return m_aSmMlAttributeValueType == SmMlAttributeValueType::NMlEmpty;
    };

    /**
      * Compares the type of attribute with a given one.
      * Attribute Value Type
      */
    bool isMlAttributeValueType(SmMlAttributeValueType aAttributeValueType) const
    {
        return m_aSmMlAttributeValueType == aAttributeValueType;
    };

    /**
      * Set the type of attribute we are dealing with.
      * @param Attribute Value Type
      */
    void setMlAttributeValueType(SmMlAttributeValueType aAttributeValueType)
    {
        clearPreviousAttributeValue();
        m_aSmMlAttributeValueType = aAttributeValueType;
        setDefaultAttributeValue();
    }

    void setMlAttributeValue(const SmMlAttribute& aMlAttribute)
    {
        m_bSet = true;
        setAttributeValue(&aMlAttribute);
    }

    void setMlAttributeValue(const SmMlAttribute* aMlAttribute)
    {
        m_bSet = true;
        setAttributeValue(aMlAttribute);
    }

public:
    // Get values
    const struct SmMlAccent* getMlAccent() const;
    const struct SmMlDir* getMlDir() const;
    const struct SmMlDisplaystyle* getMlDisplaystyle() const;
    const struct SmMlFence* getMlFence() const;
    const struct SmMlForm* getMlForm() const;
    const struct SmMlHref* getMlHref() const;
    const struct SmMlLspace* getMlLspace() const;
    const struct SmMlMathbackground* getMlMathbackground() const;
    const struct SmMlMathcolor* getMlMathcolor() const;
    const struct SmMlMathsize* getMlMathsize() const;
    const struct SmMlMathvariant* getMlMathvariant() const;
    const struct SmMlMaxsize* getMlMaxsize() const;
    const struct SmMlMinsize* getMlMinsize() const;
    const struct SmMlMovablelimits* getMlMovablelimits() const;
    const struct SmMlRspace* getMlRspace() const;
    const struct SmMlSeparator* getMlSeparator() const;
    const struct SmMlStretchy* getMlStretchy() const;
    const struct SmMlSymmetric* getMlSymmetric() const;

    // Set values
    // Note that content is copied.
    void setMlAccent(const SmMlAccent* aAccent);
    void setMlDir(const SmMlDir* aDir);
    void setMlDisplaystyle(const SmMlDisplaystyle* aDisplaystyle);
    void setMlFence(const SmMlFence* aFence);
    void setMlForm(const SmMlForm* aForm);
    void setMlHref(const SmMlHref* aHref);
    void setMlLspace(const SmMlLspace* aLspace);
    void setMlMathbackground(const SmMlMathbackground* aMathbackground);
    void setMlMathcolor(const SmMlMathcolor* aMathcolor);
    void setMlMathsize(const SmMlMathsize* aMathsize);
    void setMlMathvariant(const SmMlMathvariant* aMathvariant);
    void setMlMaxsize(const SmMlMaxsize* aMaxsize);
    void setMlMinsize(const SmMlMinsize* aMinSize);
    void setMlMovablelimits(const SmMlMovablelimits* aMovablelimits);
    void setMlRspace(const SmMlRspace* aRspace);
    void setMlSeparator(const SmMlSeparator* aSeparator);
    void setMlStretchy(const SmMlStretchy* aStretchy);
    void setMlSymmetric(const SmMlSymmetric* aSymmetric);
};

/* element's attributes */
/*************************************************************************************************/

namespace starmathdatabase
{
extern SmMlAttributePos MlAttributeListEmpty[1];
extern SmMlAttributePos MlAttributeListMath[1];
extern SmMlAttributePos MlAttributeListMi[7];
extern SmMlAttributePos MlAttributeListMerror[4];
extern SmMlAttributePos MlAttributeListMn[7];
extern SmMlAttributePos MlAttributeListMo[18];
extern SmMlAttributePos MlAttributeListMrow[4];
extern SmMlAttributePos MlAttributeListMtext[7];
extern SmMlAttributePos MlAttributeListMstyle[18];
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */