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 #include <vbahelper/helperdecl.hxx> 25 #include <cppuhelper/queryinterface.hxx> 26 27 #include "vbaworksheet.hxx" 28 29 #include <com/sun/star/beans/XPropertySet.hpp> 30 #include <com/sun/star/beans/XIntrospectionAccess.hpp> 31 #include <com/sun/star/beans/XIntrospection.hpp> 32 #include <com/sun/star/container/XNamed.hpp> 33 #include <com/sun/star/util/XProtectable.hpp> 34 #include <com/sun/star/table/XCellRange.hpp> 35 #include <com/sun/star/sheet/XSpreadsheetView.hpp> 36 #include <com/sun/star/sheet/XSpreadsheetDocument.hpp> 37 #include <com/sun/star/sheet/XCalculatable.hpp> 38 #include <com/sun/star/sheet/XCellRangeAddressable.hpp> 39 #include <com/sun/star/sheet/XCellRangeReferrer.hpp> 40 #include <com/sun/star/sheet/XSheetCellRange.hpp> 41 #include <com/sun/star/sheet/XSheetCellCursor.hpp> 42 #include <com/sun/star/sheet/XSheetAnnotationsSupplier.hpp> 43 #include <com/sun/star/sheet/XUsedAreaCursor.hpp> 44 #include <com/sun/star/sheet/XSpreadsheets.hpp> 45 #include <com/sun/star/sheet/XSheetPastable.hpp> 46 #include <com/sun/star/sheet/XCellAddressable.hpp> 47 #include <com/sun/star/sheet/XSheetOutline.hpp> 48 #include <com/sun/star/sheet/XSheetPageBreak.hpp> 49 #include <com/sun/star/sheet/XDataPilotTablesSupplier.hpp> 50 #include <com/sun/star/sheet/XNamedRanges.hpp> 51 #include <com/sun/star/util/XURLTransformer.hpp> 52 #include <com/sun/star/frame/XDispatchProvider.hpp> 53 #include <com/sun/star/frame/XComponentLoader.hpp> 54 #include <com/sun/star/table/XColumnRowRange.hpp> 55 #include <com/sun/star/table/XTableChartsSupplier.hpp> 56 #include <com/sun/star/drawing/XDrawPageSupplier.hpp> 57 #include <com/sun/star/drawing/XControlShape.hpp> 58 #include <com/sun/star/form/FormComponentType.hpp> 59 #include <com/sun/star/form/XFormsSupplier.hpp> 60 #include <ooo/vba/excel/XlEnableSelection.hpp> 61 #include <ooo/vba/excel/XlSheetVisibility.hpp> 62 #include <ooo/vba/excel/XWorkbook.hpp> 63 #include <ooo/vba/XControlProvider.hpp> 64 65 #include <comphelper/processfactory.hxx> 66 #include <vbahelper/vbashapes.hxx> 67 68 #include <tools/string.hxx> 69 70 //zhangyun showdataform 71 #include <sfx2/sfxdlg.hxx> 72 #include "scabstdlg.hxx" 73 #include "tabvwsh.hxx" 74 #include "scitems.hxx" 75 76 #include <svx/svdouno.hxx> 77 #include <svx/svdpage.hxx> 78 79 #include "cellsuno.hxx" 80 #include "drwlayer.hxx" 81 82 #include "scextopt.hxx" 83 #include "vbaoutline.hxx" 84 #include "vbarange.hxx" 85 #include "vbacomments.hxx" 86 #include "vbachartobjects.hxx" 87 #include "vbapivottables.hxx" 88 #include "vbaoleobject.hxx" 89 #include "vbaoleobjects.hxx" 90 #include "vbapagesetup.hxx" 91 #include "vbapagebreaks.hxx" 92 #include "vbaworksheets.hxx" 93 #include "vbahyperlinks.hxx" 94 #include "vbasheetobjects.hxx" 95 #include "vbanames.hxx" 96 97 #define STANDARDWIDTH 2267 98 #define STANDARDHEIGHT 427 99 #define DOESNOTEXIST -1 100 101 using namespace com::sun::star; 102 using namespace ooo::vba; 103 104 static void getNewSpreadsheetName (rtl::OUString &aNewName, rtl::OUString aOldName, uno::Reference <sheet::XSpreadsheetDocument>& xSpreadDoc ) 105 { 106 if (!xSpreadDoc.is()) 107 throw lang::IllegalArgumentException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "getNewSpreadsheetName() xSpreadDoc is null" ) ), uno::Reference< uno::XInterface >(), 1 ); 108 static rtl::OUString aUnderScre( RTL_CONSTASCII_USTRINGPARAM( "_" ) ); 109 int currentNum =2; 110 aNewName = aOldName + aUnderScre+ String::CreateFromInt32(currentNum) ; 111 SCTAB nTab = 0; 112 while ( ScVbaWorksheets::nameExists(xSpreadDoc,aNewName, nTab ) ) 113 { 114 aNewName = aOldName + aUnderScre + 115 String::CreateFromInt32(++currentNum) ; 116 } 117 } 118 119 static void removeAllSheets( uno::Reference <sheet::XSpreadsheetDocument>& xSpreadDoc, rtl::OUString aSheetName) 120 { 121 if (!xSpreadDoc.is()) 122 throw lang::IllegalArgumentException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "removeAllSheets() xSpreadDoc is null" ) ), uno::Reference< uno::XInterface >(), 1 ); 123 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets(); 124 uno::Reference <container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY ); 125 126 if ( xIndex.is() ) 127 { 128 uno::Reference<container::XNameContainer> xNameContainer(xSheets,uno::UNO_QUERY_THROW); 129 for (sal_Int32 i = xIndex->getCount() -1; i>= 1; i--) 130 { 131 uno::Reference< sheet::XSpreadsheet > xSheet(xIndex->getByIndex(i), uno::UNO_QUERY); 132 uno::Reference< container::XNamed > xNamed( xSheet, uno::UNO_QUERY_THROW ); 133 if (xNamed.is()) 134 { 135 xNameContainer->removeByName(xNamed->getName()); 136 } 137 } 138 139 uno::Reference< sheet::XSpreadsheet > xSheet(xIndex->getByIndex(0), uno::UNO_QUERY); 140 uno::Reference< container::XNamed > xNamed( xSheet, uno::UNO_QUERY_THROW ); 141 if (xNamed.is()) 142 { 143 xNamed->setName(aSheetName); 144 } 145 } 146 } 147 148 static uno::Reference<frame::XModel> 149 openNewDoc(rtl::OUString aSheetName ) 150 { 151 uno::Reference<frame::XModel> xModel; 152 try 153 { 154 uno::Reference< beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW ); 155 uno::Reference< uno::XComponentContext > xContext( xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), uno::UNO_QUERY_THROW ); 156 uno::Reference<lang::XMultiComponentFactory > xServiceManager( 157 xContext->getServiceManager(), uno::UNO_QUERY_THROW ); 158 159 uno::Reference <frame::XComponentLoader > xComponentLoader( 160 xServiceManager->createInstanceWithContext( 161 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ) ), 162 xContext ), uno::UNO_QUERY_THROW ); 163 164 uno::Reference<lang::XComponent > xComponent( xComponentLoader->loadComponentFromURL( 165 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:factory/scalc" ) ), 166 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_blank" ) ), 0, 167 uno::Sequence < ::com::sun::star::beans::PropertyValue >() ) ); 168 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( xComponent, uno::UNO_QUERY_THROW ); 169 if ( xSpreadDoc.is() ) 170 { 171 removeAllSheets(xSpreadDoc,aSheetName); 172 } 173 xModel.set(xSpreadDoc,uno::UNO_QUERY_THROW); 174 } 175 catch ( uno::Exception & /*e*/ ) 176 { 177 } 178 return xModel; 179 } 180 181 ScVbaWorksheet::ScVbaWorksheet( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext ) : WorksheetImpl_BASE( xParent, xContext ), mbVeryHidden( false ) 182 { 183 } 184 185 ScVbaWorksheet::ScVbaWorksheet(const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, 186 const uno::Reference< sheet::XSpreadsheet >& xSheet, 187 const uno::Reference< frame::XModel >& xModel ) throw (uno::RuntimeException) : WorksheetImpl_BASE( xParent, xContext ), mxSheet( xSheet ), mxModel(xModel), mbVeryHidden( false ) 188 { 189 } 190 191 ScVbaWorksheet::ScVbaWorksheet( uno::Sequence< uno::Any> const & args, 192 uno::Reference< uno::XComponentContext> const & xContext ) throw ( lang::IllegalArgumentException ) : WorksheetImpl_BASE( getXSomethingFromArgs< XHelperInterface >( args, 0 ), xContext ), mxModel( getXSomethingFromArgs< frame::XModel >( args, 1 ) ), mbVeryHidden( false ) 193 { 194 if ( args.getLength() < 3 ) 195 throw lang::IllegalArgumentException(); 196 197 rtl::OUString sSheetName; 198 args[2] >>= sSheetName; 199 200 uno::Reference< sheet::XSpreadsheetDocument > xSpreadDoc( mxModel, uno::UNO_QUERY_THROW ); 201 uno::Reference< container::XNameAccess > xNameAccess( xSpreadDoc->getSheets(), uno::UNO_QUERY_THROW ); 202 mxSheet.set( xNameAccess->getByName( sSheetName ), uno::UNO_QUERY_THROW ); 203 } 204 205 ScVbaWorksheet::~ScVbaWorksheet() 206 { 207 } 208 209 ::rtl::OUString 210 ScVbaWorksheet::getName() throw (uno::RuntimeException) 211 { 212 uno::Reference< container::XNamed > xNamed( getSheet(), uno::UNO_QUERY_THROW ); 213 return xNamed->getName(); 214 } 215 216 void 217 ScVbaWorksheet::setName(const ::rtl::OUString &rName ) throw (uno::RuntimeException) 218 { 219 uno::Reference< container::XNamed > xNamed( getSheet(), uno::UNO_QUERY_THROW ); 220 xNamed->setName( rName ); 221 } 222 223 sal_Int32 224 ScVbaWorksheet::getVisible() throw (uno::RuntimeException) 225 { 226 uno::Reference< beans::XPropertySet > xProps( getSheet(), uno::UNO_QUERY_THROW ); 227 bool bVisible = false; 228 xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsVisible" ) ) ) >>= bVisible; 229 using namespace ::ooo::vba::excel::XlSheetVisibility; 230 return bVisible ? xlSheetVisible : (mbVeryHidden ? xlSheetVeryHidden : xlSheetHidden); 231 } 232 233 void 234 ScVbaWorksheet::setVisible( sal_Int32 nVisible ) throw (uno::RuntimeException) 235 { 236 using namespace ::ooo::vba::excel::XlSheetVisibility; 237 bool bVisible = true; 238 switch( nVisible ) 239 { 240 case xlSheetVisible: case 1: // Excel accepts -1 and 1 for visible sheets 241 bVisible = true; 242 mbVeryHidden = false; 243 break; 244 case xlSheetHidden: 245 bVisible = false; 246 mbVeryHidden = false; 247 break; 248 case xlSheetVeryHidden: 249 bVisible = false; 250 mbVeryHidden = true; 251 break; 252 default: 253 throw uno::RuntimeException(); 254 } 255 uno::Reference< beans::XPropertySet > xProps( getSheet(), uno::UNO_QUERY_THROW ); 256 xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsVisible" ) ), uno::Any( bVisible ) ); 257 } 258 259 sal_Int16 260 ScVbaWorksheet::getIndex() throw (uno::RuntimeException) 261 { 262 return getSheetID() + 1; 263 } 264 265 sal_Int32 266 ScVbaWorksheet::getEnableSelection() throw (uno::RuntimeException) 267 { 268 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( getModel(), uno::UNO_QUERY_THROW ); 269 SCTAB nTab = 0; 270 if ( ScVbaWorksheets::nameExists(xSpreadDoc, getName(), nTab) ) 271 { 272 uno::Reference< frame::XModel > xModel( getModel(), uno::UNO_QUERY_THROW ); 273 ScDocument* pDoc = excel::getDocShell( xModel )->GetDocument(); 274 ScTableProtection* pProtect = pDoc->GetTabProtection(nTab); 275 sal_Bool bLockedCells = sal_False; 276 sal_Bool bUnlockedCells = sal_False; 277 if( pProtect ) 278 { 279 bLockedCells = pProtect->isOptionEnabled(ScTableProtection::SELECT_LOCKED_CELLS); 280 bUnlockedCells = pProtect->isOptionEnabled(ScTableProtection::SELECT_UNLOCKED_CELLS); 281 } 282 if( bLockedCells ) 283 return excel::XlEnableSelection::xlNoRestrictions; 284 if( bUnlockedCells ) 285 return excel::XlEnableSelection::xlUnlockedCells; 286 return excel::XlEnableSelection::xlNoSelection; 287 } 288 else 289 throw uno::RuntimeException(::rtl::OUString( 290 RTL_CONSTASCII_USTRINGPARAM( "Sheet Name does not exist. ") ), 291 uno::Reference< XInterface >() ); 292 return excel::XlEnableSelection::xlNoSelection; 293 } 294 295 296 void 297 ScVbaWorksheet::setEnableSelection( sal_Int32 nSelection ) throw (uno::RuntimeException) 298 { 299 if( (nSelection != excel::XlEnableSelection::xlNoRestrictions) && 300 (nSelection != excel::XlEnableSelection::xlUnlockedCells) && 301 (nSelection != excel::XlEnableSelection::xlNoSelection) ) 302 { 303 DebugHelper::exception(SbERR_BAD_PARAMETER, rtl::OUString() ); 304 } 305 306 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( getModel(), uno::UNO_QUERY_THROW ); 307 SCTAB nTab = 0; 308 if ( ScVbaWorksheets::nameExists(xSpreadDoc, getName(), nTab) ) 309 { 310 uno::Reference< frame::XModel > xModel( getModel(), uno::UNO_QUERY_THROW ); 311 ScDocument* pDoc = excel::getDocShell( xModel )->GetDocument(); 312 ScTableProtection* pProtect = pDoc->GetTabProtection(nTab); 313 // default is xlNoSelection 314 sal_Bool bLockedCells = sal_False; 315 sal_Bool bUnlockedCells = sal_False; 316 if( nSelection == excel::XlEnableSelection::xlNoRestrictions ) 317 { 318 bLockedCells = sal_True; 319 bUnlockedCells = sal_True; 320 } 321 else if( nSelection == excel::XlEnableSelection::xlUnlockedCells ) 322 { 323 bUnlockedCells = sal_True; 324 } 325 if( pProtect ) 326 { 327 pProtect->setOption( ScTableProtection::SELECT_LOCKED_CELLS, bLockedCells ); 328 pProtect->setOption( ScTableProtection::SELECT_UNLOCKED_CELLS, bUnlockedCells ); 329 } 330 } 331 else 332 throw uno::RuntimeException(::rtl::OUString( 333 RTL_CONSTASCII_USTRINGPARAM( "Sheet Name does not exist. ") ), 334 uno::Reference< XInterface >() ); 335 336 } 337 338 uno::Reference< beans::XPropertySet > ScVbaWorksheet::getFirstDBRangeProperties() throw (uno::RuntimeException) 339 { 340 uno::Reference< beans::XPropertySet > xModelProps( mxModel, uno::UNO_QUERY_THROW ); 341 uno::Reference< container::XIndexAccess > xDBRangesIA( xModelProps->getPropertyValue( 342 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DatabaseRanges" ) ) ), uno::UNO_QUERY_THROW ); 343 344 for( sal_Int32 nIndex = 0, nCount = xDBRangesIA->getCount(); nIndex < nCount; ++nIndex ) 345 { 346 uno::Reference< sheet::XCellRangeReferrer > xDBRange( xDBRangesIA->getByIndex( nIndex ), uno::UNO_QUERY_THROW ); 347 // check if the database area is on this sheet 348 uno::Reference< sheet::XCellRangeAddressable > xRangeAddr( xDBRange->getReferredCells(), uno::UNO_QUERY_THROW ); 349 if( getSheetID() == xRangeAddr->getRangeAddress().Sheet ) 350 return uno::Reference< beans::XPropertySet >( xDBRange, uno::UNO_QUERY_THROW ); 351 } 352 return uno::Reference< beans::XPropertySet >(); 353 } 354 355 sal_Bool SAL_CALL ScVbaWorksheet::getAutoFilterMode() throw (uno::RuntimeException) 356 { 357 uno::Reference< beans::XPropertySet > xDBRangeProps = getFirstDBRangeProperties(); 358 sal_Bool bAutoFilterMode = sal_False; 359 return 360 xDBRangeProps.is() && 361 (xDBRangeProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "AutoFilter" ) ) ) >>= bAutoFilterMode) && 362 bAutoFilterMode; 363 } 364 365 void SAL_CALL ScVbaWorksheet::setAutoFilterMode( sal_Bool bAutoFilterMode ) throw (uno::RuntimeException) 366 { 367 uno::Reference< beans::XPropertySet > xDBRangeProps = getFirstDBRangeProperties(); 368 if( xDBRangeProps.is() ) 369 xDBRangeProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "AutoFilter" ) ), uno::Any( bAutoFilterMode ) ); 370 } 371 372 uno::Reference< excel::XRange > 373 ScVbaWorksheet::getUsedRange() throw (uno::RuntimeException) 374 { 375 uno::Reference< sheet::XSheetCellRange > xSheetCellRange(getSheet(), uno::UNO_QUERY_THROW ); 376 uno::Reference< sheet::XSheetCellCursor > xSheetCellCursor( getSheet()->createCursorByRange( xSheetCellRange ), uno::UNO_QUERY_THROW ); 377 uno::Reference<sheet::XUsedAreaCursor> xUsedCursor(xSheetCellCursor,uno::UNO_QUERY_THROW); 378 xUsedCursor->gotoStartOfUsedArea( false ); 379 xUsedCursor->gotoEndOfUsedArea( true ); 380 uno::Reference< table::XCellRange > xRange( xSheetCellCursor, uno::UNO_QUERY); 381 return new ScVbaRange(this, mxContext, xRange); 382 } 383 384 uno::Reference< excel::XOutline > 385 ScVbaWorksheet::Outline( ) throw (uno::RuntimeException) 386 { 387 uno::Reference<sheet::XSheetOutline> xOutline(getSheet(),uno::UNO_QUERY_THROW); 388 return new ScVbaOutline( this, mxContext, xOutline); 389 } 390 391 uno::Reference< excel::XPageSetup > 392 ScVbaWorksheet::PageSetup( ) throw (uno::RuntimeException) 393 { 394 return new ScVbaPageSetup( this, mxContext, getSheet(), getModel() ); 395 } 396 397 uno::Any 398 ScVbaWorksheet::HPageBreaks( const uno::Any& aIndex ) throw (uno::RuntimeException) 399 { 400 uno::Reference< sheet::XSheetPageBreak > xSheetPageBreak(getSheet(),uno::UNO_QUERY_THROW); 401 uno::Reference< excel::XHPageBreaks > xHPageBreaks( new ScVbaHPageBreaks( this, mxContext, xSheetPageBreak)); 402 if ( aIndex.hasValue() ) 403 return xHPageBreaks->Item( aIndex, uno::Any()); 404 return uno::makeAny( xHPageBreaks ); 405 } 406 407 uno::Any 408 ScVbaWorksheet::VPageBreaks( const uno::Any& aIndex ) throw ( uno::RuntimeException ) 409 { 410 uno::Reference< sheet::XSheetPageBreak > xSheetPageBreak( getSheet(), uno::UNO_QUERY_THROW ); 411 uno::Reference< excel::XVPageBreaks > xVPageBreaks( new ScVbaVPageBreaks( this, mxContext, xSheetPageBreak ) ); 412 if( aIndex.hasValue() ) 413 return xVPageBreaks->Item( aIndex, uno::Any()); 414 return uno::makeAny( xVPageBreaks ); 415 } 416 417 sal_Int32 418 ScVbaWorksheet::getStandardWidth() throw (uno::RuntimeException) 419 { 420 return STANDARDWIDTH ; 421 } 422 423 sal_Int32 424 ScVbaWorksheet::getStandardHeight() throw (uno::RuntimeException) 425 { 426 return STANDARDHEIGHT; 427 } 428 429 sal_Bool 430 ScVbaWorksheet::getProtectionMode() throw (uno::RuntimeException) 431 { 432 return sal_False; 433 } 434 435 sal_Bool 436 ScVbaWorksheet::getProtectContents()throw (uno::RuntimeException) 437 { 438 uno::Reference<util::XProtectable > xProtectable(getSheet(), uno::UNO_QUERY_THROW); 439 return xProtectable->isProtected(); 440 } 441 442 sal_Bool 443 ScVbaWorksheet::getProtectDrawingObjects() throw (uno::RuntimeException) 444 { 445 return sal_False; 446 } 447 448 sal_Bool 449 ScVbaWorksheet::getProtectScenarios() throw (uno::RuntimeException) 450 { 451 return sal_False; 452 } 453 454 void 455 ScVbaWorksheet::Activate() throw (uno::RuntimeException) 456 { 457 uno::Reference< sheet::XSpreadsheetView > xSpreadsheet( 458 getModel()->getCurrentController(), uno::UNO_QUERY_THROW ); 459 xSpreadsheet->setActiveSheet(getSheet()); 460 } 461 462 void 463 ScVbaWorksheet::Select() throw (uno::RuntimeException) 464 { 465 Activate(); 466 } 467 468 void 469 ScVbaWorksheet::Move( const uno::Any& Before, const uno::Any& After ) throw (uno::RuntimeException) 470 { 471 uno::Reference<excel::XWorksheet> xSheet; 472 rtl::OUString aCurrSheetName = getName(); 473 474 if (!(Before >>= xSheet) && !(After >>=xSheet)&& !(Before.hasValue()) && !(After.hasValue())) 475 { 476 uno::Reference< sheet::XSheetCellCursor > xSheetCellCursor = getSheet()->createCursor( ); 477 uno::Reference<sheet::XUsedAreaCursor> xUsedCursor(xSheetCellCursor,uno::UNO_QUERY_THROW); 478 uno::Reference< table::XCellRange > xRange1( xSheetCellCursor, uno::UNO_QUERY); 479 // #FIXME needs worksheet as parent 480 uno::Reference<excel::XRange> xRange = new ScVbaRange( this, mxContext, xRange1); 481 if (xRange.is()) 482 xRange->Select(); 483 excel::implnCopy(mxModel); 484 uno::Reference<frame::XModel> xModel = openNewDoc(aCurrSheetName); 485 if (xModel.is()) 486 { 487 excel::implnPaste(xModel); 488 Delete(); 489 } 490 return ; 491 } 492 493 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( getModel(), uno::UNO_QUERY_THROW ); 494 SCTAB nDest = 0; 495 if ( ScVbaWorksheets::nameExists (xSpreadDoc, xSheet->getName(), nDest) ) 496 { 497 sal_Bool bAfter = After.hasValue(); 498 if (bAfter) 499 nDest++; 500 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets(); 501 xSheets->moveByName(aCurrSheetName,nDest); 502 } 503 } 504 505 void 506 ScVbaWorksheet::Copy( const uno::Any& Before, const uno::Any& After ) throw (uno::RuntimeException) 507 { 508 uno::Reference<excel::XWorksheet> xSheet; 509 rtl::OUString aCurrSheetName =getName(); 510 if (!(Before >>= xSheet) && !(After >>=xSheet)&& !(Before.hasValue()) && !(After.hasValue())) 511 { 512 uno::Reference< sheet::XSheetCellCursor > xSheetCellCursor = getSheet()->createCursor( ); 513 uno::Reference<sheet::XUsedAreaCursor> xUsedCursor(xSheetCellCursor,uno::UNO_QUERY_THROW); 514 uno::Reference< table::XCellRange > xRange1( xSheetCellCursor, uno::UNO_QUERY); 515 uno::Reference<excel::XRange> xRange = new ScVbaRange( this, mxContext, xRange1); 516 if (xRange.is()) 517 xRange->Select(); 518 excel::implnCopy(mxModel); 519 uno::Reference<frame::XModel> xModel = openNewDoc(aCurrSheetName); 520 if (xModel.is()) 521 { 522 excel::implnPaste(xModel); 523 } 524 return; 525 } 526 527 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( getModel(), uno::UNO_QUERY ); 528 SCTAB nDest = 0; 529 rtl::OUString aSheetName = xSheet->getName(); 530 if ( ScVbaWorksheets::nameExists (xSpreadDoc, aSheetName, nDest ) ) 531 { 532 sal_Bool bAfter = After.hasValue(); 533 if(bAfter) 534 nDest++; 535 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets(); 536 getNewSpreadsheetName(aSheetName,aCurrSheetName,xSpreadDoc); 537 xSheets->copyByName(aCurrSheetName,aSheetName,nDest); 538 } 539 } 540 541 542 void 543 ScVbaWorksheet::Paste( const uno::Any& Destination, const uno::Any& /*Link*/ ) throw (uno::RuntimeException) 544 { 545 // #TODO# #FIXME# Link is not used 546 uno::Reference<excel::XRange> xRange( Destination, uno::UNO_QUERY ); 547 if ( xRange.is() ) 548 xRange->Select(); 549 excel::implnPaste( mxModel ); 550 } 551 552 void 553 ScVbaWorksheet::Delete() throw (uno::RuntimeException) 554 { 555 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( getModel(), uno::UNO_QUERY_THROW ); 556 rtl::OUString aSheetName = getName(); 557 if ( xSpreadDoc.is() ) 558 { 559 SCTAB nTab = 0; 560 if (!ScVbaWorksheets::nameExists(xSpreadDoc, aSheetName, nTab )) 561 { 562 return; 563 } 564 uno::Reference<sheet::XSpreadsheets> xSheets = xSpreadDoc->getSheets(); 565 uno::Reference<container::XNameContainer> xNameContainer(xSheets,uno::UNO_QUERY_THROW); 566 xNameContainer->removeByName(aSheetName); 567 mxSheet.clear(); 568 } 569 } 570 571 uno::Reference< excel::XWorksheet > 572 ScVbaWorksheet::getSheetAtOffset(SCTAB offset) throw (uno::RuntimeException) 573 { 574 uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( getModel(), uno::UNO_QUERY_THROW ); 575 uno::Reference <sheet::XSpreadsheets> xSheets( xSpreadDoc->getSheets(), uno::UNO_QUERY_THROW ); 576 uno::Reference <container::XIndexAccess> xIndex( xSheets, uno::UNO_QUERY_THROW ); 577 578 SCTAB nIdx = 0; 579 if ( !ScVbaWorksheets::nameExists (xSpreadDoc, getName(), nIdx ) ) 580 return uno::Reference< excel::XWorksheet >(); 581 nIdx = nIdx + offset; 582 uno::Reference< sheet::XSpreadsheet > xSheet(xIndex->getByIndex(nIdx), uno::UNO_QUERY_THROW); 583 // parent will be the parent of 'this' worksheet 584 return new ScVbaWorksheet (getParent(), mxContext, xSheet, getModel()); 585 } 586 587 uno::Reference< excel::XWorksheet > 588 ScVbaWorksheet::getNext() throw (uno::RuntimeException) 589 { 590 return getSheetAtOffset(static_cast<SCTAB>(1)); 591 } 592 593 uno::Reference< excel::XWorksheet > 594 ScVbaWorksheet::getPrevious() throw (uno::RuntimeException) 595 { 596 return getSheetAtOffset(-1); 597 } 598 599 600 void 601 ScVbaWorksheet::Protect( const uno::Any& Password, const uno::Any& /*DrawingObjects*/, const uno::Any& /*Contents*/, const uno::Any& /*Scenarios*/, const uno::Any& /*UserInterfaceOnly*/ ) throw (uno::RuntimeException) 602 { 603 // #TODO# #FIXME# is there anything we can do witht the unused param 604 // can the implementation use anything else here 605 uno::Reference<util::XProtectable > xProtectable(getSheet(), uno::UNO_QUERY_THROW); 606 ::rtl::OUString aPasswd; 607 Password >>= aPasswd; 608 xProtectable->protect( aPasswd ); 609 } 610 611 void 612 ScVbaWorksheet::Unprotect( const uno::Any& Password ) throw (uno::RuntimeException) 613 { 614 uno::Reference<util::XProtectable > xProtectable(getSheet(), uno::UNO_QUERY_THROW); 615 ::rtl::OUString aPasswd; 616 Password >>= aPasswd; 617 xProtectable->unprotect( aPasswd ); 618 } 619 620 void 621 ScVbaWorksheet::Calculate() throw (uno::RuntimeException) 622 { 623 uno::Reference <sheet::XCalculatable> xReCalculate(getModel(), uno::UNO_QUERY_THROW); 624 xReCalculate->calculate(); 625 } 626 627 uno::Reference< excel::XRange > 628 ScVbaWorksheet::Range( const ::uno::Any& Cell1, const ::uno::Any& Cell2 ) throw (uno::RuntimeException) 629 { 630 uno::Reference< excel::XRange > xSheetRange( new ScVbaRange( this, mxContext 631 , uno::Reference< table::XCellRange >( getSheet(), uno::UNO_QUERY_THROW ) ) ); 632 return xSheetRange->Range( Cell1, Cell2 ); 633 } 634 635 void 636 ScVbaWorksheet::CheckSpelling( const uno::Any& /*CustomDictionary*/,const uno::Any& /*IgnoreUppercase*/,const uno::Any& /*AlwaysSuggest*/, const uno::Any& /*SpellingLang*/ ) throw (uno::RuntimeException) 637 { 638 // #TODO# #FIXME# unused params above, can we do anything with those 639 rtl::OUString url = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:SpellDialog")); 640 uno::Reference< frame::XModel > xModel( getModel() ); 641 dispatchRequests(xModel,url); 642 } 643 644 uno::Reference< excel::XRange > 645 ScVbaWorksheet::getSheetRange() throw (uno::RuntimeException) 646 { 647 uno::Reference< table::XCellRange > xRange( getSheet(),uno::UNO_QUERY_THROW ); 648 return uno::Reference< excel::XRange >( new ScVbaRange( this, mxContext, xRange ) ); 649 } 650 651 // These are hacks - we prolly (somehow) need to inherit 652 // the vbarange functionality here ... 653 uno::Reference< excel::XRange > 654 ScVbaWorksheet::Cells( const ::uno::Any &nRow, const ::uno::Any &nCol ) 655 throw (uno::RuntimeException) 656 { 657 // Performance optimization for often-called Cells method: 658 // Use a common helper method instead of creating a new ScVbaRange object 659 uno::Reference< table::XCellRange > xRange( getSheet(), uno::UNO_QUERY_THROW ); 660 return ScVbaRange::CellsHelper( this, mxContext, xRange, nRow, nCol ); 661 } 662 663 uno::Reference< excel::XRange > 664 ScVbaWorksheet::Rows(const uno::Any& aIndex ) throw (uno::RuntimeException) 665 { 666 return getSheetRange()->Rows( aIndex ); 667 } 668 669 uno::Reference< excel::XRange > 670 ScVbaWorksheet::Columns( const uno::Any& aIndex ) throw (uno::RuntimeException) 671 { 672 return getSheetRange()->Columns( aIndex ); 673 } 674 675 uno::Any SAL_CALL 676 ScVbaWorksheet::ChartObjects( const uno::Any& Index ) throw (uno::RuntimeException) 677 { 678 if ( !mxCharts.is() ) 679 { 680 uno::Reference< table::XTableChartsSupplier > xChartSupplier( getSheet(), uno::UNO_QUERY_THROW ); 681 uno::Reference< table::XTableCharts > xTableCharts = xChartSupplier->getCharts(); 682 683 uno::Reference< drawing::XDrawPageSupplier > xDrawPageSupplier( mxSheet, uno::UNO_QUERY_THROW ); 684 mxCharts = new ScVbaChartObjects( this, mxContext, xTableCharts, xDrawPageSupplier ); 685 } 686 if ( Index.hasValue() ) 687 { 688 uno::Reference< XCollection > xColl( mxCharts, uno::UNO_QUERY_THROW ); 689 return xColl->Item( Index, uno::Any() ); 690 } 691 else 692 return uno::makeAny( mxCharts ); 693 694 } 695 696 uno::Any SAL_CALL 697 ScVbaWorksheet::PivotTables( const uno::Any& Index ) throw (uno::RuntimeException) 698 { 699 uno::Reference< css::sheet::XSpreadsheet > xSheet = getSheet(); 700 uno::Reference< sheet::XDataPilotTablesSupplier > xTables(xSheet, uno::UNO_QUERY_THROW ) ; 701 uno::Reference< container::XIndexAccess > xIndexAccess( xTables->getDataPilotTables(), uno::UNO_QUERY_THROW ); 702 703 uno::Reference< XCollection > xColl( new ScVbaPivotTables( this, mxContext, xIndexAccess ) ); 704 if ( Index.hasValue() ) 705 return xColl->Item( Index, uno::Any() ); 706 return uno::makeAny( xColl ); 707 } 708 709 uno::Any SAL_CALL 710 ScVbaWorksheet::Comments( const uno::Any& Index ) throw (uno::RuntimeException) 711 { 712 uno::Reference< css::sheet::XSpreadsheet > xSheet = getSheet(); 713 uno::Reference< sheet::XSheetAnnotationsSupplier > xAnnosSupp( xSheet, uno::UNO_QUERY_THROW ); 714 uno::Reference< sheet::XSheetAnnotations > xAnnos( xAnnosSupp->getAnnotations(), uno::UNO_QUERY_THROW ); 715 uno::Reference< container::XIndexAccess > xIndexAccess( xAnnos, uno::UNO_QUERY_THROW ); 716 uno::Reference< XCollection > xColl( new ScVbaComments( this, mxContext, mxModel, xIndexAccess ) ); 717 if ( Index.hasValue() ) 718 return xColl->Item( Index, uno::Any() ); 719 return uno::makeAny( xColl ); 720 } 721 722 uno::Any SAL_CALL 723 ScVbaWorksheet::Hyperlinks( const uno::Any& aIndex ) throw (uno::RuntimeException) 724 { 725 /* The worksheet always returns the same Hyperlinks object. 726 See vbahyperlinks.hxx for more details. */ 727 if( !mxHlinks.is() ) 728 mxHlinks.set( new ScVbaHyperlinks( this, mxContext ) ); 729 if( aIndex.hasValue() ) 730 return uno::Reference< XCollection >( mxHlinks, uno::UNO_QUERY_THROW )->Item( aIndex, uno::Any() ); 731 return uno::Any( mxHlinks ); 732 } 733 734 uno::Any SAL_CALL 735 ScVbaWorksheet::Names( const css::uno::Any& aIndex ) throw (uno::RuntimeException) 736 { 737 // fake sheet-local names by returning all global names 738 // #163498# initialize Names object with correct parent (this worksheet) 739 // TODO: real sheet-local names... 740 uno::Reference< beans::XPropertySet > xProps( mxModel, uno::UNO_QUERY_THROW ); 741 uno::Reference< sheet::XNamedRanges > xNamedRanges( xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("NamedRanges") ) ), uno::UNO_QUERY_THROW ); 742 uno::Reference< XCollection > xNames( new ScVbaNames( this, mxContext, xNamedRanges, mxModel ) ); 743 if ( aIndex.hasValue() ) 744 return uno::Any( xNames->Item( aIndex, uno::Any() ) ); 745 return uno::Any( xNames ); 746 } 747 748 uno::Any SAL_CALL 749 ScVbaWorksheet::OLEObjects( const uno::Any& Index ) throw (uno::RuntimeException) 750 { 751 uno::Reference< sheet::XSpreadsheet > xSpreadsheet( getSheet(), uno::UNO_QUERY_THROW ); 752 uno::Reference< drawing::XDrawPageSupplier > xDrawPageSupplier( xSpreadsheet, uno::UNO_QUERY_THROW ); 753 uno::Reference< drawing::XDrawPage > xDrawPage( xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY_THROW ); 754 uno::Reference< container::XIndexAccess > xIndexAccess( xDrawPage, uno::UNO_QUERY_THROW ); 755 756 uno::Reference< excel::XOLEObjects >xOleObjects( new ScVbaOLEObjects( this, mxContext, xIndexAccess ) ); 757 if( Index.hasValue() ) 758 return xOleObjects->Item( Index, uno::Any() ); 759 return uno::Any( xOleObjects ); 760 } 761 762 uno::Any SAL_CALL 763 ScVbaWorksheet::Shapes( const uno::Any& aIndex ) throw (uno::RuntimeException) 764 { 765 uno::Reference< sheet::XSpreadsheet > xSpreadsheet( getSheet(), uno::UNO_QUERY_THROW ); 766 uno::Reference< drawing::XDrawPageSupplier > xDrawPageSupplier( xSpreadsheet, uno::UNO_QUERY_THROW ); 767 uno::Reference< drawing::XShapes > xShapes( xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY_THROW ); 768 uno::Reference< container::XIndexAccess > xIndexAccess( xShapes, uno::UNO_QUERY_THROW ); 769 770 uno::Reference< msforms::XShapes> xVbaShapes( new ScVbaShapes( this, mxContext, xIndexAccess, getModel() ) ); 771 if ( aIndex.hasValue() ) 772 return xVbaShapes->Item( aIndex, uno::Any() ); 773 return uno::makeAny( xVbaShapes ); 774 } 775 776 uno::Any SAL_CALL 777 ScVbaWorksheet::Buttons( const uno::Any& rIndex ) throw (uno::RuntimeException) 778 { 779 if( !mxButtons.is() ) 780 mxButtons.set( new ScVbaButtons( this, mxContext, mxModel, mxSheet ) ); 781 else 782 mxButtons->collectShapes(); 783 if( rIndex.hasValue() ) 784 return mxButtons->Item( rIndex, uno::Any() ); 785 return uno::Any( uno::Reference< XCollection >( mxButtons.get() ) ); 786 } 787 788 uno::Any SAL_CALL 789 ScVbaWorksheet::CheckBoxes( const uno::Any& /*rIndex*/ ) throw (uno::RuntimeException) 790 { 791 throw uno::RuntimeException(); 792 } 793 794 uno::Any SAL_CALL 795 ScVbaWorksheet::DropDowns( const uno::Any& /*rIndex*/ ) throw (uno::RuntimeException) 796 { 797 throw uno::RuntimeException(); 798 } 799 800 uno::Any SAL_CALL 801 ScVbaWorksheet::GroupBoxes( const uno::Any& /*rIndex*/ ) throw (uno::RuntimeException) 802 { 803 throw uno::RuntimeException(); 804 } 805 806 uno::Any SAL_CALL 807 ScVbaWorksheet::Labels( const uno::Any& /*rIndex*/ ) throw (uno::RuntimeException) 808 { 809 throw uno::RuntimeException(); 810 } 811 812 uno::Any SAL_CALL 813 ScVbaWorksheet::ListBoxes( const uno::Any& /*rIndex*/ ) throw (uno::RuntimeException) 814 { 815 throw uno::RuntimeException(); 816 } 817 818 uno::Any SAL_CALL 819 ScVbaWorksheet::OptionButtons( const uno::Any& /*rIndex*/ ) throw (uno::RuntimeException) 820 { 821 throw uno::RuntimeException(); 822 } 823 824 uno::Any SAL_CALL 825 ScVbaWorksheet::ScrollBars( const uno::Any& /*rIndex*/ ) throw (uno::RuntimeException) 826 { 827 throw uno::RuntimeException(); 828 } 829 830 uno::Any SAL_CALL 831 ScVbaWorksheet::Spinners( const uno::Any& /*rIndex*/ ) throw (uno::RuntimeException) 832 { 833 throw uno::RuntimeException(); 834 } 835 836 void SAL_CALL 837 ScVbaWorksheet::ShowDataForm( ) throw (uno::RuntimeException) 838 { 839 #ifdef VBA_OOBUILD_HACK 840 uno::Reference< frame::XModel > xModel( getModel(), uno::UNO_QUERY_THROW ); 841 ScTabViewShell* pTabViewShell = excel::getBestViewShell( xModel ); 842 843 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 844 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 845 846 AbstractScDataFormDlg* pDlg = pFact->CreateScDataFormDlg( pTabViewShell->GetDialogParent(),RID_SCDLG_DATAFORM, pTabViewShell); 847 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 848 849 pDlg->Execute(); 850 #else 851 throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Not implemented") ), uno::Reference< uno::XInterface >() ); 852 #endif 853 } 854 855 uno::Any SAL_CALL 856 ScVbaWorksheet::Evaluate( const ::rtl::OUString& Name ) throw (uno::RuntimeException) 857 { 858 // #TODO Evaluate allows other things to be evaluated, e.g. functions 859 // I think ( like SIN(3) etc. ) need to investigate that 860 // named Ranges also? e.g. [MyRange] if so need a list of named ranges 861 uno::Any aVoid; 862 return uno::Any( Range( uno::Any( Name ), aVoid ) ); 863 } 864 865 866 uno::Reference< beans::XIntrospectionAccess > SAL_CALL 867 ScVbaWorksheet::getIntrospection( ) throw (uno::RuntimeException) 868 { 869 return uno::Reference< beans::XIntrospectionAccess >(); 870 } 871 872 uno::Any SAL_CALL 873 ScVbaWorksheet::invoke( const ::rtl::OUString& aFunctionName, const uno::Sequence< uno::Any >& /*aParams*/, uno::Sequence< ::sal_Int16 >& /*aOutParamIndex*/, uno::Sequence< uno::Any >& /*aOutParam*/ ) throw (lang::IllegalArgumentException, script::CannotConvertException, reflection::InvocationTargetException, uno::RuntimeException) 874 { 875 OSL_TRACE("** ScVbaWorksheet::invoke( %s ), will barf", 876 rtl::OUStringToOString( aFunctionName, RTL_TEXTENCODING_UTF8 ).getStr() ); 877 878 throw uno::RuntimeException(); // unsupported operation 879 } 880 881 void SAL_CALL 882 ScVbaWorksheet::setValue( const ::rtl::OUString& aPropertyName, const uno::Any& aValue ) throw (beans::UnknownPropertyException, script::CannotConvertException, reflection::InvocationTargetException, uno::RuntimeException) 883 { 884 setDefaultPropByIntrospection( uno::makeAny( getValue( aPropertyName ) ), aValue ); 885 } 886 uno::Any SAL_CALL 887 ScVbaWorksheet::getValue( const ::rtl::OUString& aPropertyName ) throw (beans::UnknownPropertyException, uno::RuntimeException) 888 { 889 uno::Reference< drawing::XControlShape > xControlShape( getControlShape( aPropertyName ), uno::UNO_QUERY_THROW ); 890 891 uno::Reference<lang::XMultiComponentFactory > xServiceManager( mxContext->getServiceManager(), uno::UNO_QUERY_THROW ); 892 uno::Reference< XControlProvider > xControlProvider( xServiceManager->createInstanceWithContext( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.ControlProvider" ) ), mxContext ), uno::UNO_QUERY_THROW ); 893 uno::Reference< msforms::XControl > xControl( xControlProvider->createControl( xControlShape, getModel() ) ); 894 return uno::makeAny( xControl ); 895 } 896 897 ::sal_Bool SAL_CALL 898 ScVbaWorksheet::hasMethod( const ::rtl::OUString& /*aName*/ ) throw (uno::RuntimeException) 899 { 900 return sal_False; 901 } 902 903 uno::Reference< container::XNameAccess > 904 ScVbaWorksheet::getFormControls() 905 { 906 uno::Reference< container::XNameAccess > xFormControls; 907 try 908 { 909 uno::Reference< sheet::XSpreadsheet > xSpreadsheet( getSheet(), uno::UNO_QUERY_THROW ); 910 uno::Reference< drawing::XDrawPageSupplier > xDrawPageSupplier( xSpreadsheet, uno::UNO_QUERY_THROW ); 911 uno::Reference< form::XFormsSupplier > xFormSupplier( xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY_THROW ); 912 uno::Reference< container::XIndexAccess > xIndexAccess( xFormSupplier->getForms(), uno::UNO_QUERY_THROW ); 913 // get the www-standard container ( maybe we should access the 914 // 'www-standard' by name rather than index, this seems an 915 // implementation detail 916 if( xIndexAccess->hasElements() ) 917 xFormControls.set( xIndexAccess->getByIndex(0), uno::UNO_QUERY ); 918 919 } 920 catch( uno::Exception& ) 921 { 922 } 923 return xFormControls; 924 925 } 926 ::sal_Bool SAL_CALL 927 ScVbaWorksheet::hasProperty( const ::rtl::OUString& aName ) throw (uno::RuntimeException) 928 { 929 uno::Reference< container::XNameAccess > xFormControls( getFormControls() ); 930 if ( xFormControls.is() ) 931 return xFormControls->hasByName( aName ); 932 return sal_False; 933 } 934 935 uno::Any 936 ScVbaWorksheet::getControlShape( const ::rtl::OUString& sName ) 937 { 938 // ideally we would get an XControl object but it appears an XControl 939 // implementation only exists for a Control implementation optained from the 940 // view ( e.g. in basic you would get this from 941 // thiscomponent.currentcontroller.getControl( controlModel ) ) 942 // and the thing to realise is that it is only possible to get an XControl 943 // for a currently displayed control :-( often we would want to modify 944 // a control not on the active sheet. But.. you can always access the 945 // XControlShape from the DrawPage whether that is the active drawpage or not 946 947 uno::Reference< drawing::XDrawPageSupplier > xDrawPageSupplier( getSheet(), uno::UNO_QUERY_THROW ); 948 uno::Reference< container::XIndexAccess > xIndexAccess( xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY_THROW ); 949 950 sal_Int32 nCount = xIndexAccess->getCount(); 951 for( int index = 0; index < nCount; index++ ) 952 { 953 uno::Any aUnoObj = xIndexAccess->getByIndex( index ); 954 // It seems there are some drawing objects that can not query into Control shapes? 955 uno::Reference< drawing::XControlShape > xControlShape( aUnoObj, uno::UNO_QUERY ); 956 if( xControlShape.is() ) 957 { 958 uno::Reference< container::XNamed > xNamed( xControlShape->getControl(), uno::UNO_QUERY_THROW ); 959 if( sName.equals( xNamed->getName() )) 960 { 961 return aUnoObj; 962 } 963 } 964 } 965 return uno::Any(); 966 } 967 968 969 rtl::OUString& 970 ScVbaWorksheet::getServiceImplName() 971 { 972 static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaWorksheet") ); 973 return sImplName; 974 } 975 void SAL_CALL 976 ScVbaWorksheet::setEnableCalculation( ::sal_Bool bEnableCalculation ) throw ( script::BasicErrorException, uno::RuntimeException) 977 { 978 uno::Reference <sheet::XCalculatable> xCalculatable(getModel(), uno::UNO_QUERY_THROW); 979 xCalculatable->enableAutomaticCalculation( bEnableCalculation); 980 } 981 ::sal_Bool SAL_CALL 982 ScVbaWorksheet::getEnableCalculation( ) throw (css::script::BasicErrorException, css::uno::RuntimeException) 983 { 984 uno::Reference <sheet::XCalculatable> xCalculatable(getModel(), uno::UNO_QUERY_THROW); 985 return xCalculatable->isAutomaticCalculationEnabled(); 986 } 987 988 uno::Sequence< rtl::OUString > 989 ScVbaWorksheet::getServiceNames() 990 { 991 static uno::Sequence< rtl::OUString > aServiceNames; 992 if ( aServiceNames.getLength() == 0 ) 993 { 994 aServiceNames.realloc( 1 ); 995 aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.Worksheet" ) ); 996 } 997 return aServiceNames; 998 } 999 1000 rtl::OUString SAL_CALL 1001 ScVbaWorksheet::getCodeName() throw (css::uno::RuntimeException) 1002 { 1003 uno::Reference< beans::XPropertySet > xSheetProp( mxSheet, uno::UNO_QUERY_THROW ); 1004 return xSheetProp->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CodeName" ) ) ).get< ::rtl::OUString >(); 1005 } 1006 1007 sal_Int16 1008 ScVbaWorksheet::getSheetID() throw (uno::RuntimeException) 1009 { 1010 uno::Reference< sheet::XCellRangeAddressable > xAddressable( mxSheet, uno::UNO_QUERY_THROW ); 1011 return xAddressable->getRangeAddress().Sheet; 1012 } 1013 1014 void SAL_CALL 1015 ScVbaWorksheet::PrintOut( const uno::Any& From, const uno::Any& To, const uno::Any& Copies, const uno::Any& Preview, const uno::Any& ActivePrinter, const uno::Any& PrintToFile, const uno::Any& Collate, const uno::Any& PrToFileName, const uno::Any& IgnorePrintAreas ) throw (uno::RuntimeException) 1016 { 1017 sal_Int32 nTo = 0; 1018 sal_Int32 nFrom = 0; 1019 sal_Int16 nCopies = 1; 1020 sal_Bool bCollate = sal_False; 1021 sal_Bool bSelection = sal_False; 1022 sal_Bool bIgnorePrintAreas = sal_False; 1023 From >>= nFrom; 1024 To >>= nTo; 1025 Copies >>= nCopies; 1026 IgnorePrintAreas >>= bIgnorePrintAreas; 1027 if ( nCopies > 1 ) // Collate only useful when more that 1 copy 1028 Collate >>= bCollate; 1029 1030 if ( !( nFrom || nTo ) ) 1031 bSelection = sal_True; 1032 1033 uno::Reference< frame::XModel > xModel( getModel(), uno::UNO_QUERY_THROW ); 1034 PrintOutHelper( excel::getBestViewShell( xModel ), From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName, bSelection ); 1035 } 1036 1037 namespace worksheet 1038 { 1039 namespace sdecl = comphelper::service_decl; 1040 sdecl::vba_service_class_<ScVbaWorksheet, sdecl::with_args<true> > serviceImpl; 1041 extern sdecl::ServiceDecl const serviceDecl( 1042 serviceImpl, 1043 "ScVbaWorksheet", 1044 "ooo.vba.excel.Worksheet" ); 1045 } 1046