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