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