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