xref: /trunk/main/sc/inc/textuno.hxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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 #ifndef SC_TEXTSUNO_HXX
25 #define SC_TEXTSUNO_HXX
26 
27 #include "global.hxx"           // ScRange, ScAddress
28 #include "address.hxx"
29 #include <editeng/unotext.hxx>
30 #include <svl/brdcst.hxx>
31 #include <svl/lstner.hxx>
32 #include <com/sun/star/text/XTextFieldsSupplier.hpp>
33 #include <com/sun/star/sheet/XHeaderFooterContent.hpp>
34 #include <com/sun/star/lang/XServiceInfo.hpp>
35 #include <com/sun/star/lang/XUnoTunnel.hpp>
36 #include <cppuhelper/implbase3.hxx>
37 #include <cppuhelper/implbase5.hxx>
38 #include "scdllapi.h"
39 
40 class EditEngine;
41 class EditTextObject;
42 class SvxEditEngineForwarder;
43 class ScDocShell;
44 class ScAddress;
45 class ScCellObj;
46 class ScSimpleEditSource;
47 class ScSharedCellEditSource;
48 class ScEditEngineDefaulter;
49 class ScFieldEditEngine;
50 
51 struct ScHeaderFieldData;
52 
53 
54 #define SC_HDFT_LEFT    0
55 #define SC_HDFT_CENTER  1
56 #define SC_HDFT_RIGHT   2
57 
58 
59 //  ScHeaderFooterContentObj ist ein dummer Container, der per setPropertyValue
60 //  wieder in die Seitenvorlage geschrieben werden muss
61 
62 class ScHeaderFooterContentObj : public cppu::WeakImplHelper3<
63                             com::sun::star::sheet::XHeaderFooterContent,
64                             com::sun::star::lang::XUnoTunnel,
65                             com::sun::star::lang::XServiceInfo >
66 {
67 private:
68     EditTextObject* pLeftText;
69     EditTextObject* pCenterText;
70     EditTextObject* pRightText;
71     SfxBroadcaster  aBC;
72 
73     ScHeaderFooterContentObj(); // disabled
74 
75 public:
76                             ScHeaderFooterContentObj( const EditTextObject* pLeft,
77                                                       const EditTextObject* pCenter,
78                                                       const EditTextObject* pRight );
79     virtual                 ~ScHeaderFooterContentObj();
80 
81                             // fuer ScPageHFItem (per getImplementation)
GetLeftEditObject() const82     const EditTextObject*   GetLeftEditObject() const   { return pLeftText; }
GetCenterEditObject() const83     const EditTextObject*   GetCenterEditObject() const { return pCenterText; }
GetRightEditObject() const84     const EditTextObject*   GetRightEditObject() const  { return pRightText; }
85 
86     void                    AddListener( SfxListener& rListener );
87     void                    RemoveListener( SfxListener& rListener );
88 
89     void                    UpdateText( sal_uInt16 nPart, EditEngine& rSource );
90 
91                             // XHeaderFooterContent
92     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > SAL_CALL
93                             getLeftText();
94     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > SAL_CALL
95                             getCenterText();
96     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > SAL_CALL
97                             getRightText();
98 
99                             // XUnoTunnel
100     virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence<
101                                     sal_Int8 >& aIdentifier );
102 
103     static const com::sun::star::uno::Sequence<sal_Int8>& getUnoTunnelId();
104     static ScHeaderFooterContentObj* getImplementation( const com::sun::star::uno::Reference<
105                                     com::sun::star::sheet::XHeaderFooterContent> xObj );
106 
107                             // XServiceInfo
108     virtual ::rtl::OUString SAL_CALL getImplementationName();
109     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
110     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
111 };
112 
113 
114 //  ScHeaderFooterTextData: shared data between sub objects of a ScHeaderFooterTextObj
115 
116 class ScHeaderFooterTextData : public SfxListener
117 {
118 private:
119     ScHeaderFooterContentObj&   rContentObj;
120     sal_uInt16                      nPart;
121     ScEditEngineDefaulter*      pEditEngine;
122     SvxEditEngineForwarder*     pForwarder;
123     sal_Bool                        bDataValid;
124     sal_Bool                        bInUpdate;
125 
126 public:
127                             ScHeaderFooterTextData( ScHeaderFooterContentObj& rContent,
128                                                     sal_uInt16 nP );
129                             ~ScHeaderFooterTextData();
130 
131     virtual void            Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
132 
133                             // helper functions
134     SvxTextForwarder*       GetTextForwarder();
135     void                    UpdateData();
GetEditEngine()136     ScEditEngineDefaulter*  GetEditEngine() { GetTextForwarder(); return pEditEngine; }
137 
GetPart() const138     sal_uInt16                  GetPart() const         { return nPart; }
GetContentObj() const139     ScHeaderFooterContentObj& GetContentObj() const { return rContentObj; }
140 };
141 
142 //  ScHeaderFooterTextObj veraendert den Text in einem ScHeaderFooterContentObj
143 
144 class ScHeaderFooterTextObj : public cppu::WeakImplHelper5<
145                             com::sun::star::text::XText,
146                             com::sun::star::text::XTextRangeMover,
147                             com::sun::star::container::XEnumerationAccess,
148                             com::sun::star::text::XTextFieldsSupplier,
149                             com::sun::star::lang::XServiceInfo >
150 {
151 private:
152     ScHeaderFooterTextData      aTextData;
153     SvxUnoText*                 pUnoText;
154 
155     void                    CreateUnoText_Impl();
156 
157 public:
158                             ScHeaderFooterTextObj( ScHeaderFooterContentObj& rContent,
159                                                     sal_uInt16 nP );
160     virtual                 ~ScHeaderFooterTextObj();
161 
162     const SvxUnoText&       GetUnoText();
163 
164     static void             FillDummyFieldData( ScHeaderFieldData& rData );
165 
166                             // XText
167     virtual void SAL_CALL   insertTextContent( const ::com::sun::star::uno::Reference<
168                                     ::com::sun::star::text::XTextRange >& xRange,
169                                 const ::com::sun::star::uno::Reference<
170                                     ::com::sun::star::text::XTextContent >& xContent,
171                                 sal_Bool bAbsorb );
172     virtual void SAL_CALL   removeTextContent( const ::com::sun::star::uno::Reference<
173                                 ::com::sun::star::text::XTextContent >& xContent );
174 
175                             // XSimpleText
176     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor > SAL_CALL
177                             createTextCursor();
178     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextCursor > SAL_CALL
179                             createTextCursorByRange( const ::com::sun::star::uno::Reference<
180                                         ::com::sun::star::text::XTextRange >& aTextPosition );
181     virtual void SAL_CALL   insertString( const ::com::sun::star::uno::Reference<
182                                         ::com::sun::star::text::XTextRange >& xRange,
183                                         const ::rtl::OUString& aString, sal_Bool bAbsorb );
184     virtual void SAL_CALL   insertControlCharacter( const ::com::sun::star::uno::Reference<
185                                         ::com::sun::star::text::XTextRange >& xRange,
186                                         sal_Int16 nControlCharacter, sal_Bool bAbsorb );
187 
188                             // XTextRange
189     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > SAL_CALL
190                             getText();
191     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL
192                             getStart();
193     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL
194                             getEnd();
195     virtual ::rtl::OUString SAL_CALL getString();
196     virtual void SAL_CALL   setString( const ::rtl::OUString& aString );
197 
198                             // XTextRangeMover
199     virtual void SAL_CALL   moveTextRange( const ::com::sun::star::uno::Reference<
200                                         ::com::sun::star::text::XTextRange >& xRange,
201                                         sal_Int16 nParagraphs );
202 
203                             // XEnumerationAccess
204     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL
205                             createEnumeration();
206 
207                             // XElementAccess
208     virtual ::com::sun::star::uno::Type SAL_CALL getElementType();
209     virtual sal_Bool SAL_CALL hasElements();
210 
211                             // XTextFieldsSupplier
212     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumerationAccess > SAL_CALL
213                             getTextFields();
214     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL
215                             getTextFieldMasters();
216 
217                             // XServiceInfo
218     virtual ::rtl::OUString SAL_CALL getImplementationName();
219     virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
220     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
221 };
222 
223 
224 //  derived cursor objects for getImplementation and getText/getStart/getEnd
225 
226 //! uno3: SvxUnoTextCursor is not derived from XUnoTunnel, but should be (?)
227 
228 class ScCellTextCursor : public SvxUnoTextCursor
229 {
230     ScCellObj&              rTextObj;
231 
232 public:
233                             ScCellTextCursor(const ScCellTextCursor& rOther);
234                             ScCellTextCursor(ScCellObj& rText);
235         virtual                                 ~ScCellTextCursor() throw();
236 
GetCellObj() const237     ScCellObj&              GetCellObj() const  { return rTextObj; }
238 
239                             // SvxUnoTextCursor methods reimplemented here:
240     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > SAL_CALL
241                             getText();
242     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL
243                             getStart();
244     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL
245                             getEnd();
246 
247                             // XUnoTunnel
248     virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence<
249                                     sal_Int8 >& aIdentifier );
250 
251     static const com::sun::star::uno::Sequence<sal_Int8>& getUnoTunnelId();
252     static ScCellTextCursor* getImplementation( const com::sun::star::uno::Reference<
253                                     com::sun::star::uno::XInterface> xObj );
254 };
255 
256 class ScHeaderFooterTextCursor : public SvxUnoTextCursor
257 {
258 private:
259     ScHeaderFooterTextObj&  rTextObj;
260 
261 public:
262                             ScHeaderFooterTextCursor(const ScHeaderFooterTextCursor& rOther);
263                             ScHeaderFooterTextCursor(ScHeaderFooterTextObj& rText);
264         virtual                                 ~ScHeaderFooterTextCursor() throw();
265 
266                             // SvxUnoTextCursor methods reimplemented here:
267     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > SAL_CALL
268                             getText();
269     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL
270                             getStart();
271     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL
272                             getEnd();
273 
274                             // XUnoTunnel
275     virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence<
276                                     sal_Int8 >& aIdentifier );
277 
278     static const com::sun::star::uno::Sequence<sal_Int8>& getUnoTunnelId();
279     static ScHeaderFooterTextCursor* getImplementation( const com::sun::star::uno::Reference<
280                                     com::sun::star::uno::XInterface> xObj );
281 };
282 
283 class ScDrawTextCursor : public SvxUnoTextCursor
284 {
285 private:
286     com::sun::star::uno::Reference< com::sun::star::text::XText > xParentText;
287 
288 public:
289                             ScDrawTextCursor(const ScDrawTextCursor& rOther);
290                             ScDrawTextCursor( const com::sun::star::uno::Reference<
291                                                 com::sun::star::text::XText >& xParent,
292                                             const SvxUnoTextBase& rText );
293     virtual                  ~ScDrawTextCursor() throw();
294 
295                             // SvxUnoTextCursor methods reimplemented here:
296     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > SAL_CALL
297                             getText();
298     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL
299                             getStart();
300     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > SAL_CALL
301                             getEnd();
302 
303                             // XUnoTunnel
304     virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence<
305                                     sal_Int8 >& aIdentifier );
306 
307     static const com::sun::star::uno::Sequence<sal_Int8>& getUnoTunnelId();
308     static ScDrawTextCursor* getImplementation( const com::sun::star::uno::Reference<
309                                     com::sun::star::uno::XInterface> xObj );
310 };
311 
312 
313 // ScAnnotationTextCursor isn't needed anymore - SvxUnoTextCursor is used instead
314 
315 
316 //  ScEditEngineTextObj for formatted cell content that is not inserted in a cell or header/footer
317 //  (used for XML export of change tracking contents)
318 
319 class ScSimpleEditSourceHelper
320 {
321     ScEditEngineDefaulter*  pEditEngine;
322     SvxEditEngineForwarder* pForwarder;
323     ScSimpleEditSource*     pOriginalSource;
324 
325 public:
326             ScSimpleEditSourceHelper();
327             ~ScSimpleEditSourceHelper();
328 
GetOriginalSource() const329     ScSimpleEditSource* GetOriginalSource() const   { return pOriginalSource; }
GetEditEngine() const330     ScEditEngineDefaulter* GetEditEngine() const    { return pEditEngine; }
331 };
332 
333 class ScEditEngineTextObj : public ScSimpleEditSourceHelper, public SvxUnoText
334 {
335 public:
336                         ScEditEngineTextObj();
337         virtual                         ~ScEditEngineTextObj() throw();
338 
339     void                SetText( const EditTextObject& rTextObject );
340     EditTextObject*     CreateTextObject();
341 };
342 
343 
344 //  ScCellTextData: shared data between sub objects of a cell text object
345 
346 class ScCellTextData : public SfxListener
347 {
348 protected:
349     ScDocShell*             pDocShell;
350     ScAddress               aCellPos;
351     ScFieldEditEngine*      pEditEngine;
352     SvxEditEngineForwarder* pForwarder;
353     ScSharedCellEditSource* pOriginalSource;
354     sal_Bool                    bDataValid;
355     sal_Bool                    bInUpdate;
356     sal_Bool                    bDirty;
357     sal_Bool                    bDoUpdate;
358 
359 protected:
360     virtual void            GetCellText(const ScAddress& rCellPos, String& rText);
361 
362 public:
363                             ScCellTextData(ScDocShell* pDocSh, const ScAddress& rP);
364     virtual                 ~ScCellTextData();
365 
366     virtual void            Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
367 
368                             // helper functions for ScSharedCellEditSource:
369     virtual SvxTextForwarder* GetTextForwarder();
370     void                    UpdateData();
GetEditEngine()371     ScFieldEditEngine*      GetEditEngine() { GetTextForwarder(); return pEditEngine; }
372 
373     ScSharedCellEditSource* GetOriginalSource();        // used as argument for SvxUnoText ctor
374 
375                             // used for ScCellEditSource:
GetDocShell() const376     ScDocShell*             GetDocShell() const     { return pDocShell; }
GetCellPos() const377     const ScAddress&        GetCellPos() const      { return aCellPos; }
378 
SetDirty(sal_Bool bValue)379     void                    SetDirty(sal_Bool bValue)   { bDirty = bValue; }
IsDirty() const380     sal_Bool                    IsDirty() const         { return bDirty; }
SetDoUpdate(sal_Bool bValue)381     void                    SetDoUpdate(sal_Bool bValue)    { bDoUpdate = bValue; }
382 };
383 
384 class ScCellTextObj : public ScCellTextData, public SvxUnoText
385 {
386 public:
387                 ScCellTextObj(ScDocShell* pDocSh, const ScAddress& rP);
388         virtual         ~ScCellTextObj() throw();
389 };
390 
391 
392 #endif
393