1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svx.hxx" 26 27 #include <com/sun/star/lang/DisposedException.hpp> 28 29 #include "tablecolumn.hxx" 30 #include "tableundo.hxx" 31 #include "svx/svdmodel.hxx" 32 #include "svx/svdotable.hxx" 33 34 // ----------------------------------------------------------------------------- 35 36 using ::rtl::OUString; 37 using namespace ::com::sun::star::uno; 38 using namespace ::com::sun::star::lang; 39 using namespace ::com::sun::star::container; 40 using namespace ::com::sun::star::table; 41 using namespace ::com::sun::star::beans; 42 43 // ----------------------------------------------------------------------------- 44 45 namespace sdr { namespace table { 46 47 const sal_Int32 Property_Width = 0; 48 const sal_Int32 Property_OptimalWidth = 1; 49 const sal_Int32 Property_IsVisible = 2; 50 const sal_Int32 Property_IsStartOfNewPage = 3; 51 52 // ----------------------------------------------------------------------------- 53 // TableRow 54 // ----------------------------------------------------------------------------- 55 56 TableColumn::TableColumn( const TableModelRef& xTableModel, sal_Int32 nColumn ) 57 : TableColumnBase( getStaticPropertySetInfo() ) 58 , mxTableModel( xTableModel ) 59 , mnColumn( nColumn ) 60 , mnWidth( 0 ) 61 , mbOptimalWidth( sal_True ) 62 , mbIsVisible( sal_True ) 63 , mbIsStartOfNewPage( sal_False ) 64 { 65 } 66 67 // ----------------------------------------------------------------------------- 68 69 TableColumn::~TableColumn() 70 { 71 } 72 73 // ----------------------------------------------------------------------------- 74 75 void TableColumn::dispose() 76 { 77 mxTableModel.clear(); 78 } 79 80 // ----------------------------------------------------------------------------- 81 82 void TableColumn::throwIfDisposed() const throw (::com::sun::star::uno::RuntimeException) 83 { 84 if( !mxTableModel.is() ) 85 throw DisposedException(); 86 } 87 88 // ----------------------------------------------------------------------------- 89 90 TableColumn& TableColumn::operator=( const TableColumn& r ) 91 { 92 mnWidth = r.mnWidth; 93 mbOptimalWidth = r.mbOptimalWidth; 94 mbIsVisible = r.mbIsVisible; 95 mbIsStartOfNewPage = r.mbIsStartOfNewPage; 96 97 return *this; 98 } 99 100 // ----------------------------------------------------------------------------- 101 // XCellRange 102 // ----------------------------------------------------------------------------- 103 104 Reference< XCell > SAL_CALL TableColumn::getCellByPosition( sal_Int32 nColumn, sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException) 105 { 106 throwIfDisposed(); 107 if( nColumn != 0 ) 108 throw IndexOutOfBoundsException(); 109 110 return mxTableModel->getCellByPosition( mnColumn, nRow ); 111 } 112 113 // ----------------------------------------------------------------------------- 114 115 Reference< XCellRange > SAL_CALL TableColumn::getCellRangeByPosition( sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom ) throw (IndexOutOfBoundsException, RuntimeException) 116 { 117 throwIfDisposed(); 118 if( (nTop >= 0 ) && (nLeft == 0) && (nBottom >= nTop) && (nRight == 0) ) 119 { 120 return mxTableModel->getCellRangeByPosition( mnColumn, nTop, mnColumn, nBottom ); 121 } 122 throw IndexOutOfBoundsException(); 123 } 124 125 // ----------------------------------------------------------------------------- 126 127 Reference< XCellRange > SAL_CALL TableColumn::getCellRangeByName( const OUString& /*aRange*/ ) throw (RuntimeException) 128 { 129 return Reference< XCellRange >(); 130 } 131 132 // ----------------------------------------------------------------------------- 133 // XNamed 134 // ----------------------------------------------------------------------------- 135 136 OUString SAL_CALL TableColumn::getName() throw (RuntimeException) 137 { 138 return maName; 139 } 140 141 // ----------------------------------------------------------------------------- 142 143 void SAL_CALL TableColumn::setName( const OUString& aName ) throw (RuntimeException) 144 { 145 maName = aName; 146 } 147 148 // ----------------------------------------------------------------------------- 149 // XFastPropertySet 150 // ----------------------------------------------------------------------------- 151 152 void SAL_CALL TableColumn::setFastPropertyValue( sal_Int32 nHandle, const Any& aValue ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, RuntimeException) 153 { 154 bool bOk = false; 155 bool bChange = false; 156 157 SdrModel* pModel = mxTableModel->getSdrTableObj()->GetModel(); 158 159 TableColumnUndo* pUndo = 0; 160 if( mxTableModel.is() && mxTableModel->getSdrTableObj() && mxTableModel->getSdrTableObj()->IsInserted() && pModel && pModel->IsUndoEnabled() ) 161 { 162 TableColumnRef xThis( this ); 163 pUndo = new TableColumnUndo( xThis ); 164 } 165 166 switch( nHandle ) 167 { 168 case Property_Width: 169 { 170 sal_Int32 nWidth = mnWidth; 171 bOk = aValue >>= nWidth; 172 if( bOk && (nWidth != mnWidth) ) 173 { 174 mnWidth = nWidth; 175 mbOptimalWidth = mnWidth == 0; 176 bChange = true; 177 } 178 break; 179 } 180 case Property_OptimalWidth: 181 { 182 sal_Bool bOptimalWidth = mbOptimalWidth; 183 bOk = aValue >>= bOptimalWidth; 184 if( bOk && (mbOptimalWidth != bOptimalWidth) ) 185 { 186 mbOptimalWidth = bOptimalWidth; 187 if( bOptimalWidth ) 188 mnWidth = 0; 189 bChange = true; 190 } 191 break; 192 } 193 case Property_IsVisible: 194 { 195 sal_Bool bIsVisible = mbIsVisible; 196 bOk = aValue >>= bIsVisible; 197 if( bOk && (mbIsVisible != bIsVisible) ) 198 { 199 mbIsVisible = bIsVisible; 200 bChange = true; 201 } 202 break; 203 } 204 205 case Property_IsStartOfNewPage: 206 { 207 sal_Bool bIsStartOfNewPage = mbIsStartOfNewPage; 208 bOk = aValue >>= bIsStartOfNewPage; 209 if( bOk && (mbIsStartOfNewPage != bIsStartOfNewPage) ) 210 { 211 mbIsStartOfNewPage = bIsStartOfNewPage; 212 bChange = true; 213 } 214 break; 215 } 216 default: 217 throw UnknownPropertyException(); 218 } 219 if( !bOk ) 220 throw IllegalArgumentException(); 221 222 if( bChange ) 223 { 224 if( pUndo ) 225 { 226 pModel->AddUndo( pUndo ); 227 pUndo = 0; 228 } 229 mxTableModel->setModified(sal_True); 230 } 231 232 if( pUndo ) 233 delete pUndo; 234 } 235 236 // ----------------------------------------------------------------------------- 237 238 Any SAL_CALL TableColumn::getFastPropertyValue( sal_Int32 nHandle ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) 239 { 240 switch( nHandle ) 241 { 242 case Property_Width: return Any( mnWidth ); 243 case Property_OptimalWidth: return Any( mbOptimalWidth ); 244 case Property_IsVisible: return Any( mbIsVisible ); 245 case Property_IsStartOfNewPage: return Any( mbIsStartOfNewPage ); 246 default: throw UnknownPropertyException(); 247 } 248 } 249 250 // ----------------------------------------------------------------------------- 251 252 rtl::Reference< ::comphelper::FastPropertySetInfo > TableColumn::getStaticPropertySetInfo() 253 { 254 static rtl::Reference< ::comphelper::FastPropertySetInfo > xInfo; 255 if( !xInfo.is() ) 256 { 257 ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 258 if( !xInfo.is() ) 259 { 260 comphelper::PropertyVector aProperties(6); 261 262 aProperties[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "Width" ) ); 263 aProperties[0].Handle = Property_Width; 264 aProperties[0].Type = ::getCppuType((const sal_Int32*)0); 265 aProperties[0].Attributes = 0; 266 267 aProperties[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "OptimalWidth" ) ); 268 aProperties[1].Handle = Property_OptimalWidth; 269 aProperties[1].Type = ::getBooleanCppuType(); 270 aProperties[1].Attributes = 0; 271 272 aProperties[2].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "IsVisible" ) ); 273 aProperties[2].Handle = Property_IsVisible; 274 aProperties[2].Type = ::getBooleanCppuType(); 275 aProperties[2].Attributes = 0; 276 277 aProperties[3].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "IsStartOfNewPage" ) ); 278 aProperties[3].Handle = Property_IsStartOfNewPage; 279 aProperties[3].Type = ::getBooleanCppuType(); 280 aProperties[3].Attributes = 0; 281 282 aProperties[4].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "Size" ) ); 283 aProperties[4].Handle = Property_Width; 284 aProperties[4].Type = ::getCppuType((const sal_Int32*)0); 285 aProperties[4].Attributes = 0; 286 287 aProperties[5].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "OptimalSize" ) ); 288 aProperties[5].Handle = Property_OptimalWidth; 289 aProperties[5].Type = ::getBooleanCppuType(); 290 aProperties[5].Attributes = 0; 291 292 xInfo.set( new ::comphelper::FastPropertySetInfo(aProperties) ); 293 } 294 } 295 296 return xInfo; 297 } 298 299 // ----------------------------------------------------------------------------- 300 301 } } 302