xref: /AOO42X/main/xmloff/source/forms/formattributes.hxx (revision e11ede73ff70e357e1892971fc48a97145939dd0)
1ecfe53c5SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3ecfe53c5SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4ecfe53c5SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5ecfe53c5SAndrew Rist  * distributed with this work for additional information
6ecfe53c5SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7ecfe53c5SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8ecfe53c5SAndrew Rist  * "License"); you may not use this file except in compliance
9ecfe53c5SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11ecfe53c5SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13ecfe53c5SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14ecfe53c5SAndrew Rist  * software distributed under the License is distributed on an
15ecfe53c5SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16ecfe53c5SAndrew Rist  * KIND, either express or implied.  See the License for the
17ecfe53c5SAndrew Rist  * specific language governing permissions and limitations
18ecfe53c5SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20ecfe53c5SAndrew Rist  *************************************************************/
21ecfe53c5SAndrew Rist 
22ecfe53c5SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef _XMLOFF_FORMATTRIBUTES_HXX_
25cdf0e10cSrcweir #define _XMLOFF_FORMATTRIBUTES_HXX_
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
28cdf0e10cSrcweir #include <sal/types.h>
29cdf0e10cSrcweir #include <vos/refernce.hxx>
30cdf0e10cSrcweir #include <comphelper/stl_types.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir class SvXMLExport;
33cdf0e10cSrcweir struct SvXMLEnumMapEntry;
34cdf0e10cSrcweir 
35cdf0e10cSrcweir //.........................................................................
36cdf0e10cSrcweir namespace xmloff
37cdf0e10cSrcweir {
38cdf0e10cSrcweir //.........................................................................
39cdf0e10cSrcweir 
40cdf0e10cSrcweir     // flags for common control attributes
41cdf0e10cSrcweir     #define CCA_NAME                    0x00000001
42cdf0e10cSrcweir     #define CCA_SERVICE_NAME            0x00000002
43cdf0e10cSrcweir     #define CCA_BUTTON_TYPE             0x00000004
44cdf0e10cSrcweir     #define CCA_CONTROL_ID              0x00000008
45cdf0e10cSrcweir     #define CCA_CURRENT_SELECTED        0x00000010
46cdf0e10cSrcweir     #define CCA_CURRENT_VALUE           0x00000020
47cdf0e10cSrcweir     #define CCA_DISABLED                0x00000040
48cdf0e10cSrcweir     #define CCA_DROPDOWN                0x00000080
49cdf0e10cSrcweir     #define CCA_FOR                     0x00000100
50cdf0e10cSrcweir     #define CCA_IMAGE_DATA              0x00000200
51cdf0e10cSrcweir     #define CCA_LABEL                   0x00000400
52cdf0e10cSrcweir     #define CCA_MAX_LENGTH              0x00000800
53cdf0e10cSrcweir     #define CCA_PRINTABLE               0x00001000
54cdf0e10cSrcweir     #define CCA_READONLY                0x00002000
55cdf0e10cSrcweir     #define CCA_SELECTED                0x00004000
56cdf0e10cSrcweir     #define CCA_SIZE                    0x00008000
57cdf0e10cSrcweir     #define CCA_TAB_INDEX               0x00010000
58cdf0e10cSrcweir     #define CCA_TARGET_FRAME            0x00020000
59cdf0e10cSrcweir     #define CCA_TARGET_LOCATION         0x00040000
60cdf0e10cSrcweir     #define CCA_TAB_STOP                0x00080000
61cdf0e10cSrcweir     #define CCA_TITLE                   0x00100000
62cdf0e10cSrcweir     #define CCA_VALUE                   0x00200000
63cdf0e10cSrcweir     #define CCA_ORIENTATION             0x00400000
64cdf0e10cSrcweir     #define CCA_VISUAL_EFFECT           0x00800000
65cdf0e10cSrcweir     #define CCA_ENABLEVISIBLE                 0x01000000
66cdf0e10cSrcweir 
67df6a13dbSJohn Bampton     // flags for database control attributes
68cdf0e10cSrcweir     #define DA_BOUND_COLUMN             0x00000001
69cdf0e10cSrcweir     #define DA_CONVERT_EMPTY            0x00000002
70cdf0e10cSrcweir     #define DA_DATA_FIELD               0x00000004
71cdf0e10cSrcweir     #define DA_LIST_SOURCE              0x00000008
72cdf0e10cSrcweir     #define DA_LIST_SOURCE_TYPE         0x00000010
73cdf0e10cSrcweir     #define DA_INPUT_REQUIRED           0x00000020
74cdf0e10cSrcweir 
75cdf0e10cSrcweir     // flags for binding related control attributes
76cdf0e10cSrcweir     #define BA_LINKED_CELL              0x00000001
77cdf0e10cSrcweir     #define BA_LIST_LINKING_TYPE        0x00000002
78cdf0e10cSrcweir     #define BA_LIST_CELL_RANGE          0x00000004
79cdf0e10cSrcweir     #define BA_XFORMS_BIND              0x00000008
80cdf0e10cSrcweir     #define BA_XFORMS_LISTBIND          0x00000010
81cdf0e10cSrcweir     #define BA_XFORMS_SUBMISSION        0x00000020
82cdf0e10cSrcweir 
83cdf0e10cSrcweir     // flags for event attributes
84cdf0e10cSrcweir     #define EA_CONTROL_EVENTS           0x00000001
85cdf0e10cSrcweir     #define EA_ON_CHANGE                0x00000002
86cdf0e10cSrcweir     #define EA_ON_CLICK                 0x00000004
87cdf0e10cSrcweir     #define EA_ON_DBLCLICK              0x00000008
88cdf0e10cSrcweir     #define EA_ON_SELECT                0x00000010
89cdf0e10cSrcweir 
90cdf0e10cSrcweir     /// attributes in the xml tag representing a form
91cdf0e10cSrcweir     enum FormAttributes
92cdf0e10cSrcweir     {
93cdf0e10cSrcweir         faName,
94cdf0e10cSrcweir         faServiceName,
95cdf0e10cSrcweir         faAction,
96cdf0e10cSrcweir         faEnctype,
97cdf0e10cSrcweir         faMethod,
98cdf0e10cSrcweir         faTargetFrame,
99cdf0e10cSrcweir         faAllowDeletes,
100cdf0e10cSrcweir         faAllowInserts,
101cdf0e10cSrcweir         faAllowUpdates,
102cdf0e10cSrcweir         faApplyFilter,
103cdf0e10cSrcweir         faCommand,
104cdf0e10cSrcweir         faCommandType,
105cdf0e10cSrcweir         faEscapeProcessing,
106cdf0e10cSrcweir         faDatasource,
107cdf0e10cSrcweir         faConnectionResource,
108cdf0e10cSrcweir         faDetailFiels,
109cdf0e10cSrcweir         faFilter,
110cdf0e10cSrcweir         faIgnoreResult,
111cdf0e10cSrcweir         faMasterFields,
112cdf0e10cSrcweir         faNavigationMode,
113cdf0e10cSrcweir         faOrder,
114cdf0e10cSrcweir         faTabbingCycle
115cdf0e10cSrcweir     };
116cdf0e10cSrcweir 
117cdf0e10cSrcweir     // any other attributes, which are special to some control types
118cdf0e10cSrcweir     #define SCA_ECHO_CHAR               0x00000001
119cdf0e10cSrcweir     #define SCA_MAX_VALUE               0x00000002
120cdf0e10cSrcweir     #define SCA_MIN_VALUE               0x00000004
121cdf0e10cSrcweir     #define SCA_VALIDATION              0x00000008
122cdf0e10cSrcweir     #define SCA_MULTI_LINE              0x00000020
123cdf0e10cSrcweir     #define SCA_AUTOMATIC_COMPLETION    0x00000080
124cdf0e10cSrcweir     #define SCA_MULTIPLE                0x00000100
125cdf0e10cSrcweir     #define SCA_DEFAULT_BUTTON          0x00000200
126cdf0e10cSrcweir     #define SCA_CURRENT_STATE           0x00000400
127cdf0e10cSrcweir     #define SCA_IS_TRISTATE             0x00000800
128cdf0e10cSrcweir     #define SCA_STATE                   0x00001000
129cdf0e10cSrcweir     #define SCA_COLUMN_STYLE_NAME       0x00002000
130cdf0e10cSrcweir     #define SCA_STEP_SIZE               0x00004000
131cdf0e10cSrcweir     #define SCA_PAGE_STEP_SIZE          0x00008000
132cdf0e10cSrcweir     #define SCA_REPEAT_DELAY            0x00010000
133cdf0e10cSrcweir     #define SCA_TOGGLE                  0x00020000
134cdf0e10cSrcweir     #define SCA_FOCUS_ON_CLICK          0x00040000
135cdf0e10cSrcweir     #define SCA_IMAGE_POSITION          0x00080000
136cdf0e10cSrcweir 
137cdf0e10cSrcweir     // attributes of the office:forms element
138cdf0e10cSrcweir     enum OfficeFormsAttributes
139cdf0e10cSrcweir     {
140cdf0e10cSrcweir         ofaAutomaticFocus,
141cdf0e10cSrcweir         ofaApplyDesignMode
142cdf0e10cSrcweir     };
143cdf0e10cSrcweir 
144cdf0e10cSrcweir     //=====================================================================
145cdf0e10cSrcweir     //= OAttributeMetaData
146cdf0e10cSrcweir     //=====================================================================
147cdf0e10cSrcweir     /** allows the translation of attribute ids into strings.
148cdf0e10cSrcweir 
149cdf0e10cSrcweir         <p>This class does not allow to connect xml attributes to property names or
150cdf0e10cSrcweir         something like that, it only deals with the xml side</p>
151cdf0e10cSrcweir     */
152cdf0e10cSrcweir     class OAttributeMetaData
153cdf0e10cSrcweir     {
154cdf0e10cSrcweir     public:
155cdf0e10cSrcweir         /** calculates the xml attribute representation of a common control attribute.
156cdf0e10cSrcweir             @param _nId
157cdf0e10cSrcweir                 the id of the attribute. Has to be one of the CCA_* constants.
158cdf0e10cSrcweir         */
159cdf0e10cSrcweir         static const sal_Char* getCommonControlAttributeName(sal_Int32 _nId);
160cdf0e10cSrcweir 
161cdf0e10cSrcweir         /** calculates the xml namespace key to use for a common control attribute
162cdf0e10cSrcweir             @param _nId
163cdf0e10cSrcweir                 the id of the attribute. Has to be one of the CCA_* constants.
164cdf0e10cSrcweir         */
165cdf0e10cSrcweir         static sal_uInt16 getCommonControlAttributeNamespace(sal_Int32 _nId);
166cdf0e10cSrcweir 
167cdf0e10cSrcweir         /** retrieves the name of an attribute of a form xml representation
168cdf0e10cSrcweir             @param  _eAttrib
169cdf0e10cSrcweir                 enum value specifying the attribute
170cdf0e10cSrcweir         */
171cdf0e10cSrcweir         static const sal_Char* getFormAttributeName(FormAttributes _eAttrib);
172cdf0e10cSrcweir 
173cdf0e10cSrcweir         /** calculates the xml namespace key to use for a attribute of a form xml representation
174cdf0e10cSrcweir             @param  _eAttrib
175cdf0e10cSrcweir                 enum value specifying the attribute
176cdf0e10cSrcweir         */
177cdf0e10cSrcweir         static sal_uInt16 getFormAttributeNamespace(FormAttributes _eAttrib);
178cdf0e10cSrcweir 
179cdf0e10cSrcweir         /** calculates the xml attribute representation of a database attribute.
180cdf0e10cSrcweir             @param _nId
181cdf0e10cSrcweir                 the id of the attribute. Has to be one of the DA_* constants.
182cdf0e10cSrcweir         */
183cdf0e10cSrcweir         static const sal_Char* getDatabaseAttributeName(sal_Int32 _nId);
184cdf0e10cSrcweir 
185cdf0e10cSrcweir         /** calculates the xml namespace key to use for a database attribute.
186cdf0e10cSrcweir             @param _nId
187cdf0e10cSrcweir                 the id of the attribute. Has to be one of the DA_* constants.
188cdf0e10cSrcweir         */
189cdf0e10cSrcweir         static sal_uInt16 getDatabaseAttributeNamespace(sal_Int32 _nId);
190cdf0e10cSrcweir 
191cdf0e10cSrcweir         /** calculates the xml attribute representation of a special attribute.
192cdf0e10cSrcweir             @param _nId
193cdf0e10cSrcweir                 the id of the attribute. Has to be one of the SCA_* constants.
194cdf0e10cSrcweir         */
195cdf0e10cSrcweir         static const sal_Char* getSpecialAttributeName(sal_Int32 _nId);
196cdf0e10cSrcweir 
197cdf0e10cSrcweir         /** calculates the xml attribute representation of a binding attribute.
198cdf0e10cSrcweir             @param _nId
199cdf0e10cSrcweir                 the id of the attribute. Has to be one of the BA_* constants.
200cdf0e10cSrcweir         */
201cdf0e10cSrcweir         static const sal_Char* getBindingAttributeName(sal_Int32 _nId);
202cdf0e10cSrcweir 
203cdf0e10cSrcweir         /** calculates the xml namespace key to use for a binding attribute.
204cdf0e10cSrcweir             @param _nId
205cdf0e10cSrcweir                 the id of the attribute. Has to be one of the BA_* constants.
206cdf0e10cSrcweir         */
207cdf0e10cSrcweir         static sal_uInt16 getBindingAttributeNamespace(sal_Int32 _nId);
208cdf0e10cSrcweir 
209cdf0e10cSrcweir         /** calculates the xml namespace key to use for a special attribute.
210cdf0e10cSrcweir             @param _nId
211cdf0e10cSrcweir                 the id of the attribute. Has to be one of the SCA_* constants.
212cdf0e10cSrcweir         */
213cdf0e10cSrcweir         static sal_uInt16 getSpecialAttributeNamespace(sal_Int32 _nId);
214cdf0e10cSrcweir 
215cdf0e10cSrcweir         /** calculates the xml attribute representation of a attribute of the office:forms element
216cdf0e10cSrcweir             @param _nId
217cdf0e10cSrcweir                 the id of the attribute
218cdf0e10cSrcweir         */
219cdf0e10cSrcweir         static const sal_Char* getOfficeFormsAttributeName(OfficeFormsAttributes _eAttrib);
220cdf0e10cSrcweir 
221cdf0e10cSrcweir         /** calculates the xml namedspace key of a attribute of the office:forms element
222cdf0e10cSrcweir             @param _nId
223cdf0e10cSrcweir                 the id of the attribute
224cdf0e10cSrcweir         */
225cdf0e10cSrcweir         static sal_uInt16 getOfficeFormsAttributeNamespace(OfficeFormsAttributes _eAttrib);
226cdf0e10cSrcweir     };
227cdf0e10cSrcweir 
228cdf0e10cSrcweir     //=====================================================================
229cdf0e10cSrcweir     //= OAttribute2Property
230cdf0e10cSrcweir     //=====================================================================
231cdf0e10cSrcweir     /** some kind of opposite to the OAttributeMetaData class. Able to translate
232cdf0e10cSrcweir         attributes into property names/types
233cdf0e10cSrcweir 
234cdf0e10cSrcweir         <p>The construction of this class is rather expensive (or at least it's initialization from outside),
235cdf0e10cSrcweir         so it should be shared</p>
236cdf0e10cSrcweir     */
237cdf0e10cSrcweir     class OAttribute2Property
238cdf0e10cSrcweir     {
239cdf0e10cSrcweir     public:
240cdf0e10cSrcweir         // TODO: maybe the following struct should be used for exports, too. In this case we would not need to
241cdf0e10cSrcweir         // store it's instances in a map, but in a vector for faster access.
242cdf0e10cSrcweir         struct AttributeAssignment
243cdf0e10cSrcweir         {
244cdf0e10cSrcweir             ::rtl::OUString                 sAttributeName;         // the attribute name
245cdf0e10cSrcweir             ::rtl::OUString                 sPropertyName;          // the property name
246cdf0e10cSrcweir             ::com::sun::star::uno::Type     aPropertyType;          // the property type
247cdf0e10cSrcweir             ::rtl::OUString                 sAttributeDefault;      // the default if the attribute is not present
248cdf0e10cSrcweir 
249cdf0e10cSrcweir             // entries which are special to some value types
250*e11ede73SJohn Bampton             const SvXMLEnumMapEntry*        pEnumMap;               // the enum map, if applicable
251*e11ede73SJohn Bampton             sal_Bool                        bInverseSemantics;      // for booleans: attribute and property value have the same or an inverse semantics?
252cdf0e10cSrcweir 
AttributeAssignmentxmloff::OAttribute2Property::AttributeAssignment253cdf0e10cSrcweir             AttributeAssignment() : pEnumMap(NULL), bInverseSemantics(sal_False) { }
254cdf0e10cSrcweir         };
255cdf0e10cSrcweir 
256cdf0e10cSrcweir     protected:
257cdf0e10cSrcweir         DECLARE_STL_USTRINGACCESS_MAP( AttributeAssignment, AttributeAssignments );
258cdf0e10cSrcweir         AttributeAssignments        m_aKnownProperties;
259cdf0e10cSrcweir 
260cdf0e10cSrcweir     public:
261cdf0e10cSrcweir         OAttribute2Property();
262cdf0e10cSrcweir         virtual ~OAttribute2Property();
263cdf0e10cSrcweir 
264cdf0e10cSrcweir         /** return the AttributeAssignment which corresponds to the given attribute
265cdf0e10cSrcweir 
266cdf0e10cSrcweir             @param _rAttribName
267b71c9233SJohn Bampton                 the name of the attribute
268cdf0e10cSrcweir             @return
269cdf0e10cSrcweir                 a pointer to the <type>AttributeAssignment</type> structure as requested, NULL if the attribute
270cdf0e10cSrcweir                 does not represent a property.
271cdf0e10cSrcweir         */
272cdf0e10cSrcweir         const AttributeAssignment* getAttributeTranslation(
273cdf0e10cSrcweir             const ::rtl::OUString& _rAttribName);
274cdf0e10cSrcweir 
275cdf0e10cSrcweir         /** add a attribute assignment referring to a string property to the map
276cdf0e10cSrcweir             @param _pAttributeName
277b71c9233SJohn Bampton                 the name of the attribute
278cdf0e10cSrcweir             @param _rPropertyName
279cdf0e10cSrcweir                 the name of the property assigned to the attribute
280cdf0e10cSrcweir             @param _pAttributeDefault
281cdf0e10cSrcweir                 the default value for the attribute, if any. May be NULL, in this case the default is assumed to be
282cdf0e10cSrcweir                 an empty string.
283cdf0e10cSrcweir         */
284cdf0e10cSrcweir         void    addStringProperty(
285cdf0e10cSrcweir             const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
286cdf0e10cSrcweir             const sal_Char* _pAttributeDefault = NULL);
287cdf0e10cSrcweir 
288cdf0e10cSrcweir         /** add a attribute assignment referring to a boolean property to the map
289cdf0e10cSrcweir 
290cdf0e10cSrcweir             @param _pAttributeName
291b71c9233SJohn Bampton                 the name of the attribute
292cdf0e10cSrcweir             @param _rPropertyName
293cdf0e10cSrcweir                 the name of the property assigned to the attribute
294cdf0e10cSrcweir             @param _bAttributeDefault
295cdf0e10cSrcweir                 the default value for the attribute.
296cdf0e10cSrcweir             @param _bInverseSemantics
297cdf0e10cSrcweir                 if <TRUE/>, a attribute value of <TRUE/> means a property value of <FALSE/> and vice verse.<br/>
298cdf0e10cSrcweir                 if <FALSE/>, the attribute value is used as property value directly
299cdf0e10cSrcweir         */
300cdf0e10cSrcweir         void    addBooleanProperty(
301cdf0e10cSrcweir             const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
302cdf0e10cSrcweir             const sal_Bool _bAttributeDefault, const sal_Bool _bInverseSemantics = sal_False);
303cdf0e10cSrcweir 
304cdf0e10cSrcweir         /** add a attribute assignment referring to an int16 property to the map
305cdf0e10cSrcweir 
306cdf0e10cSrcweir             @param _pAttributeName
307b71c9233SJohn Bampton                 the name of the attribute
308cdf0e10cSrcweir             @param _rPropertyName
309cdf0e10cSrcweir                 the name of the property assigned to the attribute
310cdf0e10cSrcweir             @param _nAttributeDefault
311cdf0e10cSrcweir                 the default value for the attribute.
312cdf0e10cSrcweir         */
313cdf0e10cSrcweir         void    addInt16Property(
314cdf0e10cSrcweir             const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
315cdf0e10cSrcweir             const sal_Int16 _nAttributeDefault);
316cdf0e10cSrcweir 
317cdf0e10cSrcweir         /** add a attribute assignment referring to an int32 property to the map
318cdf0e10cSrcweir 
319cdf0e10cSrcweir             @param _pAttributeName
320b71c9233SJohn Bampton                 the name of the attribute
321cdf0e10cSrcweir             @param _rPropertyName
322cdf0e10cSrcweir                 the name of the property assigned to the attribute
323cdf0e10cSrcweir             @param _nAttributeDefault
324cdf0e10cSrcweir                 the default value for the attribute.
325cdf0e10cSrcweir         */
326cdf0e10cSrcweir         void    addInt32Property(
327cdf0e10cSrcweir             const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
328cdf0e10cSrcweir             const sal_Int32 _nAttributeDefault );
329cdf0e10cSrcweir 
330cdf0e10cSrcweir         /** add a attribute assignment referring to an enum property to the map
331cdf0e10cSrcweir 
332cdf0e10cSrcweir             @param _pAttributeName
333b71c9233SJohn Bampton                 the name of the attribute
334cdf0e10cSrcweir             @param _rPropertyName
335cdf0e10cSrcweir                 the name of the property assigned to the attribute
336cdf0e10cSrcweir             @param _nAttributeDefault
337cdf0e10cSrcweir                 the default value for the attribute, as (32bit) integer
338cdf0e10cSrcweir             @param _pValueMap
339cdf0e10cSrcweir                 the map to translate strings into enum values
340cdf0e10cSrcweir             @param _pType
341cdf0e10cSrcweir                 the type of the property. May be NULL, in this case 32bit integer is assumed.
342cdf0e10cSrcweir         */
343cdf0e10cSrcweir         void    addEnumProperty(
344cdf0e10cSrcweir             const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
345cdf0e10cSrcweir             const sal_uInt16 _nAttributeDefault, const SvXMLEnumMapEntry* _pValueMap,
346cdf0e10cSrcweir             const ::com::sun::star::uno::Type* _pType = NULL);
347cdf0e10cSrcweir 
348cdf0e10cSrcweir     protected:
349cdf0e10cSrcweir         /// some common code for the various add*Property methods
350cdf0e10cSrcweir         AttributeAssignment& implAdd(
351cdf0e10cSrcweir             const sal_Char* _pAttributeName, const ::rtl::OUString& _rPropertyName,
352cdf0e10cSrcweir             const ::com::sun::star::uno::Type& _rType, const ::rtl::OUString& _rDefaultString);
353cdf0e10cSrcweir     };
354cdf0e10cSrcweir //.........................................................................
355cdf0e10cSrcweir }   // namespace xmloff
356cdf0e10cSrcweir //.........................................................................
357cdf0e10cSrcweir 
358cdf0e10cSrcweir #endif // _XMLOFF_FORMATTRIBUTES_HXX_
359