LCOV - code coverage report
Current view: top level - libreoffice/svx/source/table - svdotable.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 273 1102 24.8 %
Date: 2012-12-27 Functions: 60 149 40.3 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10