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 <com/sun/star/style/XStyleFamiliesSupplier.hpp>
21 : #include <com/sun/star/container/XNamed.hpp>
22 : #include <com/sun/star/container/XNameAccess.hpp>
23 : #include <com/sun/star/container/XIndexAccess.hpp>
24 :
25 : #include <vcl/canvastools.hxx>
26 : #include <com/sun/star/style/XStyle.hpp>
27 : #include <com/sun/star/beans/XPropertySet.hpp>
28 : #include <basegfx/polygon/b2dpolygontools.hxx>
29 : #include <basegfx/polygon/b2dpolypolygon.hxx>
30 : #include <basegfx/polygon/b2dpolygon.hxx>
31 : #include <svl/style.hxx>
32 : #include "editeng/editstat.hxx"
33 : #include "editeng/outlobj.hxx"
34 : #include "svx/svdview.hxx"
35 : #include "svx/sdr/properties/textproperties.hxx"
36 : #include "svx/svdotable.hxx"
37 : #include "svx/svdhdl.hxx"
38 : #include "viewcontactoftableobj.hxx"
39 : #include "svx/svdoutl.hxx"
40 : #include "svx/svddrag.hxx"
41 : #include "svx/svdpagv.hxx"
42 : #include "tablemodel.hxx"
43 : #include "cell.hxx"
44 : #include "svx/xflclit.hxx"
45 : #include "tablelayouter.hxx"
46 : #include "svx/svdetc.hxx"
47 : #include "tablehandles.hxx"
48 : #include "editeng/boxitem.hxx"
49 : #include "svx/framelink.hxx"
50 : #include "svx/sdr/table/tabledesign.hxx"
51 : #include "svx/svdundo.hxx"
52 : #include "svx/svdstr.hrc"
53 : #include "svx/svdglob.hxx"
54 : #include "editeng/writingmodeitem.hxx"
55 : #include "editeng/frmdiritem.hxx"
56 : #include "svx/xflhtit.hxx"
57 : #include "svx/xflftrit.hxx"
58 : #include "svx/xfltrit.hxx"
59 :
60 :
61 :
62 : using ::com::sun::star::uno::Any;
63 : using ::com::sun::star::uno::Reference;
64 : using ::com::sun::star::uno::XInterface;
65 : using ::com::sun::star::uno::UNO_QUERY;
66 : using ::com::sun::star::uno::UNO_QUERY_THROW;
67 : using ::com::sun::star::uno::Exception;
68 : using ::com::sun::star::container::XIndexAccess;
69 : using ::com::sun::star::style::XStyle;
70 : using ::com::sun::star::table::XTableRows;
71 : using ::com::sun::star::table::XTableColumns;
72 : using ::com::sun::star::table::XTable;
73 : using ::com::sun::star::beans::XPropertySet;
74 : using ::com::sun::star::util::XModifyBroadcaster;
75 : using sdr::properties::TextProperties;
76 : using sdr::properties::BaseProperties;
77 : using namespace ::com::sun::star::text;
78 : using namespace ::com::sun::star::container;
79 : using namespace ::com::sun::star::style;
80 :
81 : namespace sdr { namespace table {
82 :
83 : class TableProperties : public TextProperties
84 : {
85 : protected:
86 : // create a new itemset
87 : SfxItemSet& CreateObjectSpecificItemSet(SfxItemPool& rPool) SAL_OVERRIDE;
88 :
89 : public:
90 : // basic constructor
91 : TableProperties(SdrObject& rObj );
92 :
93 : // constructor for copying, but using new object
94 : TableProperties(const TableProperties& rProps, SdrObject& rObj );
95 :
96 : // destructor
97 : virtual ~TableProperties();
98 :
99 : // Clone() operator, normally just calls the local copy constructor
100 : BaseProperties& Clone(SdrObject& rObj) const SAL_OVERRIDE;
101 :
102 : virtual void ItemChange(const sal_uInt16 nWhich, const SfxPoolItem* pNewItem) SAL_OVERRIDE;
103 : };
104 :
105 0 : TableProperties::TableProperties(SdrObject& rObj)
106 0 : : TextProperties(rObj)
107 : {
108 0 : }
109 :
110 0 : TableProperties::TableProperties(const TableProperties& rProps, SdrObject& rObj)
111 0 : : TextProperties(rProps, rObj)
112 : {
113 0 : }
114 :
115 0 : TableProperties::~TableProperties()
116 : {
117 0 : }
118 :
119 0 : BaseProperties& TableProperties::Clone(SdrObject& rObj) const
120 : {
121 0 : return *(new TableProperties(*this, rObj));
122 : }
123 :
124 0 : void TableProperties::ItemChange(const sal_uInt16 nWhich, const SfxPoolItem* pNewItem)
125 : {
126 0 : if( nWhich == SDRATTR_TEXTDIRECTION )
127 0 : AttributeProperties::ItemChange( nWhich, pNewItem );
128 : else
129 0 : TextProperties::ItemChange( nWhich, pNewItem );
130 0 : }
131 :
132 : // create a new itemset
133 0 : SfxItemSet& TableProperties::CreateObjectSpecificItemSet(SfxItemPool& rPool)
134 : {
135 : return *(new SfxItemSet(rPool,
136 :
137 : // range from SdrAttrObj
138 : SDRATTR_START, SDRATTR_SHADOW_LAST,
139 : SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
140 : SDRATTR_TEXTDIRECTION, SDRATTR_TEXTDIRECTION,
141 :
142 : // range for SdrTableObj
143 : SDRATTR_TABLE_FIRST, SDRATTR_TABLE_LAST,
144 :
145 : // range from SdrTextObj
146 : EE_ITEMS_START, EE_ITEMS_END,
147 :
148 : // end
149 0 : 0, 0));
150 : }
151 :
152 0 : class TableObjectGeoData : public SdrTextObjGeoData
153 : {
154 : public:
155 : Rectangle maLogicRect;
156 : };
157 :
158 :
159 : // TableStyleSettings
160 :
161 :
162 0 : TableStyleSettings::TableStyleSettings()
163 : : mbUseFirstRow(true)
164 : , mbUseLastRow(false)
165 : , mbUseFirstColumn(false)
166 : , mbUseLastColumn(false)
167 : , mbUseRowBanding(true)
168 0 : , mbUseColumnBanding(false)
169 : {
170 0 : }
171 :
172 0 : TableStyleSettings::TableStyleSettings( const TableStyleSettings& rStyle )
173 : {
174 0 : (*this) = rStyle;
175 0 : }
176 :
177 0 : TableStyleSettings& TableStyleSettings::operator=(const TableStyleSettings& rStyle)
178 : {
179 0 : mbUseFirstRow = rStyle.mbUseFirstRow;
180 0 : mbUseLastRow = rStyle.mbUseLastRow;
181 0 : mbUseFirstColumn = rStyle.mbUseFirstColumn;
182 0 : mbUseLastColumn = rStyle.mbUseLastColumn;
183 0 : mbUseRowBanding = rStyle.mbUseRowBanding;
184 0 : mbUseColumnBanding = rStyle.mbUseColumnBanding;
185 0 : return *this;
186 : }
187 :
188 0 : bool TableStyleSettings::operator==( const TableStyleSettings& rStyle ) const
189 : {
190 : return
191 0 : (mbUseFirstRow == rStyle.mbUseFirstRow) &&
192 0 : (mbUseLastRow == rStyle.mbUseLastRow) &&
193 0 : (mbUseFirstColumn == rStyle.mbUseFirstColumn) &&
194 0 : (mbUseLastColumn == rStyle.mbUseLastColumn) &&
195 0 : (mbUseRowBanding == rStyle.mbUseRowBanding) &&
196 0 : (mbUseColumnBanding == rStyle.mbUseColumnBanding);
197 : }
198 :
199 :
200 :
201 : class SdrTableObjImpl : public TableDesignUser, public ::cppu::WeakImplHelper1< ::com::sun::star::util::XModifyListener >
202 : {
203 : public:
204 : CellRef mxActiveCell;
205 : TableModelRef mxTable;
206 : SdrTableObj* mpTableObj;
207 : TableLayouter* mpLayouter;
208 : CellPos maEditPos;
209 : TableStyleSettings maTableStyle;
210 : Reference< XIndexAccess > mxTableStyle;
211 : bool mbModifyPending;
212 :
213 : void SetModel(SdrModel* pOldModel, SdrModel* pNewModel);
214 :
215 : CellRef getCell( const CellPos& rPos ) const;
216 : void LayoutTable( Rectangle& rArea, bool bFitWidth, bool bFitHeight );
217 :
218 : bool ApplyCellStyles();
219 : void UpdateCells( Rectangle& rArea );
220 :
221 : SdrTableObjImpl();
222 : virtual ~SdrTableObjImpl();
223 :
224 : void init( SdrTableObj* pTable, sal_Int32 nColumns, sal_Int32 nRows );
225 : void dispose();
226 :
227 : sal_Int32 getColumnCount() const;
228 : sal_Int32 getRowCount() const;
229 :
230 : void DragEdge( bool mbHorizontal, int nEdge, sal_Int32 nOffset );
231 :
232 : SdrTableObjImpl& operator=( const SdrTableObjImpl& rSource );
233 :
234 : // XModifyListener
235 : virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& aEvent ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
236 :
237 : // XEventListener
238 : virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
239 :
240 : void update();
241 :
242 : void connectTableStyle();
243 : void disconnectTableStyle();
244 : virtual bool isInUse() SAL_OVERRIDE;
245 : private:
246 : static SdrTableObjImpl* lastLayoutTable;
247 : static Rectangle lastLayoutRectangle;
248 : static bool lastLayoutFitWidth;
249 : static bool lastLayoutFitHeight;
250 : static WritingMode lastLayoutMode;
251 : };
252 :
253 : SdrTableObjImpl* SdrTableObjImpl::lastLayoutTable = NULL;
254 0 : Rectangle SdrTableObjImpl::lastLayoutRectangle;
255 : bool SdrTableObjImpl::lastLayoutFitWidth;
256 : bool SdrTableObjImpl::lastLayoutFitHeight;
257 : WritingMode SdrTableObjImpl::lastLayoutMode;
258 :
259 0 : SdrTableObjImpl::SdrTableObjImpl()
260 : : mpTableObj( 0 )
261 : , mpLayouter( 0 )
262 0 : , mbModifyPending( false )
263 : {
264 0 : }
265 :
266 :
267 :
268 0 : SdrTableObjImpl::~SdrTableObjImpl()
269 : {
270 0 : if( lastLayoutTable == this )
271 0 : lastLayoutTable = NULL;
272 0 : }
273 :
274 :
275 :
276 0 : void SdrTableObjImpl::init( SdrTableObj* pTable, sal_Int32 nColumns, sal_Int32 nRows )
277 : {
278 0 : mpTableObj = pTable;
279 0 : mxTable = new TableModel( pTable );
280 0 : mxTable->init( nColumns, nRows );
281 0 : Reference< XModifyListener > xListener( static_cast< ::com::sun::star::util::XModifyListener* >(this) );
282 0 : mxTable->addModifyListener( xListener );
283 0 : mpLayouter = new TableLayouter( mxTable );
284 0 : LayoutTable( mpTableObj->aRect, true, true );
285 0 : mpTableObj->maLogicRect = mpTableObj->aRect;
286 0 : }
287 :
288 :
289 :
290 0 : SdrTableObjImpl& SdrTableObjImpl::operator=( const SdrTableObjImpl& rSource )
291 : {
292 0 : if (this != &rSource)
293 : {
294 0 : disconnectTableStyle();
295 :
296 0 : if( mpLayouter )
297 : {
298 0 : delete mpLayouter;
299 0 : mpLayouter = 0;
300 : }
301 :
302 0 : if( mxTable.is() )
303 : {
304 0 : Reference< XModifyListener > xListener( static_cast< ::com::sun::star::util::XModifyListener* >(this) );
305 0 : mxTable->removeModifyListener( xListener );
306 0 : mxTable->dispose();
307 0 : mxTable.clear();
308 : }
309 :
310 0 : maTableStyle = rSource.maTableStyle;
311 :
312 0 : mxTable = new TableModel( mpTableObj, rSource.mxTable );
313 0 : mpLayouter = new TableLayouter( mxTable );
314 0 : Reference< XModifyListener > xListener( static_cast< ::com::sun::star::util::XModifyListener* >(this) );
315 0 : mxTable->addModifyListener( xListener );
316 0 : mxTableStyle = rSource.mxTableStyle;
317 0 : ApplyCellStyles();
318 0 : mpTableObj->aRect = mpTableObj->maLogicRect;
319 0 : LayoutTable( mpTableObj->aRect, false, false );
320 :
321 0 : connectTableStyle();
322 : }
323 0 : return *this;
324 : }
325 :
326 :
327 :
328 0 : void SdrTableObjImpl::SetModel(SdrModel* /*pOldModel*/, SdrModel* pNewModel)
329 : {
330 : // try to find new table style
331 0 : disconnectTableStyle();
332 :
333 0 : Reference< XIndexAccess > xNewTableStyle;
334 0 : if( mxTableStyle.is() ) try
335 : {
336 0 : const OUString sStyleName( Reference< XNamed >( mxTableStyle, UNO_QUERY_THROW )->getName() );
337 :
338 0 : Reference< XStyleFamiliesSupplier > xSFS( pNewModel->getUnoModel(), UNO_QUERY_THROW );
339 0 : Reference< XNameAccess > xFamilyNameAccess( xSFS->getStyleFamilies(), UNO_QUERY_THROW );
340 0 : const OUString sFamilyName( "table" );
341 0 : Reference< XNameAccess > xTableFamilyAccess( xFamilyNameAccess->getByName( sFamilyName ), UNO_QUERY_THROW );
342 :
343 0 : if( xTableFamilyAccess->hasByName( sStyleName ) )
344 : {
345 : // found table style with the same name
346 0 : xTableFamilyAccess->getByName( sStyleName ) >>= xNewTableStyle;
347 : }
348 : else
349 : {
350 : // copy or?
351 0 : Reference< XIndexAccess > xIndexAccess( xTableFamilyAccess, UNO_QUERY_THROW );
352 0 : xIndexAccess->getByIndex( 0 ) >>= xNewTableStyle;
353 0 : }
354 : }
355 0 : catch( Exception& )
356 : {
357 : OSL_FAIL("svx::SdrTableObjImpl::SetModel(), exception caught!");
358 : }
359 :
360 0 : mxTableStyle = xNewTableStyle;
361 :
362 0 : connectTableStyle();
363 0 : update();
364 0 : }
365 :
366 :
367 :
368 0 : bool SdrTableObjImpl::ApplyCellStyles()
369 : {
370 0 : if( !mxTable.is() || !mxTableStyle.is() )
371 0 : return false;
372 :
373 0 : bool bChanges = false;
374 :
375 0 : const sal_Int32 nColCount = getColumnCount();
376 0 : const sal_Int32 nRowCount = getRowCount();
377 :
378 0 : const TableStyleSettings& rStyle = maTableStyle;
379 :
380 0 : CellPos aPos;
381 0 : for( aPos.mnRow = 0; aPos.mnRow < nRowCount; ++aPos.mnRow )
382 : {
383 0 : const bool bFirstRow = (aPos.mnRow == 0) && rStyle.mbUseFirstRow;
384 0 : const bool bLastRow = (aPos.mnRow == nRowCount-1) && rStyle.mbUseLastRow;
385 :
386 0 : for( aPos.mnCol = 0; aPos.mnCol < nColCount; ++aPos.mnCol )
387 : {
388 0 : Reference< XStyle > xStyle;
389 :
390 : // first and last row win first, if used and available
391 0 : if( bFirstRow )
392 : {
393 0 : mxTableStyle->getByIndex(first_row_style) >>= xStyle;
394 : }
395 0 : else if( bLastRow )
396 : {
397 0 : mxTableStyle->getByIndex(last_row_style) >>= xStyle;
398 : }
399 :
400 0 : if( !xStyle.is() )
401 : {
402 : // next come first and last column, if used and available
403 0 : if( rStyle.mbUseFirstColumn && (aPos.mnCol == 0) )
404 : {
405 0 : mxTableStyle->getByIndex(first_column_style) >>= xStyle;
406 : }
407 0 : else if( rStyle.mbUseLastColumn && (aPos.mnCol == nColCount-1) )
408 : {
409 0 : mxTableStyle->getByIndex(last_column_style) >>= xStyle;
410 : }
411 : }
412 :
413 0 : if( !xStyle.is() && rStyle.mbUseRowBanding )
414 : {
415 0 : if( (aPos.mnRow & 1) == 0 )
416 : {
417 0 : mxTableStyle->getByIndex(even_rows_style) >>= xStyle;
418 : }
419 : else
420 : {
421 0 : mxTableStyle->getByIndex(odd_rows_style) >>= xStyle;
422 : }
423 : }
424 :
425 0 : if( !xStyle.is() && rStyle.mbUseColumnBanding )
426 : {
427 0 : if( (aPos.mnCol & 1) == 0 )
428 : {
429 0 : mxTableStyle->getByIndex(even_columns_style) >>= xStyle;
430 : }
431 : else
432 : {
433 0 : mxTableStyle->getByIndex(odd_columns_style) >>= xStyle;
434 : }
435 : }
436 :
437 0 : if( !xStyle.is() )
438 : {
439 : // use default cell style if non found yet
440 0 : mxTableStyle->getByIndex(body_style) >>= xStyle;
441 : }
442 :
443 :
444 0 : if( xStyle.is() )
445 : {
446 0 : SfxUnoStyleSheet* pStyle = SfxUnoStyleSheet::getUnoStyleSheet(xStyle);
447 :
448 0 : if( pStyle )
449 : {
450 0 : CellRef xCell( getCell( aPos ) );
451 0 : if( xCell.is() && ( xCell->GetStyleSheet() != pStyle ) )
452 : {
453 0 : bChanges = true;
454 0 : xCell->SetStyleSheet( pStyle, true );
455 0 : }
456 : }
457 : }
458 0 : }
459 : }
460 :
461 0 : return bChanges;
462 : }
463 :
464 :
465 :
466 0 : void SdrTableObjImpl::dispose()
467 : {
468 0 : disconnectTableStyle();
469 0 : mxTableStyle.clear();
470 :
471 0 : if( mpLayouter )
472 : {
473 0 : delete mpLayouter;
474 0 : mpLayouter = 0;
475 : }
476 :
477 0 : if( mxTable.is() )
478 : {
479 0 : Reference< XModifyListener > xListener( static_cast< ::com::sun::star::util::XModifyListener* >(this) );
480 0 : mxTable->removeModifyListener( xListener );
481 0 : mxTable->dispose();
482 0 : mxTable.clear();
483 : }
484 0 : }
485 :
486 :
487 :
488 0 : void SdrTableObjImpl::DragEdge( bool mbHorizontal, int nEdge, sal_Int32 nOffset )
489 : {
490 0 : if( (nEdge >= 0) && mxTable.is()) try
491 : {
492 0 : const OUString sSize( "Size" );
493 0 : if( mbHorizontal )
494 : {
495 0 : if( (nEdge >= 0) && (nEdge <= getRowCount()) )
496 : {
497 0 : sal_Int32 nHeight = mpLayouter->getRowHeight( (!nEdge)?nEdge:(nEdge-1) );
498 0 : if(nEdge==0)
499 0 : nHeight -= nOffset;
500 : else
501 0 : nHeight += nOffset;
502 0 : Reference< XIndexAccess > xRows( mxTable->getRows(), UNO_QUERY_THROW );
503 0 : Reference< XPropertySet > xRowSet( xRows->getByIndex( (!nEdge)?nEdge:(nEdge-1) ), UNO_QUERY_THROW );
504 0 : xRowSet->setPropertyValue( sSize, Any( nHeight ) );
505 : }
506 : }
507 : else
508 : {
509 : /*
510 : fixes fdo#59889 and resizing of table in edge dragging
511 : Total vertical edges in a NxN table is N+1, indexed from 0 to N and total Columns is N, indexed from 0 to N-1
512 : In LTR table vertical edge responsible for dragging of column x(x=0 to N-1) is, Edge x+1
513 : But in RTL table vertical edge responisble for dragging of column x(x=0 to N-1, but from right to left)is, Edge x
514 : In LTR table dragging of edge 0(for RTL table edge N) does nothing.
515 : */
516 : //Todo: Implement Dragging functionality for leftmost edge of table.
517 0 : if( (nEdge >= 0) && (nEdge <= getColumnCount()) )
518 : {
519 0 : const bool bRTL = !mpTableObj? false: (mpTableObj->GetWritingMode() == WritingMode_RL_TB);
520 : sal_Int32 nWidth;
521 0 : if(bRTL)
522 : {
523 0 : nWidth = mpLayouter->getColumnWidth( nEdge );
524 : }
525 : else
526 : {
527 0 : nWidth = mpLayouter->getColumnWidth( (!nEdge)?nEdge:(nEdge-1) );
528 : }
529 0 : Reference< XIndexAccess > xCols( mxTable->getColumns(), UNO_QUERY_THROW );
530 0 : nWidth += nOffset;
531 0 : if(bRTL && nEdge<getColumnCount())
532 : {
533 0 : Reference< XPropertySet > xColSet( xCols->getByIndex( nEdge ), UNO_QUERY_THROW );
534 0 : xColSet->setPropertyValue( sSize, Any( nWidth ) );
535 : }
536 0 : else if(!bRTL && nEdge>0)
537 : {
538 0 : Reference< XPropertySet > xColSet( xCols->getByIndex( (nEdge-1) ), UNO_QUERY_THROW );
539 0 : xColSet->setPropertyValue( sSize, Any( nWidth ) );
540 : }
541 : /* To prevent the table resizing on edge dragging */
542 0 : if( nEdge > 0 && nEdge < mxTable->getColumnCount() )
543 : {
544 :
545 0 : if( bRTL )
546 0 : nEdge--;
547 :
548 0 : if( (bRTL && (nEdge >= 0)) || (!bRTL && (nEdge < mxTable->getColumnCount())) )
549 : {
550 0 : nWidth = mpLayouter->getColumnWidth( nEdge );
551 0 : nWidth = std::max( (sal_Int32)(nWidth - nOffset), (sal_Int32)0 );
552 :
553 0 : Reference< XPropertySet > xColSet( xCols->getByIndex( nEdge ), UNO_QUERY_THROW );
554 0 : xColSet->setPropertyValue( sSize, Any( nWidth ) );
555 : }
556 0 : }
557 : }
558 0 : }
559 : }
560 0 : catch( Exception& )
561 : {
562 : OSL_FAIL( "svx::SdrTableObjImpl::DragEdge(), exception caught!" );
563 : }
564 0 : }
565 :
566 :
567 : // XModifyListener
568 :
569 :
570 0 : void SAL_CALL SdrTableObjImpl::modified( const ::com::sun::star::lang::EventObject& /*aEvent*/ ) throw (::com::sun::star::uno::RuntimeException, std::exception)
571 : {
572 0 : update();
573 0 : }
574 :
575 0 : void SdrTableObjImpl::update()
576 : {
577 : // source can be the table model itself or the assigned table template
578 0 : TableModelNotifyGuard aGuard( mxTable.get() );
579 0 : if( mpTableObj )
580 : {
581 0 : if( (maEditPos.mnRow >= getRowCount()) || (maEditPos.mnCol >= getColumnCount()) || (getCell( maEditPos ) != mxActiveCell) )
582 : {
583 0 : if(maEditPos.mnRow >= getRowCount())
584 0 : maEditPos.mnRow = getRowCount()-1;
585 :
586 0 : if(maEditPos.mnCol >= getColumnCount())
587 0 : maEditPos.mnCol = getColumnCount()-1;
588 :
589 0 : mpTableObj->setActiveCell( maEditPos );
590 : }
591 :
592 0 : ApplyCellStyles();
593 :
594 0 : mpTableObj->aRect = mpTableObj->maLogicRect;
595 0 : LayoutTable( mpTableObj->aRect, false, false );
596 :
597 0 : mpTableObj->SetRectsDirty();
598 0 : mpTableObj->ActionChanged();
599 0 : mpTableObj->BroadcastObjectChange();
600 0 : }
601 0 : }
602 :
603 :
604 :
605 0 : void SdrTableObjImpl::connectTableStyle()
606 : {
607 0 : if( mxTableStyle.is() )
608 : {
609 0 : Reference< XModifyBroadcaster > xBroadcaster( mxTableStyle, UNO_QUERY );
610 0 : if( xBroadcaster.is() )
611 : {
612 0 : Reference< XModifyListener > xListener( static_cast< ::com::sun::star::util::XModifyListener* >(this) );
613 0 : xBroadcaster->addModifyListener( xListener );
614 0 : }
615 : }
616 0 : }
617 :
618 :
619 :
620 0 : void SdrTableObjImpl::disconnectTableStyle()
621 : {
622 0 : if( mxTableStyle.is() )
623 : {
624 0 : Reference< XModifyBroadcaster > xBroadcaster( mxTableStyle, UNO_QUERY );
625 0 : if( xBroadcaster.is() )
626 : {
627 0 : Reference< XModifyListener > xListener( static_cast< ::com::sun::star::util::XModifyListener* >(this) );
628 0 : xBroadcaster->removeModifyListener( xListener );
629 0 : }
630 : }
631 0 : }
632 :
633 :
634 :
635 0 : bool SdrTableObjImpl::isInUse()
636 : {
637 0 : return mpTableObj && mpTableObj->IsInserted();
638 : }
639 :
640 :
641 : // XEventListener
642 :
643 :
644 0 : void SAL_CALL SdrTableObjImpl::disposing( const ::com::sun::star::lang::EventObject& /*Source*/ ) throw (::com::sun::star::uno::RuntimeException, std::exception)
645 : {
646 0 : mxActiveCell.clear();
647 0 : mxTable.clear();
648 0 : if( mpLayouter )
649 : {
650 0 : delete mpLayouter;
651 0 : mpLayouter = 0;
652 : }
653 0 : mpTableObj = 0;
654 0 : }
655 :
656 :
657 :
658 0 : CellRef SdrTableObjImpl::getCell( const CellPos& rPos ) const
659 : {
660 0 : CellRef xCell;
661 0 : if( mxTable.is() ) try
662 : {
663 0 : xCell.set( dynamic_cast< Cell* >( mxTable->getCellByPosition( rPos.mnCol, rPos.mnRow ).get() ) );
664 : }
665 0 : catch( Exception& )
666 : {
667 : OSL_FAIL( "svx::SdrTableObjImpl::getCell(), exception caught!" );
668 : }
669 0 : return xCell;
670 : }
671 :
672 :
673 :
674 0 : sal_Int32 SdrTableObjImpl::getColumnCount() const
675 : {
676 0 : return mxTable.is() ? mxTable->getColumnCount() : 0;
677 : }
678 :
679 :
680 :
681 0 : sal_Int32 SdrTableObjImpl::getRowCount() const
682 : {
683 0 : return mxTable.is() ? mxTable->getRowCount() : 0;
684 : }
685 :
686 :
687 :
688 0 : void SdrTableObjImpl::LayoutTable( Rectangle& rArea, bool bFitWidth, bool bFitHeight )
689 : {
690 0 : if( mpLayouter && mpTableObj->GetModel() )
691 : {
692 : // Optimization: SdrTableObj::SetChanged() can call this very often, repeatedly
693 : // with the same settings, noticeably increasing load time. Skip if already done.
694 0 : WritingMode writingMode = mpTableObj->GetWritingMode();
695 0 : if( lastLayoutTable != this || lastLayoutRectangle != rArea
696 0 : || lastLayoutFitWidth != bFitWidth || lastLayoutFitHeight != bFitHeight
697 0 : || lastLayoutMode != writingMode )
698 : {
699 0 : lastLayoutTable = this;
700 0 : lastLayoutRectangle = rArea;
701 0 : lastLayoutFitWidth = bFitWidth;
702 0 : lastLayoutFitHeight = bFitHeight;
703 0 : lastLayoutMode = writingMode;
704 0 : TableModelNotifyGuard aGuard( mxTable.get() );
705 0 : mpLayouter->LayoutTable( rArea, bFitWidth, bFitHeight );
706 : }
707 : }
708 0 : }
709 :
710 :
711 :
712 0 : void SdrTableObjImpl::UpdateCells( Rectangle& rArea )
713 : {
714 0 : if( mpLayouter && mxTable.is() )
715 : {
716 0 : TableModelNotifyGuard aGuard( mxTable.get() );
717 0 : mpLayouter->updateCells( rArea );
718 0 : mxTable->setModified(true);
719 : }
720 0 : }
721 :
722 :
723 : // BaseProperties section
724 :
725 :
726 0 : sdr::properties::BaseProperties* SdrTableObj::CreateObjectSpecificProperties()
727 : {
728 0 : return new TableProperties(*this);
729 : }
730 :
731 :
732 : // DrawContact section
733 :
734 :
735 0 : sdr::contact::ViewContact* SdrTableObj::CreateObjectSpecificViewContact()
736 : {
737 0 : return new sdr::contact::ViewContactOfTableObj(*this);
738 : }
739 :
740 :
741 :
742 0 : TYPEINIT1(SdrTableObj,SdrTextObj);
743 :
744 :
745 :
746 0 : SdrTableObj::SdrTableObj(SdrModel* _pModel)
747 : {
748 0 : pModel = _pModel;
749 0 : init( 1, 1 );
750 0 : }
751 :
752 :
753 :
754 0 : SdrTableObj::SdrTableObj(SdrModel* _pModel, const ::Rectangle& rNewRect, sal_Int32 nColumns, sal_Int32 nRows)
755 : : SdrTextObj( rNewRect )
756 0 : , maLogicRect( rNewRect )
757 : {
758 0 : pModel = _pModel;
759 :
760 0 : if( nColumns <= 0 )
761 0 : nColumns = 1;
762 :
763 0 : if( nRows <= 0 )
764 0 : nRows = 1;
765 :
766 0 : init( nColumns, nRows );
767 0 : }
768 :
769 :
770 :
771 0 : void SdrTableObj::init( sal_Int32 nColumns, sal_Int32 nRows )
772 : {
773 0 : bClosedObj = true;
774 :
775 0 : mpImpl = new SdrTableObjImpl;
776 0 : mpImpl->acquire();
777 0 : mpImpl->init( this, nColumns, nRows );
778 0 : }
779 :
780 :
781 :
782 0 : SdrTableObj::~SdrTableObj()
783 : {
784 0 : mpImpl->dispose();
785 0 : mpImpl->release();
786 0 : }
787 :
788 :
789 : // table stuff
790 :
791 :
792 0 : Reference< XTable > SdrTableObj::getTable() const
793 : {
794 0 : return Reference< XTable >( mpImpl->mxTable.get() );
795 : }
796 :
797 :
798 :
799 0 : bool SdrTableObj::isValid( const CellPos& rPos ) const
800 : {
801 0 : return (rPos.mnCol >= 0) && (rPos.mnCol < mpImpl->getColumnCount()) && (rPos.mnRow >= 0) && (rPos.mnRow < mpImpl->getRowCount());
802 : }
803 :
804 :
805 :
806 0 : CellPos SdrTableObj::getFirstCell() const
807 : {
808 0 : return CellPos( 0,0 );
809 : }
810 :
811 :
812 :
813 0 : CellPos SdrTableObj::getLastCell() const
814 : {
815 0 : CellPos aPos;
816 0 : if( mpImpl->mxTable.is() )
817 : {
818 0 : aPos.mnCol = mpImpl->getColumnCount()-1;
819 0 : aPos.mnRow = mpImpl->getRowCount()-1;
820 : }
821 0 : return aPos;
822 : }
823 :
824 :
825 :
826 0 : CellPos SdrTableObj::getLeftCell( const CellPos& rPos, bool bEdgeTravel ) const
827 : {
828 0 : switch( GetWritingMode() )
829 : {
830 : default:
831 : case WritingMode_LR_TB:
832 0 : return getPreviousCell( rPos, bEdgeTravel );
833 : case WritingMode_RL_TB:
834 0 : return getNextCell( rPos, bEdgeTravel );
835 : case WritingMode_TB_RL:
836 0 : return getPreviousRow( rPos, bEdgeTravel );
837 : }
838 : }
839 :
840 :
841 :
842 0 : CellPos SdrTableObj::getRightCell( const CellPos& rPos, bool bEdgeTravel ) const
843 : {
844 0 : switch( GetWritingMode() )
845 : {
846 : default:
847 : case WritingMode_LR_TB:
848 0 : return getNextCell( rPos, bEdgeTravel );
849 : case WritingMode_RL_TB:
850 0 : return getPreviousCell( rPos, bEdgeTravel );
851 : case WritingMode_TB_RL:
852 0 : return getNextRow( rPos, bEdgeTravel );
853 : }
854 : }
855 :
856 :
857 :
858 0 : CellPos SdrTableObj::getUpCell( const CellPos& rPos, bool bEdgeTravel ) const
859 : {
860 0 : switch( GetWritingMode() )
861 : {
862 : default:
863 : case WritingMode_LR_TB:
864 : case WritingMode_RL_TB:
865 0 : return getPreviousRow( rPos, bEdgeTravel );
866 : case WritingMode_TB_RL:
867 0 : return getPreviousCell( rPos, bEdgeTravel );
868 : }
869 : }
870 :
871 :
872 :
873 0 : CellPos SdrTableObj::getDownCell( const CellPos& rPos, bool bEdgeTravel ) const
874 : {
875 0 : switch( GetWritingMode() )
876 : {
877 : default:
878 : case WritingMode_LR_TB:
879 : case WritingMode_RL_TB:
880 0 : return getNextRow( rPos, bEdgeTravel );
881 : case WritingMode_TB_RL:
882 0 : return getNextCell( rPos, bEdgeTravel );
883 : }
884 : }
885 :
886 :
887 :
888 0 : CellPos SdrTableObj::getPreviousCell( const CellPos& rPos, bool bEdgeTravel ) const
889 : {
890 0 : CellPos aPos( rPos );
891 0 : if( mpImpl )
892 : {
893 0 : CellRef xCell( mpImpl->getCell( aPos ) );
894 0 : if( xCell.is() && xCell->isMerged() )
895 : {
896 0 : sal_Int32 nTemp = 0;
897 0 : findMergeOrigin( mpImpl->mxTable.get(), aPos.mnCol, aPos.mnRow, aPos.mnCol, nTemp );
898 : }
899 :
900 0 : if( aPos.mnCol > 0 )
901 : {
902 0 : --aPos.mnCol;
903 : }
904 :
905 0 : else if( bEdgeTravel && (aPos.mnRow > 0) )
906 : {
907 0 : aPos.mnCol = mpImpl->mxTable->getColumnCount()-1;
908 0 : --aPos.mnRow;
909 0 : }
910 : }
911 0 : return aPos;
912 : }
913 :
914 :
915 :
916 0 : CellPos SdrTableObj::getNextCell( const CellPos& rPos, bool bEdgeTravel ) const
917 : {
918 0 : CellPos aPos( rPos );
919 0 : if( mpImpl )
920 : {
921 0 : CellRef xCell( mpImpl->getCell( aPos ) );
922 0 : if( xCell.is() )
923 : {
924 0 : if( xCell->isMerged() )
925 : {
926 0 : findMergeOrigin( mpImpl->mxTable, aPos.mnCol, aPos.mnRow, aPos.mnCol, aPos.mnRow );
927 :
928 0 : xCell = mpImpl->getCell(aPos);
929 :
930 0 : if( xCell.is() )
931 : {
932 0 : aPos.mnCol += xCell->getColumnSpan();
933 0 : aPos.mnRow = rPos.mnRow;
934 : }
935 : }
936 : else
937 : {
938 0 : aPos.mnCol += xCell->getColumnSpan();
939 : }
940 :
941 0 : if( aPos.mnCol < mpImpl->mxTable->getColumnCount() )
942 0 : return aPos;
943 :
944 0 : if( bEdgeTravel && ((aPos.mnRow + 1) < mpImpl->getRowCount()) )
945 : {
946 0 : aPos.mnCol = 0;
947 0 : aPos.mnRow += 1;
948 0 : return aPos;
949 : }
950 0 : }
951 : }
952 :
953 : // last cell reached, no traveling possible
954 0 : return rPos;
955 : }
956 :
957 :
958 :
959 0 : CellPos SdrTableObj::getPreviousRow( const CellPos& rPos, bool bEdgeTravel ) const
960 : {
961 0 : CellPos aPos( rPos );
962 0 : if( mpImpl )
963 : {
964 0 : CellRef xCell( mpImpl->getCell( aPos ) );
965 0 : if( xCell.is() )
966 : {
967 0 : if( xCell->isMerged() )
968 : {
969 0 : sal_Int32 nTemp = 0;
970 0 : findMergeOrigin( mpImpl->mxTable, aPos.mnCol, aPos.mnRow, nTemp, aPos.mnRow );
971 : }
972 : }
973 :
974 0 : if( aPos.mnRow > 0 )
975 : {
976 0 : --aPos.mnRow;
977 : }
978 0 : else if( bEdgeTravel && (aPos.mnCol > 0) )
979 : {
980 0 : aPos.mnRow = mpImpl->mxTable->getRowCount()-1;
981 0 : --aPos.mnCol;
982 0 : }
983 : }
984 0 : return aPos;
985 : }
986 :
987 :
988 :
989 0 : CellPos SdrTableObj::getNextRow( const CellPos& rPos, bool bEdgeTravel ) const
990 : {
991 0 : CellPos aPos( rPos );
992 :
993 0 : if( mpImpl )
994 : {
995 0 : CellRef xCell( mpImpl->getCell( rPos ) );
996 0 : if( xCell.is() )
997 : {
998 0 : if( xCell->isMerged() )
999 : {
1000 0 : findMergeOrigin( mpImpl->mxTable, aPos.mnCol, aPos.mnRow, aPos.mnCol, aPos.mnRow );
1001 0 : xCell = mpImpl->getCell(aPos);
1002 0 : aPos.mnCol = rPos.mnCol;
1003 : }
1004 :
1005 0 : if( xCell.is() )
1006 0 : aPos.mnRow += xCell->getRowSpan();
1007 :
1008 0 : if( aPos.mnRow < mpImpl->mxTable->getRowCount() )
1009 0 : return aPos;
1010 :
1011 0 : if( bEdgeTravel && (aPos.mnCol + 1) < mpImpl->mxTable->getColumnCount() )
1012 : {
1013 0 : aPos.mnRow = 0;
1014 0 : aPos.mnCol += 1;
1015 :
1016 0 : while( aPos.mnCol < mpImpl->mxTable->getColumnCount() )
1017 : {
1018 0 : xCell = mpImpl->getCell( aPos );
1019 0 : if( xCell.is() && !xCell->isMerged() )
1020 0 : return aPos;
1021 0 : aPos.mnCol += 1;
1022 : }
1023 : }
1024 0 : }
1025 : }
1026 :
1027 : // last position reached, no more traveling possible
1028 0 : return rPos;
1029 : }
1030 :
1031 :
1032 :
1033 0 : const TableStyleSettings& SdrTableObj::getTableStyleSettings() const
1034 : {
1035 0 : if( mpImpl )
1036 : {
1037 0 : return mpImpl->maTableStyle;
1038 : }
1039 : else
1040 : {
1041 0 : static TableStyleSettings aTmp;
1042 0 : return aTmp;
1043 : }
1044 : }
1045 :
1046 :
1047 :
1048 0 : void SdrTableObj::setTableStyleSettings( const TableStyleSettings& rStyle )
1049 : {
1050 0 : if( mpImpl )
1051 : {
1052 0 : mpImpl->maTableStyle = rStyle;
1053 0 : mpImpl->update();
1054 : }
1055 0 : }
1056 :
1057 :
1058 :
1059 0 : TableHitKind SdrTableObj::CheckTableHit( const Point& rPos, sal_Int32& rnX, sal_Int32& rnY, int nTol ) const
1060 : {
1061 0 : if( !mpImpl || !mpImpl->mxTable.is() )
1062 0 : return SDRTABLEHIT_NONE;
1063 :
1064 0 : rnX = 0;
1065 0 : rnY = 0;
1066 :
1067 0 : const sal_Int32 nColCount = mpImpl->getColumnCount();
1068 0 : const sal_Int32 nRowCount = mpImpl->getRowCount();
1069 :
1070 0 : sal_Int32 nX = rPos.X() + nTol - aRect.Left();
1071 0 : sal_Int32 nY = rPos.Y() + nTol - aRect.Top();
1072 :
1073 0 : if( (nX < 0) || (nX > (aRect.GetWidth() + nTol)) || (nY < 0) || (nY > (aRect.GetHeight() + nTol) ) )
1074 0 : return SDRTABLEHIT_NONE;
1075 :
1076 : // get vertical edge number and check for a hit
1077 0 : const bool bRTL = (GetWritingMode() == WritingMode_RL_TB);
1078 0 : bool bVrtHit = false;
1079 0 : if( nX >= 0 )
1080 : {
1081 0 : if( !bRTL )
1082 : {
1083 0 : while( rnX <= nColCount )
1084 : {
1085 0 : if( nX <= (2*nTol) )
1086 : {
1087 0 : bVrtHit = true;
1088 0 : break;
1089 : }
1090 :
1091 0 : if( rnX == nColCount )
1092 0 : break;
1093 :
1094 0 : nX -= mpImpl->mpLayouter->getColumnWidth( rnX );
1095 0 : if( nX < 0 )
1096 0 : break;
1097 0 : rnX++;
1098 : }
1099 : }
1100 : else
1101 : {
1102 0 : rnX = nColCount;
1103 0 : while( rnX >= 0 )
1104 : {
1105 0 : if( nX <= (2*nTol) )
1106 : {
1107 0 : bVrtHit = true;
1108 0 : break;
1109 : }
1110 :
1111 0 : if( rnX == 0 )
1112 0 : break;
1113 :
1114 0 : rnX--;
1115 0 : nX -= mpImpl->mpLayouter->getColumnWidth( rnX );
1116 0 : if( nX < 0 )
1117 0 : break;
1118 : }
1119 : }
1120 : }
1121 :
1122 : // rnX is now the edge number left to the pointer, if it was hit bHrzHit is also true
1123 :
1124 : // get vertical edge number and check for a hit
1125 0 : bool bHrzHit = false;
1126 0 : if( nY >= 0 )
1127 : {
1128 0 : while( rnY <= nRowCount )
1129 : {
1130 0 : if( nY <= (2*nTol) )
1131 : {
1132 0 : bHrzHit = true;
1133 0 : break;
1134 : }
1135 :
1136 0 : if( rnY == nRowCount )
1137 0 : break;
1138 :
1139 0 : nY -= mpImpl->mpLayouter->getRowHeight(rnY);
1140 0 : if( nY < 0 )
1141 0 : break;
1142 0 : rnY++;
1143 : }
1144 : }
1145 :
1146 : // rnY is now the edge number above the pointer, if it was hit bVrtHit is also true
1147 :
1148 0 : if( bVrtHit && mpImpl->mpLayouter->isEdgeVisible( rnX, rnY, false ) )
1149 0 : return SDRTABLEHIT_VERTICAL_BORDER;
1150 :
1151 0 : if( bHrzHit && mpImpl->mpLayouter->isEdgeVisible( rnX, rnY, true ) )
1152 0 : return SDRTABLEHIT_HORIZONTAL_BORDER;
1153 :
1154 0 : CellRef xCell( mpImpl->getCell( CellPos( rnX, rnY ) ) );
1155 0 : if( xCell.is() && xCell->isMerged() )
1156 0 : findMergeOrigin( mpImpl->mxTable.get(), rnX, rnY, rnX, rnY );
1157 :
1158 0 : if( xCell.is() )
1159 : {
1160 0 : nX += mpImpl->mpLayouter->getColumnWidth( rnX );
1161 : //Fix for fdo#62673 : non-editable cell in table on cell merge
1162 0 : sal_Int32 i=0;
1163 0 : while(xCell.is() && xCell->isMerged())
1164 : {
1165 0 : nX += mpImpl->mpLayouter->getColumnWidth( rnX+i );
1166 0 : i++;
1167 0 : if(rnX+i < nColCount)
1168 0 : xCell=mpImpl->getCell( CellPos( rnX+i, rnY) );
1169 : else
1170 0 : break;
1171 : }
1172 :
1173 0 : if( nX < xCell->GetTextLeftDistance() )
1174 0 : return SDRTABLEHIT_CELL;
1175 : }
1176 :
1177 0 : return SDRTABLEHIT_CELLTEXTAREA;
1178 : }
1179 :
1180 0 : const SfxItemSet& SdrTableObj::GetActiveCellItemSet() const
1181 : {
1182 0 : return getActiveCell()->GetItemSet();
1183 : }
1184 :
1185 :
1186 :
1187 0 : void SdrTableObj::setTableStyle( const Reference< XIndexAccess >& xTableStyle )
1188 : {
1189 0 : if( mpImpl && (mpImpl->mxTableStyle != xTableStyle) )
1190 : {
1191 0 : mpImpl->disconnectTableStyle();
1192 0 : mpImpl->mxTableStyle = xTableStyle;
1193 0 : mpImpl->connectTableStyle();
1194 0 : mpImpl->update();
1195 : }
1196 0 : }
1197 :
1198 :
1199 :
1200 0 : const Reference< XIndexAccess >& SdrTableObj::getTableStyle() const
1201 : {
1202 0 : if( mpImpl )
1203 : {
1204 0 : return mpImpl->mxTableStyle;
1205 : }
1206 : else
1207 : {
1208 0 : static Reference< XIndexAccess > aTmp;
1209 0 : return aTmp;
1210 : }
1211 : }
1212 :
1213 :
1214 : // text stuff
1215 :
1216 :
1217 : /** returns the currently active text. */
1218 0 : SdrText* SdrTableObj::getActiveText() const
1219 : {
1220 0 : return dynamic_cast< SdrText* >( getActiveCell().get() );
1221 : }
1222 :
1223 :
1224 :
1225 : /** returns the nth available text. */
1226 0 : SdrText* SdrTableObj::getText( sal_Int32 nIndex ) const
1227 : {
1228 0 : if( mpImpl->mxTable.is() )
1229 : {
1230 0 : const sal_Int32 nColCount = mpImpl->getColumnCount();
1231 0 : if( nColCount )
1232 : {
1233 0 : CellPos aPos( nIndex % nColCount, nIndex / nColCount );
1234 :
1235 0 : CellRef xCell( mpImpl->getCell( aPos ) );
1236 0 : return dynamic_cast< SdrText* >( xCell.get() );
1237 : }
1238 : }
1239 0 : return 0;
1240 : }
1241 :
1242 :
1243 :
1244 : /** returns the number of texts available for this object. */
1245 0 : sal_Int32 SdrTableObj::getTextCount() const
1246 : {
1247 0 : if( mpImpl->mxTable.is() )
1248 : {
1249 0 : const sal_Int32 nColCount = mpImpl->getColumnCount();
1250 0 : const sal_Int32 nRowCount = mpImpl->getRowCount();
1251 :
1252 0 : return nColCount * nRowCount;
1253 : }
1254 : else
1255 : {
1256 0 : return 0;
1257 : }
1258 : }
1259 :
1260 :
1261 :
1262 : /** changes the current active text */
1263 0 : void SdrTableObj::setActiveText( sal_Int32 nIndex )
1264 : {
1265 0 : if( mpImpl && mpImpl->mxTable.is() )
1266 : {
1267 0 : const sal_Int32 nColCount = mpImpl->mxTable->getColumnCount();
1268 0 : if( nColCount )
1269 : {
1270 0 : CellPos aPos( nIndex % nColCount, nIndex / nColCount );
1271 0 : if( isValid( aPos ) )
1272 0 : setActiveCell( aPos );
1273 : }
1274 : }
1275 0 : }
1276 :
1277 :
1278 :
1279 : /** returns the index of the text that contains the given point or -1 */
1280 0 : sal_Int32 SdrTableObj::CheckTextHit(const Point& rPnt) const
1281 : {
1282 0 : if( mpImpl && mpImpl->mxTable.is() )
1283 : {
1284 0 : CellPos aPos;
1285 0 : if( CheckTableHit( rPnt, aPos.mnCol, aPos.mnRow, 0 ) == SDRTABLEHIT_CELLTEXTAREA )
1286 0 : return aPos.mnRow * mpImpl->mxTable->getColumnCount() + aPos.mnCol;
1287 : }
1288 :
1289 0 : return 0;
1290 : }
1291 :
1292 :
1293 :
1294 0 : SdrOutliner* SdrTableObj::GetCellTextEditOutliner( const Cell& rCell ) const
1295 : {
1296 0 : if( mpImpl && (mpImpl->getCell( mpImpl->maEditPos ).get() == &rCell) )
1297 0 : return pEdtOutl;
1298 : else
1299 0 : return 0;
1300 : }
1301 :
1302 :
1303 :
1304 :
1305 0 : const TableLayouter& SdrTableObj::getTableLayouter() const
1306 : {
1307 : OSL_ENSURE(mpImpl && mpImpl->mpLayouter, "getTableLayouter() error: no mpImpl or mpLayouter (!)");
1308 0 : return *(mpImpl->mpLayouter);
1309 : }
1310 :
1311 :
1312 :
1313 0 : bool SdrTableObj::IsAutoGrowHeight() const
1314 : {
1315 0 : return true;
1316 : }
1317 :
1318 :
1319 :
1320 0 : bool SdrTableObj::IsAutoGrowWidth() const
1321 : {
1322 0 : return true;
1323 : }
1324 :
1325 :
1326 :
1327 0 : bool SdrTableObj::HasText() const
1328 : {
1329 0 : return true;
1330 : }
1331 :
1332 :
1333 :
1334 0 : bool SdrTableObj::IsTextEditActive( const CellPos& rPos )
1335 : {
1336 0 : return pEdtOutl && mpImpl && (rPos == mpImpl->maEditPos);
1337 : }
1338 :
1339 :
1340 :
1341 0 : void SdrTableObj::onEditOutlinerStatusEvent( EditStatus* pEditStatus )
1342 : {
1343 0 : if( (pEditStatus->GetStatusWord() & EE_STAT_TEXTHEIGHTCHANGED) && mpImpl && mpImpl->mpLayouter )
1344 : {
1345 0 : Rectangle aRect0( aRect );
1346 0 : aRect = maLogicRect;
1347 0 : mpImpl->LayoutTable( aRect, false, false );
1348 0 : SetRectsDirty();
1349 0 : ActionChanged();
1350 0 : BroadcastObjectChange();
1351 0 : if( aRect0 != aRect )
1352 0 : SendUserCall(SDRUSERCALL_RESIZE,aRect0);
1353 : }
1354 0 : }
1355 :
1356 :
1357 :
1358 0 : void SdrTableObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
1359 : {
1360 0 : rInfo.bResizeFreeAllowed=true;
1361 0 : rInfo.bResizePropAllowed=true;
1362 0 : rInfo.bRotateFreeAllowed=false;
1363 0 : rInfo.bRotate90Allowed =false;
1364 0 : rInfo.bMirrorFreeAllowed=false;
1365 0 : rInfo.bMirror45Allowed =false;
1366 0 : rInfo.bMirror90Allowed =false;
1367 :
1368 : // allow transparence
1369 0 : rInfo.bTransparenceAllowed = true;
1370 :
1371 : // gradient depends on fillstyle
1372 0 : XFillStyle eFillStyle = ((XFillStyleItem&)(GetObjectItem(XATTR_FILLSTYLE))).GetValue();
1373 0 : rInfo.bGradientAllowed = (eFillStyle == XFILL_GRADIENT);
1374 0 : rInfo.bShearAllowed =false;
1375 0 : rInfo.bEdgeRadiusAllowed=false;
1376 0 : rInfo.bCanConvToPath =false;
1377 0 : rInfo.bCanConvToPoly =false;
1378 0 : rInfo.bCanConvToPathLineToArea=false;
1379 0 : rInfo.bCanConvToPolyLineToArea=false;
1380 0 : rInfo.bCanConvToContour = false;
1381 0 : }
1382 :
1383 :
1384 :
1385 0 : sal_uInt16 SdrTableObj::GetObjIdentifier() const
1386 : {
1387 0 : return static_cast<sal_uInt16>(OBJ_TABLE);
1388 : }
1389 :
1390 :
1391 :
1392 0 : void SdrTableObj::SetPage(SdrPage* pNewPage)
1393 : {
1394 0 : SdrTextObj::SetPage(pNewPage);
1395 0 : }
1396 :
1397 :
1398 :
1399 0 : void SdrTableObj::SetModel(SdrModel* pNewModel)
1400 : {
1401 0 : SdrModel* pOldModel = GetModel();
1402 0 : if( pNewModel != pOldModel )
1403 : {
1404 0 : SdrTextObj::SetModel(pNewModel);
1405 :
1406 0 : if( mpImpl )
1407 : {
1408 0 : mpImpl->SetModel( pOldModel, pNewModel );
1409 :
1410 0 : if( !maLogicRect.IsEmpty() )
1411 : {
1412 0 : aRect = maLogicRect;
1413 0 : mpImpl->LayoutTable( aRect, false, false );
1414 : }
1415 : }
1416 : }
1417 0 : }
1418 :
1419 :
1420 :
1421 0 : void SdrTableObj::TakeTextRect( SdrOutliner& rOutliner, Rectangle& rTextRect, bool bNoEditText, Rectangle* pAnchorRect, bool bLineWidth ) const
1422 : {
1423 0 : if( mpImpl )
1424 0 : TakeTextRect( mpImpl->maEditPos, rOutliner, rTextRect, bNoEditText, pAnchorRect, bLineWidth );
1425 0 : }
1426 :
1427 :
1428 :
1429 0 : void SdrTableObj::TakeTextRect( const CellPos& rPos, SdrOutliner& rOutliner, Rectangle& rTextRect, bool bNoEditText, Rectangle* pAnchorRect, bool /*bLineWidth*/ ) const
1430 : {
1431 0 : if( !mpImpl )
1432 0 : return;
1433 :
1434 0 : CellRef xCell( mpImpl->getCell( rPos ) );
1435 0 : if( !xCell.is() )
1436 0 : return;
1437 :
1438 0 : Rectangle aAnkRect;
1439 0 : TakeTextAnchorRect( rPos, aAnkRect );
1440 :
1441 0 : SdrTextVertAdjust eVAdj=xCell->GetTextVerticalAdjust();
1442 :
1443 0 : sal_uIntPtr nStat0=rOutliner.GetControlWord();
1444 0 : Size aNullSize;
1445 0 : nStat0 |= EE_CNTRL_AUTOPAGESIZE;
1446 0 : rOutliner.SetControlWord(nStat0);
1447 0 : rOutliner.SetMinAutoPaperSize(aNullSize);
1448 0 : rOutliner.SetMaxAutoPaperSize(aAnkRect.GetSize());
1449 0 : rOutliner.SetPaperSize(aAnkRect.GetSize());
1450 :
1451 : // #103516# New try with _BLOCK for hor and ver after completely
1452 : // supporting full width for vertical text.
1453 : // if( SDRTEXTHORZADJUST_BLOCK == eHAdj && !IsVerticalWriting())
1454 : // {
1455 0 : rOutliner.SetMinAutoPaperSize(Size(aAnkRect.GetWidth(), 0));
1456 : // }
1457 : // else if(SDRTEXTVERTADJUST_BLOCK == eVAdj && IsVerticalWriting())
1458 : // {
1459 : // rOutliner.SetMinAutoPaperSize(Size(0, aAnkRect.GetHeight()));
1460 : // }
1461 :
1462 :
1463 :
1464 : // set text at outliner, maybe from edit outliner
1465 0 : OutlinerParaObject* pPara= xCell->GetOutlinerParaObject();
1466 0 : if (pEdtOutl && !bNoEditText && mpImpl->mxActiveCell == xCell )
1467 0 : pPara=pEdtOutl->CreateParaObject();
1468 :
1469 0 : if (pPara)
1470 : {
1471 0 : const bool bHitTest = pModel && (&pModel->GetHitTestOutliner() == &rOutliner);
1472 :
1473 0 : const SdrTextObj* pTestObj = rOutliner.GetTextObj();
1474 0 : if( !pTestObj || !bHitTest || (pTestObj != this) || (pTestObj->GetOutlinerParaObject() != xCell->GetOutlinerParaObject()) )
1475 : {
1476 0 : if( bHitTest ) // #i33696# take back fix #i27510#
1477 0 : rOutliner.SetTextObj( this );
1478 :
1479 0 : rOutliner.SetUpdateMode(true);
1480 0 : rOutliner.SetText(*pPara);
1481 : }
1482 : }
1483 : else
1484 : {
1485 0 : rOutliner.SetTextObj( NULL );
1486 : }
1487 :
1488 0 : if (pEdtOutl && !bNoEditText && pPara && mpImpl->mxActiveCell == xCell )
1489 0 : delete pPara;
1490 :
1491 0 : rOutliner.SetUpdateMode(true);
1492 0 : rOutliner.SetControlWord(nStat0);
1493 :
1494 0 : Point aTextPos(aAnkRect.TopLeft());
1495 0 : Size aTextSiz(rOutliner.GetPaperSize());
1496 0 : if (eVAdj==SDRTEXTVERTADJUST_CENTER || eVAdj==SDRTEXTVERTADJUST_BOTTOM)
1497 : {
1498 0 : long nFreeHgt=aAnkRect.GetHeight()-aTextSiz.Height();
1499 0 : if (eVAdj==SDRTEXTVERTADJUST_CENTER)
1500 0 : aTextPos.Y()+=nFreeHgt/2;
1501 0 : if (eVAdj==SDRTEXTVERTADJUST_BOTTOM)
1502 0 : aTextPos.Y()+=nFreeHgt;
1503 : }
1504 :
1505 0 : if (pAnchorRect)
1506 0 : *pAnchorRect=aAnkRect;
1507 :
1508 0 : rTextRect=Rectangle(aTextPos,aTextSiz);
1509 : }
1510 :
1511 :
1512 :
1513 0 : const CellRef& SdrTableObj::getActiveCell() const
1514 : {
1515 0 : if( mpImpl )
1516 : {
1517 0 : if( !mpImpl->mxActiveCell.is() )
1518 : {
1519 0 : CellPos aPos;
1520 0 : const_cast< SdrTableObj* >(this)->setActiveCell( aPos );
1521 : }
1522 0 : return mpImpl->mxActiveCell;
1523 : }
1524 : else
1525 : {
1526 0 : static CellRef xCell;
1527 0 : return xCell;
1528 : }
1529 : }
1530 :
1531 :
1532 :
1533 0 : sal_Int32 SdrTableObj::getColumnCount() const
1534 : {
1535 0 : return mpImpl ? mpImpl->getColumnCount() : 0;
1536 : }
1537 :
1538 :
1539 :
1540 0 : void SdrTableObj::setActiveCell( const CellPos& rPos )
1541 : {
1542 0 : if( mpImpl && mpImpl->mxTable.is() ) try
1543 : {
1544 0 : mpImpl->mxActiveCell.set( dynamic_cast< Cell* >( mpImpl->mxTable->getCellByPosition( rPos.mnCol, rPos.mnRow ).get() ) );
1545 0 : if( mpImpl->mxActiveCell.is() && mpImpl->mxActiveCell->isMerged() )
1546 : {
1547 0 : CellPos aOrigin;
1548 0 : findMergeOrigin( mpImpl->mxTable.get(), rPos.mnCol, rPos.mnRow, aOrigin.mnCol, aOrigin.mnRow );
1549 0 : mpImpl->mxActiveCell.set( dynamic_cast< Cell* >( mpImpl->mxTable->getCellByPosition( aOrigin.mnCol, aOrigin.mnRow ).get() ) );
1550 0 : mpImpl->maEditPos = aOrigin;
1551 : }
1552 : else
1553 : {
1554 0 : mpImpl->maEditPos = rPos;
1555 : }
1556 : }
1557 0 : catch( Exception& )
1558 : {
1559 : OSL_FAIL("SdrTableObj::setActiveCell(), exception caught!");
1560 : }
1561 0 : }
1562 :
1563 :
1564 :
1565 0 : void SdrTableObj::getActiveCellPos( CellPos& rPos ) const
1566 : {
1567 0 : rPos = mpImpl->maEditPos;
1568 0 : }
1569 :
1570 :
1571 :
1572 0 : void SdrTableObj::getCellBounds( const CellPos& rPos, ::Rectangle& rCellRect )
1573 : {
1574 0 : if( mpImpl )
1575 : {
1576 0 : CellRef xCell( mpImpl->getCell( rPos ) );
1577 0 : if( xCell.is() )
1578 0 : rCellRect = xCell->getCellRect();
1579 : }
1580 0 : }
1581 :
1582 :
1583 :
1584 0 : void SdrTableObj::TakeTextAnchorRect(Rectangle& rAnchorRect) const
1585 : {
1586 0 : if( mpImpl )
1587 0 : TakeTextAnchorRect( mpImpl->maEditPos, rAnchorRect );
1588 0 : }
1589 :
1590 :
1591 :
1592 0 : void SdrTableObj::TakeTextAnchorRect( const CellPos& rPos, Rectangle& rAnchorRect ) const
1593 : {
1594 0 : Rectangle aAnkRect(aRect);
1595 :
1596 0 : if( mpImpl )
1597 : {
1598 0 : CellRef xCell( mpImpl->getCell( rPos ) );
1599 0 : if( xCell.is() )
1600 0 : xCell->TakeTextAnchorRect( aAnkRect );
1601 : }
1602 :
1603 0 : ImpJustifyRect(aAnkRect);
1604 0 : rAnchorRect=aAnkRect;
1605 0 : }
1606 :
1607 :
1608 :
1609 0 : void SdrTableObj::TakeTextEditArea(Size* pPaperMin, Size* pPaperMax, Rectangle* pViewInit, Rectangle* pViewMin) const
1610 : {
1611 0 : if( mpImpl )
1612 0 : TakeTextEditArea( mpImpl->maEditPos, pPaperMin, pPaperMax, pViewInit, pViewMin );
1613 0 : }
1614 :
1615 :
1616 :
1617 0 : void SdrTableObj::TakeTextEditArea( const CellPos& rPos, Size* pPaperMin, Size* pPaperMax, Rectangle* pViewInit, Rectangle* pViewMin ) const
1618 : {
1619 0 : Size aPaperMin,aPaperMax;
1620 0 : Rectangle aViewInit;
1621 0 : TakeTextAnchorRect( rPos, aViewInit );
1622 :
1623 0 : Size aAnkSiz(aViewInit.GetSize());
1624 0 : aAnkSiz.Width()--; aAnkSiz.Height()--; // weil GetSize() ein draufaddiert
1625 :
1626 0 : Size aMaxSiz(aAnkSiz.Width(),1000000);
1627 0 : if (pModel!=NULL)
1628 : {
1629 0 : Size aTmpSiz(pModel->GetMaxObjSize());
1630 0 : if (aTmpSiz.Height()!=0)
1631 0 : aMaxSiz.Height()=aTmpSiz.Height();
1632 : }
1633 :
1634 0 : CellRef xCell( mpImpl->getCell( rPos ) );
1635 0 : SdrTextVertAdjust eVAdj = xCell.is() ? xCell->GetTextVerticalAdjust() : SDRTEXTVERTADJUST_TOP;
1636 :
1637 0 : aPaperMax=aMaxSiz;
1638 :
1639 0 : aPaperMin.Width() = aAnkSiz.Width();
1640 :
1641 0 : if (pViewMin!=NULL)
1642 : {
1643 0 : *pViewMin=aViewInit;
1644 0 : long nYFree=aAnkSiz.Height()-aPaperMin.Height();
1645 :
1646 0 : if (eVAdj==SDRTEXTVERTADJUST_TOP)
1647 : {
1648 0 : pViewMin->Bottom()-=nYFree;
1649 : }
1650 0 : else if (eVAdj==SDRTEXTVERTADJUST_BOTTOM)
1651 : {
1652 0 : pViewMin->Top()+=nYFree;
1653 : }
1654 : else
1655 : {
1656 0 : pViewMin->Top()+=nYFree/2;
1657 0 : pViewMin->Bottom()=pViewMin->Top()+aPaperMin.Height();
1658 : }
1659 : }
1660 :
1661 :
1662 0 : if(IsVerticalWriting())
1663 0 : aPaperMin.Width() = 0;
1664 : else
1665 0 : aPaperMin.Height() = 0;
1666 :
1667 0 : if (pPaperMin!=NULL) *pPaperMin=aPaperMin;
1668 0 : if (pPaperMax!=NULL) *pPaperMax=aPaperMax;
1669 0 : if (pViewInit!=NULL) *pViewInit=aViewInit;
1670 0 : }
1671 :
1672 :
1673 :
1674 0 : sal_uInt16 SdrTableObj::GetOutlinerViewAnchorMode() const
1675 : {
1676 0 : EVAnchorMode eRet=ANCHOR_TOP_LEFT;
1677 0 : CellRef xCell( getActiveCell() );
1678 0 : if( xCell.is() )
1679 : {
1680 0 : SdrTextVertAdjust eV=xCell->GetTextVerticalAdjust();
1681 :
1682 : {
1683 0 : if (eV==SDRTEXTVERTADJUST_TOP)
1684 : {
1685 0 : eRet=ANCHOR_TOP_LEFT;
1686 : }
1687 0 : else if (eV==SDRTEXTVERTADJUST_BOTTOM)
1688 : {
1689 0 : eRet=ANCHOR_BOTTOM_LEFT;
1690 : }
1691 : else
1692 : {
1693 0 : eRet=ANCHOR_VCENTER_LEFT;
1694 : }
1695 : }
1696 : }
1697 0 : return (sal_uInt16)eRet;
1698 : }
1699 :
1700 :
1701 :
1702 0 : OutlinerParaObject* SdrTableObj::GetEditOutlinerParaObject() const
1703 : {
1704 0 : return SdrTextObj::GetEditOutlinerParaObject();
1705 : }
1706 :
1707 0 : OUString SdrTableObj::TakeObjNameSingul() const
1708 : {
1709 0 : OUStringBuffer sName(ImpGetResStr(STR_ObjNameSingulTable));
1710 :
1711 0 : OUString aName(GetName());
1712 0 : if (!aName.isEmpty())
1713 : {
1714 0 : sName.append(' ');
1715 0 : sName.append('\'');
1716 0 : sName.append(aName);
1717 0 : sName.append('\'');
1718 : }
1719 :
1720 0 : return sName.makeStringAndClear();
1721 : }
1722 :
1723 :
1724 :
1725 0 : OUString SdrTableObj::TakeObjNamePlural() const
1726 : {
1727 0 : return ImpGetResStr(STR_ObjNamePluralTable);
1728 : }
1729 :
1730 :
1731 :
1732 0 : SdrTableObj* SdrTableObj::Clone() const
1733 : {
1734 0 : return CloneHelper< SdrTableObj >();
1735 : }
1736 :
1737 0 : SdrTableObj& SdrTableObj::operator=(const SdrTableObj& rObj)
1738 : {
1739 0 : if( this == &rObj )
1740 0 : return *this;
1741 : // call parent
1742 0 : SdrObject::operator=(rObj);
1743 :
1744 0 : TableModelNotifyGuard aGuard( mpImpl ? mpImpl->mxTable.get() : 0 );
1745 :
1746 0 : maLogicRect = rObj.maLogicRect;
1747 0 : aRect = rObj.aRect;
1748 0 : aGeo = rObj.aGeo;
1749 0 : eTextKind = rObj.eTextKind;
1750 0 : bTextFrame = rObj.bTextFrame;
1751 0 : aTextSize = rObj.aTextSize;
1752 0 : bTextSizeDirty = rObj.bTextSizeDirty;
1753 0 : bNoShear = rObj.bNoShear;
1754 0 : bNoRotate = rObj.bNoRotate;
1755 0 : bNoMirror = rObj.bNoMirror;
1756 0 : bDisableAutoWidthOnDragging = rObj.bDisableAutoWidthOnDragging;
1757 :
1758 0 : if( rObj.mpImpl )
1759 0 : *mpImpl = *rObj.mpImpl;
1760 0 : return *this;
1761 : }
1762 :
1763 :
1764 :
1765 0 : basegfx::B2DPolyPolygon SdrTableObj::TakeXorPoly() const
1766 : {
1767 0 : return SdrTextObj::TakeXorPoly();
1768 : }
1769 :
1770 :
1771 :
1772 0 : basegfx::B2DPolyPolygon SdrTableObj::TakeContour() const
1773 : {
1774 0 : return SdrTextObj::TakeContour();
1775 : }
1776 :
1777 :
1778 :
1779 0 : const Rectangle& SdrTableObj::GetSnapRect() const
1780 : {
1781 0 : return aRect;
1782 : }
1783 :
1784 :
1785 :
1786 0 : void SdrTableObj::NbcSetSnapRect(const Rectangle& rRect)
1787 : {
1788 0 : NbcSetLogicRect( rRect );
1789 0 : }
1790 :
1791 :
1792 :
1793 0 : const Rectangle& SdrTableObj::GetLogicRect() const
1794 : {
1795 0 : return maLogicRect;
1796 : }
1797 :
1798 :
1799 :
1800 0 : void SdrTableObj::RecalcSnapRect()
1801 : {
1802 0 : }
1803 :
1804 :
1805 :
1806 0 : sal_uInt32 SdrTableObj::GetSnapPointCount() const
1807 : {
1808 0 : return SdrTextObj::GetSnapPointCount();
1809 : }
1810 :
1811 :
1812 :
1813 :
1814 0 : Point SdrTableObj::GetSnapPoint(sal_uInt32 i) const
1815 : {
1816 0 : return SdrTextObj::GetSnapPoint(i);
1817 : }
1818 :
1819 :
1820 :
1821 0 : bool SdrTableObj::BegTextEdit(SdrOutliner& rOutl)
1822 : {
1823 0 : if( pEdtOutl != NULL )
1824 0 : return false;
1825 :
1826 0 : pEdtOutl=&rOutl;
1827 :
1828 0 : mbInEditMode = true;
1829 :
1830 0 : rOutl.Init( OUTLINERMODE_TEXTOBJECT );
1831 0 : rOutl.SetRefDevice( pModel->GetRefDevice() );
1832 :
1833 0 : bool bUpdMerk=rOutl.GetUpdateMode();
1834 0 : if (bUpdMerk) rOutl.SetUpdateMode(false);
1835 0 : Size aPaperMin;
1836 0 : Size aPaperMax;
1837 0 : Rectangle aEditArea;
1838 0 : TakeTextEditArea(&aPaperMin,&aPaperMax,&aEditArea,NULL);
1839 :
1840 0 : rOutl.SetMinAutoPaperSize(aPaperMin);
1841 0 : rOutl.SetMaxAutoPaperSize(aPaperMax);
1842 0 : rOutl.SetPaperSize(aPaperMax);
1843 :
1844 0 : if (bUpdMerk) rOutl.SetUpdateMode(true);
1845 :
1846 0 : sal_uIntPtr nStat=rOutl.GetControlWord();
1847 0 : nStat |= EE_CNTRL_AUTOPAGESIZE;
1848 0 : nStat &=~EE_CNTRL_STRETCHING;
1849 0 : rOutl.SetControlWord(nStat);
1850 :
1851 0 : OutlinerParaObject* pPara = GetOutlinerParaObject();
1852 0 : if(pPara)
1853 0 : rOutl.SetText(*pPara);
1854 :
1855 0 : rOutl.UpdateFields();
1856 0 : rOutl.ClearModifyFlag();
1857 :
1858 0 : return true;
1859 : }
1860 :
1861 :
1862 :
1863 0 : void SdrTableObj::EndTextEdit(SdrOutliner& rOutl)
1864 : {
1865 0 : if(rOutl.IsModified())
1866 : {
1867 0 : if( GetModel() && GetModel()->IsUndoEnabled() )
1868 0 : GetModel()->AddUndo( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*this) );
1869 :
1870 0 : OutlinerParaObject* pNewText = 0;
1871 0 : Paragraph* p1stPara = rOutl.GetParagraph( 0 );
1872 0 : sal_Int32 nParaAnz = rOutl.GetParagraphCount();
1873 :
1874 0 : if(p1stPara)
1875 : {
1876 0 : if(nParaAnz == 1)
1877 : {
1878 : // if its only one paragraph, check if it is empty
1879 0 : OUString aStr(rOutl.GetText(p1stPara));
1880 0 : if (aStr.isEmpty())
1881 : {
1882 : // gotcha!
1883 0 : nParaAnz = 0;
1884 0 : }
1885 : }
1886 :
1887 : // to remove the grey field background
1888 0 : rOutl.UpdateFields();
1889 :
1890 0 : if(nParaAnz != 0)
1891 : {
1892 : // create new text object
1893 0 : pNewText = rOutl.CreateParaObject( 0, nParaAnz );
1894 : }
1895 : }
1896 0 : SetOutlinerParaObject(pNewText);
1897 : }
1898 :
1899 0 : pEdtOutl = 0;
1900 0 : rOutl.Clear();
1901 0 : sal_uInt32 nStat = rOutl.GetControlWord();
1902 0 : nStat &= ~EE_CNTRL_AUTOPAGESIZE;
1903 0 : rOutl.SetControlWord(nStat);
1904 :
1905 0 : mbInEditMode = false;
1906 0 : }
1907 :
1908 :
1909 :
1910 0 : OutlinerParaObject* SdrTableObj::GetOutlinerParaObject() const
1911 : {
1912 0 : CellRef xCell( getActiveCell() );
1913 0 : if( xCell.is() )
1914 0 : return xCell->GetOutlinerParaObject();
1915 : else
1916 0 : return 0;
1917 : }
1918 :
1919 :
1920 :
1921 0 : void SdrTableObj::NbcSetOutlinerParaObject( OutlinerParaObject* pTextObject)
1922 : {
1923 0 : CellRef xCell( getActiveCell() );
1924 0 : if( xCell.is() )
1925 : {
1926 0 : if( pModel )
1927 : {
1928 : // Update HitTestOutliner
1929 0 : const SdrTextObj* pTestObj = pModel->GetHitTestOutliner().GetTextObj();
1930 0 : if( pTestObj && pTestObj->GetOutlinerParaObject() == xCell->GetOutlinerParaObject() )
1931 0 : pModel->GetHitTestOutliner().SetTextObj( NULL );
1932 : }
1933 :
1934 0 : xCell->SetOutlinerParaObject( pTextObject );
1935 :
1936 0 : SetTextSizeDirty();
1937 0 : NbcAdjustTextFrameWidthAndHeight();
1938 0 : }
1939 0 : }
1940 :
1941 :
1942 :
1943 0 : void SdrTableObj::NbcSetLogicRect(const Rectangle& rRect)
1944 : {
1945 0 : maLogicRect=rRect;
1946 0 : ImpJustifyRect(maLogicRect);
1947 0 : const bool bWidth = maLogicRect.getWidth() != aRect.getWidth();
1948 0 : const bool bHeight = maLogicRect.getHeight() != aRect.getHeight();
1949 0 : aRect=maLogicRect;
1950 0 : NbcAdjustTextFrameWidthAndHeight( !bHeight, !bWidth );
1951 0 : SetRectsDirty();
1952 0 : }
1953 :
1954 :
1955 :
1956 :
1957 0 : void SdrTableObj::AdjustToMaxRect( const Rectangle& rMaxRect, bool /* bShrinkOnly = false */ )
1958 : {
1959 0 : Rectangle aAdjustRect( rMaxRect );
1960 0 : aAdjustRect.setHeight( GetLogicRect().getHeight() );
1961 0 : SetLogicRect( aAdjustRect );
1962 0 : }
1963 :
1964 :
1965 :
1966 0 : void SdrTableObj::NbcMove(const Size& rSiz)
1967 : {
1968 0 : MoveRect(maLogicRect,rSiz);
1969 0 : SdrTextObj::NbcMove( rSiz );
1970 0 : if( mpImpl )
1971 0 : mpImpl->UpdateCells( aRect );
1972 0 : }
1973 :
1974 :
1975 :
1976 0 : void SdrTableObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
1977 : {
1978 0 : Rectangle aOldRect( maLogicRect );
1979 0 : ResizeRect(maLogicRect,rRef,xFact,yFact);
1980 :
1981 0 : aRect = maLogicRect;
1982 0 : NbcAdjustTextFrameWidthAndHeight( maLogicRect.GetHeight() == aOldRect.GetHeight(), maLogicRect.GetWidth() == aOldRect.GetWidth() );
1983 0 : SetRectsDirty();
1984 0 : }
1985 :
1986 :
1987 :
1988 0 : bool SdrTableObj::AdjustTextFrameWidthAndHeight(bool bHgt, bool bWdt)
1989 : {
1990 0 : Rectangle aNeuRect(maLogicRect);
1991 0 : bool bRet=AdjustTextFrameWidthAndHeight(aNeuRect,bHgt,bWdt);
1992 0 : if (bRet)
1993 : {
1994 0 : Rectangle aBoundRect0;
1995 0 : if (pUserCall!=NULL)
1996 0 : aBoundRect0=GetLastBoundRect();
1997 0 : aRect=aNeuRect;
1998 0 : SetRectsDirty();
1999 0 : SetChanged();
2000 0 : BroadcastObjectChange();
2001 0 : SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
2002 : }
2003 0 : return bRet;
2004 : }
2005 :
2006 :
2007 :
2008 0 : bool SdrTableObj::AdjustTextFrameWidthAndHeight(Rectangle& rR, bool bHeight, bool bWidth) const
2009 : {
2010 0 : if((pModel == NULL) || rR.IsEmpty() || !mpImpl || !mpImpl->mxTable.is() )
2011 0 : return false;
2012 :
2013 0 : Rectangle aRectangle( rR );
2014 0 : mpImpl->LayoutTable( aRectangle, !bWidth, !bHeight );
2015 :
2016 0 : if( aRectangle != rR )
2017 : {
2018 0 : rR = aRectangle;
2019 0 : return true;
2020 : }
2021 : else
2022 : {
2023 0 : return false;
2024 : }
2025 : }
2026 :
2027 :
2028 :
2029 0 : void SdrTableObj::NbcReformatText()
2030 : {
2031 0 : NbcAdjustTextFrameWidthAndHeight();
2032 0 : }
2033 :
2034 :
2035 :
2036 0 : void SdrTableObj::ReformatText()
2037 : {
2038 0 : Rectangle aBoundRect0;
2039 0 : if (pUserCall!=NULL)
2040 0 : aBoundRect0=GetLastBoundRect();
2041 0 : NbcReformatText();
2042 0 : SetChanged();
2043 0 : BroadcastObjectChange();
2044 0 : SendUserCall(SDRUSERCALL_RESIZE,aBoundRect0);
2045 0 : }
2046 :
2047 :
2048 :
2049 0 : bool SdrTableObj::IsVerticalWriting() const
2050 : {
2051 0 : const SvxWritingModeItem* pModeItem = dynamic_cast< const SvxWritingModeItem* >( &GetObjectItem( SDRATTR_TEXTDIRECTION ) );
2052 0 : return pModeItem && pModeItem->GetValue() == com::sun::star::text::WritingMode_TB_RL;
2053 : }
2054 :
2055 :
2056 :
2057 0 : void SdrTableObj::SetVerticalWriting(bool bVertical )
2058 : {
2059 0 : if( bVertical != IsVerticalWriting() )
2060 : {
2061 0 : SvxWritingModeItem aModeItem( com::sun::star::text::WritingMode_LR_TB, SDRATTR_TEXTDIRECTION );
2062 0 : SetObjectItem( aModeItem );
2063 : }
2064 0 : }
2065 :
2066 :
2067 :
2068 0 : WritingMode SdrTableObj::GetWritingMode() const
2069 : {
2070 0 : SfxStyleSheet* pStyle = GetStyleSheet();
2071 0 : if ( !pStyle )
2072 0 : return WritingMode_LR_TB;
2073 :
2074 0 : WritingMode eWritingMode = WritingMode_LR_TB;
2075 0 : const SfxItemSet &rSet = pStyle->GetItemSet();
2076 : const SfxPoolItem *pItem;
2077 :
2078 0 : if ( rSet.GetItemState( SDRATTR_TEXTDIRECTION, false, &pItem ) == SFX_ITEM_SET )
2079 0 : eWritingMode = static_cast< WritingMode >( static_cast< const SvxWritingModeItem * >( pItem )->GetValue() );
2080 :
2081 0 : if ( ( eWritingMode != WritingMode_TB_RL ) &&
2082 0 : ( rSet.GetItemState( EE_PARA_WRITINGDIR, false, &pItem ) == SFX_ITEM_SET ) )
2083 : {
2084 0 : if ( static_cast< const SvxFrameDirectionItem * >( pItem )->GetValue() == FRMDIR_HORI_LEFT_TOP )
2085 0 : eWritingMode = WritingMode_LR_TB;
2086 : else
2087 0 : eWritingMode = WritingMode_RL_TB;
2088 : }
2089 :
2090 0 : return eWritingMode;
2091 : }
2092 :
2093 :
2094 :
2095 : // gets base transformation and rectangle of object. If it's an SdrPathObj it fills the PolyPolygon
2096 : // with the base geometry and returns TRUE. Otherwise it returns FALSE.
2097 0 : bool SdrTableObj::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPolyPolygon& rPolyPolygon ) const
2098 : {
2099 0 : return SdrTextObj::TRGetBaseGeometry( rMatrix, rPolyPolygon );
2100 : }
2101 :
2102 :
2103 :
2104 : // sets the base geometry of the object using infos contained in the homogen 3x3 matrix.
2105 : // If it's an SdrPathObj it will use the provided geometry information. The Polygon has
2106 : // to use (0,0) as upper left and will be scaled to the given size in the matrix.
2107 0 : void SdrTableObj::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const basegfx::B2DPolyPolygon& rPolyPolygon )
2108 : {
2109 0 : SdrTextObj::TRSetBaseGeometry( rMatrix, rPolyPolygon );
2110 0 : }
2111 :
2112 :
2113 :
2114 0 : bool SdrTableObj::IsRealyEdited() const
2115 : {
2116 0 : return pEdtOutl && pEdtOutl->IsModified();
2117 : }
2118 :
2119 :
2120 :
2121 0 : bool SdrTableObj::IsFontwork() const
2122 : {
2123 0 : return false;
2124 : }
2125 :
2126 :
2127 :
2128 0 : sal_uInt32 SdrTableObj::GetHdlCount() const
2129 : {
2130 0 : sal_uInt32 nCount = SdrTextObj::GetHdlCount();
2131 0 : const sal_Int32 nRowCount = mpImpl->getRowCount();
2132 0 : const sal_Int32 nColCount = mpImpl->getColumnCount();
2133 :
2134 0 : if( nRowCount && nColCount )
2135 0 : nCount += nRowCount + nColCount + 2 + 1;
2136 :
2137 0 : return nCount;
2138 : }
2139 :
2140 :
2141 :
2142 0 : void SdrTableObj::AddToHdlList(SdrHdlList& rHdlList) const
2143 : {
2144 0 : const sal_Int32 nRowCount = mpImpl->getRowCount();
2145 0 : const sal_Int32 nColCount = mpImpl->getColumnCount();
2146 :
2147 : // first add row handles
2148 0 : std::vector< TableEdgeHdl* > aRowEdges( nRowCount + 1 );
2149 :
2150 0 : for( sal_Int32 nRow = 0; nRow <= nRowCount; nRow++ )
2151 : {
2152 : sal_Int32 nEdgeMin, nEdgeMax;
2153 0 : const sal_Int32 nEdge = mpImpl->mpLayouter->getHorizontalEdge( nRow, &nEdgeMin, &nEdgeMax );
2154 0 : nEdgeMin -= nEdge;
2155 0 : nEdgeMax -= nEdge;
2156 :
2157 0 : Point aPoint( aRect.TopLeft() );
2158 0 : aPoint.Y() += nEdge;
2159 :
2160 0 : TableEdgeHdl* pHdl= new TableEdgeHdl(aPoint,true,nEdgeMin,nEdgeMax,nColCount+1);
2161 0 : pHdl->SetPointNum( nRow );
2162 0 : rHdlList.AddHdl( pHdl );
2163 0 : aRowEdges[nRow] = pHdl;
2164 : }
2165 :
2166 : // second add column handles
2167 0 : std::vector< TableEdgeHdl* > aColEdges( nColCount + 1 );
2168 :
2169 0 : for( sal_Int32 nCol = 0; nCol <= nColCount; nCol++ )
2170 : {
2171 : sal_Int32 nEdgeMin, nEdgeMax;
2172 0 : const sal_Int32 nEdge = mpImpl->mpLayouter->getVerticalEdge( nCol, &nEdgeMin, &nEdgeMax );
2173 0 : nEdgeMin -= nEdge;
2174 0 : nEdgeMax -= nEdge;
2175 :
2176 0 : Point aPoint( aRect.TopLeft() );
2177 0 : aPoint.X() += nEdge;
2178 :
2179 0 : TableEdgeHdl* pHdl = new TableEdgeHdl(aPoint,false,nEdgeMin,nEdgeMax, nRowCount+1);
2180 0 : pHdl->SetPointNum( nCol );
2181 0 : rHdlList.AddHdl( pHdl );
2182 0 : aColEdges[nCol] = pHdl;
2183 : }
2184 :
2185 : // now add visible edges to row and column handles
2186 0 : if( mpImpl->mpLayouter )
2187 : {
2188 0 : TableLayouter& rLayouter = *mpImpl->mpLayouter;
2189 :
2190 0 : sal_Int32 nY = 0;
2191 :
2192 0 : for( sal_Int32 nRow = 0; nRow <= nRowCount; ++nRow )
2193 : {
2194 0 : const sal_Int32 nRowHeight = (nRow == nRowCount) ? 0 : rLayouter.getRowHeight(nRow);
2195 0 : sal_Int32 nX = 0;
2196 :
2197 0 : for( sal_Int32 nCol = 0; nCol <= nColCount; ++nCol )
2198 : {
2199 0 : const sal_Int32 nColWidth = (nCol == nColCount) ? 0 : rLayouter.getColumnWidth(nCol);
2200 :
2201 0 : if( nRowHeight > 0 )
2202 : {
2203 0 : if( rLayouter.isEdgeVisible( nCol, nRow, false ) )
2204 0 : aColEdges[nCol]->SetEdge( nRow, nY, nY + nRowHeight, (rLayouter.getBorderLine( nCol, nRow, false ) == 0) ? Visible : Invisible);
2205 : }
2206 :
2207 0 : if( nColWidth > 0 )
2208 : {
2209 0 : if( rLayouter.isEdgeVisible( nCol, nRow, true ) )
2210 0 : aRowEdges[nRow]->SetEdge( nCol, nX, nX + nColWidth, (rLayouter.getBorderLine( nCol, nRow, true ) == 0) ? Visible : Invisible);
2211 : }
2212 :
2213 0 : nX += nColWidth;
2214 : }
2215 :
2216 0 : nY += nRowHeight;
2217 : }
2218 : }
2219 :
2220 : // add remaining handles
2221 0 : SdrHdl* pH=0;
2222 0 : rHdlList.AddHdl( pH = new TableBorderHdl( aRect, !IsTextEditActive() ) ); pH->SetMoveOutside( true );
2223 0 : rHdlList.AddHdl( pH = new SdrHdl(aRect.TopLeft(),HDL_UPLFT) ); pH->SetMoveOutside( true );
2224 0 : rHdlList.AddHdl( pH = new SdrHdl(aRect.TopCenter(),HDL_UPPER) ); pH->SetMoveOutside( true );
2225 0 : rHdlList.AddHdl( pH = new SdrHdl(aRect.TopRight(),HDL_UPRGT) ); pH->SetMoveOutside( true );
2226 0 : rHdlList.AddHdl( pH = new SdrHdl(aRect.LeftCenter(),HDL_LEFT) ); pH->SetMoveOutside( true );
2227 0 : rHdlList.AddHdl( pH = new SdrHdl(aRect.RightCenter(),HDL_RIGHT) ); pH->SetMoveOutside( true );
2228 0 : rHdlList.AddHdl( pH = new SdrHdl(aRect.BottomLeft(),HDL_LWLFT) ); pH->SetMoveOutside( true );
2229 0 : rHdlList.AddHdl( pH = new SdrHdl(aRect.BottomCenter(),HDL_LOWER) ); pH->SetMoveOutside( true );
2230 0 : rHdlList.AddHdl( pH = new SdrHdl(aRect.BottomRight(),HDL_LWRGT) ); pH->SetMoveOutside( true );
2231 :
2232 0 : sal_uIntPtr nHdlCount = rHdlList.GetHdlCount();
2233 0 : for( sal_uIntPtr nHdl = 0; nHdl < nHdlCount; nHdl++ )
2234 0 : rHdlList.GetHdl(nHdl)->SetObj((SdrObject*)this);
2235 0 : }
2236 :
2237 :
2238 :
2239 0 : SdrHdl* SdrTableObj::GetHdl(sal_uInt32 nHdlNum) const
2240 : {
2241 : // #i73248#
2242 : // Warn the user that this is ineffective and show alternatives. Should not be used at all.
2243 : OSL_FAIL("SdrTableObj::GetHdl(): ineffective, use AddToHdlList instead (!)");
2244 :
2245 : // to have an alternative, get single handle using the ineffective way
2246 0 : SdrHdl* pRetval = 0;
2247 0 : SdrHdlList aLocalList(0);
2248 0 : AddToHdlList(aLocalList);
2249 0 : const sal_uInt32 nHdlCount(aLocalList.GetHdlCount());
2250 :
2251 0 : if(nHdlCount && nHdlNum < nHdlCount)
2252 : {
2253 : // remove and remember. The other created handles will be deleted again with the
2254 : // destruction of the local list
2255 0 : pRetval = aLocalList.RemoveHdl(nHdlNum);
2256 : }
2257 :
2258 0 : return pRetval;
2259 : }
2260 :
2261 :
2262 : // Draging
2263 :
2264 0 : bool SdrTableObj::hasSpecialDrag() const
2265 : {
2266 0 : return true;
2267 : }
2268 :
2269 0 : bool SdrTableObj::beginSpecialDrag(SdrDragStat& rDrag) const
2270 : {
2271 0 : const SdrHdl* pHdl = rDrag.GetHdl();
2272 0 : const SdrHdlKind eHdl((pHdl == NULL) ? HDL_MOVE : pHdl->GetKind());
2273 :
2274 0 : switch( eHdl )
2275 : {
2276 : case HDL_UPLFT:
2277 : case HDL_UPPER:
2278 : case HDL_UPRGT:
2279 : case HDL_LEFT:
2280 : case HDL_RIGHT:
2281 : case HDL_LWLFT:
2282 : case HDL_LOWER:
2283 : case HDL_LWRGT:
2284 : case HDL_MOVE:
2285 : {
2286 0 : break;
2287 : }
2288 :
2289 : case HDL_USER:
2290 : {
2291 0 : rDrag.SetEndDragChangesAttributes(false);
2292 0 : rDrag.SetNoSnap(true);
2293 0 : break;
2294 : }
2295 :
2296 : default:
2297 : {
2298 0 : return false;
2299 : }
2300 : }
2301 :
2302 0 : return true;
2303 : }
2304 :
2305 0 : bool SdrTableObj::applySpecialDrag(SdrDragStat& rDrag)
2306 : {
2307 0 : bool bRet(true);
2308 0 : const SdrHdl* pHdl = rDrag.GetHdl();
2309 0 : const SdrHdlKind eHdl((pHdl == NULL) ? HDL_MOVE : pHdl->GetKind());
2310 :
2311 0 : switch( eHdl )
2312 : {
2313 : case HDL_UPLFT:
2314 : case HDL_UPPER:
2315 : case HDL_UPRGT:
2316 : case HDL_LEFT:
2317 : case HDL_RIGHT:
2318 : case HDL_LWLFT:
2319 : case HDL_LOWER:
2320 : case HDL_LWRGT:
2321 : {
2322 0 : const Rectangle aNewRectangle(ImpDragCalcRect(rDrag));
2323 :
2324 0 : if(aNewRectangle != aRect)
2325 : {
2326 0 : NbcSetLogicRect(aNewRectangle);
2327 : }
2328 :
2329 0 : break;
2330 : }
2331 :
2332 : case HDL_MOVE:
2333 : {
2334 0 : NbcMove( Size( rDrag.GetDX(), rDrag.GetDY() ) );
2335 0 : break;
2336 : }
2337 :
2338 : case HDL_USER:
2339 : {
2340 0 : rDrag.SetEndDragChangesAttributes(false);
2341 0 : rDrag.SetNoSnap(true);
2342 0 : const TableEdgeHdl* pEdgeHdl = dynamic_cast< const TableEdgeHdl* >( pHdl );
2343 :
2344 0 : if( pEdgeHdl )
2345 : {
2346 0 : if( GetModel() && IsInserted() )
2347 : {
2348 0 : rDrag.SetEndDragChangesAttributes(true);
2349 : }
2350 :
2351 0 : mpImpl->DragEdge( pEdgeHdl->IsHorizontalEdge(), pEdgeHdl->GetPointNum(), pEdgeHdl->GetValidDragOffset( rDrag ) );
2352 : }
2353 0 : break;
2354 : }
2355 :
2356 : default:
2357 : {
2358 0 : bRet = false;
2359 : }
2360 : }
2361 :
2362 0 : return bRet;
2363 : }
2364 :
2365 0 : OUString SdrTableObj::getSpecialDragComment(const SdrDragStat& rDrag) const
2366 : {
2367 0 : return SdrTextObj::getSpecialDragComment( rDrag );
2368 : }
2369 :
2370 0 : basegfx::B2DPolyPolygon SdrTableObj::getSpecialDragPoly(const SdrDragStat& rDrag) const
2371 : {
2372 0 : basegfx::B2DPolyPolygon aRetval;
2373 0 : const SdrHdl* pHdl = rDrag.GetHdl();
2374 :
2375 0 : if( pHdl && (HDL_USER == pHdl->GetKind()) )
2376 : {
2377 0 : const TableEdgeHdl* pEdgeHdl = dynamic_cast< const TableEdgeHdl* >( pHdl );
2378 :
2379 0 : if( pEdgeHdl )
2380 : {
2381 0 : aRetval = pEdgeHdl->getSpecialDragPoly( rDrag );
2382 : }
2383 : }
2384 :
2385 0 : return aRetval;
2386 : }
2387 :
2388 :
2389 : // Create
2390 :
2391 :
2392 0 : bool SdrTableObj::BegCreate(SdrDragStat& rStat)
2393 : {
2394 0 : rStat.SetOrtho4Possible();
2395 0 : Rectangle aRect1(rStat.GetStart(), rStat.GetNow());
2396 0 : aRect1.Justify();
2397 0 : rStat.SetActionRect(aRect1);
2398 0 : aRect = aRect1;
2399 0 : return true;
2400 : }
2401 :
2402 :
2403 :
2404 0 : bool SdrTableObj::MovCreate(SdrDragStat& rStat)
2405 : {
2406 0 : Rectangle aRect1;
2407 0 : rStat.TakeCreateRect(aRect1);
2408 0 : ImpJustifyRect(aRect1);
2409 0 : rStat.SetActionRect(aRect1);
2410 0 : aRect=aRect1; // fuer ObjName
2411 0 : SetBoundRectDirty();
2412 0 : bSnapRectDirty=true;
2413 0 : return true;
2414 : }
2415 :
2416 :
2417 :
2418 0 : bool SdrTableObj::EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd)
2419 : {
2420 0 : rStat.TakeCreateRect(aRect);
2421 0 : ImpJustifyRect(aRect);
2422 0 : return (eCmd==SDRCREATE_FORCEEND || rStat.GetPointAnz()>=2);
2423 : }
2424 :
2425 0 : void SdrTableObj::BrkCreate(SdrDragStat& /*rStat*/)
2426 : {
2427 0 : }
2428 :
2429 :
2430 :
2431 0 : bool SdrTableObj::BckCreate(SdrDragStat& /*rStat*/)
2432 : {
2433 0 : return true;
2434 : }
2435 :
2436 :
2437 :
2438 0 : basegfx::B2DPolyPolygon SdrTableObj::TakeCreatePoly(const SdrDragStat& rDrag) const
2439 : {
2440 0 : Rectangle aRect1;
2441 0 : rDrag.TakeCreateRect(aRect1);
2442 0 : aRect1.Justify();
2443 :
2444 0 : basegfx::B2DPolyPolygon aRetval;
2445 0 : const basegfx::B2DRange aRange(aRect1.Left(), aRect1.Top(), aRect1.Right(), aRect1.Bottom());
2446 0 : aRetval.append(basegfx::tools::createPolygonFromRect(aRange));
2447 0 : return aRetval;
2448 : }
2449 :
2450 :
2451 :
2452 0 : Pointer SdrTableObj::GetCreatePointer() const
2453 : {
2454 0 : return Pointer(POINTER_CROSS);
2455 : }
2456 :
2457 :
2458 :
2459 0 : void SdrTableObj::createCell( CellRef& xNewCell )
2460 : {
2461 0 : xNewCell = Cell::create( *this, 0 );
2462 0 : }
2463 :
2464 :
2465 :
2466 0 : SdrObjGeoData *SdrTableObj::NewGeoData() const
2467 : {
2468 0 : return new TableObjectGeoData;
2469 : }
2470 :
2471 :
2472 :
2473 0 : void SdrTableObj::SaveGeoData(SdrObjGeoData& rGeo) const
2474 : {
2475 : DBG_ASSERT( dynamic_cast< TableObjectGeoData* >( &rGeo ), "svx::SdrTableObj::SaveGeoData(), illegal geo data!" );
2476 0 : SdrTextObj::SaveGeoData (rGeo);
2477 :
2478 0 : ((TableObjectGeoData &) rGeo).maLogicRect = maLogicRect;
2479 0 : }
2480 :
2481 :
2482 :
2483 0 : void SdrTableObj::RestGeoData(const SdrObjGeoData& rGeo)
2484 : {
2485 : DBG_ASSERT( dynamic_cast< const TableObjectGeoData* >( &rGeo ), "svx::SdrTableObj::SaveGeoData(), illegal geo data!" );
2486 :
2487 0 : maLogicRect = ((TableObjectGeoData &) rGeo).maLogicRect;
2488 :
2489 0 : SdrTextObj::RestGeoData (rGeo);
2490 :
2491 0 : if( mpImpl )
2492 0 : mpImpl->LayoutTable( aRect, false, false );
2493 0 : ActionChanged();
2494 0 : }
2495 :
2496 :
2497 :
2498 0 : SdrTableObj* SdrTableObj::CloneRange( const CellPos& rStart, const CellPos& rEnd )
2499 : {
2500 0 : const sal_Int32 nColumns = rEnd.mnCol - rStart.mnCol + 1;
2501 0 : const sal_Int32 nRows = rEnd.mnRow - rStart.mnRow + 1;
2502 :
2503 0 : SdrTableObj* pNewTableObj = new SdrTableObj( GetModel(), GetCurrentBoundRect(), nColumns, nRows);
2504 0 : pNewTableObj->setTableStyleSettings( getTableStyleSettings() );
2505 0 : pNewTableObj->setTableStyle( getTableStyle() );
2506 :
2507 0 : Reference< XTable > xTable( getTable() );
2508 0 : Reference< XTable > xNewTable( pNewTableObj->getTable() );
2509 :
2510 0 : if( !xTable.is() || !xNewTable.is() )
2511 : {
2512 0 : delete pNewTableObj;
2513 0 : return 0;
2514 : }
2515 :
2516 : // copy cells
2517 0 : for( sal_Int32 nRow = 0; nRow < nRows; ++nRow )
2518 : {
2519 0 : for( sal_Int32 nCol = 0; nCol < nColumns; ++nCol ) try
2520 : {
2521 0 : CellRef xTargetCell( dynamic_cast< Cell* >( xNewTable->getCellByPosition( nCol, nRow ).get() ) );
2522 0 : if( xTargetCell.is() )
2523 0 : xTargetCell->cloneFrom( dynamic_cast< Cell* >( xTable->getCellByPosition( rStart.mnCol + nCol, rStart.mnRow + nRow ).get() ) );
2524 : }
2525 0 : catch( Exception& )
2526 : {
2527 : OSL_FAIL( "svx::SvxTableController::GetMarkedObjModel(), exception caught!" );
2528 : }
2529 : }
2530 :
2531 : // copy row heights
2532 0 : Reference< XTableRows > xNewRows( xNewTable->getRows(), UNO_QUERY_THROW );
2533 0 : const OUString sHeight( "Height" );
2534 0 : for( sal_Int32 nRow = 0; nRow < nRows; ++nRow )
2535 : {
2536 0 : Reference< XPropertySet > xNewSet( xNewRows->getByIndex( nRow ), UNO_QUERY_THROW );
2537 0 : xNewSet->setPropertyValue( sHeight, Any( mpImpl->mpLayouter->getRowHeight( rStart.mnRow + nRow ) ) );
2538 0 : }
2539 :
2540 : // copy column widths
2541 0 : Reference< XTableColumns > xNewColumns( xNewTable->getColumns(), UNO_QUERY_THROW );
2542 0 : const OUString sWidth( "Width" );
2543 0 : for( sal_Int32 nCol = 0; nCol < nColumns; ++nCol )
2544 : {
2545 0 : Reference< XPropertySet > xNewSet( xNewColumns->getByIndex( nCol ), UNO_QUERY_THROW );
2546 0 : xNewSet->setPropertyValue( sWidth, Any( mpImpl->mpLayouter->getColumnWidth( rStart.mnCol + nCol ) ) );
2547 0 : }
2548 :
2549 0 : pNewTableObj->NbcReformatText();
2550 0 : pNewTableObj->SetLogicRect( pNewTableObj->GetCurrentBoundRect() );
2551 :
2552 0 : return pNewTableObj;
2553 : }
2554 :
2555 :
2556 :
2557 0 : void SdrTableObj::DistributeColumns( sal_Int32 nFirstColumn, sal_Int32 nLastColumn )
2558 : {
2559 0 : if( mpImpl && mpImpl->mpLayouter )
2560 : {
2561 0 : TableModelNotifyGuard aGuard( mpImpl->mxTable.get() );
2562 0 : mpImpl->mpLayouter->DistributeColumns( aRect, nFirstColumn, nLastColumn );
2563 : }
2564 0 : }
2565 :
2566 :
2567 :
2568 0 : void SdrTableObj::DistributeRows( sal_Int32 nFirstRow, sal_Int32 nLastRow )
2569 : {
2570 0 : if( mpImpl && mpImpl->mpLayouter )
2571 : {
2572 0 : TableModelNotifyGuard aGuard( mpImpl->mxTable.get() );
2573 0 : mpImpl->mpLayouter->DistributeRows( aRect, nFirstRow, nLastRow );
2574 : }
2575 0 : }
2576 :
2577 :
2578 :
2579 0 : void SdrTableObj::SetChanged()
2580 : {
2581 0 : if( mpImpl )
2582 : {
2583 0 : mpImpl->LayoutTable( aRect, false, false );
2584 : }
2585 :
2586 0 : ::SdrTextObj::SetChanged();
2587 0 : }
2588 :
2589 :
2590 :
2591 0 : void SdrTableObj::uno_lock()
2592 : {
2593 0 : if( mpImpl && mpImpl->mxTable.is() )
2594 0 : mpImpl->mxTable->lockBroadcasts();
2595 0 : }
2596 :
2597 :
2598 :
2599 0 : void SdrTableObj::uno_unlock()
2600 : {
2601 0 : if( mpImpl && mpImpl->mxTable.is() )
2602 0 : mpImpl->mxTable->unlockBroadcasts();
2603 0 : }
2604 :
2605 :
2606 :
2607 :
2608 :
2609 0 : } }
2610 :
2611 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|