1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: fielduno.cxx,v $
10 * $Revision: 1.18.32.3 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sc.hxx"
33 #include <svtools/smplhint.hxx>
36 #include <svx/eeitem.hxx>
38 #include <svx/editeng.hxx>
39 #include <svx/editobj.hxx>
40 #include <svx/flditem.hxx>
43 #include <com/sun/star/beans/PropertyAttribute.hpp>
44 #include <com/sun/star/text/TextContentAnchorType.hpp>
45 #include <com/sun/star/text/WrapTextMode.hpp>
46 #include <com/sun/star/text/FilenameDisplayFormat.hpp>
48 #include "fielduno.hxx"
49 #include "textuno.hxx"
50 #include "miscuno.hxx"
53 #include "editsrc.hxx"
54 #include "cellsuno.hxx"
55 #include "servuno.hxx" // fuer IDs
56 #include "unoguard.hxx"
57 #include "unonames.hxx"
58 #include "editutil.hxx"
60 using namespace com::sun::star
;
62 //------------------------------------------------------------------------
64 // alles ohne Which-ID, Map nur fuer PropertySetInfo
66 const SfxItemPropertySet
* lcl_GetURLPropertySet()
68 static SfxItemPropertyMapEntry aURLPropertyMap_Impl
[] =
70 {MAP_CHAR_LEN(SC_UNONAME_ANCTYPE
), 0, &getCppuType((text::TextContentAnchorType
*)0), beans::PropertyAttribute::READONLY
, 0 },
71 {MAP_CHAR_LEN(SC_UNONAME_ANCTYPES
), 0, &getCppuType((uno::Sequence
<text::TextContentAnchorType
>*)0), beans::PropertyAttribute::READONLY
, 0 },
72 {MAP_CHAR_LEN(SC_UNONAME_REPR
), 0, &getCppuType((rtl::OUString
*)0), 0, 0},
73 {MAP_CHAR_LEN(SC_UNONAME_TARGET
), 0, &getCppuType((rtl::OUString
*)0), 0, 0},
74 {MAP_CHAR_LEN(SC_UNONAME_TEXTWRAP
), 0, &getCppuType((text::WrapTextMode
*)0), beans::PropertyAttribute::READONLY
, 0 },
75 {MAP_CHAR_LEN(SC_UNONAME_URL
), 0, &getCppuType((rtl::OUString
*)0), 0, 0},
78 static SfxItemPropertySet
aURLPropertySet_Impl( aURLPropertyMap_Impl
);
79 return &aURLPropertySet_Impl
;
82 const SfxItemPropertySet
* lcl_GetHeaderFieldPropertySet()
84 static SfxItemPropertyMapEntry aHeaderFieldPropertyMap_Impl
[] =
86 {MAP_CHAR_LEN(SC_UNONAME_ANCTYPE
), 0, &getCppuType((text::TextContentAnchorType
*)0), beans::PropertyAttribute::READONLY
, 0 },
87 {MAP_CHAR_LEN(SC_UNONAME_ANCTYPES
), 0, &getCppuType((uno::Sequence
<text::TextContentAnchorType
>*)0), beans::PropertyAttribute::READONLY
, 0 },
88 {MAP_CHAR_LEN(SC_UNONAME_TEXTWRAP
), 0, &getCppuType((text::WrapTextMode
*)0), beans::PropertyAttribute::READONLY
, 0 },
91 static SfxItemPropertySet
aHeaderFieldPropertySet_Impl( aHeaderFieldPropertyMap_Impl
);
92 return &aHeaderFieldPropertySet_Impl
;
95 const SfxItemPropertySet
* lcl_GetFileFieldPropertySet()
97 static SfxItemPropertyMapEntry aFileFieldPropertyMap_Impl
[] =
99 {MAP_CHAR_LEN(SC_UNONAME_ANCTYPE
), 0, &getCppuType((text::TextContentAnchorType
*)0), beans::PropertyAttribute::READONLY
, 0 },
100 {MAP_CHAR_LEN(SC_UNONAME_ANCTYPES
), 0, &getCppuType((uno::Sequence
<text::TextContentAnchorType
>*)0), beans::PropertyAttribute::READONLY
, 0 },
101 {MAP_CHAR_LEN(SC_UNONAME_FILEFORM
), 0, &getCppuType((sal_Int16
*)0), 0, 0 },
102 {MAP_CHAR_LEN(SC_UNONAME_TEXTWRAP
), 0, &getCppuType((text::WrapTextMode
*)0), beans::PropertyAttribute::READONLY
, 0 },
105 static SfxItemPropertySet
aFileFieldPropertySet_Impl( aFileFieldPropertyMap_Impl
);
106 return &aFileFieldPropertySet_Impl
;
109 //------------------------------------------------------------------------
111 #define SCTEXTFIELD_SERVICE "com.sun.star.text.TextField"
112 #define SCTEXTCONTENT_SERVICE "com.sun.star.text.TextContent"
114 SC_SIMPLE_SERVICE_INFO( ScCellFieldsObj
, "ScCellFieldsObj", "com.sun.star.text.TextFields" )
115 SC_SIMPLE_SERVICE_INFO( ScHeaderFieldsObj
, "ScHeaderFieldsObj", "com.sun.star.text.TextFields" )
117 //------------------------------------------------------------------------
119 // ScUnoEditEngine nur um aus einer EditEngine die Felder herauszubekommen...
121 enum ScUnoCollectMode
124 SC_UNO_COLLECT_COUNT
,
125 SC_UNO_COLLECT_FINDINDEX
,
126 SC_UNO_COLLECT_FINDPOS
129 class ScUnoEditEngine
: public ScEditEngineDefaulter
131 ScUnoCollectMode eMode
;
134 SvxFieldData
* pFound
; // lokale Kopie
136 xub_StrLen nFieldPos
;
140 ScUnoEditEngine(ScEditEngineDefaulter
* pSource
);
143 //! nPos should be xub_StrLen
144 virtual String
CalcFieldValue( const SvxFieldItem
& rField
, USHORT nPara
, USHORT nPos
,
145 Color
*& rTxtColor
, Color
*& rFldColor
);
147 USHORT
CountFields(TypeId aType
);
148 SvxFieldData
* FindByIndex(USHORT nIndex
, TypeId aType
);
149 SvxFieldData
* FindByPos(USHORT nPar
, xub_StrLen nPos
, TypeId aType
);
151 USHORT
GetFieldPar() const { return nFieldPar
; }
152 xub_StrLen
GetFieldPos() const { return nFieldPos
; }
155 ScUnoEditEngine::ScUnoEditEngine(ScEditEngineDefaulter
* pSource
) :
156 ScEditEngineDefaulter( *pSource
),
157 eMode( SC_UNO_COLLECT_NONE
),
164 EditTextObject
* pData
= pSource
->CreateTextObject();
170 ScUnoEditEngine::~ScUnoEditEngine()
175 String
ScUnoEditEngine::CalcFieldValue( const SvxFieldItem
& rField
,
176 USHORT nPara
, USHORT nPos
, Color
*& rTxtColor
, Color
*& rFldColor
)
178 String
aRet(EditEngine::CalcFieldValue( rField
, nPara
, nPos
, rTxtColor
, rFldColor
));
179 if (eMode
!= SC_UNO_COLLECT_NONE
)
181 const SvxFieldData
* pFieldData
= rField
.GetField();
184 if ( !aFieldType
|| pFieldData
->Type() == aFieldType
)
186 if ( eMode
== SC_UNO_COLLECT_FINDINDEX
&& !pFound
&& nFieldCount
== nFieldIndex
)
188 pFound
= pFieldData
->Clone();
192 if ( eMode
== SC_UNO_COLLECT_FINDPOS
&& !pFound
&&
193 nPara
== nFieldPar
&& nPos
== nFieldPos
)
195 pFound
= pFieldData
->Clone();
196 nFieldIndex
= nFieldCount
;
205 USHORT
ScUnoEditEngine::CountFields(TypeId aType
)
207 eMode
= SC_UNO_COLLECT_COUNT
;
212 eMode
= SC_UNO_COLLECT_NONE
;
217 SvxFieldData
* ScUnoEditEngine::FindByIndex(USHORT nIndex
, TypeId aType
)
219 eMode
= SC_UNO_COLLECT_FINDINDEX
;
220 nFieldIndex
= nIndex
;
225 eMode
= SC_UNO_COLLECT_NONE
;
230 SvxFieldData
* ScUnoEditEngine::FindByPos(USHORT nPar
, xub_StrLen nPos
, TypeId aType
)
232 eMode
= SC_UNO_COLLECT_FINDPOS
;
239 eMode
= SC_UNO_COLLECT_NONE
;
244 //------------------------------------------------------------------------
246 ScCellFieldsObj::ScCellFieldsObj(ScDocShell
* pDocSh
, const ScAddress
& rPos
) :
249 mpRefreshListeners( NULL
)
251 pDocShell
->GetDocument()->AddUnoObject(*this);
253 pEditSource
= new ScCellEditSource( pDocShell
, aCellPos
);
256 ScCellFieldsObj::~ScCellFieldsObj()
259 pDocShell
->GetDocument()->RemoveUnoObject(*this);
263 // increment refcount to prevent double call off dtor
264 osl_incrementInterlockedCount( &m_refCount
);
266 if (mpRefreshListeners
)
268 lang::EventObject aEvent
;
269 aEvent
.Source
.set(static_cast<cppu::OWeakObject
*>(this));
270 if (mpRefreshListeners
)
272 mpRefreshListeners
->disposeAndClear(aEvent
);
273 DELETEZ( mpRefreshListeners
);
278 void ScCellFieldsObj::Notify( SfxBroadcaster
&, const SfxHint
& rHint
)
280 if ( rHint
.ISA( ScUpdateRefHint
) )
282 // const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
286 else if ( rHint
.ISA( SfxSimpleHint
) &&
287 ((const SfxSimpleHint
&)rHint
).GetId() == SFX_HINT_DYING
)
289 pDocShell
= NULL
; // ungueltig geworden
292 // EditSource hat sich selber als Listener angemeldet
295 // XIndexAccess (via XTextFields)
297 ScCellFieldObj
* ScCellFieldsObj::GetObjectByIndex_Impl(INT32 Index
) const
299 //! Feld-Funktionen muessen an den Forwarder !!!
300 ScEditEngineDefaulter
* pEditEngine
= ((ScCellEditSource
*)pEditSource
)->GetEditEngine();
301 ScUnoEditEngine
aTempEngine(pEditEngine
);
303 if ( aTempEngine
.FindByIndex( (USHORT
)Index
, NULL
) ) // in der Zelle ist der Typ egal
305 USHORT nPar
= aTempEngine
.GetFieldPar();
306 xub_StrLen nPos
= aTempEngine
.GetFieldPos();
307 ESelection
aSelection( nPar
, nPos
, nPar
, nPos
+1 ); // Feld ist 1 Zeichen
308 return new ScCellFieldObj( pDocShell
, aCellPos
, aSelection
);
313 sal_Int32 SAL_CALL
ScCellFieldsObj::getCount() throw(uno::RuntimeException
)
317 //! Feld-Funktionen muessen an den Forwarder !!!
318 ScEditEngineDefaulter
* pEditEngine
= ((ScCellEditSource
*)pEditSource
)->GetEditEngine();
319 ScUnoEditEngine
aTempEngine(pEditEngine
);
321 return aTempEngine
.CountFields(NULL
); // Felder zaehlen, in Zelle ist der Typ egal
324 uno::Any SAL_CALL
ScCellFieldsObj::getByIndex( sal_Int32 nIndex
)
325 throw(lang::IndexOutOfBoundsException
,
326 lang::WrappedTargetException
, uno::RuntimeException
)
329 uno::Reference
<text::XTextField
> xField(GetObjectByIndex_Impl(nIndex
));
331 return uno::makeAny(xField
);
333 throw lang::IndexOutOfBoundsException();
334 // return uno::Any();
337 uno::Type SAL_CALL
ScCellFieldsObj::getElementType() throw(uno::RuntimeException
)
340 return getCppuType((uno::Reference
<text::XTextField
>*)0);
343 sal_Bool SAL_CALL
ScCellFieldsObj::hasElements() throw(uno::RuntimeException
)
346 return ( getCount() != 0 );
349 uno::Reference
<container::XEnumeration
> SAL_CALL
ScCellFieldsObj::createEnumeration()
350 throw(uno::RuntimeException
)
353 return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextFieldEnumeration")));
356 void SAL_CALL
ScCellFieldsObj::addContainerListener(
357 const uno::Reference
<container::XContainerListener
>& /* xListener */ )
358 throw(uno::RuntimeException
)
360 DBG_ERROR("not implemented");
363 void SAL_CALL
ScCellFieldsObj::removeContainerListener(
364 const uno::Reference
<container::XContainerListener
>& /* xListener */ )
365 throw(uno::RuntimeException
)
367 DBG_ERROR("not implemented");
371 void SAL_CALL
ScCellFieldsObj::refresh( )
372 throw (uno::RuntimeException
)
374 if (mpRefreshListeners
)
376 // Call all listeners.
377 uno::Sequence
< uno::Reference
< uno::XInterface
> > aListeners(mpRefreshListeners
->getElements());
378 sal_uInt32
nLength(aListeners
.getLength());
381 const uno::Reference
< uno::XInterface
>* pInterfaces
= aListeners
.getConstArray();
384 lang::EventObject aEvent
;
385 aEvent
.Source
.set(uno::Reference
< util::XRefreshable
>(const_cast<ScCellFieldsObj
*>(this)));
393 static_cast< util::XRefreshListener
* >(pInterfaces
->get())->refreshed(aEvent
);
398 catch(uno::RuntimeException
&)
400 // DBG_ERROR("a object is gone without to remove from Broadcaster");
410 void SAL_CALL
ScCellFieldsObj::addRefreshListener( const uno::Reference
< util::XRefreshListener
>& xListener
)
411 throw (uno::RuntimeException
)
416 if (!mpRefreshListeners
)
417 mpRefreshListeners
= new cppu::OInterfaceContainerHelper(aMutex
);
418 mpRefreshListeners
->addInterface(xListener
);
422 void SAL_CALL
ScCellFieldsObj::removeRefreshListener( const uno::Reference
<util::XRefreshListener
>& xListener
)
423 throw (uno::RuntimeException
)
428 if (mpRefreshListeners
)
429 mpRefreshListeners
->removeInterface(xListener
);
433 //------------------------------------------------------------------------
435 // Default-ctor wird fuer SMART_REFLECTION_IMPLEMENTATION gebraucht
438 //UNUSED2008-05 ScCellFieldObj::ScCellFieldObj() :
439 //UNUSED2008-05 OComponentHelper( getMutex() ),
440 //UNUSED2008-05 aPropSet( lcl_GetURLPropertyMap() ),
441 //UNUSED2008-05 pDocShell( NULL )
443 //UNUSED2008-05 pEditSource = NULL;
446 ScCellFieldObj::ScCellFieldObj(ScDocShell
* pDocSh
, const ScAddress
& rPos
,
447 const ESelection
& rSel
) :
448 OComponentHelper( getMutex() ),
449 pPropSet( lcl_GetURLPropertySet() ),
454 // pDocShell ist Null, wenn per ServiceProvider erzeugt
458 pDocShell
->GetDocument()->AddUnoObject(*this);
459 pEditSource
= new ScCellEditSource( pDocShell
, aCellPos
);
465 uno::Any SAL_CALL
ScCellFieldObj::queryAggregation( const uno::Type
& rType
)
466 throw(uno::RuntimeException
)
468 SC_QUERYINTERFACE( text::XTextField
)
469 SC_QUERYINTERFACE( text::XTextContent
) // parent of XTextField
470 SC_QUERYINTERFACE( beans::XPropertySet
)
471 SC_QUERYINTERFACE( lang::XUnoTunnel
)
472 SC_QUERYINTERFACE( lang::XServiceInfo
)
474 return OComponentHelper::queryAggregation( rType
); // XComponent
477 uno::Sequence
<uno::Type
> SAL_CALL
ScCellFieldObj::getTypes() throw(uno::RuntimeException
)
479 static uno::Sequence
<uno::Type
> aTypes
;
480 if ( aTypes
.getLength() == 0 )
482 uno::Sequence
<uno::Type
> aParentTypes(OComponentHelper::getTypes());
483 long nParentLen
= aParentTypes
.getLength();
484 const uno::Type
* pParentPtr
= aParentTypes
.getConstArray();
486 aTypes
.realloc( nParentLen
+ 4 );
487 uno::Type
* pPtr
= aTypes
.getArray();
488 pPtr
[nParentLen
+ 0] = getCppuType((const uno::Reference
<text::XTextField
>*)0);
489 pPtr
[nParentLen
+ 1] = getCppuType((const uno::Reference
<beans::XPropertySet
>*)0);
490 pPtr
[nParentLen
+ 2] = getCppuType((const uno::Reference
<lang::XUnoTunnel
>*)0);
491 pPtr
[nParentLen
+ 3] = getCppuType((const uno::Reference
<lang::XServiceInfo
>*)0);
493 for (long i
=0; i
<nParentLen
; i
++)
494 pPtr
[i
] = pParentPtr
[i
]; // parent types first
499 uno::Sequence
<sal_Int8
> SAL_CALL
ScCellFieldObj::getImplementationId()
500 throw(uno::RuntimeException
)
502 static uno::Sequence
< sal_Int8
> aId
;
503 if( aId
.getLength() == 0 )
506 rtl_createUuid( (sal_uInt8
*)aId
.getArray(), 0, sal_True
);
511 uno::Any SAL_CALL
ScCellFieldObj::queryInterface( const uno::Type
& rType
)
512 throw(uno::RuntimeException
)
514 return OComponentHelper::queryInterface( rType
);
517 void SAL_CALL
ScCellFieldObj::acquire() throw()
519 OComponentHelper::acquire();
522 void SAL_CALL
ScCellFieldObj::release() throw()
524 OComponentHelper::release();
527 void ScCellFieldObj::InitDoc( ScDocShell
* pDocSh
, const ScAddress
& rPos
,
528 const ESelection
& rSel
)
530 if ( pDocSh
&& !pEditSource
)
536 pDocShell
->GetDocument()->AddUnoObject(*this);
537 pEditSource
= new ScCellEditSource( pDocShell
, aCellPos
);
541 ScCellFieldObj::~ScCellFieldObj()
544 pDocShell
->GetDocument()->RemoveUnoObject(*this);
549 void ScCellFieldObj::Notify( SfxBroadcaster
&, const SfxHint
& rHint
)
551 //! Updates fuer aSelection (muessen erst noch erzeugt werden) !!!!!!
553 if ( rHint
.ISA( ScUpdateRefHint
) )
555 // const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
559 else if ( rHint
.ISA( SfxSimpleHint
) &&
560 ((const SfxSimpleHint
&)rHint
).GetId() == SFX_HINT_DYING
)
562 pDocShell
= NULL
; // ungueltig geworden
565 // EditSource hat sich selber als Listener angemeldet
568 // per getImplementation gerufen:
570 SvxFieldItem
ScCellFieldObj::CreateFieldItem()
572 DBG_ASSERT( !pEditSource
, "CreateFieldItem mit eingefuegtem Feld" );
575 aField
.SetFormat(SVXURLFORMAT_APPDEFAULT
);
576 aField
.SetURL( aUrl
);
577 aField
.SetRepresentation( aRepresentation
);
578 aField
.SetTargetFrame( aTarget
);
579 return SvxFieldItem( aField
, EE_FEATURE_FIELD
);
582 void ScCellFieldObj::DeleteField()
586 SvxTextForwarder
* pForwarder
= pEditSource
->GetTextForwarder();
587 // pEditEngine->QuickDelete( aSelection );
588 pForwarder
->QuickInsertText( String(), aSelection
);
589 pEditSource
->UpdateData();
591 aSelection
.nEndPara
= aSelection
.nStartPara
;
592 aSelection
.nEndPos
= aSelection
.nStartPos
;
594 //! Broadcast, um Selektion in anderen Objekten anzupassen
595 //! (auch bei anderen Aktionen)
601 rtl::OUString SAL_CALL
ScCellFieldObj::getPresentation( sal_Bool bShowCommand
)
602 throw(uno::RuntimeException
)
609 //! Feld-Funktionen muessen an den Forwarder !!!
610 ScEditEngineDefaulter
* pEditEngine
= ((ScCellEditSource
*)pEditSource
)->GetEditEngine();
611 ScUnoEditEngine
aTempEngine(pEditEngine
);
613 // Typ egal (in Zellen gibts nur URLs)
614 SvxFieldData
* pField
= aTempEngine
.FindByPos( aSelection
.nStartPara
, aSelection
.nStartPos
, 0 );
615 DBG_ASSERT(pField
,"getPresentation: Feld nicht gefunden");
618 SvxURLField
* pURL
= (SvxURLField
*)pField
;
620 aRet
= pURL
->GetURL();
622 aRet
= pURL
->GetRepresentation();
631 void SAL_CALL
ScCellFieldObj::attach( const uno::Reference
<text::XTextRange
>& xTextRange
)
632 throw(lang::IllegalArgumentException
, uno::RuntimeException
)
637 uno::Reference
<text::XText
> xText(xTextRange
->getText());
640 xText
->insertTextContent( xTextRange
, this, TRUE
);
645 uno::Reference
<text::XTextRange
> SAL_CALL
ScCellFieldObj::getAnchor() throw(uno::RuntimeException
)
649 return new ScCellObj( pDocShell
, aCellPos
);
655 void SAL_CALL
ScCellFieldObj::dispose() throw(uno::RuntimeException
)
657 OComponentHelper::dispose();
660 void SAL_CALL
ScCellFieldObj::addEventListener(
661 const uno::Reference
<lang::XEventListener
>& xListener
)
662 throw(uno::RuntimeException
)
664 OComponentHelper::addEventListener( xListener
);
667 void SAL_CALL
ScCellFieldObj::removeEventListener(
668 const uno::Reference
<lang::XEventListener
>& xListener
)
669 throw(uno::RuntimeException
)
671 OComponentHelper::removeEventListener( xListener
);
676 uno::Reference
<beans::XPropertySetInfo
> SAL_CALL
ScCellFieldObj::getPropertySetInfo()
677 throw(uno::RuntimeException
)
680 static uno::Reference
<beans::XPropertySetInfo
> aRef
= pPropSet
->getPropertySetInfo();
684 void SAL_CALL
ScCellFieldObj::setPropertyValue(
685 const rtl::OUString
& aPropertyName
, const uno::Any
& aValue
)
686 throw(beans::UnknownPropertyException
, beans::PropertyVetoException
,
687 lang::IllegalArgumentException
, lang::WrappedTargetException
,
688 uno::RuntimeException
)
691 String
aNameString(aPropertyName
);
692 rtl::OUString aStrVal
;
695 //! Feld-Funktionen muessen an den Forwarder !!!
696 ScEditEngineDefaulter
* pEditEngine
= ((ScCellEditSource
*)pEditSource
)->GetEditEngine();
697 ScUnoEditEngine
aTempEngine(pEditEngine
);
699 // Typ egal (in Zellen gibts nur URLs)
700 SvxFieldData
* pField
= aTempEngine
.FindByPos( aSelection
.nStartPara
, aSelection
.nStartPos
, 0 );
701 DBG_ASSERT(pField
,"setPropertyValue: Feld nicht gefunden");
704 SvxURLField
* pURL
= (SvxURLField
*)pField
; // ist eine Kopie in der ScUnoEditEngine
707 if ( aNameString
.EqualsAscii( SC_UNONAME_URL
) )
709 if (aValue
>>= aStrVal
)
710 pURL
->SetURL( aStrVal
);
712 else if ( aNameString
.EqualsAscii( SC_UNONAME_REPR
) )
714 if (aValue
>>= aStrVal
)
715 pURL
->SetRepresentation( aStrVal
);
717 else if ( aNameString
.EqualsAscii( SC_UNONAME_TARGET
) )
719 if (aValue
>>= aStrVal
)
720 pURL
->SetTargetFrame( aStrVal
);
727 pEditEngine
->QuickInsertField( SvxFieldItem(*pField
, EE_FEATURE_FIELD
), aSelection
);
728 pEditSource
->UpdateData();
732 else // noch nicht eingefuegt
734 if ( aNameString
.EqualsAscii( SC_UNONAME_URL
) )
736 if (aValue
>>= aStrVal
)
737 aUrl
= String( aStrVal
);
739 else if ( aNameString
.EqualsAscii( SC_UNONAME_REPR
) )
741 if (aValue
>>= aStrVal
)
742 aRepresentation
= String( aStrVal
);
744 else if ( aNameString
.EqualsAscii( SC_UNONAME_TARGET
) )
746 if (aValue
>>= aStrVal
)
747 aTarget
= String( aStrVal
);
752 uno::Any SAL_CALL
ScCellFieldObj::getPropertyValue( const rtl::OUString
& aPropertyName
)
753 throw(beans::UnknownPropertyException
, lang::WrappedTargetException
,
754 uno::RuntimeException
)
758 String
aNameString(aPropertyName
);
760 // anchor type is always "as character", text wrap always "none"
762 if ( aNameString
.EqualsAscii( SC_UNONAME_ANCTYPE
) )
763 aRet
<<= text::TextContentAnchorType_AS_CHARACTER
;
764 else if ( aNameString
.EqualsAscii( SC_UNONAME_ANCTYPES
) )
766 uno::Sequence
<text::TextContentAnchorType
> aSeq(1);
767 aSeq
[0] = text::TextContentAnchorType_AS_CHARACTER
;
770 else if ( aNameString
.EqualsAscii( SC_UNONAME_TEXTWRAP
) )
771 aRet
<<= text::WrapTextMode_NONE
;
772 else if (pEditSource
)
774 //! Feld-Funktionen muessen an den Forwarder !!!
775 ScEditEngineDefaulter
* pEditEngine
= ((ScCellEditSource
*)pEditSource
)->GetEditEngine();
776 ScUnoEditEngine
aTempEngine(pEditEngine
);
778 // Typ egal (in Zellen gibts nur URLs)
779 SvxFieldData
* pField
= aTempEngine
.FindByPos( aSelection
.nStartPara
, aSelection
.nStartPos
, 0 );
780 DBG_ASSERT(pField
,"getPropertyValue: Feld nicht gefunden");
783 SvxURLField
* pURL
= (SvxURLField
*)pField
;
785 if ( aNameString
.EqualsAscii( SC_UNONAME_URL
) )
786 aRet
<<= rtl::OUString( pURL
->GetURL() );
787 else if ( aNameString
.EqualsAscii( SC_UNONAME_REPR
) )
788 aRet
<<= rtl::OUString( pURL
->GetRepresentation() );
789 else if ( aNameString
.EqualsAscii( SC_UNONAME_TARGET
) )
790 aRet
<<= rtl::OUString( pURL
->GetTargetFrame() );
793 else // noch nicht eingefuegt
795 if ( aNameString
.EqualsAscii( SC_UNONAME_URL
) )
796 aRet
<<= rtl::OUString( aUrl
);
797 else if ( aNameString
.EqualsAscii( SC_UNONAME_REPR
) )
798 aRet
<<= rtl::OUString( aRepresentation
);
799 else if ( aNameString
.EqualsAscii( SC_UNONAME_TARGET
) )
800 aRet
<<= rtl::OUString( aTarget
);
805 SC_IMPL_DUMMY_PROPERTY_LISTENER( ScCellFieldObj
)
809 sal_Int64 SAL_CALL
ScCellFieldObj::getSomething(
810 const uno::Sequence
<sal_Int8
>& rId
) throw(uno::RuntimeException
)
812 if ( rId
.getLength() == 16 &&
813 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
814 rId
.getConstArray(), 16 ) )
816 return sal::static_int_cast
<sal_Int64
>(reinterpret_cast<sal_IntPtr
>(this));
822 const uno::Sequence
<sal_Int8
>& ScCellFieldObj::getUnoTunnelId()
824 static uno::Sequence
<sal_Int8
> * pSeq
= 0;
827 osl::Guard
< osl::Mutex
> aGuard( osl::Mutex::getGlobalMutex() );
830 static uno::Sequence
< sal_Int8
> aSeq( 16 );
831 rtl_createUuid( (sal_uInt8
*)aSeq
.getArray(), 0, sal_True
);
839 ScCellFieldObj
* ScCellFieldObj::getImplementation(
840 const uno::Reference
<text::XTextContent
> xObj
)
842 ScCellFieldObj
* pRet
= NULL
;
843 uno::Reference
<lang::XUnoTunnel
> xUT( xObj
, uno::UNO_QUERY
);
845 pRet
= reinterpret_cast<ScCellFieldObj
*>(sal::static_int_cast
<sal_IntPtr
>(xUT
->getSomething(getUnoTunnelId())));
851 rtl::OUString SAL_CALL
ScCellFieldObj::getImplementationName() throw(uno::RuntimeException
)
853 return rtl::OUString::createFromAscii( "ScCellFieldObj" );
856 sal_Bool SAL_CALL
ScCellFieldObj::supportsService( const rtl::OUString
& rServiceName
)
857 throw(uno::RuntimeException
)
859 String
aServiceStr( rServiceName
);
860 return aServiceStr
.EqualsAscii( SCTEXTFIELD_SERVICE
) ||
861 aServiceStr
.EqualsAscii( SCTEXTCONTENT_SERVICE
);
864 uno::Sequence
<rtl::OUString
> SAL_CALL
ScCellFieldObj::getSupportedServiceNames()
865 throw(uno::RuntimeException
)
867 uno::Sequence
<rtl::OUString
> aRet(2);
868 rtl::OUString
* pArray
= aRet
.getArray();
869 pArray
[0] = rtl::OUString::createFromAscii( SCTEXTFIELD_SERVICE
);
870 pArray
[1] = rtl::OUString::createFromAscii( SCTEXTCONTENT_SERVICE
);
874 //------------------------------------------------------------------------
876 ScHeaderFieldsObj::ScHeaderFieldsObj(ScHeaderFooterContentObj
* pContent
, USHORT nP
, USHORT nT
) :
877 pContentObj( pContent
),
880 mpRefreshListeners( NULL
)
882 DBG_ASSERT( pContentObj
, "ScHeaderFieldsObj ohne Objekt?" );
886 pContentObj
->acquire(); // darf nicht wegkommen
887 pEditSource
= new ScHeaderFooterEditSource( pContentObj
, nPart
);
893 ScHeaderFieldsObj::~ScHeaderFieldsObj()
898 pContentObj
->release();
900 // increment refcount to prevent double call off dtor
901 osl_incrementInterlockedCount( &m_refCount
);
903 if (mpRefreshListeners
)
905 lang::EventObject aEvent
;
906 aEvent
.Source
= static_cast<cppu::OWeakObject
*>(this);
907 if (mpRefreshListeners
)
909 mpRefreshListeners
->disposeAndClear(aEvent
);
910 DELETEZ( mpRefreshListeners
);
915 // XIndexAccess (via XTextFields)
917 ScHeaderFieldObj
* ScHeaderFieldsObj::GetObjectByIndex_Impl(INT32 Index
) const
919 //! Feld-Funktionen muessen an den Forwarder !!!
920 ScEditEngineDefaulter
* pEditEngine
= ((ScHeaderFooterEditSource
*)pEditSource
)->GetEditEngine();
921 ScUnoEditEngine
aTempEngine(pEditEngine
);
923 TypeId aTypeId
= NULL
;
926 case SC_SERVICE_PAGEFIELD
: aTypeId
= TYPE(SvxPageField
); break;
927 case SC_SERVICE_PAGESFIELD
: aTypeId
= TYPE(SvxPagesField
); break;
928 case SC_SERVICE_DATEFIELD
: aTypeId
= TYPE(SvxDateField
); break;
929 case SC_SERVICE_TIMEFIELD
: aTypeId
= TYPE(SvxTimeField
); break;
930 case SC_SERVICE_TITLEFIELD
: aTypeId
= TYPE(SvxFileField
); break;
931 case SC_SERVICE_FILEFIELD
: aTypeId
= TYPE(SvxExtFileField
); break;
932 case SC_SERVICE_SHEETFIELD
: aTypeId
= TYPE(SvxTableField
); break;
933 // bei SC_SERVICE_INVALID bleibt TypeId Null
935 SvxFieldData
* pData
= aTempEngine
.FindByIndex( (USHORT
)Index
, aTypeId
);
938 USHORT nPar
= aTempEngine
.GetFieldPar();
939 xub_StrLen nPos
= aTempEngine
.GetFieldPos();
941 USHORT nFieldType
= nType
;
942 if ( nFieldType
== SC_SERVICE_INVALID
)
944 if ( pData
->ISA( SvxPageField
) ) nFieldType
= SC_SERVICE_PAGEFIELD
;
945 else if ( pData
->ISA( SvxPagesField
) ) nFieldType
= SC_SERVICE_PAGESFIELD
;
946 else if ( pData
->ISA( SvxDateField
) ) nFieldType
= SC_SERVICE_DATEFIELD
;
947 else if ( pData
->ISA( SvxTimeField
) ) nFieldType
= SC_SERVICE_TIMEFIELD
;
948 else if ( pData
->ISA( SvxFileField
) ) nFieldType
= SC_SERVICE_TITLEFIELD
;
949 else if ( pData
->ISA( SvxExtFileField
) ) nFieldType
= SC_SERVICE_FILEFIELD
;
950 else if ( pData
->ISA( SvxTableField
) ) nFieldType
= SC_SERVICE_SHEETFIELD
;
953 ESelection
aSelection( nPar
, nPos
, nPar
, nPos
+1 ); // Field is 1 character
954 return new ScHeaderFieldObj( pContentObj
, nPart
, nFieldType
, aSelection
);
959 sal_Int32 SAL_CALL
ScHeaderFieldsObj::getCount() throw(uno::RuntimeException
)
963 //! Feld-Funktionen muessen an den Forwarder !!!
964 ScEditEngineDefaulter
* pEditEngine
= ((ScHeaderFooterEditSource
*)pEditSource
)->GetEditEngine();
965 ScUnoEditEngine
aTempEngine(pEditEngine
);
967 TypeId aTypeId
= NULL
;
970 case SC_SERVICE_PAGEFIELD
: aTypeId
= TYPE(SvxPageField
); break;
971 case SC_SERVICE_PAGESFIELD
: aTypeId
= TYPE(SvxPagesField
); break;
972 case SC_SERVICE_DATEFIELD
: aTypeId
= TYPE(SvxDateField
); break;
973 case SC_SERVICE_TIMEFIELD
: aTypeId
= TYPE(SvxTimeField
); break;
974 case SC_SERVICE_TITLEFIELD
: aTypeId
= TYPE(SvxFileField
); break;
975 case SC_SERVICE_FILEFIELD
: aTypeId
= TYPE(SvxExtFileField
); break;
976 case SC_SERVICE_SHEETFIELD
: aTypeId
= TYPE(SvxTableField
); break;
978 return aTempEngine
.CountFields(aTypeId
); // Felder zaehlen
981 uno::Any SAL_CALL
ScHeaderFieldsObj::getByIndex( sal_Int32 nIndex
)
982 throw(lang::IndexOutOfBoundsException
,
983 lang::WrappedTargetException
, uno::RuntimeException
)
986 uno::Reference
<text::XTextField
> xField(GetObjectByIndex_Impl(nIndex
));
988 return uno::makeAny(xField
);
990 throw lang::IndexOutOfBoundsException();
991 // return uno::Any();
994 uno::Type SAL_CALL
ScHeaderFieldsObj::getElementType() throw(uno::RuntimeException
)
997 return getCppuType((uno::Reference
<text::XTextField
>*)0);
1000 sal_Bool SAL_CALL
ScHeaderFieldsObj::hasElements() throw(uno::RuntimeException
)
1003 return ( getCount() != 0 );
1006 uno::Reference
<container::XEnumeration
> SAL_CALL
ScHeaderFieldsObj::createEnumeration()
1007 throw(uno::RuntimeException
)
1010 return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextFieldEnumeration")));
1013 void SAL_CALL
ScHeaderFieldsObj::addContainerListener(
1014 const uno::Reference
<container::XContainerListener
>& /* xListener */ )
1015 throw(uno::RuntimeException
)
1017 DBG_ERROR("not implemented");
1020 void SAL_CALL
ScHeaderFieldsObj::removeContainerListener(
1021 const uno::Reference
<container::XContainerListener
>& /* xListener */ )
1022 throw(uno::RuntimeException
)
1024 DBG_ERROR("not implemented");
1028 void SAL_CALL
ScHeaderFieldsObj::refresh( )
1029 throw (uno::RuntimeException
)
1031 if (mpRefreshListeners
)
1033 // Call all listeners.
1034 uno::Sequence
< uno::Reference
< uno::XInterface
> > aListeners(mpRefreshListeners
->getElements());
1035 sal_uInt32
nLength(aListeners
.getLength());
1038 const uno::Reference
< uno::XInterface
>* pInterfaces
= aListeners
.getConstArray();
1041 lang::EventObject aEvent
;
1042 aEvent
.Source
.set(uno::Reference
< util::XRefreshable
>(const_cast<ScHeaderFieldsObj
*>(this)));
1050 static_cast< util::XRefreshListener
* >(pInterfaces
->get())->refreshed(aEvent
);
1055 catch(uno::RuntimeException
&)
1057 // DBG_ERROR("a object is gone without to remove from Broadcaster");
1067 void SAL_CALL
ScHeaderFieldsObj::addRefreshListener( const uno::Reference
< util::XRefreshListener
>& xListener
)
1068 throw (uno::RuntimeException
)
1073 if (!mpRefreshListeners
)
1074 mpRefreshListeners
= new cppu::OInterfaceContainerHelper(aMutex
);
1075 mpRefreshListeners
->addInterface(xListener
);
1079 void SAL_CALL
ScHeaderFieldsObj::removeRefreshListener( const uno::Reference
<util::XRefreshListener
>& xListener
)
1080 throw (uno::RuntimeException
)
1085 if (mpRefreshListeners
)
1086 mpRefreshListeners
->removeInterface(xListener
);
1090 //------------------------------------------------------------------------
1092 SvxFileFormat
lcl_UnoToSvxFileFormat( sal_Int16 nUnoValue
)
1096 case text::FilenameDisplayFormat::FULL
: return SVXFILEFORMAT_FULLPATH
;
1097 case text::FilenameDisplayFormat::PATH
: return SVXFILEFORMAT_PATH
;
1098 case text::FilenameDisplayFormat::NAME
: return SVXFILEFORMAT_NAME
;
1099 // case text::FilenameDisplayFormat::NAME_AND_EXT:
1101 return SVXFILEFORMAT_NAME_EXT
;
1105 sal_Int16
lcl_SvxToUnoFileFormat( SvxFileFormat nSvxValue
)
1109 case SVXFILEFORMAT_NAME_EXT
: return text::FilenameDisplayFormat::NAME_AND_EXT
;
1110 case SVXFILEFORMAT_FULLPATH
: return text::FilenameDisplayFormat::FULL
;
1111 case SVXFILEFORMAT_PATH
: return text::FilenameDisplayFormat::PATH
;
1112 // case SVXFILEFORMAT_NAME:
1114 return text::FilenameDisplayFormat::NAME
;
1119 // Default-ctor wird fuer SMART_REFLECTION_IMPLEMENTATION gebraucht
1120 //UNUSED2008-05 ScHeaderFieldObj::ScHeaderFieldObj() :
1121 //UNUSED2008-05 OComponentHelper( getMutex() ),
1122 //UNUSED2008-05 aPropSet( lcl_GetHeaderFieldPropertyMap() ),
1123 //UNUSED2008-05 pContentObj( NULL ),
1124 //UNUSED2008-05 nPart( 0 ),
1125 //UNUSED2008-05 nType( 0 ),
1126 //UNUSED2008-05 nFileFormat( SVXFILEFORMAT_NAME_EXT )
1128 //UNUSED2008-05 pEditSource = NULL;
1131 ScHeaderFieldObj::ScHeaderFieldObj(ScHeaderFooterContentObj
* pContent
, USHORT nP
,
1132 USHORT nT
, const ESelection
& rSel
) :
1133 OComponentHelper( getMutex() ),
1134 pPropSet( (nT
== SC_SERVICE_FILEFIELD
) ? lcl_GetFileFieldPropertySet() : lcl_GetHeaderFieldPropertySet() ),
1135 pContentObj( pContent
),
1139 nFileFormat( SVXFILEFORMAT_NAME_EXT
)
1141 // pContent ist Null, wenn per ServiceProvider erzeugt
1145 pContentObj
->acquire(); // darf nicht wegkommen
1146 pEditSource
= new ScHeaderFooterEditSource( pContentObj
, nPart
);
1152 uno::Any SAL_CALL
ScHeaderFieldObj::queryAggregation( const uno::Type
& rType
)
1153 throw(uno::RuntimeException
)
1155 SC_QUERYINTERFACE( text::XTextField
)
1156 SC_QUERYINTERFACE( text::XTextContent
) // parent of XTextField
1157 SC_QUERYINTERFACE( beans::XPropertySet
)
1158 SC_QUERYINTERFACE( lang::XUnoTunnel
)
1159 SC_QUERYINTERFACE( lang::XServiceInfo
)
1161 return OComponentHelper::queryAggregation( rType
); // XComponent
1164 uno::Sequence
<uno::Type
> SAL_CALL
ScHeaderFieldObj::getTypes() throw(uno::RuntimeException
)
1166 static uno::Sequence
<uno::Type
> aTypes
;
1167 if ( aTypes
.getLength() == 0 )
1169 uno::Sequence
<uno::Type
> aParentTypes(OComponentHelper::getTypes());
1170 long nParentLen
= aParentTypes
.getLength();
1171 const uno::Type
* pParentPtr
= aParentTypes
.getConstArray();
1173 aTypes
.realloc( nParentLen
+ 4 );
1174 uno::Type
* pPtr
= aTypes
.getArray();
1175 pPtr
[nParentLen
+ 0] = getCppuType((const uno::Reference
<text::XTextField
>*)0);
1176 pPtr
[nParentLen
+ 1] = getCppuType((const uno::Reference
<beans::XPropertySet
>*)0);
1177 pPtr
[nParentLen
+ 2] = getCppuType((const uno::Reference
<lang::XUnoTunnel
>*)0);
1178 pPtr
[nParentLen
+ 3] = getCppuType((const uno::Reference
<lang::XServiceInfo
>*)0);
1180 for (long i
=0; i
<nParentLen
; i
++)
1181 pPtr
[i
] = pParentPtr
[i
]; // parent types first
1186 uno::Sequence
<sal_Int8
> SAL_CALL
ScHeaderFieldObj::getImplementationId()
1187 throw(uno::RuntimeException
)
1189 static uno::Sequence
< sal_Int8
> aId
;
1190 if( aId
.getLength() == 0 )
1193 rtl_createUuid( (sal_uInt8
*)aId
.getArray(), 0, sal_True
);
1198 uno::Any SAL_CALL
ScHeaderFieldObj::queryInterface( const uno::Type
& rType
)
1199 throw(uno::RuntimeException
)
1201 return OComponentHelper::queryInterface( rType
);
1204 void SAL_CALL
ScHeaderFieldObj::acquire() throw()
1206 OComponentHelper::acquire();
1209 void SAL_CALL
ScHeaderFieldObj::release() throw()
1211 OComponentHelper::release();
1214 void ScHeaderFieldObj::InitDoc( ScHeaderFooterContentObj
* pContent
, USHORT nP
,
1215 const ESelection
& rSel
)
1217 if ( pContent
&& !pEditSource
)
1219 DBG_ASSERT( !pContentObj
, "ContentObj, aber kein EditSource?" );
1223 pContentObj
= pContent
;
1225 pContentObj
->acquire(); // darf nicht wegkommen
1226 pEditSource
= new ScHeaderFooterEditSource( pContentObj
, nPart
);
1230 ScHeaderFieldObj::~ScHeaderFieldObj()
1235 pContentObj
->release();
1238 // per getImplementation gerufen:
1240 SvxFieldItem
ScHeaderFieldObj::CreateFieldItem()
1242 DBG_ASSERT( !pEditSource
, "CreateFieldItem mit eingefuegtem Feld" );
1246 case SC_SERVICE_PAGEFIELD
:
1248 SvxPageField aField
;
1249 return SvxFieldItem( aField
, EE_FEATURE_FIELD
);
1251 case SC_SERVICE_PAGESFIELD
:
1253 SvxPagesField aField
;
1254 return SvxFieldItem( aField
, EE_FEATURE_FIELD
);
1256 case SC_SERVICE_DATEFIELD
:
1258 SvxDateField aField
;
1259 return SvxFieldItem( aField
, EE_FEATURE_FIELD
);
1261 case SC_SERVICE_TIMEFIELD
:
1263 SvxTimeField aField
;
1264 return SvxFieldItem( aField
, EE_FEATURE_FIELD
);
1266 case SC_SERVICE_TITLEFIELD
:
1268 SvxFileField aField
;
1269 return SvxFieldItem( aField
, EE_FEATURE_FIELD
);
1271 case SC_SERVICE_FILEFIELD
:
1273 SvxExtFileField aField
;
1274 aField
.SetFormat( (SvxFileFormat
) nFileFormat
);
1275 return SvxFieldItem( aField
, EE_FEATURE_FIELD
);
1277 case SC_SERVICE_SHEETFIELD
:
1279 SvxTableField aField
;
1280 return SvxFieldItem( aField
, EE_FEATURE_FIELD
);
1284 return SvxFieldItem( SvxFieldData(), EE_FEATURE_FIELD
);
1287 void ScHeaderFieldObj::DeleteField()
1291 SvxTextForwarder
* pForwarder
= pEditSource
->GetTextForwarder();
1292 // pEditEngine->QuickDelete( aSelection );
1293 pForwarder
->QuickInsertText( String(), aSelection
);
1294 pEditSource
->UpdateData();
1296 aSelection
.nEndPara
= aSelection
.nStartPara
;
1297 aSelection
.nEndPos
= aSelection
.nStartPos
;
1299 //! Broadcast, um Selektion in anderen Objekten anzupassen
1300 //! (auch bei anderen Aktionen)
1306 rtl::OUString SAL_CALL
ScHeaderFieldObj::getPresentation( sal_Bool
/* bShowCommand */ )
1307 throw(uno::RuntimeException
)
1314 // Feld von der EditEngine formatieren lassen, bShowCommand gibt's nicht
1316 SvxTextForwarder
* pForwarder
= pEditSource
->GetTextForwarder();
1317 aRet
= pForwarder
->GetText( aSelection
);
1325 void SAL_CALL
ScHeaderFieldObj::attach( const uno::Reference
<text::XTextRange
>& xTextRange
)
1326 throw(lang::IllegalArgumentException
, uno::RuntimeException
)
1329 if (xTextRange
.is())
1331 uno::Reference
<text::XText
> xText(xTextRange
->getText());
1334 xText
->insertTextContent( xTextRange
, this, TRUE
);
1339 uno::Reference
<text::XTextRange
> SAL_CALL
ScHeaderFieldObj::getAnchor() throw(uno::RuntimeException
)
1344 uno::Reference
<text::XText
> xText
;
1345 if ( nPart
== SC_HDFT_LEFT
)
1346 xText
= pContentObj
->getLeftText();
1347 else if (nPart
== SC_HDFT_CENTER
)
1348 xText
= pContentObj
->getCenterText();
1350 xText
= pContentObj
->getRightText();
1351 return uno::Reference
<text::XTextRange
>( xText
, uno::UNO_QUERY
);
1358 void SAL_CALL
ScHeaderFieldObj::dispose() throw(uno::RuntimeException
)
1360 OComponentHelper::dispose();
1363 void SAL_CALL
ScHeaderFieldObj::addEventListener(
1364 const uno::Reference
<lang::XEventListener
>& xListener
)
1365 throw(uno::RuntimeException
)
1367 OComponentHelper::addEventListener( xListener
);
1370 void SAL_CALL
ScHeaderFieldObj::removeEventListener(
1371 const uno::Reference
<lang::XEventListener
>& xListener
)
1372 throw(uno::RuntimeException
)
1374 OComponentHelper::removeEventListener( xListener
);
1379 uno::Reference
<beans::XPropertySetInfo
> SAL_CALL
ScHeaderFieldObj::getPropertySetInfo()
1380 throw(uno::RuntimeException
)
1383 if (nType
== SC_SERVICE_FILEFIELD
)
1385 // file field has different properties
1386 static uno::Reference
<beans::XPropertySetInfo
> aFileFieldInfo
= pPropSet
->getPropertySetInfo();
1387 return aFileFieldInfo
;
1391 static uno::Reference
<beans::XPropertySetInfo
> aRef
= pPropSet
->getPropertySetInfo();
1396 void SAL_CALL
ScHeaderFieldObj::setPropertyValue(
1397 const rtl::OUString
& aPropertyName
, const uno::Any
& aValue
)
1398 throw(beans::UnknownPropertyException
, beans::PropertyVetoException
,
1399 lang::IllegalArgumentException
, lang::WrappedTargetException
,
1400 uno::RuntimeException
)
1403 String
aNameString(aPropertyName
);
1404 if ( nType
== SC_SERVICE_FILEFIELD
&& aNameString
.EqualsAscii( SC_UNONAME_FILEFORM
) )
1406 sal_Int16 nIntVal
= 0;
1407 if ( aValue
>>= nIntVal
)
1409 SvxFileFormat eFormat
= lcl_UnoToSvxFileFormat( nIntVal
);
1412 ScEditEngineDefaulter
* pEditEngine
= ((ScHeaderFooterEditSource
*)pEditSource
)->GetEditEngine();
1413 ScUnoEditEngine
aTempEngine(pEditEngine
);
1414 SvxFieldData
* pField
= aTempEngine
.FindByPos(
1415 aSelection
.nStartPara
, aSelection
.nStartPos
, TYPE(SvxExtFileField
) );
1416 DBG_ASSERT(pField
,"setPropertyValue: Field not found");
1419 SvxExtFileField
* pExtFile
= (SvxExtFileField
*)pField
; // local to the ScUnoEditEngine
1420 pExtFile
->SetFormat( eFormat
);
1421 pEditEngine
->QuickInsertField( SvxFieldItem(*pField
, EE_FEATURE_FIELD
), aSelection
);
1422 pEditSource
->UpdateData();
1426 nFileFormat
= sal::static_int_cast
<sal_Int16
>(eFormat
); // not inserted yet - store value
1431 uno::Any SAL_CALL
ScHeaderFieldObj::getPropertyValue( const rtl::OUString
& aPropertyName
)
1432 throw(beans::UnknownPropertyException
, lang::WrappedTargetException
,
1433 uno::RuntimeException
)
1439 String
aNameString(aPropertyName
);
1441 // anchor type is always "as character", text wrap always "none"
1443 if ( aNameString
.EqualsAscii( SC_UNONAME_ANCTYPE
) )
1444 aRet
<<= text::TextContentAnchorType_AS_CHARACTER
;
1445 else if ( aNameString
.EqualsAscii( SC_UNONAME_ANCTYPES
) )
1447 uno::Sequence
<text::TextContentAnchorType
> aSeq(1);
1448 aSeq
[0] = text::TextContentAnchorType_AS_CHARACTER
;
1451 else if ( aNameString
.EqualsAscii( SC_UNONAME_TEXTWRAP
) )
1452 aRet
<<= text::WrapTextMode_NONE
;
1453 else if ( nType
== SC_SERVICE_FILEFIELD
&& aNameString
.EqualsAscii( SC_UNONAME_FILEFORM
) )
1455 SvxFileFormat eFormat
= SVXFILEFORMAT_NAME_EXT
;
1458 ScEditEngineDefaulter
* pEditEngine
= ((ScHeaderFooterEditSource
*)pEditSource
)->GetEditEngine();
1459 ScUnoEditEngine
aTempEngine(pEditEngine
);
1460 SvxFieldData
* pField
= aTempEngine
.FindByPos(
1461 aSelection
.nStartPara
, aSelection
.nStartPos
, TYPE(SvxExtFileField
) );
1462 DBG_ASSERT(pField
,"setPropertyValue: Field not found");
1465 const SvxExtFileField
* pExtFile
= (const SvxExtFileField
*)pField
;
1466 eFormat
= pExtFile
->GetFormat();
1470 eFormat
= (SvxFileFormat
) nFileFormat
; // not inserted yet - use stored value
1472 sal_Int16 nIntVal
= lcl_SvxToUnoFileFormat( eFormat
);
1479 SC_IMPL_DUMMY_PROPERTY_LISTENER( ScHeaderFieldObj
)
1483 sal_Int64 SAL_CALL
ScHeaderFieldObj::getSomething(
1484 const uno::Sequence
<sal_Int8
>& rId
) throw(uno::RuntimeException
)
1486 if ( rId
.getLength() == 16 &&
1487 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
1488 rId
.getConstArray(), 16 ) )
1490 return sal::static_int_cast
<sal_Int64
>(reinterpret_cast<sal_IntPtr
>(this));
1496 const uno::Sequence
<sal_Int8
>& ScHeaderFieldObj::getUnoTunnelId()
1498 static uno::Sequence
<sal_Int8
> * pSeq
= 0;
1501 osl::Guard
< osl::Mutex
> aGuard( osl::Mutex::getGlobalMutex() );
1504 static uno::Sequence
< sal_Int8
> aSeq( 16 );
1505 rtl_createUuid( (sal_uInt8
*)aSeq
.getArray(), 0, sal_True
);
1513 ScHeaderFieldObj
* ScHeaderFieldObj::getImplementation(
1514 const uno::Reference
<text::XTextContent
> xObj
)
1516 ScHeaderFieldObj
* pRet
= NULL
;
1517 uno::Reference
<lang::XUnoTunnel
> xUT( xObj
, uno::UNO_QUERY
);
1519 pRet
= reinterpret_cast<ScHeaderFieldObj
*>(sal::static_int_cast
<sal_IntPtr
>(xUT
->getSomething(getUnoTunnelId())));
1525 rtl::OUString SAL_CALL
ScHeaderFieldObj::getImplementationName() throw(uno::RuntimeException
)
1527 return rtl::OUString::createFromAscii( "ScHeaderFieldObj" );
1530 sal_Bool SAL_CALL
ScHeaderFieldObj::supportsService( const rtl::OUString
& rServiceName
)
1531 throw(uno::RuntimeException
)
1533 String
aServiceStr( rServiceName
);
1534 return aServiceStr
.EqualsAscii( SCTEXTFIELD_SERVICE
) ||
1535 aServiceStr
.EqualsAscii( SCTEXTCONTENT_SERVICE
);
1538 uno::Sequence
<rtl::OUString
> SAL_CALL
ScHeaderFieldObj::getSupportedServiceNames()
1539 throw(uno::RuntimeException
)
1541 uno::Sequence
<rtl::OUString
> aRet(2);
1542 rtl::OUString
* pArray
= aRet
.getArray();
1543 pArray
[0] = rtl::OUString::createFromAscii( SCTEXTFIELD_SERVICE
);
1544 pArray
[1] = rtl::OUString::createFromAscii( SCTEXTCONTENT_SERVICE
);
1548 //------------------------------------------------------------------------