xref: /aoo41x/main/sc/source/ui/unoobj/fielduno.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 #include <svl/smplhint.hxx>
31 
32 
33 #include <editeng/eeitem.hxx>
34 
35 #include <editeng/editeng.hxx>
36 #include <editeng/editobj.hxx>
37 #include <editeng/flditem.hxx>
38 #include <rtl/uuid.h>
39 
40 #include <com/sun/star/beans/PropertyAttribute.hpp>
41 #include <com/sun/star/text/TextContentAnchorType.hpp>
42 #include <com/sun/star/text/WrapTextMode.hpp>
43 #include <com/sun/star/text/FilenameDisplayFormat.hpp>
44 
45 #include "fielduno.hxx"
46 #include "textuno.hxx"
47 #include "miscuno.hxx"
48 #include "docsh.hxx"
49 #include "hints.hxx"
50 #include "editsrc.hxx"
51 #include "cellsuno.hxx"
52 #include "servuno.hxx"		// fuer IDs
53 #include "unoguard.hxx"
54 #include "unonames.hxx"
55 #include "editutil.hxx"
56 
57 using namespace com::sun::star;
58 
59 //------------------------------------------------------------------------
60 
61 //	alles ohne Which-ID, Map nur fuer PropertySetInfo
62 
63 const SfxItemPropertySet* lcl_GetURLPropertySet()
64 {
65     static SfxItemPropertyMapEntry aURLPropertyMap_Impl[] =
66 	{
67         {MAP_CHAR_LEN(SC_UNONAME_ANCTYPE),  0,  &getCppuType((text::TextContentAnchorType*)0), beans::PropertyAttribute::READONLY, 0 },
68         {MAP_CHAR_LEN(SC_UNONAME_ANCTYPES), 0,  &getCppuType((uno::Sequence<text::TextContentAnchorType>*)0), beans::PropertyAttribute::READONLY, 0 },
69         {MAP_CHAR_LEN(SC_UNONAME_REPR),     0,  &getCppuType((rtl::OUString*)0),    0, 0},
70         {MAP_CHAR_LEN(SC_UNONAME_TARGET),   0,  &getCppuType((rtl::OUString*)0),    0, 0},
71         {MAP_CHAR_LEN(SC_UNONAME_TEXTWRAP), 0,  &getCppuType((text::WrapTextMode*)0), beans::PropertyAttribute::READONLY, 0 },
72         {MAP_CHAR_LEN(SC_UNONAME_URL),      0,  &getCppuType((rtl::OUString*)0),    0, 0},
73         {0,0,0,0,0,0}
74 	};
75     static SfxItemPropertySet aURLPropertySet_Impl( aURLPropertyMap_Impl );
76 	return &aURLPropertySet_Impl;
77 }
78 
79 const SfxItemPropertySet* lcl_GetHeaderFieldPropertySet()
80 {
81     static SfxItemPropertyMapEntry aHeaderFieldPropertyMap_Impl[] =
82 	{
83         {MAP_CHAR_LEN(SC_UNONAME_ANCTYPE),  0,  &getCppuType((text::TextContentAnchorType*)0), beans::PropertyAttribute::READONLY, 0 },
84         {MAP_CHAR_LEN(SC_UNONAME_ANCTYPES), 0,  &getCppuType((uno::Sequence<text::TextContentAnchorType>*)0), beans::PropertyAttribute::READONLY, 0 },
85         {MAP_CHAR_LEN(SC_UNONAME_TEXTWRAP), 0,  &getCppuType((text::WrapTextMode*)0), beans::PropertyAttribute::READONLY, 0 },
86         {0,0,0,0,0,0}
87 	};
88     static SfxItemPropertySet aHeaderFieldPropertySet_Impl( aHeaderFieldPropertyMap_Impl );
89 	return &aHeaderFieldPropertySet_Impl;
90 }
91 
92 const SfxItemPropertySet* lcl_GetFileFieldPropertySet()
93 {
94     static SfxItemPropertyMapEntry aFileFieldPropertyMap_Impl[] =
95 	{
96         {MAP_CHAR_LEN(SC_UNONAME_ANCTYPE),  0,  &getCppuType((text::TextContentAnchorType*)0), beans::PropertyAttribute::READONLY, 0 },
97         {MAP_CHAR_LEN(SC_UNONAME_ANCTYPES), 0,  &getCppuType((uno::Sequence<text::TextContentAnchorType>*)0), beans::PropertyAttribute::READONLY, 0 },
98         {MAP_CHAR_LEN(SC_UNONAME_FILEFORM), 0,  &getCppuType((sal_Int16*)0),        0, 0 },
99         {MAP_CHAR_LEN(SC_UNONAME_TEXTWRAP), 0,  &getCppuType((text::WrapTextMode*)0), beans::PropertyAttribute::READONLY, 0 },
100         {0,0,0,0,0,0}
101 	};
102     static SfxItemPropertySet aFileFieldPropertySet_Impl( aFileFieldPropertyMap_Impl );
103     return &aFileFieldPropertySet_Impl;
104 }
105 
106 //------------------------------------------------------------------------
107 
108 #define SCTEXTFIELD_SERVICE			"com.sun.star.text.TextField"
109 #define SCTEXTCONTENT_SERVICE		"com.sun.star.text.TextContent"
110 
111 SC_SIMPLE_SERVICE_INFO( ScCellFieldsObj, "ScCellFieldsObj", "com.sun.star.text.TextFields" )
112 SC_SIMPLE_SERVICE_INFO( ScHeaderFieldsObj, "ScHeaderFieldsObj", "com.sun.star.text.TextFields" )
113 
114 //------------------------------------------------------------------------
115 
116 //	ScUnoEditEngine nur um aus einer EditEngine die Felder herauszubekommen...
117 
118 enum ScUnoCollectMode
119 {
120 	SC_UNO_COLLECT_NONE,
121 	SC_UNO_COLLECT_COUNT,
122 	SC_UNO_COLLECT_FINDINDEX,
123 	SC_UNO_COLLECT_FINDPOS
124 };
125 
126 class ScUnoEditEngine : public ScEditEngineDefaulter
127 {
128 	ScUnoCollectMode	eMode;
129 	sal_uInt16				nFieldCount;
130 	TypeId				aFieldType;
131 	SvxFieldData*		pFound;			// lokale Kopie
132 	sal_uInt16				nFieldPar;
133 	xub_StrLen			nFieldPos;
134 	sal_uInt16				nFieldIndex;
135 
136 public:
137 				ScUnoEditEngine(ScEditEngineDefaulter* pSource);
138 				~ScUnoEditEngine();
139 
140 					//!	nPos should be xub_StrLen
141 	virtual String	CalcFieldValue( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos,
142 									Color*& rTxtColor, Color*& rFldColor );
143 
144 	sal_uInt16			CountFields(TypeId aType);
145 	SvxFieldData*	FindByIndex(sal_uInt16 nIndex, TypeId aType);
146 	SvxFieldData*	FindByPos(sal_uInt16 nPar, xub_StrLen nPos, TypeId aType);
147 
148 	sal_uInt16			GetFieldPar() const		{ return nFieldPar; }
149 	xub_StrLen		GetFieldPos() const		{ return nFieldPos; }
150 };
151 
152 ScUnoEditEngine::ScUnoEditEngine(ScEditEngineDefaulter* pSource) :
153 	ScEditEngineDefaulter( *pSource ),
154 	eMode( SC_UNO_COLLECT_NONE ),
155 	nFieldCount( 0 ),
156 	aFieldType( NULL ),
157 	pFound( NULL )
158 {
159 	if (pSource)
160 	{
161 		EditTextObject* pData = pSource->CreateTextObject();
162 		SetText( *pData );
163 		delete pData;
164 	}
165 }
166 
167 ScUnoEditEngine::~ScUnoEditEngine()
168 {
169 	delete pFound;
170 }
171 
172 String ScUnoEditEngine::CalcFieldValue( const SvxFieldItem& rField,
173 			sal_uInt16 nPara, sal_uInt16 nPos, Color*& rTxtColor, Color*& rFldColor )
174 {
175 	String aRet(EditEngine::CalcFieldValue( rField, nPara, nPos, rTxtColor, rFldColor ));
176 	if (eMode != SC_UNO_COLLECT_NONE)
177 	{
178 		const SvxFieldData*	pFieldData = rField.GetField();
179 		if ( pFieldData )
180 		{
181 			if ( !aFieldType || pFieldData->Type() == aFieldType )
182 			{
183 				if ( eMode == SC_UNO_COLLECT_FINDINDEX && !pFound && nFieldCount == nFieldIndex )
184 				{
185 					pFound = pFieldData->Clone();
186 					nFieldPar = nPara;
187 					nFieldPos = nPos;
188 				}
189 				if ( eMode == SC_UNO_COLLECT_FINDPOS && !pFound &&
190 						nPara == nFieldPar && nPos == nFieldPos )
191 				{
192 					pFound = pFieldData->Clone();
193 					nFieldIndex = nFieldCount;
194 				}
195 				++nFieldCount;
196 			}
197 		}
198 	}
199 	return aRet;
200 }
201 
202 sal_uInt16 ScUnoEditEngine::CountFields(TypeId aType)
203 {
204 	eMode = SC_UNO_COLLECT_COUNT;
205 	aFieldType = aType;
206 	nFieldCount = 0;
207 	UpdateFields();
208 	aFieldType = NULL;
209 	eMode = SC_UNO_COLLECT_NONE;
210 
211 	return nFieldCount;
212 }
213 
214 SvxFieldData* ScUnoEditEngine::FindByIndex(sal_uInt16 nIndex, TypeId aType)
215 {
216 	eMode = SC_UNO_COLLECT_FINDINDEX;
217 	nFieldIndex = nIndex;
218 	aFieldType = aType;
219 	nFieldCount = 0;
220 	UpdateFields();
221 	aFieldType = NULL;
222 	eMode = SC_UNO_COLLECT_NONE;
223 
224 	return pFound;
225 }
226 
227 SvxFieldData* ScUnoEditEngine::FindByPos(sal_uInt16 nPar, xub_StrLen nPos, TypeId aType)
228 {
229 	eMode = SC_UNO_COLLECT_FINDPOS;
230 	nFieldPar = nPar;
231 	nFieldPos = nPos;
232 	aFieldType = aType;
233 	nFieldCount = 0;
234 	UpdateFields();
235 	aFieldType = NULL;
236 	eMode = SC_UNO_COLLECT_NONE;
237 
238 	return pFound;
239 }
240 
241 //------------------------------------------------------------------------
242 
243 ScCellFieldsObj::ScCellFieldsObj(ScDocShell* pDocSh, const ScAddress& rPos) :
244 	pDocShell( pDocSh ),
245 	aCellPos( rPos ),
246     mpRefreshListeners( NULL )
247 {
248 	pDocShell->GetDocument()->AddUnoObject(*this);
249 
250 	pEditSource = new ScCellEditSource( pDocShell, aCellPos );
251 }
252 
253 ScCellFieldsObj::~ScCellFieldsObj()
254 {
255     if (pDocShell)
256 		pDocShell->GetDocument()->RemoveUnoObject(*this);
257 
258 	delete pEditSource;
259 
260 	// increment refcount to prevent double call off dtor
261 	osl_incrementInterlockedCount( &m_refCount );
262 
263     if (mpRefreshListeners)
264 	{
265 		lang::EventObject aEvent;
266 		aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
267 		if (mpRefreshListeners)
268 		{
269 			mpRefreshListeners->disposeAndClear(aEvent);
270 			DELETEZ( mpRefreshListeners );
271 		}
272 	}
273 }
274 
275 void ScCellFieldsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
276 {
277 	if ( rHint.ISA( ScUpdateRefHint ) )
278 	{
279 //        const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
280 
281 		//!	Ref-Update
282 	}
283 	else if ( rHint.ISA( SfxSimpleHint ) &&
284 			((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
285 	{
286 		pDocShell = NULL;		// ungueltig geworden
287 	}
288 
289 	//	EditSource hat sich selber als Listener angemeldet
290 }
291 
292 // XIndexAccess (via XTextFields)
293 
294 ScCellFieldObj* ScCellFieldsObj::GetObjectByIndex_Impl(sal_Int32 Index) const
295 {
296 	//!	Feld-Funktionen muessen an den Forwarder !!!
297 	ScEditEngineDefaulter* pEditEngine = ((ScCellEditSource*)pEditSource)->GetEditEngine();
298 	ScUnoEditEngine aTempEngine(pEditEngine);
299 
300 	if ( aTempEngine.FindByIndex( (sal_uInt16)Index, NULL ) )	// in der Zelle ist der Typ egal
301 	{
302 		sal_uInt16 nPar = aTempEngine.GetFieldPar();
303 		xub_StrLen nPos = aTempEngine.GetFieldPos();
304 		ESelection aSelection( nPar, nPos, nPar, nPos+1 );		// Feld ist 1 Zeichen
305 		return new ScCellFieldObj( pDocShell, aCellPos, aSelection );
306 	}
307 	return NULL;
308 }
309 
310 sal_Int32 SAL_CALL ScCellFieldsObj::getCount() throw(uno::RuntimeException)
311 {
312 	ScUnoGuard aGuard;
313 
314 	//!	Feld-Funktionen muessen an den Forwarder !!!
315 	ScEditEngineDefaulter* pEditEngine = ((ScCellEditSource*)pEditSource)->GetEditEngine();
316 	ScUnoEditEngine aTempEngine(pEditEngine);
317 
318 	return aTempEngine.CountFields(NULL);		// Felder zaehlen, in Zelle ist der Typ egal
319 }
320 
321 uno::Any SAL_CALL ScCellFieldsObj::getByIndex( sal_Int32 nIndex )
322 							throw(lang::IndexOutOfBoundsException,
323 									lang::WrappedTargetException, uno::RuntimeException)
324 {
325 	ScUnoGuard aGuard;
326 	uno::Reference<text::XTextField> xField(GetObjectByIndex_Impl(nIndex));
327 	if (xField.is())
328         return uno::makeAny(xField);
329 	else
330 		throw lang::IndexOutOfBoundsException();
331 //    return uno::Any();
332 }
333 
334 uno::Type SAL_CALL ScCellFieldsObj::getElementType() throw(uno::RuntimeException)
335 {
336 	ScUnoGuard aGuard;
337 	return getCppuType((uno::Reference<text::XTextField>*)0);
338 }
339 
340 sal_Bool SAL_CALL ScCellFieldsObj::hasElements() throw(uno::RuntimeException)
341 {
342 	ScUnoGuard aGuard;
343 	return ( getCount() != 0 );
344 }
345 
346 uno::Reference<container::XEnumeration> SAL_CALL ScCellFieldsObj::createEnumeration()
347 													throw(uno::RuntimeException)
348 {
349 	ScUnoGuard aGuard;
350 	return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextFieldEnumeration")));
351 }
352 
353 void SAL_CALL ScCellFieldsObj::addContainerListener(
354                                 const uno::Reference<container::XContainerListener>& /* xListener */ )
355 									throw(uno::RuntimeException)
356 {
357 	DBG_ERROR("not implemented");
358 }
359 
360 void SAL_CALL ScCellFieldsObj::removeContainerListener(
361                                 const uno::Reference<container::XContainerListener>& /* xListener */ )
362 									throw(uno::RuntimeException)
363 {
364 	DBG_ERROR("not implemented");
365 }
366 
367 // XRefreshable
368 void SAL_CALL ScCellFieldsObj::refresh(  )
369                                     throw (uno::RuntimeException)
370 {
371 	if (mpRefreshListeners)
372 	{
373     	//  Call all listeners.
374 		uno::Sequence< uno::Reference< uno::XInterface > > aListeners(mpRefreshListeners->getElements());
375 		sal_uInt32 nLength(aListeners.getLength());
376 		if (nLength)
377 		{
378 			const uno::Reference< uno::XInterface >* pInterfaces = aListeners.getConstArray();
379 			if (pInterfaces)
380 			{
381                 lang::EventObject aEvent;
382                 aEvent.Source.set(uno::Reference< util::XRefreshable >(const_cast<ScCellFieldsObj*>(this)));
383 				sal_uInt32 i(0);
384 				while (i < nLength)
385 				{
386 					try
387 					{
388 						while(i < nLength)
389 						{
390 							static_cast< util::XRefreshListener* >(pInterfaces->get())->refreshed(aEvent);
391 							++pInterfaces;
392 							++i;
393 						}
394 					}
395 					catch(uno::RuntimeException&)
396 					{
397 //						DBG_ERROR("a object is gone without to remove from Broadcaster");
398 						++pInterfaces;
399 						++i;
400 					}
401 				}
402 			}
403 		}
404 	}
405 }
406 
407 void SAL_CALL ScCellFieldsObj::addRefreshListener( const uno::Reference< util::XRefreshListener >& xListener )
408                                     throw (uno::RuntimeException)
409 {
410 	if (xListener.is())
411     {
412 		ScUnoGuard aGuard;
413 		if (!mpRefreshListeners)
414 			mpRefreshListeners = new cppu::OInterfaceContainerHelper(aMutex);
415 		mpRefreshListeners->addInterface(xListener);
416     }
417 }
418 
419 void SAL_CALL ScCellFieldsObj::removeRefreshListener( const uno::Reference<util::XRefreshListener >& xListener )
420                                     throw (uno::RuntimeException)
421 {
422 	if (xListener.is())
423 	{
424 		ScUnoGuard aGuard;
425 		if (mpRefreshListeners)
426 			mpRefreshListeners->removeInterface(xListener);
427 	}
428 }
429 
430 //------------------------------------------------------------------------
431 
432 //	Default-ctor wird fuer SMART_REFLECTION_IMPLEMENTATION gebraucht
433 
434 
435 //UNUSED2008-05  ScCellFieldObj::ScCellFieldObj() :
436 //UNUSED2008-05      OComponentHelper( getMutex() ),
437 //UNUSED2008-05      aPropSet( lcl_GetURLPropertyMap() ),
438 //UNUSED2008-05      pDocShell( NULL )
439 //UNUSED2008-05  {
440 //UNUSED2008-05      pEditSource = NULL;
441 //UNUSED2008-05  }
442 
443 ScCellFieldObj::ScCellFieldObj(ScDocShell* pDocSh, const ScAddress& rPos,
444 											const ESelection& rSel) :
445 	OComponentHelper( getMutex() ),
446 	pPropSet( lcl_GetURLPropertySet() ),
447 	pDocShell( pDocSh ),
448 	aCellPos( rPos ),
449 	aSelection( rSel )
450 {
451 	//	pDocShell ist Null, wenn per ServiceProvider erzeugt
452 
453 	if (pDocShell)
454 	{
455 		pDocShell->GetDocument()->AddUnoObject(*this);
456 		pEditSource = new ScCellEditSource( pDocShell, aCellPos );
457 	}
458 	else
459 		pEditSource = NULL;
460 }
461 
462 uno::Any SAL_CALL ScCellFieldObj::queryAggregation( const uno::Type& rType )
463 												throw(uno::RuntimeException)
464 {
465 	SC_QUERYINTERFACE( text::XTextField )
466 	SC_QUERYINTERFACE( text::XTextContent )			// parent of XTextField
467 	SC_QUERYINTERFACE( beans::XPropertySet )
468 	SC_QUERYINTERFACE( lang::XUnoTunnel )
469 	SC_QUERYINTERFACE( lang::XServiceInfo )
470 
471 	return OComponentHelper::queryAggregation( rType );		// XComponent
472 }
473 
474 uno::Sequence<uno::Type> SAL_CALL ScCellFieldObj::getTypes() throw(uno::RuntimeException)
475 {
476 	static uno::Sequence<uno::Type> aTypes;
477 	if ( aTypes.getLength() == 0 )
478 	{
479 		uno::Sequence<uno::Type> aParentTypes(OComponentHelper::getTypes());
480 		long nParentLen = aParentTypes.getLength();
481 		const uno::Type* pParentPtr = aParentTypes.getConstArray();
482 
483 		aTypes.realloc( nParentLen + 4 );
484 		uno::Type* pPtr = aTypes.getArray();
485 		pPtr[nParentLen + 0] = getCppuType((const uno::Reference<text::XTextField>*)0);
486 		pPtr[nParentLen + 1] = getCppuType((const uno::Reference<beans::XPropertySet>*)0);
487 		pPtr[nParentLen + 2] = getCppuType((const uno::Reference<lang::XUnoTunnel>*)0);
488 		pPtr[nParentLen + 3] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0);
489 
490 		for (long i=0; i<nParentLen; i++)
491 			pPtr[i] = pParentPtr[i];				// parent types first
492 	}
493 	return aTypes;
494 }
495 
496 uno::Sequence<sal_Int8> SAL_CALL ScCellFieldObj::getImplementationId()
497 													throw(uno::RuntimeException)
498 {
499 	static uno::Sequence< sal_Int8 > aId;
500 	if( aId.getLength() == 0 )
501 	{
502 		aId.realloc( 16 );
503 		rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
504 	}
505 	return aId;
506 }
507 
508 uno::Any SAL_CALL ScCellFieldObj::queryInterface( const uno::Type& rType )
509 												throw(uno::RuntimeException)
510 {
511 	return OComponentHelper::queryInterface( rType );
512 }
513 
514 void SAL_CALL ScCellFieldObj::acquire() throw()
515 {
516 	OComponentHelper::acquire();
517 }
518 
519 void SAL_CALL ScCellFieldObj::release() throw()
520 {
521 	OComponentHelper::release();
522 }
523 
524 void ScCellFieldObj::InitDoc( ScDocShell* pDocSh, const ScAddress& rPos,
525 										const ESelection& rSel )
526 {
527 	if ( pDocSh && !pEditSource )
528 	{
529 		aCellPos = rPos;
530 		aSelection = rSel;
531 		pDocShell = pDocSh;
532 
533 		pDocShell->GetDocument()->AddUnoObject(*this);
534 		pEditSource = new ScCellEditSource( pDocShell, aCellPos );
535 	}
536 }
537 
538 ScCellFieldObj::~ScCellFieldObj()
539 {
540 	if (pDocShell)
541 		pDocShell->GetDocument()->RemoveUnoObject(*this);
542 
543 	delete pEditSource;
544 }
545 
546 void ScCellFieldObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
547 {
548 	//!	Updates fuer aSelection (muessen erst noch erzeugt werden) !!!!!!
549 
550 	if ( rHint.ISA( ScUpdateRefHint ) )
551 	{
552 //        const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
553 
554 		//!	Ref-Update
555 	}
556 	else if ( rHint.ISA( SfxSimpleHint ) &&
557 			((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
558 	{
559 		pDocShell = NULL;		// ungueltig geworden
560 	}
561 
562 	//	EditSource hat sich selber als Listener angemeldet
563 }
564 
565 // per getImplementation gerufen:
566 
567 SvxFieldItem ScCellFieldObj::CreateFieldItem()
568 {
569 	DBG_ASSERT( !pEditSource, "CreateFieldItem mit eingefuegtem Feld" );
570 
571 	SvxURLField aField;
572 	aField.SetFormat(SVXURLFORMAT_APPDEFAULT);
573 	aField.SetURL( aUrl );
574 	aField.SetRepresentation( aRepresentation );
575 	aField.SetTargetFrame( aTarget );
576     return SvxFieldItem( aField, EE_FEATURE_FIELD );
577 }
578 
579 void ScCellFieldObj::DeleteField()
580 {
581 	if (pEditSource)
582 	{
583 		SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder();
584 //		pEditEngine->QuickDelete( aSelection );
585 		pForwarder->QuickInsertText( String(), aSelection );
586 		pEditSource->UpdateData();
587 
588 		aSelection.nEndPara = aSelection.nStartPara;
589 		aSelection.nEndPos  = aSelection.nStartPos;
590 
591 		//! Broadcast, um Selektion in anderen Objekten anzupassen
592 		//!	(auch bei anderen Aktionen)
593 	}
594 }
595 
596 // XTextField
597 
598 rtl::OUString SAL_CALL ScCellFieldObj::getPresentation( sal_Bool bShowCommand )
599 													throw(uno::RuntimeException)
600 {
601 	ScUnoGuard aGuard;
602 	String aRet;
603 
604 	if (pEditSource)
605 	{
606 		//!	Feld-Funktionen muessen an den Forwarder !!!
607 		ScEditEngineDefaulter* pEditEngine = ((ScCellEditSource*)pEditSource)->GetEditEngine();
608 		ScUnoEditEngine aTempEngine(pEditEngine);
609 
610 		//	Typ egal (in Zellen gibts nur URLs)
611 		SvxFieldData* pField = aTempEngine.FindByPos( aSelection.nStartPara, aSelection.nStartPos, 0 );
612 		DBG_ASSERT(pField,"getPresentation: Feld nicht gefunden");
613 		if (pField)
614 		{
615 			SvxURLField* pURL = (SvxURLField*)pField;
616 			if (bShowCommand)
617 				aRet = pURL->GetURL();
618 			else
619 				aRet = pURL->GetRepresentation();
620 		}
621 	}
622 
623 	return aRet;
624 }
625 
626 // XTextContent
627 
628 void SAL_CALL ScCellFieldObj::attach( const uno::Reference<text::XTextRange>& xTextRange )
629 								throw(lang::IllegalArgumentException, uno::RuntimeException)
630 {
631 	ScUnoGuard aGuard;
632 	if (xTextRange.is())
633 	{
634 		uno::Reference<text::XText> xText(xTextRange->getText());
635 		if (xText.is())
636 		{
637 			xText->insertTextContent( xTextRange, this, sal_True );
638 		}
639 	}
640 }
641 
642 uno::Reference<text::XTextRange> SAL_CALL ScCellFieldObj::getAnchor() throw(uno::RuntimeException)
643 {
644 	ScUnoGuard aGuard;
645 	if (pDocShell)
646 		return new ScCellObj( pDocShell, aCellPos );
647 	return NULL;
648 }
649 
650 // XComponent
651 
652 void SAL_CALL ScCellFieldObj::dispose() throw(uno::RuntimeException)
653 {
654 	OComponentHelper::dispose();
655 }
656 
657 void SAL_CALL ScCellFieldObj::addEventListener(
658 						const uno::Reference<lang::XEventListener>& xListener )
659 													throw(uno::RuntimeException)
660 {
661 	OComponentHelper::addEventListener( xListener );
662 }
663 
664 void SAL_CALL ScCellFieldObj::removeEventListener(
665 						const uno::Reference<lang::XEventListener>& xListener )
666 													throw(uno::RuntimeException)
667 {
668 	OComponentHelper::removeEventListener( xListener );
669 }
670 
671 // XPropertySet
672 
673 uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellFieldObj::getPropertySetInfo()
674 														throw(uno::RuntimeException)
675 {
676 	ScUnoGuard aGuard;
677 	static uno::Reference<beans::XPropertySetInfo> aRef = pPropSet->getPropertySetInfo();
678 	return aRef;
679 }
680 
681 void SAL_CALL ScCellFieldObj::setPropertyValue(
682 						const rtl::OUString& aPropertyName, const uno::Any& aValue )
683 				throw(beans::UnknownPropertyException, beans::PropertyVetoException,
684 						lang::IllegalArgumentException, lang::WrappedTargetException,
685 						uno::RuntimeException)
686 {
687 	ScUnoGuard aGuard;
688 	String aNameString(aPropertyName);
689 	rtl::OUString aStrVal;
690 	if (pEditSource)
691 	{
692 		//!	Feld-Funktionen muessen an den Forwarder !!!
693 		ScEditEngineDefaulter* pEditEngine = ((ScCellEditSource*)pEditSource)->GetEditEngine();
694 		ScUnoEditEngine aTempEngine(pEditEngine);
695 
696 		//	Typ egal (in Zellen gibts nur URLs)
697 		SvxFieldData* pField = aTempEngine.FindByPos( aSelection.nStartPara, aSelection.nStartPos, 0 );
698 		DBG_ASSERT(pField,"setPropertyValue: Feld nicht gefunden");
699 		if (pField)
700 		{
701 			SvxURLField* pURL = (SvxURLField*)pField;	// ist eine Kopie in der ScUnoEditEngine
702 
703 			sal_Bool bOk = sal_True;
704 			if ( aNameString.EqualsAscii( SC_UNONAME_URL ) )
705 			{
706 				if (aValue >>= aStrVal)
707 					pURL->SetURL( aStrVal );
708 			}
709 			else if ( aNameString.EqualsAscii( SC_UNONAME_REPR ) )
710 			{
711 				if (aValue >>= aStrVal)
712 					pURL->SetRepresentation( aStrVal );
713 			}
714 			else if ( aNameString.EqualsAscii( SC_UNONAME_TARGET ) )
715 			{
716 				if (aValue >>= aStrVal)
717 					pURL->SetTargetFrame( aStrVal );
718 			}
719 			else
720 				bOk = sal_False;
721 
722 			if (bOk)
723 			{
724                 pEditEngine->QuickInsertField( SvxFieldItem(*pField, EE_FEATURE_FIELD), aSelection );
725 				pEditSource->UpdateData();
726 			}
727 		}
728 	}
729 	else		// noch nicht eingefuegt
730 	{
731 		if ( aNameString.EqualsAscii( SC_UNONAME_URL ) )
732 		{
733 			if (aValue >>= aStrVal)
734 				aUrl = String( aStrVal );
735 		}
736 		else if ( aNameString.EqualsAscii( SC_UNONAME_REPR ) )
737 		{
738 			if (aValue >>= aStrVal)
739 				aRepresentation = String( aStrVal );
740 		}
741 		else if ( aNameString.EqualsAscii( SC_UNONAME_TARGET ) )
742 		{
743 			if (aValue >>= aStrVal)
744 				aTarget = String( aStrVal );
745 		}
746 	}
747 }
748 
749 uno::Any SAL_CALL ScCellFieldObj::getPropertyValue( const rtl::OUString& aPropertyName )
750 				throw(beans::UnknownPropertyException, lang::WrappedTargetException,
751 						uno::RuntimeException)
752 {
753 	ScUnoGuard aGuard;
754 	uno::Any aRet;
755 	String aNameString(aPropertyName);
756 
757 	// anchor type is always "as character", text wrap always "none"
758 
759 	if ( aNameString.EqualsAscii( SC_UNONAME_ANCTYPE ) )
760 		aRet <<= text::TextContentAnchorType_AS_CHARACTER;
761 	else if ( aNameString.EqualsAscii( SC_UNONAME_ANCTYPES ) )
762 	{
763 		uno::Sequence<text::TextContentAnchorType> aSeq(1);
764 		aSeq[0] = text::TextContentAnchorType_AS_CHARACTER;
765 		aRet <<= aSeq;
766 	}
767 	else if ( aNameString.EqualsAscii( SC_UNONAME_TEXTWRAP ) )
768 		aRet <<= text::WrapTextMode_NONE;
769 	else if (pEditSource)
770 	{
771 		//!	Feld-Funktionen muessen an den Forwarder !!!
772 		ScEditEngineDefaulter* pEditEngine = ((ScCellEditSource*)pEditSource)->GetEditEngine();
773 		ScUnoEditEngine aTempEngine(pEditEngine);
774 
775 		//	Typ egal (in Zellen gibts nur URLs)
776 		SvxFieldData* pField = aTempEngine.FindByPos( aSelection.nStartPara, aSelection.nStartPos, 0 );
777 		DBG_ASSERT(pField,"getPropertyValue: Feld nicht gefunden");
778 		if (pField)
779 		{
780 			SvxURLField* pURL = (SvxURLField*)pField;
781 
782 			if ( aNameString.EqualsAscii( SC_UNONAME_URL ) )
783 				aRet <<= rtl::OUString( pURL->GetURL() );
784 			else if ( aNameString.EqualsAscii( SC_UNONAME_REPR ) )
785 				aRet <<= rtl::OUString( pURL->GetRepresentation() );
786 			else if ( aNameString.EqualsAscii( SC_UNONAME_TARGET ) )
787 				aRet <<= rtl::OUString( pURL->GetTargetFrame() );
788 		}
789 	}
790 	else		// noch nicht eingefuegt
791 	{
792 		if ( aNameString.EqualsAscii( SC_UNONAME_URL ) )
793 			aRet <<= rtl::OUString( aUrl );
794 		else if ( aNameString.EqualsAscii( SC_UNONAME_REPR ) )
795 			aRet <<= rtl::OUString( aRepresentation );
796 		else if ( aNameString.EqualsAscii( SC_UNONAME_TARGET ) )
797 			aRet <<= rtl::OUString( aTarget );
798 	}
799 	return aRet;
800 }
801 
802 SC_IMPL_DUMMY_PROPERTY_LISTENER( ScCellFieldObj )
803 
804 // XUnoTunnel
805 
806 sal_Int64 SAL_CALL ScCellFieldObj::getSomething(
807 				const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
808 {
809 	if ( rId.getLength() == 16 &&
810           0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
811 									rId.getConstArray(), 16 ) )
812 	{
813         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
814 	}
815 	return 0;
816 }
817 
818 // static
819 const uno::Sequence<sal_Int8>& ScCellFieldObj::getUnoTunnelId()
820 {
821 	static uno::Sequence<sal_Int8> * pSeq = 0;
822 	if( !pSeq )
823 	{
824 		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
825 		if( !pSeq )
826 		{
827 			static uno::Sequence< sal_Int8 > aSeq( 16 );
828 			rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
829 			pSeq = &aSeq;
830 		}
831 	}
832 	return *pSeq;
833 }
834 
835 // static
836 ScCellFieldObj* ScCellFieldObj::getImplementation(
837 								const uno::Reference<text::XTextContent> xObj )
838 {
839 	ScCellFieldObj* pRet = NULL;
840 	uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
841 	if (xUT.is())
842         pRet = reinterpret_cast<ScCellFieldObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
843 	return pRet;
844 }
845 
846 // XServiceInfo
847 
848 rtl::OUString SAL_CALL ScCellFieldObj::getImplementationName() throw(uno::RuntimeException)
849 {
850 	return rtl::OUString::createFromAscii( "ScCellFieldObj" );
851 }
852 
853 sal_Bool SAL_CALL ScCellFieldObj::supportsService( const rtl::OUString& rServiceName )
854 													throw(uno::RuntimeException)
855 {
856 	String aServiceStr( rServiceName );
857 	return aServiceStr.EqualsAscii( SCTEXTFIELD_SERVICE ) ||
858 		   aServiceStr.EqualsAscii( SCTEXTCONTENT_SERVICE );
859 }
860 
861 uno::Sequence<rtl::OUString> SAL_CALL ScCellFieldObj::getSupportedServiceNames()
862 													throw(uno::RuntimeException)
863 {
864 	uno::Sequence<rtl::OUString> aRet(2);
865 	rtl::OUString* pArray = aRet.getArray();
866 	pArray[0] = rtl::OUString::createFromAscii( SCTEXTFIELD_SERVICE );
867 	pArray[1] = rtl::OUString::createFromAscii( SCTEXTCONTENT_SERVICE );
868 	return aRet;
869 }
870 
871 //------------------------------------------------------------------------
872 
873 ScHeaderFieldsObj::ScHeaderFieldsObj(ScHeaderFooterContentObj* pContent, sal_uInt16 nP, sal_uInt16 nT) :
874 	pContentObj( pContent ),
875 	nPart( nP ),
876 	nType( nT ),
877     mpRefreshListeners( NULL )
878 {
879 	DBG_ASSERT( pContentObj, "ScHeaderFieldsObj ohne Objekt?" );
880 
881 	if (pContentObj)
882 	{
883 		pContentObj->acquire();		// darf nicht wegkommen
884 		pEditSource = new ScHeaderFooterEditSource( pContentObj, nPart );
885 	}
886 	else
887 		pEditSource = NULL;
888 }
889 
890 ScHeaderFieldsObj::~ScHeaderFieldsObj()
891 {
892     delete pEditSource;
893 
894 	if (pContentObj)
895 		pContentObj->release();
896 
897 	// increment refcount to prevent double call off dtor
898 	osl_incrementInterlockedCount( &m_refCount );
899 
900     if (mpRefreshListeners)
901 	{
902 		lang::EventObject aEvent;
903 		aEvent.Source = static_cast<cppu::OWeakObject*>(this);
904 		if (mpRefreshListeners)
905 		{
906 			mpRefreshListeners->disposeAndClear(aEvent);
907 			DELETEZ( mpRefreshListeners );
908 		}
909 	}
910 }
911 
912 // XIndexAccess (via XTextFields)
913 
914 ScHeaderFieldObj* ScHeaderFieldsObj::GetObjectByIndex_Impl(sal_Int32 Index) const
915 {
916 	//!	Feld-Funktionen muessen an den Forwarder !!!
917 	ScEditEngineDefaulter* pEditEngine = ((ScHeaderFooterEditSource*)pEditSource)->GetEditEngine();
918 	ScUnoEditEngine aTempEngine(pEditEngine);
919 
920 	TypeId aTypeId = NULL;
921 	switch (nType)
922 	{
923 		case SC_SERVICE_PAGEFIELD:	aTypeId = TYPE(SvxPageField);	 break;
924 		case SC_SERVICE_PAGESFIELD:	aTypeId = TYPE(SvxPagesField);	 break;
925 		case SC_SERVICE_DATEFIELD:	aTypeId = TYPE(SvxDateField);	 break;
926 		case SC_SERVICE_TIMEFIELD:	aTypeId = TYPE(SvxTimeField);	 break;
927 		case SC_SERVICE_TITLEFIELD:	aTypeId = TYPE(SvxFileField);	 break;
928 		case SC_SERVICE_FILEFIELD:	aTypeId = TYPE(SvxExtFileField); break;
929 		case SC_SERVICE_SHEETFIELD:	aTypeId = TYPE(SvxTableField);	 break;
930 		// bei SC_SERVICE_INVALID bleibt TypeId Null
931 	}
932 	SvxFieldData* pData = aTempEngine.FindByIndex( (sal_uInt16)Index, aTypeId );
933 	if ( pData )
934 	{
935 		sal_uInt16 nPar = aTempEngine.GetFieldPar();
936 		xub_StrLen nPos = aTempEngine.GetFieldPos();
937 
938 		sal_uInt16 nFieldType = nType;
939 		if ( nFieldType == SC_SERVICE_INVALID )
940 		{
941 			if ( pData->ISA( SvxPageField ) )		  nFieldType = SC_SERVICE_PAGEFIELD;
942 			else if ( pData->ISA( SvxPagesField ) )	  nFieldType = SC_SERVICE_PAGESFIELD;
943 			else if ( pData->ISA( SvxDateField ) )	  nFieldType = SC_SERVICE_DATEFIELD;
944 			else if ( pData->ISA( SvxTimeField ) )	  nFieldType = SC_SERVICE_TIMEFIELD;
945 			else if ( pData->ISA( SvxFileField ) )	  nFieldType = SC_SERVICE_TITLEFIELD;
946 			else if ( pData->ISA( SvxExtFileField ) ) nFieldType = SC_SERVICE_FILEFIELD;
947 			else if ( pData->ISA( SvxTableField ) )	  nFieldType = SC_SERVICE_SHEETFIELD;
948 		}
949 
950 		ESelection aSelection( nPar, nPos, nPar, nPos+1 );		// Field is 1 character
951 		return new ScHeaderFieldObj( pContentObj, nPart, nFieldType, aSelection );
952 	}
953 	return NULL;
954 }
955 
956 sal_Int32 SAL_CALL ScHeaderFieldsObj::getCount() throw(uno::RuntimeException)
957 {
958 	ScUnoGuard aGuard;
959 
960 	//!	Feld-Funktionen muessen an den Forwarder !!!
961 	ScEditEngineDefaulter* pEditEngine = ((ScHeaderFooterEditSource*)pEditSource)->GetEditEngine();
962 	ScUnoEditEngine aTempEngine(pEditEngine);
963 
964 	TypeId aTypeId = NULL;
965 	switch (nType)
966 	{
967 		case SC_SERVICE_PAGEFIELD:	aTypeId = TYPE(SvxPageField);	 break;
968 		case SC_SERVICE_PAGESFIELD:	aTypeId = TYPE(SvxPagesField);	 break;
969 		case SC_SERVICE_DATEFIELD:	aTypeId = TYPE(SvxDateField);	 break;
970 		case SC_SERVICE_TIMEFIELD:	aTypeId = TYPE(SvxTimeField);	 break;
971 		case SC_SERVICE_TITLEFIELD:	aTypeId = TYPE(SvxFileField);	 break;
972 		case SC_SERVICE_FILEFIELD:	aTypeId = TYPE(SvxExtFileField); break;
973 		case SC_SERVICE_SHEETFIELD:	aTypeId = TYPE(SvxTableField);	 break;
974 	}
975 	return aTempEngine.CountFields(aTypeId);		// Felder zaehlen
976 }
977 
978 uno::Any SAL_CALL ScHeaderFieldsObj::getByIndex( sal_Int32 nIndex )
979 							throw(lang::IndexOutOfBoundsException,
980 									lang::WrappedTargetException, uno::RuntimeException)
981 {
982 	ScUnoGuard aGuard;
983 	uno::Reference<text::XTextField> xField(GetObjectByIndex_Impl(nIndex));
984 	if (xField.is())
985         return uno::makeAny(xField);
986 	else
987 		throw lang::IndexOutOfBoundsException();
988 //    return uno::Any();
989 }
990 
991 uno::Type SAL_CALL ScHeaderFieldsObj::getElementType() throw(uno::RuntimeException)
992 {
993 	ScUnoGuard aGuard;
994 	return getCppuType((uno::Reference<text::XTextField>*)0);
995 }
996 
997 sal_Bool SAL_CALL ScHeaderFieldsObj::hasElements() throw(uno::RuntimeException)
998 {
999 	ScUnoGuard aGuard;
1000 	return ( getCount() != 0 );
1001 }
1002 
1003 uno::Reference<container::XEnumeration> SAL_CALL ScHeaderFieldsObj::createEnumeration()
1004 													throw(uno::RuntimeException)
1005 {
1006 	ScUnoGuard aGuard;
1007     return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextFieldEnumeration")));
1008 }
1009 
1010 void SAL_CALL ScHeaderFieldsObj::addContainerListener(
1011                                 const uno::Reference<container::XContainerListener>& /* xListener */ )
1012 									throw(uno::RuntimeException)
1013 {
1014 	DBG_ERROR("not implemented");
1015 }
1016 
1017 void SAL_CALL ScHeaderFieldsObj::removeContainerListener(
1018                                 const uno::Reference<container::XContainerListener>& /* xListener */ )
1019 									throw(uno::RuntimeException)
1020 {
1021 	DBG_ERROR("not implemented");
1022 }
1023 
1024 // XRefreshable
1025 void SAL_CALL ScHeaderFieldsObj::refresh(  )
1026                                     throw (uno::RuntimeException)
1027 {
1028 	if (mpRefreshListeners)
1029 	{
1030     	//  Call all listeners.
1031 		uno::Sequence< uno::Reference< uno::XInterface > > aListeners(mpRefreshListeners->getElements());
1032 		sal_uInt32 nLength(aListeners.getLength());
1033 		if (nLength)
1034 		{
1035 			const uno::Reference< uno::XInterface >* pInterfaces = aListeners.getConstArray();
1036 			if (pInterfaces)
1037 			{
1038                 lang::EventObject aEvent;
1039                 aEvent.Source.set(uno::Reference< util::XRefreshable >(const_cast<ScHeaderFieldsObj*>(this)));
1040 				sal_uInt32 i(0);
1041 				while (i < nLength)
1042 				{
1043 					try
1044 					{
1045 						while(i < nLength)
1046 						{
1047 							static_cast< util::XRefreshListener* >(pInterfaces->get())->refreshed(aEvent);
1048 							++pInterfaces;
1049 							++i;
1050 						}
1051 					}
1052 					catch(uno::RuntimeException&)
1053 					{
1054 //						DBG_ERROR("a object is gone without to remove from Broadcaster");
1055 						++pInterfaces;
1056 						++i;
1057 					}
1058 				}
1059 			}
1060 		}
1061 	}
1062 }
1063 
1064 void SAL_CALL ScHeaderFieldsObj::addRefreshListener( const uno::Reference< util::XRefreshListener >& xListener )
1065                                     throw (uno::RuntimeException)
1066 {
1067 	if (xListener.is())
1068     {
1069 		ScUnoGuard aGuard;
1070 		if (!mpRefreshListeners)
1071 			mpRefreshListeners = new cppu::OInterfaceContainerHelper(aMutex);
1072 		mpRefreshListeners->addInterface(xListener);
1073     }
1074 }
1075 
1076 void SAL_CALL ScHeaderFieldsObj::removeRefreshListener( const uno::Reference<util::XRefreshListener >& xListener )
1077                                     throw (uno::RuntimeException)
1078 {
1079 	if (xListener.is())
1080 	{
1081 		ScUnoGuard aGuard;
1082 		if (mpRefreshListeners)
1083 			mpRefreshListeners->removeInterface(xListener);
1084 	}
1085 }
1086 
1087 //------------------------------------------------------------------------
1088 
1089 SvxFileFormat lcl_UnoToSvxFileFormat( sal_Int16 nUnoValue )
1090 {
1091 	switch( nUnoValue )
1092 	{
1093 		case text::FilenameDisplayFormat::FULL:	return SVXFILEFORMAT_FULLPATH;
1094 		case text::FilenameDisplayFormat::PATH:	return SVXFILEFORMAT_PATH;
1095 		case text::FilenameDisplayFormat::NAME:	return SVXFILEFORMAT_NAME;
1096 //		case text::FilenameDisplayFormat::NAME_AND_EXT:
1097 		default:
1098 			return SVXFILEFORMAT_NAME_EXT;
1099 	}
1100 }
1101 
1102 sal_Int16 lcl_SvxToUnoFileFormat( SvxFileFormat nSvxValue )
1103 {
1104 	switch( nSvxValue )
1105 	{
1106 		case SVXFILEFORMAT_NAME_EXT:	return text::FilenameDisplayFormat::NAME_AND_EXT;
1107 		case SVXFILEFORMAT_FULLPATH:	return text::FilenameDisplayFormat::FULL;
1108 		case SVXFILEFORMAT_PATH:		return text::FilenameDisplayFormat::PATH;
1109 //		case SVXFILEFORMAT_NAME:
1110 		default:
1111 			return text::FilenameDisplayFormat::NAME;
1112 	}
1113 }
1114 
1115 
1116 //	Default-ctor wird fuer SMART_REFLECTION_IMPLEMENTATION gebraucht
1117 //UNUSED2008-05  ScHeaderFieldObj::ScHeaderFieldObj() :
1118 //UNUSED2008-05      OComponentHelper( getMutex() ),
1119 //UNUSED2008-05      aPropSet( lcl_GetHeaderFieldPropertyMap() ),
1120 //UNUSED2008-05      pContentObj( NULL ),
1121 //UNUSED2008-05      nPart( 0 ),
1122 //UNUSED2008-05      nType( 0 ),
1123 //UNUSED2008-05      nFileFormat( SVXFILEFORMAT_NAME_EXT )
1124 //UNUSED2008-05  {
1125 //UNUSED2008-05      pEditSource = NULL;
1126 //UNUSED2008-05  }
1127 
1128 ScHeaderFieldObj::ScHeaderFieldObj(ScHeaderFooterContentObj* pContent, sal_uInt16 nP,
1129 											sal_uInt16 nT, const ESelection& rSel) :
1130 	OComponentHelper( getMutex() ),
1131 	pPropSet( (nT == SC_SERVICE_FILEFIELD) ? lcl_GetFileFieldPropertySet() : lcl_GetHeaderFieldPropertySet() ),
1132 	pContentObj( pContent ),
1133 	nPart( nP ),
1134 	nType( nT ),
1135 	aSelection( rSel ),
1136 	nFileFormat( SVXFILEFORMAT_NAME_EXT )
1137 {
1138 	//	pContent ist Null, wenn per ServiceProvider erzeugt
1139 
1140 	if (pContentObj)
1141 	{
1142 		pContentObj->acquire();		// darf nicht wegkommen
1143 		pEditSource = new ScHeaderFooterEditSource( pContentObj, nPart );
1144 	}
1145 	else
1146 		pEditSource = NULL;
1147 }
1148 
1149 uno::Any SAL_CALL ScHeaderFieldObj::queryAggregation( const uno::Type& rType )
1150 												throw(uno::RuntimeException)
1151 {
1152 	SC_QUERYINTERFACE( text::XTextField )
1153 	SC_QUERYINTERFACE( text::XTextContent )			// parent of XTextField
1154 	SC_QUERYINTERFACE( beans::XPropertySet )
1155 	SC_QUERYINTERFACE( lang::XUnoTunnel )
1156 	SC_QUERYINTERFACE( lang::XServiceInfo )
1157 
1158 	return OComponentHelper::queryAggregation( rType );		// XComponent
1159 }
1160 
1161 uno::Sequence<uno::Type> SAL_CALL ScHeaderFieldObj::getTypes() throw(uno::RuntimeException)
1162 {
1163 	static uno::Sequence<uno::Type> aTypes;
1164 	if ( aTypes.getLength() == 0 )
1165 	{
1166 		uno::Sequence<uno::Type> aParentTypes(OComponentHelper::getTypes());
1167 		long nParentLen = aParentTypes.getLength();
1168 		const uno::Type* pParentPtr = aParentTypes.getConstArray();
1169 
1170 		aTypes.realloc( nParentLen + 4 );
1171 		uno::Type* pPtr = aTypes.getArray();
1172 		pPtr[nParentLen + 0] = getCppuType((const uno::Reference<text::XTextField>*)0);
1173 		pPtr[nParentLen + 1] = getCppuType((const uno::Reference<beans::XPropertySet>*)0);
1174 		pPtr[nParentLen + 2] = getCppuType((const uno::Reference<lang::XUnoTunnel>*)0);
1175 		pPtr[nParentLen + 3] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0);
1176 
1177 		for (long i=0; i<nParentLen; i++)
1178 			pPtr[i] = pParentPtr[i];				// parent types first
1179 	}
1180 	return aTypes;
1181 }
1182 
1183 uno::Sequence<sal_Int8> SAL_CALL ScHeaderFieldObj::getImplementationId()
1184 													throw(uno::RuntimeException)
1185 {
1186 	static uno::Sequence< sal_Int8 > aId;
1187 	if( aId.getLength() == 0 )
1188 	{
1189 		aId.realloc( 16 );
1190 		rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
1191 	}
1192 	return aId;
1193 }
1194 
1195 uno::Any SAL_CALL ScHeaderFieldObj::queryInterface( const uno::Type& rType )
1196 												throw(uno::RuntimeException)
1197 {
1198 	return OComponentHelper::queryInterface( rType );
1199 }
1200 
1201 void SAL_CALL ScHeaderFieldObj::acquire() throw()
1202 {
1203 	OComponentHelper::acquire();
1204 }
1205 
1206 void SAL_CALL ScHeaderFieldObj::release() throw()
1207 {
1208 	OComponentHelper::release();
1209 }
1210 
1211 void ScHeaderFieldObj::InitDoc( ScHeaderFooterContentObj* pContent, sal_uInt16 nP,
1212 										const ESelection& rSel )
1213 {
1214 	if ( pContent && !pEditSource )
1215 	{
1216 		DBG_ASSERT( !pContentObj, "ContentObj, aber kein EditSource?" );
1217 
1218 		aSelection = rSel;
1219 		nPart = nP;
1220 		pContentObj = pContent;
1221 
1222 		pContentObj->acquire();		// darf nicht wegkommen
1223 		pEditSource = new ScHeaderFooterEditSource( pContentObj, nPart );
1224 	}
1225 }
1226 
1227 ScHeaderFieldObj::~ScHeaderFieldObj()
1228 {
1229 	delete pEditSource;
1230 
1231 	if (pContentObj)
1232 		pContentObj->release();
1233 }
1234 
1235 // per getImplementation gerufen:
1236 
1237 SvxFieldItem ScHeaderFieldObj::CreateFieldItem()
1238 {
1239 	DBG_ASSERT( !pEditSource, "CreateFieldItem mit eingefuegtem Feld" );
1240 
1241 	switch (nType)
1242 	{
1243 		case SC_SERVICE_PAGEFIELD:
1244 			{
1245 				SvxPageField aField;
1246                 return SvxFieldItem( aField, EE_FEATURE_FIELD );
1247 			}
1248 		case SC_SERVICE_PAGESFIELD:
1249 			{
1250 				SvxPagesField aField;
1251                 return SvxFieldItem( aField, EE_FEATURE_FIELD );
1252 			}
1253 		case SC_SERVICE_DATEFIELD:
1254 			{
1255 				SvxDateField aField;
1256                 return SvxFieldItem( aField, EE_FEATURE_FIELD );
1257 			}
1258 		case SC_SERVICE_TIMEFIELD:
1259 			{
1260 				SvxTimeField aField;
1261                 return SvxFieldItem( aField, EE_FEATURE_FIELD );
1262 			}
1263 		case SC_SERVICE_TITLEFIELD:
1264 			{
1265 				SvxFileField aField;
1266                 return SvxFieldItem( aField, EE_FEATURE_FIELD );
1267 			}
1268 		case SC_SERVICE_FILEFIELD:
1269 			{
1270 				SvxExtFileField aField;
1271 				aField.SetFormat( (SvxFileFormat) nFileFormat );
1272                 return SvxFieldItem( aField, EE_FEATURE_FIELD );
1273 			}
1274 		case SC_SERVICE_SHEETFIELD:
1275 			{
1276 				SvxTableField aField;
1277                 return SvxFieldItem( aField, EE_FEATURE_FIELD );
1278 			}
1279 	}
1280 
1281     return SvxFieldItem( SvxFieldData(), EE_FEATURE_FIELD );
1282 }
1283 
1284 void ScHeaderFieldObj::DeleteField()
1285 {
1286 	if (pEditSource)
1287 	{
1288 		SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder();
1289 //		pEditEngine->QuickDelete( aSelection );
1290 		pForwarder->QuickInsertText( String(), aSelection );
1291 		pEditSource->UpdateData();
1292 
1293 		aSelection.nEndPara = aSelection.nStartPara;
1294 		aSelection.nEndPos  = aSelection.nStartPos;
1295 
1296 		//! Broadcast, um Selektion in anderen Objekten anzupassen
1297 		//!	(auch bei anderen Aktionen)
1298 	}
1299 }
1300 
1301 // XTextField
1302 
1303 rtl::OUString SAL_CALL ScHeaderFieldObj::getPresentation( sal_Bool /* bShowCommand */ )
1304 													throw(uno::RuntimeException)
1305 {
1306 	ScUnoGuard aGuard;
1307 	String aRet;
1308 
1309 	if (pEditSource)
1310 	{
1311 		// Feld von der EditEngine formatieren lassen, bShowCommand gibt's nicht
1312 
1313 		SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder();
1314 		aRet = pForwarder->GetText( aSelection );
1315 	}
1316 
1317 	return aRet;
1318 }
1319 
1320 // XTextContent
1321 
1322 void SAL_CALL ScHeaderFieldObj::attach( const uno::Reference<text::XTextRange>& xTextRange )
1323 								throw(lang::IllegalArgumentException, uno::RuntimeException)
1324 {
1325 	ScUnoGuard aGuard;
1326 	if (xTextRange.is())
1327 	{
1328 		uno::Reference<text::XText> xText(xTextRange->getText());
1329 		if (xText.is())
1330 		{
1331 			xText->insertTextContent( xTextRange, this, sal_True );
1332 		}
1333 	}
1334 }
1335 
1336 uno::Reference<text::XTextRange> SAL_CALL ScHeaderFieldObj::getAnchor() throw(uno::RuntimeException)
1337 {
1338 	ScUnoGuard aGuard;
1339 	if (pContentObj)
1340 	{
1341 		uno::Reference<text::XText> xText;
1342 		if ( nPart == SC_HDFT_LEFT )
1343 			xText = pContentObj->getLeftText();
1344 		else if (nPart == SC_HDFT_CENTER)
1345 			xText = pContentObj->getCenterText();
1346 		else
1347 			xText = pContentObj->getRightText();
1348 		return uno::Reference<text::XTextRange>( xText, uno::UNO_QUERY );
1349 	}
1350 	return NULL;
1351 }
1352 
1353 // XComponent
1354 
1355 void SAL_CALL ScHeaderFieldObj::dispose() throw(uno::RuntimeException)
1356 {
1357 	OComponentHelper::dispose();
1358 }
1359 
1360 void SAL_CALL ScHeaderFieldObj::addEventListener(
1361 						const uno::Reference<lang::XEventListener>& xListener )
1362 													throw(uno::RuntimeException)
1363 {
1364 	OComponentHelper::addEventListener( xListener );
1365 }
1366 
1367 void SAL_CALL ScHeaderFieldObj::removeEventListener(
1368 						const uno::Reference<lang::XEventListener>& xListener )
1369 													throw(uno::RuntimeException)
1370 {
1371 	OComponentHelper::removeEventListener( xListener );
1372 }
1373 
1374 // XPropertySet
1375 
1376 uno::Reference<beans::XPropertySetInfo> SAL_CALL ScHeaderFieldObj::getPropertySetInfo()
1377 														throw(uno::RuntimeException)
1378 {
1379 	ScUnoGuard aGuard;
1380 	if (nType == SC_SERVICE_FILEFIELD)
1381 	{
1382 		//	file field has different properties
1383 		static uno::Reference<beans::XPropertySetInfo> aFileFieldInfo = pPropSet->getPropertySetInfo();
1384 		return aFileFieldInfo;
1385 	}
1386 	else
1387 	{
1388 		static uno::Reference<beans::XPropertySetInfo> aRef = pPropSet->getPropertySetInfo();
1389 		return aRef;
1390 	}
1391 }
1392 
1393 void SAL_CALL ScHeaderFieldObj::setPropertyValue(
1394 						const rtl::OUString& aPropertyName, const uno::Any& aValue )
1395 				throw(beans::UnknownPropertyException, beans::PropertyVetoException,
1396 						lang::IllegalArgumentException, lang::WrappedTargetException,
1397 						uno::RuntimeException)
1398 {
1399 	ScUnoGuard aGuard;
1400 	String aNameString(aPropertyName);
1401 	if ( nType == SC_SERVICE_FILEFIELD && aNameString.EqualsAscii( SC_UNONAME_FILEFORM ) )
1402 	{
1403 		sal_Int16 nIntVal = 0;
1404 		if ( aValue >>= nIntVal )
1405 		{
1406 			SvxFileFormat eFormat = lcl_UnoToSvxFileFormat( nIntVal );
1407 			if (pEditSource)
1408 			{
1409 				ScEditEngineDefaulter* pEditEngine = ((ScHeaderFooterEditSource*)pEditSource)->GetEditEngine();
1410 				ScUnoEditEngine aTempEngine(pEditEngine);
1411 				SvxFieldData* pField = aTempEngine.FindByPos(
1412 						aSelection.nStartPara, aSelection.nStartPos, TYPE(SvxExtFileField) );
1413 				DBG_ASSERT(pField,"setPropertyValue: Field not found");
1414 				if (pField)
1415 				{
1416 					SvxExtFileField* pExtFile = (SvxExtFileField*)pField;	// local to the ScUnoEditEngine
1417 					pExtFile->SetFormat( eFormat );
1418                     pEditEngine->QuickInsertField( SvxFieldItem(*pField, EE_FEATURE_FIELD), aSelection );
1419 					pEditSource->UpdateData();
1420 				}
1421 			}
1422 			else
1423                 nFileFormat = sal::static_int_cast<sal_Int16>(eFormat);     // not inserted yet - store value
1424 		}
1425 	}
1426 }
1427 
1428 uno::Any SAL_CALL ScHeaderFieldObj::getPropertyValue( const rtl::OUString& aPropertyName )
1429 				throw(beans::UnknownPropertyException, lang::WrappedTargetException,
1430 						uno::RuntimeException)
1431 {
1432 	ScUnoGuard aGuard;
1433 
1434 	//!	Properties?
1435 	uno::Any aRet;
1436 	String aNameString(aPropertyName);
1437 
1438 	// anchor type is always "as character", text wrap always "none"
1439 
1440 	if ( aNameString.EqualsAscii( SC_UNONAME_ANCTYPE ) )
1441 		aRet <<= text::TextContentAnchorType_AS_CHARACTER;
1442 	else if ( aNameString.EqualsAscii( SC_UNONAME_ANCTYPES ) )
1443 	{
1444 		uno::Sequence<text::TextContentAnchorType> aSeq(1);
1445 		aSeq[0] = text::TextContentAnchorType_AS_CHARACTER;
1446 		aRet <<= aSeq;
1447 	}
1448 	else if ( aNameString.EqualsAscii( SC_UNONAME_TEXTWRAP ) )
1449 		aRet <<= text::WrapTextMode_NONE;
1450 	else if ( nType == SC_SERVICE_FILEFIELD && aNameString.EqualsAscii( SC_UNONAME_FILEFORM ) )
1451 	{
1452 		SvxFileFormat eFormat = SVXFILEFORMAT_NAME_EXT;
1453 		if (pEditSource)
1454 		{
1455 			ScEditEngineDefaulter* pEditEngine = ((ScHeaderFooterEditSource*)pEditSource)->GetEditEngine();
1456 			ScUnoEditEngine aTempEngine(pEditEngine);
1457 			SvxFieldData* pField = aTempEngine.FindByPos(
1458 					aSelection.nStartPara, aSelection.nStartPos, TYPE(SvxExtFileField) );
1459 			DBG_ASSERT(pField,"setPropertyValue: Field not found");
1460 			if (pField)
1461 			{
1462 				const SvxExtFileField* pExtFile = (const SvxExtFileField*)pField;
1463 				eFormat = pExtFile->GetFormat();
1464 			}
1465 		}
1466 		else
1467 			eFormat = (SvxFileFormat) nFileFormat;		// not inserted yet - use stored value
1468 
1469 		sal_Int16 nIntVal = lcl_SvxToUnoFileFormat( eFormat );
1470 		aRet <<= nIntVal;
1471 	}
1472 
1473 	return aRet;
1474 }
1475 
1476 SC_IMPL_DUMMY_PROPERTY_LISTENER( ScHeaderFieldObj )
1477 
1478 // XUnoTunnel
1479 
1480 sal_Int64 SAL_CALL ScHeaderFieldObj::getSomething(
1481 				const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
1482 {
1483 	if ( rId.getLength() == 16 &&
1484           0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
1485 									rId.getConstArray(), 16 ) )
1486 	{
1487         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
1488 	}
1489 	return 0;
1490 }
1491 
1492 // static
1493 const uno::Sequence<sal_Int8>& ScHeaderFieldObj::getUnoTunnelId()
1494 {
1495 	static uno::Sequence<sal_Int8> * pSeq = 0;
1496 	if( !pSeq )
1497 	{
1498 		osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
1499 		if( !pSeq )
1500 		{
1501 			static uno::Sequence< sal_Int8 > aSeq( 16 );
1502 			rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
1503 			pSeq = &aSeq;
1504 		}
1505 	}
1506 	return *pSeq;
1507 }
1508 
1509 // static
1510 ScHeaderFieldObj* ScHeaderFieldObj::getImplementation(
1511 								const uno::Reference<text::XTextContent> xObj )
1512 {
1513 	ScHeaderFieldObj* pRet = NULL;
1514 	uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
1515 	if (xUT.is())
1516         pRet = reinterpret_cast<ScHeaderFieldObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
1517 	return pRet;
1518 }
1519 
1520 // XServiceInfo
1521 
1522 rtl::OUString SAL_CALL ScHeaderFieldObj::getImplementationName() throw(uno::RuntimeException)
1523 {
1524 	return rtl::OUString::createFromAscii( "ScHeaderFieldObj" );
1525 }
1526 
1527 sal_Bool SAL_CALL ScHeaderFieldObj::supportsService( const rtl::OUString& rServiceName )
1528 													throw(uno::RuntimeException)
1529 {
1530 	String aServiceStr( rServiceName );
1531 	return aServiceStr.EqualsAscii( SCTEXTFIELD_SERVICE ) ||
1532 		   aServiceStr.EqualsAscii( SCTEXTCONTENT_SERVICE );
1533 }
1534 
1535 uno::Sequence<rtl::OUString> SAL_CALL ScHeaderFieldObj::getSupportedServiceNames()
1536 													throw(uno::RuntimeException)
1537 {
1538 	uno::Sequence<rtl::OUString> aRet(2);
1539 	rtl::OUString* pArray = aRet.getArray();
1540 	pArray[0] = rtl::OUString::createFromAscii( SCTEXTFIELD_SERVICE );
1541 	pArray[1] = rtl::OUString::createFromAscii( SCTEXTCONTENT_SERVICE );
1542 	return aRet;
1543 }
1544 
1545 //------------------------------------------------------------------------
1546 
1547 
1548 
1549 
1550