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