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_svx.hxx"
26
27 #include <com/sun/star/drawing/BitmapMode.hpp>
28 #include <com/sun/star/style/XStyle.hpp>
29 #include <com/sun/star/text/WritingMode.hpp>
30 #include <com/sun/star/table/TableBorder.hpp>
31
32 #include <cppuhelper/typeprovider.hxx>
33 #include <svl/style.hxx>
34 #include <svl/itemset.hxx>
35
36 #include <vos/mutex.hxx>
37 #include <vcl/svapp.hxx>
38
39 #include "svx/sdr/properties/textproperties.hxx"
40 #include "editeng/outlobj.hxx"
41 #include "editeng/writingmodeitem.hxx"
42 #include "svx/svdotable.hxx"
43 #include "svx/svdoutl.hxx"
44 #include "svx/unoshtxt.hxx"
45 #include "svx/svdmodel.hxx"
46
47 #include "tableundo.hxx"
48 #include "cell.hxx"
49 #include "svx/svdotable.hxx"
50 #include "svx/svdoutl.hxx"
51 #include "svx/unoshtxt.hxx"
52 #include "svx/unoshprp.hxx"
53 #include "svx/unoshape.hxx"
54 #include "editeng/editobj.hxx"
55 #include "editeng/boxitem.hxx"
56 #include "svx/xflbstit.hxx"
57 #include "svx/xflbmtit.hxx"
58 #include <svx/svdpool.hxx>
59
60 // -----------------------------------------------------------------------------
61
62 using ::rtl::OUString;
63 using ::vos::OGuard;
64 using namespace ::com::sun::star::uno;
65 using namespace ::com::sun::star::beans;
66 using namespace ::com::sun::star::lang;
67 using namespace ::com::sun::star::text;
68 using namespace ::com::sun::star::table;
69 using namespace ::com::sun::star::drawing;
70 using namespace ::com::sun::star::style;
71 using namespace ::com::sun::star::container;
72
73 // -----------------------------------------------------------------------------
74
ImplGetSvxCellPropertySet()75 static const SvxItemPropertySet* ImplGetSvxCellPropertySet()
76 {
77 // Propertymap fuer einen Outliner Text
78 static const SfxItemPropertyMapEntry aSvxCellPropertyMap[] =
79 {
80 FILL_PROPERTIES
81 // { MAP_CHAR_LEN("HasLevels"), OWN_ATTR_HASLEVELS, &::getBooleanCppuType(), ::com::sun::star::beans::PropertyAttribute::READONLY, 0},
82 { MAP_CHAR_LEN("Style"), OWN_ATTR_STYLE, &::com::sun::star::style::XStyle::static_type(), ::com::sun::star::beans::PropertyAttribute::MAYBEVOID, 0},
83 { MAP_CHAR_LEN(UNO_NAME_TEXT_WRITINGMODE), SDRATTR_TEXTDIRECTION, &::getCppuType( (::com::sun::star::text::WritingMode*) 0 ), 0, 0},
84 { MAP_CHAR_LEN(UNO_NAME_TEXT_HORZADJUST), SDRATTR_TEXT_HORZADJUST, &::getCppuType((const ::com::sun::star::drawing::TextHorizontalAdjust*)0), 0, 0}, \
85 { MAP_CHAR_LEN(UNO_NAME_TEXT_LEFTDIST), SDRATTR_TEXT_LEFTDIST, &::getCppuType((const sal_Int32*)0), 0, SFX_METRIC_ITEM}, \
86 { MAP_CHAR_LEN(UNO_NAME_TEXT_LOWERDIST), SDRATTR_TEXT_LOWERDIST, &::getCppuType((const sal_Int32*)0), 0, SFX_METRIC_ITEM}, \
87 { MAP_CHAR_LEN(UNO_NAME_TEXT_RIGHTDIST), SDRATTR_TEXT_RIGHTDIST, &::getCppuType((const sal_Int32*)0), 0, SFX_METRIC_ITEM}, \
88 { MAP_CHAR_LEN(UNO_NAME_TEXT_UPPERDIST), SDRATTR_TEXT_UPPERDIST, &::getCppuType((const sal_Int32*)0), 0, SFX_METRIC_ITEM}, \
89 { MAP_CHAR_LEN(UNO_NAME_TEXT_VERTADJUST), SDRATTR_TEXT_VERTADJUST, &::getCppuType((const ::com::sun::star::drawing::TextVerticalAdjust*)0), 0, 0},\
90 { MAP_CHAR_LEN(UNO_NAME_TEXT_WORDWRAP), SDRATTR_TEXT_WORDWRAP, &::getBooleanCppuType(), 0, 0}, \
91
92 { MAP_CHAR_LEN("TableBorder"), OWN_ATTR_TABLEBORDER, &::getCppuType((const TableBorder*)0), 0, 0 }, \
93 { MAP_CHAR_LEN("TopBorder"), SDRATTR_TABLE_BORDER, &::getCppuType((const BorderLine*)0), 0, TOP_BORDER }, \
94 { MAP_CHAR_LEN("BottomBorder"), SDRATTR_TABLE_BORDER, &::getCppuType((const BorderLine*)0), 0, BOTTOM_BORDER }, \
95 { MAP_CHAR_LEN("LeftBorder"), SDRATTR_TABLE_BORDER, &::getCppuType((const BorderLine*)0), 0, LEFT_BORDER }, \
96 { MAP_CHAR_LEN("RightBorder"), SDRATTR_TABLE_BORDER, &::getCppuType((const BorderLine*)0), 0, RIGHT_BORDER }, \
97
98 SVX_UNOEDIT_OUTLINER_PROPERTIES,
99 SVX_UNOEDIT_CHAR_PROPERTIES,
100 SVX_UNOEDIT_PARA_PROPERTIES,
101 {0,0,0,0,0,0}
102 };
103
104 static SvxItemPropertySet aSvxCellPropertySet( aSvxCellPropertyMap, SdrObject::GetGlobalDrawObjectItemPool() );
105 return &aSvxCellPropertySet;
106 }
107
108 namespace sdr
109 {
110 namespace properties
111 {
112 class CellProperties : public TextProperties
113 {
114 protected:
115 // create a new itemset
116 SfxItemSet& CreateObjectSpecificItemSet(SfxItemPool& rPool);
117
118 public:
119 // basic constructor
120 CellProperties(SdrObject& rObj, sdr::table::Cell* pCell );
121
122 // constructor for copying, but using new object
123 CellProperties(const CellProperties& rProps, SdrObject& rObj, sdr::table::Cell* pCell);
124
125 // destructor
126 ~CellProperties();
127
128 // Clone() operator, normally just calls the local copy constructor
129 BaseProperties& Clone(SdrObject& rObj) const;
130
131 void ForceDefaultAttributes();
132
133 void ItemSetChanged(const SfxItemSet& rSet);
134
135 void ItemChange(const sal_uInt16 nWhich, const SfxPoolItem* pNewItem);
136
137 void SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr);
138
139 sdr::table::CellRef mxCell;
140 };
141
142 // create a new itemset
CreateObjectSpecificItemSet(SfxItemPool & rPool)143 SfxItemSet& CellProperties::CreateObjectSpecificItemSet(SfxItemPool& rPool)
144 {
145 return *(new SfxItemSet(rPool,
146
147 // range from SdrAttrObj
148 SDRATTR_START, SDRATTR_SHADOW_LAST,
149 SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
150 SDRATTR_TEXTDIRECTION, SDRATTR_TEXTDIRECTION,
151
152 // range for SdrTableObj
153 SDRATTR_TABLE_FIRST, SDRATTR_TABLE_LAST,
154
155 // range from SdrTextObj
156 EE_ITEMS_START, EE_ITEMS_END,
157
158 // end
159 0, 0));
160 }
161
CellProperties(SdrObject & rObj,sdr::table::Cell * pCell)162 CellProperties::CellProperties(SdrObject& rObj, sdr::table::Cell* pCell)
163 : TextProperties(rObj)
164 , mxCell(pCell)
165 {
166 }
167
CellProperties(const CellProperties & rProps,SdrObject & rObj,sdr::table::Cell * pCell)168 CellProperties::CellProperties(const CellProperties& rProps, SdrObject& rObj, sdr::table::Cell* pCell)
169 : TextProperties(rProps, rObj)
170 , mxCell( pCell )
171 {
172 }
173
~CellProperties()174 CellProperties::~CellProperties()
175 {
176 }
177
Clone(SdrObject & rObj) const178 BaseProperties& CellProperties::Clone(SdrObject& rObj) const
179 {
180 DBG_ERROR("CellProperties::Clone(), does not work yet!");
181 return *(new CellProperties(*this, rObj,0));
182 }
183
ForceDefaultAttributes()184 void CellProperties::ForceDefaultAttributes()
185 {
186 }
187
ItemSetChanged(const SfxItemSet & rSet)188 void CellProperties::ItemSetChanged(const SfxItemSet& rSet )
189 {
190 SdrTextObj& rObj = (SdrTextObj&)GetSdrObject();
191
192 if( mxCell.is() )
193 {
194 OutlinerParaObject* pParaObj = mxCell->GetEditOutlinerParaObject();
195
196 bool bOwnParaObj = pParaObj != 0;
197
198 if( pParaObj == 0 )
199 pParaObj = mxCell->GetOutlinerParaObject();
200
201 if(pParaObj)
202 {
203 // handle outliner attributes
204 Outliner* pOutliner = 0;
205
206 if(mxCell->IsTextEditActive())
207 {
208 pOutliner = rObj.GetTextEditOutliner();
209 }
210 else
211 {
212 pOutliner = &rObj.ImpGetDrawOutliner();
213 pOutliner->SetText(*pParaObj);
214 }
215
216 sal_uInt32 nParaCount(pOutliner->GetParagraphCount());
217
218 for(sal_uInt32 nPara = 0; nPara < nParaCount; nPara++)
219 {
220 SfxItemSet aSet(pOutliner->GetParaAttribs(nPara));
221 aSet.Put(rSet);
222 pOutliner->SetParaAttribs(nPara, aSet);
223 }
224
225 if(!mxCell->IsTextEditActive())
226 {
227 if(nParaCount)
228 {
229 // force ItemSet
230 GetObjectItemSet();
231
232 SfxItemSet aNewSet(pOutliner->GetParaAttribs(0L));
233 mpItemSet->Put(aNewSet);
234 }
235
236 OutlinerParaObject* pTemp = pOutliner->CreateParaObject(0, (sal_uInt16)nParaCount);
237 pOutliner->Clear();
238
239 mxCell->SetOutlinerParaObject(pTemp);
240 }
241
242 if( bOwnParaObj )
243 delete pParaObj;
244 }
245 }
246
247 // call parent
248 AttributeProperties::ItemSetChanged(rSet);
249
250 if( mxCell.is() )
251 mxCell->notifyModified();
252 }
253
ItemChange(const sal_uInt16 nWhich,const SfxPoolItem * pNewItem)254 void CellProperties::ItemChange(const sal_uInt16 nWhich, const SfxPoolItem* pNewItem)
255 {
256 if(pNewItem && (SDRATTR_TEXTDIRECTION == nWhich))
257 {
258 sal_Bool bVertical(com::sun::star::text::WritingMode_TB_RL == ((SvxWritingModeItem*)pNewItem)->GetValue());
259
260 sdr::table::SdrTableObj& rObj = (sdr::table::SdrTableObj&)GetSdrObject();
261 if( rObj.IsVerticalWriting() != bVertical )
262 rObj.SetVerticalWriting(bVertical);
263
264 // Set a cell vertical property
265 OutlinerParaObject* pParaObj = mxCell->GetEditOutlinerParaObject();
266 if( pParaObj == 0 )
267 pParaObj = mxCell->GetOutlinerParaObject();
268 if(pParaObj)
269 {
270 pParaObj->SetVertical(bVertical);
271 }
272
273 }
274
275 // call parent
276 AttributeProperties::ItemChange( nWhich, pNewItem );
277 }
278
SetStyleSheet(SfxStyleSheet * pNewStyleSheet,sal_Bool bDontRemoveHardAttr)279 void CellProperties::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, sal_Bool bDontRemoveHardAttr)
280 {
281 TextProperties::SetStyleSheet( pNewStyleSheet, bDontRemoveHardAttr );
282 }
283 } // end of namespace properties
284 } // end of namespace sdr
285
286 namespace sdr { namespace table {
287
288 // -----------------------------------------------------------------------------
289 // Cell
290 // -----------------------------------------------------------------------------
291
create(SdrTableObj & rTableObj,OutlinerParaObject * pOutlinerParaObject)292 rtl::Reference< Cell > Cell::create( SdrTableObj& rTableObj, OutlinerParaObject* pOutlinerParaObject )
293 {
294 rtl::Reference< Cell > xCell( new Cell( rTableObj, pOutlinerParaObject ) );
295 if( xCell->mxTable.is() )
296 {
297 Reference< XEventListener > xListener( xCell.get() );
298 xCell->mxTable->addEventListener( xListener );
299 }
300 return xCell;
301 }
302
303 // -----------------------------------------------------------------------------
304
Cell(SdrTableObj & rTableObj,OutlinerParaObject * pOutlinerParaObject)305 Cell::Cell( SdrTableObj& rTableObj, OutlinerParaObject* pOutlinerParaObject ) throw()
306 : SdrText( rTableObj, pOutlinerParaObject )
307 , SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() )
308 , mpPropSet( ImplGetSvxCellPropertySet() )
309 , mpProperties( new sdr::properties::CellProperties( rTableObj, this ) )
310 , mnCellContentType( CellContentType_EMPTY )
311 , mfValue( 0.0 )
312 , mnError( 0 )
313 , mbMerged( sal_False )
314 , mnRowSpan( 1 )
315 , mnColSpan( 1 )
316 , mxTable( rTableObj.getTable() )
317 {
318 if( rTableObj.GetModel() )
319 SetModel( rTableObj.GetModel() );
320 }
321
322 // -----------------------------------------------------------------------------
323
~Cell()324 Cell::~Cell() throw()
325 {
326 dispose();
327 }
328
329 // -----------------------------------------------------------------------------
330
dispose()331 void Cell::dispose()
332 {
333 if( mxTable.is() )
334 {
335 try
336 {
337 Reference< XEventListener > xThis( this );
338 mxTable->removeEventListener( xThis );
339 }
340 catch( Exception& )
341 {
342 DBG_ERROR("Cell::dispose(), exception caught!");
343 }
344 mxTable.clear();
345 }
346
347 if( mpProperties )
348 {
349 delete mpProperties;
350 mpProperties = 0;
351 }
352 SetOutlinerParaObject( 0 );
353 }
354
355 // -----------------------------------------------------------------------------
356
SetModel(SdrModel * pNewModel)357 void Cell::SetModel(SdrModel* pNewModel)
358 {
359 SvxTextEditSource* pTextEditSource = dynamic_cast< SvxTextEditSource* >( GetEditSource() );
360 if( (GetModel() != pNewModel) || ( pNewModel && !pTextEditSource) )
361 {
362 if( mpProperties )
363 {
364 SfxItemPool* pItemPool = mpProperties->GetObjectItemSet().GetPool();
365
366 // test for correct pool in ItemSet; move to new pool if necessary
367 if( pNewModel && pItemPool && pItemPool != &pNewModel->GetItemPool())
368 mpProperties->MoveToItemPool(pItemPool, &pNewModel->GetItemPool(), pNewModel);
369 }
370
371 if( pTextEditSource )
372 {
373 pTextEditSource->ChangeModel( pNewModel );
374 }
375 else
376 {
377 SetEditSource( new SvxTextEditSource( &GetObject(), this, static_cast< XWeak * >( this ) ) );
378 }
379
380 SetStyleSheet( 0, sal_True );
381 SdrText::SetModel( pNewModel );
382 ForceOutlinerParaObject( OUTLINERMODE_TEXTOBJECT );
383 }
384 }
385
386 // -----------------------------------------------------------------------------
387
merge(sal_Int32 nColumnSpan,sal_Int32 nRowSpan)388 void Cell::merge( sal_Int32 nColumnSpan, sal_Int32 nRowSpan )
389 {
390 if( (mnColSpan != nColumnSpan) || (mnRowSpan != nRowSpan) || (mbMerged != sal_False) )
391 {
392 mnColSpan = nColumnSpan;
393 mnRowSpan = nRowSpan;
394 mbMerged = sal_False;
395 notifyModified();
396 }
397 }
398
399 // -----------------------------------------------------------------------------
400
mergeContent(const CellRef & xSourceCell)401 void Cell::mergeContent( const CellRef& xSourceCell )
402 {
403 SdrTableObj& rTableObj = dynamic_cast< SdrTableObj& >( GetObject() );
404
405 if( xSourceCell->hasText() )
406 {
407 SdrOutliner& rOutliner=rTableObj.ImpGetDrawOutliner();
408 rOutliner.SetUpdateMode(sal_True);
409
410 if( hasText() )
411 {
412 rOutliner.SetText(*GetOutlinerParaObject());
413 rOutliner.AddText(*xSourceCell->GetOutlinerParaObject());
414 }
415 else
416 {
417 rOutliner.SetText(*xSourceCell->GetOutlinerParaObject());
418 }
419
420 SetOutlinerParaObject( rOutliner.CreateParaObject() );
421 rOutliner.Clear();
422 xSourceCell->SetOutlinerParaObject(rOutliner.CreateParaObject());
423 rOutliner.Clear();
424 SetStyleSheet( GetStyleSheet(), sal_True );
425 }
426 }
427
428 // -----------------------------------------------------------------------------
429
cloneFrom(const CellRef & xCell)430 void Cell::cloneFrom( const CellRef& xCell )
431 {
432 if( xCell.is() )
433 {
434 replaceContentAndFormatting( xCell );
435
436 mnCellContentType = xCell->mnCellContentType;
437
438 msFormula = xCell->msFormula;
439 mfValue = xCell->mfValue;
440 mnError = xCell->mnError;
441
442 mbMerged = xCell->mbMerged;
443 mnRowSpan = xCell->mnRowSpan;
444 mnColSpan = xCell->mnColSpan;
445
446 }
447 notifyModified();
448 }
449
replaceContentAndFormatting(const CellRef & xSourceCell)450 void Cell::replaceContentAndFormatting( const CellRef& xSourceCell )
451 {
452 if( xSourceCell.is() && mpProperties )
453 {
454 mpProperties->SetMergedItemSet( xSourceCell->GetObjectItemSet() );
455 SetOutlinerParaObject( new OutlinerParaObject(*xSourceCell->GetOutlinerParaObject()) );
456
457 SdrTableObj& rTableObj = dynamic_cast< SdrTableObj& >( GetObject() );
458 SdrTableObj& rSourceTableObj = dynamic_cast< SdrTableObj& >( xSourceCell->GetObject() );
459
460 if(rSourceTableObj.GetModel() != rTableObj.GetModel())
461 {
462 SetStyleSheet( 0, sal_True );
463 }
464 }
465 }
466
467 // -----------------------------------------------------------------------------
468
setMerged()469 void Cell::setMerged()
470 {
471 if( !mbMerged )
472 {
473 mbMerged = sal_True;
474 notifyModified();
475 }
476 }
477
478 // -----------------------------------------------------------------------------
479
notifyModified()480 void Cell::notifyModified()
481 {
482 if( mxTable.is() )
483 mxTable->setModified( sal_True );
484 }
485
486 // -----------------------------------------------------------------------------
487 // SdrTextShape proxy
488 // -----------------------------------------------------------------------------
489
IsTextEditActive()490 bool Cell::IsTextEditActive()
491 {
492 bool isActive = false;
493 SdrTableObj& rTableObj = dynamic_cast< SdrTableObj& >( GetObject() );
494 if(rTableObj.getActiveCell().get() == this )
495 {
496 OutlinerParaObject* pParaObj = rTableObj.GetEditOutlinerParaObject();
497 if( pParaObj != 0 )
498 {
499 isActive = true;
500 delete pParaObj;
501 }
502 }
503 return isActive;
504 }
505
506 // -----------------------------------------------------------------------------
507
hasText() const508 bool Cell::hasText() const
509 {
510 OutlinerParaObject* pParaObj = GetOutlinerParaObject();
511 if( pParaObj )
512 {
513 const EditTextObject& rTextObj = pParaObj->GetTextObject();
514 if( rTextObj.GetParagraphCount() >= 1 )
515 {
516 if( rTextObj.GetParagraphCount() == 1 )
517 {
518 if( rTextObj.GetText(0).Len() == 0 )
519 return false;
520 }
521 return true;
522 }
523 }
524
525 return false;
526 }
527
528 // -----------------------------------------------------------------------------
529
GetEditOutlinerParaObject() const530 OutlinerParaObject* Cell::GetEditOutlinerParaObject() const
531 {
532 SdrTableObj& rTableObj = dynamic_cast< SdrTableObj& >( GetObject() );
533 if( rTableObj.getActiveCell().get() == this )
534 return rTableObj.GetEditOutlinerParaObject();
535 return 0;
536 }
537
538 // -----------------------------------------------------------------------------
539
SetStyleSheet(SfxStyleSheet * pStyleSheet,sal_Bool bDontRemoveHardAttr)540 void Cell::SetStyleSheet( SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr )
541 {
542 // only allow cell styles for cells
543 if( pStyleSheet && pStyleSheet->GetFamily() != SFX_STYLE_FAMILY_FRAME )
544 return;
545
546 if( mpProperties && (mpProperties->GetStyleSheet() != pStyleSheet) )
547 {
548 mpProperties->SetStyleSheet( pStyleSheet, bDontRemoveHardAttr );
549 }
550 }
551
552 // -----------------------------------------------------------------------------
553
GetObjectItemSet()554 const SfxItemSet& Cell::GetObjectItemSet()
555 {
556 if( mpProperties )
557 {
558 return mpProperties->GetObjectItemSet();
559 }
560 else
561 {
562 DBG_ERROR("Cell::GetObjectItemSet(), called without properties!");
563 return GetObject().GetObjectItemSet();
564 }
565 }
566
SetObjectItem(const SfxPoolItem & rItem)567 void Cell::SetObjectItem(const SfxPoolItem& rItem)
568 {
569 if( mpProperties )
570 {
571 mpProperties->SetObjectItem( rItem );
572 notifyModified();
573 }
574 }
575
SetMergedItem(const SfxPoolItem & rItem)576 void Cell::SetMergedItem(const SfxPoolItem& rItem)
577 {
578 SetObjectItem(rItem);
579 }
580
GetStyleSheet() const581 SfxStyleSheet* Cell::GetStyleSheet() const
582 {
583 if( mpProperties )
584 return mpProperties->GetStyleSheet();
585 else
586 return 0;
587 }
588
589 // -----------------------------------------------------------------------------
590
GetStyleSheetPool() const591 SfxStyleSheetPool* Cell::GetStyleSheetPool() const
592 {
593 if( mpProperties && mpProperties->GetStyleSheet() )
594 return dynamic_cast< SfxStyleSheetPool* >( &mpProperties->GetStyleSheet()->GetPool() );
595 else
596 return 0;
597 }
598
599 // -----------------------------------------------------------------------------
600
GetCurrentBoundRect() const601 const Rectangle& Cell::GetCurrentBoundRect() const
602 {
603 return maCellRect;
604 }
605
606 // -----------------------------------------------------------------------------
607
TakeTextAnchorRect(Rectangle & rAnchorRect) const608 void Cell::TakeTextAnchorRect(Rectangle& rAnchorRect) const
609 {
610 rAnchorRect.nLeft = maCellRect.nLeft + GetTextLeftDistance();
611 rAnchorRect.nRight = maCellRect.nRight - GetTextRightDistance();
612 rAnchorRect.nTop = maCellRect.nTop + GetTextUpperDistance();
613 rAnchorRect.nBottom = maCellRect.nBottom - GetTextLowerDistance();
614 }
615
616 // -----------------------------------------------------------------------------
617
GetItemSet() const618 const SfxItemSet& Cell::GetItemSet() const
619 {
620 return mpProperties->GetObjectItemSet();
621 }
622
623 // -----------------------------------------------------------------------------
624
SetMergedItemSetAndBroadcast(const SfxItemSet & rSet,sal_Bool bClearAllItems)625 void Cell::SetMergedItemSetAndBroadcast(const SfxItemSet& rSet, sal_Bool bClearAllItems)
626 {
627 if( mpProperties )
628 {
629 mpProperties->SetMergedItemSetAndBroadcast(rSet, bClearAllItems);
630 notifyModified();
631 }
632 }
633
634 // -----------------------------------------------------------------------------
635
getMinimumWidth()636 sal_Int32 Cell::getMinimumWidth()
637 {
638 return GetTextLeftDistance() + GetTextRightDistance() + 100;
639 }
640
641 // -----------------------------------------------------------------------------
642
getMinimumHeight()643 sal_Int32 Cell::getMinimumHeight()
644 {
645 if( !mpProperties )
646 return 0;
647
648 SdrTableObj& rTableObj = dynamic_cast< SdrTableObj& >( GetObject() );
649 sal_Int32 nMinimumHeight = 0;
650
651 Rectangle aTextRect;
652 TakeTextAnchorRect( aTextRect );
653 Size aSize( aTextRect.GetSize() );
654 aSize.Height()=0x0FFFFFFF;
655
656 SdrOutliner* pEditOutliner = rTableObj.GetCellTextEditOutliner( *this );
657 if(pEditOutliner)
658 {
659 pEditOutliner->SetMaxAutoPaperSize(aSize);
660 nMinimumHeight = pEditOutliner->GetTextHeight()+1;
661 }
662 else /*if ( hasText() )*/
663 {
664 Outliner& rOutliner=rTableObj.ImpGetDrawOutliner();
665 rOutliner.SetPaperSize(aSize);
666 rOutliner.SetUpdateMode(sal_True);
667 ForceOutlinerParaObject( OUTLINERMODE_TEXTOBJECT );
668
669 if( GetOutlinerParaObject() )
670 {
671 rOutliner.SetText(*GetOutlinerParaObject());
672 }
673 nMinimumHeight=rOutliner.GetTextHeight()+1;
674 rOutliner.Clear();
675 }
676
677 nMinimumHeight += GetTextUpperDistance() + GetTextLowerDistance();
678 return nMinimumHeight;
679 }
680
681 // -----------------------------------------------------------------------------
682
GetTextLeftDistance() const683 long Cell::GetTextLeftDistance() const
684 {
685 return ((SdrTextLeftDistItem&)(GetItemSet().Get(SDRATTR_TEXT_LEFTDIST))).GetValue();
686 }
687
688 // -----------------------------------------------------------------------------
689
GetTextRightDistance() const690 long Cell::GetTextRightDistance() const
691 {
692 return ((SdrTextRightDistItem&)(GetItemSet().Get(SDRATTR_TEXT_RIGHTDIST))).GetValue();
693 }
694
695 // -----------------------------------------------------------------------------
696
GetTextUpperDistance() const697 long Cell::GetTextUpperDistance() const
698 {
699 return ((SdrTextUpperDistItem&)(GetItemSet().Get(SDRATTR_TEXT_UPPERDIST))).GetValue();
700 }
701
702 // -----------------------------------------------------------------------------
703
GetTextLowerDistance() const704 long Cell::GetTextLowerDistance() const
705 {
706 return ((SdrTextLowerDistItem&)(GetItemSet().Get(SDRATTR_TEXT_LOWERDIST))).GetValue();
707 }
708
709 // -----------------------------------------------------------------------------
710
GetTextVerticalAdjust() const711 SdrTextVertAdjust Cell::GetTextVerticalAdjust() const
712 {
713 return ((SdrTextVertAdjustItem&)(GetItemSet().Get(SDRATTR_TEXT_VERTADJUST))).GetValue();
714 }
715
716 // -----------------------------------------------------------------------------
717
GetTextHorizontalAdjust() const718 SdrTextHorzAdjust Cell::GetTextHorizontalAdjust() const
719 {
720 return ((SdrTextHorzAdjustItem&)(GetItemSet().Get(SDRATTR_TEXT_HORZADJUST))).GetValue();
721 }
722
723 // -----------------------------------------------------------------------------
724
SetOutlinerParaObject(OutlinerParaObject * pTextObject)725 void Cell::SetOutlinerParaObject( OutlinerParaObject* pTextObject )
726 {
727 SdrText::SetOutlinerParaObject( pTextObject );
728 maSelection.nStartPara = 0xffff;
729
730 if( pTextObject == 0 )
731 ForceOutlinerParaObject( OUTLINERMODE_TEXTOBJECT );
732 }
733
734 // -----------------------------------------------------------------------------
735
AddUndo()736 void Cell::AddUndo()
737 {
738 SdrObject& rObj = GetObject();
739 if( rObj.IsInserted() && GetModel() && GetModel()->IsUndoEnabled() )
740 {
741 CellRef xCell( this );
742 GetModel()->AddUndo( new CellUndo( &rObj, xCell ) );
743 }
744 }
745
746 // -----------------------------------------------------------------------------
747
CloneProperties(sdr::properties::TextProperties * pProperties,SdrObject & rNewObj,Cell & rNewCell)748 sdr::properties::TextProperties* Cell::CloneProperties( sdr::properties::TextProperties* pProperties, SdrObject& rNewObj, Cell& rNewCell )
749 {
750 if( pProperties )
751 return new sdr::properties::CellProperties( *static_cast<sdr::properties::CellProperties*>(pProperties), rNewObj, &rNewCell );
752 else
753 return 0;
754 }
755
756 // -----------------------------------------------------------------------------
757
CloneProperties(SdrObject & rNewObj,Cell & rNewCell)758 sdr::properties::TextProperties* Cell::CloneProperties( SdrObject& rNewObj, Cell& rNewCell )
759 {
760 return CloneProperties(mpProperties,rNewObj,rNewCell);
761 }
762
763 // -----------------------------------------------------------------------------
764 // XInterface
765 // -----------------------------------------------------------------------------
766
queryInterface(const Type & rType)767 Any SAL_CALL Cell::queryInterface( const Type & rType ) throw(RuntimeException)
768 {
769 if( rType == XMergeableCell::static_type() )
770 return Any( Reference< XMergeableCell >( this ) );
771
772 if( rType == XCell::static_type() )
773 return Any( Reference< XCell >( this ) );
774
775 if( rType == XLayoutConstrains::static_type() )
776 return Any( Reference< XLayoutConstrains >( this ) );
777
778 if( rType == XEventListener::static_type() )
779 return Any( Reference< XEventListener >( this ) );
780
781 Any aRet( SvxUnoTextBase::queryAggregation( rType ) );
782 if( aRet.hasValue() )
783 return aRet;
784
785 return ::cppu::OWeakObject::queryInterface( rType );
786 }
787
788 // -----------------------------------------------------------------------------
789
acquire()790 void SAL_CALL Cell::acquire() throw ()
791 {
792 ::cppu::OWeakObject::acquire();
793 }
794
795 // -----------------------------------------------------------------------------
796
release()797 void SAL_CALL Cell::release() throw ()
798 {
799 ::cppu::OWeakObject::release();
800 }
801
802 // -----------------------------------------------------------------------------
803 // XTypeProvider
804 // -----------------------------------------------------------------------------
805
getTypes()806 Sequence< Type > SAL_CALL Cell::getTypes( ) throw (RuntimeException)
807 {
808 Sequence< Type > aTypes( SvxUnoTextBase::getTypes() );
809
810 sal_Int32 nLen = aTypes.getLength();
811 aTypes.realloc(nLen + 2);
812 aTypes[nLen++] = XMergeableCell::static_type();
813 aTypes[nLen++] = XLayoutConstrains::static_type();
814
815 return aTypes;
816 }
817
818 // -----------------------------------------------------------------------------
819
getImplementationId()820 Sequence< sal_Int8 > SAL_CALL Cell::getImplementationId( ) throw (RuntimeException)
821 {
822 static ::cppu::OImplementationId* pId = 0;
823 if (! pId)
824 {
825 ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
826 if (! pId)
827 {
828 static ::cppu::OImplementationId aId;
829 pId = &aId;
830 }
831 }
832 return pId->getImplementationId();
833 }
834
835 // -----------------------------------------------------------------------------
836 // XServiceInfo
837 // -----------------------------------------------------------------------------
838
getImplementationName()839 OUString SAL_CALL Cell::getImplementationName( ) throw (RuntimeException)
840 {
841 return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.table.Cell" ) );
842 }
843
844 // -----------------------------------------------------------------------------
845
supportsService(const OUString & ServiceName)846 sal_Bool SAL_CALL Cell::supportsService( const OUString& ServiceName ) throw (RuntimeException)
847 {
848 if( ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.table.cell" ) ) == 0 )
849 return sal_True;
850
851 if( ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.drawing.cell" ) ) == 0 )
852 return sal_True;
853
854 return SvxUnoTextBase::supportsService( ServiceName );
855 }
856
857 // -----------------------------------------------------------------------------
858
getSupportedServiceNames()859 Sequence< OUString > SAL_CALL Cell::getSupportedServiceNames( ) throw (RuntimeException)
860 {
861 Sequence< OUString > aSeq( SvxUnoTextBase::getSupportedServiceNames() );
862 sal_Int32 nIndex = aSeq.getLength();
863 aSeq.realloc( nIndex + 2 );
864 aSeq[nIndex++] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.table.cell" ) );
865 aSeq[nIndex++] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.cell" ) );
866 return aSeq;
867 }
868
869 // -----------------------------------------------------------------------------
870 // XLayoutConstrains
871 // -----------------------------------------------------------------------------
872
getMinimumSize()873 ::com::sun::star::awt::Size SAL_CALL Cell::getMinimumSize( ) throw (RuntimeException)
874 {
875 return ::com::sun::star::awt::Size( getMinimumWidth(), getMinimumHeight() );
876 }
877
878 // -----------------------------------------------------------------------------
879
getPreferredSize()880 ::com::sun::star::awt::Size SAL_CALL Cell::getPreferredSize( ) throw (RuntimeException)
881 {
882 return getMinimumSize();
883 }
884
885 // -----------------------------------------------------------------------------
886
calcAdjustedSize(const::com::sun::star::awt::Size & aNewSize)887 ::com::sun::star::awt::Size SAL_CALL Cell::calcAdjustedSize( const ::com::sun::star::awt::Size& aNewSize ) throw (RuntimeException)
888 {
889 return aNewSize;
890 }
891
892 // -----------------------------------------------------------------------------
893 // XMergeableCell
894 // -----------------------------------------------------------------------------
895
getRowSpan()896 sal_Int32 SAL_CALL Cell::getRowSpan() throw (RuntimeException)
897 {
898 return mnRowSpan;
899 }
900
901 // -----------------------------------------------------------------------------
902
getColumnSpan()903 sal_Int32 SAL_CALL Cell::getColumnSpan() throw (RuntimeException)
904 {
905 return mnColSpan;
906 }
907
908 // -----------------------------------------------------------------------------
909
isMerged()910 sal_Bool SAL_CALL Cell::isMerged() throw (RuntimeException)
911 {
912 return mbMerged;
913 }
914
915 // -----------------------------------------------------------------------------
916 // XCell
917 // -----------------------------------------------------------------------------
918
getFormula()919 OUString SAL_CALL Cell::getFormula( ) throw (RuntimeException)
920 {
921 return msFormula;
922 }
923
924 // -----------------------------------------------------------------------------
925
setFormula(const OUString & aFormula)926 void SAL_CALL Cell::setFormula( const OUString& aFormula ) throw (RuntimeException)
927 {
928 if( msFormula != aFormula )
929 {
930 msFormula = aFormula;
931 }
932 }
933
934 // -----------------------------------------------------------------------------
935
getValue()936 double SAL_CALL Cell::getValue( ) throw (RuntimeException)
937 {
938 return mfValue;
939 }
940
941 // -----------------------------------------------------------------------------
942
setValue(double nValue)943 void SAL_CALL Cell::setValue( double nValue ) throw (RuntimeException)
944 {
945 if( mfValue == nValue )
946 {
947 mfValue = nValue;
948 mnCellContentType = CellContentType_VALUE;
949 }
950 }
951
952 // -----------------------------------------------------------------------------
953
getType()954 CellContentType SAL_CALL Cell::getType() throw (RuntimeException)
955 {
956 return mnCellContentType;
957 }
958
959 // -----------------------------------------------------------------------------
960
getError()961 sal_Int32 SAL_CALL Cell::getError( ) throw (RuntimeException)
962 {
963 return mnError;
964 }
965
966 // -----------------------------------------------------------------------------
967 // XPropertySet
968 // -----------------------------------------------------------------------------
969
GetAnyForItem(SfxItemSet & aSet,const SfxItemPropertySimpleEntry * pMap)970 Any Cell::GetAnyForItem( SfxItemSet& aSet, const SfxItemPropertySimpleEntry* pMap )
971 {
972 Any aAny( SvxItemPropertySet_getPropertyValue( *mpPropSet, pMap, aSet ) );
973
974 if( *pMap->pType != aAny.getValueType() )
975 {
976 // since the sfx uint16 item now exports a sal_Int32, we may have to fix this here
977 if( ( *pMap->pType == ::getCppuType((const sal_Int16*)0)) && aAny.getValueType() == ::getCppuType((const sal_Int32*)0) )
978 {
979 sal_Int32 nValue = 0;
980 aAny >>= nValue;
981 aAny <<= (sal_Int16)nValue;
982 }
983 else
984 {
985 DBG_ERROR("GetAnyForItem() Returnvalue has wrong Type!" );
986 }
987 }
988
989 return aAny;
990 }
991
getPropertySetInfo()992 Reference< XPropertySetInfo > SAL_CALL Cell::getPropertySetInfo() throw(RuntimeException)
993 {
994 return mpPropSet->getPropertySetInfo();
995 }
996
997 // -----------------------------------------------------------------------------
998
setPropertyValue(const OUString & rPropertyName,const Any & rValue)999 void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& rValue ) throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
1000 {
1001 OGuard aGuard( Application::GetSolarMutex() );
1002
1003 if( (mpProperties == 0) || (GetModel() == 0) )
1004 throw DisposedException();
1005
1006 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(rPropertyName);
1007 if( pMap )
1008 {
1009 if( (pMap->nFlags & PropertyAttribute::READONLY ) != 0 )
1010 throw PropertyVetoException();
1011
1012 switch( pMap->nWID )
1013 {
1014 case OWN_ATTR_STYLE:
1015 {
1016 Reference< XStyle > xStyle;
1017 if( !( rValue >>= xStyle ) )
1018 throw IllegalArgumentException();
1019
1020 SfxUnoStyleSheet* pStyle = SfxUnoStyleSheet::getUnoStyleSheet(xStyle);
1021 SetStyleSheet( pStyle, sal_True );
1022 return;
1023 }
1024 case OWN_ATTR_TABLEBORDER:
1025 {
1026 if(rValue.getValueType() != ::getCppuType((const TableBorder*)0) )
1027 break;
1028
1029 const TableBorder* pBorder = (const TableBorder* )rValue.getValue();
1030 if( pBorder == NULL )
1031 break;
1032
1033 SvxBoxItem aBox( SDRATTR_TABLE_BORDER );
1034 SvxBoxInfoItem aBoxInfo( SDRATTR_TABLE_BORDER_INNER );
1035 SvxBorderLine aLine;
1036
1037 sal_Bool bSet = SvxBoxItem::LineToSvxLine(pBorder->TopLine, aLine, false);
1038 aBox.SetLine(bSet ? &aLine : 0, BOX_LINE_TOP);
1039 aBoxInfo.SetValid(VALID_TOP, pBorder->IsTopLineValid);
1040
1041 bSet = SvxBoxItem::LineToSvxLine(pBorder->BottomLine, aLine, false);
1042 aBox.SetLine(bSet ? &aLine : 0, BOX_LINE_BOTTOM);
1043 aBoxInfo.SetValid(VALID_BOTTOM, pBorder->IsBottomLineValid);
1044
1045 bSet = SvxBoxItem::LineToSvxLine(pBorder->LeftLine, aLine, false);
1046 aBox.SetLine(bSet ? &aLine : 0, BOX_LINE_LEFT);
1047 aBoxInfo.SetValid(VALID_LEFT, pBorder->IsLeftLineValid);
1048
1049 bSet = SvxBoxItem::LineToSvxLine(pBorder->RightLine, aLine, false);
1050 aBox.SetLine(bSet ? &aLine : 0, BOX_LINE_RIGHT);
1051 aBoxInfo.SetValid(VALID_RIGHT, pBorder->IsRightLineValid);
1052
1053 bSet = SvxBoxItem::LineToSvxLine(pBorder->HorizontalLine, aLine, false);
1054 aBoxInfo.SetLine(bSet ? &aLine : 0, BOXINFO_LINE_HORI);
1055 aBoxInfo.SetValid(VALID_HORI, pBorder->IsHorizontalLineValid);
1056
1057 bSet = SvxBoxItem::LineToSvxLine(pBorder->VerticalLine, aLine, false);
1058 aBoxInfo.SetLine(bSet ? &aLine : 0, BOXINFO_LINE_VERT);
1059 aBoxInfo.SetValid(VALID_VERT, pBorder->IsVerticalLineValid);
1060
1061 aBox.SetDistance(pBorder->Distance, false);
1062 aBoxInfo.SetValid(VALID_DISTANCE, pBorder->IsDistanceValid);
1063
1064 mpProperties->SetObjectItem(aBox);
1065 mpProperties->SetObjectItem(aBoxInfo);
1066 return;
1067 }
1068 case OWN_ATTR_FILLBMP_MODE:
1069 {
1070 BitmapMode eMode;
1071 if(!(rValue >>= eMode) )
1072 {
1073 sal_Int32 nMode = 0;
1074 if(!(rValue >>= nMode))
1075 throw IllegalArgumentException();
1076
1077 eMode = (BitmapMode)nMode;
1078 }
1079
1080 mpProperties->SetObjectItem( XFillBmpStretchItem( eMode == BitmapMode_STRETCH ) );
1081 mpProperties->SetObjectItem( XFillBmpTileItem( eMode == BitmapMode_REPEAT ) );
1082 return;
1083 }
1084 default:
1085 {
1086 SfxItemSet aSet( GetModel()->GetItemPool(), pMap->nWID, pMap->nWID);
1087 aSet.Put(mpProperties->GetItem(pMap->nWID));
1088
1089 bool bSpecial = false;
1090
1091 switch( pMap->nWID )
1092 {
1093 case XATTR_FILLBITMAP:
1094 case XATTR_FILLGRADIENT:
1095 case XATTR_FILLHATCH:
1096 case XATTR_FILLFLOATTRANSPARENCE:
1097 case XATTR_LINEEND:
1098 case XATTR_LINESTART:
1099 case XATTR_LINEDASH:
1100 {
1101 if( pMap->nMemberId == MID_NAME )
1102 {
1103 OUString aApiName;
1104 if( rValue >>= aApiName )
1105 {
1106 if( SvxShape::SetFillAttribute( pMap->nWID, aApiName, aSet, GetModel() ) )
1107 bSpecial = true;
1108 }
1109 }
1110 }
1111 break;
1112 }
1113
1114 if( !bSpecial )
1115 {
1116
1117 if( !SvxUnoTextRangeBase::SetPropertyValueHelper( aSet, pMap, rValue, aSet ))
1118 {
1119 if( aSet.GetItemState( pMap->nWID ) != SFX_ITEM_SET )
1120 {
1121 // Default aus ItemPool holen
1122 if(GetModel()->GetItemPool().IsWhich(pMap->nWID))
1123 aSet.Put(GetModel()->GetItemPool().GetDefaultItem(pMap->nWID));
1124 }
1125
1126 if( aSet.GetItemState( pMap->nWID ) == SFX_ITEM_SET )
1127 {
1128 SvxItemPropertySet_setPropertyValue( *mpPropSet, pMap, rValue, aSet );
1129 }
1130 }
1131 }
1132
1133 GetModel()->SetChanged();
1134 mpProperties->SetMergedItemSetAndBroadcast( aSet );
1135 return;
1136 }
1137 }
1138 }
1139 throw UnknownPropertyException();
1140 }
1141
1142 // -----------------------------------------------------------------------------
1143
getPropertyValue(const OUString & PropertyName)1144 Any SAL_CALL Cell::getPropertyValue( const OUString& PropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1145 {
1146 OGuard aGuard( Application::GetSolarMutex() );
1147
1148 if( (mpProperties == 0) || (GetModel() == 0) )
1149 throw DisposedException();
1150
1151 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName);
1152 if( pMap )
1153 {
1154 switch( pMap->nWID )
1155 {
1156 /*
1157 case OWN_ATTR_HASLEVELS:
1158 {
1159 return Any( hasLevels() );
1160 }
1161 */
1162 case OWN_ATTR_STYLE:
1163 {
1164 return Any( Reference< XStyle >( dynamic_cast< SfxUnoStyleSheet* >( GetStyleSheet() ) ) );
1165 }
1166 case OWN_ATTR_TABLEBORDER:
1167 {
1168 const SvxBoxInfoItem& rBoxInfoItem = static_cast<const SvxBoxInfoItem&>(mpProperties->GetItem(SDRATTR_TABLE_BORDER_INNER));
1169 const SvxBoxItem& rBox = static_cast<const SvxBoxItem&>(mpProperties->GetItem(SDRATTR_TABLE_BORDER));
1170
1171 TableBorder aTableBorder;
1172 aTableBorder.TopLine = SvxBoxItem::SvxLineToLine(rBox.GetTop(), false);
1173 aTableBorder.IsTopLineValid = rBoxInfoItem.IsValid(VALID_TOP);
1174 aTableBorder.BottomLine = SvxBoxItem::SvxLineToLine(rBox.GetBottom(), false);
1175 aTableBorder.IsBottomLineValid = rBoxInfoItem.IsValid(VALID_BOTTOM);
1176 aTableBorder.LeftLine = SvxBoxItem::SvxLineToLine(rBox.GetLeft(), false);
1177 aTableBorder.IsLeftLineValid = rBoxInfoItem.IsValid(VALID_LEFT);
1178 aTableBorder.RightLine = SvxBoxItem::SvxLineToLine(rBox.GetRight(), false);
1179 aTableBorder.IsRightLineValid = rBoxInfoItem.IsValid(VALID_RIGHT );
1180 aTableBorder.HorizontalLine = SvxBoxItem::SvxLineToLine(rBoxInfoItem.GetHori(), false);
1181 aTableBorder.IsHorizontalLineValid = rBoxInfoItem.IsValid(VALID_HORI);
1182 aTableBorder.VerticalLine = SvxBoxItem::SvxLineToLine(rBoxInfoItem.GetVert(), false);
1183 aTableBorder.IsVerticalLineValid = rBoxInfoItem.IsValid(VALID_VERT);
1184 aTableBorder.Distance = rBox.GetDistance();
1185 aTableBorder.IsDistanceValid = rBoxInfoItem.IsValid(VALID_DISTANCE);
1186
1187 return Any( aTableBorder );
1188 }
1189 case OWN_ATTR_FILLBMP_MODE:
1190 {
1191 const XFillBmpStretchItem& rStretchItem = static_cast<const XFillBmpStretchItem&>(mpProperties->GetItem(XATTR_FILLBMP_STRETCH));
1192 const XFillBmpTileItem& rTileItem = static_cast<const XFillBmpTileItem&>(mpProperties->GetItem(XATTR_FILLBMP_TILE));
1193 if( rTileItem.GetValue() )
1194 {
1195 return Any( BitmapMode_REPEAT );
1196 }
1197 else if( rStretchItem.GetValue() )
1198 {
1199 return Any( BitmapMode_STRETCH );
1200 }
1201 else
1202 {
1203 return Any( BitmapMode_NO_REPEAT );
1204 }
1205 }
1206 default:
1207 {
1208 SfxItemSet aSet( GetModel()->GetItemPool(), pMap->nWID, pMap->nWID);
1209 aSet.Put(mpProperties->GetItem(pMap->nWID));
1210
1211 Any aAny;
1212 if(!SvxUnoTextRangeBase::GetPropertyValueHelper( aSet, pMap, aAny ))
1213 {
1214 if(!aSet.Count())
1215 {
1216 // Default aus ItemPool holen
1217 if(GetModel()->GetItemPool().IsWhich(pMap->nWID))
1218 aSet.Put(GetModel()->GetItemPool().GetDefaultItem(pMap->nWID));
1219 }
1220
1221 if( aSet.Count() )
1222 aAny = GetAnyForItem( aSet, pMap );
1223 }
1224
1225 return aAny;
1226 }
1227 }
1228 }
1229 throw UnknownPropertyException();
1230 }
1231
1232 // -----------------------------------------------------------------------------
1233
addPropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)1234 void SAL_CALL Cell::addPropertyChangeListener( const OUString& /*aPropertyName*/, const Reference< XPropertyChangeListener >& /*xListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1235 {
1236 }
1237
1238 // -----------------------------------------------------------------------------
1239
removePropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)1240 void SAL_CALL Cell::removePropertyChangeListener( const OUString& /*aPropertyName*/, const Reference< XPropertyChangeListener >& /*aListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1241 {
1242 }
1243
1244 // -----------------------------------------------------------------------------
1245
addVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)1246 void SAL_CALL Cell::addVetoableChangeListener( const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener >& /*aListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1247 {
1248 }
1249
1250 // -----------------------------------------------------------------------------
1251
removeVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)1252 void SAL_CALL Cell::removeVetoableChangeListener( const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener >& /*aListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1253 {
1254 }
1255
1256 // -----------------------------------------------------------------------------
1257 // XMultiPropertySet
1258 // -----------------------------------------------------------------------------
1259
setPropertyValues(const Sequence<OUString> & aPropertyNames,const Sequence<Any> & aValues)1260 void SAL_CALL Cell::setPropertyValues( const Sequence< OUString >& aPropertyNames, const Sequence< Any >& aValues ) throw (PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
1261 {
1262 OGuard aSolarGuard( Application::GetSolarMutex() );
1263
1264 if( (mpProperties == 0) || (GetModel() == 0) )
1265 throw DisposedException();
1266
1267 const sal_Int32 nCount = aPropertyNames.getLength();
1268
1269 const OUString* pNames = aPropertyNames.getConstArray();
1270 const Any* pValues = aValues.getConstArray();
1271
1272 for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pNames++, pValues++ )
1273 {
1274 try
1275 {
1276 setPropertyValue( *pNames, *pValues );
1277 }
1278 catch( UnknownPropertyException& )
1279 {
1280 DBG_ERROR("svx::Cell::setPropertyValues(), unknown property!" );
1281 }
1282 catch( Exception& )
1283 {
1284 DBG_ERROR("svx::Cell::setPropertyValues(), Exception caught!" );
1285 }
1286 }
1287 }
1288
1289 // -----------------------------------------------------------------------------
1290
getPropertyValues(const Sequence<OUString> & aPropertyNames)1291 Sequence< Any > SAL_CALL Cell::getPropertyValues( const Sequence< OUString >& aPropertyNames ) throw (RuntimeException)
1292 {
1293 OGuard aSolarGuard( Application::GetSolarMutex() );
1294
1295 if( (mpProperties == 0) || (GetModel() == 0) )
1296 throw DisposedException();
1297
1298 const sal_Int32 nCount = aPropertyNames.getLength();
1299 const OUString* pNames = aPropertyNames.getConstArray();
1300
1301 Sequence< Any > aRet( nCount );
1302 Any* pValue = aRet.getArray();
1303
1304 for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pValue++, pNames++ )
1305 {
1306 try
1307 {
1308 *pValue = getPropertyValue( *pNames );
1309 }
1310 catch( UnknownPropertyException& )
1311 {
1312 DBG_ERROR("svx::Cell::setPropertyValues(), unknown property!" );
1313 }
1314 catch( Exception& )
1315 {
1316 DBG_ERROR( "svx::Cell::getPropertyValues(), Exception caught!" );
1317 }
1318 }
1319
1320 return aRet;
1321 }
1322
1323 // -----------------------------------------------------------------------------
1324
addPropertiesChangeListener(const Sequence<OUString> &,const Reference<XPropertiesChangeListener> &)1325 void SAL_CALL Cell::addPropertiesChangeListener( const Sequence< OUString >& /*aPropertyNames*/, const Reference< XPropertiesChangeListener >& /*xListener*/ ) throw (RuntimeException)
1326 {
1327 }
1328
1329 // -----------------------------------------------------------------------------
1330
removePropertiesChangeListener(const Reference<XPropertiesChangeListener> &)1331 void SAL_CALL Cell::removePropertiesChangeListener( const Reference< XPropertiesChangeListener >& /*xListener*/ ) throw (RuntimeException)
1332 {
1333 }
1334
1335 // -----------------------------------------------------------------------------
1336
firePropertiesChangeEvent(const Sequence<OUString> &,const Reference<XPropertiesChangeListener> &)1337 void SAL_CALL Cell::firePropertiesChangeEvent( const Sequence< OUString >& /*aPropertyNames*/, const Reference< XPropertiesChangeListener >& /*xListener*/ ) throw (RuntimeException)
1338 {
1339 }
1340
1341 // -----------------------------------------------------------------------------
1342 // XPropertyState
1343 // -----------------------------------------------------------------------------
1344
getPropertyState(const OUString & PropertyName)1345 PropertyState SAL_CALL Cell::getPropertyState( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException)
1346 {
1347 OGuard aGuard( Application::GetSolarMutex() );
1348
1349 if( (mpProperties == 0) || (GetModel() == 0) )
1350 throw DisposedException();
1351
1352 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName);
1353
1354 if( pMap )
1355 {
1356 PropertyState eState;
1357 switch( pMap->nWID )
1358 {
1359 case OWN_ATTR_FILLBMP_MODE:
1360 {
1361 const SfxItemSet& rSet = mpProperties->GetMergedItemSet();
1362
1363 const bool bStretch = rSet.GetItemState( XATTR_FILLBMP_STRETCH, false ) == SFX_ITEM_SET;
1364 const bool bTile = rSet.GetItemState( XATTR_FILLBMP_TILE, false ) == SFX_ITEM_SET;
1365 if( bStretch || bTile )
1366 {
1367 eState = PropertyState_DIRECT_VALUE;
1368 }
1369 else
1370 {
1371 eState = PropertyState_DEFAULT_VALUE;
1372 }
1373 }
1374 /*
1375 case OWN_ATTR_HASLEVELS:
1376 {
1377 return PropertyState_DIRECT_VALUE;
1378 }
1379 */
1380 case OWN_ATTR_STYLE:
1381 {
1382 return PropertyState_DIRECT_VALUE;
1383 }
1384 case OWN_ATTR_TABLEBORDER:
1385 {
1386 const SfxItemSet& rSet = mpProperties->GetMergedItemSet();
1387 if( (rSet.GetItemState( SDRATTR_TABLE_BORDER_INNER, sal_False ) == SFX_ITEM_DEFAULT) && (rSet.GetItemState( SDRATTR_TABLE_BORDER, sal_False ) == SFX_ITEM_DEFAULT) )
1388 return PropertyState_DEFAULT_VALUE;
1389
1390 return PropertyState_DIRECT_VALUE;
1391 }
1392 default:
1393 {
1394 const SfxItemSet& rSet = mpProperties->GetMergedItemSet();
1395
1396 switch( rSet.GetItemState( pMap->nWID, sal_False ) )
1397 {
1398 case SFX_ITEM_READONLY:
1399 case SFX_ITEM_SET:
1400 eState = PropertyState_DIRECT_VALUE;
1401 break;
1402 case SFX_ITEM_DEFAULT:
1403 eState = PropertyState_DEFAULT_VALUE;
1404 break;
1405 // case SFX_ITEM_UNKNOWN:
1406 // case SFX_ITEM_DONTCARE:
1407 // case SFX_ITEM_DISABLED:
1408 default:
1409 eState = PropertyState_AMBIGUOUS_VALUE;
1410 break;
1411 }
1412
1413 // if a item is set, this doesn't mean we want it :)
1414 if( ( PropertyState_DIRECT_VALUE == eState ) )
1415 {
1416 switch( pMap->nWID )
1417 {
1418 // the following items are disabled by changing the
1419 // fill style or the line style. so there is no need
1420 // to export items without names which should be empty
1421 case XATTR_FILLBITMAP:
1422 case XATTR_FILLGRADIENT:
1423 case XATTR_FILLHATCH:
1424 case XATTR_LINEDASH:
1425 {
1426 NameOrIndex* pItem = (NameOrIndex*)rSet.GetItem((sal_uInt16)pMap->nWID);
1427 if( ( pItem == NULL ) || ( pItem->GetName().Len() == 0) )
1428 eState = PropertyState_DEFAULT_VALUE;
1429 }
1430 break;
1431
1432 // #i36115#
1433 // If e.g. the LineStart is on NONE and thus the string has length 0, it still
1434 // may be a hard attribute covering the set LineStart of the parent (Style).
1435 // #i37644#
1436 // same is for fill float transparency
1437 case XATTR_LINEEND:
1438 case XATTR_LINESTART:
1439 case XATTR_FILLFLOATTRANSPARENCE:
1440 {
1441 NameOrIndex* pItem = (NameOrIndex*)rSet.GetItem((sal_uInt16)pMap->nWID);
1442 if( pItem == NULL )
1443 eState = PropertyState_DEFAULT_VALUE;
1444 }
1445 break;
1446 }
1447 }
1448 }
1449 }
1450 return eState;
1451 }
1452 throw UnknownPropertyException();
1453 }
1454
1455 // -----------------------------------------------------------------------------
1456
getPropertyStates(const Sequence<OUString> & aPropertyName)1457 Sequence< PropertyState > SAL_CALL Cell::getPropertyStates( const Sequence< OUString >& aPropertyName ) throw(UnknownPropertyException, RuntimeException)
1458 {
1459 OGuard aGuard( Application::GetSolarMutex() );
1460
1461 if( (mpProperties == 0) || (GetModel() == 0) )
1462 throw DisposedException();
1463
1464 const sal_Int32 nCount = aPropertyName.getLength();
1465
1466 Sequence< PropertyState > aRet( nCount );
1467
1468 const OUString* pNames = aPropertyName.getConstArray();
1469 PropertyState* pState = aRet.getArray();
1470
1471 for( sal_Int32 nIdx = 0; nIdx < nCount; nIdx++, pNames++, pState++ )
1472 {
1473 try
1474 {
1475 *pState = getPropertyState( *pNames );
1476 }
1477 catch( Exception& )
1478 {
1479 *pState = PropertyState_AMBIGUOUS_VALUE;
1480 }
1481 }
1482
1483 return aRet;
1484 }
1485
1486 // -----------------------------------------------------------------------------
1487
setPropertyToDefault(const OUString & PropertyName)1488 void SAL_CALL Cell::setPropertyToDefault( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException)
1489 {
1490 OGuard aGuard( Application::GetSolarMutex() );
1491
1492 if( (mpProperties == 0) || (GetModel() == 0) )
1493 throw DisposedException();
1494
1495 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName);
1496 if( pMap )
1497 {
1498 switch( pMap->nWID )
1499 {
1500 case OWN_ATTR_FILLBMP_MODE:
1501 {
1502 mpProperties->ClearObjectItem( XATTR_FILLBMP_STRETCH );
1503 mpProperties->ClearObjectItem( XATTR_FILLBMP_TILE );
1504 break;
1505 }
1506 // case OWN_ATTR_HASLEVELS:
1507 case OWN_ATTR_STYLE:
1508 break;
1509
1510 case OWN_ATTR_TABLEBORDER:
1511 {
1512 mpProperties->ClearObjectItem( SDRATTR_TABLE_BORDER_INNER );
1513 mpProperties->ClearObjectItem( SDRATTR_TABLE_BORDER );
1514 break;
1515 }
1516
1517 default:
1518 {
1519 mpProperties->ClearObjectItem( pMap->nWID );
1520 }
1521 }
1522
1523 GetModel()->SetChanged();
1524 return;
1525 }
1526 throw UnknownPropertyException();
1527 }
1528
1529 // -----------------------------------------------------------------------------
1530
getPropertyDefault(const OUString & aPropertyName)1531 Any SAL_CALL Cell::getPropertyDefault( const OUString& aPropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException)
1532 {
1533 OGuard aGuard( Application::GetSolarMutex() );
1534
1535 if( (mpProperties == 0) || (GetModel() == 0) )
1536 throw DisposedException();
1537
1538 const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(aPropertyName);
1539 if( pMap )
1540 {
1541 switch( pMap->nWID )
1542 {
1543 case OWN_ATTR_FILLBMP_MODE:
1544 return Any( BitmapMode_NO_REPEAT );
1545
1546 /*
1547 case OWN_ATTR_HASLEVELS:
1548 return Any( sal_False );
1549 */
1550 case OWN_ATTR_STYLE:
1551 {
1552 Reference< XStyle > xStyle;
1553 return Any( xStyle );
1554 }
1555
1556 case OWN_ATTR_TABLEBORDER:
1557 {
1558 TableBorder aBorder;
1559 return Any( aBorder );
1560 }
1561
1562 default:
1563 {
1564 if( GetModel()->GetItemPool().IsWhich(pMap->nWID) )
1565 {
1566 SfxItemSet aSet( GetModel()->GetItemPool(), pMap->nWID, pMap->nWID);
1567 aSet.Put(GetModel()->GetItemPool().GetDefaultItem(pMap->nWID));
1568 return GetAnyForItem( aSet, pMap );
1569 }
1570 }
1571 }
1572 }
1573 throw UnknownPropertyException();
1574 }
1575
1576 // -----------------------------------------------------------------------------
1577 // XMultiPropertyStates
1578 // -----------------------------------------------------------------------------
1579
setAllPropertiesToDefault()1580 void SAL_CALL Cell::setAllPropertiesToDefault( ) throw (RuntimeException)
1581 {
1582 if( mpProperties )
1583 delete mpProperties;
1584 mpProperties = new sdr::properties::CellProperties( static_cast< SdrTableObj& >( GetObject() ), this );
1585
1586 SdrOutliner& rOutliner = GetObject().ImpGetDrawOutliner();
1587
1588 OutlinerParaObject* pParaObj = GetOutlinerParaObject();
1589 if( pParaObj )
1590 {
1591 rOutliner.SetText(*pParaObj);
1592 sal_uInt32 nParaCount(rOutliner.GetParagraphCount());
1593
1594 if(nParaCount)
1595 {
1596 ESelection aSelection( 0, 0, EE_PARA_ALL, EE_PARA_ALL);
1597 rOutliner.RemoveAttribs(aSelection, sal_True, 0);
1598
1599 OutlinerParaObject* pTemp = rOutliner.CreateParaObject(0, nParaCount);
1600 rOutliner.Clear();
1601
1602 SetOutlinerParaObject(pTemp);
1603 }
1604 }
1605 }
1606
1607 // -----------------------------------------------------------------------------
1608
setPropertiesToDefault(const Sequence<OUString> & aPropertyNames)1609 void SAL_CALL Cell::setPropertiesToDefault( const Sequence< OUString >& aPropertyNames ) throw (UnknownPropertyException, RuntimeException)
1610 {
1611 sal_Int32 nCount = aPropertyNames.getLength();
1612 const OUString* pName = aPropertyNames.getConstArray();
1613
1614 while(nCount--)
1615 setPropertyToDefault( *pName++ );
1616 }
1617
1618 // -----------------------------------------------------------------------------
1619
getPropertyDefaults(const Sequence<OUString> & aPropertyNames)1620 Sequence< Any > SAL_CALL Cell::getPropertyDefaults( const Sequence< OUString >& aPropertyNames ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException)
1621 {
1622 sal_Int32 nCount = aPropertyNames.getLength();
1623 Sequence< Any > aDefaults( nCount );
1624 Any* pDefaults = aDefaults.getArray();
1625 const OUString* pName = aPropertyNames.getConstArray();
1626
1627 while(nCount--)
1628 *pDefaults++ = getPropertyDefault( *pName++ );
1629
1630 return aDefaults;
1631 }
1632
1633 // -----------------------------------------------------------------------------
1634 // XFastPropertySet
1635 // -----------------------------------------------------------------------------
1636
setFastPropertyValue(sal_Int32 nHandle,const Any & aValue)1637 void SAL_CALL Cell::setFastPropertyValue( sal_Int32 nHandle, const Any& aValue ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
1638 {
1639 (void)aValue;
1640 (void)nHandle;
1641 throw UnknownPropertyException();
1642 }
1643
1644 // -----------------------------------------------------------------------------
1645 // TODO: Refactor this method!
getFastPropertyValue(sal_Int32 nHandle)1646 Any SAL_CALL Cell::getFastPropertyValue( sal_Int32 nHandle ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException)
1647 {
1648 (void)nHandle;
1649 throw UnknownPropertyException();
1650 }
1651
1652 // -----------------------------------------------------------------------------
1653 // XText
1654 // -----------------------------------------------------------------------------
1655
insertTextContent(const Reference<XTextRange> & xRange,const Reference<XTextContent> & xContent,sal_Bool bAbsorb)1656 void SAL_CALL Cell::insertTextContent( const Reference< XTextRange >& xRange, const Reference< XTextContent >& xContent, sal_Bool bAbsorb ) throw (IllegalArgumentException, RuntimeException)
1657 {
1658 SvxUnoTextBase::insertTextContent( xRange, xContent, bAbsorb );
1659 notifyModified();
1660 }
1661
1662 // -----------------------------------------------------------------------------
1663
removeTextContent(const Reference<XTextContent> & xContent)1664 void SAL_CALL Cell::removeTextContent( const Reference< XTextContent >& xContent ) throw (NoSuchElementException, RuntimeException)
1665 {
1666 SvxUnoTextBase::removeTextContent( xContent );
1667 notifyModified();
1668 }
1669
1670 // -----------------------------------------------------------------------------
1671 // XSimpleText
1672 // -----------------------------------------------------------------------------
1673
createTextCursor()1674 Reference< XTextCursor > SAL_CALL Cell::createTextCursor( ) throw (RuntimeException)
1675 {
1676 return SvxUnoTextBase::createTextCursor();
1677 }
1678
1679 // -----------------------------------------------------------------------------
1680
createTextCursorByRange(const Reference<XTextRange> & aTextPosition)1681 Reference< XTextCursor > SAL_CALL Cell::createTextCursorByRange( const Reference< XTextRange >& aTextPosition ) throw (RuntimeException)
1682 {
1683 return SvxUnoTextBase::createTextCursorByRange( aTextPosition );
1684 }
1685
1686 // -----------------------------------------------------------------------------
1687
insertString(const Reference<XTextRange> & xRange,const OUString & aString,sal_Bool bAbsorb)1688 void SAL_CALL Cell::insertString( const Reference< XTextRange >& xRange, const OUString& aString, sal_Bool bAbsorb ) throw (RuntimeException)
1689 {
1690 SvxUnoTextBase::insertString( xRange, aString, bAbsorb );
1691 notifyModified();
1692 }
1693
1694 // -----------------------------------------------------------------------------
1695
insertControlCharacter(const Reference<XTextRange> & xRange,sal_Int16 nControlCharacter,sal_Bool bAbsorb)1696 void SAL_CALL Cell::insertControlCharacter( const Reference< XTextRange >& xRange, sal_Int16 nControlCharacter, sal_Bool bAbsorb ) throw (IllegalArgumentException, RuntimeException)
1697 {
1698 SvxUnoTextBase::insertControlCharacter( xRange, nControlCharacter, bAbsorb );
1699 notifyModified();
1700 }
1701
1702 // -----------------------------------------------------------------------------
1703 // XTextRange
1704 // -----------------------------------------------------------------------------
1705
getText()1706 Reference< XText > SAL_CALL Cell::getText( ) throw (RuntimeException)
1707 {
1708 return SvxUnoTextBase::getText();
1709 }
1710
1711 // -----------------------------------------------------------------------------
1712
getStart()1713 Reference< XTextRange > SAL_CALL Cell::getStart( ) throw (RuntimeException)
1714 {
1715 return SvxUnoTextBase::getStart();
1716 }
1717
1718 // -----------------------------------------------------------------------------
1719
getEnd()1720 Reference< XTextRange > SAL_CALL Cell::getEnd( ) throw (RuntimeException)
1721 {
1722 return SvxUnoTextBase::getEnd();
1723 }
1724
1725 // -----------------------------------------------------------------------------
1726
getString()1727 OUString SAL_CALL Cell::getString( ) throw (RuntimeException)
1728 {
1729 maSelection.nStartPara = 0xffff;
1730 return SvxUnoTextBase::getString();
1731 }
1732
1733 // -----------------------------------------------------------------------------
1734
setString(const OUString & aString)1735 void SAL_CALL Cell::setString( const OUString& aString ) throw (RuntimeException)
1736 {
1737 SvxUnoTextBase::setString( aString );
1738 notifyModified();
1739 }
1740
1741 // XEventListener
disposing(const EventObject &)1742 void SAL_CALL Cell::disposing( const EventObject& /*Source*/ ) throw (RuntimeException)
1743 {
1744 mxTable.clear();
1745 dispose();
1746 }
1747
getCellName(sal_Int32 nCol,sal_Int32 nRow)1748 static OUString getCellName( sal_Int32 nCol, sal_Int32 nRow )
1749 {
1750 rtl::OUStringBuffer aBuf;
1751
1752 if (nCol < 26*26)
1753 {
1754 if (nCol < 26)
1755 aBuf.append( static_cast<sal_Unicode>( 'A' +
1756 static_cast<sal_uInt16>(nCol)));
1757 else
1758 {
1759 aBuf.append( static_cast<sal_Unicode>( 'A' +
1760 (static_cast<sal_uInt16>(nCol) / 26) - 1));
1761 aBuf.append( static_cast<sal_Unicode>( 'A' +
1762 (static_cast<sal_uInt16>(nCol) % 26)));
1763 }
1764 }
1765 else
1766 {
1767 String aStr;
1768 while (nCol >= 26)
1769 {
1770 sal_Int32 nC = nCol % 26;
1771 aStr += static_cast<sal_Unicode>( 'A' +
1772 static_cast<sal_uInt16>(nC));
1773 nCol = nCol - nC;
1774 nCol = nCol / 26 - 1;
1775 }
1776 aStr += static_cast<sal_Unicode>( 'A' +
1777 static_cast<sal_uInt16>(nCol));
1778 aStr.Reverse();
1779 aBuf.append( aStr);
1780 }
1781 aBuf.append( OUString::valueOf(nRow+1) );
1782 return aBuf.makeStringAndClear();
1783 }
1784
getName()1785 OUString Cell::getName()
1786 {
1787 // todo: optimize!
1788 OUString sName;
1789 if( mxTable.is() ) try
1790 {
1791 Reference< XCell > xThis( static_cast< XCell* >( this ) );
1792
1793 sal_Int32 nRowCount = mxTable->getRowCount();
1794 sal_Int32 nColCount = mxTable->getColumnCount();
1795 for( sal_Int32 nRow = 0; nRow < nRowCount; nRow++ )
1796 {
1797 for( sal_Int32 nCol = 0; nCol < nColCount; nCol++ )
1798 {
1799 Reference< XCell > xCell( mxTable->getCellByPosition( nCol, nRow ) );
1800 if( xCell == xThis )
1801 {
1802 return getCellName( nCol, nRow );
1803 }
1804 }
1805 }
1806 }
1807 catch( Exception& )
1808 {
1809 }
1810
1811 return sName;
1812 }
1813
1814 } }
1815
1816