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