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_uInt32 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_uInt32 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_uInt32 nPar, xub_StrLen nPos, TypeId aType);
143
GetFieldPar() const144 sal_uInt32 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_uInt32 nPara,sal_uInt16 nPos,Color * & rTxtColor,Color * & rFldColor)168 String ScUnoEditEngine::CalcFieldValue( const SvxFieldItem& rField,
169 sal_uInt32 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_uInt32 nPar,xub_StrLen nPos,TypeId aType)223 SvxFieldData* ScUnoEditEngine::FindByPos(sal_uInt32 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_uInt32 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_uInt32 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