lok: avoid expensive fetching of a property.
[LibreOffice.git] / include / xmloff / txtimp.hxx
blob9259747bd94d80d33845471ddab89a5bb3a23fc0
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
19 #ifndef INCLUDED_XMLOFF_TXTIMP_HXX
20 #define INCLUDED_XMLOFF_TXTIMP_HXX
22 #include <sal/config.h>
23 #include <xmloff/dllapi.h>
24 #include <sal/types.h>
25 #include <rtl/ustring.hxx>
26 #include <com/sun/star/uno/Reference.h>
27 #include <com/sun/star/uno/Sequence.hxx>
29 #include <map>
30 #include <memory>
32 #include <salhelper/simplereferenceobject.hxx>
34 class XMLTextListsHelper;
35 class SvXMLImportContext;
36 class SvXMLTokenMap;
37 class SvXMLImportPropertyMapper;
38 class SvXMLImport;
39 class SvXMLStylesContext;
40 class SvxXMLListStyleContext;
41 class XMLPropStyleContext;
42 class SvI18NMap;
43 template<class A> class XMLPropertyBackpatcher;
44 class XMLEventsImportContext;
46 namespace xmloff {
47 struct ParsedRDFaAttributes;
50 namespace com::sun::star {
51 namespace text {
52 class XText;
53 class XTextCursor;
54 class XTextRange;
55 class XTextContent;
56 class XFormField;
58 namespace frame { class XModel; }
59 namespace container { class XNameContainer; class XIndexReplace; }
60 namespace beans { class XPropertySet; }
61 namespace xml::sax { class XAttributeList; }
62 namespace xml::sax { class XFastAttributeList; }
63 namespace util { struct DateTime; }
66 namespace rtl { template <class reference_type> class Reference; }
68 enum XMLTextType
70 Body,
71 Cell,
72 Shape,
73 TextBox,
74 HeaderFooter,
75 Section,
76 Footnote,
77 ChangedRegion
80 /// variable type (for XMLSetVarFieldImportContext)
81 enum VarType
83 VarTypeSimple,
84 VarTypeUserField,
85 VarTypeSequence
86 // see following NOTE!
89 // NOTE: these values must be distinct from any in "enum VarType" because they
90 // are used as keys to SvI18NMap::Add()
91 #define XML_TEXT_RENAME_TYPE_FRAME 10
92 #define XML_TEXT_RENAME_TYPE_TABLE 20
94 class XMLOFF_DLLPUBLIC XMLTextImportHelper : public salhelper::SimpleReferenceObject
96 private:
97 XMLTextImportHelper(const XMLTextImportHelper&) = delete;
98 XMLTextImportHelper& operator=(const XMLTextImportHelper&) = delete;
100 struct Impl;
101 std::unique_ptr<Impl> m_xImpl;
102 /// ugly, but implementation of this is in XMLPropertyBackpatcher.cxx
103 struct BackpatcherImpl;
104 std::shared_ptr<BackpatcherImpl> m_xBackpatcherImpl;
105 static std::shared_ptr<BackpatcherImpl> MakeBackpatcherImpl();
107 protected:
108 virtual SvXMLImportContext *CreateTableChildContext(
109 SvXMLImport& rImport,
110 sal_Int32 nElement,
111 const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList );
113 // access, lazy initialization and destruction of backpatchers
114 // Code is implemented in XMLPropertyBackpatcher.cxx
115 inline XMLPropertyBackpatcher<sal_Int16>& GetFootnoteBP();
116 inline XMLPropertyBackpatcher<sal_Int16>& GetSequenceIdBP();
117 inline XMLPropertyBackpatcher< OUString> & GetSequenceNameBP();
119 public:
121 XMLTextImportHelper(
122 css::uno::Reference< css::frame::XModel > const& rModel,
123 SvXMLImport& rImport,
124 bool const bInsertMode = false, bool const bStylesOnlyMode = false,
125 bool const bProgress = false, bool const bBlockMode = false,
126 bool const bOrganizerMode = false);
128 virtual ~XMLTextImportHelper() override;
130 void dispose();
132 void SetCursor(
133 const css::uno::Reference< css::text::XTextCursor >& rCursor );
134 void ResetCursor();
136 void SetAutoStyles( SvXMLStylesContext *pStyles );
138 SvXMLImportContext *CreateTextChildContext(
139 SvXMLImport& rImport,
140 sal_Int32 nElement,
141 const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList,
142 XMLTextType eType = XMLTextType::Shape );
144 css::uno::Reference< css::text::XText > & GetText();
145 css::uno::Reference< css::text::XTextCursor > & GetCursor();
146 css::uno::Reference< css::text::XTextRange > & GetCursorAsRange();
148 bool IsInsertMode() const;
149 bool IsStylesOnlyMode() const;
150 bool IsBlockMode() const;
151 bool IsOrganizerMode() const;
152 bool IsProgress() const;
154 OUString ConvertStarFonts( const OUString& rChars,
155 const OUString& rStyleName,
156 sal_uInt8& rFlags,
157 bool bPara,
158 SvXMLImport& rImport ) const;
159 // insert a string without special whitespace processing enabled
160 void InsertString( const OUString& rChars );
161 // insert a string with special whitespace processing enabled
162 void InsertString( const OUString& rChars,
163 bool& rIgnoreLeadingSpace );
164 // Delete current paragraph
165 void DeleteParagraph();
167 void InsertControlCharacter( sal_Int16 nControl );
168 void InsertTextContent( css::uno::Reference< css::text::XTextContent > const & xContent);
170 // Add parameter <bOutlineLevelAttrFound> (#i73509#)
171 // Add parameter <bSetListAttrs> in order to suppress the handling of the list attributes (#i80724#)
172 OUString SetStyleAndAttrs(
173 SvXMLImport const & rImport,
174 const css::uno::Reference< css::text::XTextCursor >& rCursor,
175 const OUString& rStyleName,
176 bool bPara,
177 bool bOutlineLevelAttrFound = false,
178 sal_Int8 nOutlineLevel = -1,
179 bool bSetListAttrs = true,
180 bool bOutlineContentVisible = true);
182 /** Find a suitable name for the given outline level.
183 * If rStyleName is empty, change it to a previously used or default style
184 * name for that level. Otherwise, leave rStyleName unmodified.
186 // Adjust 2nd parameter (#i69629#)
187 void FindOutlineStyleName( OUString& rStyleName,
188 sal_Int8 nOutlineLevel );
190 // Change method name to reflect change of data structure (#i69629#)
191 void AddOutlineStyleCandidate( const sal_Int8 nOutlineLevel,
192 const OUString& rStyleName );
194 void SetOutlineStyles( bool bSetEmpty );
196 void SetHyperlink(
197 SvXMLImport const & rImport,
198 const css::uno::Reference< css::text::XTextCursor >& rCursor,
199 const OUString& rHRef,
200 const OUString& rName,
201 const OUString& rTargetFrameName,
202 const OUString& rStyleName,
203 const OUString& rVisitedStyleName,
204 XMLEventsImportContext* pEvents);
205 void SetRuby(
206 SvXMLImport const & rImport,
207 const css::uno::Reference< css::text::XTextCursor >& rCursor,
208 const OUString& rStyleName,
209 const OUString& rTextStyleName,
210 const OUString& rText );
212 /// return key appropriate for use with NumberFormat property
213 /// return -1 if style is not found
214 /// (may return whether data style uses the system language)
215 sal_Int32 GetDataStyleKey( const OUString& sStyleName,
216 bool* pIsSystemLanguage = nullptr );
218 const SvxXMLListStyleContext *FindAutoListStyle(
219 const OUString& rName ) const;
220 XMLPropStyleContext *FindAutoFrameStyle(
221 const OUString& rName ) const;
222 XMLPropStyleContext* FindSectionStyle(
223 const OUString& rName ) const;
224 XMLPropStyleContext* FindPageMaster(
225 const OUString& rName ) const;
226 XMLPropStyleContext* FindDrawingPage(OUString const& rName) const;
228 const css::uno::Reference< css::container::XNameContainer> & GetParaStyles() const;
230 const css::uno::Reference< css::container::XNameContainer> & GetTextStyles() const;
232 const css::uno::Reference< css::container::XNameContainer> &
233 GetNumberingStyles() const;
235 const css::uno::Reference< css::container::XNameContainer> & GetFrameStyles() const;
237 const css::uno::Reference< css::container::XNameContainer> & GetPageStyles() const;
239 const css::uno::Reference< css::container::XNameContainer> & GetCellStyles() const;
241 const css::uno::Reference< css::container::XIndexReplace > &
242 GetChapterNumbering() const;
244 bool HasFrameByName( const OUString& rName ) const;
246 bool IsDuplicateFrame(const OUString& sName, sal_Int32 nX, sal_Int32 nY, sal_Int32 nWidth, sal_Int32 nHeight) const;
247 void StoreLastImportedFrameName(const OUString& rName);
248 void ClearLastImportedTextFrameName();
250 void ConnectFrameChains( const OUString& rFrmName,
251 const OUString& rNextFrmName,
252 const css::uno::Reference< css::beans::XPropertySet >& rFrmPropSet );
254 rtl::Reference< SvXMLImportPropertyMapper > const&
255 GetParaImportPropertySetMapper() const;
256 rtl::Reference< SvXMLImportPropertyMapper > const&
257 GetTextImportPropertySetMapper() const;
258 rtl::Reference< SvXMLImportPropertyMapper > const&
259 GetSectionImportPropertySetMapper() const;
260 rtl::Reference< SvXMLImportPropertyMapper > const&
261 GetRubyImportPropertySetMapper() const;
263 static SvXMLImportPropertyMapper *CreateShapeExtPropMapper(SvXMLImport&);
264 static SvXMLImportPropertyMapper *CreateParaExtPropMapper(SvXMLImport&);
265 static SvXMLImportPropertyMapper* CreateParaDefaultExtPropMapper(SvXMLImport&);
266 static SvXMLImportPropertyMapper* CreateTableDefaultExtPropMapper(SvXMLImport&);
267 static SvXMLImportPropertyMapper* CreateTableRowDefaultExtPropMapper(SvXMLImport&);
268 static SvXMLImportPropertyMapper* CreateTableCellExtPropMapper(SvXMLImport&);
269 static SvXMLImportPropertyMapper* CreateDrawingPageExtPropMapper(SvXMLImport&);
271 SvI18NMap& GetRenameMap();
273 /// save the start of a range reference
274 void InsertBookmarkStartRange(
275 const OUString & sName,
276 const css::uno::Reference< css::text::XTextRange> & rRange,
277 OUString const& i_rXmlId,
278 std::shared_ptr< ::xmloff::ParsedRDFaAttributes > &
279 i_rpRDFaAttributes);
281 /// process the start of a range reference
282 bool FindAndRemoveBookmarkStartRange(
283 const OUString & sName,
284 css::uno::Reference< css::text::XTextRange> & o_rRange,
285 OUString & o_rXmlId,
286 std::shared_ptr< ::xmloff::ParsedRDFaAttributes > & o_rpRDFaAttributes);
288 void pushFieldCtx( const OUString& name, const OUString& type );
289 css::uno::Reference<css::text::XFormField> popFieldCtx();
290 void addFieldParam( const OUString& name, const OUString& value );
291 void setCurrentFieldParamsTo(css::uno::Reference< css::text::XFormField> const &xFormField);
292 OUString getCurrentFieldType();
293 bool hasCurrentFieldCtx() const;
296 /// insert new footnote ID.
297 /// Also fixup open references from the backpatch list to this ID.
298 // Code is implemented in XMLPropertyBackpatcher.cxx
299 void InsertFootnoteID(const OUString& sXMLId, sal_Int16 nAPIId);
301 /// set the proper footnote reference ID,
302 /// or put into backpatch list if ID is unknown
303 // Code is implemented in XMLPropertyBackpatcher.cxx
304 void ProcessFootnoteReference(
305 const OUString& sXMLId,
306 const css::uno::Reference< css::beans::XPropertySet> & xPropSet);
308 /// insert new sequence ID
309 /// Also fixup open references from backpatch list to this ID.
310 // Code is implemented in XMLPropertyBackpatcher.cxx
311 void InsertSequenceID(const OUString& sXMLId,
312 const OUString& sName,
313 sal_Int16 nAPIId);
315 /// set sequence ID or insert into backpatch list
316 // Code is implemented in XMLPropertyBackpatcher.cxx
317 void ProcessSequenceReference(
318 const OUString& sXMLId,
319 const css::uno::Reference< css::beans::XPropertySet> & xPropSet);
321 bool IsInFrame() const;
322 virtual bool IsInHeaderFooter() const;
324 virtual css::uno::Reference< css::beans::XPropertySet>
325 createAndInsertOLEObject( SvXMLImport& rImport,
326 const OUString& rHRef,
327 const OUString &rStyleName,
328 const OUString &rTblName,
329 sal_Int32 nWidth, sal_Int32 nHeight );
331 virtual css::uno::Reference< css::beans::XPropertySet>
332 createAndInsertOOoLink( SvXMLImport& rImport,
333 const OUString& rHRef,
334 const OUString &rStyleName,
335 const OUString &rTblName,
336 sal_Int32 nWidth, sal_Int32 nHeight );
338 virtual css::uno::Reference< css::beans::XPropertySet>
339 createAndInsertApplet(
340 const OUString &rName,
341 const OUString &rCode,
342 bool bMayScript,
343 const OUString& rHRef,
344 sal_Int32 nWidth, sal_Int32 nHeight );
346 virtual css::uno::Reference< css::beans::XPropertySet>
347 createAndInsertPlugin(
348 const OUString &rMimeType,
349 const OUString& rHRef,
350 sal_Int32 nWidth, sal_Int32 nHeight );
352 virtual css::uno::Reference< css::beans::XPropertySet>
353 createAndInsertFloatingFrame(
354 const OUString &rName,
355 const OUString &rHRef,
356 const OUString &rStyleName,
357 sal_Int32 nWidth, sal_Int32 nHeight );
359 virtual void endAppletOrPlugin(
360 const css::uno::Reference< css::beans::XPropertySet> &rPropSet,
361 ::std::map < const OUString, OUString > &rParamMap );
363 // applet helper methods
364 // implemented in sw/filter/xml/txtparai.hxx
366 // redlining helper methods
367 // (to be implemented in sw/filter/xml/txtparai.hxx)
369 virtual void RedlineAdd(
370 /// redline type (insert, del,... )
371 const OUString& rType,
372 /// use to identify this redline
373 const OUString& rId,
374 /// name of the author
375 const OUString& rAuthor,
376 /// redline comment
377 const OUString& rComment,
378 /// date+time
379 const css::util::DateTime& rDateTime,
380 /// merge last paras
381 bool bMergeLastParagraph);
383 virtual css::uno::Reference< css::text::XTextCursor> RedlineCreateText(
384 /// needed to get the document
385 css::uno::Reference< css::text::XTextCursor > & rOldCursor,
386 /// ID used to RedlineAdd() call
387 const OUString& rId);
389 virtual void RedlineSetCursor(
390 /// ID used to RedlineAdd() call
391 const OUString& rId,
392 /// start or end Cursor
393 bool bStart,
394 /// range is not within <text:p>
395 bool bIsOutsideOfParagraph);
397 virtual void RedlineAdjustStartNodeCursor();
398 virtual void SetShowChanges( bool bShowChanges );
399 virtual void SetRecordChanges( bool bRecordChanges );
400 virtual void SetChangesProtectionKey(
401 const css::uno::Sequence<sal_Int8> & rProtectionKey );
403 /// get the last open redline ID
404 OUString const & GetOpenRedlineId() const;
405 /// modify the last open redline ID
406 void SetOpenRedlineId( OUString const & rId);
407 /// reset the last open redline ID
408 void ResetOpenRedlineId();
410 /** redlining : Setter to remember the fact we are inside/outside
411 * a <text:deletion> element (deleted redline section) */
412 void SetInsideDeleteContext(bool const bNew);
413 /** redlining : Getter to know if we are inside
414 * a <text:deletion> element (deleted redline section) */
415 bool IsInsideDeleteContext() const;
417 SvXMLImport & GetXMLImport();
419 XMLTextListsHelper & GetTextListHelper();
421 // forwards to TextListHelper; these are used in many places
422 /// push a list context on the list context stack
423 void PushListContext();
424 /// pop the list context stack
425 void PopListContext();
427 void SetCellParaStyleDefault(OUString const& rNewValue);
428 OUString const& GetCellParaStyleDefault() const;
430 void AddCrossRefHeadingMapping(OUString const& rFrom, OUString const& rTo);
431 void MapCrossRefHeadingFieldsHorribly();
433 void setBookmarkAttributes(OUString const& bookmark, bool hidden, OUString const& condition);
434 bool getBookmarkHidden(OUString const& bookmark) const;
435 const OUString& getBookmarkCondition(OUString const& bookmark) const;
439 #endif
441 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */