/src/libreoffice/sc/inc/textuno.hxx
Line | Count | Source |
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 | | #pragma once |
21 | | |
22 | | #include "address.hxx" |
23 | | #include <editeng/unotext.hxx> |
24 | | #include <svl/lstner.hxx> |
25 | | #include <com/sun/star/text/XTextFieldsSupplier.hpp> |
26 | | #include <com/sun/star/sheet/XHeaderFooterContent.hpp> |
27 | | #include <com/sun/star/lang/XServiceInfo.hpp> |
28 | | #include <comphelper/servicehelper.hxx> |
29 | | #include <cppuhelper/implbase.hxx> |
30 | | #include <cppuhelper/weakref.hxx> |
31 | | #include <unotools/weakref.hxx> |
32 | | |
33 | | #include <rtl/ref.hxx> |
34 | | |
35 | | #include <memory> |
36 | | |
37 | | class EditEngine; |
38 | | class EditTextObject; |
39 | | class SvxEditEngineForwarder; |
40 | | class ScDocShell; |
41 | | class ScCellObj; |
42 | | class ScSimpleEditSource; |
43 | | class ScCellEditSource; |
44 | | class ScEditEngineDefaulter; |
45 | | class ScFieldEditEngine; |
46 | | class ScHeaderFooterTextObj; |
47 | | |
48 | | struct ScHeaderFieldData; |
49 | | |
50 | | enum class ScHeaderFooterPart{ LEFT, CENTER, RIGHT }; |
51 | | |
52 | | // ScHeaderFooterContentObj is a dumb container which must be re-written into |
53 | | // the page template using setPropertyValue |
54 | | |
55 | | class ScHeaderFooterContentObj final : public cppu::WeakImplHelper< |
56 | | css::sheet::XHeaderFooterContent, |
57 | | css::lang::XServiceInfo > |
58 | | { |
59 | | private: |
60 | | rtl::Reference<ScHeaderFooterTextObj> mxLeftText; |
61 | | rtl::Reference<ScHeaderFooterTextObj> mxCenterText; |
62 | | rtl::Reference<ScHeaderFooterTextObj> mxRightText; |
63 | | |
64 | | public: |
65 | | ScHeaderFooterContentObj(); |
66 | | virtual ~ScHeaderFooterContentObj() override; |
67 | | |
68 | | // for ScPageHFItem (using getImplementation) |
69 | | const EditTextObject* GetLeftEditObject() const; |
70 | | const EditTextObject* GetCenterEditObject() const; |
71 | | const EditTextObject* GetRightEditObject() const; |
72 | | |
73 | | void Init( const EditTextObject* pLeft, |
74 | | const EditTextObject* pCenter, |
75 | | const EditTextObject* pRight); |
76 | | |
77 | | // XHeaderFooterContent |
78 | | virtual css::uno::Reference< css::text::XText > SAL_CALL |
79 | | getLeftText() override; |
80 | | virtual css::uno::Reference< css::text::XText > SAL_CALL |
81 | | getCenterText() override; |
82 | | virtual css::uno::Reference< css::text::XText > SAL_CALL |
83 | | getRightText() override; |
84 | | |
85 | | static rtl::Reference<ScHeaderFooterContentObj> getImplementation(const css::uno::Reference<css::sheet::XHeaderFooterContent>& rObj); |
86 | | |
87 | | // XServiceInfo |
88 | | virtual OUString SAL_CALL getImplementationName() override; |
89 | | virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; |
90 | | virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; |
91 | | |
92 | | }; |
93 | | |
94 | | // ScHeaderFooterTextData: shared data between sub objects of a ScHeaderFooterTextObj |
95 | | |
96 | | class ScHeaderFooterTextData |
97 | | { |
98 | | private: |
99 | | std::unique_ptr<EditTextObject> mpTextObj; |
100 | | unotools::WeakReference<ScHeaderFooterContentObj> xContentObj; |
101 | | ScHeaderFooterPart nPart; |
102 | | std::unique_ptr<ScEditEngineDefaulter> pEditEngine; |
103 | | std::unique_ptr<SvxEditEngineForwarder> pForwarder; |
104 | | bool bDataValid; |
105 | | |
106 | | public: |
107 | | ScHeaderFooterTextData(const ScHeaderFooterTextData&) = delete; |
108 | | const ScHeaderFooterTextData& operator=(const ScHeaderFooterTextData&) = delete; |
109 | | ScHeaderFooterTextData( |
110 | | unotools::WeakReference<ScHeaderFooterContentObj> xContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj); |
111 | | ~ScHeaderFooterTextData(); |
112 | | |
113 | | // helper functions |
114 | | SvxTextForwarder* GetTextForwarder(); |
115 | | void UpdateData(); |
116 | | void UpdateData(EditEngine& rEditEngine); |
117 | 0 | ScEditEngineDefaulter* GetEditEngine() { GetTextForwarder(); return pEditEngine.get(); } |
118 | | |
119 | 52.0k | ScHeaderFooterPart GetPart() const { return nPart; } |
120 | 52.0k | rtl::Reference<ScHeaderFooterContentObj> GetContentObj() const { return xContentObj; } |
121 | | |
122 | 238k | const EditTextObject* GetTextObject() const { return mpTextObj.get(); } |
123 | | }; |
124 | | |
125 | | /** |
126 | | * Each of these instances represent, the left, center or right part of the |
127 | | * header of footer of a page. |
128 | | * |
129 | | * ScHeaderFooterTextObj changes the text in a ScHeaderFooterContentObj. |
130 | | */ |
131 | | class ScHeaderFooterTextObj final : public cppu::WeakImplHelper< |
132 | | css::text::XText, |
133 | | css::text::XTextRangeMover, |
134 | | css::container::XEnumerationAccess, |
135 | | css::text::XTextFieldsSupplier, |
136 | | css::lang::XServiceInfo > |
137 | | { |
138 | | private: |
139 | | ScHeaderFooterTextData aTextData; |
140 | | rtl::Reference<SvxUnoText> mxUnoText; |
141 | | |
142 | | void CreateUnoText_Impl(); |
143 | | |
144 | | public: |
145 | | ScHeaderFooterTextObj( |
146 | | const unotools::WeakReference<ScHeaderFooterContentObj>& xContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj); |
147 | | virtual ~ScHeaderFooterTextObj() override; |
148 | | |
149 | | const EditTextObject* GetTextObject() const; |
150 | | const SvxUnoText& GetUnoText(); |
151 | | |
152 | | static void FillDummyFieldData( ScHeaderFieldData& rData ); |
153 | | |
154 | | // XText |
155 | | virtual void SAL_CALL insertTextContent( const css::uno::Reference< css::text::XTextRange >& xRange, |
156 | | const css::uno::Reference< css::text::XTextContent >& xContent, |
157 | | sal_Bool bAbsorb ) override; |
158 | | virtual void SAL_CALL removeTextContent( const css::uno::Reference< css::text::XTextContent >& xContent ) override; |
159 | | |
160 | | // XSimpleText |
161 | | virtual css::uno::Reference< css::text::XTextCursor > SAL_CALL |
162 | | createTextCursor() override; |
163 | | virtual css::uno::Reference< css::text::XTextCursor > SAL_CALL |
164 | | createTextCursorByRange( const css::uno::Reference< css::text::XTextRange >& aTextPosition ) override; |
165 | | virtual void SAL_CALL insertString( const css::uno::Reference< css::text::XTextRange >& xRange, |
166 | | const OUString& aString, sal_Bool bAbsorb ) override; |
167 | | virtual void SAL_CALL insertControlCharacter( const css::uno::Reference< css::text::XTextRange >& xRange, |
168 | | sal_Int16 nControlCharacter, sal_Bool bAbsorb ) override; |
169 | | |
170 | | // XTextRange |
171 | | virtual css::uno::Reference< css::text::XText > SAL_CALL |
172 | | getText() override; |
173 | | virtual css::uno::Reference< css::text::XTextRange > SAL_CALL |
174 | | getStart() override; |
175 | | virtual css::uno::Reference< css::text::XTextRange > SAL_CALL |
176 | | getEnd() override; |
177 | | virtual OUString SAL_CALL getString() override; |
178 | | virtual void SAL_CALL setString( const OUString& aString ) override; |
179 | | |
180 | | // XTextRangeMover |
181 | | virtual void SAL_CALL moveTextRange( const css::uno::Reference< css::text::XTextRange >& xRange, |
182 | | sal_Int16 nParagraphs ) override; |
183 | | |
184 | | // XEnumerationAccess |
185 | | virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL |
186 | | createEnumeration() override; |
187 | | |
188 | | // XElementAccess |
189 | | virtual css::uno::Type SAL_CALL getElementType() override; |
190 | | virtual sal_Bool SAL_CALL hasElements() override; |
191 | | |
192 | | // XTextFieldsSupplier |
193 | | virtual css::uno::Reference< css::container::XEnumerationAccess > SAL_CALL |
194 | | getTextFields() override; |
195 | | virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL |
196 | | getTextFieldMasters() override; |
197 | | |
198 | | // XServiceInfo |
199 | | virtual OUString SAL_CALL getImplementationName() override; |
200 | | virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; |
201 | | virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override; |
202 | | |
203 | | }; |
204 | | |
205 | | // derived cursor objects for getImplementation and getText/getStart/getEnd |
206 | | |
207 | | class ScCellTextCursor final : public SvxUnoTextCursor |
208 | | { |
209 | | rtl::Reference<ScCellObj> mxTextObj; |
210 | | |
211 | | public: |
212 | | ScCellTextCursor(ScCellObj& rText); |
213 | | virtual ~ScCellTextCursor() noexcept override; |
214 | | |
215 | 0 | ScCellTextCursor(ScCellTextCursor const &) = default; |
216 | | ScCellTextCursor(ScCellTextCursor &&) = default; |
217 | | ScCellTextCursor & operator =(ScCellTextCursor const &) = delete; // due to SvxUnoTextCursor |
218 | | ScCellTextCursor & operator =(ScCellTextCursor &&) = delete; // due to SvxUnoTextCursor |
219 | | |
220 | 0 | ScCellObj& GetCellObj() const { return *mxTextObj; } |
221 | | |
222 | | // SvxUnoTextCursor methods reimplemented here: |
223 | | virtual css::uno::Reference< css::text::XText > SAL_CALL |
224 | | getText() override; |
225 | | virtual css::uno::Reference< css::text::XTextRange > SAL_CALL |
226 | | getStart() override; |
227 | | virtual css::uno::Reference< css::text::XTextRange > SAL_CALL |
228 | | getEnd() override; |
229 | | |
230 | | // XUnoTunnel |
231 | | UNO3_GETIMPLEMENTATION_DECL(ScCellTextCursor) |
232 | | }; |
233 | | |
234 | | class ScHeaderFooterTextCursor final : public SvxUnoTextCursor |
235 | | { |
236 | | private: |
237 | | rtl::Reference<ScHeaderFooterTextObj> rTextObj; |
238 | | |
239 | | public: |
240 | | ScHeaderFooterTextCursor(rtl::Reference<ScHeaderFooterTextObj> const & rText); |
241 | | virtual ~ScHeaderFooterTextCursor() noexcept override; |
242 | | |
243 | 52.0k | ScHeaderFooterTextCursor(ScHeaderFooterTextCursor const &) = default; |
244 | | ScHeaderFooterTextCursor(ScHeaderFooterTextCursor &&) = default; |
245 | | ScHeaderFooterTextCursor & operator =(ScHeaderFooterTextCursor const &) = delete; // due to SvxUnoTextCursor |
246 | | ScHeaderFooterTextCursor & operator =(ScHeaderFooterTextCursor &&) = delete; // due to SvxUnoTextCursor |
247 | | |
248 | | // SvxUnoTextCursor methods reimplemented here: |
249 | | virtual css::uno::Reference< css::text::XText > SAL_CALL |
250 | | getText() override; |
251 | | virtual css::uno::Reference< css::text::XTextRange > SAL_CALL |
252 | | getStart() override; |
253 | | virtual css::uno::Reference< css::text::XTextRange > SAL_CALL |
254 | | getEnd() override; |
255 | | |
256 | | // XUnoTunnel |
257 | | UNO3_GETIMPLEMENTATION_DECL(ScHeaderFooterTextCursor) |
258 | | }; |
259 | | |
260 | | class ScDrawTextCursor final : public SvxUnoTextCursor |
261 | | { |
262 | | private: |
263 | | css::uno::Reference< css::text::XText > xParentText; |
264 | | |
265 | | public: |
266 | | ScDrawTextCursor( css::uno::Reference< css::text::XText > xParent, |
267 | | const SvxUnoTextBase& rText ); |
268 | | virtual ~ScDrawTextCursor() noexcept override; |
269 | | |
270 | 73.4k | ScDrawTextCursor(ScDrawTextCursor const &) = default; |
271 | | ScDrawTextCursor(ScDrawTextCursor &&) = default; |
272 | | ScDrawTextCursor & operator =(ScDrawTextCursor const &) = delete; // due to SvxUnoTextCursor |
273 | | ScDrawTextCursor & operator =(ScDrawTextCursor &&) = delete; // due to SvxUnoTextCursor |
274 | | |
275 | | // SvxUnoTextCursor methods reimplemented here: |
276 | | virtual css::uno::Reference< css::text::XText > SAL_CALL |
277 | | getText() override; |
278 | | virtual css::uno::Reference< css::text::XTextRange > SAL_CALL |
279 | | getStart() override; |
280 | | virtual css::uno::Reference< css::text::XTextRange > SAL_CALL |
281 | | getEnd() override; |
282 | | |
283 | | // XUnoTunnel |
284 | | UNO3_GETIMPLEMENTATION_DECL(ScDrawTextCursor) |
285 | | }; |
286 | | |
287 | | // ScAnnotationTextCursor isn't needed anymore - SvxUnoTextCursor is used instead |
288 | | |
289 | | // ScEditEngineTextObj for formatted cell content that is not inserted in a cell or header/footer |
290 | | // (used for XML export of change tracking contents) |
291 | | |
292 | | class ScSimpleEditSourceHelper |
293 | | { |
294 | | std::unique_ptr<ScEditEngineDefaulter> pEditEngine; |
295 | | std::unique_ptr<SvxEditEngineForwarder> pForwarder; |
296 | | std::unique_ptr<ScSimpleEditSource> pOriginalSource; |
297 | | |
298 | | public: |
299 | | ScSimpleEditSourceHelper(SfxItemPool* pEditEnginePool); |
300 | | ~ScSimpleEditSourceHelper(); |
301 | | |
302 | 0 | ScSimpleEditSource* GetOriginalSource() const { return pOriginalSource.get(); } |
303 | 0 | ScEditEngineDefaulter* GetEditEngine() const { return pEditEngine.get(); } |
304 | | }; |
305 | | |
306 | | class ScEditEngineTextObj final : public ScSimpleEditSourceHelper, public SvxUnoText |
307 | | { |
308 | | public: |
309 | | ScEditEngineTextObj(SfxItemPool* pEditEngineItemPool); |
310 | | virtual ~ScEditEngineTextObj() noexcept override; |
311 | | |
312 | | void SetText( const EditTextObject& rTextObject ); |
313 | | std::unique_ptr<EditTextObject> CreateTextObject(); |
314 | | }; |
315 | | |
316 | | // ScCellTextData: shared data between sub objects of a cell text object |
317 | | |
318 | | class ScCellTextData : public SfxListener |
319 | | { |
320 | | protected: |
321 | | ScDocShell* pDocShell; |
322 | | ScAddress aCellPos; |
323 | | std::unique_ptr<ScFieldEditEngine> pEditEngine; |
324 | | std::unique_ptr<SvxEditEngineForwarder> pForwarder; |
325 | | std::unique_ptr<ScCellEditSource> pOriginalSource; |
326 | | bool bDataValid; |
327 | | bool bInUpdate; |
328 | | bool bDirty; |
329 | | bool bDoUpdate; |
330 | | |
331 | | public: |
332 | | ScCellTextData(ScDocShell* pDocSh, const ScAddress& rP); |
333 | | virtual ~ScCellTextData() override; |
334 | | |
335 | | virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; |
336 | | |
337 | | // helper functions for ScSharedCellEditSource: |
338 | | virtual SvxTextForwarder* GetTextForwarder(); |
339 | | void UpdateData(); |
340 | 0 | ScFieldEditEngine* GetEditEngine() { GetTextForwarder(); return pEditEngine.get(); } |
341 | | |
342 | | ScCellEditSource* GetOriginalSource(); // used as argument for SvxUnoText ctor |
343 | | |
344 | | // used for ScCellEditSource: |
345 | 0 | ScDocShell* GetDocShell() const { return pDocShell; } |
346 | 0 | const ScAddress& GetCellPos() const { return aCellPos; } |
347 | | |
348 | 0 | bool IsDirty() const { return bDirty; } |
349 | 0 | void SetDoUpdate(bool bValue) { bDoUpdate = bValue; } |
350 | | }; |
351 | | |
352 | | class ScCellTextObj final : public ScCellTextData, public SvxUnoText |
353 | | { |
354 | | public: |
355 | | ScCellTextObj(ScDocShell* pDocSh, const ScAddress& rP); |
356 | | virtual ~ScCellTextObj() override; |
357 | | }; |
358 | | |
359 | | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |