Coverage Report

Created: 2026-03-31 11:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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: */