xref: /aoo41x/main/sc/source/ui/unoobj/textuno.cxx (revision b3f79822)
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