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
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include "scitems.hxx"
30cdf0e10cSrcweir #include <editeng/eeitem.hxx>
31cdf0e10cSrcweir #include <svx/svdpool.hxx>
32cdf0e10cSrcweir #include <svx/svdobj.hxx>
33cdf0e10cSrcweir #include <editeng/editeng.hxx>
34cdf0e10cSrcweir #include <editeng/editobj.hxx>
35cdf0e10cSrcweir #include <editeng/flditem.hxx>
36cdf0e10cSrcweir #include <svx/unomid.hxx>
37cdf0e10cSrcweir #include <editeng/unoprnms.hxx>
38cdf0e10cSrcweir #include <editeng/unofored.hxx>
39cdf0e10cSrcweir #include <rtl/uuid.h>
40cdf0e10cSrcweir #include <vcl/virdev.hxx>
41cdf0e10cSrcweir #include <com/sun/star/awt/FontSlant.hpp>
42cdf0e10cSrcweir
43cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
44cdf0e10cSrcweir #include <editeng/unoipset.hxx>
45cdf0e10cSrcweir #include "textuno.hxx"
46cdf0e10cSrcweir #include "fielduno.hxx"
47cdf0e10cSrcweir #include "servuno.hxx"
48cdf0e10cSrcweir #include "editsrc.hxx"
49cdf0e10cSrcweir #include "docsh.hxx"
50cdf0e10cSrcweir #include "editutil.hxx"
51cdf0e10cSrcweir #include "unoguard.hxx"
52cdf0e10cSrcweir #include "miscuno.hxx"
53cdf0e10cSrcweir #include "cellsuno.hxx"
54cdf0e10cSrcweir #include "hints.hxx"
55cdf0e10cSrcweir #include "patattr.hxx"
56cdf0e10cSrcweir #include "cell.hxx"
57cdf0e10cSrcweir #include "docfunc.hxx"
58cdf0e10cSrcweir #include "scmod.hxx"
59cdf0e10cSrcweir
60cdf0e10cSrcweir using namespace com::sun::star;
61cdf0e10cSrcweir
62cdf0e10cSrcweir //------------------------------------------------------------------------
63cdf0e10cSrcweir
lcl_GetHdFtPropertySet()64cdf0e10cSrcweir const SvxItemPropertySet * lcl_GetHdFtPropertySet()
65cdf0e10cSrcweir {
66cdf0e10cSrcweir static SfxItemPropertyMapEntry aHdFtPropertyMap_Impl[] =
67cdf0e10cSrcweir {
68cdf0e10cSrcweir SVX_UNOEDIT_CHAR_PROPERTIES,
69cdf0e10cSrcweir SVX_UNOEDIT_FONT_PROPERTIES,
70cdf0e10cSrcweir SVX_UNOEDIT_PARA_PROPERTIES,
71cdf0e10cSrcweir SVX_UNOEDIT_NUMBERING_PROPERTIE, // for completeness of service ParagraphProperties
72cdf0e10cSrcweir {0,0,0,0,0,0}
73cdf0e10cSrcweir };
74cdf0e10cSrcweir static sal_Bool bTwipsSet = sal_False;
75cdf0e10cSrcweir
76cdf0e10cSrcweir if (!bTwipsSet)
77cdf0e10cSrcweir {
78cdf0e10cSrcweir // modify PropertyMap to include CONVERT_TWIPS flag for font height
79cdf0e10cSrcweir // (headers/footers are in twips)
80cdf0e10cSrcweir
81cdf0e10cSrcweir SfxItemPropertyMapEntry* pEntry = aHdFtPropertyMap_Impl;
82cdf0e10cSrcweir while (pEntry->pName)
83cdf0e10cSrcweir {
84cdf0e10cSrcweir if ( ( pEntry->nWID == EE_CHAR_FONTHEIGHT ||
85cdf0e10cSrcweir pEntry->nWID == EE_CHAR_FONTHEIGHT_CJK ||
86cdf0e10cSrcweir pEntry->nWID == EE_CHAR_FONTHEIGHT_CTL ) &&
87cdf0e10cSrcweir pEntry->nMemberId == MID_FONTHEIGHT )
88cdf0e10cSrcweir {
89cdf0e10cSrcweir pEntry->nMemberId |= CONVERT_TWIPS;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir
92cdf0e10cSrcweir ++pEntry;
93cdf0e10cSrcweir }
94cdf0e10cSrcweir bTwipsSet = sal_True;
95cdf0e10cSrcweir }
96cdf0e10cSrcweir static SvxItemPropertySet aHdFtPropertySet_Impl( aHdFtPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() );
97cdf0e10cSrcweir return &aHdFtPropertySet_Impl;
98cdf0e10cSrcweir }
99cdf0e10cSrcweir
100cdf0e10cSrcweir //------------------------------------------------------------------------
101cdf0e10cSrcweir
102cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScHeaderFooterContentObj, "ScHeaderFooterContentObj", "com.sun.star.sheet.HeaderFooterContent" )
103cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScHeaderFooterTextObj, "ScHeaderFooterTextObj", "stardiv.one.Text.Text" )
104cdf0e10cSrcweir
105cdf0e10cSrcweir //------------------------------------------------------------------------
106cdf0e10cSrcweir
ScHeaderFooterContentObj(const EditTextObject * pLeft,const EditTextObject * pCenter,const EditTextObject * pRight)107cdf0e10cSrcweir ScHeaderFooterContentObj::ScHeaderFooterContentObj( const EditTextObject* pLeft,
108cdf0e10cSrcweir const EditTextObject* pCenter,
109cdf0e10cSrcweir const EditTextObject* pRight ) :
110cdf0e10cSrcweir pLeftText ( NULL ),
111cdf0e10cSrcweir pCenterText ( NULL ),
112cdf0e10cSrcweir pRightText ( NULL )
113cdf0e10cSrcweir {
114cdf0e10cSrcweir if ( pLeft )
115cdf0e10cSrcweir pLeftText = pLeft->Clone();
116cdf0e10cSrcweir if ( pCenter )
117cdf0e10cSrcweir pCenterText = pCenter->Clone();
118cdf0e10cSrcweir if ( pRight )
119cdf0e10cSrcweir pRightText = pRight->Clone();
120cdf0e10cSrcweir }
121cdf0e10cSrcweir
~ScHeaderFooterContentObj()122cdf0e10cSrcweir ScHeaderFooterContentObj::~ScHeaderFooterContentObj()
123cdf0e10cSrcweir {
124cdf0e10cSrcweir delete pLeftText;
125cdf0e10cSrcweir delete pCenterText;
126cdf0e10cSrcweir delete pRightText;
127cdf0e10cSrcweir }
128cdf0e10cSrcweir
AddListener(SfxListener & rListener)129cdf0e10cSrcweir void ScHeaderFooterContentObj::AddListener( SfxListener& rListener )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir rListener.StartListening( aBC );
132cdf0e10cSrcweir }
133cdf0e10cSrcweir
RemoveListener(SfxListener & rListener)134cdf0e10cSrcweir void ScHeaderFooterContentObj::RemoveListener( SfxListener& rListener )
135cdf0e10cSrcweir {
136cdf0e10cSrcweir rListener.EndListening( aBC );
137cdf0e10cSrcweir }
138cdf0e10cSrcweir
UpdateText(sal_uInt16 nPart,EditEngine & rSource)139cdf0e10cSrcweir void ScHeaderFooterContentObj::UpdateText( sal_uInt16 nPart, EditEngine& rSource )
140cdf0e10cSrcweir {
141cdf0e10cSrcweir EditTextObject* pNew = rSource.CreateTextObject();
142cdf0e10cSrcweir switch (nPart)
143cdf0e10cSrcweir {
144cdf0e10cSrcweir case SC_HDFT_LEFT:
145cdf0e10cSrcweir delete pLeftText;
146cdf0e10cSrcweir pLeftText = pNew;
147cdf0e10cSrcweir break;
148cdf0e10cSrcweir case SC_HDFT_CENTER:
149cdf0e10cSrcweir delete pCenterText;
150cdf0e10cSrcweir pCenterText = pNew;
151cdf0e10cSrcweir break;
152cdf0e10cSrcweir default: // SC_HDFT_RIGHT
153cdf0e10cSrcweir delete pRightText;
154cdf0e10cSrcweir pRightText = pNew;
155cdf0e10cSrcweir break;
156cdf0e10cSrcweir }
157cdf0e10cSrcweir
158cdf0e10cSrcweir aBC.Broadcast( ScHeaderFooterChangedHint( nPart ) );
159cdf0e10cSrcweir }
160cdf0e10cSrcweir
161cdf0e10cSrcweir // XHeaderFooterContent
162cdf0e10cSrcweir
getLeftText()163cdf0e10cSrcweir uno::Reference<text::XText> SAL_CALL ScHeaderFooterContentObj::getLeftText()
164cdf0e10cSrcweir throw(uno::RuntimeException)
165cdf0e10cSrcweir {
166cdf0e10cSrcweir ScUnoGuard aGuard;
167cdf0e10cSrcweir return new ScHeaderFooterTextObj( *this, SC_HDFT_LEFT );
168cdf0e10cSrcweir }
169cdf0e10cSrcweir
getCenterText()170cdf0e10cSrcweir uno::Reference<text::XText> SAL_CALL ScHeaderFooterContentObj::getCenterText()
171cdf0e10cSrcweir throw(uno::RuntimeException)
172cdf0e10cSrcweir {
173cdf0e10cSrcweir ScUnoGuard aGuard;
174cdf0e10cSrcweir return new ScHeaderFooterTextObj( *this, SC_HDFT_CENTER );
175cdf0e10cSrcweir }
176cdf0e10cSrcweir
getRightText()177cdf0e10cSrcweir uno::Reference<text::XText> SAL_CALL ScHeaderFooterContentObj::getRightText()
178cdf0e10cSrcweir throw(uno::RuntimeException)
179cdf0e10cSrcweir {
180cdf0e10cSrcweir ScUnoGuard aGuard;
181cdf0e10cSrcweir return new ScHeaderFooterTextObj( *this, SC_HDFT_RIGHT );
182cdf0e10cSrcweir }
183cdf0e10cSrcweir
184cdf0e10cSrcweir // XUnoTunnel
185cdf0e10cSrcweir
getSomething(const uno::Sequence<sal_Int8> & rId)186cdf0e10cSrcweir sal_Int64 SAL_CALL ScHeaderFooterContentObj::getSomething(
187cdf0e10cSrcweir const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
188cdf0e10cSrcweir {
189cdf0e10cSrcweir if ( rId.getLength() == 16 &&
190cdf0e10cSrcweir 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
191cdf0e10cSrcweir rId.getConstArray(), 16 ) )
192cdf0e10cSrcweir {
193cdf0e10cSrcweir return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
194cdf0e10cSrcweir }
195cdf0e10cSrcweir return 0;
196cdf0e10cSrcweir }
197cdf0e10cSrcweir
198cdf0e10cSrcweir // static
getUnoTunnelId()199cdf0e10cSrcweir const uno::Sequence<sal_Int8>& ScHeaderFooterContentObj::getUnoTunnelId()
200cdf0e10cSrcweir {
201cdf0e10cSrcweir static uno::Sequence<sal_Int8> * pSeq = 0;
202cdf0e10cSrcweir if( !pSeq )
203cdf0e10cSrcweir {
204cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
205cdf0e10cSrcweir if( !pSeq )
206cdf0e10cSrcweir {
207cdf0e10cSrcweir static uno::Sequence< sal_Int8 > aSeq( 16 );
208cdf0e10cSrcweir rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
209cdf0e10cSrcweir pSeq = &aSeq;
210cdf0e10cSrcweir }
211cdf0e10cSrcweir }
212cdf0e10cSrcweir return *pSeq;
213cdf0e10cSrcweir }
214cdf0e10cSrcweir
215cdf0e10cSrcweir // static
getImplementation(const uno::Reference<sheet::XHeaderFooterContent> xObj)216cdf0e10cSrcweir ScHeaderFooterContentObj* ScHeaderFooterContentObj::getImplementation(
217cdf0e10cSrcweir const uno::Reference<sheet::XHeaderFooterContent> xObj )
218cdf0e10cSrcweir {
219cdf0e10cSrcweir ScHeaderFooterContentObj* pRet = NULL;
220cdf0e10cSrcweir uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
221cdf0e10cSrcweir if (xUT.is())
222cdf0e10cSrcweir pRet = reinterpret_cast<ScHeaderFooterContentObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
223cdf0e10cSrcweir return pRet;
224cdf0e10cSrcweir }
225cdf0e10cSrcweir
226cdf0e10cSrcweir
227cdf0e10cSrcweir //------------------------------------------------------------------------
228cdf0e10cSrcweir
ScHeaderFooterTextData(ScHeaderFooterContentObj & rContent,sal_uInt16 nP)229cdf0e10cSrcweir ScHeaderFooterTextData::ScHeaderFooterTextData( ScHeaderFooterContentObj& rContent,
230cdf0e10cSrcweir sal_uInt16 nP ) :
231cdf0e10cSrcweir rContentObj( rContent ),
232cdf0e10cSrcweir nPart( nP ),
233cdf0e10cSrcweir pEditEngine( NULL ),
234cdf0e10cSrcweir pForwarder( NULL ),
235cdf0e10cSrcweir bDataValid( sal_False ),
236cdf0e10cSrcweir bInUpdate( sal_False )
237cdf0e10cSrcweir {
238cdf0e10cSrcweir rContentObj.acquire(); // must not go away
239cdf0e10cSrcweir rContentObj.AddListener( *this );
240cdf0e10cSrcweir }
241cdf0e10cSrcweir
~ScHeaderFooterTextData()242cdf0e10cSrcweir ScHeaderFooterTextData::~ScHeaderFooterTextData()
243cdf0e10cSrcweir {
244cdf0e10cSrcweir ScUnoGuard aGuard; // needed for EditEngine dtor
245cdf0e10cSrcweir
246cdf0e10cSrcweir rContentObj.RemoveListener( *this );
247cdf0e10cSrcweir
248cdf0e10cSrcweir delete pForwarder;
249cdf0e10cSrcweir delete pEditEngine;
250cdf0e10cSrcweir
251cdf0e10cSrcweir rContentObj.release();
252cdf0e10cSrcweir }
253cdf0e10cSrcweir
Notify(SfxBroadcaster &,const SfxHint & rHint)254cdf0e10cSrcweir void ScHeaderFooterTextData::Notify( SfxBroadcaster&, const SfxHint& rHint )
255cdf0e10cSrcweir {
256cdf0e10cSrcweir if ( rHint.ISA( ScHeaderFooterChangedHint ) )
257cdf0e10cSrcweir {
258cdf0e10cSrcweir if ( ((const ScHeaderFooterChangedHint&)rHint).GetPart() == nPart )
259cdf0e10cSrcweir {
260cdf0e10cSrcweir if (!bInUpdate) // not for own updates
261cdf0e10cSrcweir bDataValid = sal_False; // text has to be fetched again
262cdf0e10cSrcweir }
263cdf0e10cSrcweir }
264cdf0e10cSrcweir }
265cdf0e10cSrcweir
GetTextForwarder()266cdf0e10cSrcweir SvxTextForwarder* ScHeaderFooterTextData::GetTextForwarder()
267cdf0e10cSrcweir {
268cdf0e10cSrcweir if (!pEditEngine)
269cdf0e10cSrcweir {
270cdf0e10cSrcweir SfxItemPool* pEnginePool = EditEngine::CreatePool();
271cdf0e10cSrcweir pEnginePool->FreezeIdRanges();
272cdf0e10cSrcweir ScHeaderEditEngine* pHdrEngine = new ScHeaderEditEngine( pEnginePool, sal_True );
273cdf0e10cSrcweir
274cdf0e10cSrcweir pHdrEngine->EnableUndo( sal_False );
275cdf0e10cSrcweir pHdrEngine->SetRefMapMode( MAP_TWIP );
276cdf0e10cSrcweir
277cdf0e10cSrcweir // default font must be set, independently of document
278cdf0e10cSrcweir // -> use global pool from module
279cdf0e10cSrcweir
280cdf0e10cSrcweir SfxItemSet aDefaults( pHdrEngine->GetEmptyItemSet() );
281cdf0e10cSrcweir const ScPatternAttr& rPattern = (const ScPatternAttr&)SC_MOD()->GetPool().GetDefaultItem(ATTR_PATTERN);
282cdf0e10cSrcweir rPattern.FillEditItemSet( &aDefaults );
283cdf0e10cSrcweir // FillEditItemSet adjusts font height to 1/100th mm,
284cdf0e10cSrcweir // but for header/footer twips is needed, as in the PatternAttr:
285cdf0e10cSrcweir aDefaults.Put( rPattern.GetItem(ATTR_FONT_HEIGHT), EE_CHAR_FONTHEIGHT );
286cdf0e10cSrcweir aDefaults.Put( rPattern.GetItem(ATTR_CJK_FONT_HEIGHT), EE_CHAR_FONTHEIGHT_CJK );
287cdf0e10cSrcweir aDefaults.Put( rPattern.GetItem(ATTR_CTL_FONT_HEIGHT), EE_CHAR_FONTHEIGHT_CTL );
288cdf0e10cSrcweir pHdrEngine->SetDefaults( aDefaults );
289cdf0e10cSrcweir
290cdf0e10cSrcweir ScHeaderFieldData aData;
291cdf0e10cSrcweir ScHeaderFooterTextObj::FillDummyFieldData( aData );
292cdf0e10cSrcweir pHdrEngine->SetData( aData );
293cdf0e10cSrcweir
294cdf0e10cSrcweir pEditEngine = pHdrEngine;
295cdf0e10cSrcweir pForwarder = new SvxEditEngineForwarder(*pEditEngine);
296cdf0e10cSrcweir }
297cdf0e10cSrcweir
298cdf0e10cSrcweir if (bDataValid)
299cdf0e10cSrcweir return pForwarder;
300cdf0e10cSrcweir
301cdf0e10cSrcweir const EditTextObject* pData;
302cdf0e10cSrcweir if (nPart == SC_HDFT_LEFT)
303cdf0e10cSrcweir pData = rContentObj.GetLeftEditObject();
304cdf0e10cSrcweir else if (nPart == SC_HDFT_CENTER)
305cdf0e10cSrcweir pData = rContentObj.GetCenterEditObject();
306cdf0e10cSrcweir else
307cdf0e10cSrcweir pData = rContentObj.GetRightEditObject();
308cdf0e10cSrcweir
309cdf0e10cSrcweir if (pData)
310cdf0e10cSrcweir pEditEngine->SetText(*pData);
311cdf0e10cSrcweir
312cdf0e10cSrcweir bDataValid = sal_True;
313cdf0e10cSrcweir return pForwarder;
314cdf0e10cSrcweir }
315cdf0e10cSrcweir
UpdateData()316cdf0e10cSrcweir void ScHeaderFooterTextData::UpdateData()
317cdf0e10cSrcweir {
318cdf0e10cSrcweir if ( pEditEngine )
319cdf0e10cSrcweir {
320cdf0e10cSrcweir bInUpdate = sal_True; // don't reset bDataValid during UpdateText
321cdf0e10cSrcweir
322cdf0e10cSrcweir rContentObj.UpdateText( nPart, *pEditEngine );
323cdf0e10cSrcweir
324cdf0e10cSrcweir bInUpdate = sal_False;
325cdf0e10cSrcweir }
326cdf0e10cSrcweir }
327cdf0e10cSrcweir
328cdf0e10cSrcweir //------------------------------------------------------------------------
329cdf0e10cSrcweir
ScHeaderFooterTextObj(ScHeaderFooterContentObj & rContent,sal_uInt16 nP)330cdf0e10cSrcweir ScHeaderFooterTextObj::ScHeaderFooterTextObj( ScHeaderFooterContentObj& rContent,
331cdf0e10cSrcweir sal_uInt16 nP ) :
332cdf0e10cSrcweir aTextData( rContent, nP ),
333cdf0e10cSrcweir pUnoText( NULL )
334cdf0e10cSrcweir {
335cdf0e10cSrcweir // ScHeaderFooterTextData acquires rContent
336cdf0e10cSrcweir // pUnoText is created on demand (getString/setString work without it)
337cdf0e10cSrcweir }
338cdf0e10cSrcweir
CreateUnoText_Impl()339cdf0e10cSrcweir void ScHeaderFooterTextObj::CreateUnoText_Impl()
340cdf0e10cSrcweir {
341cdf0e10cSrcweir if ( !pUnoText )
342cdf0e10cSrcweir {
343cdf0e10cSrcweir // can't be aggregated because getString/setString is handled here
344cdf0e10cSrcweir ScSharedHeaderFooterEditSource aEditSource( &aTextData );
345cdf0e10cSrcweir pUnoText = new SvxUnoText( &aEditSource, lcl_GetHdFtPropertySet(), uno::Reference<text::XText>() );
346cdf0e10cSrcweir pUnoText->acquire();
347cdf0e10cSrcweir }
348cdf0e10cSrcweir }
349cdf0e10cSrcweir
~ScHeaderFooterTextObj()350cdf0e10cSrcweir ScHeaderFooterTextObj::~ScHeaderFooterTextObj()
351cdf0e10cSrcweir {
352cdf0e10cSrcweir if (pUnoText)
353cdf0e10cSrcweir pUnoText->release();
354cdf0e10cSrcweir }
355cdf0e10cSrcweir
GetUnoText()356cdf0e10cSrcweir const SvxUnoText& ScHeaderFooterTextObj::GetUnoText()
357cdf0e10cSrcweir {
358cdf0e10cSrcweir if (!pUnoText)
359cdf0e10cSrcweir CreateUnoText_Impl();
360cdf0e10cSrcweir return *pUnoText;
361cdf0e10cSrcweir }
362cdf0e10cSrcweir
363cdf0e10cSrcweir // XText
364cdf0e10cSrcweir
createTextCursor()365cdf0e10cSrcweir uno::Reference<text::XTextCursor> SAL_CALL ScHeaderFooterTextObj::createTextCursor()
366cdf0e10cSrcweir throw(uno::RuntimeException)
367cdf0e10cSrcweir {
368cdf0e10cSrcweir ScUnoGuard aGuard;
369cdf0e10cSrcweir return new ScHeaderFooterTextCursor( *this );
370cdf0e10cSrcweir }
371cdf0e10cSrcweir
createTextCursorByRange(const uno::Reference<text::XTextRange> & aTextPosition)372cdf0e10cSrcweir uno::Reference<text::XTextCursor> SAL_CALL ScHeaderFooterTextObj::createTextCursorByRange(
373cdf0e10cSrcweir const uno::Reference<text::XTextRange>& aTextPosition )
374cdf0e10cSrcweir throw(uno::RuntimeException)
375cdf0e10cSrcweir {
376cdf0e10cSrcweir ScUnoGuard aGuard;
377cdf0e10cSrcweir if (!pUnoText)
378cdf0e10cSrcweir CreateUnoText_Impl();
379cdf0e10cSrcweir return pUnoText->createTextCursorByRange(aTextPosition);
380cdf0e10cSrcweir //! wie ScCellObj::createTextCursorByRange, wenn SvxUnoTextRange_getReflection verfuegbar
381cdf0e10cSrcweir }
382cdf0e10cSrcweir
FillDummyFieldData(ScHeaderFieldData & rData)383cdf0e10cSrcweir void ScHeaderFooterTextObj::FillDummyFieldData( ScHeaderFieldData& rData ) // static
384cdf0e10cSrcweir {
385cdf0e10cSrcweir String aDummy(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( "???" )));
386cdf0e10cSrcweir rData.aTitle = aDummy;
387cdf0e10cSrcweir rData.aLongDocName = aDummy;
388cdf0e10cSrcweir rData.aShortDocName = aDummy;
389cdf0e10cSrcweir rData.aTabName = aDummy;
390cdf0e10cSrcweir rData.nPageNo = 1;
391cdf0e10cSrcweir rData.nTotalPages = 99;
392cdf0e10cSrcweir }
393cdf0e10cSrcweir
getString()394cdf0e10cSrcweir rtl::OUString SAL_CALL ScHeaderFooterTextObj::getString() throw(uno::RuntimeException)
395cdf0e10cSrcweir {
396cdf0e10cSrcweir ScUnoGuard aGuard;
397cdf0e10cSrcweir rtl::OUString aRet;
398cdf0e10cSrcweir const EditTextObject* pData;
399cdf0e10cSrcweir
400cdf0e10cSrcweir sal_uInt16 nPart = aTextData.GetPart();
401cdf0e10cSrcweir ScHeaderFooterContentObj& rContentObj = aTextData.GetContentObj();
402cdf0e10cSrcweir
403cdf0e10cSrcweir if (nPart == SC_HDFT_LEFT)
404cdf0e10cSrcweir pData = rContentObj.GetLeftEditObject();
405cdf0e10cSrcweir else if (nPart == SC_HDFT_CENTER)
406cdf0e10cSrcweir pData = rContentObj.GetCenterEditObject();
407cdf0e10cSrcweir else
408cdf0e10cSrcweir pData = rContentObj.GetRightEditObject();
409cdf0e10cSrcweir if (pData)
410cdf0e10cSrcweir {
411cdf0e10cSrcweir // for pure text, no font info is needed in pool defaults
412cdf0e10cSrcweir ScHeaderEditEngine aEditEngine( EditEngine::CreatePool(), sal_True );
413cdf0e10cSrcweir
414cdf0e10cSrcweir ScHeaderFieldData aData;
415cdf0e10cSrcweir FillDummyFieldData( aData );
416cdf0e10cSrcweir aEditEngine.SetData( aData );
417cdf0e10cSrcweir
418cdf0e10cSrcweir aEditEngine.SetText(*pData);
419cdf0e10cSrcweir aRet = ScEditUtil::GetSpaceDelimitedString( aEditEngine );
420cdf0e10cSrcweir }
421cdf0e10cSrcweir return aRet;
422cdf0e10cSrcweir }
423cdf0e10cSrcweir
setString(const rtl::OUString & aText)424cdf0e10cSrcweir void SAL_CALL ScHeaderFooterTextObj::setString( const rtl::OUString& aText ) throw(uno::RuntimeException)
425cdf0e10cSrcweir {
426cdf0e10cSrcweir ScUnoGuard aGuard;
427cdf0e10cSrcweir String aString(aText);
428cdf0e10cSrcweir
429cdf0e10cSrcweir // for pure text, no font info is needed in pool defaults
430cdf0e10cSrcweir ScHeaderEditEngine aEditEngine( EditEngine::CreatePool(), sal_True );
431cdf0e10cSrcweir aEditEngine.SetText( aString );
432cdf0e10cSrcweir
433cdf0e10cSrcweir aTextData.GetContentObj().UpdateText( aTextData.GetPart(), aEditEngine );
434cdf0e10cSrcweir }
435cdf0e10cSrcweir
insertString(const uno::Reference<text::XTextRange> & xRange,const rtl::OUString & aString,sal_Bool bAbsorb)436cdf0e10cSrcweir void SAL_CALL ScHeaderFooterTextObj::insertString( const uno::Reference<text::XTextRange>& xRange,
437cdf0e10cSrcweir const rtl::OUString& aString, sal_Bool bAbsorb )
438cdf0e10cSrcweir throw(uno::RuntimeException)
439cdf0e10cSrcweir {
440cdf0e10cSrcweir ScUnoGuard aGuard;
441cdf0e10cSrcweir if (!pUnoText)
442cdf0e10cSrcweir CreateUnoText_Impl();
443cdf0e10cSrcweir pUnoText->insertString( xRange, aString, bAbsorb );
444cdf0e10cSrcweir }
445cdf0e10cSrcweir
insertControlCharacter(const uno::Reference<text::XTextRange> & xRange,sal_Int16 nControlCharacter,sal_Bool bAbsorb)446cdf0e10cSrcweir void SAL_CALL ScHeaderFooterTextObj::insertControlCharacter(
447cdf0e10cSrcweir const uno::Reference<text::XTextRange>& xRange,
448cdf0e10cSrcweir sal_Int16 nControlCharacter, sal_Bool bAbsorb )
449cdf0e10cSrcweir throw(lang::IllegalArgumentException, uno::RuntimeException)
450cdf0e10cSrcweir {
451cdf0e10cSrcweir ScUnoGuard aGuard;
452cdf0e10cSrcweir if (!pUnoText)
453cdf0e10cSrcweir CreateUnoText_Impl();
454cdf0e10cSrcweir pUnoText->insertControlCharacter( xRange, nControlCharacter, bAbsorb );
455cdf0e10cSrcweir }
456cdf0e10cSrcweir
insertTextContent(const uno::Reference<text::XTextRange> & xRange,const uno::Reference<text::XTextContent> & xContent,sal_Bool bAbsorb)457cdf0e10cSrcweir void SAL_CALL ScHeaderFooterTextObj::insertTextContent(
458cdf0e10cSrcweir const uno::Reference<text::XTextRange >& xRange,
459cdf0e10cSrcweir const uno::Reference<text::XTextContent >& xContent,
460cdf0e10cSrcweir sal_Bool bAbsorb )
461cdf0e10cSrcweir throw(lang::IllegalArgumentException, uno::RuntimeException)
462cdf0e10cSrcweir {
463cdf0e10cSrcweir ScUnoGuard aGuard;
464cdf0e10cSrcweir if ( xContent.is() && xRange.is() )
465cdf0e10cSrcweir {
466cdf0e10cSrcweir ScHeaderFieldObj* pHeaderField = ScHeaderFieldObj::getImplementation( xContent );
467cdf0e10cSrcweir
468cdf0e10cSrcweir SvxUnoTextRangeBase* pTextRange =
469cdf0e10cSrcweir ScHeaderFooterTextCursor::getImplementation( xRange );
470cdf0e10cSrcweir
471cdf0e10cSrcweir #if 0
472cdf0e10cSrcweir if (!pTextRange)
473cdf0e10cSrcweir pTextRange = (SvxUnoTextRange*)xRange->getImplementation(
474cdf0e10cSrcweir SvxUnoTextRange_getReflection() );
475cdf0e10cSrcweir //! bei SvxUnoTextRange testen, ob in passendem Objekt !!!
476cdf0e10cSrcweir #endif
477cdf0e10cSrcweir
478cdf0e10cSrcweir if ( pHeaderField && !pHeaderField->IsInserted() && pTextRange )
479cdf0e10cSrcweir {
480cdf0e10cSrcweir SvxEditSource* pEditSource = pTextRange->GetEditSource();
481cdf0e10cSrcweir ESelection aSelection(pTextRange->GetSelection());
482cdf0e10cSrcweir
483cdf0e10cSrcweir if (!bAbsorb)
484cdf0e10cSrcweir {
485cdf0e10cSrcweir // don't replace -> append at end
486cdf0e10cSrcweir aSelection.Adjust();
487cdf0e10cSrcweir aSelection.nStartPara = aSelection.nEndPara;
488cdf0e10cSrcweir aSelection.nStartPos = aSelection.nEndPos;
489cdf0e10cSrcweir }
490cdf0e10cSrcweir
491cdf0e10cSrcweir SvxFieldItem aItem(pHeaderField->CreateFieldItem());
492cdf0e10cSrcweir
493cdf0e10cSrcweir SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder();
494cdf0e10cSrcweir pForwarder->QuickInsertField( aItem, aSelection );
495cdf0e10cSrcweir pEditSource->UpdateData();
496cdf0e10cSrcweir
497cdf0e10cSrcweir // neue Selektion: ein Zeichen
498cdf0e10cSrcweir aSelection.Adjust();
499cdf0e10cSrcweir aSelection.nEndPara = aSelection.nStartPara;
500cdf0e10cSrcweir aSelection.nEndPos = aSelection.nStartPos + 1;
501cdf0e10cSrcweir pHeaderField->InitDoc( &aTextData.GetContentObj(), aTextData.GetPart(), aSelection );
502cdf0e10cSrcweir
503cdf0e10cSrcweir // #91431# for bAbsorb=sal_False, the new selection must be behind the inserted content
504cdf0e10cSrcweir // (the xml filter relies on this)
505cdf0e10cSrcweir if (!bAbsorb)
506cdf0e10cSrcweir aSelection.nStartPos = aSelection.nEndPos;
507cdf0e10cSrcweir
508cdf0e10cSrcweir pTextRange->SetSelection( aSelection );
509cdf0e10cSrcweir
510cdf0e10cSrcweir return;
511cdf0e10cSrcweir }
512cdf0e10cSrcweir }
513cdf0e10cSrcweir
514cdf0e10cSrcweir if (!pUnoText)
515cdf0e10cSrcweir CreateUnoText_Impl();
516cdf0e10cSrcweir pUnoText->insertTextContent( xRange, xContent, bAbsorb );
517cdf0e10cSrcweir }
518cdf0e10cSrcweir
removeTextContent(const uno::Reference<text::XTextContent> & xContent)519cdf0e10cSrcweir void SAL_CALL ScHeaderFooterTextObj::removeTextContent(
520cdf0e10cSrcweir const uno::Reference<text::XTextContent>& xContent )
521cdf0e10cSrcweir throw(container::NoSuchElementException, uno::RuntimeException)
522cdf0e10cSrcweir {
523cdf0e10cSrcweir ScUnoGuard aGuard;
524cdf0e10cSrcweir if ( xContent.is() )
525cdf0e10cSrcweir {
526cdf0e10cSrcweir ScHeaderFieldObj* pHeaderField = ScHeaderFieldObj::getImplementation( xContent );
527cdf0e10cSrcweir if ( pHeaderField && pHeaderField->IsInserted() )
528cdf0e10cSrcweir {
529cdf0e10cSrcweir //! Testen, ob das Feld in dieser Zelle ist
530cdf0e10cSrcweir pHeaderField->DeleteField();
531cdf0e10cSrcweir return;
532cdf0e10cSrcweir }
533cdf0e10cSrcweir }
534cdf0e10cSrcweir if (!pUnoText)
535cdf0e10cSrcweir CreateUnoText_Impl();
536cdf0e10cSrcweir pUnoText->removeTextContent( xContent );
537cdf0e10cSrcweir }
538cdf0e10cSrcweir
getText()539cdf0e10cSrcweir uno::Reference<text::XText> SAL_CALL ScHeaderFooterTextObj::getText() throw(uno::RuntimeException)
540cdf0e10cSrcweir {
541cdf0e10cSrcweir ScUnoGuard aGuard;
542cdf0e10cSrcweir if (!pUnoText)
543cdf0e10cSrcweir CreateUnoText_Impl();
544cdf0e10cSrcweir return pUnoText->getText();
545cdf0e10cSrcweir }
546cdf0e10cSrcweir
getStart()547cdf0e10cSrcweir uno::Reference<text::XTextRange> SAL_CALL ScHeaderFooterTextObj::getStart() throw(uno::RuntimeException)
548cdf0e10cSrcweir {
549cdf0e10cSrcweir ScUnoGuard aGuard;
550cdf0e10cSrcweir if (!pUnoText)
551cdf0e10cSrcweir CreateUnoText_Impl();
552cdf0e10cSrcweir return pUnoText->getStart();
553cdf0e10cSrcweir }
554cdf0e10cSrcweir
getEnd()555cdf0e10cSrcweir uno::Reference<text::XTextRange> SAL_CALL ScHeaderFooterTextObj::getEnd() throw(uno::RuntimeException)
556cdf0e10cSrcweir {
557cdf0e10cSrcweir ScUnoGuard aGuard;
558cdf0e10cSrcweir if (!pUnoText)
559cdf0e10cSrcweir CreateUnoText_Impl();
560cdf0e10cSrcweir return pUnoText->getEnd();
561cdf0e10cSrcweir }
562cdf0e10cSrcweir
563cdf0e10cSrcweir // XTextFieldsSupplier
564cdf0e10cSrcweir
getTextFields()565cdf0e10cSrcweir uno::Reference<container::XEnumerationAccess> SAL_CALL ScHeaderFooterTextObj::getTextFields()
566cdf0e10cSrcweir throw(uno::RuntimeException)
567cdf0e10cSrcweir {
568cdf0e10cSrcweir ScUnoGuard aGuard;
569cdf0e10cSrcweir // all fields
570cdf0e10cSrcweir return new ScHeaderFieldsObj( &aTextData.GetContentObj(), aTextData.GetPart(), SC_SERVICE_INVALID );
571cdf0e10cSrcweir }
572cdf0e10cSrcweir
getTextFieldMasters()573cdf0e10cSrcweir uno::Reference<container::XNameAccess> SAL_CALL ScHeaderFooterTextObj::getTextFieldMasters()
574cdf0e10cSrcweir throw(uno::RuntimeException)
575cdf0e10cSrcweir {
576cdf0e10cSrcweir // sowas gibts nicht im Calc (?)
577cdf0e10cSrcweir return NULL;
578cdf0e10cSrcweir }
579cdf0e10cSrcweir
580cdf0e10cSrcweir // XTextRangeMover
581cdf0e10cSrcweir
moveTextRange(const uno::Reference<text::XTextRange> & xRange,sal_Int16 nParagraphs)582cdf0e10cSrcweir void SAL_CALL ScHeaderFooterTextObj::moveTextRange(
583cdf0e10cSrcweir const uno::Reference<text::XTextRange>& xRange,
584cdf0e10cSrcweir sal_Int16 nParagraphs )
585cdf0e10cSrcweir throw(uno::RuntimeException)
586cdf0e10cSrcweir {
587cdf0e10cSrcweir ScUnoGuard aGuard;
588cdf0e10cSrcweir if (!pUnoText)
589cdf0e10cSrcweir CreateUnoText_Impl();
590cdf0e10cSrcweir pUnoText->moveTextRange( xRange, nParagraphs );
591cdf0e10cSrcweir }
592cdf0e10cSrcweir
593cdf0e10cSrcweir // XEnumerationAccess
594cdf0e10cSrcweir
createEnumeration()595cdf0e10cSrcweir uno::Reference<container::XEnumeration> SAL_CALL ScHeaderFooterTextObj::createEnumeration()
596cdf0e10cSrcweir throw(uno::RuntimeException)
597cdf0e10cSrcweir {
598cdf0e10cSrcweir ScUnoGuard aGuard;
599cdf0e10cSrcweir if (!pUnoText)
600cdf0e10cSrcweir CreateUnoText_Impl();
601cdf0e10cSrcweir return pUnoText->createEnumeration();
602cdf0e10cSrcweir }
603cdf0e10cSrcweir
604cdf0e10cSrcweir // XElementAccess
605cdf0e10cSrcweir
getElementType()606cdf0e10cSrcweir uno::Type SAL_CALL ScHeaderFooterTextObj::getElementType() throw(uno::RuntimeException)
607cdf0e10cSrcweir {
608cdf0e10cSrcweir ScUnoGuard aGuard;
609cdf0e10cSrcweir if (!pUnoText)
610cdf0e10cSrcweir CreateUnoText_Impl();
611cdf0e10cSrcweir return pUnoText->getElementType();
612cdf0e10cSrcweir }
613cdf0e10cSrcweir
hasElements()614cdf0e10cSrcweir sal_Bool SAL_CALL ScHeaderFooterTextObj::hasElements() throw(uno::RuntimeException)
615cdf0e10cSrcweir {
616cdf0e10cSrcweir ScUnoGuard aGuard;
617cdf0e10cSrcweir if (!pUnoText)
618cdf0e10cSrcweir CreateUnoText_Impl();
619cdf0e10cSrcweir return pUnoText->hasElements();
620cdf0e10cSrcweir }
621cdf0e10cSrcweir
622cdf0e10cSrcweir //------------------------------------------------------------------------
623cdf0e10cSrcweir
ScCellTextCursor(const ScCellTextCursor & rOther)624cdf0e10cSrcweir ScCellTextCursor::ScCellTextCursor(const ScCellTextCursor& rOther) :
625cdf0e10cSrcweir SvxUnoTextCursor( rOther ),
626cdf0e10cSrcweir rTextObj( rOther.rTextObj )
627cdf0e10cSrcweir {
628cdf0e10cSrcweir rTextObj.acquire();
629cdf0e10cSrcweir }
630cdf0e10cSrcweir
ScCellTextCursor(ScCellObj & rText)631cdf0e10cSrcweir ScCellTextCursor::ScCellTextCursor(ScCellObj& rText) :
632cdf0e10cSrcweir SvxUnoTextCursor( rText.GetUnoText() ),
633cdf0e10cSrcweir rTextObj( rText )
634cdf0e10cSrcweir {
635cdf0e10cSrcweir rTextObj.acquire();
636cdf0e10cSrcweir }
637cdf0e10cSrcweir
~ScCellTextCursor()638cdf0e10cSrcweir ScCellTextCursor::~ScCellTextCursor() throw()
639cdf0e10cSrcweir {
640cdf0e10cSrcweir rTextObj.release();
641cdf0e10cSrcweir }
642cdf0e10cSrcweir
643cdf0e10cSrcweir // SvxUnoTextCursor methods reimplemented here to return the right objects:
644cdf0e10cSrcweir
getText()645cdf0e10cSrcweir uno::Reference<text::XText> SAL_CALL ScCellTextCursor::getText() throw(uno::RuntimeException)
646cdf0e10cSrcweir {
647cdf0e10cSrcweir ScUnoGuard aGuard;
648cdf0e10cSrcweir return &rTextObj;
649cdf0e10cSrcweir }
650cdf0e10cSrcweir
getStart()651cdf0e10cSrcweir uno::Reference<text::XTextRange> SAL_CALL ScCellTextCursor::getStart() throw(uno::RuntimeException)
652cdf0e10cSrcweir {
653cdf0e10cSrcweir ScUnoGuard aGuard;
654cdf0e10cSrcweir
655cdf0e10cSrcweir //! use other object for range than cursor?
656cdf0e10cSrcweir
657cdf0e10cSrcweir ScCellTextCursor* pNew = new ScCellTextCursor( *this );
658cdf0e10cSrcweir uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) );
659cdf0e10cSrcweir
660cdf0e10cSrcweir ESelection aNewSel(GetSelection());
661cdf0e10cSrcweir aNewSel.nEndPara = aNewSel.nStartPara;
662cdf0e10cSrcweir aNewSel.nEndPos = aNewSel.nStartPos;
663cdf0e10cSrcweir pNew->SetSelection( aNewSel );
664cdf0e10cSrcweir
665cdf0e10cSrcweir return xRange;
666cdf0e10cSrcweir }
667cdf0e10cSrcweir
getEnd()668cdf0e10cSrcweir uno::Reference<text::XTextRange> SAL_CALL ScCellTextCursor::getEnd() throw(uno::RuntimeException)
669cdf0e10cSrcweir {
670cdf0e10cSrcweir ScUnoGuard aGuard;
671cdf0e10cSrcweir
672cdf0e10cSrcweir //! use other object for range than cursor?
673cdf0e10cSrcweir
674cdf0e10cSrcweir ScCellTextCursor* pNew = new ScCellTextCursor( *this );
675cdf0e10cSrcweir uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) );
676cdf0e10cSrcweir
677cdf0e10cSrcweir ESelection aNewSel(GetSelection());
678cdf0e10cSrcweir aNewSel.nStartPara = aNewSel.nEndPara;
679cdf0e10cSrcweir aNewSel.nStartPos = aNewSel.nEndPos;
680cdf0e10cSrcweir pNew->SetSelection( aNewSel );
681cdf0e10cSrcweir
682cdf0e10cSrcweir return xRange;
683cdf0e10cSrcweir }
684cdf0e10cSrcweir
685cdf0e10cSrcweir // XUnoTunnel
686cdf0e10cSrcweir
getSomething(const uno::Sequence<sal_Int8> & rId)687cdf0e10cSrcweir sal_Int64 SAL_CALL ScCellTextCursor::getSomething(
688cdf0e10cSrcweir const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
689cdf0e10cSrcweir {
690cdf0e10cSrcweir if ( rId.getLength() == 16 &&
691cdf0e10cSrcweir 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
692cdf0e10cSrcweir rId.getConstArray(), 16 ) )
693cdf0e10cSrcweir {
694cdf0e10cSrcweir return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
695cdf0e10cSrcweir }
696cdf0e10cSrcweir return SvxUnoTextCursor::getSomething( rId );
697cdf0e10cSrcweir }
698cdf0e10cSrcweir
699cdf0e10cSrcweir // static
getUnoTunnelId()700cdf0e10cSrcweir const uno::Sequence<sal_Int8>& ScCellTextCursor::getUnoTunnelId()
701cdf0e10cSrcweir {
702cdf0e10cSrcweir static uno::Sequence<sal_Int8> * pSeq = 0;
703cdf0e10cSrcweir if( !pSeq )
704cdf0e10cSrcweir {
705cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
706cdf0e10cSrcweir if( !pSeq )
707cdf0e10cSrcweir {
708cdf0e10cSrcweir static uno::Sequence< sal_Int8 > aSeq( 16 );
709cdf0e10cSrcweir rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
710cdf0e10cSrcweir pSeq = &aSeq;
711cdf0e10cSrcweir }
712cdf0e10cSrcweir }
713cdf0e10cSrcweir return *pSeq;
714cdf0e10cSrcweir }
715cdf0e10cSrcweir
716cdf0e10cSrcweir // static
getImplementation(const uno::Reference<uno::XInterface> xObj)717cdf0e10cSrcweir ScCellTextCursor* ScCellTextCursor::getImplementation( const uno::Reference<uno::XInterface> xObj )
718cdf0e10cSrcweir {
719cdf0e10cSrcweir ScCellTextCursor* pRet = NULL;
720cdf0e10cSrcweir uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
721cdf0e10cSrcweir if (xUT.is())
722cdf0e10cSrcweir pRet = reinterpret_cast<ScCellTextCursor*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
723cdf0e10cSrcweir return pRet;
724cdf0e10cSrcweir }
725cdf0e10cSrcweir
726cdf0e10cSrcweir //------------------------------------------------------------------------
727cdf0e10cSrcweir
ScHeaderFooterTextCursor(const ScHeaderFooterTextCursor & rOther)728cdf0e10cSrcweir ScHeaderFooterTextCursor::ScHeaderFooterTextCursor(const ScHeaderFooterTextCursor& rOther) :
729cdf0e10cSrcweir SvxUnoTextCursor( rOther ),
730cdf0e10cSrcweir rTextObj( rOther.rTextObj )
731cdf0e10cSrcweir {
732cdf0e10cSrcweir rTextObj.acquire();
733cdf0e10cSrcweir }
734cdf0e10cSrcweir
ScHeaderFooterTextCursor(ScHeaderFooterTextObj & rText)735cdf0e10cSrcweir ScHeaderFooterTextCursor::ScHeaderFooterTextCursor(ScHeaderFooterTextObj& rText) :
736cdf0e10cSrcweir SvxUnoTextCursor( rText.GetUnoText() ),
737cdf0e10cSrcweir rTextObj( rText )
738cdf0e10cSrcweir {
739cdf0e10cSrcweir rTextObj.acquire();
740cdf0e10cSrcweir }
741cdf0e10cSrcweir
~ScHeaderFooterTextCursor()742cdf0e10cSrcweir ScHeaderFooterTextCursor::~ScHeaderFooterTextCursor() throw()
743cdf0e10cSrcweir {
744cdf0e10cSrcweir rTextObj.release();
745cdf0e10cSrcweir }
746cdf0e10cSrcweir
747cdf0e10cSrcweir // SvxUnoTextCursor methods reimplemented here to return the right objects:
748cdf0e10cSrcweir
getText()749cdf0e10cSrcweir uno::Reference<text::XText> SAL_CALL ScHeaderFooterTextCursor::getText() throw(uno::RuntimeException)
750cdf0e10cSrcweir {
751cdf0e10cSrcweir ScUnoGuard aGuard;
752cdf0e10cSrcweir return &rTextObj;
753cdf0e10cSrcweir }
754cdf0e10cSrcweir
getStart()755cdf0e10cSrcweir uno::Reference<text::XTextRange> SAL_CALL ScHeaderFooterTextCursor::getStart() throw(uno::RuntimeException)
756cdf0e10cSrcweir {
757cdf0e10cSrcweir ScUnoGuard aGuard;
758cdf0e10cSrcweir
759cdf0e10cSrcweir //! use other object for range than cursor?
760cdf0e10cSrcweir
761cdf0e10cSrcweir ScHeaderFooterTextCursor* pNew = new ScHeaderFooterTextCursor( *this );
762cdf0e10cSrcweir uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) );
763cdf0e10cSrcweir
764cdf0e10cSrcweir ESelection aNewSel(GetSelection());
765cdf0e10cSrcweir aNewSel.nEndPara = aNewSel.nStartPara;
766cdf0e10cSrcweir aNewSel.nEndPos = aNewSel.nStartPos;
767cdf0e10cSrcweir pNew->SetSelection( aNewSel );
768cdf0e10cSrcweir
769cdf0e10cSrcweir return xRange;
770cdf0e10cSrcweir }
771cdf0e10cSrcweir
getEnd()772cdf0e10cSrcweir uno::Reference<text::XTextRange> SAL_CALL ScHeaderFooterTextCursor::getEnd() throw(uno::RuntimeException)
773cdf0e10cSrcweir {
774cdf0e10cSrcweir ScUnoGuard aGuard;
775cdf0e10cSrcweir
776cdf0e10cSrcweir //! use other object for range than cursor?
777cdf0e10cSrcweir
778cdf0e10cSrcweir ScHeaderFooterTextCursor* pNew = new ScHeaderFooterTextCursor( *this );
779cdf0e10cSrcweir uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) );
780cdf0e10cSrcweir
781cdf0e10cSrcweir ESelection aNewSel(GetSelection());
782cdf0e10cSrcweir aNewSel.nStartPara = aNewSel.nEndPara;
783cdf0e10cSrcweir aNewSel.nStartPos = aNewSel.nEndPos;
784cdf0e10cSrcweir pNew->SetSelection( aNewSel );
785cdf0e10cSrcweir
786cdf0e10cSrcweir return xRange;
787cdf0e10cSrcweir }
788cdf0e10cSrcweir
789cdf0e10cSrcweir // XUnoTunnel
790cdf0e10cSrcweir
getSomething(const uno::Sequence<sal_Int8> & rId)791cdf0e10cSrcweir sal_Int64 SAL_CALL ScHeaderFooterTextCursor::getSomething(
792cdf0e10cSrcweir const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
793cdf0e10cSrcweir {
794cdf0e10cSrcweir if ( rId.getLength() == 16 &&
795cdf0e10cSrcweir 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
796cdf0e10cSrcweir rId.getConstArray(), 16 ) )
797cdf0e10cSrcweir {
798cdf0e10cSrcweir return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
799cdf0e10cSrcweir }
800cdf0e10cSrcweir return SvxUnoTextCursor::getSomething( rId );
801cdf0e10cSrcweir }
802cdf0e10cSrcweir
803cdf0e10cSrcweir // static
getUnoTunnelId()804cdf0e10cSrcweir const uno::Sequence<sal_Int8>& ScHeaderFooterTextCursor::getUnoTunnelId()
805cdf0e10cSrcweir {
806cdf0e10cSrcweir static uno::Sequence<sal_Int8> * pSeq = 0;
807cdf0e10cSrcweir if( !pSeq )
808cdf0e10cSrcweir {
809cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
810cdf0e10cSrcweir if( !pSeq )
811cdf0e10cSrcweir {
812cdf0e10cSrcweir static uno::Sequence< sal_Int8 > aSeq( 16 );
813cdf0e10cSrcweir rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
814cdf0e10cSrcweir pSeq = &aSeq;
815cdf0e10cSrcweir }
816cdf0e10cSrcweir }
817cdf0e10cSrcweir return *pSeq;
818cdf0e10cSrcweir }
819cdf0e10cSrcweir
820cdf0e10cSrcweir // static
getImplementation(const uno::Reference<uno::XInterface> xObj)821cdf0e10cSrcweir ScHeaderFooterTextCursor* ScHeaderFooterTextCursor::getImplementation(
822cdf0e10cSrcweir const uno::Reference<uno::XInterface> xObj )
823cdf0e10cSrcweir {
824cdf0e10cSrcweir ScHeaderFooterTextCursor* pRet = NULL;
825cdf0e10cSrcweir uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
826cdf0e10cSrcweir if (xUT.is())
827cdf0e10cSrcweir pRet = reinterpret_cast<ScHeaderFooterTextCursor*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
828cdf0e10cSrcweir return pRet;
829cdf0e10cSrcweir }
830cdf0e10cSrcweir
831cdf0e10cSrcweir //------------------------------------------------------------------------
832cdf0e10cSrcweir
ScDrawTextCursor(const ScDrawTextCursor & rOther)833cdf0e10cSrcweir ScDrawTextCursor::ScDrawTextCursor(const ScDrawTextCursor& rOther) :
834cdf0e10cSrcweir SvxUnoTextCursor( rOther ),
835cdf0e10cSrcweir xParentText( rOther.xParentText )
836cdf0e10cSrcweir {
837cdf0e10cSrcweir }
838cdf0e10cSrcweir
ScDrawTextCursor(const uno::Reference<text::XText> & xParent,const SvxUnoTextBase & rText)839cdf0e10cSrcweir ScDrawTextCursor::ScDrawTextCursor( const uno::Reference<text::XText>& xParent,
840cdf0e10cSrcweir const SvxUnoTextBase& rText ) :
841cdf0e10cSrcweir SvxUnoTextCursor( rText ),
842cdf0e10cSrcweir xParentText( xParent )
843cdf0e10cSrcweir
844cdf0e10cSrcweir {
845cdf0e10cSrcweir }
846cdf0e10cSrcweir
~ScDrawTextCursor()847cdf0e10cSrcweir ScDrawTextCursor::~ScDrawTextCursor() throw()
848cdf0e10cSrcweir {
849cdf0e10cSrcweir }
850cdf0e10cSrcweir
851cdf0e10cSrcweir // SvxUnoTextCursor methods reimplemented here to return the right objects:
852cdf0e10cSrcweir
getText()853cdf0e10cSrcweir uno::Reference<text::XText> SAL_CALL ScDrawTextCursor::getText() throw(uno::RuntimeException)
854cdf0e10cSrcweir {
855cdf0e10cSrcweir ScUnoGuard aGuard;
856cdf0e10cSrcweir return xParentText;
857cdf0e10cSrcweir }
858cdf0e10cSrcweir
getStart()859cdf0e10cSrcweir uno::Reference<text::XTextRange> SAL_CALL ScDrawTextCursor::getStart() throw(uno::RuntimeException)
860cdf0e10cSrcweir {
861cdf0e10cSrcweir ScUnoGuard aGuard;
862cdf0e10cSrcweir
863cdf0e10cSrcweir //! use other object for range than cursor?
864cdf0e10cSrcweir
865cdf0e10cSrcweir ScDrawTextCursor* pNew = new ScDrawTextCursor( *this );
866cdf0e10cSrcweir uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) );
867cdf0e10cSrcweir
868cdf0e10cSrcweir ESelection aNewSel(GetSelection());
869cdf0e10cSrcweir aNewSel.nEndPara = aNewSel.nStartPara;
870cdf0e10cSrcweir aNewSel.nEndPos = aNewSel.nStartPos;
871cdf0e10cSrcweir pNew->SetSelection( aNewSel );
872cdf0e10cSrcweir
873cdf0e10cSrcweir return xRange;
874cdf0e10cSrcweir }
875cdf0e10cSrcweir
getEnd()876cdf0e10cSrcweir uno::Reference<text::XTextRange> SAL_CALL ScDrawTextCursor::getEnd() throw(uno::RuntimeException)
877cdf0e10cSrcweir {
878cdf0e10cSrcweir ScUnoGuard aGuard;
879cdf0e10cSrcweir
880cdf0e10cSrcweir //! use other object for range than cursor?
881cdf0e10cSrcweir
882cdf0e10cSrcweir ScDrawTextCursor* pNew = new ScDrawTextCursor( *this );
883cdf0e10cSrcweir uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) );
884cdf0e10cSrcweir
885cdf0e10cSrcweir ESelection aNewSel(GetSelection());
886cdf0e10cSrcweir aNewSel.nStartPara = aNewSel.nEndPara;
887cdf0e10cSrcweir aNewSel.nStartPos = aNewSel.nEndPos;
888cdf0e10cSrcweir pNew->SetSelection( aNewSel );
889cdf0e10cSrcweir
890cdf0e10cSrcweir return xRange;
891cdf0e10cSrcweir }
892cdf0e10cSrcweir
893cdf0e10cSrcweir // XUnoTunnel
894cdf0e10cSrcweir
getSomething(const uno::Sequence<sal_Int8> & rId)895cdf0e10cSrcweir sal_Int64 SAL_CALL ScDrawTextCursor::getSomething(
896cdf0e10cSrcweir const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
897cdf0e10cSrcweir {
898cdf0e10cSrcweir if ( rId.getLength() == 16 &&
899cdf0e10cSrcweir 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
900cdf0e10cSrcweir rId.getConstArray(), 16 ) )
901cdf0e10cSrcweir {
902cdf0e10cSrcweir return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
903cdf0e10cSrcweir }
904cdf0e10cSrcweir return SvxUnoTextCursor::getSomething( rId );
905cdf0e10cSrcweir }
906cdf0e10cSrcweir
907cdf0e10cSrcweir // static
getUnoTunnelId()908cdf0e10cSrcweir const uno::Sequence<sal_Int8>& ScDrawTextCursor::getUnoTunnelId()
909cdf0e10cSrcweir {
910cdf0e10cSrcweir static uno::Sequence<sal_Int8> * pSeq = 0;
911cdf0e10cSrcweir if( !pSeq )
912cdf0e10cSrcweir {
913cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
914cdf0e10cSrcweir if( !pSeq )
915cdf0e10cSrcweir {
916cdf0e10cSrcweir static uno::Sequence< sal_Int8 > aSeq( 16 );
917cdf0e10cSrcweir rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
918cdf0e10cSrcweir pSeq = &aSeq;
919cdf0e10cSrcweir }
920cdf0e10cSrcweir }
921cdf0e10cSrcweir return *pSeq;
922cdf0e10cSrcweir }
923cdf0e10cSrcweir
924cdf0e10cSrcweir // static
getImplementation(const uno::Reference<uno::XInterface> xObj)925cdf0e10cSrcweir ScDrawTextCursor* ScDrawTextCursor::getImplementation( const uno::Reference<uno::XInterface> xObj )
926cdf0e10cSrcweir {
927cdf0e10cSrcweir ScDrawTextCursor* pRet = NULL;
928cdf0e10cSrcweir uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
929cdf0e10cSrcweir if (xUT.is())
930cdf0e10cSrcweir pRet = reinterpret_cast<ScDrawTextCursor*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
931cdf0e10cSrcweir return pRet;
932cdf0e10cSrcweir }
933cdf0e10cSrcweir
934cdf0e10cSrcweir //------------------------------------------------------------------------
935cdf0e10cSrcweir
ScSimpleEditSourceHelper()936cdf0e10cSrcweir ScSimpleEditSourceHelper::ScSimpleEditSourceHelper()
937cdf0e10cSrcweir {
938cdf0e10cSrcweir SfxItemPool* pEnginePool = EditEngine::CreatePool();
939cdf0e10cSrcweir pEnginePool->SetDefaultMetric( SFX_MAPUNIT_100TH_MM );
940cdf0e10cSrcweir pEnginePool->FreezeIdRanges();
941cdf0e10cSrcweir
942cdf0e10cSrcweir pEditEngine = new ScFieldEditEngine( pEnginePool, NULL, sal_True ); // TRUE: become owner of pool
943cdf0e10cSrcweir pForwarder = new SvxEditEngineForwarder( *pEditEngine );
944cdf0e10cSrcweir pOriginalSource = new ScSimpleEditSource( pForwarder );
945cdf0e10cSrcweir }
946cdf0e10cSrcweir
~ScSimpleEditSourceHelper()947cdf0e10cSrcweir ScSimpleEditSourceHelper::~ScSimpleEditSourceHelper()
948cdf0e10cSrcweir {
949cdf0e10cSrcweir ScUnoGuard aGuard; // needed for EditEngine dtor
950cdf0e10cSrcweir
951cdf0e10cSrcweir delete pOriginalSource;
952cdf0e10cSrcweir delete pForwarder;
953cdf0e10cSrcweir delete pEditEngine;
954cdf0e10cSrcweir }
955cdf0e10cSrcweir
ScEditEngineTextObj()956cdf0e10cSrcweir ScEditEngineTextObj::ScEditEngineTextObj() :
957cdf0e10cSrcweir SvxUnoText( GetOriginalSource(), ScCellObj::GetEditPropertySet(), uno::Reference<text::XText>() )
958cdf0e10cSrcweir {
959cdf0e10cSrcweir }
960cdf0e10cSrcweir
~ScEditEngineTextObj()961cdf0e10cSrcweir ScEditEngineTextObj::~ScEditEngineTextObj() throw()
962cdf0e10cSrcweir {
963cdf0e10cSrcweir }
964cdf0e10cSrcweir
SetText(const EditTextObject & rTextObject)965cdf0e10cSrcweir void ScEditEngineTextObj::SetText( const EditTextObject& rTextObject )
966cdf0e10cSrcweir {
967cdf0e10cSrcweir GetEditEngine()->SetText( rTextObject );
968cdf0e10cSrcweir
969cdf0e10cSrcweir ESelection aSel;
970cdf0e10cSrcweir ::GetSelection( aSel, GetEditSource()->GetTextForwarder() );
971cdf0e10cSrcweir SetSelection( aSel );
972cdf0e10cSrcweir }
973cdf0e10cSrcweir
CreateTextObject()974cdf0e10cSrcweir EditTextObject* ScEditEngineTextObj::CreateTextObject()
975cdf0e10cSrcweir {
976cdf0e10cSrcweir return GetEditEngine()->CreateTextObject();
977cdf0e10cSrcweir }
978cdf0e10cSrcweir
979cdf0e10cSrcweir //------------------------------------------------------------------------
980cdf0e10cSrcweir
ScCellTextData(ScDocShell * pDocSh,const ScAddress & rP)981cdf0e10cSrcweir ScCellTextData::ScCellTextData(ScDocShell* pDocSh, const ScAddress& rP) :
982cdf0e10cSrcweir pDocShell( pDocSh ),
983cdf0e10cSrcweir aCellPos( rP ),
984cdf0e10cSrcweir pEditEngine( NULL ),
985cdf0e10cSrcweir pForwarder( NULL ),
986cdf0e10cSrcweir pOriginalSource( NULL ),
987cdf0e10cSrcweir bDataValid( sal_False ),
988cdf0e10cSrcweir bInUpdate( sal_False ),
989cdf0e10cSrcweir bDirty( sal_False ),
990cdf0e10cSrcweir bDoUpdate( sal_True )
991cdf0e10cSrcweir {
992cdf0e10cSrcweir if (pDocShell)
993cdf0e10cSrcweir pDocShell->GetDocument()->AddUnoObject(*this);
994cdf0e10cSrcweir }
995cdf0e10cSrcweir
~ScCellTextData()996cdf0e10cSrcweir ScCellTextData::~ScCellTextData()
997cdf0e10cSrcweir {
998cdf0e10cSrcweir ScUnoGuard aGuard; // needed for EditEngine dtor
999cdf0e10cSrcweir
1000cdf0e10cSrcweir if (pDocShell)
1001cdf0e10cSrcweir {
1002cdf0e10cSrcweir pDocShell->GetDocument()->RemoveUnoObject(*this);
1003cdf0e10cSrcweir pDocShell->GetDocument()->DisposeFieldEditEngine(pEditEngine);
1004cdf0e10cSrcweir }
1005cdf0e10cSrcweir else
1006cdf0e10cSrcweir delete pEditEngine;
1007cdf0e10cSrcweir
1008cdf0e10cSrcweir delete pForwarder;
1009cdf0e10cSrcweir
1010cdf0e10cSrcweir delete pOriginalSource;
1011cdf0e10cSrcweir }
1012cdf0e10cSrcweir
GetOriginalSource()1013cdf0e10cSrcweir ScSharedCellEditSource* ScCellTextData::GetOriginalSource()
1014cdf0e10cSrcweir {
1015cdf0e10cSrcweir if (!pOriginalSource)
1016cdf0e10cSrcweir pOriginalSource = new ScSharedCellEditSource( this );
1017cdf0e10cSrcweir return pOriginalSource;
1018cdf0e10cSrcweir }
1019cdf0e10cSrcweir
GetCellText(const ScAddress & rCellPos,String & rText)1020cdf0e10cSrcweir void ScCellTextData::GetCellText(const ScAddress& rCellPos, String& rText)
1021cdf0e10cSrcweir {
1022cdf0e10cSrcweir if (pDocShell)
1023cdf0e10cSrcweir {
1024cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1025cdf0e10cSrcweir pDoc->GetInputString( rCellPos.Col(), rCellPos.Row(), rCellPos.Tab(), rText );
1026cdf0e10cSrcweir }
1027cdf0e10cSrcweir }
1028cdf0e10cSrcweir
GetTextForwarder()1029cdf0e10cSrcweir SvxTextForwarder* ScCellTextData::GetTextForwarder()
1030cdf0e10cSrcweir {
1031cdf0e10cSrcweir if (!pEditEngine)
1032cdf0e10cSrcweir {
1033cdf0e10cSrcweir if ( pDocShell )
1034cdf0e10cSrcweir {
1035cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1036cdf0e10cSrcweir pEditEngine = pDoc->CreateFieldEditEngine();
1037cdf0e10cSrcweir }
1038cdf0e10cSrcweir else
1039cdf0e10cSrcweir {
1040cdf0e10cSrcweir SfxItemPool* pEnginePool = EditEngine::CreatePool();
1041cdf0e10cSrcweir pEnginePool->FreezeIdRanges();
1042cdf0e10cSrcweir pEditEngine = new ScFieldEditEngine( pEnginePool, NULL, sal_True );
1043cdf0e10cSrcweir }
1044cdf0e10cSrcweir // currently, GetPortions doesn't work if UpdateMode is sal_False,
1045cdf0e10cSrcweir // this will be fixed (in EditEngine) by src600
1046cdf0e10cSrcweir // pEditEngine->SetUpdateMode( sal_False );
1047cdf0e10cSrcweir pEditEngine->EnableUndo( sal_False );
1048cdf0e10cSrcweir if (pDocShell)
1049cdf0e10cSrcweir pEditEngine->SetRefDevice(pDocShell->GetRefDevice());
1050cdf0e10cSrcweir else
1051cdf0e10cSrcweir pEditEngine->SetRefMapMode( MAP_100TH_MM );
1052cdf0e10cSrcweir pForwarder = new SvxEditEngineForwarder(*pEditEngine);
1053cdf0e10cSrcweir }
1054cdf0e10cSrcweir
1055cdf0e10cSrcweir if (bDataValid)
1056cdf0e10cSrcweir return pForwarder;
1057cdf0e10cSrcweir
1058cdf0e10cSrcweir String aText;
1059cdf0e10cSrcweir
1060cdf0e10cSrcweir if (pDocShell)
1061cdf0e10cSrcweir {
1062cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1063cdf0e10cSrcweir
1064cdf0e10cSrcweir SfxItemSet aDefaults( pEditEngine->GetEmptyItemSet() );
1065cdf0e10cSrcweir if( const ScPatternAttr* pPattern =
1066cdf0e10cSrcweir pDoc->GetPattern( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab() ) )
1067cdf0e10cSrcweir {
1068cdf0e10cSrcweir pPattern->FillEditItemSet( &aDefaults );
1069cdf0e10cSrcweir pPattern->FillEditParaItems( &aDefaults ); // including alignment etc. (for reading)
1070cdf0e10cSrcweir }
1071cdf0e10cSrcweir
1072cdf0e10cSrcweir const ScBaseCell* pCell = pDoc->GetCell( aCellPos );
1073cdf0e10cSrcweir if ( pCell && pCell->GetCellType() == CELLTYPE_EDIT )
1074cdf0e10cSrcweir pEditEngine->SetTextNewDefaults( *((const ScEditCell*)pCell)->GetData(), aDefaults );
1075cdf0e10cSrcweir else
1076cdf0e10cSrcweir {
1077cdf0e10cSrcweir GetCellText( aCellPos, aText );
1078cdf0e10cSrcweir if (aText.Len())
1079cdf0e10cSrcweir pEditEngine->SetTextNewDefaults( aText, aDefaults );
1080cdf0e10cSrcweir else
1081cdf0e10cSrcweir pEditEngine->SetDefaults(aDefaults);
1082cdf0e10cSrcweir }
1083cdf0e10cSrcweir }
1084cdf0e10cSrcweir
1085cdf0e10cSrcweir bDataValid = sal_True;
1086cdf0e10cSrcweir return pForwarder;
1087cdf0e10cSrcweir }
1088cdf0e10cSrcweir
UpdateData()1089cdf0e10cSrcweir void ScCellTextData::UpdateData()
1090cdf0e10cSrcweir {
1091cdf0e10cSrcweir if ( bDoUpdate )
1092cdf0e10cSrcweir {
1093cdf0e10cSrcweir DBG_ASSERT(pEditEngine != NULL, "no EditEngine for UpdateData()");
1094cdf0e10cSrcweir if ( pDocShell && pEditEngine )
1095cdf0e10cSrcweir {
1096cdf0e10cSrcweir // during the own UpdateData call, bDataValid must not be reset,
1097cdf0e10cSrcweir // or things like attributes after the text would be lost
1098cdf0e10cSrcweir // (are not stored in the cell)
1099cdf0e10cSrcweir
1100cdf0e10cSrcweir bInUpdate = sal_True; // prevents bDataValid from being reset
1101cdf0e10cSrcweir
1102cdf0e10cSrcweir ScDocFunc aFunc(*pDocShell);
1103cdf0e10cSrcweir aFunc.PutData( aCellPos, *pEditEngine, sal_False, sal_True ); // always as text
1104cdf0e10cSrcweir
1105cdf0e10cSrcweir bInUpdate = sal_False;
1106cdf0e10cSrcweir bDirty = sal_False;
1107cdf0e10cSrcweir }
1108cdf0e10cSrcweir }
1109cdf0e10cSrcweir else
1110cdf0e10cSrcweir bDirty = sal_True;
1111cdf0e10cSrcweir }
1112cdf0e10cSrcweir
Notify(SfxBroadcaster &,const SfxHint & rHint)1113cdf0e10cSrcweir void ScCellTextData::Notify( SfxBroadcaster&, const SfxHint& rHint )
1114cdf0e10cSrcweir {
1115cdf0e10cSrcweir if ( rHint.ISA( ScUpdateRefHint ) )
1116cdf0e10cSrcweir {
1117cdf0e10cSrcweir // const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
1118cdf0e10cSrcweir
1119cdf0e10cSrcweir //! Ref-Update
1120cdf0e10cSrcweir }
1121cdf0e10cSrcweir else if ( rHint.ISA( SfxSimpleHint ) )
1122cdf0e10cSrcweir {
1123cdf0e10cSrcweir sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
1124cdf0e10cSrcweir if ( nId == SFX_HINT_DYING )
1125cdf0e10cSrcweir {
1126cdf0e10cSrcweir pDocShell = NULL; // invalid now
1127cdf0e10cSrcweir
1128cdf0e10cSrcweir DELETEZ( pForwarder );
1129cdf0e10cSrcweir DELETEZ( pEditEngine ); // EditEngine uses document's pool
1130cdf0e10cSrcweir }
1131cdf0e10cSrcweir else if ( nId == SFX_HINT_DATACHANGED )
1132cdf0e10cSrcweir {
1133cdf0e10cSrcweir if (!bInUpdate) // not for own UpdateData calls
1134cdf0e10cSrcweir bDataValid = sal_False; // text has to be read from the cell again
1135cdf0e10cSrcweir }
1136cdf0e10cSrcweir }
1137cdf0e10cSrcweir }
1138cdf0e10cSrcweir
ScCellTextObj(ScDocShell * pDocSh,const ScAddress & rP)1139cdf0e10cSrcweir ScCellTextObj::ScCellTextObj(ScDocShell* pDocSh, const ScAddress& rP) :
1140cdf0e10cSrcweir ScCellTextData( pDocSh, rP ),
1141cdf0e10cSrcweir SvxUnoText( GetOriginalSource(), ScCellObj::GetEditPropertySet(), uno::Reference<text::XText>() )
1142cdf0e10cSrcweir {
1143cdf0e10cSrcweir }
1144cdf0e10cSrcweir
~ScCellTextObj()1145cdf0e10cSrcweir ScCellTextObj::~ScCellTextObj() throw()
1146cdf0e10cSrcweir {
1147cdf0e10cSrcweir }
1148cdf0e10cSrcweir
1149