xref: /trunk/main/xmloff/source/text/txtflde.cxx (revision 2df387e6)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 
27 /** @#file
28  *
29  *  export of all text fields
30  */
31 #include "txtflde.hxx"
32 #include <xmloff/xmlexp.hxx>
33 #include <xmloff/xmlnumfe.hxx>
34 #include <xmloff/xmltoken.hxx>
35 #include <xmloff/xmlement.hxx>
36 #include <xmloff/xmluconv.hxx>
37 #include <xmloff/xmlnume.hxx>
38 #include "xmloff/numehelp.hxx"
39 
40 #include <xmloff/families.hxx>
41 #include <xmloff/XMLEventExport.hxx>
42 #include "XMLTextCharStyleNamesElementExport.hxx"
43 #include <xmloff/nmspmap.hxx>
44 #include <com/sun/star/util/DateTime.hpp>
45 #include <com/sun/star/util/Date.hpp>
46 #include <com/sun/star/lang/XServiceInfo.hpp>
47 #include <com/sun/star/text/UserDataPart.hpp>
48 #include <com/sun/star/text/PageNumberType.hpp>
49 #include <com/sun/star/style/NumberingType.hpp>
50 #include <com/sun/star/text/ReferenceFieldPart.hpp>
51 #include <com/sun/star/text/ReferenceFieldSource.hpp>
52 #include <com/sun/star/beans/XPropertySet.hpp>
53 #include <com/sun/star/beans/XPropertyState.hpp>
54 #include <com/sun/star/text/XTextField.hpp>
55 #include <com/sun/star/text/XDependentTextField.hpp>
56 #include <com/sun/star/text/XTextFieldsSupplier.hpp>
57 
58 #include <com/sun/star/text/SetVariableType.hpp>
59 #include <com/sun/star/text/PlaceholderType.hpp>
60 #include <com/sun/star/text/FilenameDisplayFormat.hpp>
61 #include <com/sun/star/text/ChapterFormat.hpp>
62 #include <com/sun/star/text/TemplateDisplayFormat.hpp>
63 #include <com/sun/star/frame/XModel.hpp>
64 #include <com/sun/star/container/XNameReplace.hpp>
65 #include <com/sun/star/uno/Sequence.h>
66 #include <com/sun/star/util/NumberFormat.hpp>
67 #include <com/sun/star/text/BibliographyDataType.hpp>
68 #include <com/sun/star/sdb/CommandType.hpp>
69 #include <com/sun/star/rdf/XMetadatable.hpp>
70 #include <rtl/ustrbuf.hxx>
71 #include <tools/debug.hxx>
72 #include <rtl/math.hxx>
73 
74 #include <vector>
75 
76 using ::rtl::OUString;
77 using ::rtl::OUStringBuffer;
78 
79 using namespace ::std;
80 using namespace ::com::sun::star;
81 using namespace ::com::sun::star::uno;
82 using namespace ::com::sun::star::text;
83 using namespace ::com::sun::star::lang;
84 using namespace ::com::sun::star::beans;
85 using namespace ::com::sun::star::util;
86 using namespace ::com::sun::star::style;
87 using namespace ::com::sun::star::document;
88 using namespace ::com::sun::star::container;
89 using namespace ::xmloff::token;
90 
91 
92 static sal_Char __READONLY_DATA FIELD_SERVICE_SENDER[] = "ExtendedUser";
93 static sal_Char __READONLY_DATA FIELD_SERVICE_AUTHOR[] = "Author";
94 static sal_Char __READONLY_DATA FIELD_SERVICE_JUMPEDIT[] = "JumpEdit";
95 static sal_Char __READONLY_DATA FIELD_SERVICE_GETEXP[] = "GetExpression";
96 static sal_Char __READONLY_DATA FIELD_SERVICE_SETEXP[] = "SetExpression";
97 static sal_Char __READONLY_DATA FIELD_SERVICE_USER[] = "User";
98 static sal_Char __READONLY_DATA FIELD_SERVICE_INPUT[] = "Input";
99 static sal_Char __READONLY_DATA FIELD_SERVICE_USERINPUT[] = "InputUser";
100 static sal_Char __READONLY_DATA FIELD_SERVICE_DATETIME[] = "DateTime";
101 static sal_Char __READONLY_DATA FIELD_SERVICE_PAGENUMBER[] = "PageNumber";
102 static sal_Char __READONLY_DATA FIELD_SERVICE_DB_NEXT[] = "DatabaseNextSet";
103 static sal_Char __READONLY_DATA FIELD_SERVICE_DB_SELECT[] = "DatabaseNumberOfSet";
104 static sal_Char __READONLY_DATA FIELD_SERVICE_DB_NUMBER[] = "DatabaseSetNumber";
105 static sal_Char __READONLY_DATA FIELD_SERVICE_DB_DISPLAY[] = "Database";
106 static sal_Char __READONLY_DATA FIELD_SERVICE_DB_NAME[] = "DatabaseName";
107 static sal_Char __READONLY_DATA FIELD_SERVICE_CONDITIONAL_TEXT[] = "ConditionalText";
108 static sal_Char __READONLY_DATA FIELD_SERVICE_HIDDEN_TEXT[] = "HiddenText";
109 static sal_Char __READONLY_DATA FIELD_SERVICE_HIDDEN_PARAGRAPH[] = "HiddenParagraph";
110 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_CHANGE_AUTHOR[] = "DocInfo.ChangeAuthor";
111 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_CHANGE_AUTHOR2[] = "docinfo.ChangeAuthor";
112 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_CHANGE_DATE_TIME[] = "DocInfo.ChangeDateTime";
113 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_CHANGE_DATE_TIME2[] = "docinfo.ChangeDateTime";
114 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_EDIT_TIME[] = "DocInfo.EditTime";
115 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_EDIT_TIME2[] = "docinfo.EditTime";
116 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_DESCRIPTION[] = "DocInfo.Description";
117 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_DESCRIPTION2[] = "docinfo.Description";
118 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_CREATE_AUTHOR[] = "DocInfo.CreateAuthor";
119 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_CREATE_AUTHOR2[] = "docinfo.CreateAuthor";
120 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_CREATE_DATE_TIME[] = "DocInfo.CreateDateTime";
121 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_CREATE_DATE_TIME2[] = "docinfo.CreateDateTime";
122 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_CUSTOM[] = "DocInfo.Custom";
123 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_CUSTOM2[] = "docinfo.Custom";
124 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_PRINT_AUTHOR[] = "DocInfo.PrintAuthor";
125 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_PRINT_AUTHOR2[] = "docinfo.PrintAuthor";
126 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_PRINT_DATE_TIME[] = "DocInfo.PrintDateTime";
127 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_PRINT_DATE_TIME2[] = "docinfo.PrintDateTime";
128 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_KEY_WORDS[] = "DocInfo.KeyWords";
129 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_KEY_WORDS2[] = "docinfo.KeyWords";
130 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_SUBJECT[] = "DocInfo.Subject";
131 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_SUBJECT2[] = "docinfo.Subject";
132 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_TITLE[] = "DocInfo.Title";
133 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_TITLE2[] = "docinfo.Title";
134 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_REVISION[] = "DocInfo.Revision";
135 static sal_Char __READONLY_DATA FIELD_SERVICE_DOC_INFO_REVISION2[] = "docinfo.Revision";
136 static sal_Char __READONLY_DATA FIELD_SERVICE_FILE_NAME[] = "FileName";
137 static sal_Char __READONLY_DATA FIELD_SERVICE_CHAPTER[] = "Chapter";
138 static sal_Char __READONLY_DATA FIELD_SERVICE_TEMPLATE_NAME[] = "TemplateName";
139 static sal_Char __READONLY_DATA FIELD_SERVICE_PAGE_COUNT[] = "PageCount";
140 static sal_Char __READONLY_DATA FIELD_SERVICE_PARAGRAPH_COUNT[] = "ParagraphCount";
141 static sal_Char __READONLY_DATA FIELD_SERVICE_WORD_COUNT[] = "WordCount";
142 static sal_Char __READONLY_DATA FIELD_SERVICE_CHARACTER_COUNT[] = "CharacterCount";
143 static sal_Char __READONLY_DATA FIELD_SERVICE_TABLE_COUNT[] = "TableCount";
144 static sal_Char __READONLY_DATA FIELD_SERVICE_GRAPHIC_COUNT[] = "GraphicObjectCount";
145 static sal_Char __READONLY_DATA FIELD_SERVICE_OBJECT_COUNT[] = "EmbeddedObjectCount";
146 static sal_Char __READONLY_DATA FIELD_SERVICE_REFERENCE_PAGE_SET[] = "ReferencePageSet";
147 static sal_Char __READONLY_DATA FIELD_SERVICE_REFERENCE_PAGE_GET[] = "ReferencePageGet";
148 static sal_Char __READONLY_DATA FIELD_SERVICE_SHEET_NAME[] = "SheetName";
149 static sal_Char __READONLY_DATA FIELD_SERVICE_MACRO[] = "Macro";
150 static sal_Char __READONLY_DATA FIELD_SERVICE_GET_REFERENCE[] = "GetReference";
151 static sal_Char __READONLY_DATA FIELD_SERVICE_DDE[] = "DDE";
152 static sal_Char __READONLY_DATA FIELD_SERVICE_URL[] = "URL";
153 static sal_Char __READONLY_DATA FIELD_SERVICE_BIBLIOGRAPHY[] = "Bibliography";
154 static sal_Char __READONLY_DATA FIELD_SERVICE_SCRIPT[] = "Script";
155 static sal_Char __READONLY_DATA FIELD_SERVICE_ANNOTATION[] = "Annotation";
156 static sal_Char __READONLY_DATA FIELD_SERVICE_COMBINED_CHARACTERS[] = "CombinedCharacters";
157 static sal_Char __READONLY_DATA FIELD_SERVICE_META[] = "MetadataField";
158 static sal_Char __READONLY_DATA FIELD_SERVICE_MEASURE[] = "Measure";
159 static sal_Char __READONLY_DATA FIELD_SERVICE_TABLE_FORMULA[] = "TableFormula";
160 static sal_Char __READONLY_DATA FIELD_SERVICE_DROP_DOWN[] = "DropDown";
161 
162 SvXMLEnumStringMapEntry __READONLY_DATA aFieldServiceNameMapping[] =
163 {
164 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_SENDER, FIELD_ID_SENDER ),
165 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_AUTHOR, FIELD_ID_AUTHOR ),
166 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_JUMPEDIT, FIELD_ID_PLACEHOLDER ),
167 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_GETEXP, FIELD_ID_VARIABLE_GET ),
168 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_SETEXP, FIELD_ID_VARIABLE_SET ),
169 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_USER, FIELD_ID_USER_GET ),
170 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_INPUT, FIELD_ID_TEXT_INPUT ),
171 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_USERINPUT, FIELD_ID_USER_INPUT ),
172 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DATETIME, FIELD_ID_TIME ),
173 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_PAGENUMBER, FIELD_ID_PAGENUMBER ),
174 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_REFERENCE_PAGE_SET, FIELD_ID_REFPAGE_SET ),
175 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_REFERENCE_PAGE_GET, FIELD_ID_REFPAGE_GET ),
176 
177 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DB_NEXT, FIELD_ID_DATABASE_NEXT ),
178 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DB_SELECT, FIELD_ID_DATABASE_SELECT ),
179 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DB_NUMBER, FIELD_ID_DATABASE_NUMBER ),
180 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DB_DISPLAY, FIELD_ID_DATABASE_DISPLAY ),
181 	// workaround for #no-bug#: Database/DataBase
182 	ENUM_STRING_MAP_ENTRY( "DataBase", FIELD_ID_DATABASE_DISPLAY ),
183 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DB_NAME, FIELD_ID_DATABASE_NAME ),
184 
185 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_CREATE_AUTHOR, FIELD_ID_DOCINFO_CREATION_AUTHOR ),
186     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_CREATE_AUTHOR2, FIELD_ID_DOCINFO_CREATION_AUTHOR ),
187 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_CREATE_DATE_TIME, FIELD_ID_DOCINFO_CREATION_TIME),
188     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_CREATE_DATE_TIME2, FIELD_ID_DOCINFO_CREATION_TIME),
189 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_CHANGE_AUTHOR, FIELD_ID_DOCINFO_SAVE_AUTHOR ),
190     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_CHANGE_AUTHOR2, FIELD_ID_DOCINFO_SAVE_AUTHOR ),
191 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_CHANGE_DATE_TIME, FIELD_ID_DOCINFO_SAVE_TIME ),
192     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_CHANGE_DATE_TIME2, FIELD_ID_DOCINFO_SAVE_TIME ),
193 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_EDIT_TIME, FIELD_ID_DOCINFO_EDIT_DURATION ),
194     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_EDIT_TIME2, FIELD_ID_DOCINFO_EDIT_DURATION ),
195 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_DESCRIPTION, FIELD_ID_DOCINFO_DESCRIPTION ),
196     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_DESCRIPTION2, FIELD_ID_DOCINFO_DESCRIPTION ),
197 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_CUSTOM, FIELD_ID_DOCINFO_CUSTOM ),
198     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_CUSTOM2, FIELD_ID_DOCINFO_CUSTOM ),
199 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_PRINT_AUTHOR, FIELD_ID_DOCINFO_PRINT_AUTHOR ),
200     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_PRINT_AUTHOR2, FIELD_ID_DOCINFO_PRINT_AUTHOR ),
201 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_PRINT_DATE_TIME, FIELD_ID_DOCINFO_PRINT_TIME ),
202     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_PRINT_DATE_TIME2, FIELD_ID_DOCINFO_PRINT_TIME ),
203 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_KEY_WORDS, FIELD_ID_DOCINFO_KEYWORDS ),
204     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_KEY_WORDS2, FIELD_ID_DOCINFO_KEYWORDS ),
205 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_SUBJECT, FIELD_ID_DOCINFO_SUBJECT ),
206     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_SUBJECT2, FIELD_ID_DOCINFO_SUBJECT ),
207 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_TITLE, FIELD_ID_DOCINFO_TITLE ),
208     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_TITLE2, FIELD_ID_DOCINFO_TITLE ),
209 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_REVISION, FIELD_ID_DOCINFO_REVISION ),
210     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DOC_INFO_REVISION2, FIELD_ID_DOCINFO_REVISION ),
211 
212 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_CONDITIONAL_TEXT, FIELD_ID_CONDITIONAL_TEXT ),
213 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_HIDDEN_TEXT, FIELD_ID_HIDDEN_TEXT ),
214 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_HIDDEN_PARAGRAPH, FIELD_ID_HIDDEN_PARAGRAPH ),
215 
216 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_FILE_NAME, FIELD_ID_FILE_NAME ),
217 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_CHAPTER, FIELD_ID_CHAPTER ),
218 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_TEMPLATE_NAME, FIELD_ID_TEMPLATE_NAME ),
219 
220 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_PAGE_COUNT, FIELD_ID_COUNT_PAGES ),
221 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_PARAGRAPH_COUNT, FIELD_ID_COUNT_PARAGRAPHS ),
222 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_WORD_COUNT, FIELD_ID_COUNT_WORDS ),
223 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_CHARACTER_COUNT, FIELD_ID_COUNT_CHARACTERS ),
224 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_TABLE_COUNT, FIELD_ID_COUNT_TABLES ),
225 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_GRAPHIC_COUNT, FIELD_ID_COUNT_GRAPHICS ),
226 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_OBJECT_COUNT, FIELD_ID_COUNT_OBJECTS ),
227 
228 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_MACRO, FIELD_ID_MACRO ),
229 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_GET_REFERENCE, FIELD_ID_REF_REFERENCE ),
230 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DDE, FIELD_ID_DDE ),
231 
232 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_BIBLIOGRAPHY, FIELD_ID_BIBLIOGRAPHY ),
233 
234 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_SCRIPT, FIELD_ID_SCRIPT ),
235 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_ANNOTATION, FIELD_ID_ANNOTATION ),
236 
237 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_COMBINED_CHARACTERS, FIELD_ID_COMBINED_CHARACTERS ),
238 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_META, FIELD_ID_META ),
239 
240 	// non-writer fields
241 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_SHEET_NAME, FIELD_ID_SHEET_NAME ),
242 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_URL, FIELD_ID_URL ),
243 	ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_MEASURE, FIELD_ID_MEASURE ),
244 
245     // deprecated fields
246     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_TABLE_FORMULA, FIELD_ID_TABLE_FORMULA ),
247     ENUM_STRING_MAP_ENTRY( FIELD_SERVICE_DROP_DOWN, FIELD_ID_DROP_DOWN ),
248 
249 	ENUM_STRING_MAP_END()
250 };
251 
252 
253 
254 // property accessor helper functions
255 inline sal_Bool GetBoolProperty(const OUString&,
256 									  const Reference<XPropertySet> &);
257 inline sal_Bool GetOptionalBoolProperty(const OUString&,
258                                               const Reference<XPropertySet> &,
259                                               const Reference<XPropertySetInfo> &,
260                                               sal_Bool bDefault);
261 inline double GetDoubleProperty(const OUString&,
262 									  const Reference<XPropertySet> &);
263 inline OUString const GetStringProperty(const OUString&,
264 										const Reference<XPropertySet> &);
265 inline sal_Int32 GetIntProperty(const OUString&,
266 									  const Reference<XPropertySet> &);
267 inline sal_Int16 GetInt16Property(const OUString&,
268 										const Reference<XPropertySet> &);
269 inline sal_Int8 GetInt8Property(const OUString&,
270 									  const Reference<XPropertySet> &);
271 inline DateTime const GetDateTimeProperty( const OUString& sPropName,
272 										   const Reference<XPropertySet> & xPropSet);
273 inline Date const GetDateProperty( const OUString& sPropName,
274 								   const Reference<XPropertySet> & xPropSet);
275 inline Sequence<OUString> const GetStringSequenceProperty(
276 	                               const OUString& sPropName,
277                                    const Reference<XPropertySet> & xPropSet);
278 
279 
280 
XMLTextFieldExport(SvXMLExport & rExp,XMLPropertyState * pCombinedCharState)281 XMLTextFieldExport::XMLTextFieldExport( SvXMLExport& rExp,
282 										XMLPropertyState* pCombinedCharState)
283 	: rExport(rExp),
284 	  pUsedMasters(NULL),
285 	  sServicePrefix(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.textfield.")),
286 	  sFieldMasterPrefix(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.FieldMaster.")),
287 	  sPresentationServicePrefix(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.TextField.")),
288 
289 	sPropertyAdjust(RTL_CONSTASCII_USTRINGPARAM("Adjust")),
290 	sPropertyAuthor(RTL_CONSTASCII_USTRINGPARAM("Author")),
291 	sPropertyChapterFormat(RTL_CONSTASCII_USTRINGPARAM("ChapterFormat")),
292 	sPropertyChapterNumberingLevel(RTL_CONSTASCII_USTRINGPARAM("ChapterNumberingLevel")),
293 	sPropertyCharStyleNames(RTL_CONSTASCII_USTRINGPARAM("CharStyleNames")),
294 	sPropertyCondition(RTL_CONSTASCII_USTRINGPARAM("Condition")),
295 	sPropertyContent(RTL_CONSTASCII_USTRINGPARAM("Content")),
296 	sPropertyDataBaseName(RTL_CONSTASCII_USTRINGPARAM("DataBaseName")),
297 	sPropertyDataBaseURL(RTL_CONSTASCII_USTRINGPARAM("DataBaseURL")),
298 	sPropertyDataColumnName(RTL_CONSTASCII_USTRINGPARAM("DataColumnName")),
299 	sPropertyDataCommandType(RTL_CONSTASCII_USTRINGPARAM("DataCommandType")),
300 	sPropertyDataTableName(RTL_CONSTASCII_USTRINGPARAM("DataTableName")),
301 	sPropertyDate(RTL_CONSTASCII_USTRINGPARAM("Date")),
302 	sPropertyDateTime(RTL_CONSTASCII_USTRINGPARAM("DateTime")),
303 	sPropertyDateTimeValue(RTL_CONSTASCII_USTRINGPARAM("DateTimeValue")),
304 	sPropertyDDECommandElement(RTL_CONSTASCII_USTRINGPARAM("DDECommandElement")),
305 	sPropertyDDECommandFile(RTL_CONSTASCII_USTRINGPARAM("DDECommandFile")),
306 	sPropertyDDECommandType(RTL_CONSTASCII_USTRINGPARAM("DDECommandType")),
307 	sPropertyDependentTextFields(RTL_CONSTASCII_USTRINGPARAM("DependentTextFields")),
308 	sPropertyFalseContent(RTL_CONSTASCII_USTRINGPARAM("FalseContent")),
309 	sPropertyFields(RTL_CONSTASCII_USTRINGPARAM("Fields")),
310 	sPropertyFieldSubType(RTL_CONSTASCII_USTRINGPARAM("UserDataType")),
311 	sPropertyFileFormat(RTL_CONSTASCII_USTRINGPARAM("FileFormat")),
312 	sPropertyFullName(RTL_CONSTASCII_USTRINGPARAM("FullName")),
313 	sPropertyHint(RTL_CONSTASCII_USTRINGPARAM("Hint")),
314     sPropertyInitials(RTL_CONSTASCII_USTRINGPARAM("Initials")),
315 	sPropertyInstanceName(RTL_CONSTASCII_USTRINGPARAM("InstanceName")),
316 	sPropertyIsAutomaticUpdate(RTL_CONSTASCII_USTRINGPARAM("IsAutomaticUpdate")),
317 	sPropertyIsConditionTrue(RTL_CONSTASCII_USTRINGPARAM("IsConditionTrue")),
318 	sPropertyIsDataBaseFormat(RTL_CONSTASCII_USTRINGPARAM("DataBaseFormat")),
319 	sPropertyIsDate(RTL_CONSTASCII_USTRINGPARAM("IsDate")),
320 	sPropertyIsExpression(RTL_CONSTASCII_USTRINGPARAM("IsExpression")),
321 	sPropertyIsFixed(RTL_CONSTASCII_USTRINGPARAM("IsFixed")),
322 	sPropertyIsFixedLanguage(RTL_CONSTASCII_USTRINGPARAM("IsFixedLanguage")),
323 	sPropertyIsHidden(RTL_CONSTASCII_USTRINGPARAM("IsHidden")),
324 	sPropertyIsInput(RTL_CONSTASCII_USTRINGPARAM("Input")),
325 	sPropertyIsShowFormula(RTL_CONSTASCII_USTRINGPARAM("IsShowFormula")),
326 	sPropertyIsVisible(RTL_CONSTASCII_USTRINGPARAM("IsVisible")),
327 	sPropertyItems(RTL_CONSTASCII_USTRINGPARAM("Items")),
328 	sPropertyLevel(RTL_CONSTASCII_USTRINGPARAM("Level")),
329 	sPropertyMacro(RTL_CONSTASCII_USTRINGPARAM("Macro")),
330 	sPropertyMeasureKind(RTL_CONSTASCII_USTRINGPARAM("Kind")),
331 	sPropertyName(RTL_CONSTASCII_USTRINGPARAM("Name")),
332 	sPropertyNumberFormat(RTL_CONSTASCII_USTRINGPARAM("NumberFormat")),
333 	sPropertyNumberingSeparator(RTL_CONSTASCII_USTRINGPARAM("NumberingSeparator")),
334 	sPropertyNumberingType(RTL_CONSTASCII_USTRINGPARAM("NumberingType")),
335 	sPropertyOffset(RTL_CONSTASCII_USTRINGPARAM("Offset")),
336 	sPropertyOn(RTL_CONSTASCII_USTRINGPARAM("On")),
337 	sPropertyPlaceholder(RTL_CONSTASCII_USTRINGPARAM("PlaceHolder")),
338 	sPropertyPlaceholderType(RTL_CONSTASCII_USTRINGPARAM("PlaceHolderType")),
339 	sPropertyReferenceFieldPart(RTL_CONSTASCII_USTRINGPARAM("ReferenceFieldPart")),
340 	sPropertyReferenceFieldSource(RTL_CONSTASCII_USTRINGPARAM("ReferenceFieldSource")),
341 	sPropertyReferenceFieldType(RTL_CONSTASCII_USTRINGPARAM("ReferenceFieldType")),
342 	sPropertyRevision(RTL_CONSTASCII_USTRINGPARAM("Revision")),
343 	sPropertyScriptType(RTL_CONSTASCII_USTRINGPARAM("ScriptType")),
344 	sPropertySelectedItem(RTL_CONSTASCII_USTRINGPARAM("SelectedItem")),
345 	sPropertySequenceNumber(RTL_CONSTASCII_USTRINGPARAM("SequenceNumber")),
346 	sPropertySequenceValue(RTL_CONSTASCII_USTRINGPARAM("SequenceValue")),
347 	sPropertySetNumber(RTL_CONSTASCII_USTRINGPARAM("SetNumber")),
348 	sPropertySourceName(RTL_CONSTASCII_USTRINGPARAM("SourceName")),
349 	sPropertySubType(RTL_CONSTASCII_USTRINGPARAM("SubType")),
350 	sPropertyTargetFrame(RTL_CONSTASCII_USTRINGPARAM("TargetFrame")),
351 	sPropertyTrueContent(RTL_CONSTASCII_USTRINGPARAM("TrueContent")),
352 	sPropertyURL(RTL_CONSTASCII_USTRINGPARAM("URL")),
353 	sPropertyURLContent(RTL_CONSTASCII_USTRINGPARAM("URLContent")),
354 	sPropertyUserText(RTL_CONSTASCII_USTRINGPARAM("UserText")),
355 	sPropertyValue(RTL_CONSTASCII_USTRINGPARAM("Value")),
356 	sPropertyVariableName(RTL_CONSTASCII_USTRINGPARAM("VariableName")),
357 	sPropertyVariableSubType(RTL_CONSTASCII_USTRINGPARAM("VariableSubtype")),
358       sPropertyHelp(RTL_CONSTASCII_USTRINGPARAM("Help")),
359       sPropertyTooltip(RTL_CONSTASCII_USTRINGPARAM("Tooltip")),
360       sPropertyTextRange(RTL_CONSTASCII_USTRINGPARAM("TextRange")),
361 	  pCombinedCharactersPropertyState(pCombinedCharState)
362 {
363 	SetExportOnlyUsedFieldDeclarations();
364 }
365 
~XMLTextFieldExport()366 XMLTextFieldExport::~XMLTextFieldExport()
367 {
368 	delete pCombinedCharactersPropertyState;
369 	delete pUsedMasters;
370 }
371 
372 /// get the field ID (as in FieldIDEnum) from XTextField
GetFieldID(const Reference<XTextField> & rTextField,const Reference<XPropertySet> & xPropSet)373 enum FieldIdEnum XMLTextFieldExport::GetFieldID(
374 	const Reference<XTextField> & rTextField,
375 	const Reference<XPropertySet> & xPropSet)
376 {
377 	// get service names for rTextField (via XServiceInfo service)
378 	Reference<XServiceInfo> xService(rTextField, UNO_QUERY);
379 	const Sequence<OUString> aServices = xService->getSupportedServiceNames();
380 	const OUString* pNames = aServices.getConstArray();
381 	sal_Int32 nCount = aServices.getLength();
382 
383 	OUString sFieldName;	// service name postfix of current field
384 
385 	// search for TextField service name
386 	while( nCount-- )
387 	{
388         if (pNames->matchIgnoreAsciiCase(sServicePrefix))
389 		{
390 			// TextField found => postfix is field type!
391 			sFieldName = pNames->copy(sServicePrefix.getLength());
392 			break;
393 		}
394 
395 		++pNames;
396 	}
397 
398 	// if this is not a normal text field, check if its a presentation text field
399 	if( sFieldName.getLength() == 0 )
400 	{
401 		const OUString* pNames2 = aServices.getConstArray();
402 		sal_Int32 nCount2 = aServices.getLength();
403 		// search for TextField service name
404 		while( nCount2-- )
405 		{
406 			if( 0 == pNames2->compareTo(sPresentationServicePrefix, sPresentationServicePrefix.getLength()))
407 			{
408 				// TextField found => postfix is field type!
409 				sFieldName = pNames2->copy(sPresentationServicePrefix.getLength());
410 				break;
411 			}
412 
413 			++pNames2;
414 		}
415 
416 		if( sFieldName.getLength() != 0 )
417 		{
418 			if( sFieldName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "Header" ) ) == 0 )
419 			{
420 				return FIELD_ID_DRAW_HEADER;
421 			}
422 			else if( sFieldName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "Footer" ) ) == 0 )
423 			{
424 				return FIELD_ID_DRAW_FOOTER;
425 			}
426 			else if( sFieldName.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM( "DateTime" ) ) == 0 )
427 			{
428 				return FIELD_ID_DRAW_DATE_TIME;
429 			}
430 		}
431 	}
432 
433 	// map postfix of service name to field ID
434 	DBG_ASSERT(sFieldName.getLength()>0, "no TextField service found!");
435 	return MapFieldName(sFieldName, xPropSet);
436 }
437 
MapFieldName(const OUString & sFieldName,const Reference<XPropertySet> & xPropSet)438 enum FieldIdEnum XMLTextFieldExport::MapFieldName(
439 	const OUString& sFieldName,				// field (master) name
440 	const Reference<XPropertySet> & xPropSet)	// for subtype
441 {
442 	// we'll proceed in 2 steps:
443 	// a) map service name to preliminary FIELD_ID
444 	// b) map those prelim. FIELD_IDs that correspond to several field types
445 	//    (in our (XML) world) to final FIELD IDs
446 
447 
448 	// a) find prelim. FIELD_ID via aFieldServiceMapping
449 
450 	// check for non-empty service name
451 	DBG_ASSERT(sFieldName.getLength()>0, "no valid service name!");
452 	enum FieldIdEnum nToken = FIELD_ID_UNKNOWN;
453 	if (sFieldName.getLength() > 0)
454 	{
455 		// map name to prelim. ID
456 		sal_uInt16 nTmp;
457 		sal_Bool bRet = GetExport().GetMM100UnitConverter().convertEnum(
458 			nTmp, sFieldName, aFieldServiceNameMapping);
459 
460 		// check return
461 		DBG_ASSERT(bRet, "Unknown field service name encountered!");
462 		if (! bRet)
463 		{
464 			nToken = FIELD_ID_UNKNOWN;
465 		}
466 		else
467 		{
468 			nToken = (enum FieldIdEnum)nTmp;
469 		}
470 	} else {
471 		// invalid service name
472 		nToken = FIELD_ID_UNKNOWN;
473 	}
474 
475 	// b) map prelim. to final FIELD_IDs
476 	switch (nToken) {
477 		case FIELD_ID_VARIABLE_SET:
478 			if (GetBoolProperty(sPropertyIsInput, xPropSet))
479 			{
480 				nToken = FIELD_ID_VARIABLE_INPUT;
481 			}
482 			else
483 			{
484 				switch (GetIntProperty(sPropertySubType, xPropSet))
485 				{
486 					case SetVariableType::STRING:	// text field
487 					case SetVariableType::VAR:		// num field
488 						nToken = FIELD_ID_VARIABLE_SET;
489 						break;
490 					case SetVariableType::SEQUENCE:
491 						nToken = FIELD_ID_SEQUENCE;
492 						break;
493 					case SetVariableType::FORMULA:
494 					default:
495 						nToken = FIELD_ID_UNKNOWN;
496 						break;
497 				}
498 			}
499 			break;
500 
501 		case FIELD_ID_VARIABLE_GET:
502 			switch (GetIntProperty(sPropertySubType, xPropSet))
503 			{
504 				case SetVariableType::STRING:	// text field
505 				case SetVariableType::VAR:		// num field
506 					nToken = FIELD_ID_VARIABLE_GET;
507 					break;
508 				case SetVariableType::FORMULA:
509 					nToken = FIELD_ID_EXPRESSION;
510 					break;
511 				case SetVariableType::SEQUENCE:
512 				default:
513 					nToken = FIELD_ID_UNKNOWN;
514 					break;
515 			}
516 			break;
517 
518 		case FIELD_ID_TIME:
519 			if (GetBoolProperty(sPropertyIsDate, xPropSet))
520 			{
521 				nToken = FIELD_ID_DATE;
522 			}
523 			break;
524 
525 		case FIELD_ID_PAGENUMBER:
526 			// NumberingType not available in non-Writer apps
527 			if (xPropSet->getPropertySetInfo()->
528 				hasPropertyByName(sPropertyNumberingType))
529 			{
530 				if (NumberingType::CHAR_SPECIAL == GetIntProperty(
531 											sPropertyNumberingType, xPropSet))
532 				{
533 					nToken = FIELD_ID_PAGESTRING;
534 				}
535 			}
536 			break;
537 
538 		case FIELD_ID_DOCINFO_CREATION_TIME:
539  			if (GetBoolProperty(sPropertyIsDate, xPropSet))
540 			{
541 				nToken = FIELD_ID_DOCINFO_CREATION_DATE;
542 			}
543 			break;
544 
545 		case FIELD_ID_DOCINFO_PRINT_TIME:
546  			if (GetBoolProperty(sPropertyIsDate, xPropSet))
547 			{
548 				nToken = FIELD_ID_DOCINFO_PRINT_DATE;
549 			}
550 			break;
551 
552 		case FIELD_ID_DOCINFO_SAVE_TIME:
553  			if (GetBoolProperty(sPropertyIsDate, xPropSet))
554 			{
555 				nToken = FIELD_ID_DOCINFO_SAVE_DATE;
556 			}
557 			break;
558 
559 		case FIELD_ID_REF_REFERENCE:
560 			switch (GetInt16Property(sPropertyReferenceFieldSource, xPropSet))
561 			{
562 				case ReferenceFieldSource::REFERENCE_MARK:
563 					nToken = FIELD_ID_REF_REFERENCE;
564 					break;
565 				case ReferenceFieldSource::SEQUENCE_FIELD:
566 					nToken = FIELD_ID_REF_SEQUENCE;
567 					break;
568 				case ReferenceFieldSource::BOOKMARK:
569 					nToken = FIELD_ID_REF_BOOKMARK;
570 					break;
571 				case ReferenceFieldSource::FOOTNOTE:
572 					nToken = FIELD_ID_REF_FOOTNOTE;
573 					break;
574 				case ReferenceFieldSource::ENDNOTE:
575 					nToken = FIELD_ID_REF_ENDNOTE;
576 					break;
577 				default:
578 					nToken = FIELD_ID_UNKNOWN;
579 					break;
580 			}
581 			break;
582 
583 		case FIELD_ID_COMBINED_CHARACTERS:
584 		case FIELD_ID_SCRIPT:
585 		case FIELD_ID_ANNOTATION:
586 		case FIELD_ID_BIBLIOGRAPHY:
587 		case FIELD_ID_DDE:
588 		case FIELD_ID_MACRO:
589 		case FIELD_ID_REFPAGE_SET:
590 		case FIELD_ID_REFPAGE_GET:
591 		case FIELD_ID_COUNT_PAGES:
592 		case FIELD_ID_COUNT_PARAGRAPHS:
593 		case FIELD_ID_COUNT_WORDS:
594 		case FIELD_ID_COUNT_CHARACTERS:
595 		case FIELD_ID_COUNT_TABLES:
596 		case FIELD_ID_COUNT_GRAPHICS:
597 		case FIELD_ID_COUNT_OBJECTS:
598 		case FIELD_ID_CONDITIONAL_TEXT:
599 		case FIELD_ID_HIDDEN_TEXT:
600 		case FIELD_ID_HIDDEN_PARAGRAPH:
601 		case FIELD_ID_DOCINFO_CREATION_AUTHOR:
602 		case FIELD_ID_DOCINFO_DESCRIPTION:
603 		case FIELD_ID_DOCINFO_CUSTOM:
604 		case FIELD_ID_DOCINFO_PRINT_AUTHOR:
605 		case FIELD_ID_DOCINFO_TITLE:
606 		case FIELD_ID_DOCINFO_SUBJECT:
607 		case FIELD_ID_DOCINFO_KEYWORDS:
608 		case FIELD_ID_DOCINFO_REVISION:
609 		case FIELD_ID_DOCINFO_EDIT_DURATION:
610 		case FIELD_ID_DOCINFO_SAVE_AUTHOR:
611 		case FIELD_ID_TEXT_INPUT:
612 		case FIELD_ID_USER_INPUT:
613 		case FIELD_ID_AUTHOR:
614 		case FIELD_ID_SENDER:
615 		case FIELD_ID_PLACEHOLDER:
616 		case FIELD_ID_USER_GET:
617 		case FIELD_ID_DATABASE_NEXT:
618 		case FIELD_ID_DATABASE_SELECT:
619 		case FIELD_ID_DATABASE_DISPLAY:
620 		case FIELD_ID_DATABASE_NAME:
621 		case FIELD_ID_DATABASE_NUMBER:
622 		case FIELD_ID_TEMPLATE_NAME:
623 		case FIELD_ID_CHAPTER:
624 		case FIELD_ID_FILE_NAME:
625         case FIELD_ID_META:
626 		case FIELD_ID_SHEET_NAME:
627 		case FIELD_ID_MEASURE:
628 		case FIELD_ID_URL:
629         case FIELD_ID_TABLE_FORMULA:
630         case FIELD_ID_DROP_DOWN:
631 			; // these field IDs are final
632 			break;
633 
634 		default:
635 			nToken = FIELD_ID_UNKNOWN;
636 	}
637 
638 	// ... and return final FIELD_ID
639 	return nToken;
640 }
641 
642 // is string or numeric field?
IsStringField(FieldIdEnum nFieldType,const Reference<XPropertySet> & xPropSet)643 sal_Bool XMLTextFieldExport::IsStringField(
644 	FieldIdEnum nFieldType,
645 	const Reference<XPropertySet> & xPropSet)
646 {
647 	switch (nFieldType) {
648 
649 	case FIELD_ID_VARIABLE_GET:
650 	case FIELD_ID_VARIABLE_SET:
651 	case FIELD_ID_VARIABLE_INPUT:
652 	{
653 		// depends on field sub type
654 		return ( GetIntProperty(sPropertySubType, xPropSet) ==
655 				 SetVariableType::STRING					);
656 	}
657 
658 	case FIELD_ID_USER_GET:
659 	case FIELD_ID_USER_INPUT:
660 	{
661 		Reference<XTextField> xTextField(xPropSet, UNO_QUERY);
662 		DBG_ASSERT(xTextField.is(), "field is no XTextField!");
663 		sal_Bool bRet = GetBoolProperty(sPropertyIsExpression,
664 										GetMasterPropertySet(xTextField));
665 		return !bRet;
666 	}
667 
668     case FIELD_ID_META:
669         return 0 > GetIntProperty(sPropertyNumberFormat, xPropSet);
670 
671 	case FIELD_ID_DATABASE_DISPLAY:
672 		// TODO: depends on... ???
673 		// workaround #no-bug#: no data type
674 		return 5100 == GetIntProperty(sPropertyNumberFormat, xPropSet);
675 
676     case FIELD_ID_TABLE_FORMULA:
677         // legacy field: always a number field (because it always has
678         // a number format)
679         return sal_False;
680 
681 	case FIELD_ID_COUNT_PAGES:
682 	case FIELD_ID_COUNT_PARAGRAPHS:
683 	case FIELD_ID_COUNT_WORDS:
684 	case FIELD_ID_COUNT_CHARACTERS:
685 	case FIELD_ID_COUNT_TABLES:
686 	case FIELD_ID_COUNT_GRAPHICS:
687 	case FIELD_ID_COUNT_OBJECTS:
688 	case FIELD_ID_DOCINFO_SAVE_TIME:
689 	case FIELD_ID_DOCINFO_SAVE_DATE:
690 	case FIELD_ID_DOCINFO_CREATION_DATE:
691 	case FIELD_ID_DOCINFO_CREATION_TIME:
692 	case FIELD_ID_DOCINFO_PRINT_TIME:
693 	case FIELD_ID_DOCINFO_PRINT_DATE:
694 	case FIELD_ID_DOCINFO_EDIT_DURATION:
695 	case FIELD_ID_DOCINFO_REVISION:
696 	case FIELD_ID_DATABASE_NUMBER:
697 	case FIELD_ID_EXPRESSION:
698 	case FIELD_ID_SEQUENCE:
699 	case FIELD_ID_DATE:
700 	case FIELD_ID_TIME:
701 	case FIELD_ID_PAGENUMBER:
702 	case FIELD_ID_REFPAGE_SET:
703 	case FIELD_ID_REFPAGE_GET:
704 	case FIELD_ID_DOCINFO_CUSTOM:
705 		// always number
706 		return sal_False;
707 
708 	case FIELD_ID_COMBINED_CHARACTERS:
709 	case FIELD_ID_BIBLIOGRAPHY:
710 	case FIELD_ID_DDE:
711 	case FIELD_ID_REF_REFERENCE:
712 	case FIELD_ID_REF_SEQUENCE:
713 	case FIELD_ID_REF_BOOKMARK:
714 	case FIELD_ID_REF_FOOTNOTE:
715 	case FIELD_ID_REF_ENDNOTE:
716 	case FIELD_ID_MACRO:
717 	case FIELD_ID_TEMPLATE_NAME:
718 	case FIELD_ID_CHAPTER:
719 	case FIELD_ID_FILE_NAME:
720 	case FIELD_ID_CONDITIONAL_TEXT:
721 	case FIELD_ID_HIDDEN_TEXT:
722 	case FIELD_ID_HIDDEN_PARAGRAPH:
723 	case FIELD_ID_DOCINFO_CREATION_AUTHOR:
724 	case FIELD_ID_DOCINFO_DESCRIPTION:
725 	case FIELD_ID_DOCINFO_PRINT_AUTHOR:
726 	case FIELD_ID_DOCINFO_TITLE:
727 	case FIELD_ID_DOCINFO_SUBJECT:
728 	case FIELD_ID_DOCINFO_KEYWORDS:
729 	case FIELD_ID_DOCINFO_SAVE_AUTHOR:
730 	case FIELD_ID_DATABASE_NAME:
731 	case FIELD_ID_TEXT_INPUT:
732 	case FIELD_ID_SENDER:
733 	case FIELD_ID_AUTHOR:
734 	case FIELD_ID_PAGESTRING:
735 	case FIELD_ID_SHEET_NAME:
736 	case FIELD_ID_MEASURE:
737 	case FIELD_ID_URL:
738     case FIELD_ID_DROP_DOWN:
739 		// always string:
740 		return sal_True;
741 
742 	case FIELD_ID_SCRIPT:
743 	case FIELD_ID_ANNOTATION:
744    	case FIELD_ID_DATABASE_NEXT:
745 	case FIELD_ID_DATABASE_SELECT:
746 	case FIELD_ID_VARIABLE_DECL:
747 	case FIELD_ID_USER_DECL:
748 	case FIELD_ID_SEQUENCE_DECL:
749 	case FIELD_ID_PLACEHOLDER:
750 	case FIELD_ID_UNKNOWN:
751 	case FIELD_ID_DRAW_HEADER:
752 	case FIELD_ID_DRAW_FOOTER:
753 	case FIELD_ID_DRAW_DATE_TIME:
754 	default:
755 		DBG_ERROR("unknown field type/field has no content");
756 		return sal_True; // invalid info; string in case of doubt
757 	}
758 }
759 
760 /// export the styles needed by the given field. Called on first pass
761 /// through document
ExportFieldAutoStyle(const Reference<XTextField> & rTextField,const sal_Bool bProgress,const sal_Bool bRecursive)762 void XMLTextFieldExport::ExportFieldAutoStyle(
763     const Reference<XTextField> & rTextField, const sal_Bool bProgress,
764     const sal_Bool bRecursive )
765 {
766 	// get property set
767 	Reference<XPropertySet> xPropSet(rTextField, UNO_QUERY);
768 
769 	// add field master to list of used field masters (if desired)
770 	if (NULL != pUsedMasters)
771 	{
772 		Reference<XDependentTextField> xDepField(rTextField, UNO_QUERY);
773 		if (xDepField.is())
774 		{
775 			Reference<XText> xOurText = rTextField->getAnchor()->getText();
776 
777 			map<Reference<XText>, set<OUString> >::iterator aMapIter =
778 				pUsedMasters->find(xOurText);
779 
780 			// insert a list for our XText (if necessary)
781 			if (aMapIter == pUsedMasters->end())
782 			{
783 				set<OUString> aSet;
784 				(*pUsedMasters)[xOurText] = aSet;
785 				aMapIter = pUsedMasters->find(xOurText);
786 			}
787 
788 			// insert this text field master
789 			OUString sFieldMasterName = GetStringProperty(
790 				sPropertyInstanceName, xDepField->getTextFieldMaster());
791 			if (sFieldMasterName.getLength() > 0)
792 				aMapIter->second.insert( sFieldMasterName );
793 		}
794 		// else: no dependent field -> no master -> ignore
795 	}
796 
797 	// get Field ID
798 	FieldIdEnum nToken = GetFieldID(rTextField, xPropSet);
799 
800 	// export the character style for all fields
801 	// with one exception: combined character fields export their own
802 	//                     text style below
803 	Reference <XPropertySet> xRangePropSet(rTextField->getAnchor(), UNO_QUERY);
804 	if (FIELD_ID_COMBINED_CHARACTERS != nToken)
805 	{
806 		GetExport().GetTextParagraphExport()->Add(
807 			XML_STYLE_FAMILY_TEXT_TEXT, xRangePropSet);
808 	}
809 
810 	// process special styles for each field (e.g. data styles)
811 	switch (nToken) {
812 
813 	case FIELD_ID_DATABASE_DISPLAY:
814 	{
815 		sal_Int32 nFormat = GetIntProperty(sPropertyNumberFormat, xPropSet);
816 		// workaround: #no-bug#; see IsStringField(...)
817 		if ( (5100 != nFormat) &&
818 			 !GetBoolProperty(sPropertyIsDataBaseFormat, xPropSet) )
819 		{
820 				GetExport().addDataStyle(nFormat);
821 		}
822 		break;
823 	}
824 
825 	case FIELD_ID_DATE:
826 	case FIELD_ID_TIME:
827         {
828             // date and time fields are always number fields, but the
829             // NumberFormat property is optional (e.g. Calc doesn't
830             // support it)
831             Reference<XPropertySetInfo> xPropSetInfo(
832                 xPropSet->getPropertySetInfo() );
833             if ( xPropSetInfo->hasPropertyByName( sPropertyNumberFormat ) )
834             {
835                 sal_Int32 nFormat =
836                     GetIntProperty(sPropertyNumberFormat, xPropSet);
837 
838                 // nFormat may be -1 for numeric fields that display their
839                 //  variable name. (Maybe this should be a field type, then?)
840                 if (nFormat != -1)
841                 {
842                     if( ! GetOptionalBoolProperty(
843                             sPropertyIsFixedLanguage,
844                             xPropSet, xPropSetInfo, sal_False ) )
845                     {
846                         nFormat =
847                             GetExport().dataStyleForceSystemLanguage(nFormat);
848                     }
849 
850                     GetExport().addDataStyle( nFormat,
851                                               nToken == FIELD_ID_TIME );
852                 }
853             }
854         }
855 		break;
856 
857     case FIELD_ID_META:
858         // recurse into content (does not export element, so can be done first)
859         if (bRecursive)
860         {
861             ExportMetaField(xPropSet, true, bProgress);
862         }
863         // fall-through: for the meta-field itself!
864 	case FIELD_ID_DOCINFO_PRINT_TIME:
865 	case FIELD_ID_DOCINFO_PRINT_DATE:
866 	case FIELD_ID_DOCINFO_CREATION_DATE:
867 	case FIELD_ID_DOCINFO_CREATION_TIME:
868 	case FIELD_ID_DOCINFO_SAVE_TIME:
869 	case FIELD_ID_DOCINFO_SAVE_DATE:
870 	case FIELD_ID_DOCINFO_EDIT_DURATION:
871 	case FIELD_ID_VARIABLE_SET:
872 	case FIELD_ID_VARIABLE_GET:
873 	case FIELD_ID_VARIABLE_INPUT:
874 	case FIELD_ID_USER_GET:
875 	case FIELD_ID_EXPRESSION:
876     case FIELD_ID_TABLE_FORMULA:
877 	case FIELD_ID_DOCINFO_CUSTOM:
878 		// register number format, if this is a numeric field
879 		if (! IsStringField(nToken, xPropSet)) {
880 
881 			sal_Int32 nFormat =
882 				GetIntProperty(sPropertyNumberFormat, xPropSet);
883 
884 			// nFormat may be -1 for numeric fields that display their
885 			//  variable name. (Maybe this should be a field type, then?)
886 			if (nFormat != -1)
887             {
888                 // handle formats for fixed language fields
889                 // for all these fields (except table formula)
890                 if( ( nToken != FIELD_ID_TABLE_FORMULA ) &&
891                     ! GetOptionalBoolProperty(
892                           sPropertyIsFixedLanguage,
893                           xPropSet, xPropSet->getPropertySetInfo(),
894                           sal_False ) )
895                 {
896                     nFormat =
897                         GetExport().dataStyleForceSystemLanguage(nFormat);
898                 }
899 
900 				GetExport().addDataStyle(nFormat);
901 			}
902 		}
903 		break;
904 
905 	case FIELD_ID_COMBINED_CHARACTERS:
906 	{
907 		// export text style with the addition of the combined characters
908 		DBG_ASSERT(NULL != pCombinedCharactersPropertyState,
909 				   "need proper PropertyState for combined characters");
910 		const XMLPropertyState *aStates[] = { pCombinedCharactersPropertyState, 0 };
911 		GetExport().GetTextParagraphExport()->Add(
912 			XML_STYLE_FAMILY_TEXT_TEXT, xRangePropSet,
913 			aStates);
914 		break;
915 	}
916 
917 	case FIELD_ID_SCRIPT:
918 	case FIELD_ID_ANNOTATION:
919 	case FIELD_ID_BIBLIOGRAPHY:
920 	case FIELD_ID_DDE:
921 	case FIELD_ID_REF_REFERENCE:
922 	case FIELD_ID_REF_SEQUENCE:
923 	case FIELD_ID_REF_BOOKMARK:
924 	case FIELD_ID_REF_FOOTNOTE:
925 	case FIELD_ID_REF_ENDNOTE:
926 	case FIELD_ID_MACRO:
927 	case FIELD_ID_REFPAGE_SET:
928 	case FIELD_ID_REFPAGE_GET:
929 	case FIELD_ID_COUNT_PAGES:
930 	case FIELD_ID_COUNT_PARAGRAPHS:
931 	case FIELD_ID_COUNT_WORDS:
932 	case FIELD_ID_COUNT_CHARACTERS:
933 	case FIELD_ID_COUNT_TABLES:
934 	case FIELD_ID_COUNT_GRAPHICS:
935 	case FIELD_ID_COUNT_OBJECTS:
936 	case FIELD_ID_CONDITIONAL_TEXT:
937 	case FIELD_ID_HIDDEN_TEXT:
938 	case FIELD_ID_HIDDEN_PARAGRAPH:
939 	case FIELD_ID_DOCINFO_CREATION_AUTHOR:
940 	case FIELD_ID_DOCINFO_DESCRIPTION:
941 	case FIELD_ID_DOCINFO_PRINT_AUTHOR:
942 	case FIELD_ID_DOCINFO_TITLE:
943 	case FIELD_ID_DOCINFO_SUBJECT:
944 	case FIELD_ID_DOCINFO_KEYWORDS:
945 	case FIELD_ID_DOCINFO_REVISION:
946 	case FIELD_ID_DOCINFO_SAVE_AUTHOR:
947 	case FIELD_ID_SEQUENCE:
948 	case FIELD_ID_PAGENUMBER:
949 	case FIELD_ID_PAGESTRING:
950 	case FIELD_ID_AUTHOR:
951 	case FIELD_ID_SENDER:
952 	case FIELD_ID_PLACEHOLDER:
953 	case FIELD_ID_USER_INPUT:
954 	case FIELD_ID_TEXT_INPUT:
955 	case FIELD_ID_DATABASE_NEXT:
956 	case FIELD_ID_DATABASE_SELECT:
957 	case FIELD_ID_DATABASE_NAME:
958 	case FIELD_ID_DATABASE_NUMBER:
959 	case FIELD_ID_TEMPLATE_NAME:
960 	case FIELD_ID_CHAPTER:
961 	case FIELD_ID_FILE_NAME:
962 	case FIELD_ID_SHEET_NAME:
963 	case FIELD_ID_MEASURE:
964 	case FIELD_ID_URL:
965     case FIELD_ID_DROP_DOWN:
966 	case FIELD_ID_DRAW_DATE_TIME:
967 	case FIELD_ID_DRAW_FOOTER:
968 	case FIELD_ID_DRAW_HEADER:
969 		; // no formats for these fields!
970 		break;
971 
972 	case FIELD_ID_UNKNOWN:
973 	default:
974 		DBG_ERROR("unknown field type!");
975 		// ignore -> no format for unkowns
976 		break;
977 	}
978 }
979 
980 /// export the given field to XML. Called on second pass through document
ExportField(const Reference<XTextField> & rTextField,sal_Bool bProgress)981 void XMLTextFieldExport::ExportField(
982     const Reference<XTextField> & rTextField, sal_Bool bProgress )
983 {
984 	// get property set
985 	Reference<XPropertySet> xPropSet(rTextField, UNO_QUERY);
986 
987 	// get property set of range (for the attributes)
988 	Reference <XPropertySet> xRangePropSet(rTextField->getAnchor(), UNO_QUERY);
989 
990 	// get Field ID
991 	enum FieldIdEnum nToken = GetFieldID(rTextField, xPropSet);
992 
993     // special treatment for combined characters field, because it is
994     // exported as a style
995     const XMLPropertyState* aStates[] = { pCombinedCharactersPropertyState, 0 };
996     const XMLPropertyState **pStates =
997 				FIELD_ID_COMBINED_CHARACTERS == nToken
998 					? aStates
999 					: 0;
1000 
1001     // find out whether we need to set the style or hyperlink
1002     sal_Bool bHasHyperlink;
1003 	sal_Bool bIsUICharStyle;
1004     sal_Bool bHasAutoStyle;
1005     OUString sStyle = GetExport().GetTextParagraphExport()->
1006         FindTextStyleAndHyperlink( xRangePropSet, bHasHyperlink, bIsUICharStyle,
1007                                    bHasAutoStyle, pStates );
1008     sal_Bool bHasStyle = (sStyle.getLength() > 0);
1009 
1010     // export hyperlink (if we have one)
1011 	Reference < XPropertySetInfo > xRangePropSetInfo;
1012     if( bHasHyperlink )
1013 	{
1014         Reference<XPropertyState> xRangePropState( xRangePropSet, UNO_QUERY );
1015 		xRangePropSetInfo = xRangePropSet->getPropertySetInfo();
1016         bHasHyperlink =
1017             GetExport().GetTextParagraphExport()->addHyperlinkAttributes(
1018                 xRangePropSet, xRangePropState,
1019                 xRangePropSetInfo );
1020     }
1021     SvXMLElementExport aHyperlink( GetExport(), bHasHyperlink,
1022                                    XML_NAMESPACE_TEXT, XML_A,
1023                                    sal_False, sal_False );
1024 
1025 	if( bHasHyperlink )
1026 	{
1027 		// export events (if supported)
1028 		OUString sHyperLinkEvents(RTL_CONSTASCII_USTRINGPARAM(
1029 			"HyperLinkEvents"));
1030 		if (xRangePropSetInfo->hasPropertyByName(sHyperLinkEvents))
1031 		{
1032 			Any aAny = xRangePropSet->getPropertyValue(sHyperLinkEvents);
1033 			Reference<XNameReplace> xName;
1034 			aAny >>= xName;
1035 			GetExport().GetEventExport().Export(xName, sal_False);
1036 		}
1037 	}
1038 
1039 	{
1040 		XMLTextCharStyleNamesElementExport aCharStylesExport(
1041 			GetExport(), bIsUICharStyle &&
1042 						 GetExport().GetTextParagraphExport()
1043 						 	->GetCharStyleNamesPropInfoCache().hasProperty(
1044                                         xRangePropSet, xRangePropSetInfo ), bHasAutoStyle,
1045 			xRangePropSet, sPropertyCharStyleNames );
1046 
1047 		// export span with style (if necessary)
1048 		// (except for combined characters field)
1049 		if( bHasStyle )
1050 		{
1051 			// export <text:span> element
1052 			GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_STYLE_NAME,
1053 							GetExport().EncodeStyleName( sStyle ) );
1054 		}
1055 		SvXMLElementExport aSpan( GetExport(), bHasStyle,
1056 								  XML_NAMESPACE_TEXT, XML_SPAN,
1057 								  sal_False, sal_False);
1058 
1059 		// finally, export the field itself
1060         ExportFieldHelper( rTextField, xPropSet, xRangePropSet, nToken,
1061             bProgress );
1062 	}
1063 }
1064 
1065 /// export the given field to XML. Called on second pass through document
ExportFieldHelper(const Reference<XTextField> & rTextField,const Reference<XPropertySet> & rPropSet,const Reference<XPropertySet> &,enum FieldIdEnum nToken,sal_Bool bProgress)1066 void XMLTextFieldExport::ExportFieldHelper(
1067 	const Reference<XTextField> & rTextField,
1068 	const Reference<XPropertySet> & rPropSet,
1069 	const Reference<XPropertySet> &,
1070     enum FieldIdEnum nToken,
1071     sal_Bool bProgress )
1072 {
1073 	// get property set info (because some attributes are not support
1074 	// in all implementations)
1075 	Reference<XPropertySetInfo> xPropSetInfo(rPropSet->getPropertySetInfo());
1076 
1077 	OUString sPresentation = rTextField->getPresentation(sal_False);
1078 
1079 	// process each field type
1080 	switch (nToken) {
1081 	case FIELD_ID_AUTHOR:
1082 		// author field: fixed, field (sub-)type
1083 		ProcessBoolean(XML_FIXED,
1084 					   GetBoolProperty(sPropertyIsFixed, rPropSet), sal_True);
1085 		ExportElement(MapAuthorFieldName(rPropSet), sPresentation);
1086 		break;
1087 
1088 	case FIELD_ID_SENDER:
1089 		// sender field: fixed, field (sub-)type
1090 		ProcessBoolean(XML_FIXED,
1091 					   GetBoolProperty(sPropertyIsFixed, rPropSet), sal_True);
1092 		ExportElement(MapSenderFieldName(rPropSet), sPresentation);
1093 		break;
1094 
1095 	case FIELD_ID_PLACEHOLDER:
1096 		// placeholder field: type, name, description
1097 		ProcessString(XML_PLACEHOLDER_TYPE,
1098 					  MapPlaceholderType(
1099 						GetInt16Property(sPropertyPlaceholderType, rPropSet)));
1100 		ProcessString(XML_DESCRIPTION,
1101 					  GetStringProperty(sPropertyHint,rPropSet), sal_True);
1102 		ExportElement(XML_PLACEHOLDER, sPresentation);
1103 		break;
1104 
1105 	case FIELD_ID_VARIABLE_SET:
1106 	{
1107 		// variable set field: name, visible, format&value
1108 		ProcessString(XML_NAME,
1109 					  GetStringProperty(sPropertyVariableName, rPropSet));
1110 		ProcessDisplay(GetBoolProperty(sPropertyIsVisible, rPropSet),
1111 					   sal_False);
1112 		ProcessString(XML_FORMULA, XML_NAMESPACE_OOOW,
1113 					  GetStringProperty(sPropertyContent, rPropSet),
1114 					  sPresentation);
1115 		ProcessValueAndType(IsStringField(nToken, rPropSet),
1116 							GetIntProperty(sPropertyNumberFormat, rPropSet),
1117 							GetStringProperty(sPropertyContent, rPropSet),
1118 							sPresentation,
1119 							GetDoubleProperty(sPropertyValue, rPropSet),
1120 							sal_True, sal_True, sal_True,
1121                             ! GetOptionalBoolProperty(
1122                                  sPropertyIsFixedLanguage,
1123                                  rPropSet, xPropSetInfo, sal_False ) );
1124 		ExportElement(XML_VARIABLE_SET, sPresentation);
1125 		break;
1126 	}
1127 	case FIELD_ID_VARIABLE_GET:
1128 	{
1129 		// variable get field: name, format&value
1130 		ProcessString(XML_NAME,
1131 					  GetStringProperty(sPropertyContent, rPropSet));
1132 		sal_Bool bCmd = GetBoolProperty(sPropertyIsShowFormula, rPropSet);
1133 		ProcessDisplay(sal_True, bCmd);
1134         // #i81766# for older versions export of the value-type
1135         sal_Bool bExportValueType = !bCmd && ( GetExport().getExportFlags() & EXPORT_SAVEBACKWARDCOMPATIBLE );
1136 		// show style, unless name will be shown
1137 		ProcessValueAndType(IsStringField(nToken, rPropSet),
1138 							GetIntProperty(sPropertyNumberFormat, rPropSet),
1139 							sEmpty, sEmpty, 0.0, // values not used
1140 							sal_False,
1141                             bExportValueType,
1142                             !bCmd,
1143                             ! GetOptionalBoolProperty(
1144                                  sPropertyIsFixedLanguage,
1145                                  rPropSet, xPropSetInfo, sal_False ) );
1146 		ExportElement(XML_VARIABLE_GET, sPresentation);
1147 		break;
1148 	}
1149 	case FIELD_ID_VARIABLE_INPUT:
1150 		// variable input field: name, description, format&value
1151 		ProcessString(XML_NAME,
1152 					  GetStringProperty(sPropertyVariableName, rPropSet));
1153 		ProcessString(XML_DESCRIPTION,
1154 					  GetStringProperty(sPropertyHint , rPropSet));
1155 		ProcessDisplay(GetBoolProperty(sPropertyIsVisible, rPropSet),
1156 					   sal_False);
1157 		ProcessString(XML_FORMULA, XML_NAMESPACE_OOOW,
1158 					  GetStringProperty(sPropertyContent, rPropSet),
1159 					  sPresentation);
1160 		ProcessValueAndType(IsStringField(nToken, rPropSet),
1161 							GetIntProperty(sPropertyNumberFormat, rPropSet),
1162 							GetStringProperty(sPropertyContent, rPropSet),
1163 							sPresentation,
1164 							GetDoubleProperty(sPropertyValue, rPropSet),
1165 							sal_True, sal_True, sal_True,
1166                             ! GetOptionalBoolProperty(
1167                                  sPropertyIsFixedLanguage,
1168                                  rPropSet, xPropSetInfo, sal_False ) );
1169 		ExportElement(XML_VARIABLE_INPUT, sPresentation);
1170 		break;
1171 
1172 	case FIELD_ID_USER_GET:
1173 		// user field: name, hidden, style
1174 	{
1175 		sal_Bool bCmd = GetBoolProperty(sPropertyIsShowFormula, rPropSet);
1176 		ProcessDisplay(GetBoolProperty(sPropertyIsVisible, rPropSet),
1177 					   bCmd);
1178 		ProcessValueAndType(IsStringField(nToken, rPropSet),
1179 							GetIntProperty(sPropertyNumberFormat, rPropSet),
1180 							sEmpty, sEmpty,	0.0, // values not used
1181 							sal_False, sal_False, !bCmd,
1182                             ! GetOptionalBoolProperty(
1183                                  sPropertyIsFixedLanguage,
1184                                  rPropSet, xPropSetInfo, sal_False ) );
1185 
1186 		// name from FieldMaster
1187 		ProcessString(XML_NAME,
1188 					  GetStringProperty(sPropertyName,
1189 										GetMasterPropertySet(rTextField)));
1190 		ExportElement(XML_USER_FIELD_GET, sPresentation);
1191 		break;
1192 	}
1193 
1194 	case FIELD_ID_USER_INPUT:
1195 		// user input field: name (from FieldMaster), description
1196 // 		ProcessString(XML_NAME,
1197 // 					  GetStringProperty(sPropertyName,
1198 // 										GetMasterPropertySet(rTextField)));
1199 		ProcessString(XML_NAME,
1200 					  GetStringProperty(sPropertyContent, rPropSet));
1201 		ProcessString(XML_DESCRIPTION,
1202 					  GetStringProperty(sPropertyHint, rPropSet));
1203 		ExportElement(XML_USER_FIELD_INPUT, sPresentation);
1204 		break;
1205 
1206 	case FIELD_ID_SEQUENCE:
1207 	{
1208 		// sequence field: name, formula, seq-format
1209 		OUString sName = GetStringProperty(sPropertyVariableName, rPropSet);
1210 		// TODO: use reference name only if actually being referenced.
1211 		ProcessString(XML_REF_NAME,
1212 					  MakeSequenceRefName(
1213 						  GetInt16Property(sPropertySequenceValue, rPropSet),
1214 						  sName));
1215 		ProcessString(XML_NAME, sName);
1216 		ProcessString(XML_FORMULA,  XML_NAMESPACE_OOOW,
1217 					  GetStringProperty(sPropertyContent, rPropSet),
1218 					  sPresentation);
1219 		ProcessNumberingType(GetInt16Property(sPropertyNumberingType,
1220 											  rPropSet));
1221 		ExportElement(XML_SEQUENCE, sPresentation);
1222 		break;
1223 	}
1224 
1225 	case FIELD_ID_EXPRESSION:
1226 	{
1227 		// formula field: formula, format&value
1228 		sal_Bool bCmd = GetBoolProperty(sPropertyIsShowFormula, rPropSet);
1229 		ProcessString(XML_FORMULA,  XML_NAMESPACE_OOOW,
1230 					  GetStringProperty(sPropertyContent, rPropSet),
1231 					  sPresentation);
1232 		ProcessDisplay(sal_True, bCmd);
1233 		ProcessValueAndType(IsStringField(nToken, rPropSet),
1234 							GetIntProperty(sPropertyNumberFormat, rPropSet),
1235 							GetStringProperty(sPropertyContent, rPropSet),
1236 							sPresentation,
1237 							GetDoubleProperty(sPropertyValue, rPropSet),
1238 							!bCmd, !bCmd, !bCmd,
1239                             ! GetOptionalBoolProperty(
1240                                  sPropertyIsFixedLanguage,
1241                                  rPropSet, xPropSetInfo, sal_False ) );
1242 		ExportElement(XML_EXPRESSION, sPresentation);
1243 		break;
1244 	}
1245 
1246 	case FIELD_ID_TEXT_INPUT:
1247 		// text input field: description and string-value
1248 		ProcessString(XML_DESCRIPTION,
1249 					  GetStringProperty(sPropertyHint, rPropSet));
1250         ProcessString(XML_HELP,
1251                       GetStringProperty(sPropertyHelp, rPropSet), true);
1252         ProcessString(XML_HINT,
1253                       GetStringProperty(sPropertyTooltip, rPropSet), true);
1254 		ExportElement(XML_TEXT_INPUT, sPresentation);
1255 		break;
1256 
1257 	case FIELD_ID_TIME:
1258 		// all properties (except IsDate) are optional!
1259 		if (xPropSetInfo->hasPropertyByName(sPropertyNumberFormat))
1260 		{
1261 			ProcessValueAndType(sal_False,
1262 								GetIntProperty(sPropertyNumberFormat,rPropSet),
1263 								sEmpty, sEmpty, 0.0, // not used
1264 								sal_False, sal_False, sal_True,
1265                                 ! GetOptionalBoolProperty(
1266                                     sPropertyIsFixedLanguage,
1267                                     rPropSet, xPropSetInfo, sal_False ),
1268                                 sal_True);
1269 		}
1270 		if (xPropSetInfo->hasPropertyByName(sPropertyDateTimeValue))
1271 		{
1272 			// no value -> current time
1273 			ProcessDateTime(XML_TIME_VALUE,
1274 							GetDateTimeProperty(sPropertyDateTimeValue,
1275 												rPropSet),
1276 							sal_False );
1277 		}
1278 		if (xPropSetInfo->hasPropertyByName(sPropertyDateTime))
1279 		{
1280 			// no value -> current time
1281 			ProcessDateTime(XML_TIME_VALUE,
1282 							GetDateTimeProperty(sPropertyDateTime,rPropSet),
1283 							sal_False );
1284 		}
1285 		if (xPropSetInfo->hasPropertyByName(sPropertyIsFixed))
1286 		{
1287 			ProcessBoolean(XML_FIXED,
1288 						   GetBoolProperty(sPropertyIsFixed, rPropSet),
1289 						   sal_False);
1290 		}
1291 		if (xPropSetInfo->hasPropertyByName(sPropertyAdjust))
1292 		{
1293 			// adjust value given as integer in minutes
1294 			ProcessDateTime(XML_TIME_ADJUST,
1295 							GetIntProperty(sPropertyAdjust, rPropSet),
1296 							sal_False, sal_True, sal_True);
1297 		}
1298 		ExportElement(XML_TIME, sPresentation);
1299 		break;
1300 
1301 	case FIELD_ID_DATE:
1302 		// all properties (except IsDate) are optional!
1303 		if (xPropSetInfo->hasPropertyByName(sPropertyNumberFormat))
1304 		{
1305 			ProcessValueAndType(sal_False,
1306 								GetIntProperty(sPropertyNumberFormat,rPropSet),
1307 								sEmpty, sEmpty, 0.0, // not used
1308 								sal_False, sal_False, sal_True,
1309                                 ! GetOptionalBoolProperty(
1310                                     sPropertyIsFixedLanguage,
1311                                     rPropSet, xPropSetInfo, sal_False ) );
1312 		}
1313 		if (xPropSetInfo->hasPropertyByName(sPropertyDateTimeValue))
1314 		{
1315 			// no value -> current date
1316 			ProcessDateTime(XML_DATE_VALUE,
1317 							GetDateTimeProperty(sPropertyDateTimeValue,
1318 												rPropSet),
1319                             // #96457#: date fields should also save time
1320 							sal_False);
1321 		}
1322 		// TODO: remove double-handling after SRC614
1323 		else if (xPropSetInfo->hasPropertyByName(sPropertyDateTime))
1324 		{
1325 			ProcessDateTime(XML_DATE_VALUE,
1326 							GetDateTimeProperty(sPropertyDateTime,rPropSet),
1327                             // #96457#: date fields should also save time
1328 							sal_False);
1329 		}
1330 		if (xPropSetInfo->hasPropertyByName(sPropertyIsFixed))
1331 		{
1332 			ProcessBoolean(XML_FIXED,
1333 						   GetBoolProperty(sPropertyIsFixed, rPropSet),
1334 						   sal_False);
1335 		}
1336 		if (xPropSetInfo->hasPropertyByName(sPropertyAdjust))
1337 		{
1338 			// adjust value given as number of days
1339 			ProcessDateTime(XML_DATE_ADJUST,
1340 							GetIntProperty(sPropertyAdjust, rPropSet),
1341 							sal_True, sal_True, sal_True);
1342 		}
1343 		ExportElement(XML_DATE, sPresentation);
1344 		break;
1345 
1346 	case FIELD_ID_PAGENUMBER:
1347 		// all properties are optional
1348 		if (xPropSetInfo->hasPropertyByName(sPropertyNumberingType))
1349 		{
1350 			ProcessNumberingType(GetInt16Property(sPropertyNumberingType,
1351 												  rPropSet));
1352 		}
1353 		if (xPropSetInfo->hasPropertyByName(sPropertyOffset))
1354 		{
1355 			sal_Int32 nAdjust = GetIntProperty(sPropertyOffset, rPropSet);
1356 
1357 			if (xPropSetInfo->hasPropertyByName(sPropertySubType))
1358 			{
1359 				// property SubType used in MapPageNumebrName
1360 				ProcessString(XML_SELECT_PAGE,
1361 							  MapPageNumberName(rPropSet, nAdjust));
1362 			}
1363 			ProcessIntegerDef(XML_PAGE_ADJUST, nAdjust, 0);
1364 		}
1365 		ExportElement(XML_PAGE_NUMBER, sPresentation);
1366 		break;
1367 
1368 	case FIELD_ID_PAGESTRING:
1369 	{
1370 		ProcessString(XML_STRING_VALUE,
1371 					  GetStringProperty(sPropertyUserText, rPropSet),
1372 					  sPresentation);
1373 		sal_Int32 nDummy = 0; // MapPageNumberName need int
1374 		ProcessString(XML_SELECT_PAGE, MapPageNumberName(rPropSet, nDummy));
1375 		if( 0 == ( GetExport().getExportFlags() & EXPORT_SAVEBACKWARDCOMPATIBLE ) )
1376 			ExportElement(XML_PAGE_CONTINUATION, sPresentation);
1377 		else
1378 			ExportElement(XML_PAGE_CONTINUATION_STRING, sPresentation);
1379 		break;
1380 	}
1381 
1382 	case FIELD_ID_DATABASE_NAME:
1383 		ProcessString(XML_TABLE_NAME,
1384 					  GetStringProperty(sPropertyDataTableName, rPropSet));
1385         ProcessCommandType(GetIntProperty(sPropertyDataCommandType, rPropSet));
1386 		ProcessDisplay(GetBoolProperty(sPropertyIsVisible, rPropSet),
1387 					   sal_False);
1388 		ExportDataBaseElement(XML_DATABASE_NAME, sPresentation,
1389                               rPropSet, xPropSetInfo);
1390 		break;
1391 
1392 	case FIELD_ID_DATABASE_NUMBER:
1393 		ProcessString(XML_TABLE_NAME,
1394 					  GetStringProperty(sPropertyDataTableName, rPropSet));
1395         ProcessCommandType(GetIntProperty(sPropertyDataCommandType, rPropSet));
1396 		ProcessNumberingType(
1397 			GetInt16Property(sPropertyNumberingType,rPropSet));
1398 		ProcessInteger(XML_VALUE,
1399 					   GetIntProperty(sPropertySetNumber, rPropSet));
1400 		ProcessDisplay(GetBoolProperty(sPropertyIsVisible, rPropSet),
1401 					   sal_False);
1402 		ExportDataBaseElement(XML_DATABASE_ROW_NUMBER, sPresentation,
1403                               rPropSet, xPropSetInfo);
1404 		break;
1405 
1406 	case FIELD_ID_DATABASE_NEXT:
1407 		ProcessString(XML_TABLE_NAME,
1408 					  GetStringProperty(sPropertyDataTableName, rPropSet));
1409         ProcessCommandType(GetIntProperty(sPropertyDataCommandType, rPropSet));
1410 		ProcessString(XML_CONDITION, XML_NAMESPACE_OOOW,
1411 					  GetStringProperty(sPropertyCondition, rPropSet));
1412 		DBG_ASSERT(sPresentation.equals(sEmpty),
1413 				   "Unexpected presentation for database next field");
1414 		ExportDataBaseElement(XML_DATABASE_NEXT, OUString(),
1415                               rPropSet, xPropSetInfo);
1416 		break;
1417 
1418 	case FIELD_ID_DATABASE_SELECT:
1419 		ProcessString(XML_TABLE_NAME,
1420 					  GetStringProperty(sPropertyDataTableName, rPropSet));
1421         ProcessCommandType(GetIntProperty(sPropertyDataCommandType, rPropSet));
1422 		ProcessString(XML_CONDITION, XML_NAMESPACE_OOOW,
1423 					  GetStringProperty(sPropertyCondition, rPropSet));
1424 		ProcessInteger(XML_ROW_NUMBER,
1425 					   GetIntProperty(sPropertySetNumber, rPropSet));
1426 		DBG_ASSERT(sPresentation.equals(sEmpty),
1427 				   "Unexpected presentation for database select field");
1428 		ExportDataBaseElement(XML_DATABASE_ROW_SELECT, OUString(),
1429                               rPropSet, xPropSetInfo);
1430 		break;
1431 
1432 	case FIELD_ID_DATABASE_DISPLAY:
1433 	{
1434 		// get database, table and column name from field master
1435 		const Reference<XPropertySet> & xMaster = GetMasterPropertySet(rTextField);
1436 		ProcessString(XML_TABLE_NAME,
1437 					  GetStringProperty(sPropertyDataTableName, xMaster));
1438         ProcessCommandType(GetIntProperty(sPropertyDataCommandType, xMaster));
1439 		ProcessString(XML_COLUMN_NAME,
1440 					  GetStringProperty(sPropertyDataColumnName, xMaster));
1441 		// export number format if available (happens only for numbers!)
1442 		if (!GetBoolProperty(sPropertyIsDataBaseFormat, rPropSet))
1443 		{
1444 			ProcessValueAndType(sal_False,	// doesn't happen for text
1445 								GetIntProperty(sPropertyNumberFormat,rPropSet),
1446 								sEmpty, sEmpty, 0.0, // not used
1447 								sal_False, sal_False, sal_True, sal_False);
1448 		}
1449 		ProcessDisplay(GetBoolProperty(sPropertyIsVisible, rPropSet),
1450 					   sal_False);
1451 		ExportDataBaseElement(XML_DATABASE_DISPLAY, sPresentation,
1452                               xMaster, xMaster->getPropertySetInfo());
1453 		break;
1454 	}
1455 
1456 	case FIELD_ID_DOCINFO_REVISION:
1457 		ProcessBoolean(XML_FIXED,
1458 					   GetBoolProperty(sPropertyIsFixed, rPropSet), sal_False);
1459 		ExportElement(MapDocInfoFieldName(nToken), sPresentation);
1460 		break;
1461 
1462 	case FIELD_ID_DOCINFO_EDIT_DURATION:
1463 	case FIELD_ID_DOCINFO_SAVE_TIME:
1464 	case FIELD_ID_DOCINFO_CREATION_TIME:
1465 	case FIELD_ID_DOCINFO_PRINT_TIME:
1466 	case FIELD_ID_DOCINFO_SAVE_DATE:
1467 	case FIELD_ID_DOCINFO_CREATION_DATE:
1468 	case FIELD_ID_DOCINFO_PRINT_DATE:
1469 		ProcessValueAndType(sal_False,
1470 							GetIntProperty(sPropertyNumberFormat, rPropSet),
1471 							sEmpty, sEmpty, 0.0,
1472 							sal_False, sal_False, sal_True,
1473                             ! GetOptionalBoolProperty(
1474                                     sPropertyIsFixedLanguage,
1475                                     rPropSet, xPropSetInfo, sal_False ) );
1476 
1477 		// todo: export date/time value, but values not available -> core bug
1478 		ProcessBoolean(XML_FIXED,
1479 					   GetBoolProperty(sPropertyIsFixed, rPropSet), sal_False);
1480 		ExportElement(MapDocInfoFieldName(nToken), sPresentation);
1481 		break;
1482 
1483 	case FIELD_ID_DOCINFO_CREATION_AUTHOR:
1484 	case FIELD_ID_DOCINFO_DESCRIPTION:
1485 	case FIELD_ID_DOCINFO_PRINT_AUTHOR:
1486 	case FIELD_ID_DOCINFO_TITLE:
1487 	case FIELD_ID_DOCINFO_SUBJECT:
1488 	case FIELD_ID_DOCINFO_KEYWORDS:
1489 	case FIELD_ID_DOCINFO_SAVE_AUTHOR:
1490 		if (xPropSetInfo->hasPropertyByName(sPropertyIsFixed))
1491 		{
1492 			ProcessBoolean(XML_FIXED,
1493 						   GetBoolProperty(sPropertyIsFixed, rPropSet), sal_False);
1494 		}
1495 		ExportElement(MapDocInfoFieldName(nToken), sPresentation);
1496 		break;
1497 
1498 	case FIELD_ID_DOCINFO_CUSTOM:
1499 	{
1500         ProcessValueAndType(sal_False,	// doesn't happen for text
1501 								GetIntProperty(sPropertyNumberFormat,rPropSet),
1502 								sEmpty, sEmpty, 0.0, // not used
1503 								sal_False, sal_False, sal_True,
1504                                 ! GetOptionalBoolProperty(
1505                                     sPropertyIsFixedLanguage,
1506                                     rPropSet, xPropSetInfo, sal_False ));
1507 		uno::Any aAny = rPropSet->getPropertyValue( sPropertyName );
1508 		::rtl::OUString sName;
1509 		aAny >>= sName;
1510 		ProcessString(XML_NAME, sName);
1511 		ProcessBoolean(XML_FIXED, GetBoolProperty(sPropertyIsFixed, rPropSet), sal_False);
1512 		ExportElement(XML_USER_DEFINED, sPresentation);
1513 		break;
1514 	}
1515 
1516 	case FIELD_ID_COUNT_PAGES:
1517 	case FIELD_ID_COUNT_PARAGRAPHS:
1518 	case FIELD_ID_COUNT_WORDS:
1519 	case FIELD_ID_COUNT_CHARACTERS:
1520 	case FIELD_ID_COUNT_TABLES:
1521 	case FIELD_ID_COUNT_GRAPHICS:
1522 	case FIELD_ID_COUNT_OBJECTS:
1523 		// all properties optional (applies to pages only, but I'll do
1524 		// it for all for sake of common implementation)
1525 		if (xPropSetInfo->hasPropertyByName(sPropertyNumberingType))
1526 		{
1527 			ProcessNumberingType(GetInt16Property(sPropertyNumberingType,
1528 												  rPropSet));
1529 		}
1530 		ExportElement(MapCountFieldName(nToken), sPresentation);
1531 		break;
1532 
1533 	case FIELD_ID_CONDITIONAL_TEXT:
1534 		ProcessString(XML_CONDITION, XML_NAMESPACE_OOOW,
1535 					  GetStringProperty(sPropertyCondition, rPropSet));
1536 		ProcessString(XML_STRING_VALUE_IF_TRUE,
1537 					  GetStringProperty(sPropertyTrueContent, rPropSet));
1538 		ProcessString(XML_STRING_VALUE_IF_FALSE,
1539 					  GetStringProperty(sPropertyFalseContent, rPropSet));
1540 		ProcessBoolean(XML_CURRENT_VALUE,
1541 					   GetBoolProperty(sPropertyIsConditionTrue, rPropSet),
1542 					   sal_False);
1543 		ExportElement(XML_CONDITIONAL_TEXT, sPresentation);
1544 		break;
1545 
1546 	case FIELD_ID_HIDDEN_TEXT:
1547 		ProcessString(XML_CONDITION, XML_NAMESPACE_OOOW,
1548 					  GetStringProperty(sPropertyCondition, rPropSet));
1549 		ProcessString(XML_STRING_VALUE,
1550 					  GetStringProperty(sPropertyContent, rPropSet));
1551 		ProcessBoolean(XML_IS_HIDDEN,
1552 					   GetBoolProperty(sPropertyIsHidden, rPropSet),
1553 					   sal_False);
1554 		ExportElement(XML_HIDDEN_TEXT, sPresentation);
1555 		break;
1556 
1557 	case FIELD_ID_HIDDEN_PARAGRAPH:
1558 		ProcessString(XML_CONDITION, XML_NAMESPACE_OOOW,
1559 					  GetStringProperty(sPropertyCondition, rPropSet));
1560 		ProcessBoolean(XML_IS_HIDDEN,
1561 					   GetBoolProperty(sPropertyIsHidden, rPropSet),
1562 					   sal_False);
1563 		DBG_ASSERT(sPresentation.equals(sEmpty),
1564 				   "Unexpected presentation for hidden paragraph field");
1565 		ExportElement(XML_HIDDEN_PARAGRAPH);
1566 		break;
1567 
1568 	case FIELD_ID_TEMPLATE_NAME:
1569 		ProcessString(XML_DISPLAY,
1570 					  MapTemplateDisplayFormat(
1571 						  GetInt16Property(sPropertyFileFormat, rPropSet)));
1572 		ExportElement(XML_TEMPLATE_NAME, sPresentation);
1573 		break;
1574 
1575 	case FIELD_ID_CHAPTER:
1576 		ProcessString(XML_DISPLAY,
1577 					  MapChapterDisplayFormat(
1578 						  GetInt16Property(sPropertyChapterFormat, rPropSet)));
1579 		// API numbers 0..9, we number 1..10
1580 		ProcessInteger(XML_OUTLINE_LEVEL,
1581 					   GetInt8Property(sPropertyLevel, rPropSet) + 1);
1582 		ExportElement(XML_CHAPTER, sPresentation);
1583 		break;
1584 
1585 	case FIELD_ID_FILE_NAME:
1586 		// all properties are optional
1587 		if (xPropSetInfo->hasPropertyByName(sPropertyFileFormat))
1588 		{
1589 			ProcessString(XML_DISPLAY,
1590 						  MapFilenameDisplayFormat(
1591 							 GetInt16Property(sPropertyFileFormat, rPropSet)));
1592 		}
1593 		if (xPropSetInfo->hasPropertyByName(sPropertyIsFixed))
1594 		{
1595 			ProcessBoolean(XML_FIXED,
1596 						   GetBoolProperty(sPropertyIsFixed, rPropSet),
1597 						   sal_False);
1598 		}
1599 		ExportElement(XML_FILE_NAME, sPresentation);
1600 		break;
1601 
1602 	case FIELD_ID_REFPAGE_SET:
1603 		ProcessBoolean(XML_ACTIVE,
1604 					   GetBoolProperty(sPropertyOn, rPropSet), sal_True);
1605 		ProcessIntegerDef(XML_PAGE_ADJUST,
1606 					   GetInt16Property(sPropertyOffset, rPropSet), 0);
1607 		DBG_ASSERT(sPresentation.equals(sEmpty),
1608 				   "Unexpected presentation page variable field");
1609 		ExportElement(XML_PAGE_VARIABLE_SET);
1610 		break;
1611 
1612 	case FIELD_ID_REFPAGE_GET:
1613 		ProcessNumberingType(
1614 			GetInt16Property(sPropertyNumberingType, rPropSet));
1615 		ExportElement(XML_PAGE_VARIABLE_GET, sPresentation);
1616 		break;
1617 
1618 	case FIELD_ID_MACRO:
1619         ExportMacro( rPropSet, sPresentation );
1620 		break;
1621 
1622 	case FIELD_ID_REF_SEQUENCE:
1623 		// reference to sequence: format, name, find value (and element)
1624 		// was: if (nSeqNumber != -1) ...
1625 		ProcessString(XML_REFERENCE_FORMAT,
1626 					  MapReferenceType(GetInt16Property(
1627 						  sPropertyReferenceFieldPart, rPropSet)),
1628 					  XML_TEMPLATE);
1629 		ProcessString(XML_REF_NAME,
1630 					  MakeSequenceRefName(
1631 						  GetInt16Property(sPropertySequenceNumber, rPropSet),
1632 						  GetStringProperty(sPropertySourceName, rPropSet) ) );
1633 		ExportElement(
1634 			MapReferenceSource(
1635 				GetInt16Property(sPropertyReferenceFieldSource, rPropSet)),
1636 			sPresentation);
1637 		break;
1638 
1639 	case FIELD_ID_REF_REFERENCE:
1640 	case FIELD_ID_REF_BOOKMARK:
1641 		// reference to bookmarks, references: format, name (and element)
1642 		ProcessString(XML_REFERENCE_FORMAT,
1643 					  MapReferenceType(GetInt16Property(
1644 						  sPropertyReferenceFieldPart, rPropSet)),
1645 					  XML_TEMPLATE);
1646 		ProcessString(XML_REF_NAME,
1647 					  GetStringProperty(sPropertySourceName, rPropSet));
1648 		ExportElement(
1649 			MapReferenceSource(GetInt16Property(
1650 				sPropertyReferenceFieldSource, rPropSet)),
1651 			sPresentation);
1652 		break;
1653 
1654 	case FIELD_ID_REF_FOOTNOTE:
1655 	case FIELD_ID_REF_ENDNOTE:
1656 		// reference to end-/footnote: format, generate name, (and element)
1657 		GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_NOTE_CLASS,
1658 			FIELD_ID_REF_ENDNOTE==nToken ? XML_ENDNOTE : XML_FOOTNOTE );
1659 		ProcessString(XML_REFERENCE_FORMAT,
1660 					  MapReferenceType(GetInt16Property(
1661 						  sPropertyReferenceFieldPart, rPropSet)),
1662 					  XML_TEMPLATE);
1663 		ProcessString(XML_REF_NAME,
1664 					  MakeFootnoteRefName(GetInt16Property(
1665 						  sPropertySequenceNumber, rPropSet)));
1666 		ExportElement(
1667 			MapReferenceSource(GetInt16Property(
1668 				sPropertyReferenceFieldSource, rPropSet)),
1669 			sPresentation);
1670 		break;
1671 
1672 	case FIELD_ID_DDE:
1673 		// name from field master
1674  		ProcessString(XML_CONNECTION_NAME,
1675 
1676  					  GetStringProperty(sPropertyName,
1677  										GetMasterPropertySet(rTextField)));
1678 		ExportElement(XML_DDE_CONNECTION, sPresentation);
1679 		break;
1680 
1681 	case FIELD_ID_SHEET_NAME:
1682 		// name of spreadsheet (Calc only)
1683 		ExportElement(XML_SHEET_NAME, sPresentation);
1684 		break;
1685 
1686 	case FIELD_ID_URL:
1687 	{
1688 		// this field is a special case because it gets mapped onto a
1689 		// hyperlink, rather than one of the regular text field.
1690 		ProcessString(XML_HREF, GetExport().GetRelativeReference(GetStringProperty(sPropertyURL, rPropSet)),
1691 					  sal_False, XML_NAMESPACE_XLINK);
1692 		ProcessString(XML_TARGET_FRAME_NAME,
1693 					  GetStringProperty(sPropertyTargetFrame,rPropSet),
1694 					  sal_True, XML_NAMESPACE_OFFICE);
1695 		SvXMLElementExport aUrlField(rExport, XML_NAMESPACE_TEXT, XML_A,
1696 									 sal_False, sal_False);
1697 		GetExport().Characters(sPresentation);
1698 		break;
1699 	}
1700 
1701 	case FIELD_ID_BIBLIOGRAPHY:
1702 	{
1703 		ProcessBibliographyData(rPropSet);
1704 		ExportElement(XML_BIBLIOGRAPHY_MARK, sPresentation);
1705 		break;
1706 	}
1707 
1708 	case FIELD_ID_SCRIPT:
1709 		ProcessString(XML_LANGUAGE,
1710 					  GetStringProperty(sPropertyScriptType, rPropSet),
1711 					  sal_True, XML_NAMESPACE_SCRIPT);
1712 		DBG_ASSERT(sPresentation.equals(sEmpty),
1713 				   "Unexpected presentation for script field");
1714 		if (GetBoolProperty(sPropertyURLContent, rPropSet))
1715 		{
1716 			ProcessString(XML_HREF,
1717 						  GetExport().GetRelativeReference(GetStringProperty(sPropertyContent, rPropSet)),
1718 						  sal_False, XML_NAMESPACE_XLINK);
1719 			ExportElement(XML_SCRIPT);
1720 		}
1721 		else
1722 		{
1723 			ExportElement(XML_SCRIPT,
1724 						  GetStringProperty(sPropertyContent, rPropSet));
1725 		}
1726 		break;
1727 
1728 	case FIELD_ID_ANNOTATION:
1729 	{
1730 		// check for empty presentation (just in case)
1731 		DBG_ASSERT(sPresentation.equals(sEmpty),
1732 				   "Unexpected presentation for annotation field");
1733 
1734         // annotation element + content
1735         OUString aAnnotationName;
1736         rPropSet->getPropertyValue(sPropertyName) >>= aAnnotationName;
1737         if ( aAnnotationName.getLength() > 0 )
1738         {
1739             GetExport().AddAttribute( XML_NAMESPACE_OFFICE, XML_NAME, aAnnotationName );
1740         }
1741         SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_OFFICE, XML_ANNOTATION, sal_False, sal_True );
1742 
1743 		// author
1744 		OUString aAuthor( GetStringProperty(sPropertyAuthor, rPropSet) );
1745 		if ( aAuthor.getLength() > 0 )
1746 		{
1747 			SvXMLElementExport aCreatorElem( GetExport(), XML_NAMESPACE_DC,
1748 											  XML_CREATOR, sal_True,
1749 											  sal_False );
1750 			GetExport().Characters(aAuthor);
1751 		}
1752 
1753 		// date time
1754 		DateTime aDate( GetDateTimeProperty(sPropertyDateTimeValue, rPropSet) );
1755 		{
1756 			OUStringBuffer aBuffer;
1757 			GetExport().GetMM100UnitConverter().convertDateTime(aBuffer,
1758 																aDate,
1759 																sal_True);
1760 			SvXMLElementExport aDateElem( GetExport(), XML_NAMESPACE_DC,
1761 											  XML_DATE, sal_True,
1762 											  sal_False );
1763 			GetExport().Characters(aBuffer.makeStringAndClear());
1764 		}
1765 
1766         // initials
1767         if ( GetExport().getDefaultVersion() > SvtSaveOptions::ODFVER_012 )
1768         {
1769             OUString aInitials( GetStringProperty(sPropertyInitials, rPropSet) );
1770             if ( aInitials.getLength() > 0 )
1771             {
1772                 SvXMLElementExport aCreatorElem(
1773                     GetExport(),
1774                     XML_NAMESPACE_TEXT_EXT,
1775                     XML_SENDER_INITIALS,
1776                     sal_True,
1777                     sal_False );
1778                 GetExport().Characters(aInitials);
1779             }
1780         }
1781 
1782 		com::sun::star::uno::Reference < com::sun::star::text::XText > xText;
1783 		try
1784 		{
1785 			com::sun::star::uno::Any aRet = rPropSet->getPropertyValue(sPropertyTextRange);
1786 			aRet >>= xText;
1787 		}
1788 		catch ( com::sun::star::uno::Exception& )
1789 		{}
1790 
1791 		if ( xText.is() )
1792 			GetExport().GetTextParagraphExport()->exportText( xText );
1793 		else
1794 			ProcessParagraphSequence(GetStringProperty(sPropertyContent,rPropSet));
1795 		break;
1796 	}
1797 
1798 	case FIELD_ID_COMBINED_CHARACTERS:
1799 	{
1800         // The style with the combined characters attribute has
1801         // already been handled in the ExportField method. So all that
1802         // is left to do now is to export the characters.
1803 		GetExport().Characters(sPresentation);
1804 		break;
1805 	}
1806 
1807     case FIELD_ID_META:
1808     {
1809         ExportMetaField(rPropSet, false, bProgress);
1810         break;
1811     }
1812 
1813 	case FIELD_ID_MEASURE:
1814 	{
1815 		ProcessString(XML_KIND, MapMeasureKind(GetInt16Property(sPropertyMeasureKind, rPropSet)));
1816 		ExportElement( XML_MEASURE, sPresentation );
1817 		break;
1818 	}
1819 
1820     case FIELD_ID_TABLE_FORMULA:
1821         ProcessString( XML_FORMULA,  XML_NAMESPACE_OOOW,
1822                        GetStringProperty(sPropertyContent, rPropSet) );
1823 		ProcessDisplay( sal_True,
1824                         GetBoolProperty(sPropertyIsShowFormula, rPropSet),
1825                         sal_True );
1826 		ProcessValueAndType( sal_False,
1827                              GetIntProperty(sPropertyNumberFormat, rPropSet),
1828                              sEmpty, sEmpty, 0.0f,
1829                              sal_False, sal_False, sal_True,
1830                              sal_False, sal_False );
1831         ExportElement( XML_TABLE_FORMULA, sPresentation );
1832         break;
1833 
1834     case FIELD_ID_DROP_DOWN:
1835     {
1836 		ProcessString(XML_NAME, GetStringProperty(sPropertyName, rPropSet));
1837         ProcessString(XML_HELP,
1838                       GetStringProperty(sPropertyHelp, rPropSet), true);
1839         ProcessString(XML_HINT,
1840                       GetStringProperty(sPropertyTooltip, rPropSet), true);
1841         SvXMLElementExport aElem( GetExport(),
1842                                   XML_NAMESPACE_TEXT, XML_DROPDOWN,
1843                                   sal_False, sal_False );
1844         ProcessStringSequence
1845             (GetStringSequenceProperty( sPropertyItems, rPropSet ),
1846              GetStringProperty( sPropertySelectedItem, rPropSet ) );
1847 
1848         GetExport().Characters( sPresentation );
1849     }
1850     break;
1851 
1852 	case FIELD_ID_DRAW_HEADER:
1853 	{
1854         SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_PRESENTATION, XML_HEADER, sal_False, sal_False );
1855 	}
1856 	break;
1857 
1858 	case FIELD_ID_DRAW_FOOTER:
1859 	{
1860         SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_PRESENTATION, XML_FOOTER, sal_False, sal_False );
1861 	}
1862 	break;
1863 
1864 	case FIELD_ID_DRAW_DATE_TIME:
1865 	{
1866         SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_PRESENTATION, XML_DATE_TIME, sal_False, sal_False );
1867 	}
1868 	break;
1869 
1870 	case FIELD_ID_UNKNOWN:
1871 	default:
1872 		DBG_ERROR("unknown field type encountered!");
1873 		// always export content
1874 		GetExport().Characters(sPresentation);
1875 	}
1876 }
1877 
1878 
1879 /// export field declarations / field masters
ExportFieldDeclarations()1880 void XMLTextFieldExport::ExportFieldDeclarations()
1881 {
1882 	Reference<XText> xEmptyText;
1883 	ExportFieldDeclarations(xEmptyText);
1884 }
1885 
1886 /// export field declarations / field masters
ExportFieldDeclarations(const Reference<XText> & rText)1887 void XMLTextFieldExport::ExportFieldDeclarations(
1888 	const Reference<XText> & rText )
1889 {
1890 	// store lists for decl elements
1891 	vector<OUString> 					aVarName;
1892 	vector<OUString>					aUserName;
1893 	vector<OUString>					aSeqName;
1894 	vector<OUString>					aDdeName;
1895 
1896 	// get text fields supplier and field master name access
1897 	Reference<XTextFieldsSupplier> xTextFieldsSupp(GetExport().GetModel(),
1898 												   UNO_QUERY);
1899 	if( !xTextFieldsSupp.is() )
1900 		return;
1901 
1902 	Reference<container::XNameAccess> xFieldMasterNameAccess(
1903 		xTextFieldsSupp->getTextFieldMasters(), UNO_QUERY);
1904 
1905 	// where to get the text field masters from?
1906 	// a) we get a specific XText: then use pUsedMasters
1907 	// b) the XText is empty: then export all text fields
1908 	Sequence<OUString> aFieldMasters;
1909 	if (rText.is())
1910 	{
1911 		// export only used masters
1912 		DBG_ASSERT(NULL != pUsedMasters,
1913 				   "field masters must be recorded in order to be "
1914 				   "written out separatly" );
1915 		if (NULL != pUsedMasters)
1916 		{
1917 			map<Reference<XText>, set<OUString> > ::iterator aMapIter =
1918 				pUsedMasters->find(rText);
1919 			if (aMapIter != pUsedMasters->end())
1920 			{
1921 				// found the set of used field masters
1922 				set<OUString> & rOurMasters = aMapIter->second;
1923 
1924 				// copy set to sequence
1925 				aFieldMasters.realloc( rOurMasters.size() );
1926 				sal_Int32 i = 0;
1927 				for( set<OUString>::iterator aSetIter = rOurMasters.begin();
1928 					 aSetIter != rOurMasters.end();
1929 					 aSetIter++, i++ )
1930 				{
1931 					aFieldMasters[i] = *aSetIter;
1932 				}
1933 
1934 				pUsedMasters->erase(rText);
1935 			}
1936 			// else: XText not found -> ignore
1937 		}
1938 		// else: no field masters have been recorded -> ignore
1939 	}
1940 	else
1941 	{
1942 		// no XText: export all!
1943 		aFieldMasters = xFieldMasterNameAccess->getElementNames();
1944 	}
1945 
1946 	for(sal_Int32 i=0; i<aFieldMasters.getLength(); i++) {
1947 
1948 		// get field master name
1949 		OUString sFieldMaster = aFieldMasters[i];
1950 
1951 		// workaround for #no-bug#
1952 		static const sal_Char sDB[] =
1953 			"com.sun.star.text.FieldMaster.DataBase.";
1954 		if ( sFieldMaster.matchIgnoreAsciiCaseAsciiL( sDB, sizeof(sDB)-1) )
1955 		{
1956 			continue;
1957 		}
1958 
1959 
1960 		OUString sFieldMasterType;
1961 		OUString sVarName;
1962 		ExplodeFieldMasterName(sFieldMaster, sFieldMasterType, sVarName);
1963 
1964 		// get XPropertySet of this field master
1965 		Reference<XPropertySet> xPropSet;
1966 		Any aAny = xFieldMasterNameAccess->getByName(sFieldMaster);
1967 		aAny >>= xPropSet;
1968 
1969 		// save interesting field masters
1970 		if (0 == sFieldMasterType.compareToAscii(FIELD_SERVICE_SETEXP))
1971 		{
1972 			sal_Int32 nType = GetIntProperty(sPropertySubType, xPropSet);
1973 
1974 			// sequence or variable?
1975 			if ( SetVariableType::SEQUENCE == nType )
1976 			{
1977 				aSeqName.push_back( sFieldMaster );
1978 			}
1979 			else
1980 			{
1981 				aVarName.push_back( sFieldMaster );
1982 			}
1983 		}
1984 		else if (0 == sFieldMasterType.compareToAscii(FIELD_SERVICE_USER))
1985 		{
1986 			aUserName.push_back( sFieldMaster );
1987 		}
1988 		else if (0 == sFieldMasterType.compareToAscii(FIELD_SERVICE_DDE))
1989 		{
1990 			aDdeName.push_back( sFieldMaster );
1991 		}
1992 		else
1993 		{
1994 			; // ignore
1995 		}
1996 	}
1997 
1998 	// now process fields:
1999 
2000 	// variable field masters:
2001 	if ( !aVarName.empty() )
2002 	{
2003 		SvXMLElementExport aElem( GetExport(),
2004 								  XML_NAMESPACE_TEXT,
2005 								  XML_VARIABLE_DECLS,
2006 								  sal_True, sal_True );
2007 
2008 		for (vector<OUString>::iterator aVarIter = aVarName.begin();
2009 			 aVarIter != aVarName.end();
2010 			 aVarIter++) {
2011 
2012 			OUString sName = *aVarIter;
2013 
2014 			// get field master property set
2015 			Reference<XPropertySet> xPropSet;
2016 			Any aAny = xFieldMasterNameAccess->getByName(sName);
2017 			aAny >>= xPropSet;
2018 
2019 			// field name and type
2020 			OUString sFieldMasterType;
2021 			OUString sVarName;
2022 			ExplodeFieldMasterName(sName, sFieldMasterType, sVarName);
2023 
2024 			// determine string/numeric field
2025 			sal_Bool bIsString = ( GetIntProperty(sPropertySubType, xPropSet)
2026 								   == SetVariableType::STRING );
2027 
2028 			// get dependent field property set
2029 			Reference<XPropertySet> xFieldPropSet;
2030 			if (GetDependentFieldPropertySet(xPropSet, xFieldPropSet))
2031 			{
2032 				// process value and type.
2033 				ProcessValueAndType(
2034 					bIsString,
2035 					GetIntProperty(sPropertyNumberFormat, xFieldPropSet),
2036 					sEmpty, sEmpty, 0.0,
2037 					sal_False, sal_True, sal_False, sal_False);
2038 			}
2039 			else
2040 			{
2041 				// If no dependent field is found, only string and
2042 				// float types can be supported
2043 
2044 				// number format: 0 is default number format for 1st
2045 				// language. should be: getDefaultNumberFormat(Locale)
2046 				// from NumberFormats
2047 				ProcessValueAndType(
2048 					bIsString,
2049 					0, sEmpty, sEmpty, 0.0,
2050 					sal_False, sal_True, sal_False, sal_False);
2051 			}
2052 
2053 			ProcessString(XML_NAME, sVarName);
2054 			ExportElement(XML_VARIABLE_DECL, sal_True);
2055 		}
2056 	}
2057 	// else: no declarations element
2058 
2059 	// sequence field masters:
2060 	if ( !aSeqName.empty() )
2061 	{
2062 		SvXMLElementExport aElem( GetExport(),
2063 								  XML_NAMESPACE_TEXT,
2064 								  XML_SEQUENCE_DECLS,
2065 								  sal_True, sal_True );
2066 
2067 		for (vector<OUString>::iterator aSeqIter = aSeqName.begin();
2068 			 aSeqIter != aSeqName.end();
2069 			 aSeqIter++) {
2070 
2071 			OUString sName = *aSeqIter;
2072 
2073 			// get field master property set
2074 			Reference<XPropertySet> xPropSet;
2075 			Any aAny = xFieldMasterNameAccess->getByName(sName);
2076 			aAny >>= xPropSet;
2077 
2078 			// field name and type
2079 			OUString sFieldMasterType;
2080 			OUString sVarName;
2081 			ExplodeFieldMasterName(sName, sFieldMasterType, sVarName);
2082 
2083 			// outline level
2084 			sal_Int32 nLevel = 1 + GetIntProperty(
2085 				sPropertyChapterNumberingLevel, xPropSet);
2086 			DBG_ASSERT(nLevel >= 0, "illegal outline level");
2087 			DBG_ASSERT(nLevel < 127, "possible illegal outline level");
2088 			ProcessInteger(XML_DISPLAY_OUTLINE_LEVEL, nLevel);
2089 
2090 			// separation character
2091 			if (nLevel > 0) {
2092 				ProcessString(XML_SEPARATION_CHARACTER, GetStringProperty(
2093 					sPropertyNumberingSeparator, xPropSet));
2094 			}
2095 			ProcessString(XML_NAME, sVarName);
2096 			ExportElement(XML_SEQUENCE_DECL, sal_True);
2097 		}
2098 	}
2099 	// else: no declarations element
2100 
2101 	// user field field masters:
2102 	if ( !aUserName.empty() )
2103 	{
2104 		SvXMLElementExport aElem( GetExport(),
2105 								  XML_NAMESPACE_TEXT,
2106 								  XML_USER_FIELD_DECLS,
2107 								  sal_True, sal_True );
2108 
2109 		for (vector<OUString>::iterator aUserIter = aUserName.begin();
2110 			 aUserIter != aUserName.end();
2111 			 aUserIter++) {
2112 
2113 			OUString sName = *aUserIter;
2114 
2115 			// get field master property set
2116 			Reference<XPropertySet> xPropSet;
2117 			Any aAny = xFieldMasterNameAccess->getByName(sName);
2118 			aAny >>= xPropSet;
2119 
2120 			// field name and type
2121 			OUString sFieldMasterType;
2122 			OUString sVarName;
2123 			ExplodeFieldMasterName(sName, sFieldMasterType, sVarName);
2124 
2125 			if (GetBoolProperty(sPropertyIsExpression, xPropSet))
2126 			{
2127 				// expression:
2128 				ProcessValueAndType(
2129 					sal_False,
2130 					0, sEmpty, sEmpty,
2131 					GetDoubleProperty(sPropertyValue, xPropSet),
2132 					sal_True,
2133 					sal_True,
2134 					sal_False,
2135                     sal_False);
2136 			}
2137 			else
2138 			{
2139 				// string: write regardless of default
2140 				ProcessString(XML_VALUE_TYPE, XML_STRING, sal_False,
2141 							  XML_NAMESPACE_OFFICE);
2142 				ProcessString(XML_STRING_VALUE,
2143 							  GetStringProperty(sPropertyContent, xPropSet),
2144 							  sal_False, XML_NAMESPACE_OFFICE );
2145 			}
2146 			ProcessString(XML_NAME, sVarName);
2147 			ExportElement(XML_USER_FIELD_DECL, sal_True);
2148 		}
2149 	}
2150 	// else: no declarations element
2151 
2152 	// DDE field field masters:
2153 	if ( !aDdeName.empty() )
2154 	{
2155 		SvXMLElementExport aElem( GetExport(),
2156 								  XML_NAMESPACE_TEXT,
2157 								  XML_DDE_CONNECTION_DECLS,
2158 								  sal_True, sal_True );
2159 
2160 		for (vector<OUString>::iterator aDdeIter = aDdeName.begin();
2161 			 aDdeIter != aDdeName.end();
2162 			 aDdeIter++)
2163 		{
2164 			OUString sName = *aDdeIter;
2165 
2166 			// get field master property set
2167 			Reference<XPropertySet> xPropSet;
2168 			Any aAny = xFieldMasterNameAccess->getByName(sName);
2169 			aAny >>= xPropSet;
2170 
2171 			// check if this connection is being used by a field
2172 			Reference<XPropertySet> xDummy;
2173 			if (GetDependentFieldPropertySet(xPropSet, xDummy))
2174 			{
2175 
2176 				ProcessString(XML_NAME,
2177 							  GetStringProperty(sPropertyName, xPropSet),
2178 							  sal_False, XML_NAMESPACE_OFFICE);
2179 
2180 				// export elements; can't use ProcessString because
2181 				// elements are in office namespace
2182 				ProcessString(XML_DDE_APPLICATION,
2183 							  GetStringProperty(sPropertyDDECommandType,
2184 												xPropSet),
2185 							  sal_False, XML_NAMESPACE_OFFICE);
2186 				ProcessString(XML_DDE_TOPIC,
2187 							  GetStringProperty(sPropertyDDECommandFile,
2188 												xPropSet),
2189 							  sal_False, XML_NAMESPACE_OFFICE);
2190 				ProcessString(XML_DDE_ITEM,
2191 							  GetStringProperty(sPropertyDDECommandElement,
2192 												xPropSet),
2193 							  sal_False, XML_NAMESPACE_OFFICE);
2194 				sal_Bool bIsAutomaticUpdate = GetBoolProperty(
2195 					sPropertyIsAutomaticUpdate, xPropSet);
2196 				if (bIsAutomaticUpdate)
2197 				{
2198 					GetExport().AddAttribute(XML_NAMESPACE_OFFICE,
2199                                              XML_AUTOMATIC_UPDATE,
2200                                              XML_TRUE);
2201 				}
2202 
2203 				ExportElement(XML_DDE_CONNECTION_DECL, sal_True);
2204 			}
2205 			// else: no dependent field -> no export of field declaration
2206 		}
2207 	}
2208 	// else: no declarations element
2209 }
2210 
SetExportOnlyUsedFieldDeclarations(sal_Bool bExportOnlyUsed)2211 void XMLTextFieldExport::SetExportOnlyUsedFieldDeclarations(
2212 	sal_Bool bExportOnlyUsed)
2213 {
2214 	delete pUsedMasters;
2215 	pUsedMasters = NULL;
2216 
2217 	// create used masters set (if none is used)
2218 	if (bExportOnlyUsed)
2219 		pUsedMasters = new map<Reference<XText>, set<OUString> > ;
2220 }
2221 
ExportElement(enum XMLTokenEnum eElementName,sal_Bool bAddSpace)2222 void XMLTextFieldExport::ExportElement(enum XMLTokenEnum eElementName,
2223 									   sal_Bool bAddSpace)
2224 {
2225 	// can't call ExportElement(eElementName, const OUString&) with empty
2226 	// string because xmlprinter only uses empty tags if no content
2227 	// (not even empty content) was written.
2228 
2229 	DBG_ASSERT(XML_TOKEN_INVALID != eElementName, "invalid element name!");
2230 	if (XML_TOKEN_INVALID != eElementName)
2231 	{
2232 		// Element
2233 		SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT,
2234 								  eElementName, bAddSpace, bAddSpace );
2235 	} // else: ignore
2236 }
2237 
ExportElement(enum XMLTokenEnum eElementName,const OUString & sContent,sal_Bool bAddSpace)2238 void XMLTextFieldExport::ExportElement(enum XMLTokenEnum eElementName,
2239 									   const OUString& sContent,
2240 									   sal_Bool bAddSpace)
2241 {
2242 	DBG_ASSERT(eElementName != XML_TOKEN_INVALID, "invalid element name!");
2243 	if (eElementName != XML_TOKEN_INVALID)
2244 	{
2245 		// Element
2246 		SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT,
2247 								  eElementName, bAddSpace, bAddSpace );
2248 		// export content
2249 		GetExport().Characters(sContent);
2250 	} else {
2251 		// always export content
2252 		GetExport().Characters(sContent);
2253 	}
2254 }
2255 
ExportMacro(const Reference<XPropertySet> & rPropSet,const OUString & rContent)2256 void XMLTextFieldExport::ExportMacro(
2257     const Reference<XPropertySet> & rPropSet,
2258     const OUString& rContent )
2259 {
2260     // some strings we'll need
2261     OUString sEventType( RTL_CONSTASCII_USTRINGPARAM( "EventType" ));
2262     OUString sStarBasic( RTL_CONSTASCII_USTRINGPARAM( "StarBasic" ));
2263     OUString sScript( RTL_CONSTASCII_USTRINGPARAM( "Script" ));
2264     OUString sLibrary( RTL_CONSTASCII_USTRINGPARAM( "Library" ));
2265     OUString sMacroName( RTL_CONSTASCII_USTRINGPARAM( "MacroName" ));
2266     OUString sOnClick( RTL_CONSTASCII_USTRINGPARAM( "OnClick" ));
2267     OUString sPropertyMacroLibrary( RTL_CONSTASCII_USTRINGPARAM( "MacroLibrary" ));
2268     OUString sPropertyMacroName( RTL_CONSTASCII_USTRINGPARAM( "MacroName" ));
2269     OUString sPropertyScriptURL( RTL_CONSTASCII_USTRINGPARAM( "ScriptURL" ));
2270 
2271 
2272     // the description attribute
2273     ProcessString(XML_DESCRIPTION,
2274                   GetStringProperty(sPropertyHint, rPropSet),
2275                   rContent);
2276 
2277     // the element
2278     SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT,
2279                               XML_EXECUTE_MACRO, sal_False, sal_False );
2280 
2281     // the <office:events>-macro:
2282 
2283     // 1) build sequence of PropertyValues
2284     Sequence<PropertyValue> aSeq;
2285     OUString sName;
2286     rPropSet->getPropertyValue( sPropertyScriptURL ) >>= sName;
2287 
2288     // if the ScriptURL property is not empty then this is a Scripting
2289     // Framework URL, otherwise treat it as a Basic Macro
2290     if (sName.getLength() != 0)
2291     {
2292         aSeq = Sequence<PropertyValue> (2);
2293         PropertyValue* pArr = aSeq.getArray();
2294         pArr[0].Name = sEventType;
2295         pArr[0].Value <<= sScript;
2296         pArr[1].Name = sScript;
2297         pArr[1].Value = rPropSet->getPropertyValue( sPropertyScriptURL );
2298     }
2299     else
2300     {
2301         aSeq = Sequence<PropertyValue> (3);
2302         PropertyValue* pArr = aSeq.getArray();
2303         pArr[0].Name = sEventType;
2304         pArr[0].Value <<= sStarBasic;
2305         pArr[1].Name = sLibrary;
2306         pArr[1].Value = rPropSet->getPropertyValue( sPropertyMacroLibrary );
2307         pArr[2].Name = sMacroName;
2308         pArr[2].Value = rPropSet->getPropertyValue( sPropertyMacroName );
2309     }
2310 
2311     // 2) export the sequence
2312     GetExport().GetEventExport().ExportSingleEvent( aSeq, sOnClick, sal_False );
2313 
2314     // and finally, the field presentation
2315     GetExport().Characters(rContent);
2316 }
2317 
ExportMetaField(const Reference<XPropertySet> & i_xMeta,bool i_bAutoStyles,sal_Bool i_bProgress)2318 void XMLTextFieldExport::ExportMetaField(
2319     const Reference<XPropertySet> & i_xMeta,
2320     bool i_bAutoStyles, sal_Bool i_bProgress )
2321 {
2322     bool doExport(!i_bAutoStyles); // do not export element if autostyles
2323     // check version >= 1.2
2324     switch (GetExport().getDefaultVersion()) {
2325         case SvtSaveOptions::ODFVER_011: // fall thru
2326         case SvtSaveOptions::ODFVER_010: doExport = false; break;
2327         default: break;
2328     }
2329 
2330     const Reference < XEnumerationAccess > xEA( i_xMeta, UNO_QUERY_THROW );
2331     const Reference < XEnumeration > xTextEnum( xEA->createEnumeration() );
2332 
2333     if (doExport)
2334     {
2335         const Reference<rdf::XMetadatable> xMeta( i_xMeta, UNO_QUERY_THROW );
2336 
2337         // style:data-style-name
2338         ProcessValueAndType(sal_False,
2339             GetIntProperty(sPropertyNumberFormat, i_xMeta),
2340             sEmpty, sEmpty, 0.0, sal_False, sal_False, sal_True,
2341             sal_False, sal_False /*, sal_False*/ );
2342 
2343         // text:meta-field without xml:id is invalid
2344         xMeta->ensureMetadataReference();
2345 
2346         // xml:id for RDF metadata
2347         GetExport().AddAttributeXmlId(xMeta);
2348     }
2349 
2350     SvXMLElementExport aElem( GetExport(), doExport,
2351         XML_NAMESPACE_TEXT, XML_META_FIELD, sal_False, sal_False );
2352 
2353     // recurse to export content
2354     GetExport().GetTextParagraphExport()->
2355         exportTextRangeEnumeration( xTextEnum, i_bAutoStyles, i_bProgress );
2356 }
2357 
2358 /// export all data-style related attributes
ProcessValueAndType(sal_Bool bIsString,sal_Int32 nFormatKey,const OUString & sContent,const OUString & sDefault,double fValue,sal_Bool bExportValue,sal_Bool bExportValueType,sal_Bool bExportStyle,sal_Bool bForceSystemLanguage,sal_Bool bTimeStyle)2359 void XMLTextFieldExport::ProcessValueAndType(
2360 	sal_Bool bIsString,		/// do we process a string or a number?
2361 	sal_Int32 nFormatKey,	/// format key for NumberFormatter; inv. if string
2362 	const OUString& sContent,	/// string content; possibly invalid
2363 	const OUString& sDefault,	/// default string
2364 	double fValue,			/// float content; possibly invalid
2365 	sal_Bool bExportValue,	/// export value attribute?
2366 	sal_Bool bExportValueType,	/// export value-type attribute?
2367 	sal_Bool bExportStyle,	/// export style-sttribute?
2368     sal_Bool bForceSystemLanguage, /// export language attributes?
2369 	sal_Bool bTimeStyle)	// exporting a time style?
2370 {
2371 	// String or number?
2372 	if (bIsString)
2373 	{
2374 
2375 		// string: attributes value-type=string, string-value=...
2376 
2377 		if (bExportValue || bExportValueType)
2378 		{
2379 			XMLNumberFormatAttributesExportHelper::SetNumberFormatAttributes(
2380 				GetExport(), sContent, sDefault, bExportValue);
2381 		}
2382 
2383 	}
2384 	else
2385 	{
2386 
2387 		// number: value-type=..., value...=..., data-style-name=...
2388 
2389 		DBG_ASSERT(bExportValueType || !bExportValue, "value w/o value type not supported!");
2390 
2391 		// take care of illegal formats
2392 		// (shouldn't happen, but does if document is corrupted)
2393 		if (-1 != nFormatKey)
2394 		{
2395 			if (bExportValue || bExportValueType)
2396 			{
2397 				XMLNumberFormatAttributesExportHelper::
2398 					SetNumberFormatAttributes(
2399 						GetExport(), nFormatKey, fValue, bExportValue);
2400 			}
2401 
2402 			if (bExportStyle)
2403 			{
2404                 // don't export language (if desired)
2405                 if( bForceSystemLanguage )
2406                     nFormatKey =
2407                         GetExport().dataStyleForceSystemLanguage( nFormatKey );
2408 
2409                 OUString sDataStyleName =
2410                     GetExport().getDataStyleName(nFormatKey, bTimeStyle);
2411                 if( sDataStyleName.getLength() > 0 )
2412                 {
2413                     GetExport().AddAttribute( XML_NAMESPACE_STYLE,
2414                                               XML_DATA_STYLE_NAME,
2415 						  					  sDataStyleName );
2416                 } // else: ignore (no valid number format)
2417 			}  // else: ignore (no number format)
2418 		}
2419 	}
2420 }
2421 
2422 
2423 
2424 /// process display related properties
ProcessDisplay(sal_Bool bIsVisible,sal_Bool bIsCommand,sal_Bool bValueDefault)2425 void XMLTextFieldExport::ProcessDisplay(sal_Bool bIsVisible,
2426 										sal_Bool bIsCommand,
2427 										sal_Bool bValueDefault)
2428 {
2429 	enum XMLTokenEnum eValue;
2430 
2431 	if (bIsVisible)
2432 	{
2433 		eValue = bIsCommand ? XML_FORMULA : XML_VALUE;
2434 	}
2435 	else
2436 	{
2437 		eValue = XML_NONE;
2438 	}
2439 
2440 	// omit attribute if default
2441 	if (!bValueDefault || (eValue != XML_VALUE))
2442 	{
2443 		GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_DISPLAY, eValue);
2444 	}
2445 }
2446 
2447 
2448 
2449 /// export boolean property
ProcessBoolean(enum XMLTokenEnum eName,sal_Bool bBool,sal_Bool bDefault)2450 void XMLTextFieldExport::ProcessBoolean(enum XMLTokenEnum eName,
2451 										sal_Bool bBool, sal_Bool bDefault)
2452 {
2453 	DBG_ASSERT( eName != XML_TOKEN_INVALID, "invalid element token");
2454 	if ( XML_TOKEN_INVALID == eName )
2455 		return;
2456 
2457 	// write attribute (if different than default)
2458 	// negate to force 0/1 values (and make sal_Bool comparable)
2459 	if ((!bBool) != (!bDefault)) {
2460 		GetExport().AddAttribute(XML_NAMESPACE_TEXT, eName,
2461                                  (bBool ? XML_TRUE : XML_FALSE) );
2462 	}
2463 }
2464 
2465 
2466 
2467 
2468 /// export string attribute
ProcessString(enum XMLTokenEnum eName,const OUString & sValue,sal_Bool bOmitEmpty,sal_uInt16 nPrefix)2469 void XMLTextFieldExport::ProcessString(enum XMLTokenEnum eName,
2470 									   const OUString& sValue,
2471 									   sal_Bool bOmitEmpty,
2472 									   sal_uInt16 nPrefix)
2473 {
2474 	DBG_ASSERT( eName != XML_TOKEN_INVALID, "invalid element token");
2475 	if ( XML_TOKEN_INVALID == eName )
2476 		return;
2477 
2478 	// check for empty string, if applicable
2479 	if ( bOmitEmpty && (sValue.getLength()==0) )
2480 		return;
2481 
2482 	// write attribute
2483 	GetExport().AddAttribute(nPrefix, eName, sValue);
2484 }
2485 
ProcessString(enum XMLTokenEnum eName,sal_uInt16 nValuePrefix,const OUString & sValue,sal_Bool bOmitEmpty,sal_uInt16 nPrefix)2486 void XMLTextFieldExport::ProcessString(enum XMLTokenEnum eName,
2487 									   sal_uInt16 nValuePrefix,
2488 									   const OUString& sValue,
2489 									   sal_Bool bOmitEmpty,
2490 									   sal_uInt16 nPrefix)
2491 {
2492 	OUString sQValue =
2493 		GetExport().GetNamespaceMap().GetQNameByKey( nValuePrefix, sValue, sal_False );
2494 	ProcessString( eName, sQValue, bOmitEmpty, nPrefix );
2495 }
2496 
2497 /// export a string attribute
ProcessString(enum XMLTokenEnum eName,const::rtl::OUString & sValue,const::rtl::OUString & sDefault,sal_uInt16 nPrefix)2498 void XMLTextFieldExport::ProcessString(enum XMLTokenEnum eName,
2499 									   const ::rtl::OUString& sValue,
2500 									   const ::rtl::OUString& sDefault,
2501 									   sal_uInt16 nPrefix)
2502 {
2503 	if (sValue != sDefault)
2504 	{
2505 		ProcessString(eName, sValue, sal_False, nPrefix);
2506 	}
2507 }
2508 
2509 /// export a string attribute
ProcessString(enum XMLTokenEnum eName,sal_uInt16 nValuePrefix,const::rtl::OUString & sValue,const::rtl::OUString & sDefault,sal_uInt16 nPrefix)2510 void XMLTextFieldExport::ProcessString(enum XMLTokenEnum eName,
2511 									   sal_uInt16 nValuePrefix,
2512 									   const ::rtl::OUString& sValue,
2513 									   const ::rtl::OUString& sDefault,
2514 									   sal_uInt16 nPrefix)
2515 {
2516 	if (sValue != sDefault)
2517 	{
2518 		ProcessString(eName, nValuePrefix, sValue, sal_False, nPrefix);
2519 	}
2520 }
2521 
2522 
2523 /// export string attribute
ProcessString(enum XMLTokenEnum eName,enum XMLTokenEnum eValue,sal_Bool bOmitEmpty,sal_uInt16 nPrefix)2524 void XMLTextFieldExport::ProcessString(
2525     enum XMLTokenEnum eName,
2526     enum XMLTokenEnum eValue,
2527 	sal_Bool bOmitEmpty,
2528 	sal_uInt16 nPrefix)
2529 {
2530 	DBG_ASSERT( eName != XML_TOKEN_INVALID, "invalid element token" );
2531     DBG_ASSERT( bOmitEmpty || (eValue != XML_TOKEN_INVALID),
2532                 "invalid value token" );
2533 	if ( XML_TOKEN_INVALID == eName )
2534 		return;
2535 
2536 	// check for empty string, if applicable
2537 	if (bOmitEmpty && (eValue == XML_TOKEN_INVALID))
2538 		return;
2539 
2540 	GetExport().AddAttribute(nPrefix, eName, eValue);
2541 }
2542 
2543 /// export a string attribute
ProcessString(enum XMLTokenEnum eName,enum XMLTokenEnum eValue,enum XMLTokenEnum eDefault,sal_uInt16 nPrefix)2544 void XMLTextFieldExport::ProcessString(
2545     enum XMLTokenEnum eName,
2546     enum XMLTokenEnum eValue,
2547     enum XMLTokenEnum eDefault,
2548 	sal_uInt16 nPrefix)
2549 {
2550     if ( eValue != eDefault )
2551 		ProcessString( eName, eValue, sal_False, nPrefix);
2552 }
2553 
2554 
2555 /// export a string as a sequence of paragraphs
ProcessParagraphSequence(const::rtl::OUString & sParagraphSequence)2556 void XMLTextFieldExport::ProcessParagraphSequence(
2557 	const ::rtl::OUString& sParagraphSequence)
2558 {
2559 	// iterate over all string-pieces separated by return (0x0a) and
2560 	// put each inside a paragraph element.
2561 	SvXMLTokenEnumerator aEnumerator(sParagraphSequence, sal_Char(0x0a));
2562 	OUString aSubString;
2563 	while (aEnumerator.getNextToken(aSubString))
2564 	{
2565 		SvXMLElementExport aParagraph(
2566 			GetExport(), XML_NAMESPACE_TEXT, XML_P, sal_True, sal_False);
2567 		GetExport().Characters(aSubString);
2568 	}
2569 }
2570 
2571 // export an integer attribute
ProcessInteger(enum XMLTokenEnum eName,sal_Int32 nNum)2572 void XMLTextFieldExport::ProcessInteger(enum XMLTokenEnum eName,
2573 										sal_Int32 nNum)
2574 {
2575 	DBG_ASSERT( eName != XML_TOKEN_INVALID, "invalid element token");
2576 	if ( XML_TOKEN_INVALID == eName )
2577 		return;
2578 
2579 	GetExport().AddAttribute(XML_NAMESPACE_TEXT, eName,
2580 							 OUString::valueOf(nNum));
2581 }
2582 
2583 /// export an integer attribute, omit if default
ProcessIntegerDef(enum XMLTokenEnum eName,sal_Int32 nNum,sal_Int32 nDefault)2584 void XMLTextFieldExport::ProcessIntegerDef(enum XMLTokenEnum eName,
2585 										sal_Int32 nNum, sal_Int32 nDefault)
2586 {
2587 	if (nNum != nDefault)
2588 		ProcessInteger(eName, nNum);
2589 }
2590 
2591 
2592 
2593 /// export a numbering type
ProcessNumberingType(sal_Int16 nNumberingType)2594 void XMLTextFieldExport::ProcessNumberingType(sal_Int16 nNumberingType)
2595 {
2596 	// process only if real format (not: like page descriptor)
2597 	if (NumberingType::PAGE_DESCRIPTOR != nNumberingType)
2598 	{
2599 		OUStringBuffer sTmp( 10 );
2600 		// number type: num format
2601 		GetExport().GetMM100UnitConverter().convertNumFormat( sTmp,
2602 															  nNumberingType );
2603 		GetExport().AddAttribute(XML_NAMESPACE_STYLE, XML_NUM_FORMAT,
2604 									  sTmp.makeStringAndClear() );
2605 		// and letter sync, if applicable
2606 		GetExport().GetMM100UnitConverter().convertNumLetterSync( sTmp,
2607 															  nNumberingType );
2608 
2609 		if (sTmp.getLength())
2610 		{
2611 			GetExport().AddAttribute(XML_NAMESPACE_STYLE, XML_NUM_LETTER_SYNC,
2612                                      sTmp.makeStringAndClear() );
2613 		}
2614 	}
2615 	// else: like page descriptor => ignore
2616 }
2617 
2618 
2619 /// export a date, time, or duration
ProcessDateTime(enum XMLTokenEnum eName,double dValue,sal_Bool bIsDate,sal_Bool bIsDuration,sal_Bool bOmitDurationIfZero,sal_uInt16 nPrefix)2620 void XMLTextFieldExport::ProcessDateTime(enum XMLTokenEnum eName,
2621 										 double dValue,
2622 										 sal_Bool bIsDate,
2623 										 sal_Bool bIsDuration,
2624 										 sal_Bool bOmitDurationIfZero,
2625 										 sal_uInt16 nPrefix)
2626 {
2627 	// truncate for date granularity
2628 	if (bIsDate)
2629 	{
2630 		dValue = ::rtl::math::approxFloor(dValue);
2631 	}
2632 
2633 	OUStringBuffer aBuffer;
2634 	if (bIsDuration)
2635 	{
2636 		// date/time durationM handle bOmitDurationIfZero
2637 		if (!bOmitDurationIfZero || !::rtl::math::approxEqual(dValue, 0.0))
2638 		{
2639 			rExport.GetMM100UnitConverter().convertTime(aBuffer, dValue);
2640 		}
2641 	}
2642 	else
2643 	{
2644 		// date/time value
2645 		rExport.GetMM100UnitConverter().convertDateTime(aBuffer, dValue);
2646 	}
2647 
2648 	// output attribute
2649 	ProcessString(eName, aBuffer.makeStringAndClear(), sal_True, nPrefix);
2650 }
2651 
2652 /// export a date or time
ProcessDateTime(enum XMLTokenEnum eName,const DateTime & rTime,sal_Bool bIsDate,sal_uInt16 nPrefix)2653 void XMLTextFieldExport::ProcessDateTime(enum XMLTokenEnum eName,
2654 										 const DateTime& rTime,
2655 										 sal_Bool bIsDate,
2656 										 sal_uInt16 nPrefix)
2657 {
2658 	OUStringBuffer aBuffer;
2659 
2660 	DateTime aDateTime(rTime);
2661 
2662 	// truncate dates
2663 	if(bIsDate)
2664 	{
2665 		aDateTime.HundredthSeconds = 0;
2666 		aDateTime.Seconds = 0;
2667 		aDateTime.Minutes = 0;
2668 		aDateTime.Hours = 0;
2669 	}
2670 
2671 	// date/time value
2672 	rExport.GetMM100UnitConverter().convertDateTime(aBuffer, aDateTime);
2673 
2674 	// output attribute
2675 	ProcessString(eName, aBuffer.makeStringAndClear(), sal_True, nPrefix);
2676 }
2677 
2678 /// export date according to ISO 8601
ProcessDate(enum XMLTokenEnum eName,const::com::sun::star::util::Date & rDate,sal_uInt16 nPrefix)2679 void XMLTextFieldExport::ProcessDate(
2680     enum XMLTokenEnum eName,
2681 	const ::com::sun::star::util::Date& rDate,
2682 	sal_uInt16 nPrefix)
2683 {
2684 	// the easiest way: delegate to ProcessDateTime (as date)
2685 	DateTime aDateTime;
2686 	aDateTime.Day = rDate.Day;
2687 	aDateTime.Month = rDate.Month;
2688 	aDateTime.Year = rDate.Year;
2689 	ProcessDateTime(eName, aDateTime, sal_True, nPrefix);
2690 }
2691 
2692 
2693 /// export a date, time, or duration
ProcessDateTime(enum XMLTokenEnum eName,sal_Int32 nMinutes,sal_Bool bIsDate,sal_Bool bIsDuration,sal_Bool bOmitDurationIfZero,sal_uInt16 nPrefix)2694 void XMLTextFieldExport::ProcessDateTime(enum XMLTokenEnum eName,
2695 										 sal_Int32 nMinutes,
2696 										 sal_Bool bIsDate,
2697 										 sal_Bool bIsDuration,
2698 										 sal_Bool bOmitDurationIfZero,
2699 										 sal_uInt16 nPrefix)
2700 {
2701 	// handle bOmitDurationIfZero here, because we can precisely compare ints
2702 	if (!(bIsDuration && bOmitDurationIfZero && (nMinutes==0)))
2703 	{
2704 		ProcessDateTime(eName, (double)nMinutes / (double)(24*60),
2705 						bIsDate, bIsDuration, bOmitDurationIfZero, nPrefix);
2706 	}
2707 }
2708 
2709 
2710 SvXMLEnumMapEntry __READONLY_DATA aBibliographyDataTypeMap[] =
2711 {
2712 	{ XML_ARTICLE,			BibliographyDataType::ARTICLE },
2713 	{ XML_BOOK,			    BibliographyDataType::BOOK },
2714 	{ XML_BOOKLET,			BibliographyDataType::BOOKLET },
2715 	{ XML_CONFERENCE,		BibliographyDataType::CONFERENCE },
2716 	{ XML_CUSTOM1,			BibliographyDataType::CUSTOM1 },
2717 	{ XML_CUSTOM2,			BibliographyDataType::CUSTOM2 },
2718 	{ XML_CUSTOM3,			BibliographyDataType::CUSTOM3 },
2719 	{ XML_CUSTOM4,			BibliographyDataType::CUSTOM4 },
2720 	{ XML_CUSTOM5,			BibliographyDataType::CUSTOM5 },
2721 	{ XML_EMAIL,			BibliographyDataType::EMAIL },
2722 	{ XML_INBOOK,			BibliographyDataType::INBOOK },
2723 	{ XML_INCOLLECTION,	    BibliographyDataType::INCOLLECTION },
2724 	{ XML_INPROCEEDINGS,	BibliographyDataType::INPROCEEDINGS },
2725 	{ XML_JOURNAL,			BibliographyDataType::JOURNAL },
2726 	{ XML_MANUAL,			BibliographyDataType::MANUAL },
2727 	{ XML_MASTERSTHESIS,	BibliographyDataType::MASTERSTHESIS },
2728 	{ XML_MISC,			    BibliographyDataType::MISC },
2729 	{ XML_PHDTHESIS,		BibliographyDataType::PHDTHESIS },
2730 	{ XML_PROCEEDINGS,		BibliographyDataType::PROCEEDINGS },
2731 	{ XML_TECHREPORT,		BibliographyDataType::TECHREPORT },
2732 	{ XML_UNPUBLISHED,		BibliographyDataType::UNPUBLISHED },
2733 	{ XML_WWW,				BibliographyDataType::WWW },
2734 	{ XML_TOKEN_INVALID, 0 }
2735 };
2736 
2737 
2738 
ProcessBibliographyData(const Reference<XPropertySet> & rPropSet)2739 void XMLTextFieldExport::ProcessBibliographyData(
2740 	const Reference<XPropertySet>& rPropSet)
2741 {
2742 	// get the values
2743 	Any aAny = rPropSet->getPropertyValue(sPropertyFields);
2744 	Sequence<PropertyValue> aValues;
2745 	aAny >>= aValues;
2746 
2747 	// one attribute per value (unless empty)
2748 	sal_Int32 nLength = aValues.getLength();
2749 	for (sal_Int32 i = 0; i < nLength; i++)
2750 	{
2751 		if (aValues[i].Name.equalsAsciiL("BibiliographicType",
2752 										 sizeof("BibiliographicType")-1))
2753 		{
2754 			sal_Int16 nTypeId = 0;
2755 			aValues[i].Value >>= nTypeId;
2756 			OUStringBuffer sBuf;
2757 
2758 			if (SvXMLUnitConverter::convertEnum(sBuf, nTypeId,
2759 												aBibliographyDataTypeMap))
2760 			{
2761 				rExport.AddAttribute(XML_NAMESPACE_TEXT,
2762 									 XML_BIBLIOGRAPHY_TYPE,
2763 									 sBuf.makeStringAndClear());
2764 			}
2765 			// else: ignore this argument
2766 		}
2767 		else
2768 		{
2769 			OUString sStr;
2770 			aValues[i].Value >>= sStr;
2771 
2772 			if (sStr.getLength() > 0)
2773 			{
2774 				rExport.AddAttribute(XML_NAMESPACE_TEXT,
2775 									 MapBibliographyFieldName(aValues[i].Name),
2776 									 sStr);
2777 			}
2778 		}
2779 	}
2780 }
2781 
2782 /// export CommandTypeAttribute
ProcessCommandType(sal_Int32 nCommandType)2783 void XMLTextFieldExport::ProcessCommandType(
2784     sal_Int32 nCommandType)
2785 {
2786     enum XMLTokenEnum eToken = XML_TOKEN_INVALID;
2787     switch( nCommandType )
2788     {
2789         case sdb::CommandType::TABLE:   eToken = XML_TABLE; break;
2790         case sdb::CommandType::QUERY:   eToken = XML_QUERY; break;
2791         case sdb::CommandType::COMMAND: eToken = XML_COMMAND; break;
2792     }
2793 
2794     if( eToken != XML_TOKEN_INVALID )
2795         rExport.AddAttribute( XML_NAMESPACE_TEXT, XML_TABLE_TYPE, eToken );
2796 }
2797 
2798 
ProcessStringSequence(const Sequence<OUString> & rSequence,const OUString sSelected)2799 void XMLTextFieldExport::ProcessStringSequence(
2800     const Sequence<OUString>& rSequence,
2801     const OUString sSelected )
2802 {
2803     // find selected element
2804     sal_Int32 nSelected = -1;
2805     sal_Int32 nLength = rSequence.getLength();
2806     const OUString* pSequence = rSequence.getConstArray();
2807     for( sal_Int32 i = 0; i < nLength; i++ )
2808     {
2809         if( pSequence[i] == sSelected )
2810             nSelected = i;
2811     }
2812 
2813     // delegate to ProcessStringSequence(OUString,sal_Int32)
2814     ProcessStringSequence( rSequence, nSelected );
2815 }
2816 
ProcessStringSequence(const Sequence<OUString> & rSequence,sal_Int32 nSelected)2817 void XMLTextFieldExport::ProcessStringSequence(
2818     const Sequence<OUString>& rSequence,
2819     sal_Int32 nSelected )
2820 {
2821     sal_Int32 nLength = rSequence.getLength();
2822     const OUString* pSequence = rSequence.getConstArray();
2823     for( sal_Int32 i = 0; i < nLength; i++ )
2824     {
2825         if( i == nSelected )
2826             rExport.AddAttribute( XML_NAMESPACE_TEXT,
2827                                   XML_CURRENT_SELECTED, XML_TRUE );
2828         rExport.AddAttribute( XML_NAMESPACE_TEXT, XML_VALUE, pSequence[i] );
2829         SvXMLElementExport aElement( rExport, XML_NAMESPACE_TEXT, XML_LABEL,
2830                                      sal_False, sal_False );
2831     }
2832 }
2833 
ExportDataBaseElement(enum XMLTokenEnum eElementName,const OUString & sPresentation,const Reference<XPropertySet> & rPropertySet,const Reference<XPropertySetInfo> & rPropertySetInfo)2834 void XMLTextFieldExport::ExportDataBaseElement(
2835     enum XMLTokenEnum eElementName,
2836     const OUString& sPresentation,
2837     const Reference<XPropertySet>& rPropertySet,
2838     const Reference<XPropertySetInfo>& rPropertySetInfo )
2839 {
2840     DBG_ASSERT( eElementName != XML_TOKEN_INVALID, "need token" );
2841     DBG_ASSERT( rPropertySet.is(), "need property set" );
2842     DBG_ASSERT( rPropertySetInfo.is(), "need property set info" );
2843 
2844     // get database properties
2845     OUString sDataBaseName;
2846     OUString sDataBaseURL;
2847     OUString sStr;
2848     if( ( rPropertySet->getPropertyValue( sPropertyDataBaseName ) >>= sStr )
2849         && ( sStr.getLength() > 0 ) )
2850     {
2851         sDataBaseName = sStr;
2852     }
2853     else if( rPropertySetInfo->hasPropertyByName( sPropertyDataBaseURL ) &&
2854              (rPropertySet->getPropertyValue( sPropertyDataBaseURL ) >>= sStr) &&
2855              (sStr.getLength() > 0) )
2856     {
2857         sDataBaseURL = sStr;
2858     }
2859 
2860     // add database name property (if present)
2861     if( sDataBaseName.getLength() > 0 )
2862         rExport.AddAttribute( XML_NAMESPACE_TEXT, XML_DATABASE_NAME,
2863                               sDataBaseName );
2864     SvXMLElementExport aDataBaseElement( GetExport(),
2865                                          XML_NAMESPACE_TEXT, eElementName,
2866                                          sal_False, sal_False );
2867 
2868     // write URL as children
2869     if( sDataBaseURL.getLength() > 0 )
2870     {
2871         rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sDataBaseURL );
2872         SvXMLElementExport aDataSourceElement(
2873             GetExport(), XML_NAMESPACE_FORM, XML_CONNECTION_RESOURCE,
2874             sal_False, sal_False );
2875     }
2876 
2877     // write presentation
2878     rExport.Characters( sPresentation );
2879 }
2880 
2881 
2882 
2883 // explode a field master name into field type and field name
ExplodeFieldMasterName(const OUString & sMasterName,OUString & sFieldType,OUString & sVarName)2884 sal_Bool XMLTextFieldExport::ExplodeFieldMasterName(
2885 	const OUString& sMasterName, OUString& sFieldType, OUString& sVarName)
2886 {
2887 	sal_Int32 nLength = sFieldMasterPrefix.getLength();
2888 	sal_Int32 nSeparator = sMasterName.indexOf('.', nLength);
2889 	sal_Bool bReturn = sal_True;
2890 
2891 #ifdef DBG_UTIL
2892 	// check for service name
2893 	bReturn &= (0 == sFieldMasterPrefix.compareTo(sMasterName, nLength));
2894 #endif
2895 
2896 	// '.' found?
2897 	if (nSeparator <= nLength) {
2898 		nSeparator = sMasterName.getLength();
2899 		DBG_WARNING("no field var name!");
2900 		bReturn = sal_False;
2901 	}
2902     else
2903     {
2904     	sFieldType = sMasterName.copy(nLength, nSeparator-nLength);
2905 	    sVarName = sMasterName.copy(nSeparator+1);
2906     }
2907 
2908 	return bReturn;
2909 }
2910 
2911 
2912 // for XDependentTextFields, get PropertySet of FieldMaster
GetMasterPropertySet(const Reference<XTextField> & rTextField)2913 Reference<XPropertySet>	XMLTextFieldExport::GetMasterPropertySet(
2914 	const Reference<XTextField> & rTextField)
2915 {
2916 	// name, value => get Property set of TextFieldMaster
2917 	Reference<XDependentTextField> xDep(rTextField, UNO_QUERY);
2918 	return xDep->getTextFieldMaster();
2919 }
2920 
2921 // get PropertySet of (any; the first) dependent field
GetDependentFieldPropertySet(const Reference<XPropertySet> & xMaster,Reference<XPropertySet> & xField)2922 sal_Bool XMLTextFieldExport::GetDependentFieldPropertySet(
2923 	const Reference<XPropertySet> & xMaster,
2924 	Reference<XPropertySet> & xField)
2925 {
2926 	Any aAny;
2927 	Sequence<Reference<XDependentTextField> > aFields;
2928 	aAny = xMaster->getPropertyValue(sPropertyDependentTextFields);
2929 	aAny >>= aFields;
2930 
2931 	// any fields?
2932 	if (aFields.getLength() > 0)
2933 	{
2934 		// get first one and return
2935 		Reference<XDependentTextField> xTField = aFields[0];
2936 		xField = Reference<XPropertySet>(xTField, UNO_QUERY);
2937 		DBG_ASSERT(xField.is(),
2938 				  "Surprisinlgy, this TextField refuses to be a PropertySet!");
2939 		return sal_True;
2940 	}
2941 	else
2942 	{
2943 		return sal_False;
2944 	}
2945 }
2946 
2947 
2948 /// map placeholder type
MapPlaceholderType(sal_uInt16 nType)2949 enum XMLTokenEnum XMLTextFieldExport::MapPlaceholderType(sal_uInt16 nType)
2950 {
2951 	enum XMLTokenEnum eType = XML_TEXT;
2952 
2953 	switch (nType)
2954     {
2955         case PlaceholderType::TEXT:
2956             eType = XML_TEXT;
2957             break;
2958 
2959         case PlaceholderType::TABLE:
2960             eType = XML_TABLE;
2961             break;
2962 
2963         case PlaceholderType::TEXTFRAME:
2964             eType = XML_TEXT_BOX;
2965             break;
2966 
2967         case PlaceholderType::GRAPHIC:
2968             eType = XML_IMAGE;
2969             break;
2970 
2971         case PlaceholderType::OBJECT:
2972             eType = XML_OBJECT;
2973             break;
2974 
2975         default:
2976             // unknown placeholder: XML_TEXT
2977             DBG_ERROR("unknown placeholder type");
2978     }
2979 
2980 	return eType;
2981 }
2982 
2983 
2984 /// element name for author	fields
MapAuthorFieldName(const Reference<XPropertySet> & xPropSet)2985 enum XMLTokenEnum XMLTextFieldExport::MapAuthorFieldName(
2986 	const Reference<XPropertySet> & xPropSet)
2987 {
2988 	// Initalen oder voller Name?
2989 	return GetBoolProperty(sPropertyFullName, xPropSet)
2990 		? XML_AUTHOR_NAME : XML_AUTHOR_INITIALS;
2991 }
2992 
MapPageNumberName(const Reference<XPropertySet> & xPropSet,sal_Int32 & nOffset)2993 enum XMLTokenEnum XMLTextFieldExport::MapPageNumberName(
2994 	const Reference<XPropertySet> & xPropSet,
2995 	sal_Int32& nOffset)
2996 {
2997 	enum XMLTokenEnum eName = XML_TOKEN_INVALID;
2998 	PageNumberType ePage;
2999 	Any aAny = xPropSet->getPropertyValue(sPropertySubType);
3000 	ePage = *(PageNumberType*)aAny.getValue();
3001 
3002 	switch (ePage)
3003 	{
3004 		case PageNumberType_PREV:
3005 			eName = XML_PREVIOUS;
3006 			nOffset += 1;
3007 			break;
3008 		case PageNumberType_CURRENT:
3009 			eName = XML_CURRENT;
3010 		    break;
3011 		case PageNumberType_NEXT:
3012 			eName = XML_NEXT;
3013 			nOffset -= 1;
3014 			break;
3015 		default:
3016 			DBG_ERROR("unknown page number type");
3017 			eName = XML_TOKEN_INVALID;
3018 			break;
3019 	}
3020 
3021 	return eName;
3022 }
3023 
3024 /// map TemplateDisplayFormat to XML
MapTemplateDisplayFormat(sal_Int16 nFormat)3025 enum XMLTokenEnum XMLTextFieldExport::MapTemplateDisplayFormat(sal_Int16 nFormat)
3026 {
3027 	enum XMLTokenEnum eName = XML_TOKEN_INVALID;
3028 
3029 	switch (nFormat)
3030 	{
3031 		case TemplateDisplayFormat::FULL:
3032 			eName = XML_FULL;
3033 			break;
3034 		case TemplateDisplayFormat::PATH:
3035 			eName = XML_PATH;
3036 			break;
3037 		case TemplateDisplayFormat::NAME:
3038 			eName = XML_NAME;
3039 			break;
3040 		case TemplateDisplayFormat::NAME_AND_EXT:
3041 			eName = XML_NAME_AND_EXTENSION;
3042 			break;
3043 		case TemplateDisplayFormat::AREA:
3044 			eName = XML_AREA;
3045 			break;
3046 		case TemplateDisplayFormat::TITLE:
3047 			eName = XML_TITLE;
3048 			break;
3049 		default:
3050 			DBG_ERROR("unknown template display format");
3051 			eName = XML_TOKEN_INVALID;
3052 			break;
3053 	}
3054 
3055 	return eName;
3056 }
3057 
3058 /// map count/statistics field token to XML name
MapCountFieldName(FieldIdEnum nToken)3059 enum XMLTokenEnum XMLTextFieldExport::MapCountFieldName(FieldIdEnum nToken)
3060 {
3061 	enum XMLTokenEnum eElement = XML_TOKEN_INVALID;
3062 
3063 	switch (nToken)
3064 	{
3065 		case FIELD_ID_COUNT_PAGES:
3066 			eElement = XML_PAGE_COUNT;
3067 			break;
3068 		case FIELD_ID_COUNT_PARAGRAPHS:
3069 			eElement = XML_PARAGRAPH_COUNT;
3070 			break;
3071 		case FIELD_ID_COUNT_WORDS:
3072 			eElement = XML_WORD_COUNT;
3073 			break;
3074 		case FIELD_ID_COUNT_CHARACTERS:
3075 			eElement = XML_CHARACTER_COUNT;
3076 			break;
3077 		case FIELD_ID_COUNT_TABLES:
3078 			eElement = XML_TABLE_COUNT;
3079 			break;
3080 		case FIELD_ID_COUNT_GRAPHICS:
3081 			eElement = XML_IMAGE_COUNT;
3082 			break;
3083 		case FIELD_ID_COUNT_OBJECTS:
3084 			eElement = XML_OBJECT_COUNT;
3085 			break;
3086 		default:
3087 			DBG_ERROR("no count field token");
3088 			eElement = XML_TOKEN_INVALID;
3089 			break;
3090 	}
3091 
3092 	return eElement;
3093 }
3094 
3095 /// map ChapterDisplayFormat to XML string
MapChapterDisplayFormat(sal_Int16 nFormat)3096 enum XMLTokenEnum XMLTextFieldExport::MapChapterDisplayFormat(sal_Int16 nFormat)
3097 {
3098 	enum XMLTokenEnum eName = XML_TOKEN_INVALID;
3099 
3100 	switch (nFormat)
3101 	{
3102 		case ChapterFormat::NAME:
3103 			eName = XML_NAME;
3104 			break;
3105 		case ChapterFormat::NUMBER:
3106 			eName = XML_NUMBER;
3107 			break;
3108 		case ChapterFormat::NAME_NUMBER:
3109 			eName = XML_NUMBER_AND_NAME;
3110 			break;
3111 		case ChapterFormat::NO_PREFIX_SUFFIX:
3112 			eName = XML_PLAIN_NUMBER_AND_NAME;
3113 			break;
3114 		case ChapterFormat::DIGIT:
3115 			eName = XML_PLAIN_NUMBER;
3116 			break;
3117 		default:
3118 			DBG_ERROR("unknown chapter display format");
3119 			eName = XML_TOKEN_INVALID;
3120 			break;
3121 	}
3122 
3123 	return eName;
3124 }
3125 
3126 
3127 /// map FilenameDisplayFormat to XML attribute names
MapFilenameDisplayFormat(sal_Int16 nFormat)3128 enum XMLTokenEnum XMLTextFieldExport::MapFilenameDisplayFormat(sal_Int16 nFormat)
3129 {
3130 	enum XMLTokenEnum eName = XML_TOKEN_INVALID;
3131 
3132 	switch (nFormat)
3133 	{
3134 		case FilenameDisplayFormat::FULL:
3135 			eName = XML_FULL;
3136 			break;
3137 		case FilenameDisplayFormat::PATH:
3138 			eName = XML_PATH;
3139 			break;
3140 		case FilenameDisplayFormat::NAME:
3141 			eName = XML_NAME;
3142 			break;
3143 		case FilenameDisplayFormat::NAME_AND_EXT:
3144 			eName = XML_NAME_AND_EXTENSION;
3145 			break;
3146 		default:
3147 			DBG_ERROR("unknown filename display format");
3148 	}
3149 
3150 	return eName;
3151 }
3152 
3153 
3154 /// map ReferenceFieldPart to XML string
MapReferenceType(sal_Int16 nType)3155 enum XMLTokenEnum XMLTextFieldExport::MapReferenceType(sal_Int16 nType)
3156 {
3157 	enum XMLTokenEnum eElement = XML_TOKEN_INVALID;
3158 
3159 	switch (nType)
3160 	{
3161 		case ReferenceFieldPart::PAGE:
3162 			eElement = XML_PAGE;
3163 			break;
3164 		case ReferenceFieldPart::CHAPTER:
3165 			eElement = XML_CHAPTER;
3166 			break;
3167 		case ReferenceFieldPart::TEXT:
3168 			eElement = XML_TEXT;
3169 			break;
3170 		case ReferenceFieldPart::UP_DOWN:
3171 			eElement = XML_DIRECTION;
3172 			break;
3173 		case ReferenceFieldPart::CATEGORY_AND_NUMBER:
3174 			eElement = XML_CATEGORY_AND_VALUE;
3175 			break;
3176 		case ReferenceFieldPart::ONLY_CAPTION:
3177 			eElement = XML_CAPTION;
3178 			break;
3179 		case ReferenceFieldPart::ONLY_SEQUENCE_NUMBER:
3180 			eElement = XML_VALUE;
3181 			break;
3182 		case ReferenceFieldPart::PAGE_DESC:
3183 			// small hack: this value never gets written, because
3184 			// XML_TEMPLATE is default
3185 			eElement = XML_TEMPLATE;
3186 			break;
3187         // --> OD 2007-09-14 #i81002#
3188         case ReferenceFieldPart::NUMBER:
3189             eElement = XML_NUMBER;
3190             break;
3191         case ReferenceFieldPart::NUMBER_NO_CONTEXT:
3192             eElement = XML_NUMBER_NO_SUPERIOR;
3193             break;
3194         case ReferenceFieldPart::NUMBER_FULL_CONTEXT:
3195             eElement = XML_NUMBER_ALL_SUPERIOR;
3196             break;
3197         // <--
3198         default:
3199 			DBG_ERROR("unknown reference type");
3200 			eElement = XML_TEMPLATE;
3201 			break;
3202 	}
3203 
3204 	return eElement;
3205 }
3206 
3207 /// map ReferenceFieldPart to XML string
MapReferenceSource(sal_Int16 nType)3208 enum XMLTokenEnum XMLTextFieldExport::MapReferenceSource(sal_Int16 nType)
3209 {
3210 	enum XMLTokenEnum eElement = XML_TOKEN_INVALID;
3211 
3212 	switch (nType)
3213 	{
3214 		case ReferenceFieldSource::REFERENCE_MARK:
3215 			eElement = XML_REFERENCE_REF;
3216 			break;
3217 		case ReferenceFieldSource::SEQUENCE_FIELD:
3218 			eElement = XML_SEQUENCE_REF;
3219 			break;
3220 		case ReferenceFieldSource::BOOKMARK:
3221 			eElement = XML_BOOKMARK_REF;
3222 			break;
3223 		case ReferenceFieldSource::FOOTNOTE:
3224 		case ReferenceFieldSource::ENDNOTE:
3225 			eElement = XML_NOTE_REF;
3226 			break;
3227 		default:
3228 			DBG_ERROR("unknown reference source");
3229 			break;
3230 	}
3231 
3232 	return eElement;
3233 }
3234 
3235 
3236 /// element name for sender fields
MapSenderFieldName(const Reference<XPropertySet> & xPropSet)3237 enum XMLTokenEnum XMLTextFieldExport::MapSenderFieldName(
3238 	const Reference<XPropertySet> & xPropSet)
3239 {
3240 	enum XMLTokenEnum eName = XML_TOKEN_INVALID;
3241 
3242 	// sub-field type
3243 	switch (GetInt16Property(sPropertyFieldSubType, xPropSet))
3244 	{
3245 		case UserDataPart::COMPANY :
3246 			eName = XML_SENDER_COMPANY;
3247 			break;
3248 		case UserDataPart::FIRSTNAME :
3249 			eName = XML_SENDER_FIRSTNAME;
3250 			break;
3251 		case UserDataPart::NAME :
3252 			eName = XML_SENDER_LASTNAME;
3253 			break;
3254 		case UserDataPart::SHORTCUT :
3255 			eName = XML_SENDER_INITIALS;
3256 			break;
3257 		case UserDataPart::STREET :
3258 			eName = XML_SENDER_STREET;
3259 			break;
3260 		case UserDataPart::COUNTRY :
3261 			eName = XML_SENDER_COUNTRY;
3262 			break;
3263 		case UserDataPart::ZIP :
3264 			eName = XML_SENDER_POSTAL_CODE;
3265 			break;
3266 		case UserDataPart::CITY :
3267 			eName = XML_SENDER_CITY;
3268 			break;
3269 		case UserDataPart::TITLE :
3270 			eName = XML_SENDER_TITLE;
3271 			break;
3272 		case UserDataPart::POSITION :
3273 			eName = XML_SENDER_POSITION;
3274 			break;
3275 		case UserDataPart::PHONE_PRIVATE :
3276 			eName = XML_SENDER_PHONE_PRIVATE;
3277 			break;
3278 		case UserDataPart::PHONE_COMPANY :
3279 			eName = XML_SENDER_PHONE_WORK;
3280 			break;
3281 		case UserDataPart::FAX :
3282 			eName = XML_SENDER_FAX;
3283 			break;
3284 		case UserDataPart::EMAIL :
3285 			eName = XML_SENDER_EMAIL;
3286 			break;
3287 		case UserDataPart::STATE :
3288 			eName = XML_SENDER_STATE_OR_PROVINCE;
3289 			break;
3290 		default:
3291 			DBG_WARNING("unknown sender type");
3292 			eName = XML_TOKEN_INVALID;
3293 			break;
3294 	}
3295 
3296 	return eName;
3297 }
3298 
MapDocInfoFieldName(enum FieldIdEnum nToken)3299 enum XMLTokenEnum XMLTextFieldExport::MapDocInfoFieldName(
3300 	enum FieldIdEnum nToken)
3301 {
3302 	enum XMLTokenEnum eElement = XML_TOKEN_INVALID;
3303 
3304 	switch (nToken)
3305 	{
3306 		case FIELD_ID_DOCINFO_CREATION_AUTHOR:
3307 			eElement = XML_INITIAL_CREATOR;
3308 			break;
3309 		case FIELD_ID_DOCINFO_CREATION_DATE:
3310 			eElement = XML_CREATION_DATE;
3311 			break;
3312 		case FIELD_ID_DOCINFO_CREATION_TIME:
3313 			eElement = XML_CREATION_TIME;
3314 			break;
3315 		case FIELD_ID_DOCINFO_DESCRIPTION:
3316 			eElement = XML_DESCRIPTION;
3317 			break;
3318 		case FIELD_ID_DOCINFO_PRINT_TIME:
3319 			eElement = XML_PRINT_TIME;
3320 			break;
3321 		case FIELD_ID_DOCINFO_PRINT_DATE:
3322 			eElement = XML_PRINT_DATE;
3323 			break;
3324 		case FIELD_ID_DOCINFO_PRINT_AUTHOR:
3325 			eElement = XML_PRINTED_BY;
3326 			break;
3327 		case FIELD_ID_DOCINFO_TITLE:
3328 			eElement = XML_TITLE;
3329 			break;
3330 		case FIELD_ID_DOCINFO_SUBJECT:
3331 			eElement = XML_SUBJECT;
3332 			break;
3333 		case FIELD_ID_DOCINFO_KEYWORDS:
3334 			eElement = XML_KEYWORDS;
3335 			break;
3336 		case FIELD_ID_DOCINFO_REVISION:
3337 			eElement = XML_EDITING_CYCLES;
3338 			break;
3339 		case FIELD_ID_DOCINFO_EDIT_DURATION:
3340 			eElement = XML_EDITING_DURATION;
3341 			break;
3342 		case FIELD_ID_DOCINFO_SAVE_TIME:
3343 			eElement = XML_MODIFICATION_TIME;
3344 			break;
3345 		case FIELD_ID_DOCINFO_SAVE_DATE:
3346 			eElement = XML_MODIFICATION_DATE;
3347 			break;
3348 		case FIELD_ID_DOCINFO_SAVE_AUTHOR:
3349 			eElement = XML_CREATOR;
3350 			break;
3351 		default:
3352 			DBG_WARNING("unknown docinfo field type!");
3353 			eElement = XML_TOKEN_INVALID;
3354 			break;
3355 	}
3356 
3357 	return eElement;
3358 }
3359 
MapBibliographyFieldName(OUString sName)3360 enum XMLTokenEnum XMLTextFieldExport::MapBibliographyFieldName(OUString sName)
3361 {
3362 	enum XMLTokenEnum eName = XML_TOKEN_INVALID;
3363 
3364 	if (sName.equalsAsciiL("Identifier", sizeof("Identifier")-1))
3365 	{
3366 		eName = XML_IDENTIFIER;
3367 	}
3368 	else if (sName.equalsAsciiL("BibiliographicType",
3369 								sizeof("BibiliographicType")-1))
3370 	{
3371 		eName = XML_BIBLIOGRAPHY_TYPE;
3372 	}
3373 	else if (sName.equalsAsciiL("Address", sizeof("Address")-1))
3374 	{
3375 		eName = XML_ADDRESS;
3376 	}
3377 	else if (sName.equalsAsciiL("Annote", sizeof("Annote")-1))
3378 	{
3379 		eName = XML_ANNOTE;
3380 	}
3381 	else if (sName.equalsAsciiL("Author", sizeof("Author")-1))
3382 	{
3383 		eName = XML_AUTHOR;
3384 	}
3385 	else if (sName.equalsAsciiL("Booktitle", sizeof("Booktitle")-1))
3386 	{
3387 		eName = XML_BOOKTITLE;
3388 	}
3389 	else if (sName.equalsAsciiL("Chapter", sizeof("Chapter")-1))
3390 	{
3391 		eName = XML_CHAPTER;
3392 	}
3393 	else if (sName.equalsAsciiL("Edition", sizeof("Edition")-1))
3394 	{
3395 		eName = XML_EDITION;
3396 	}
3397 	else if (sName.equalsAsciiL("Editor", sizeof("Editor")-1))
3398 	{
3399 		eName = XML_EDITOR;
3400 	}
3401 	else if (sName.equalsAsciiL("Howpublished", sizeof("Howpublished")-1))
3402 	{
3403 		eName = XML_HOWPUBLISHED;
3404 	}
3405 	else if (sName.equalsAsciiL("Institution", sizeof("Institution")-1))
3406 	{
3407 		eName = XML_INSTITUTION;
3408 	}
3409 	else if (sName.equalsAsciiL("Journal", sizeof("Journal")-1))
3410 	{
3411 		eName = XML_JOURNAL;
3412 	}
3413 	else if (sName.equalsAsciiL("Month", sizeof("Month")-1))
3414 	{
3415 		eName = XML_MONTH;
3416 	}
3417 	else if (sName.equalsAsciiL("Note", sizeof("Note")-1))
3418 	{
3419 		eName = XML_NOTE;
3420 	}
3421 	else if (sName.equalsAsciiL("Number", sizeof("Number")-1))
3422 	{
3423 		eName = XML_NUMBER;
3424 	}
3425 	else if (sName.equalsAsciiL("Organizations", sizeof("Organizations")-1))
3426 	{
3427 		eName = XML_ORGANIZATIONS;
3428 	}
3429 	else if (sName.equalsAsciiL("Pages", sizeof("Pages")-1))
3430 	{
3431 		eName = XML_PAGES;
3432 	}
3433 	else if (sName.equalsAsciiL("Publisher", sizeof("Publisher")-1))
3434 	{
3435 		eName = XML_PUBLISHER;
3436 	}
3437 	else if (sName.equalsAsciiL("School", sizeof("School")-1))
3438 	{
3439 		eName = XML_SCHOOL;
3440 	}
3441 	else if (sName.equalsAsciiL("Series", sizeof("Series")-1))
3442 	{
3443 		eName = XML_SERIES;
3444 	}
3445 	else if (sName.equalsAsciiL("Title", sizeof("Title")-1))
3446 	{
3447 		eName = XML_TITLE;
3448 	}
3449 	else if (sName.equalsAsciiL("Report_Type", sizeof("Report_Type")-1))
3450 	{
3451 		eName = XML_REPORT_TYPE;
3452 	}
3453 	else if (sName.equalsAsciiL("Volume", sizeof("Volume")-1))
3454 	{
3455 		eName = XML_VOLUME;
3456 	}
3457 	else if (sName.equalsAsciiL("Year", sizeof("Year")-1))
3458 	{
3459 		eName = XML_YEAR;
3460 	}
3461 	else if (sName.equalsAsciiL("URL", sizeof("URL")-1))
3462 	{
3463 		eName = XML_URL;
3464 	}
3465 	else if (sName.equalsAsciiL("Custom1", sizeof("Custom1")-1))
3466 	{
3467 		eName = XML_CUSTOM1;
3468 	}
3469 	else if (sName.equalsAsciiL("Custom2", sizeof("Custom2")-1))
3470 	{
3471 		eName = XML_CUSTOM2;
3472 	}
3473 	else if (sName.equalsAsciiL("Custom3", sizeof("Custom3")-1))
3474 	{
3475 		eName = XML_CUSTOM3;
3476 	}
3477 	else if (sName.equalsAsciiL("Custom4", sizeof("Custom4")-1))
3478 	{
3479 		eName = XML_CUSTOM4;
3480 	}
3481 	else if (sName.equalsAsciiL("Custom5", sizeof("Custom5")-1))
3482 	{
3483 		eName = XML_CUSTOM5;
3484 	}
3485 	else if (sName.equalsAsciiL("ISBN", sizeof("ISBN")-1))
3486 	{
3487 		eName = XML_ISBN;
3488 	}
3489 	else
3490 	{
3491 		DBG_ERROR("Unknown bibliography info data");
3492 		eName = XML_TOKEN_INVALID;
3493 	}
3494 
3495 	return eName;
3496 }
3497 
MapMeasureKind(sal_Int16 nKind)3498 enum XMLTokenEnum XMLTextFieldExport::MapMeasureKind(sal_Int16 nKind)
3499 {
3500 	switch( nKind )
3501 	{
3502 	case 0:
3503 		return XML_VALUE;
3504 	case 1:
3505 		return XML_UNIT;
3506 	}
3507 	return XML_GAP;
3508 }
3509 
MakeFootnoteRefName(sal_Int16 nSeqNo)3510 OUString XMLTextFieldExport::MakeFootnoteRefName(
3511 	sal_Int16 nSeqNo)
3512 {
3513 	// generate foot-/endnote ID
3514 	OUStringBuffer aBuf;
3515 	aBuf.appendAscii("ftn");
3516 	aBuf.append((sal_Int32)nSeqNo);
3517 	return aBuf.makeStringAndClear();
3518 }
3519 
MakeSequenceRefName(sal_Int16 nSeqNo,const OUString & rSeqName)3520 OUString XMLTextFieldExport::MakeSequenceRefName(
3521 	sal_Int16 nSeqNo,
3522 	const OUString& rSeqName)
3523 {
3524 	// generate foot-/endnote ID
3525 	OUStringBuffer aBuf;
3526 	aBuf.appendAscii("ref");
3527 	aBuf.append(rSeqName);
3528 	aBuf.append((sal_Int32)nSeqNo);
3529 	return aBuf.makeStringAndClear();
3530 }
3531 
3532 //
3533 // Property accessor helper functions
3534 //
3535 
3536 // to be relegated (does that word exist?) to a more appropriate place
3537 //
3538 
3539 
GetBoolProperty(const OUString & sPropName,const Reference<XPropertySet> & xPropSet)3540 inline sal_Bool GetBoolProperty(
3541 	const OUString& sPropName,
3542 	const Reference<XPropertySet> & xPropSet)
3543 {
3544 	Any aAny = xPropSet->getPropertyValue(sPropName);
3545 	sal_Bool bBool = *(sal_Bool *)aAny.getValue();
3546 	return bBool;
3547 }
3548 
GetOptionalBoolProperty(const OUString & sPropName,const Reference<XPropertySet> & xPropSet,const Reference<XPropertySetInfo> & xPropSetInfo,sal_Bool bDefault)3549 inline sal_Bool GetOptionalBoolProperty(
3550     const OUString& sPropName,
3551     const Reference<XPropertySet> & xPropSet,
3552     const Reference<XPropertySetInfo> & xPropSetInfo,
3553     sal_Bool bDefault)
3554 {
3555     return xPropSetInfo->hasPropertyByName( sPropName )
3556         ? GetBoolProperty( sPropName, xPropSet ) : bDefault;
3557 }
3558 
GetDoubleProperty(const OUString & sPropName,const Reference<XPropertySet> & xPropSet)3559 inline double GetDoubleProperty(
3560 	const OUString& sPropName,
3561 	const Reference<XPropertySet> & xPropSet)
3562 {
3563 	Any aAny = xPropSet->getPropertyValue(sPropName);
3564 	double fDouble = 0.0;
3565 	aAny >>= fDouble;
3566 	return fDouble;
3567 }
3568 
GetStringProperty(const OUString & sPropName,const Reference<XPropertySet> & xPropSet)3569 inline OUString const GetStringProperty(
3570 	const OUString& sPropName,
3571 	const Reference<XPropertySet> & xPropSet)
3572 {
3573 	Any aAny = xPropSet->getPropertyValue(sPropName);
3574 	OUString sString;
3575 	aAny >>= sString;
3576 	return sString;
3577 }
3578 
GetIntProperty(const OUString & sPropName,const Reference<XPropertySet> & xPropSet)3579 inline sal_Int32 GetIntProperty(
3580 	const OUString& sPropName,
3581 	const Reference<XPropertySet> & xPropSet)
3582 {
3583 	Any aAny = xPropSet->getPropertyValue(sPropName);
3584 	sal_Int32 nInt = 0;
3585 	aAny >>= nInt;
3586 	return nInt;
3587 }
3588 
GetInt16Property(const OUString & sPropName,const Reference<XPropertySet> & xPropSet)3589 inline sal_Int16 GetInt16Property(
3590 	const OUString& sPropName,
3591 	const Reference<XPropertySet> & xPropSet)
3592 {
3593 	Any aAny = xPropSet->getPropertyValue(sPropName);
3594 	sal_Int16 nInt = 0;
3595 	aAny >>= nInt;
3596 	return nInt;
3597 }
3598 
GetInt8Property(const OUString & sPropName,const Reference<XPropertySet> & xPropSet)3599 inline sal_Int8 GetInt8Property(
3600 	const OUString& sPropName,
3601 	const Reference<XPropertySet> & xPropSet)
3602 {
3603 	Any aAny = xPropSet->getPropertyValue(sPropName);
3604 	sal_Int8 nInt = 0;
3605 	aAny >>= nInt;
3606 	return nInt;
3607 }
3608 
GetDateTimeProperty(const OUString & sPropName,const Reference<XPropertySet> & xPropSet)3609 inline DateTime const GetDateTimeProperty(
3610 	const OUString& sPropName,
3611 	const Reference<XPropertySet> & xPropSet)
3612 {
3613 	Any aAny = xPropSet->getPropertyValue(sPropName);
3614 	DateTime aTime;
3615 	aAny >>= aTime;
3616 	return aTime;
3617 }
3618 
GetDateProperty(const OUString & sPropName,const Reference<XPropertySet> & xPropSet)3619 inline Date const GetDateProperty(
3620 	const OUString& sPropName,
3621 	const Reference<XPropertySet> & xPropSet)
3622 {
3623 	Any aAny = xPropSet->getPropertyValue(sPropName);
3624 	Date aDate;
3625 	aAny >>= aDate;
3626 	return aDate;
3627 }
3628 
GetStringSequenceProperty(const OUString & sPropName,const Reference<XPropertySet> & xPropSet)3629 inline Sequence<OUString> const GetStringSequenceProperty(
3630 	const OUString& sPropName,
3631 	const Reference<XPropertySet> & xPropSet)
3632 {
3633 	Any aAny = xPropSet->getPropertyValue(sPropName);
3634 	Sequence<OUString> aSequence;
3635 	aAny >>= aSequence;
3636 	return aSequence;
3637 }
3638