1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 /** @#file
21  *  XML export of all text fields
22  */
23 
24 #ifndef INCLUDED_XMLOFF_INC_TXTFLDE_HXX
25 #define INCLUDED_XMLOFF_INC_TXTFLDE_HXX
26 
27 #include <com/sun/star/uno/Reference.h>
28 #include <xmloff/xmlnmspe.hxx>
29 
30 #include <rtl/ustring.hxx>
31 #include <xmloff/xmltoken.hxx>
32 
33 #include <map>
34 #include <set>
35 #include <memory>
36 
37 
38 class SvXMLExport;
39 struct XMLPropertyState;
40 
41 namespace com { namespace sun { namespace star {
42     namespace util { struct DateTime; }
43     namespace util { struct Date; }
44     namespace text { class XTextField; }
45     namespace text { class XText; }
46     namespace beans { class XPropertySet; }
47     namespace beans { class XPropertySetInfo; }
48     namespace frame { class XModel; }
49     namespace uno { template<typename A> class Sequence; }
50 } } }
51 
52 
53 /// field IDs,
54 //   including translation between UNO speak and XML speak if appropriate
55 
56 enum FieldIdEnum {
57     FIELD_ID_SENDER,        // sender == extended user
58     FIELD_ID_AUTHOR,
59     FIELD_ID_DATE,          // current date
60     FIELD_ID_TIME,          // current time (+date)
61     FIELD_ID_PAGENAME,      // page/slide name
62     FIELD_ID_PAGENUMBER,    // page number
63     FIELD_ID_PAGESTRING,    // page continuation string (page number string)
64     FIELD_ID_REFPAGE_SET,   // set reference page
65     FIELD_ID_REFPAGE_GET,   // get reference page number
66 
67     FIELD_ID_PLACEHOLDER,   // placeholder field == jump edit field
68 
69     FIELD_ID_VARIABLE_GET,  // get variable == get expression
70     FIELD_ID_VARIABLE_SET,  // set variable == set expression
71     FIELD_ID_VARIABLE_INPUT,    // input field (variable)
72     FIELD_ID_USER_GET,      // user field
73     FIELD_ID_USER_INPUT,    // input field (user field)
74     FIELD_ID_TEXT_INPUT,    // input field (text)
75     FIELD_ID_EXPRESSION,    // expression field = formula field
76     FIELD_ID_SEQUENCE,      // sequence field
77 
78     FIELD_ID_DATABASE_NEXT,     // select next row
79     FIELD_ID_DATABASE_SELECT,   // select row # (NumSet)
80     FIELD_ID_DATABASE_DISPLAY,  // display data (form letter field)
81     FIELD_ID_DATABASE_NAME,     // display current db name (database name)
82     FIELD_ID_DATABASE_NUMBER,   // display row # (SetNumber)
83 
84     FIELD_ID_DOCINFO_CREATION_AUTHOR,   // docinfo fields
85     FIELD_ID_DOCINFO_CREATION_TIME,
86     FIELD_ID_DOCINFO_CREATION_DATE,
87     FIELD_ID_DOCINFO_DESCRIPTION,
88     FIELD_ID_DOCINFO_CUSTOM,
89     FIELD_ID_DOCINFO_PRINT_TIME,
90     FIELD_ID_DOCINFO_PRINT_DATE,
91     FIELD_ID_DOCINFO_PRINT_AUTHOR,
92     FIELD_ID_DOCINFO_TITLE,
93     FIELD_ID_DOCINFO_SUBJECT,
94     FIELD_ID_DOCINFO_KEYWORDS,
95     FIELD_ID_DOCINFO_REVISION,
96     FIELD_ID_DOCINFO_EDIT_DURATION,
97     FIELD_ID_DOCINFO_SAVE_TIME,
98     FIELD_ID_DOCINFO_SAVE_DATE,
99     FIELD_ID_DOCINFO_SAVE_AUTHOR,
100 
101     FIELD_ID_CONDITIONAL_TEXT,          // conditionally choose between 2 texts
102     FIELD_ID_HIDDEN_TEXT,               // conditionally hide a text
103     FIELD_ID_HIDDEN_PARAGRAPH,          // conditionally hide a paragraph
104 
105     FIELD_ID_TEMPLATE_NAME,     // display name of template
106     FIELD_ID_CHAPTER,           // display name/number of current chapter
107     FIELD_ID_FILE_NAME,         // display name of current file
108 
109     FIELD_ID_COUNT_PARAGRAPHS,      // statistics fields: - paragraphs
110     FIELD_ID_COUNT_WORDS,           //                    - words
111     FIELD_ID_COUNT_CHARACTERS,      //                    - chars
112     FIELD_ID_COUNT_PAGES,           //                    - pages
113     FIELD_ID_COUNT_TABLES,          //                    - tables
114     FIELD_ID_COUNT_GRAPHICS,        //                    - graphics
115     FIELD_ID_COUNT_OBJECTS,         //                    - objects
116 
117     FIELD_ID_MACRO,                 // macro fields
118     FIELD_ID_REF_REFERENCE,         // get reference field (reference)
119     FIELD_ID_REF_SEQUENCE,          // get reference field (sequence)
120     FIELD_ID_REF_BOOKMARK,          // get reference field (bookmark)
121     FIELD_ID_REF_FOOTNOTE,          // get reference field (footnote)
122     FIELD_ID_REF_ENDNOTE,           // get reference field (endnote)
123     FIELD_ID_DDE,                   // DDE field
124 
125     FIELD_ID_BIBLIOGRAPHY,          // bibliography index entry
126 
127     FIELD_ID_SHEET_NAME,            // name of current (spread-)sheet
128     FIELD_ID_URL,                   // URL field (only Calc, Draw, Impress)
129 
130     FIELD_ID_SCRIPT,                // script fields (for HTML pages, mostly)
131     FIELD_ID_ANNOTATION,            // annotation (notice) field
132 
133     FIELD_ID_COMBINED_CHARACTERS,   // combined characters (asian typography)
134 
135     FIELD_ID_META,                  // text:meta-field (RDF metadata)
136 
137     FIELD_ID_MEASURE,               // for measure shapes
138 
139     FIELD_ID_TABLE_FORMULA,         // DEPRECATED: table formulas (Writer 2.0)
140     FIELD_ID_DROP_DOWN,             // DEPRECATED: dropdown fields (WW8)
141 
142     FIELD_ID_DRAW_HEADER,
143     FIELD_ID_DRAW_FOOTER,
144     FIELD_ID_DRAW_DATE_TIME,
145 
146     FIELD_ID_UNKNOWN        // invalid or unknown field type!
147 };
148 
149 
150 class XMLTextFieldExport final
151 {
152     SvXMLExport& rExport;
153 
154     /// store used text field master names (NULL means: don't collect)
155     std::unique_ptr< ::std::map<
156             css::uno::Reference< css::text::XText >,
157             ::std::set< OUString > > >
158         pUsedMasters;
159 
160 public:
161 
162     XMLTextFieldExport( SvXMLExport& rExp,
163                         /// XMLPropertyState for the combined characters field
164                         std::unique_ptr<XMLPropertyState> pCombinedCharState );
165     ~XMLTextFieldExport();
166 
167     /// Export this field and the surrounding span element with the formatting.
168     /// To be called for every field in the document body.
169     void ExportField(const css::uno::Reference < css::text::XTextField > & rTextField,
170                      bool bProgress, bool & rPrevCharIsSpace);
171 
172     /// collect styles (character styles, data styles, ...) for this field
173     /// (if appropriate).
174     /// Also collect used field masters (if pUsedMasters is set)
175     /// to be called for every field during style export.
176     void ExportFieldAutoStyle(const css::uno::Reference < css::text::XTextField > & rTextField,
177                  const bool bProgress, const bool bRecursive );
178 
179     /// export field declarations.
180     /// to be called once at beginning of document body.
181     void ExportFieldDeclarations();
182 
183     /// export field declarations for fields used in the particular XText.
184     /// (Requires that a list of used field declarations has previously been
185     ///  built-up in ExportFieldAutoStyle() )
186     void ExportFieldDeclarations(
187         const css::uno::Reference < css::text::XText > & rText);
188 
189     /// export all field declarations, or only those that have been used?
190     /// Calling this method will reset the list of used field declarations.
191     void SetExportOnlyUsedFieldDeclarations(
192         bool bExportOnlyUsed = true);
193 
194     // determine element or attribute names
195     // (public, because they may be useful in related XML export classes)
196     static enum ::xmloff::token::XMLTokenEnum MapPlaceholderType(sal_uInt16 nType);
197     static enum ::xmloff::token::XMLTokenEnum MapTemplateDisplayFormat(sal_Int16 nType);
198     static enum ::xmloff::token::XMLTokenEnum MapChapterDisplayFormat(sal_Int16 nType);
199     static enum ::xmloff::token::XMLTokenEnum MapFilenameDisplayFormat(sal_Int16 nType);
200     static enum ::xmloff::token::XMLTokenEnum MapDocInfoFieldName(enum FieldIdEnum nToken);
201     static enum ::xmloff::token::XMLTokenEnum MapReferenceSource(sal_Int16 nType);
202     static enum ::xmloff::token::XMLTokenEnum MapReferenceType(sal_Int16 nType);
203     static enum ::xmloff::token::XMLTokenEnum MapCountFieldName(FieldIdEnum nToken);
204     static enum ::xmloff::token::XMLTokenEnum MapBibliographyFieldName(const OUString& sName);
205     static enum ::xmloff::token::XMLTokenEnum MapMeasureKind(sal_Int16 nKind);
206     static enum ::xmloff::token::XMLTokenEnum MapPageNumberName(const css::uno::Reference< css::beans::XPropertySet> & xPropSet,
207                       sal_Int32& nOffset);  /// also adjust page offset
208     static enum ::xmloff::token::XMLTokenEnum MapAuthorFieldName(const css::uno::Reference< css::beans::XPropertySet > & xPropSet);
209     static enum ::xmloff::token::XMLTokenEnum MapSenderFieldName(const css::uno::Reference< css::beans::XPropertySet > & xPropSet);
210 
211 private:
212 
GetExport()213     SvXMLExport& GetExport() { return rExport; }
214 
215     /// export a field after <text:span> is already written
216     void ExportFieldHelper(
217         const css::uno::Reference< css::text::XTextField> & rTextField,
218         const css::uno::Reference< css::beans::XPropertySet> & rPropSet,
219         const css::uno::Reference< css::beans::XPropertySet> & rRangePropSet,
220         enum FieldIdEnum nToken,
221         bool bProgress,
222         bool & rPrevCharIsSpace);
223 
224     /// export an empty element
225     void ExportElement(enum ::xmloff::token::XMLTokenEnum eElement, /// element token
226                        bool bAddSpace = false); /// add blanks around
227                                                         /// element?
228 
229     /// export an element with string content
230     void ExportElement(enum ::xmloff::token::XMLTokenEnum eElement, /// element token
231                        const OUString& sContent); /// element content
232 
233     /// export a macro (as used in the macro field)
234     void ExportMacro( const css::uno::Reference< css::beans::XPropertySet> & rPropSet,
235                       const OUString& rContent);
236 
237     /// export text:meta-field (RDF metadata)
238     void ExportMetaField( const css::uno::Reference< css::beans::XPropertySet> & i_xMeta,
239                           bool i_bAutoStyles, bool i_bProgress,
240                           bool & rPrevCharIsSpace);
241 
242     /// export a boolean attribute
243     void ProcessBoolean(
244         enum ::xmloff::token::XMLTokenEnum eXmlName,    /// attribute token (namespace text)
245         bool bBool,     /// attribute value
246         bool bDefault); /// attribute default; omit, if attribute differs
247 
248     /// export an integer attribute
249     void ProcessInteger(
250         enum ::xmloff::token::XMLTokenEnum eXmlName,    /// attribute token (namespace text)
251         sal_Int32 nNum);            /// attribute value
252 
253     /// export an integer attribute, omit if default
254     void ProcessIntegerDef(
255         enum ::xmloff::token::XMLTokenEnum eXmlName,    /// attribute token (namespace text)
256         sal_Int32 nNum,             /// attribute value
257         sal_Int32 nDefault);        /// default value
258 
259     /// export a string attribute
260     void ProcessString(
261         enum ::xmloff::token::XMLTokenEnum eXmlName,        /// attribute token (namespace text)
262         const OUString& sValue,  /// attribute value
263         bool bOmitEmpty = false, /// omit attribute, if value is empty
264         sal_uInt16 nPrefix = XML_NAMESPACE_TEXT);   /// attribute name prefix
265 
266     /// export a string attribute that gets a QName value
267     void ProcessString(
268         enum ::xmloff::token::XMLTokenEnum eXmlName,        /// attribute token (namespace text)
269         sal_uInt16 nValuePrefix,
270         const OUString& sValue);  /// attribute value
271 
272 
273     /// export a string attribute, omit if default
274     void ProcessString(
275         enum ::xmloff::token::XMLTokenEnum eXmlName,        /// attribute token (namespace text)
276         const OUString& sValue,  /// attribute value
277         const OUString& sDefault); /// default value; omit if equal
278 
279     /// export a string attribute, omit if default
280     void ProcessString(
281         enum ::xmloff::token::XMLTokenEnum eXmlName,        /// attribute token (namespace text)
282         sal_uInt16 nValuePrefix,
283         const OUString& sValue,  /// attribute value
284         const OUString& sDefault); /// default value; omit if equal
285 
286     /// export a string attribute
287     void ProcessString(
288         enum ::xmloff::token::XMLTokenEnum eXmlName,        /// attribute token (namespace text)
289         enum ::xmloff::token::XMLTokenEnum eValue,          /// attribute token
290         sal_uInt16 nPrefix = XML_NAMESPACE_TEXT);   /// attribute name prefix
291 
292     /// export a string attribute, omit if default
293     void ProcessString(
294         enum ::xmloff::token::XMLTokenEnum eXmlName,        /// attribute token (namespace text)
295         enum ::xmloff::token::XMLTokenEnum eValue,          /// attribute value token
296         enum ::xmloff::token::XMLTokenEnum eDefault);       /// default value token
297 
298     /// export a string as a sequence of paragraphs
299     void ProcessParagraphSequence(
300         /// string containing the paragraphs
301         const OUString& sParagraphSequence);
302 
303     /// export a numbering format (numeric, roman, alphabetic, etc.)
304     void ProcessNumberingType(
305         sal_Int16 nNumberingType);      /// numbering type key
306 
307     /// export display attribute (value, formula, none)
308     void ProcessDisplay(bool bIsVisible,    /// is visible?
309                         bool bIsCommand);    /// is show command/show name?
310 
311     /// export all data-style related attributes
312     void ProcessValueAndType(
313         bool bIsString,     /// do we process a string or a number?
314         sal_Int32 nFormatKey,   /// format key for NumberFormatter; possibly -1
315         const OUString& sContent, /// string content; possibly invalid
316         const OUString& sDefault, /// default string
317         double fValue,          /// float content; possibly invalid
318         bool bExportValue,  /// export value attribute?
319         bool bExportValueType,  /// export value-type attribute?
320         bool bExportStyle,  /// export style-sttribute?
321         bool bForceSystemLanguage, /// no style language export
322         bool bTimeStyle = false); /// exporting a time style?
323 
324     /// export times, dates and durations according to ISO 8601
325     void ProcessDateTime(
326         enum ::xmloff::token::XMLTokenEnum eXMLName,    /// attribute token
327         double dValue,              /// date/time value
328         bool bIsDate,           /// export as date (rather than date/time)?
329         bool bIsDuration,           /// export as duration
330         bool bOmitDurationIfZero = true,    /// omit zero-length durat.
331         sal_uInt16 nPrefix = XML_NAMESPACE_TEXT);   /// attribute name prefix
332 
333     /// export a date, time, or duration
334     void ProcessDateTime(
335         enum ::xmloff::token::XMLTokenEnum eXMLName,    /// attribute token
336         sal_Int32 nMinutes,             /// date/time value in minutes
337         bool bIsDate,           /// export as date?
338         bool bIsDuration);       /// export as duration?
339 
340     /// export times, dates and durations according to ISO 8601
341     void ProcessDateTime(
342         enum ::xmloff::token::XMLTokenEnum eXMLName,    /// attribute token
343         const css::util::DateTime& rTime);      /// date/time value
344 
345     /// export time or dateTime
346     void ProcessTimeOrDateTime(
347         enum ::xmloff::token::XMLTokenEnum eXMLName,    /// attribute token
348         const css::util::DateTime& rTime);  /// date/time value
349 
350     /// export all attributes for bibliography data fields
351     void ProcessBibliographyData(
352         const css::uno::Reference <
353             css::beans::XPropertySet > & rPropertySet);
354 
355     /// export CommandTypeAttribute
356     void ProcessCommandType(
357         sal_Int32 nCommandType);        /// css::sdb::CommandType
358 
359     void ProcessStringSequence(
360         const css::uno::Sequence<OUString>& rSequence,
361         const OUString& sSelected );
362 
363     void ProcessStringSequence(
364         const css::uno::Sequence<OUString>& rSequence,
365         sal_Int32 nSelected );
366 
367     /// export attributes that describe a data source
368     void ExportDataBaseElement(
369         enum ::xmloff::token::XMLTokenEnum eElement,
370         const OUString& sContent,
371         const css::uno::Reference < css::beans::XPropertySet > & rPropertySet,
372         const css::uno::Reference < css::beans::XPropertySetInfo > & rPropertySetInfo );
373 
374     /// for XDependentTextFields, get PropertySet of FieldMaster
375     static css::uno::Reference < css::beans::XPropertySet >
376     GetMasterPropertySet(const css::uno::Reference < css::text::XTextField > & rTextField);
377 
378     /// get PropertySet of (any) DependentTextField for this FieldMaster
379     static bool GetDependentFieldPropertySet(
380         const css::uno::Reference< css::beans::XPropertySet> & xmaster,
381         css::uno::Reference< css::beans::XPropertySet> & xField);
382 
383 
384     /// get field ID from XTextField (and it's Property-Set)
385     static enum FieldIdEnum GetFieldID(const css::uno::Reference < css::text::XTextField > & rTextField,
386                           const css::uno::Reference < css::beans::XPropertySet > & xPropSet);
387 
388     /// get field ID from XTextField service name (and it's PropertySet)
389     static enum FieldIdEnum MapFieldName(const OUString& sFieldName,
390                             const css::uno::Reference < css::beans::XPropertySet> & xPropSet);
391 
392     /// determine, whether field has string or numeric content
393     static bool IsStringField(FieldIdEnum nFieldType,  /// field ID
394                            const css::uno::Reference < css::beans::XPropertySet > & xPropSet);
395 
396 
397     /// explode a field master name into field type and field name
398     static void ExplodeFieldMasterName(
399         const OUString& sMasterName, /// name as returned by SO API
400         OUString& sFieldType,        /// out: field type
401         OUString& sVarName);         /// out: variable name
402 
403     /// make reference name for a foot- or endnote
404     static OUString MakeFootnoteRefName(sal_Int16 nSeqNo);
405 
406     /// make reference name for a sequence field
407     static OUString MakeSequenceRefName(sal_Int16 nSeqNo,
408                                               const OUString& rSeqName);
409 
410     std::unique_ptr<XMLPropertyState> pCombinedCharactersPropertyState;
411 
412 };
413 
414 
415 #endif
416 
417 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
418