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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26
27 #include "editsrc.hxx"
28
29 #include "scitems.hxx"
30 #include <editeng/eeitem.hxx>
31 #include <editeng/unofored.hxx>
32 #include <svx/svdpage.hxx>
33 #include <svx/svditer.hxx>
34 #include <svx/svdocapt.hxx>
35 #include <editeng/outlobj.hxx>
36 #include <editeng/editobj.hxx>
37 #include <editeng/outliner.hxx>
38 #include "textuno.hxx"
39 #include "editutil.hxx"
40 #include "docsh.hxx"
41 #include "docfunc.hxx"
42 #include "hints.hxx"
43 #include "patattr.hxx"
44 #include "unoguard.hxx"
45 #include "drwlayer.hxx"
46 #include "userdat.hxx"
47 #include "postit.hxx"
48 #include "AccessibleText.hxx"
49
50 //------------------------------------------------------------------------
51
52 TYPEINIT1( ScHeaderFooterChangedHint, SfxHint );
53
ScHeaderFooterChangedHint(sal_uInt16 nP)54 ScHeaderFooterChangedHint::ScHeaderFooterChangedHint(sal_uInt16 nP) :
55 nPart( nP )
56 {
57 }
58
~ScHeaderFooterChangedHint()59 ScHeaderFooterChangedHint::~ScHeaderFooterChangedHint()
60 {
61 }
62
63 //------------------------------------------------------------------------
64
ScSharedHeaderFooterEditSource(ScHeaderFooterTextData * pData)65 ScSharedHeaderFooterEditSource::ScSharedHeaderFooterEditSource( ScHeaderFooterTextData* pData ) :
66 pTextData( pData )
67 {
68 // pTextData is held by the ScHeaderFooterTextObj.
69 // Text range and cursor keep a reference to their parent text, so the text object is
70 // always alive and the TextData is valid as long as there are children.
71 }
72
~ScSharedHeaderFooterEditSource()73 ScSharedHeaderFooterEditSource::~ScSharedHeaderFooterEditSource()
74 {
75 }
76
Clone() const77 SvxEditSource* ScSharedHeaderFooterEditSource::Clone() const
78 {
79 return new ScSharedHeaderFooterEditSource( pTextData );
80 }
81
GetTextForwarder()82 SvxTextForwarder* ScSharedHeaderFooterEditSource::GetTextForwarder()
83 {
84 return pTextData->GetTextForwarder();
85 }
86
UpdateData()87 void ScSharedHeaderFooterEditSource::UpdateData()
88 {
89 pTextData->UpdateData();
90 }
91
GetEditEngine()92 ScEditEngineDefaulter* ScSharedHeaderFooterEditSource::GetEditEngine()
93 {
94 return pTextData->GetEditEngine();
95 }
96
97 //------------------------------------------------------------------------
98
99 // each ScHeaderFooterEditSource object has its own ScHeaderFooterTextData
100
ScHeaderFooterEditSource(ScHeaderFooterContentObj * pContent,sal_uInt16 nP)101 ScHeaderFooterEditSource::ScHeaderFooterEditSource( ScHeaderFooterContentObj* pContent,
102 sal_uInt16 nP ) :
103 ScSharedHeaderFooterEditSource( new ScHeaderFooterTextData( *pContent, nP ) )
104 {
105 }
106
ScHeaderFooterEditSource(ScHeaderFooterContentObj & rContent,sal_uInt16 nP)107 ScHeaderFooterEditSource::ScHeaderFooterEditSource( ScHeaderFooterContentObj& rContent,
108 sal_uInt16 nP ) :
109 ScSharedHeaderFooterEditSource( new ScHeaderFooterTextData( rContent, nP ) )
110 {
111 }
112
~ScHeaderFooterEditSource()113 ScHeaderFooterEditSource::~ScHeaderFooterEditSource()
114 {
115 delete GetTextData(); // not accessed in ScSharedHeaderFooterEditSource dtor
116 }
117
Clone() const118 SvxEditSource* ScHeaderFooterEditSource::Clone() const
119 {
120 const ScHeaderFooterTextData* pData = GetTextData();
121 return new ScHeaderFooterEditSource( pData->GetContentObj(), pData->GetPart() );
122 }
123
124 //------------------------------------------------------------------------
125
ScSharedCellEditSource(ScCellTextData * pData)126 ScSharedCellEditSource::ScSharedCellEditSource( ScCellTextData* pData ) :
127 pCellTextData( pData )
128 {
129 // pCellTextData is part of the ScCellTextObj.
130 // Text range and cursor keep a reference to their parent text, so the text object is
131 // always alive and the CellTextData is valid as long as there are children.
132 }
133
~ScSharedCellEditSource()134 ScSharedCellEditSource::~ScSharedCellEditSource()
135 {
136 }
137
Clone() const138 SvxEditSource* ScSharedCellEditSource::Clone() const
139 {
140 return new ScSharedCellEditSource( pCellTextData );
141 }
142
GetTextForwarder()143 SvxTextForwarder* ScSharedCellEditSource::GetTextForwarder()
144 {
145 return pCellTextData->GetTextForwarder();
146 }
147
UpdateData()148 void ScSharedCellEditSource::UpdateData()
149 {
150 pCellTextData->UpdateData();
151 }
152
SetDoUpdateData(sal_Bool bValue)153 void ScSharedCellEditSource::SetDoUpdateData(sal_Bool bValue)
154 {
155 pCellTextData->SetDoUpdate(bValue);
156 }
157
IsDirty() const158 sal_Bool ScSharedCellEditSource::IsDirty() const
159 {
160 return pCellTextData->IsDirty();
161 }
162
GetEditEngine()163 ScEditEngineDefaulter* ScSharedCellEditSource::GetEditEngine()
164 {
165 return pCellTextData->GetEditEngine();
166 }
167
168 //------------------------------------------------------------------------
169
170 // each ScCellEditSource object has its own ScCellTextData
171
ScCellEditSource(ScDocShell * pDocSh,const ScAddress & rP)172 ScCellEditSource::ScCellEditSource( ScDocShell* pDocSh, const ScAddress& rP ) :
173 ScSharedCellEditSource( new ScCellTextData( pDocSh, rP ) )
174 {
175 }
176
~ScCellEditSource()177 ScCellEditSource::~ScCellEditSource()
178 {
179 delete GetCellTextData(); // not accessed in ScSharedCellEditSource dtor
180 }
181
Clone() const182 SvxEditSource* ScCellEditSource::Clone() const
183 {
184 const ScCellTextData* pData = GetCellTextData();
185 return new ScCellEditSource( pData->GetDocShell(), pData->GetCellPos() );
186 }
187
188 //------------------------------------------------------------------------
189
ScAnnotationEditSource(ScDocShell * pDocSh,const ScAddress & rP)190 ScAnnotationEditSource::ScAnnotationEditSource(ScDocShell* pDocSh, const ScAddress& rP) :
191 pDocShell( pDocSh ),
192 aCellPos( rP ),
193 pEditEngine( NULL ),
194 pForwarder( NULL ),
195 bDataValid( sal_False )
196 {
197 if (pDocShell)
198 pDocShell->GetDocument()->AddUnoObject(*this);
199 }
200
~ScAnnotationEditSource()201 ScAnnotationEditSource::~ScAnnotationEditSource()
202 {
203 ScUnoGuard aGuard; // needed for EditEngine dtor
204
205 if (pDocShell)
206 pDocShell->GetDocument()->RemoveUnoObject(*this);
207
208 delete pForwarder;
209 delete pEditEngine;
210 }
211
Clone() const212 SvxEditSource* ScAnnotationEditSource::Clone() const
213 {
214 return new ScAnnotationEditSource( pDocShell, aCellPos );
215 }
216
GetCaptionObj()217 SdrObject* ScAnnotationEditSource::GetCaptionObj()
218 {
219 ScPostIt* pNote = pDocShell->GetDocument()->GetNote( aCellPos );
220 return pNote ? pNote->GetOrCreateCaption( aCellPos ) : 0;
221 }
222
GetTextForwarder()223 SvxTextForwarder* ScAnnotationEditSource::GetTextForwarder()
224 {
225 if (!pEditEngine)
226 {
227 // Notizen haben keine Felder
228 if ( pDocShell )
229 {
230 pEditEngine = new ScNoteEditEngine( pDocShell->GetDocument()->GetNoteEngine() );
231 }
232 else
233 {
234 SfxItemPool* pEnginePool = EditEngine::CreatePool();
235 pEnginePool->FreezeIdRanges();
236 pEditEngine = new ScEditEngineDefaulter( pEnginePool, sal_True );
237 }
238 pForwarder = new SvxEditEngineForwarder(*pEditEngine);
239 }
240
241 if (bDataValid)
242 return pForwarder;
243
244 if ( pDocShell )
245 if ( ScPostIt* pNote = pDocShell->GetDocument()->GetNote( aCellPos ) )
246 if ( const EditTextObject* pEditObj = pNote->GetEditTextObject() )
247 pEditEngine->SetText( *pEditObj ); // incl. Umbrueche
248
249 bDataValid = sal_True;
250 return pForwarder;
251 }
252
UpdateData()253 void ScAnnotationEditSource::UpdateData()
254 {
255 if ( pDocShell && pEditEngine )
256 {
257 ScDocShellModificator aModificator( *pDocShell );
258
259 if( SdrObject* pObj = GetCaptionObj() )
260 {
261 EditTextObject* pEditObj = pEditEngine->CreateTextObject();
262 OutlinerParaObject* pOPO = new OutlinerParaObject( *pEditObj );
263 delete pEditObj;
264 pOPO->SetOutlinerMode( OUTLINERMODE_TEXTOBJECT );
265 pObj->NbcSetOutlinerParaObject( pOPO );
266 pObj->ActionChanged();
267 }
268
269 //! Undo !!!
270
271 aModificator.SetDocumentModified();
272
273 // bDataValid wird bei SetDocumentModified zurueckgesetzt
274 }
275 }
276
Notify(SfxBroadcaster &,const SfxHint & rHint)277 void ScAnnotationEditSource::Notify( SfxBroadcaster&, const SfxHint& rHint )
278 {
279 if ( rHint.ISA( ScUpdateRefHint ) )
280 {
281 // const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
282
283 //! Ref-Update
284 }
285 else if ( rHint.ISA( SfxSimpleHint ) )
286 {
287 sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
288 if ( nId == SFX_HINT_DYING )
289 {
290 pDocShell = NULL; // ungueltig geworden
291
292 DELETEZ( pForwarder );
293 DELETEZ( pEditEngine ); // EditEngine uses document's pool
294 }
295 else if ( nId == SFX_HINT_DATACHANGED )
296 bDataValid = sal_False; // Text muss neu geholt werden
297 }
298 }
299
300 //------------------------------------------------------------------------
301
ScSimpleEditSource(SvxTextForwarder * pForw)302 ScSimpleEditSource::ScSimpleEditSource( SvxTextForwarder* pForw ) :
303 pForwarder( pForw )
304 {
305 // The same forwarder (and EditEngine) is shared by all children of the same Text object.
306 // Text range and cursor keep a reference to their parent text, so the text object is
307 // always alive and the forwarder is valid as long as there are children.
308 }
309
~ScSimpleEditSource()310 ScSimpleEditSource::~ScSimpleEditSource()
311 {
312 }
313
Clone() const314 SvxEditSource* ScSimpleEditSource::Clone() const
315 {
316 return new ScSimpleEditSource( pForwarder );
317 }
318
GetTextForwarder()319 SvxTextForwarder* ScSimpleEditSource::GetTextForwarder()
320 {
321 return pForwarder;
322 }
323
UpdateData()324 void ScSimpleEditSource::UpdateData()
325 {
326 // nothing
327 }
328
329 //------------------------------------------------------------------------
330
ScAccessibilityEditSource(::std::auto_ptr<ScAccessibleTextData> pAccessibleCellTextData)331 ScAccessibilityEditSource::ScAccessibilityEditSource( ::std::auto_ptr < ScAccessibleTextData > pAccessibleCellTextData )
332 : mpAccessibleTextData(pAccessibleCellTextData)
333 {
334 }
335
~ScAccessibilityEditSource()336 ScAccessibilityEditSource::~ScAccessibilityEditSource()
337 {
338 }
339
Clone() const340 SvxEditSource* ScAccessibilityEditSource::Clone() const
341 {
342 return new ScAccessibilityEditSource(::std::auto_ptr < ScAccessibleTextData > (mpAccessibleTextData->Clone()));
343 }
344
GetTextForwarder()345 SvxTextForwarder* ScAccessibilityEditSource::GetTextForwarder()
346 {
347 return mpAccessibleTextData->GetTextForwarder();
348 }
349
GetViewForwarder()350 SvxViewForwarder* ScAccessibilityEditSource::GetViewForwarder()
351 {
352 return mpAccessibleTextData->GetViewForwarder();
353 }
354
GetEditViewForwarder(sal_Bool bCreate)355 SvxEditViewForwarder* ScAccessibilityEditSource::GetEditViewForwarder( sal_Bool bCreate )
356 {
357 return mpAccessibleTextData->GetEditViewForwarder(bCreate);
358 }
359
UpdateData()360 void ScAccessibilityEditSource::UpdateData()
361 {
362 mpAccessibleTextData->UpdateData();
363 }
364
GetBroadcaster() const365 SfxBroadcaster& ScAccessibilityEditSource::GetBroadcaster() const
366 {
367 return mpAccessibleTextData->GetBroadcaster();
368 }
369
370