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_sc.hxx" 26 27 #include <com/sun/star/awt/MouseButton.hpp> 28 #include <com/sun/star/script/vba/VBAEventId.hpp> 29 #include <com/sun/star/script/vba/XVBAEventProcessor.hpp> 30 #include <com/sun/star/view/DocumentZoomType.hpp> 31 32 #include <editeng/outliner.hxx> 33 #include <svx/fmdpage.hxx> 34 #include <svx/svditer.hxx> 35 #include <svx/svdmark.hxx> 36 #include <svx/svdouno.hxx> 37 #include <svx/svdpage.hxx> 38 #include <svx/svdpagv.hxx> 39 #include <svx/svdview.hxx> 40 #include <svx/unoshape.hxx> 41 #include <svx/unoshcol.hxx> 42 #include <svx/fmshell.hxx> 43 #include <sfx2/bindings.hxx> 44 #include <sfx2/dispatch.hxx> 45 #include <sfx2/printer.hxx> 46 #include <sfx2/request.hxx> 47 #include <sfx2/viewfrm.hxx> 48 #include <rtl/uuid.h> 49 #include <toolkit/helper/convert.hxx> 50 #include <toolkit/helper/vclunohelper.hxx> 51 52 #include "drawsh.hxx" 53 #include "drtxtob.hxx" 54 #include "transobj.hxx" 55 #include "editsh.hxx" 56 #include "viewuno.hxx" 57 #include "cellsuno.hxx" 58 #include "miscuno.hxx" 59 #include "tabvwsh.hxx" 60 #include "docsh.hxx" 61 #include "drwlayer.hxx" 62 #include "drawview.hxx" 63 #include "fupoor.hxx" 64 #include "sc.hrc" 65 #include "unoguard.hxx" 66 #include "unonames.hxx" 67 #include "scmod.hxx" 68 #include "appoptio.hxx" 69 #include "gridwin.hxx" 70 #include "sheetevents.hxx" 71 #include "AccessibilityHints.hxx" 72 #include <svx/sdrhittesthelper.hxx> 73 74 using namespace com::sun::star; 75 76 //------------------------------------------------------------------------ 77 78 //! Clipping-Markierungen 79 80 // alles ohne Which-ID, Map nur fuer PropertySetInfo 81 82 const SfxItemPropertyMapEntry* lcl_GetViewOptPropertyMap() 83 { 84 static SfxItemPropertyMapEntry aViewOptPropertyMap_Impl[] = 85 { 86 {MAP_CHAR_LEN(OLD_UNO_COLROWHDR), 0, &getBooleanCppuType(), 0, 0}, 87 {MAP_CHAR_LEN(SC_UNO_GRIDCOLOR), 0, &getCppuType((sal_Int32*)0), 0, 0}, 88 {MAP_CHAR_LEN(SC_UNO_COLROWHDR), 0, &getBooleanCppuType(), 0, 0}, 89 {MAP_CHAR_LEN(SC_UNO_HORSCROLL), 0, &getBooleanCppuType(), 0, 0}, 90 {MAP_CHAR_LEN(SC_UNO_SHEETTABS), 0, &getBooleanCppuType(), 0, 0}, 91 {MAP_CHAR_LEN(SC_UNO_VERTSCROLL), 0, &getBooleanCppuType(), 0, 0}, 92 {MAP_CHAR_LEN(SC_UNO_HIDESPELL), 0, &getBooleanCppuType(), 0, 0}, /* deprecated #i91949 */ 93 {MAP_CHAR_LEN(OLD_UNO_HORSCROLL), 0, &getBooleanCppuType(), 0, 0}, 94 {MAP_CHAR_LEN(SC_UNO_OUTLSYMB), 0, &getBooleanCppuType(), 0, 0}, 95 {MAP_CHAR_LEN(SC_UNO_VALUEHIGH), 0, &getBooleanCppuType(), 0, 0}, 96 {MAP_CHAR_LEN(OLD_UNO_OUTLSYMB), 0, &getBooleanCppuType(), 0, 0}, 97 {MAP_CHAR_LEN(OLD_UNO_SHEETTABS), 0, &getBooleanCppuType(), 0, 0}, 98 {MAP_CHAR_LEN(SC_UNO_SHOWANCHOR), 0, &getBooleanCppuType(), 0, 0}, 99 {MAP_CHAR_LEN(SC_UNO_SHOWCHARTS), 0, &getCppuType((sal_Int16*)0), 0, 0}, 100 {MAP_CHAR_LEN(SC_UNO_SHOWDRAW), 0, &getCppuType((sal_Int16*)0), 0, 0}, 101 {MAP_CHAR_LEN(SC_UNO_SHOWFORM), 0, &getBooleanCppuType(), 0, 0}, 102 {MAP_CHAR_LEN(SC_UNO_SHOWGRID), 0, &getBooleanCppuType(), 0, 0}, 103 {MAP_CHAR_LEN(SC_UNO_SHOWHELP), 0, &getBooleanCppuType(), 0, 0}, 104 {MAP_CHAR_LEN(SC_UNO_SHOWNOTES), 0, &getBooleanCppuType(), 0, 0}, 105 {MAP_CHAR_LEN(SC_UNO_SHOWOBJ), 0, &getCppuType((sal_Int16*)0), 0, 0}, 106 {MAP_CHAR_LEN(SC_UNO_SHOWPAGEBR), 0, &getBooleanCppuType(), 0, 0}, 107 {MAP_CHAR_LEN(SC_UNO_SHOWZERO), 0, &getBooleanCppuType(), 0, 0}, 108 {MAP_CHAR_LEN(SC_UNO_SHOWSOLID), 0, &getBooleanCppuType(), 0, 0}, 109 {MAP_CHAR_LEN(OLD_UNO_VALUEHIGH), 0, &getBooleanCppuType(), 0, 0}, 110 {MAP_CHAR_LEN(OLD_UNO_VERTSCROLL), 0, &getBooleanCppuType(), 0, 0}, 111 {MAP_CHAR_LEN(SC_UNO_VISAREA), 0, &getCppuType((awt::Rectangle*)0), 0, 0}, 112 {MAP_CHAR_LEN(SC_UNO_ZOOMTYPE), 0, &getCppuType((sal_Int16*)0), 0, 0}, 113 {MAP_CHAR_LEN(SC_UNO_ZOOMVALUE), 0, &getCppuType((sal_Int16*)0), 0, 0}, 114 {MAP_CHAR_LEN(SC_UNO_VISAREASCREEN),0, &getCppuType((awt::Rectangle*)0), 0, 0}, 115 {0,0,0,0,0,0} 116 }; 117 return aViewOptPropertyMap_Impl; 118 } 119 120 //------------------------------------------------------------------------ 121 122 SV_IMPL_PTRARR( XRangeSelectionListenerArr_Impl, XRangeSelectionListenerPtr ); 123 SV_IMPL_PTRARR( XRangeSelectionChangeListenerArr_Impl, XRangeSelectionChangeListenerPtr ); 124 SV_IMPL_PTRARR( XSelectionChangeListenerArr_Impl, XSelectionChangeListenerPtr ); 125 SV_IMPL_PTRARR( XViewPropertyChangeListenerArr_Impl, XViewPropertyChangeListenerPtr ); 126 SV_IMPL_PTRARR( XMouseClickHandlerArr_Impl, XMouseClickHandlerPtr ); 127 SV_IMPL_PTRARR( XActivationEventListenerArr_Impl, XActivationEventListenerPtr ); 128 129 #define SCTABVIEWOBJ_SERVICE "com.sun.star.sheet.SpreadsheetView" 130 #define SCVIEWSETTINGS_SERVICE "com.sun.star.sheet.SpreadsheetViewSettings" 131 132 SC_SIMPLE_SERVICE_INFO( ScViewPaneBase, "ScViewPaneObj", "com.sun.star.sheet.SpreadsheetViewPane" ) 133 134 //------------------------------------------------------------------------ 135 136 ScViewPaneBase::ScViewPaneBase(ScTabViewShell* pViewSh, sal_uInt16 nP) : 137 pViewShell( pViewSh ), 138 nPane( nP ) 139 { 140 if (pViewShell) 141 StartListening(*pViewShell); 142 } 143 144 ScViewPaneBase::~ScViewPaneBase() 145 { 146 if (pViewShell) 147 EndListening(*pViewShell); 148 } 149 150 void ScViewPaneBase::Notify( SfxBroadcaster&, const SfxHint& rHint ) 151 { 152 if ( rHint.ISA( SfxSimpleHint ) && 153 ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) 154 pViewShell = NULL; 155 } 156 157 uno::Any SAL_CALL ScViewPaneBase::queryInterface( const uno::Type& rType ) 158 throw(uno::RuntimeException) 159 { 160 SC_QUERYINTERFACE( sheet::XViewPane ) 161 SC_QUERYINTERFACE( sheet::XCellRangeReferrer ) 162 SC_QUERYINTERFACE( view::XFormLayerAccess ) 163 SC_QUERYINTERFACE( view::XControlAccess ) 164 SC_QUERYINTERFACE( lang::XServiceInfo ) 165 SC_QUERYINTERFACE( lang::XTypeProvider ) 166 167 return uno::Any(); // OWeakObject is in derived objects 168 } 169 170 uno::Sequence<uno::Type> SAL_CALL ScViewPaneBase::getTypes() throw(uno::RuntimeException) 171 { 172 static uno::Sequence<uno::Type> aTypes; 173 if ( aTypes.getLength() == 0 ) 174 { 175 aTypes.realloc(5); 176 uno::Type* pPtr = aTypes.getArray(); 177 pPtr[0] = getCppuType((const uno::Reference<sheet::XViewPane>*)0); 178 pPtr[1] = getCppuType((const uno::Reference<sheet::XCellRangeReferrer>*)0); 179 pPtr[2] = getCppuType((const uno::Reference<view::XFormLayerAccess>*)0); 180 pPtr[3] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0); 181 pPtr[4] = getCppuType((const uno::Reference<lang::XTypeProvider>*)0); 182 } 183 return aTypes; 184 } 185 186 uno::Sequence<sal_Int8> SAL_CALL ScViewPaneBase::getImplementationId() 187 throw(uno::RuntimeException) 188 { 189 static uno::Sequence< sal_Int8 > aId; 190 if( aId.getLength() == 0 ) 191 { 192 aId.realloc( 16 ); 193 rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True ); 194 } 195 return aId; 196 } 197 198 // XViewPane 199 200 sal_Int32 SAL_CALL ScViewPaneBase::getFirstVisibleColumn() throw(uno::RuntimeException) 201 { 202 ScUnoGuard aGuard; 203 if (pViewShell) 204 { 205 ScViewData* pViewData = pViewShell->GetViewData(); 206 ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? 207 pViewData->GetActivePart() : 208 (ScSplitPos) nPane; 209 ScHSplitPos eWhichH = WhichH( eWhich ); 210 211 return pViewData->GetPosX( eWhichH ); 212 } 213 DBG_ERROR("keine View ?!?"); //! Exception? 214 return 0; 215 } 216 217 void SAL_CALL ScViewPaneBase::setFirstVisibleColumn( sal_Int32 nFirstVisibleColumn ) 218 throw(uno::RuntimeException) 219 { 220 ScUnoGuard aGuard; 221 if (pViewShell) 222 { 223 ScViewData* pViewData = pViewShell->GetViewData(); 224 ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? 225 pViewData->GetActivePart() : 226 (ScSplitPos) nPane; 227 ScHSplitPos eWhichH = WhichH( eWhich ); 228 229 long nDeltaX = ((long)nFirstVisibleColumn) - pViewData->GetPosX( eWhichH ); 230 pViewShell->ScrollX( nDeltaX, eWhichH ); 231 } 232 } 233 234 sal_Int32 SAL_CALL ScViewPaneBase::getFirstVisibleRow() throw(uno::RuntimeException) 235 { 236 ScUnoGuard aGuard; 237 if (pViewShell) 238 { 239 ScViewData* pViewData = pViewShell->GetViewData(); 240 ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? 241 pViewData->GetActivePart() : 242 (ScSplitPos) nPane; 243 ScVSplitPos eWhichV = WhichV( eWhich ); 244 245 return pViewData->GetPosY( eWhichV ); 246 } 247 DBG_ERROR("keine View ?!?"); //! Exception? 248 return 0; 249 } 250 251 void SAL_CALL ScViewPaneBase::setFirstVisibleRow( sal_Int32 nFirstVisibleRow ) 252 throw(uno::RuntimeException) 253 { 254 ScUnoGuard aGuard; 255 if (pViewShell) 256 { 257 ScViewData* pViewData = pViewShell->GetViewData(); 258 ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? 259 pViewData->GetActivePart() : 260 (ScSplitPos) nPane; 261 ScVSplitPos eWhichV = WhichV( eWhich ); 262 263 long nDeltaY = ((long)nFirstVisibleRow) - pViewData->GetPosY( eWhichV ); 264 pViewShell->ScrollY( nDeltaY, eWhichV ); 265 } 266 } 267 268 table::CellRangeAddress SAL_CALL ScViewPaneBase::getVisibleRange() throw(uno::RuntimeException) 269 { 270 ScUnoGuard aGuard; 271 table::CellRangeAddress aAdr; 272 if (pViewShell) 273 { 274 ScViewData* pViewData = pViewShell->GetViewData(); 275 ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? 276 pViewData->GetActivePart() : 277 (ScSplitPos) nPane; 278 ScHSplitPos eWhichH = WhichH( eWhich ); 279 ScVSplitPos eWhichV = WhichV( eWhich ); 280 281 // VisibleCellsX gibt nur komplett sichtbare Zellen, 282 // VisibleRange in Excel auch teilweise sichtbare. 283 //! anpassen ??? 284 285 SCCOL nVisX = pViewData->VisibleCellsX( eWhichH ); 286 SCROW nVisY = pViewData->VisibleCellsY( eWhichV ); 287 if (!nVisX) nVisX = 1; // irgendwas muss ja im Range sein 288 if (!nVisY) nVisY = 1; 289 aAdr.Sheet = pViewData->GetTabNo(); 290 aAdr.StartColumn = pViewData->GetPosX( eWhichH ); 291 aAdr.StartRow = pViewData->GetPosY( eWhichV ); 292 aAdr.EndColumn = aAdr.StartColumn + nVisX - 1; 293 aAdr.EndRow = aAdr.StartRow + nVisY - 1; 294 } 295 return aAdr; 296 } 297 298 // XCellRangeSource 299 300 uno::Reference<table::XCellRange> SAL_CALL ScViewPaneBase::getReferredCells() 301 throw(uno::RuntimeException) 302 { 303 ScUnoGuard aGuard; 304 if (pViewShell) 305 { 306 ScDocShell* pDocSh = pViewShell->GetViewData()->GetDocShell(); 307 308 table::CellRangeAddress aAdr(getVisibleRange()); //! Hilfsfunktion mit ScRange? 309 ScRange aRange( (SCCOL)aAdr.StartColumn, (SCROW)aAdr.StartRow, aAdr.Sheet, 310 (SCCOL)aAdr.EndColumn, (SCROW)aAdr.EndRow, aAdr.Sheet ); 311 if ( aRange.aStart == aRange.aEnd ) 312 return new ScCellObj( pDocSh, aRange.aStart ); 313 else 314 return new ScCellRangeObj( pDocSh, aRange ); 315 } 316 317 return NULL; 318 } 319 320 namespace 321 { 322 bool lcl_prepareFormShellCall( ScTabViewShell* _pViewShell, sal_uInt16 _nPane, FmFormShell*& _rpFormShell, Window*& _rpWindow, SdrView*& _rpSdrView ) 323 { 324 if ( !_pViewShell ) 325 return false; 326 327 ScViewData* pViewData = _pViewShell->GetViewData(); 328 ScSplitPos eWhich = ( _nPane == SC_VIEWPANE_ACTIVE ) ? 329 pViewData->GetActivePart() : 330 (ScSplitPos) _nPane; 331 _rpWindow = _pViewShell->GetWindowByPos( eWhich ); 332 _rpSdrView = _pViewShell->GetSdrView(); 333 _rpFormShell = _pViewShell->GetFormShell(); 334 return ( _rpFormShell != NULL ) && ( _rpSdrView != NULL )&& ( _rpWindow != NULL ); 335 } 336 } 337 338 // XFormLayerAccess 339 uno::Reference< form::runtime::XFormController > SAL_CALL ScViewPaneBase::getFormController( const uno::Reference< form::XForm >& _Form ) throw (uno::RuntimeException) 340 { 341 ScUnoGuard aGuard; 342 343 uno::Reference< form::runtime::XFormController > xController; 344 345 Window* pWindow( NULL ); 346 SdrView* pSdrView( NULL ); 347 FmFormShell* pFormShell( NULL ); 348 if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) ) 349 xController = pFormShell->GetFormController( _Form, *pSdrView, *pWindow ); 350 351 return xController; 352 } 353 354 ::sal_Bool SAL_CALL ScViewPaneBase::isFormDesignMode( ) throw (uno::RuntimeException) 355 { 356 ScUnoGuard aGuard; 357 358 sal_Bool bIsFormDesignMode( sal_True ); 359 360 FmFormShell* pFormShell( pViewShell ? pViewShell->GetFormShell() : NULL ); 361 if ( pFormShell ) 362 bIsFormDesignMode = pFormShell->IsDesignMode(); 363 364 return bIsFormDesignMode; 365 } 366 367 void SAL_CALL ScViewPaneBase::setFormDesignMode( ::sal_Bool _DesignMode ) throw (uno::RuntimeException) 368 { 369 ScUnoGuard aGuard; 370 371 Window* pWindow( NULL ); 372 SdrView* pSdrView( NULL ); 373 FmFormShell* pFormShell( NULL ); 374 if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) ) 375 pFormShell->SetDesignMode( _DesignMode ); 376 } 377 378 // XControlAccess 379 380 uno::Reference<awt::XControl> SAL_CALL ScViewPaneBase::getControl( 381 const uno::Reference<awt::XControlModel>& xModel ) 382 throw(container::NoSuchElementException, uno::RuntimeException) 383 { 384 ScUnoGuard aGuard; 385 386 uno::Reference<awt::XControl> xRet; 387 388 Window* pWindow( NULL ); 389 SdrView* pSdrView( NULL ); 390 FmFormShell* pFormShell( NULL ); 391 if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) ) 392 pFormShell->GetFormControl( xModel, *pSdrView, *pWindow, xRet ); 393 394 if ( !xRet.is() ) 395 throw container::NoSuchElementException(); // no control found 396 397 return xRet; 398 } 399 400 awt::Rectangle ScViewPaneBase::GetVisArea() const 401 { 402 awt::Rectangle aVisArea; 403 if (pViewShell) 404 { 405 ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? 406 pViewShell->GetViewData()->GetActivePart() : 407 (ScSplitPos) nPane; 408 ScGridWindow* pWindow = (ScGridWindow*)pViewShell->GetWindowByPos(eWhich); 409 ScDocument* pDoc = pViewShell->GetViewData()->GetDocument(); 410 if (pWindow && pDoc) 411 { 412 ScHSplitPos eWhichH = ((eWhich == SC_SPLIT_TOPLEFT) || (eWhich == SC_SPLIT_BOTTOMLEFT)) ? 413 SC_SPLIT_LEFT : SC_SPLIT_RIGHT; 414 ScVSplitPos eWhichV = ((eWhich == SC_SPLIT_TOPLEFT) || (eWhich == SC_SPLIT_TOPRIGHT)) ? 415 SC_SPLIT_TOP : SC_SPLIT_BOTTOM; 416 ScAddress aCell(pViewShell->GetViewData()->GetPosX(eWhichH), 417 pViewShell->GetViewData()->GetPosY(eWhichV), 418 pViewShell->GetViewData()->GetTabNo()); 419 Rectangle aCellRect( pDoc->GetMMRect( aCell.Col(), aCell.Row(), aCell.Col(), aCell.Row(), aCell.Tab() ) ); 420 Size aVisSize( pWindow->PixelToLogic( pWindow->GetSizePixel(), pWindow->GetDrawMapMode( sal_True ) ) ); 421 Point aVisPos( aCellRect.TopLeft() ); 422 if ( pDoc->IsLayoutRTL( aCell.Tab() ) ) 423 { 424 aVisPos = aCellRect.TopRight(); 425 aVisPos.X() -= aVisSize.Width(); 426 } 427 Rectangle aVisRect( aVisPos, aVisSize ); 428 aVisArea = AWTRectangle(aVisRect); 429 } 430 } 431 return aVisArea; 432 } 433 434 //------------------------------------------------------------------------ 435 436 ScViewPaneObj::ScViewPaneObj(ScTabViewShell* pViewSh, sal_uInt16 nP) : 437 ScViewPaneBase( pViewSh, nP ) 438 { 439 } 440 441 ScViewPaneObj::~ScViewPaneObj() 442 { 443 } 444 445 uno::Any SAL_CALL ScViewPaneObj::queryInterface( const uno::Type& rType ) 446 throw(uno::RuntimeException) 447 { 448 // ScViewPaneBase has everything except OWeakObject 449 450 uno::Any aRet(ScViewPaneBase::queryInterface( rType )); 451 if (!aRet.hasValue()) 452 aRet = OWeakObject::queryInterface( rType ); 453 return aRet; 454 } 455 456 void SAL_CALL ScViewPaneObj::acquire() throw() 457 { 458 OWeakObject::acquire(); 459 } 460 461 void SAL_CALL ScViewPaneObj::release() throw() 462 { 463 OWeakObject::release(); 464 } 465 466 //------------------------------------------------------------------------ 467 468 // Default-ctor wird fuer SMART_REFLECTION_IMPLEMENTATION gebraucht 469 470 //UNUSED2008-05 ScTabViewObj::ScTabViewObj() : 471 //UNUSED2008-05 ScViewPaneBase( NULL, SC_VIEWPANE_ACTIVE ), 472 //UNUSED2008-05 SfxBaseController( NULL ), 473 //UNUSED2008-05 aPropSet( lcl_GetViewOptPropertyMap() ), 474 //UNUSED2008-05 aMouseClickHandlers( 0 ), 475 //UNUSED2008-05 aActivationListeners( 0 ), 476 //UNUSED2008-05 bDrawSelModeSet(sal_False), 477 //UNUSED2008-05 bFilteredRangeSelection(sal_True) 478 //UNUSED2008-05 { 479 //UNUSED2008-05 } 480 481 ScTabViewObj::ScTabViewObj( ScTabViewShell* pViewSh ) : 482 ScViewPaneBase( pViewSh, SC_VIEWPANE_ACTIVE ), 483 SfxBaseController( pViewSh ), 484 aPropSet( lcl_GetViewOptPropertyMap() ), 485 aMouseClickHandlers( 0 ), 486 aActivationListeners( 0 ), 487 nPreviousTab( 0 ), 488 bDrawSelModeSet(sal_False) 489 { 490 if (pViewSh) 491 nPreviousTab = pViewSh->GetViewData()->GetTabNo(); 492 } 493 494 ScTabViewObj::~ScTabViewObj() 495 { 496 //! Listening oder so 497 if (aMouseClickHandlers.Count()) 498 { 499 acquire(); 500 EndMouseListening(); 501 } 502 if (aActivationListeners.Count()) 503 { 504 acquire(); 505 EndActivationListening(); 506 } 507 } 508 509 uno::Any SAL_CALL ScTabViewObj::queryInterface( const uno::Type& rType ) 510 throw(uno::RuntimeException) 511 { 512 SC_QUERYINTERFACE( sheet::XSpreadsheetView ) 513 SC_QUERYINTERFACE( sheet::XEnhancedMouseClickBroadcaster ) 514 SC_QUERYINTERFACE( sheet::XActivationBroadcaster ) 515 SC_QUERYINTERFACE( container::XEnumerationAccess ) 516 SC_QUERYINTERFACE( container::XIndexAccess ) 517 SC_QUERY_MULTIPLE( container::XElementAccess, container::XIndexAccess ) 518 SC_QUERYINTERFACE( view::XSelectionSupplier ) 519 SC_QUERYINTERFACE( beans::XPropertySet ) 520 SC_QUERYINTERFACE( sheet::XViewSplitable ) 521 SC_QUERYINTERFACE( sheet::XViewFreezable ) 522 SC_QUERYINTERFACE( sheet::XRangeSelection ) 523 SC_QUERYINTERFACE( lang::XUnoTunnel ) 524 SC_QUERYINTERFACE( datatransfer::XTransferableSupplier ) 525 526 uno::Any aRet(ScViewPaneBase::queryInterface( rType )); 527 if (!aRet.hasValue()) 528 aRet = SfxBaseController::queryInterface( rType ); 529 return aRet; 530 } 531 532 void SAL_CALL ScTabViewObj::acquire() throw() 533 { 534 SfxBaseController::acquire(); 535 } 536 537 void SAL_CALL ScTabViewObj::release() throw() 538 { 539 SfxBaseController::release(); 540 } 541 542 void lcl_CallActivate( ScDocShell* pDocSh, SCTAB nTab, sal_Int32 nEvent ) 543 { 544 ScDocument* pDoc = pDocSh->GetDocument(); 545 // when deleting a sheet, nPreviousTab can be invalid 546 // (could be handled with reference updates) 547 if (!pDoc->HasTable(nTab)) 548 return; 549 550 const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab); 551 if (pEvents) 552 { 553 const rtl::OUString* pScript = pEvents->GetScript(nEvent); 554 if (pScript) 555 { 556 uno::Any aRet; 557 uno::Sequence<uno::Any> aParams; 558 uno::Sequence<sal_Int16> aOutArgsIndex; 559 uno::Sequence<uno::Any> aOutArgs; 560 /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs ); 561 } 562 } 563 564 // execute VBA event handlers 565 try 566 { 567 uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW ); 568 // the parameter is the clicked object, as in the mousePressed call above 569 uno::Sequence< uno::Any > aArgs( 1 ); 570 aArgs[ 0 ] <<= nTab; 571 xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs ); 572 } 573 catch( uno::Exception& ) 574 { 575 } 576 } 577 578 void ScTabViewObj::SheetChanged( bool bSameTabButMoved ) 579 { 580 if ( !GetViewShell() ) 581 return; 582 583 ScViewData* pViewData = GetViewShell()->GetViewData(); 584 ScDocShell* pDocSh = pViewData->GetDocShell(); 585 if (aActivationListeners.Count() > 0) 586 { 587 sheet::ActivationEvent aEvent; 588 uno::Reference< sheet::XSpreadsheetView > xView(this); 589 uno::Reference< uno::XInterface > xSource(xView, uno::UNO_QUERY); 590 aEvent.Source = xSource; 591 aEvent.ActiveSheet = new ScTableSheetObj(pDocSh, pViewData->GetTabNo()); 592 for ( sal_uInt16 n=0; n<aActivationListeners.Count(); n++ ) 593 { 594 try 595 { 596 (*aActivationListeners[n])->activeSpreadsheetChanged( aEvent ); 597 } 598 catch( uno::Exception& ) 599 { 600 aActivationListeners.DeleteAndDestroy( n ); 601 --n; // because it will be increased again in the loop 602 } 603 } 604 } 605 606 /* Handle sheet events, but do not trigger event handlers, if the old 607 active sheet gets re-activated after inserting/deleting/moving a sheet. */ 608 SCTAB nNewTab = pViewData->GetTabNo(); 609 if ( !bSameTabButMoved && (nNewTab != nPreviousTab) ) 610 { 611 lcl_CallActivate( pDocSh, nPreviousTab, SC_SHEETEVENT_UNFOCUS ); 612 lcl_CallActivate( pDocSh, nNewTab, SC_SHEETEVENT_FOCUS ); 613 } 614 nPreviousTab = nNewTab; 615 } 616 617 uno::Sequence<uno::Type> SAL_CALL ScTabViewObj::getTypes() throw(uno::RuntimeException) 618 { 619 static uno::Sequence<uno::Type> aTypes; 620 if ( aTypes.getLength() == 0 ) 621 { 622 uno::Sequence<uno::Type> aViewPaneTypes(ScViewPaneBase::getTypes()); 623 long nViewPaneLen = aViewPaneTypes.getLength(); 624 const uno::Type* pViewPanePtr = aViewPaneTypes.getConstArray(); 625 626 uno::Sequence<uno::Type> aControllerTypes(SfxBaseController::getTypes()); 627 long nControllerLen = aControllerTypes.getLength(); 628 const uno::Type* pControllerPtr = aControllerTypes.getConstArray(); 629 630 long nParentLen = nViewPaneLen + nControllerLen; 631 632 aTypes.realloc( nParentLen + 12 ); 633 uno::Type* pPtr = aTypes.getArray(); 634 pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSpreadsheetView>*)0); 635 pPtr[nParentLen + 1] = getCppuType((const uno::Reference<container::XEnumerationAccess>*)0); 636 pPtr[nParentLen + 2] = getCppuType((const uno::Reference<container::XIndexAccess>*)0); 637 pPtr[nParentLen + 3] = getCppuType((const uno::Reference<view::XSelectionSupplier>*)0); 638 pPtr[nParentLen + 4] = getCppuType((const uno::Reference<beans::XPropertySet>*)0); 639 pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XViewSplitable>*)0); 640 pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XViewFreezable>*)0); 641 pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XRangeSelection>*)0); 642 pPtr[nParentLen + 8] = getCppuType((const uno::Reference<lang::XUnoTunnel>*)0); 643 pPtr[nParentLen + 9] = getCppuType((const uno::Reference<sheet::XEnhancedMouseClickBroadcaster>*)0); 644 pPtr[nParentLen + 10] = getCppuType((const uno::Reference<sheet::XActivationBroadcaster>*)0); 645 pPtr[nParentLen + 11] = getCppuType((const uno::Reference<datatransfer::XTransferableSupplier>*)0); 646 647 long i; 648 for (i=0; i<nViewPaneLen; i++) 649 pPtr[i] = pViewPanePtr[i]; // parent types first 650 for (i=0; i<nControllerLen; i++) 651 pPtr[nViewPaneLen+i] = pControllerPtr[i]; 652 } 653 return aTypes; 654 } 655 656 uno::Sequence<sal_Int8> SAL_CALL ScTabViewObj::getImplementationId() 657 throw(uno::RuntimeException) 658 { 659 static uno::Sequence< sal_Int8 > aId; 660 if( aId.getLength() == 0 ) 661 { 662 aId.realloc( 16 ); 663 rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True ); 664 } 665 return aId; 666 } 667 668 // XDocumentView 669 670 sal_Bool lcl_TabInRanges( SCTAB nTab, const ScRangeList& rRanges ) 671 { 672 sal_uLong nCount = rRanges.Count(); 673 for (sal_uLong i=0; i<nCount; i++) 674 { 675 const ScRange* pRange = rRanges.GetObject(i); 676 if ( nTab >= pRange->aStart.Tab() && nTab <= pRange->aEnd.Tab() ) 677 return sal_True; 678 } 679 return sal_False; 680 } 681 682 void lcl_ShowObject( ScTabViewShell& rViewSh, ScDrawView& rDrawView, SdrObject* pSelObj ) 683 { 684 sal_Bool bFound = sal_False; 685 SCTAB nObjectTab = 0; 686 687 SdrModel* pModel = rDrawView.GetModel(); 688 sal_uInt16 nPageCount = pModel->GetPageCount(); 689 for (sal_uInt16 i=0; i<nPageCount && !bFound; i++) 690 { 691 SdrPage* pPage = pModel->GetPage(i); 692 if (pPage) 693 { 694 SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS ); 695 SdrObject* pObject = aIter.Next(); 696 while (pObject && !bFound) 697 { 698 if ( pObject == pSelObj ) 699 { 700 bFound = sal_True; 701 nObjectTab = static_cast<SCTAB>(i); 702 } 703 pObject = aIter.Next(); 704 } 705 } 706 } 707 708 if (bFound) 709 { 710 rViewSh.SetTabNo( nObjectTab ); 711 rViewSh.ScrollToObject( pSelObj ); 712 } 713 } 714 715 sal_Bool SAL_CALL ScTabViewObj::select( const uno::Any& aSelection ) 716 throw(lang::IllegalArgumentException, uno::RuntimeException) 717 { 718 ScUnoGuard aGuard; 719 ScTabViewShell* pViewSh = GetViewShell(); 720 721 if ( !pViewSh ) 722 return sal_False; 723 724 //! Type of aSelection can be some specific interface instead of XInterface 725 726 sal_Bool bRet = sal_False; 727 uno::Reference<uno::XInterface> xInterface(aSelection, uno::UNO_QUERY); 728 if ( !xInterface.is() ) //clear all selections 729 { 730 ScDrawView* pDrawView = pViewSh->GetScDrawView(); 731 if (pDrawView) 732 { 733 pDrawView->ScEndTextEdit(); 734 pDrawView->UnmarkAll(); 735 } 736 else //#102232#; if there is no DrawView remove range selection 737 pViewSh->Unmark(); 738 bRet = sal_True; 739 } 740 741 if (bDrawSelModeSet) // remove DrawSelMode if set by API; if necessary it will be set again later 742 { 743 pViewSh->SetDrawSelMode(sal_False); 744 pViewSh->UpdateLayerLocks(); 745 bDrawSelModeSet = sal_False; 746 } 747 748 if (bRet) 749 return bRet; 750 751 752 ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xInterface ); 753 uno::Reference<drawing::XShapes> xShapeColl( xInterface, uno::UNO_QUERY ); 754 uno::Reference<drawing::XShape> xShapeSel( xInterface, uno::UNO_QUERY ); 755 SvxShape* pShapeImp = SvxShape::getImplementation( xShapeSel ); 756 757 if (pRangesImp) // Zell-Ranges 758 { 759 ScViewData* pViewData = pViewSh->GetViewData(); 760 if ( pViewData->GetDocShell() == pRangesImp->GetDocShell() ) 761 { 762 // Zuerst evtl. Drawing-Selektion aufheben 763 // (MarkListHasChanged hebt Tabellen-Selektion auf) 764 765 ScDrawView* pDrawView = pViewSh->GetScDrawView(); 766 if (pDrawView) 767 { 768 pDrawView->ScEndTextEdit(); 769 pDrawView->UnmarkAll(); 770 } 771 FuPoor* pFunc = pViewSh->GetDrawFuncPtr(); 772 if ( pFunc && pFunc->GetSlotID() != SID_OBJECT_SELECT ) 773 { 774 // Slot der Zeichenfunktion nochmal ausfuehren -> abschalten 775 SfxDispatcher* pDisp = pViewSh->GetDispatcher(); 776 if (pDisp) 777 pDisp->Execute( pFunc->GetSlotID(), SFX_CALLMODE_SYNCHRON ); 778 } 779 pViewSh->SetDrawShell(sal_False); 780 pViewSh->SetDrawSelMode(sal_False); // nach dem Dispatcher-Execute 781 782 // Ranges selektieren 783 784 const ScRangeList& rRanges = pRangesImp->GetRangeList(); 785 sal_uLong nRangeCount = rRanges.Count(); 786 // for empty range list, remove selection (cursor remains where it was) 787 if ( nRangeCount == 0 ) 788 pViewSh->Unmark(); 789 else if ( nRangeCount == 1 ) 790 pViewSh->MarkRange( *rRanges.GetObject(0) ); 791 else 792 { 793 // Mehrfachselektion 794 795 const ScRange* pFirst = rRanges.GetObject(0); 796 if ( pFirst && !lcl_TabInRanges( pViewData->GetTabNo(), rRanges ) ) 797 pViewSh->SetTabNo( pFirst->aStart.Tab() ); 798 pViewSh->DoneBlockMode(); 799 pViewSh->InitOwnBlockMode(); 800 pViewData->GetMarkData().MarkFromRangeList( rRanges, sal_True ); 801 pViewSh->MarkDataChanged(); 802 pViewData->GetDocShell()->PostPaintGridAll(); // Markierung (alt&neu) 803 if ( pFirst ) 804 { 805 pViewSh->AlignToCursor( pFirst->aStart.Col(), pFirst->aStart.Row(), 806 SC_FOLLOW_JUMP ); 807 pViewSh->SetCursor( pFirst->aStart.Col(), pFirst->aStart.Row() ); 808 } 809 810 //! Methode an der View, um RangeList zu selektieren 811 } 812 bRet = sal_True; 813 } 814 } 815 else if ( pShapeImp || xShapeColl.is() ) // Drawing-Layer 816 { 817 ScDrawView* pDrawView = pViewSh->GetScDrawView(); 818 if (pDrawView) 819 { 820 pDrawView->ScEndTextEdit(); 821 pDrawView->UnmarkAll(); 822 823 if (pShapeImp) // einzelnes Shape 824 { 825 SdrObject *pObj = pShapeImp->GetSdrObject(); 826 if (pObj) 827 { 828 lcl_ShowObject( *pViewSh, *pDrawView, pObj ); 829 SdrPageView* pPV = pDrawView->GetSdrPageView(); 830 if ( pPV && pObj->GetPage() == pPV->GetPage() ) 831 { 832 pDrawView->MarkObj( pObj, pPV ); 833 bRet = sal_True; 834 } 835 } 836 } 837 else // Shape-Collection (xShapeColl ist nicht 0) 838 { 839 // Es wird auf die Tabelle des ersten Objekts umgeschaltet, 840 // und alle Objekte selektiert, die auf dieser Tabelle liegen 841 //! Exception, wenn Objekte auf verschiedenen Tabellen? 842 843 SdrPageView* pPV = NULL; 844 long nCount = xShapeColl->getCount(); 845 if (nCount) 846 { 847 sal_Bool bAllMarked(sal_True); 848 for ( long i = 0; i < nCount; i++ ) 849 { 850 uno::Reference<drawing::XShape> xShapeInt(xShapeColl->getByIndex(i), uno::UNO_QUERY); 851 if (xShapeInt.is()) 852 { 853 SvxShape* pShape = SvxShape::getImplementation( xShapeInt ); 854 if (pShape) 855 { 856 SdrObject *pObj = pShape->GetSdrObject(); 857 if (pObj) 858 { 859 if (!bDrawSelModeSet && (pObj->GetLayer() == SC_LAYER_BACK)) 860 { 861 pViewSh->SetDrawSelMode(sal_True); 862 pViewSh->UpdateLayerLocks(); 863 bDrawSelModeSet = sal_True; 864 } 865 if (!pPV) // erstes Objekt 866 { 867 lcl_ShowObject( *pViewSh, *pDrawView, pObj ); 868 pPV = pDrawView->GetSdrPageView(); 869 } 870 if ( pPV && pObj->GetPage() == pPV->GetPage() ) 871 { 872 if (pDrawView->IsObjMarkable( pObj, pPV )) 873 pDrawView->MarkObj( pObj, pPV ); 874 else 875 bAllMarked = sal_False; 876 } 877 } 878 } 879 } 880 } 881 if (bAllMarked) 882 bRet = sal_True; 883 } 884 else 885 bRet = sal_True; // empty XShapes (all shapes are deselected) 886 } 887 888 if (bRet) 889 pViewSh->SetDrawShell(sal_True); 890 } 891 } 892 893 if (!bRet) 894 throw lang::IllegalArgumentException(); 895 896 return bRet; 897 } 898 899 uno::Any SAL_CALL ScTabViewObj::getSelection() throw(uno::RuntimeException) 900 { 901 ScUnoGuard aGuard; 902 ScTabViewShell* pViewSh = GetViewShell(); 903 ScCellRangesBase* pObj = NULL; 904 if (pViewSh) 905 { 906 // Ist auf dem Drawing-Layer etwas selektiert? 907 908 SdrView* pDrawView = pViewSh->GetSdrView(); 909 if (pDrawView) 910 { 911 const SdrMarkList& rMarkList = pDrawView->GetMarkedObjectList(); 912 sal_uLong nMarkCount = rMarkList.GetMarkCount(); 913 if (nMarkCount) 914 { 915 // ShapeCollection erzeugen (wie in SdXImpressView::getSelection im Draw) 916 // Zurueckgegeben wird XInterfaceRef, das muss das UsrObject-XInterface sein 917 918 SvxShapeCollection* pShapes = new SvxShapeCollection(); 919 uno::Reference<uno::XInterface> xRet(static_cast<cppu::OWeakObject*>(pShapes)); 920 921 for (sal_uLong i=0; i<nMarkCount; i++) 922 { 923 SdrObject* pDrawObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); 924 if (pDrawObj) 925 { 926 uno::Reference<drawing::XShape> xShape( pDrawObj->getUnoShape(), uno::UNO_QUERY ); 927 if (xShape.is()) 928 pShapes->add(xShape); 929 } 930 } 931 return uno::makeAny(xRet); 932 } 933 } 934 935 // sonst Tabellen-(Zellen-)Selektion 936 937 ScViewData* pViewData = pViewSh->GetViewData(); 938 ScDocShell* pDocSh = pViewData->GetDocShell(); 939 940 const ScMarkData& rMark = pViewData->GetMarkData(); 941 SCTAB nTabs = rMark.GetSelectCount(); 942 943 ScRange aRange; 944 ScMarkType eMarkType = pViewData->GetSimpleArea(aRange); 945 if ( nTabs == 1 && (eMarkType == SC_MARK_SIMPLE) ) 946 { 947 if (aRange.aStart == aRange.aEnd) 948 pObj = new ScCellObj( pDocSh, aRange.aStart ); 949 else 950 pObj = new ScCellRangeObj( pDocSh, aRange ); 951 } 952 else if ( nTabs == 1 && (eMarkType == SC_MARK_SIMPLE_FILTERED) ) 953 { 954 ScMarkData aFilteredMark( rMark ); 955 ScViewUtil::UnmarkFiltered( aFilteredMark, pDocSh->GetDocument()); 956 ScRangeList aRangeList; 957 aFilteredMark.FillRangeListWithMarks( &aRangeList, sal_False); 958 // Theoretically a selection may start and end on a filtered row. 959 switch (aRangeList.Count()) 960 { 961 case 0: 962 // No unfiltered row, we have to return some object, so 963 // here is one with no ranges. 964 pObj = new ScCellRangesObj( pDocSh, aRangeList ); 965 break; 966 case 1: 967 { 968 const ScRange& rRange = *(aRangeList.GetObject(0)); 969 if (rRange.aStart == rRange.aEnd) 970 pObj = new ScCellObj( pDocSh, rRange.aStart ); 971 else 972 pObj = new ScCellRangeObj( pDocSh, rRange ); 973 } 974 break; 975 default: 976 pObj = new ScCellRangesObj( pDocSh, aRangeList ); 977 } 978 } 979 else // Mehrfachselektion 980 { 981 ScRangeListRef xRanges; 982 pViewData->GetMultiArea( xRanges ); 983 984 // bei mehreren Tabellen Ranges kopieren 985 //! sollte eigentlich schon in ScMarkData::FillRangeListWithMarks passieren? 986 if ( nTabs > 1 ) 987 rMark.ExtendRangeListTables( xRanges ); 988 989 pObj = new ScCellRangesObj( pDocSh, *xRanges ); 990 } 991 992 if ( !rMark.IsMarked() && !rMark.IsMultiMarked() ) 993 { 994 // remember if the selection was from the cursor position without anything selected 995 // (used when rendering the selection) 996 997 pObj->SetCursorOnly( sal_True ); 998 } 999 } 1000 1001 return uno::makeAny(uno::Reference<uno::XInterface>(static_cast<cppu::OWeakObject*>(pObj))); 1002 } 1003 1004 1005 #if 0 1006 // XPrintable 1007 1008 rtl::OUString ScTabViewObj::getPrinterName(void) const 1009 { 1010 ScUnoGuard aGuard; 1011 ScTabViewShell* pViewSh = GetViewShell(); 1012 if (pViewSh) 1013 { 1014 SfxPrinter* pPrinter = pViewSh->GetPrinter(sal_True); 1015 if (pPrinter) 1016 return pPrinter->GetName(); 1017 } 1018 1019 DBG_ERROR("getPrinterName: keine View oder kein Printer"); 1020 return rtl::OUString(); 1021 } 1022 1023 void ScTabViewObj::setPrinterName(const rtl::OUString& PrinterName) 1024 { 1025 ScUnoGuard aGuard; 1026 // Drucker setzen - wie in SfxViewShell::ExecPrint_Impl 1027 1028 ScTabViewShell* pViewSh = GetViewShell(); 1029 if (pViewSh) 1030 { 1031 SfxPrinter* pPrinter = pViewSh->GetPrinter(sal_True); 1032 if (pPrinter) 1033 { 1034 String aString(PrinterName); 1035 SfxPrinter* pNewPrinter = new SfxPrinter( pPrinter->GetOptions().Clone(), aString ); 1036 if (pNewPrinter->IsKnown()) 1037 pViewSh->SetPrinter( pNewPrinter, SFX_PRINTER_PRINTER ); 1038 else 1039 delete pNewPrinter; 1040 } 1041 } 1042 } 1043 1044 XPropertySetRef ScTabViewObj::createPrintOptions(void) 1045 { 1046 ScUnoGuard aGuard; 1047 return new ScPrintSettingsObj; //! ScPrintSettingsObj implementieren! 1048 } 1049 1050 void ScTabViewObj::print(const XPropertySetRef& xOptions) 1051 { 1052 ScUnoGuard aGuard; 1053 ScTabViewShell* pViewSh = GetViewShell(); 1054 if (pViewSh) 1055 { 1056 //! xOptions auswerten (wie denn?) 1057 1058 SfxRequest aReq( SID_PRINTDOCDIRECT, SFX_CALLMODE_SYNCHRON, pViewSh->GetPool() ); 1059 pViewSh->ExecuteSlot( aReq ); 1060 } 1061 } 1062 #endif 1063 1064 // XEnumerationAccess 1065 1066 uno::Reference<container::XEnumeration> SAL_CALL ScTabViewObj::createEnumeration() 1067 throw(uno::RuntimeException) 1068 { 1069 ScUnoGuard aGuard; 1070 return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetViewPanesEnumeration"))); 1071 } 1072 1073 // XIndexAccess 1074 1075 sal_Int32 SAL_CALL ScTabViewObj::getCount() throw(uno::RuntimeException) 1076 { 1077 ScUnoGuard aGuard; 1078 ScTabViewShell* pViewSh = GetViewShell(); 1079 sal_uInt16 nPanes = 0; 1080 if (pViewSh) 1081 { 1082 nPanes = 1; 1083 ScViewData* pViewData = pViewSh->GetViewData(); 1084 if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE ) 1085 nPanes *= 2; 1086 if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE ) 1087 nPanes *= 2; 1088 } 1089 return nPanes; 1090 } 1091 1092 uno::Any SAL_CALL ScTabViewObj::getByIndex( sal_Int32 nIndex ) 1093 throw(lang::IndexOutOfBoundsException, 1094 lang::WrappedTargetException, uno::RuntimeException) 1095 { 1096 ScUnoGuard aGuard; 1097 uno::Reference<sheet::XViewPane> xPane(GetObjectByIndex_Impl((sal_uInt16)nIndex)); 1098 if (xPane.is()) 1099 return uno::makeAny(xPane); 1100 else 1101 throw lang::IndexOutOfBoundsException(); 1102 // return uno::Any(); 1103 } 1104 1105 uno::Type SAL_CALL ScTabViewObj::getElementType() throw(uno::RuntimeException) 1106 { 1107 ScUnoGuard aGuard; 1108 return getCppuType((uno::Reference<sheet::XViewPane>*)0); 1109 } 1110 1111 sal_Bool SAL_CALL ScTabViewObj::hasElements() throw(uno::RuntimeException) 1112 { 1113 ScUnoGuard aGuard; 1114 return ( getCount() != 0 ); 1115 } 1116 1117 // XSpreadsheetView 1118 1119 ScViewPaneObj* ScTabViewObj::GetObjectByIndex_Impl(sal_uInt16 nIndex) const 1120 { 1121 static ScSplitPos ePosHV[4] = 1122 { SC_SPLIT_TOPLEFT, SC_SPLIT_BOTTOMLEFT, SC_SPLIT_TOPRIGHT, SC_SPLIT_BOTTOMRIGHT }; 1123 1124 ScTabViewShell* pViewSh = GetViewShell(); 1125 if (pViewSh) 1126 { 1127 ScSplitPos eWhich = SC_SPLIT_BOTTOMLEFT; // default Position 1128 sal_Bool bError = sal_False; 1129 ScViewData* pViewData = pViewSh->GetViewData(); 1130 sal_Bool bHor = ( pViewData->GetHSplitMode() != SC_SPLIT_NONE ); 1131 sal_Bool bVer = ( pViewData->GetVSplitMode() != SC_SPLIT_NONE ); 1132 if ( bHor && bVer ) 1133 { 1134 // links oben, links unten, rechts oben, rechts unten - wie in Excel 1135 if ( nIndex < 4 ) 1136 eWhich = ePosHV[nIndex]; 1137 else 1138 bError = sal_True; 1139 } 1140 else if ( bHor ) 1141 { 1142 if ( nIndex > 1 ) 1143 bError = sal_True; 1144 else if ( nIndex == 1 ) 1145 eWhich = SC_SPLIT_BOTTOMRIGHT; 1146 // sonst SC_SPLIT_BOTTOMLEFT 1147 } 1148 else if ( bVer ) 1149 { 1150 if ( nIndex > 1 ) 1151 bError = sal_True; 1152 else if ( nIndex == 0 ) 1153 eWhich = SC_SPLIT_TOPLEFT; 1154 // sonst SC_SPLIT_BOTTOMLEFT 1155 } 1156 else if ( nIndex > 0 ) 1157 bError = sal_True; // nicht geteilt: nur 0 gueltig 1158 1159 if (!bError) 1160 return new ScViewPaneObj( pViewSh, sal::static_int_cast<sal_uInt16>(eWhich) ); 1161 } 1162 1163 return NULL; 1164 } 1165 1166 uno::Reference<sheet::XSpreadsheet> SAL_CALL ScTabViewObj::getActiveSheet() 1167 throw(uno::RuntimeException) 1168 { 1169 ScUnoGuard aGuard; 1170 ScTabViewShell* pViewSh = GetViewShell(); 1171 if (pViewSh) 1172 { 1173 ScViewData* pData = pViewSh->GetViewData(); 1174 SCTAB nTab = pData->GetTabNo(); 1175 return new ScTableSheetObj( pData->GetDocShell(), nTab ); 1176 } 1177 return NULL; 1178 } 1179 1180 void SAL_CALL ScTabViewObj::setActiveSheet( const uno::Reference<sheet::XSpreadsheet>& xActiveSheet ) 1181 throw(uno::RuntimeException) 1182 { 1183 ScUnoGuard aGuard; 1184 1185 ScTabViewShell* pViewSh = GetViewShell(); 1186 if ( pViewSh && xActiveSheet.is() ) 1187 { 1188 // XSpreadsheet und ScCellRangesBase -> muss ein Sheet sein 1189 1190 ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xActiveSheet ); 1191 if ( pRangesImp && pViewSh->GetViewData()->GetDocShell() == pRangesImp->GetDocShell() ) 1192 { 1193 const ScRangeList& rRanges = pRangesImp->GetRangeList(); 1194 if ( rRanges.Count() == 1 ) 1195 { 1196 SCTAB nNewTab = rRanges.GetObject(0)->aStart.Tab(); 1197 if ( pViewSh->GetViewData()->GetDocument()->HasTable(nNewTab) ) 1198 pViewSh->SetTabNo( nNewTab ); 1199 } 1200 } 1201 } 1202 } 1203 1204 uno::Reference< uno::XInterface > ScTabViewObj::GetClickedObject(const Point& rPoint) const 1205 { 1206 uno::Reference< uno::XInterface > xTarget; 1207 if (GetViewShell()) 1208 { 1209 SCsCOL nX; 1210 SCsROW nY; 1211 ScViewData* pData = GetViewShell()->GetViewData(); 1212 ScSplitPos eSplitMode = pData->GetActivePart(); 1213 SCTAB nTab(pData->GetTabNo()); 1214 pData->GetPosFromPixel( rPoint.X(), rPoint.Y(), eSplitMode, nX, nY); 1215 1216 ScAddress aCellPos (nX, nY, nTab); 1217 ScCellObj* pCellObj = new ScCellObj(pData->GetDocShell(), aCellPos); 1218 1219 xTarget.set(uno::Reference<table::XCell>(pCellObj), uno::UNO_QUERY); 1220 1221 ScDocument* pDoc = pData->GetDocument(); 1222 if (pDoc && pDoc->GetDrawLayer()) 1223 { 1224 SdrPage* pDrawPage = NULL; 1225 ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); 1226 if (pDrawLayer->HasObjects() && (pDrawLayer->GetPageCount() > nTab)) 1227 pDrawPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); 1228 1229 SdrView* pDrawView = GetViewShell()->GetSdrView(); 1230 1231 if (pDrawPage && pDrawView && pDrawView->GetSdrPageView()) 1232 { 1233 Window* pActiveWin = pData->GetActiveWin(); 1234 Point aPos = pActiveWin->PixelToLogic(rPoint); 1235 1236 sal_uInt16 nHitLog = (sal_uInt16) pActiveWin->PixelToLogic( 1237 Size(pDrawView->GetHitTolerancePixel(),0)).Width(); 1238 1239 sal_uInt32 nCount(pDrawPage->GetObjCount()); 1240 sal_Bool bFound(sal_False); 1241 sal_uInt32 i(0); 1242 while (i < nCount && !bFound) 1243 { 1244 SdrObject* pObj = pDrawPage->GetObj(i); 1245 if (pObj && SdrObjectPrimitiveHit(*pObj, aPos, nHitLog, *pDrawView->GetSdrPageView(), 0, false)) 1246 { 1247 xTarget.set(pObj->getUnoShape(), uno::UNO_QUERY); 1248 bFound = sal_True; 1249 } 1250 ++i; 1251 } 1252 } 1253 } 1254 } 1255 return xTarget; 1256 } 1257 1258 bool ScTabViewObj::IsMouseListening() const 1259 { 1260 if ( aMouseClickHandlers.Count() > 0 ) 1261 return true; 1262 1263 // also include sheet events, because MousePressed must be called for them 1264 ScViewData* pViewData = GetViewShell()->GetViewData(); 1265 ScDocument* pDoc = pViewData->GetDocument(); 1266 SCTAB nTab = pViewData->GetTabNo(); 1267 return 1268 pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_RIGHTCLICK, true ) || 1269 pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_DOUBLECLICK, true ); 1270 } 1271 1272 sal_Bool ScTabViewObj::MousePressed( const awt::MouseEvent& e ) 1273 throw (::uno::RuntimeException) 1274 { 1275 sal_Bool bReturn(sal_False); 1276 1277 uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y)); 1278 if (aMouseClickHandlers.Count() && xTarget.is()) 1279 { 1280 awt::EnhancedMouseEvent aMouseEvent; 1281 1282 aMouseEvent.Buttons = e.Buttons; 1283 aMouseEvent.X = e.X; 1284 aMouseEvent.Y = e.Y; 1285 aMouseEvent.ClickCount = e.ClickCount; 1286 aMouseEvent.PopupTrigger = e.PopupTrigger; 1287 aMouseEvent.Target = xTarget; 1288 aMouseEvent.Modifiers = e.Modifiers; 1289 1290 for ( sal_uInt16 n=0; n<aMouseClickHandlers.Count(); n++ ) 1291 { 1292 try 1293 { 1294 if (!(*aMouseClickHandlers[n])->mousePressed( aMouseEvent )) 1295 bReturn = sal_True; 1296 } 1297 catch ( uno::Exception& ) 1298 { 1299 aMouseClickHandlers.DeleteAndDestroy(n); 1300 --n; // because it will be increased again in the loop 1301 } 1302 } 1303 } 1304 1305 // handle sheet events 1306 bool bDoubleClick = ( e.Buttons == awt::MouseButton::LEFT && e.ClickCount == 2 ); 1307 bool bRightClick = ( e.Buttons == awt::MouseButton::RIGHT && e.ClickCount == 1 ); 1308 if ( ( bDoubleClick || bRightClick ) && !bReturn && xTarget.is()) 1309 { 1310 sal_Int32 nEvent = bDoubleClick ? SC_SHEETEVENT_DOUBLECLICK : SC_SHEETEVENT_RIGHTCLICK; 1311 1312 ScTabViewShell* pViewSh = GetViewShell(); 1313 ScViewData* pViewData = pViewSh->GetViewData(); 1314 ScDocShell* pDocSh = pViewData->GetDocShell(); 1315 ScDocument* pDoc = pDocSh->GetDocument(); 1316 SCTAB nTab = pViewData->GetTabNo(); 1317 const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab); 1318 if (pEvents) 1319 { 1320 const rtl::OUString* pScript = pEvents->GetScript(nEvent); 1321 if (pScript) 1322 { 1323 // the macro parameter is the clicked object, as in the mousePressed call above 1324 uno::Sequence<uno::Any> aParams(1); 1325 aParams[0] <<= xTarget; 1326 1327 uno::Any aRet; 1328 uno::Sequence<sal_Int16> aOutArgsIndex; 1329 uno::Sequence<uno::Any> aOutArgs; 1330 1331 /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs ); 1332 1333 // look for a boolean return value of true 1334 sal_Bool bRetValue = sal_False; 1335 if (aRet >>= bRetValue) 1336 { 1337 if (bRetValue) 1338 bReturn = sal_True; 1339 } 1340 } 1341 } 1342 1343 // execute VBA event handler 1344 if (!bReturn && xTarget.is()) try 1345 { 1346 uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW ); 1347 // the parameter is the clicked object, as in the mousePressed call above 1348 uno::Sequence< uno::Any > aArgs( 1 ); 1349 aArgs[ 0 ] <<= xTarget; 1350 xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs ); 1351 } 1352 catch( util::VetoException& ) 1353 { 1354 bReturn = sal_True; 1355 } 1356 catch( uno::Exception& ) 1357 { 1358 } 1359 } 1360 1361 return bReturn; 1362 } 1363 1364 sal_Bool ScTabViewObj::MouseReleased( const awt::MouseEvent& e ) 1365 throw (uno::RuntimeException) 1366 { 1367 sal_Bool bReturn(sal_False); 1368 1369 if (aMouseClickHandlers.Count()) 1370 { 1371 uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y)); 1372 1373 if (xTarget.is()) 1374 { 1375 awt::EnhancedMouseEvent aMouseEvent; 1376 1377 aMouseEvent.Buttons = e.Buttons; 1378 aMouseEvent.X = e.X; 1379 aMouseEvent.Y = e.Y; 1380 aMouseEvent.ClickCount = e.ClickCount; 1381 aMouseEvent.PopupTrigger = e.PopupTrigger; 1382 aMouseEvent.Target = xTarget; 1383 aMouseEvent.Modifiers = e.Modifiers; 1384 1385 for ( sal_uInt16 n=0; n<aMouseClickHandlers.Count(); n++ ) 1386 { 1387 try 1388 { 1389 if (!(*aMouseClickHandlers[n])->mouseReleased( aMouseEvent )) 1390 bReturn = sal_True; 1391 } 1392 catch ( uno::Exception& ) 1393 { 1394 aMouseClickHandlers.DeleteAndDestroy(n); 1395 --n; // because it will be increased again in the loop 1396 } 1397 } 1398 } 1399 } 1400 return bReturn; 1401 } 1402 1403 // XEnhancedMouseClickBroadcaster 1404 1405 void ScTabViewObj::StartMouseListening() 1406 { 1407 } 1408 1409 void ScTabViewObj::EndMouseListening() 1410 { 1411 sal_uInt16 nCount(aMouseClickHandlers.Count()); 1412 lang::EventObject aEvent; 1413 aEvent.Source = (cppu::OWeakObject*)this; 1414 for ( sal_uInt16 n=0; n<nCount; n++ ) 1415 { 1416 try 1417 { 1418 (*aMouseClickHandlers[n])->disposing(aEvent); 1419 } 1420 catch ( uno::Exception& ) 1421 { 1422 } 1423 } 1424 aMouseClickHandlers.DeleteAndDestroy(0, nCount); 1425 } 1426 1427 void ScTabViewObj::StartActivationListening() 1428 { 1429 } 1430 1431 void ScTabViewObj::EndActivationListening() 1432 { 1433 sal_uInt16 nCount = aActivationListeners.Count(); 1434 lang::EventObject aEvent; 1435 aEvent.Source = (cppu::OWeakObject*)this; 1436 for ( sal_uInt16 n=0; n<nCount; n++ ) 1437 { 1438 try 1439 { 1440 (*aActivationListeners[n])->disposing(aEvent); 1441 } 1442 catch ( uno::Exception& ) 1443 { 1444 } 1445 } 1446 aActivationListeners.DeleteAndDestroy(0, nCount); 1447 } 1448 1449 void SAL_CALL ScTabViewObj::addEnhancedMouseClickHandler( const uno::Reference< awt::XEnhancedMouseClickHandler >& aListener ) 1450 throw (uno::RuntimeException) 1451 { 1452 ScUnoGuard aGuard; 1453 1454 if (aListener.is()) 1455 { 1456 sal_uInt16 nCount = aMouseClickHandlers.Count(); 1457 uno::Reference<awt::XEnhancedMouseClickHandler> *pObj = 1458 new uno::Reference<awt::XEnhancedMouseClickHandler>( aListener ); 1459 aMouseClickHandlers.Insert( pObj, nCount ); 1460 1461 if (aMouseClickHandlers.Count() == 1 && nCount == 0) // only if a listener added 1462 StartMouseListening(); 1463 } 1464 } 1465 1466 void SAL_CALL ScTabViewObj::removeEnhancedMouseClickHandler( const uno::Reference< awt::XEnhancedMouseClickHandler >& aListener ) 1467 throw (uno::RuntimeException) 1468 { 1469 ScUnoGuard aGuard; 1470 sal_uInt16 nCount = aMouseClickHandlers.Count(); 1471 for ( sal_uInt16 n=nCount; n--; ) 1472 { 1473 uno::Reference<awt::XEnhancedMouseClickHandler> *pObj = aMouseClickHandlers[n]; 1474 if ( *pObj == aListener ) 1475 aMouseClickHandlers.DeleteAndDestroy( n ); 1476 } 1477 if ((aMouseClickHandlers.Count() == 0) && (nCount > 0)) // only if last listener removed 1478 EndMouseListening(); 1479 } 1480 1481 // XActivationBroadcaster 1482 1483 void SAL_CALL ScTabViewObj::addActivationEventListener( const uno::Reference< sheet::XActivationEventListener >& aListener ) 1484 throw (uno::RuntimeException) 1485 { 1486 ScUnoGuard aGuard; 1487 1488 if (aListener.is()) 1489 { 1490 sal_uInt16 nCount = aActivationListeners.Count(); 1491 uno::Reference<sheet::XActivationEventListener> *pObj = 1492 new uno::Reference<sheet::XActivationEventListener>( aListener ); 1493 aActivationListeners.Insert( pObj, nCount ); 1494 1495 if (aActivationListeners.Count() == 1 && nCount == 0) // only if a listener added 1496 StartActivationListening(); 1497 } 1498 } 1499 1500 void SAL_CALL ScTabViewObj::removeActivationEventListener( const uno::Reference< sheet::XActivationEventListener >& aListener ) 1501 throw (uno::RuntimeException) 1502 { 1503 ScUnoGuard aGuard; 1504 sal_uInt16 nCount = aActivationListeners.Count(); 1505 for ( sal_uInt16 n=nCount; n--; ) 1506 { 1507 uno::Reference<sheet::XActivationEventListener> *pObj = aActivationListeners[n]; 1508 if ( *pObj == aListener ) 1509 aActivationListeners.DeleteAndDestroy( n ); 1510 } 1511 if ((aActivationListeners.Count() == 0) && (nCount > 0)) // only if last listener removed 1512 EndActivationListening(); 1513 } 1514 1515 // PageBreakMode / Zoom sind Properties 1516 1517 #if 0 1518 1519 sal_Bool ScTabViewObj::getPagebreakMode(void) const 1520 { 1521 ScUnoGuard aGuard; 1522 ScTabViewShell* pViewSh = GetViewShell(); 1523 if (pViewSh) 1524 return pViewSh->GetViewData()->IsPagebreakMode(); 1525 return sal_False; 1526 } 1527 1528 void ScTabViewObj::setPagebreakMode(sal_Bool PagebreakMode) 1529 { 1530 ScUnoGuard aGuard; 1531 ScTabViewShell* pViewSh = GetViewShell(); 1532 if (pViewSh) 1533 pViewSh->SetPagebreakMode(PagebreakMode); 1534 } 1535 1536 #endif 1537 1538 sal_Int16 ScTabViewObj::GetZoom(void) const 1539 { 1540 ScTabViewShell* pViewSh = GetViewShell(); 1541 if (pViewSh) 1542 { 1543 const Fraction& rZoomY = pViewSh->GetViewData()->GetZoomY(); // Y wird angezeigt 1544 return (sal_Int16)(( rZoomY.GetNumerator() * 100 ) / rZoomY.GetDenominator()); 1545 } 1546 return 0; 1547 } 1548 1549 void ScTabViewObj::SetZoom(sal_Int16 nZoom) 1550 { 1551 ScTabViewShell* pViewSh = GetViewShell(); 1552 if (pViewSh) 1553 { 1554 if ( nZoom != GetZoom() && nZoom != 0 ) 1555 { 1556 if (!pViewSh->GetViewData()->IsPagebreakMode()) 1557 { 1558 ScModule* pScMod = SC_MOD(); 1559 ScAppOptions aNewOpt(pScMod->GetAppOptions()); 1560 aNewOpt.SetZoom( nZoom ); 1561 aNewOpt.SetZoomType( pViewSh->GetViewData()->GetView()->GetZoomType() ); 1562 pScMod->SetAppOptions( aNewOpt ); 1563 } 1564 } 1565 Fraction aFract( nZoom, 100 ); 1566 pViewSh->SetZoom( aFract, aFract, sal_True ); 1567 pViewSh->PaintGrid(); 1568 pViewSh->PaintTop(); 1569 pViewSh->PaintLeft(); 1570 pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM ); 1571 pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); 1572 } 1573 } 1574 1575 sal_Int16 ScTabViewObj::GetZoomType(void) const 1576 { 1577 sal_Int16 aZoomType = view::DocumentZoomType::OPTIMAL; 1578 ScTabViewShell* pViewSh = GetViewShell(); 1579 if (pViewSh) 1580 { 1581 SvxZoomType eZoomType = pViewSh->GetViewData()->GetView()->GetZoomType(); 1582 switch (eZoomType) 1583 { 1584 case SVX_ZOOM_PERCENT: 1585 aZoomType = view::DocumentZoomType::BY_VALUE; 1586 break; 1587 case SVX_ZOOM_OPTIMAL: 1588 aZoomType = view::DocumentZoomType::OPTIMAL; 1589 break; 1590 case SVX_ZOOM_WHOLEPAGE: 1591 aZoomType = view::DocumentZoomType::ENTIRE_PAGE; 1592 break; 1593 case SVX_ZOOM_PAGEWIDTH: 1594 aZoomType = view::DocumentZoomType::PAGE_WIDTH; 1595 break; 1596 case SVX_ZOOM_PAGEWIDTH_NOBORDER: 1597 aZoomType = view::DocumentZoomType::PAGE_WIDTH_EXACT; 1598 break; 1599 } 1600 } 1601 return aZoomType; 1602 } 1603 1604 void ScTabViewObj::SetZoomType(sal_Int16 aZoomType) 1605 { 1606 ScTabViewShell* pViewSh = GetViewShell(); 1607 if (pViewSh) 1608 { 1609 ScDBFunc* pView = pViewSh->GetViewData()->GetView(); 1610 if (pView) 1611 { 1612 SvxZoomType eZoomType; 1613 switch (aZoomType) 1614 { 1615 case view::DocumentZoomType::BY_VALUE: 1616 eZoomType = SVX_ZOOM_PERCENT; 1617 break; 1618 case view::DocumentZoomType::OPTIMAL: 1619 eZoomType = SVX_ZOOM_OPTIMAL; 1620 break; 1621 case view::DocumentZoomType::ENTIRE_PAGE: 1622 eZoomType = SVX_ZOOM_WHOLEPAGE; 1623 break; 1624 case view::DocumentZoomType::PAGE_WIDTH: 1625 eZoomType = SVX_ZOOM_PAGEWIDTH; 1626 break; 1627 case view::DocumentZoomType::PAGE_WIDTH_EXACT: 1628 eZoomType = SVX_ZOOM_PAGEWIDTH_NOBORDER; 1629 break; 1630 default: 1631 eZoomType = SVX_ZOOM_OPTIMAL; 1632 } 1633 sal_Int16 nZoom(GetZoom()); 1634 sal_Int16 nOldZoom(nZoom); 1635 if ( eZoomType == SVX_ZOOM_PERCENT ) 1636 { 1637 if ( nZoom < MINZOOM ) nZoom = MINZOOM; 1638 if ( nZoom > MAXZOOM ) nZoom = MAXZOOM; 1639 } 1640 else 1641 nZoom = pView->CalcZoom( eZoomType, nOldZoom ); 1642 1643 switch ( eZoomType ) 1644 { 1645 case SVX_ZOOM_WHOLEPAGE: 1646 case SVX_ZOOM_PAGEWIDTH: 1647 pView->SetZoomType( eZoomType, sal_True ); 1648 break; 1649 1650 default: 1651 pView->SetZoomType( SVX_ZOOM_PERCENT, sal_True ); 1652 } 1653 SetZoom( nZoom ); 1654 } 1655 } 1656 } 1657 1658 sal_Bool SAL_CALL ScTabViewObj::getIsWindowSplit() throw(uno::RuntimeException) 1659 { 1660 ScUnoGuard aGuard; 1661 // wie Menue-Slot SID_WINDOW_SPLIT 1662 1663 ScTabViewShell* pViewSh = GetViewShell(); 1664 if (pViewSh) 1665 { 1666 ScViewData* pViewData = pViewSh->GetViewData(); 1667 return ( pViewData->GetHSplitMode() == SC_SPLIT_NORMAL || 1668 pViewData->GetVSplitMode() == SC_SPLIT_NORMAL ); 1669 } 1670 1671 return sal_False; 1672 } 1673 1674 sal_Bool SAL_CALL ScTabViewObj::hasFrozenPanes() throw(uno::RuntimeException) 1675 { 1676 ScUnoGuard aGuard; 1677 // wie Menue-Slot SID_WINDOW_FIX 1678 1679 ScTabViewShell* pViewSh = GetViewShell(); 1680 if (pViewSh) 1681 { 1682 ScViewData* pViewData = pViewSh->GetViewData(); 1683 return ( pViewData->GetHSplitMode() == SC_SPLIT_FIX || 1684 pViewData->GetVSplitMode() == SC_SPLIT_FIX ); 1685 } 1686 1687 return sal_False; 1688 } 1689 1690 sal_Int32 SAL_CALL ScTabViewObj::getSplitHorizontal() throw(uno::RuntimeException) 1691 { 1692 ScUnoGuard aGuard; 1693 ScTabViewShell* pViewSh = GetViewShell(); 1694 if (pViewSh) 1695 { 1696 ScViewData* pViewData = pViewSh->GetViewData(); 1697 if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE ) 1698 return pViewData->GetHSplitPos(); 1699 } 1700 return 0; 1701 } 1702 1703 sal_Int32 SAL_CALL ScTabViewObj::getSplitVertical() throw(uno::RuntimeException) 1704 { 1705 ScUnoGuard aGuard; 1706 ScTabViewShell* pViewSh = GetViewShell(); 1707 if (pViewSh) 1708 { 1709 ScViewData* pViewData = pViewSh->GetViewData(); 1710 if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE ) 1711 return pViewData->GetVSplitPos(); 1712 } 1713 return 0; 1714 } 1715 1716 sal_Int32 SAL_CALL ScTabViewObj::getSplitColumn() throw(uno::RuntimeException) 1717 { 1718 ScUnoGuard aGuard; 1719 ScTabViewShell* pViewSh = GetViewShell(); 1720 if (pViewSh) 1721 { 1722 ScViewData* pViewData = pViewSh->GetViewData(); 1723 if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE ) 1724 { 1725 long nSplit = pViewData->GetHSplitPos(); 1726 1727 ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT; 1728 if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE ) 1729 ePos = SC_SPLIT_TOPLEFT; 1730 1731 SCsCOL nCol; 1732 SCsROW nRow; 1733 pViewData->GetPosFromPixel( nSplit, 0, ePos, nCol, nRow, sal_False ); 1734 if ( nCol > 0 ) 1735 return nCol; 1736 } 1737 } 1738 return 0; 1739 } 1740 1741 sal_Int32 SAL_CALL ScTabViewObj::getSplitRow() throw(uno::RuntimeException) 1742 { 1743 ScUnoGuard aGuard; 1744 ScTabViewShell* pViewSh = GetViewShell(); 1745 if (pViewSh) 1746 { 1747 ScViewData* pViewData = pViewSh->GetViewData(); 1748 if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE ) 1749 { 1750 long nSplit = pViewData->GetVSplitPos(); 1751 1752 ScSplitPos ePos = SC_SPLIT_TOPLEFT; // es ist vertikal geteilt 1753 SCsCOL nCol; 1754 SCsROW nRow; 1755 pViewData->GetPosFromPixel( 0, nSplit, ePos, nCol, nRow, sal_False ); 1756 if ( nRow > 0 ) 1757 return nRow; 1758 } 1759 } 1760 return 0; 1761 } 1762 1763 void SAL_CALL ScTabViewObj::splitAtPosition( sal_Int32 nPixelX, sal_Int32 nPixelY ) 1764 throw(uno::RuntimeException) 1765 { 1766 ScUnoGuard aGuard; 1767 ScTabViewShell* pViewSh = GetViewShell(); 1768 if (pViewSh) 1769 { 1770 pViewSh->SplitAtPixel( Point( nPixelX, nPixelY ), sal_True, sal_True ); 1771 pViewSh->FreezeSplitters( sal_False ); 1772 pViewSh->InvalidateSplit(); 1773 } 1774 } 1775 1776 void SAL_CALL ScTabViewObj::freezeAtPosition( sal_Int32 nColumns, sal_Int32 nRows ) 1777 throw(uno::RuntimeException) 1778 { 1779 ScUnoGuard aGuard; 1780 ScTabViewShell* pViewSh = GetViewShell(); 1781 if (pViewSh) 1782 { 1783 // erst alles aufheben -> kein Stress mit Scrolling zwischendurch o.ae. 1784 1785 pViewSh->RemoveSplit(); 1786 1787 Point aWinStart; 1788 Window* pWin = pViewSh->GetWindowByPos( SC_SPLIT_BOTTOMLEFT ); 1789 if (pWin) 1790 aWinStart = pWin->GetPosPixel(); 1791 1792 ScViewData* pViewData = pViewSh->GetViewData(); 1793 Point aSplit(pViewData->GetScrPos( (SCCOL)nColumns, (SCROW)nRows, SC_SPLIT_BOTTOMLEFT, sal_True )); 1794 aSplit += aWinStart; 1795 1796 pViewSh->SplitAtPixel( aSplit, sal_True, sal_True ); 1797 pViewSh->FreezeSplitters( sal_True ); 1798 pViewSh->InvalidateSplit(); 1799 } 1800 } 1801 1802 void SAL_CALL ScTabViewObj::addSelectionChangeListener( 1803 const uno::Reference<view::XSelectionChangeListener>& xListener ) 1804 throw(uno::RuntimeException) 1805 { 1806 ScUnoGuard aGuard; 1807 uno::Reference<view::XSelectionChangeListener>* pObj = 1808 new uno::Reference<view::XSelectionChangeListener>( xListener ); 1809 aSelectionListeners.Insert( pObj, aSelectionListeners.Count() ); 1810 } 1811 1812 void SAL_CALL ScTabViewObj::removeSelectionChangeListener( 1813 const uno::Reference< view::XSelectionChangeListener >& xListener ) 1814 throw(uno::RuntimeException) 1815 { 1816 ScUnoGuard aGuard; 1817 sal_uInt16 nCount = aSelectionListeners.Count(); 1818 for ( sal_uInt16 n=nCount; n--; ) 1819 { 1820 uno::Reference<view::XSelectionChangeListener> *pObj = aSelectionListeners[n]; 1821 if ( *pObj == xListener ) //! wozu der Mumpitz mit queryInterface? 1822 { 1823 aSelectionListeners.DeleteAndDestroy( n ); 1824 break; 1825 } 1826 } 1827 } 1828 1829 void ScTabViewObj::SelectionChanged() 1830 { 1831 lang::EventObject aEvent; 1832 aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); 1833 for ( sal_uInt16 n=0; n<aSelectionListeners.Count(); n++ ) 1834 (*aSelectionListeners[n])->selectionChanged( aEvent ); 1835 1836 // handle sheet events 1837 ScTabViewShell* pViewSh = GetViewShell(); 1838 ScViewData* pViewData = pViewSh->GetViewData(); 1839 ScDocShell* pDocSh = pViewData->GetDocShell(); 1840 ScDocument* pDoc = pDocSh->GetDocument(); 1841 SCTAB nTab = pViewData->GetTabNo(); 1842 const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab); 1843 if (pEvents) 1844 { 1845 const rtl::OUString* pScript = pEvents->GetScript(SC_SHEETEVENT_SELECT); 1846 if (pScript) 1847 { 1848 // the macro parameter is the selection as returned by getSelection 1849 uno::Sequence<uno::Any> aParams(1); 1850 aParams[0] = getSelection(); 1851 uno::Any aRet; 1852 uno::Sequence<sal_Int16> aOutArgsIndex; 1853 uno::Sequence<uno::Any> aOutArgs; 1854 /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs ); 1855 } 1856 } 1857 1858 // execute VBA event handler 1859 try 1860 { 1861 uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW ); 1862 // the parameter is the clicked object, as in the mousePressed call above 1863 uno::Sequence< uno::Any > aArgs( 1 ); 1864 aArgs[ 0 ] <<= getSelection(); 1865 xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( SC_SHEETEVENT_SELECT ), aArgs ); 1866 } 1867 catch( uno::Exception& ) 1868 { 1869 } 1870 } 1871 1872 1873 // XPropertySet (View-Optionen) 1874 //! auch an der Applikation anbieten? 1875 1876 uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTabViewObj::getPropertySetInfo() 1877 throw(uno::RuntimeException) 1878 { 1879 ScUnoGuard aGuard; 1880 static uno::Reference<beans::XPropertySetInfo> aRef( 1881 new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); 1882 return aRef; 1883 } 1884 1885 void SAL_CALL ScTabViewObj::setPropertyValue( 1886 const rtl::OUString& aPropertyName, const uno::Any& aValue ) 1887 throw(beans::UnknownPropertyException, beans::PropertyVetoException, 1888 lang::IllegalArgumentException, lang::WrappedTargetException, 1889 uno::RuntimeException) 1890 { 1891 ScUnoGuard aGuard; 1892 String aString(aPropertyName); 1893 1894 ScTabViewShell* pViewSh = GetViewShell(); 1895 if (pViewSh) 1896 { 1897 ScViewData* pViewData = pViewSh->GetViewData(); 1898 const ScViewOptions& rOldOpt = pViewSh->GetViewData()->GetOptions(); 1899 ScViewOptions aNewOpt(rOldOpt); 1900 1901 if ( aString.EqualsAscii( SC_UNO_COLROWHDR ) || aString.EqualsAscii( OLD_UNO_COLROWHDR ) ) 1902 aNewOpt.SetOption( VOPT_HEADER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1903 else if ( aString.EqualsAscii( SC_UNO_HORSCROLL ) || aString.EqualsAscii( OLD_UNO_HORSCROLL ) ) 1904 aNewOpt.SetOption( VOPT_HSCROLL, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1905 else if ( aString.EqualsAscii( SC_UNO_OUTLSYMB ) || aString.EqualsAscii( OLD_UNO_OUTLSYMB ) ) 1906 aNewOpt.SetOption( VOPT_OUTLINER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1907 else if ( aString.EqualsAscii( SC_UNO_SHEETTABS ) || aString.EqualsAscii( OLD_UNO_SHEETTABS ) ) 1908 aNewOpt.SetOption( VOPT_TABCONTROLS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1909 else if ( aString.EqualsAscii( SC_UNO_SHOWANCHOR ) ) 1910 aNewOpt.SetOption( VOPT_ANCHOR, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1911 else if ( aString.EqualsAscii( SC_UNO_SHOWFORM ) ) 1912 aNewOpt.SetOption( VOPT_FORMULAS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1913 else if ( aString.EqualsAscii( SC_UNO_SHOWGRID ) ) 1914 aNewOpt.SetOption( VOPT_GRID, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1915 else if ( aString.EqualsAscii( SC_UNO_SHOWHELP ) ) 1916 aNewOpt.SetOption( VOPT_HELPLINES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1917 else if ( aString.EqualsAscii( SC_UNO_SHOWNOTES ) ) 1918 aNewOpt.SetOption( VOPT_NOTES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1919 else if ( aString.EqualsAscii( SC_UNO_SHOWPAGEBR ) ) 1920 aNewOpt.SetOption( VOPT_PAGEBREAKS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1921 else if ( aString.EqualsAscii( SC_UNO_SHOWZERO ) ) 1922 aNewOpt.SetOption( VOPT_NULLVALS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1923 else if ( aString.EqualsAscii( SC_UNO_SHOWSOLID ) ) 1924 aNewOpt.SetOption( VOPT_SOLIDHANDLES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1925 else if ( aString.EqualsAscii( SC_UNO_VALUEHIGH ) || aString.EqualsAscii( OLD_UNO_VALUEHIGH ) ) 1926 aNewOpt.SetOption( VOPT_SYNTAX, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1927 else if ( aString.EqualsAscii( SC_UNO_VERTSCROLL ) || aString.EqualsAscii( OLD_UNO_VERTSCROLL ) ) 1928 aNewOpt.SetOption( VOPT_VSCROLL, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); 1929 else if ( aString.EqualsAscii( SC_UNO_SHOWOBJ ) ) 1930 { 1931 sal_Int16 nIntVal = 0; 1932 if ( aValue >>= nIntVal ) 1933 { 1934 //#i80528# adapt to new range eventually 1935 if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW; 1936 1937 aNewOpt.SetObjMode( VOBJ_TYPE_OLE, (ScVObjMode)nIntVal); 1938 } 1939 } 1940 else if ( aString.EqualsAscii( SC_UNO_SHOWCHARTS ) ) 1941 { 1942 sal_Int16 nIntVal = 0; 1943 if ( aValue >>= nIntVal ) 1944 { 1945 //#i80528# adapt to new range eventually 1946 if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW; 1947 1948 aNewOpt.SetObjMode( VOBJ_TYPE_CHART, (ScVObjMode)nIntVal); 1949 } 1950 } 1951 else if ( aString.EqualsAscii( SC_UNO_SHOWDRAW ) ) 1952 { 1953 sal_Int16 nIntVal = 0; 1954 if ( aValue >>= nIntVal ) 1955 { 1956 //#i80528# adapt to new range eventually 1957 if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW; 1958 1959 aNewOpt.SetObjMode( VOBJ_TYPE_DRAW, (ScVObjMode)nIntVal); 1960 } 1961 } 1962 else if ( aString.EqualsAscii( SC_UNO_GRIDCOLOR ) ) 1963 { 1964 sal_Int32 nIntVal = 0; 1965 if ( aValue >>= nIntVal ) 1966 aNewOpt.SetGridColor( nIntVal, String() ); 1967 } 1968 else if ( aString.EqualsAscii( SC_UNO_ZOOMTYPE ) ) 1969 { 1970 sal_Int16 nIntVal = 0; 1971 if ( aValue >>= nIntVal ) 1972 SetZoomType(nIntVal); 1973 } 1974 else if ( aString.EqualsAscii( SC_UNO_ZOOMVALUE ) ) 1975 { 1976 sal_Int16 nIntVal = 0; 1977 if ( aValue >>= nIntVal ) 1978 SetZoom(nIntVal); 1979 } 1980 1981 // Optionen werden an der View und am Dokument (fuer neue Views) gesetzt, 1982 // damit sie beim Speichern erhalten bleiben. 1983 //! An der App (Module) braeuchte man noch eine Extra-Moeglichkeit, 1984 //! das einzustellen (fuer neue Dokumente) 1985 1986 if ( aNewOpt != rOldOpt ) 1987 { 1988 pViewData->SetOptions( aNewOpt ); 1989 pViewData->GetDocument()->SetViewOptions( aNewOpt ); 1990 pViewData->GetDocShell()->SetDocumentModified(); //! wirklich? 1991 1992 pViewSh->UpdateFixPos(); 1993 pViewSh->PaintGrid(); 1994 pViewSh->PaintTop(); 1995 pViewSh->PaintLeft(); 1996 pViewSh->PaintExtras(); 1997 pViewSh->InvalidateBorder(); 1998 1999 SfxBindings& rBindings = pViewSh->GetViewFrame()->GetBindings(); 2000 rBindings.Invalidate( FID_TOGGLEHEADERS ); // -> Checks im Menue 2001 rBindings.Invalidate( FID_TOGGLESYNTAX ); 2002 } 2003 } 2004 } 2005 2006 uno::Any SAL_CALL ScTabViewObj::getPropertyValue( const rtl::OUString& aPropertyName ) 2007 throw(beans::UnknownPropertyException, lang::WrappedTargetException, 2008 uno::RuntimeException) 2009 { 2010 ScUnoGuard aGuard; 2011 String aString(aPropertyName); 2012 uno::Any aRet; 2013 2014 ScTabViewShell* pViewSh = GetViewShell(); 2015 if (pViewSh) 2016 { 2017 const ScViewOptions& rOpt = pViewSh->GetViewData()->GetOptions(); 2018 2019 if ( aString.EqualsAscii( SC_UNO_COLROWHDR ) || aString.EqualsAscii( OLD_UNO_COLROWHDR ) ) 2020 ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HEADER ) ); 2021 else if ( aString.EqualsAscii( SC_UNO_HORSCROLL ) || aString.EqualsAscii( OLD_UNO_HORSCROLL ) ) 2022 ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HSCROLL ) ); 2023 else if ( aString.EqualsAscii( SC_UNO_OUTLSYMB ) || aString.EqualsAscii( OLD_UNO_OUTLSYMB ) ) 2024 ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_OUTLINER ) ); 2025 else if ( aString.EqualsAscii( SC_UNO_SHEETTABS ) || aString.EqualsAscii( OLD_UNO_SHEETTABS ) ) 2026 ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_TABCONTROLS ) ); 2027 else if ( aString.EqualsAscii( SC_UNO_SHOWANCHOR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_ANCHOR ) ); 2028 else if ( aString.EqualsAscii( SC_UNO_SHOWFORM ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_FORMULAS ) ); 2029 else if ( aString.EqualsAscii( SC_UNO_SHOWGRID ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_GRID ) ); 2030 else if ( aString.EqualsAscii( SC_UNO_SHOWHELP ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HELPLINES ) ); 2031 else if ( aString.EqualsAscii( SC_UNO_SHOWNOTES ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_NOTES ) ); 2032 else if ( aString.EqualsAscii( SC_UNO_SHOWPAGEBR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_PAGEBREAKS ) ); 2033 else if ( aString.EqualsAscii( SC_UNO_SHOWZERO ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_NULLVALS ) ); 2034 else if ( aString.EqualsAscii( SC_UNO_SHOWSOLID ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_SOLIDHANDLES ) ); 2035 else if ( aString.EqualsAscii( SC_UNO_VALUEHIGH ) || aString.EqualsAscii( OLD_UNO_VALUEHIGH ) ) 2036 ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_SYNTAX ) ); 2037 else if ( aString.EqualsAscii( SC_UNO_VERTSCROLL ) || aString.EqualsAscii( OLD_UNO_VERTSCROLL ) ) 2038 ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_VSCROLL ) ); 2039 else if ( aString.EqualsAscii( SC_UNO_SHOWOBJ ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_OLE ) ); 2040 else if ( aString.EqualsAscii( SC_UNO_SHOWCHARTS ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_CHART ) ); 2041 else if ( aString.EqualsAscii( SC_UNO_SHOWDRAW ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_DRAW ) ); 2042 else if ( aString.EqualsAscii( SC_UNO_GRIDCOLOR ) ) aRet <<= (sal_Int32)( rOpt.GetGridColor().GetColor() ); 2043 else if ( aString.EqualsAscii( SC_UNO_VISAREA ) ) aRet <<= GetVisArea(); 2044 else if ( aString.EqualsAscii( SC_UNO_ZOOMTYPE ) ) aRet <<= GetZoomType(); 2045 else if ( aString.EqualsAscii( SC_UNO_ZOOMVALUE ) ) aRet <<= GetZoom(); 2046 else if ( aString.EqualsAscii( SC_UNO_VISAREASCREEN ) ) 2047 { 2048 ScViewData* pViewData = pViewSh->GetViewData(); 2049 Window* pActiveWin = ( pViewData ? pViewData->GetActiveWin() : NULL ); 2050 if ( pActiveWin ) 2051 { 2052 Rectangle aRect = pActiveWin->GetWindowExtentsRelative( NULL ); 2053 aRet <<= AWTRectangle( aRect ); 2054 } 2055 } 2056 } 2057 2058 return aRet; 2059 } 2060 2061 void SAL_CALL ScTabViewObj::addPropertyChangeListener( const ::rtl::OUString& /* aPropertyName */, 2062 const uno::Reference<beans::XPropertyChangeListener >& xListener ) 2063 throw(beans::UnknownPropertyException, 2064 lang::WrappedTargetException, 2065 uno::RuntimeException) 2066 { 2067 ScUnoGuard aGuard; 2068 uno::Reference<beans::XPropertyChangeListener>* pObj = 2069 new uno::Reference<beans::XPropertyChangeListener>( xListener ); 2070 aPropertyChgListeners.Insert( pObj, aPropertyChgListeners.Count() ); 2071 } 2072 2073 void SAL_CALL ScTabViewObj::removePropertyChangeListener( const ::rtl::OUString& /* aPropertyName */, 2074 const uno::Reference<beans::XPropertyChangeListener >& xListener ) 2075 throw(beans::UnknownPropertyException, 2076 lang::WrappedTargetException, 2077 uno::RuntimeException) 2078 { 2079 ScUnoGuard aGuard; 2080 sal_uInt16 nCount = aPropertyChgListeners.Count(); 2081 for ( sal_uInt16 n=nCount; n--; ) 2082 { 2083 uno::Reference<beans::XPropertyChangeListener> *pObj = aPropertyChgListeners[n]; 2084 if ( *pObj == xListener ) //! wozu der Mumpitz mit queryInterface? 2085 { 2086 aPropertyChgListeners.DeleteAndDestroy( n ); 2087 break; 2088 } 2089 } 2090 } 2091 2092 void SAL_CALL ScTabViewObj::addVetoableChangeListener( const ::rtl::OUString& /* PropertyName */, 2093 const uno::Reference<beans::XVetoableChangeListener >& /* aListener */ ) 2094 throw(beans::UnknownPropertyException, 2095 lang::WrappedTargetException, 2096 uno::RuntimeException) 2097 { 2098 } 2099 2100 void SAL_CALL ScTabViewObj::removeVetoableChangeListener( const ::rtl::OUString& /* PropertyName */, 2101 const uno::Reference<beans::XVetoableChangeListener >& /* aListener */ ) 2102 throw(beans::UnknownPropertyException, 2103 lang::WrappedTargetException, 2104 uno::RuntimeException) 2105 { 2106 } 2107 2108 void ScTabViewObj::VisAreaChanged() 2109 { 2110 beans::PropertyChangeEvent aEvent; 2111 aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); 2112 for ( sal_uInt16 n=0; n<aPropertyChgListeners.Count(); n++ ) 2113 (*aPropertyChgListeners[n])->propertyChange( aEvent ); 2114 } 2115 2116 // XRangeSelection 2117 2118 void SAL_CALL ScTabViewObj::startRangeSelection( 2119 const uno::Sequence<beans::PropertyValue>& aArguments ) 2120 throw(uno::RuntimeException) 2121 { 2122 ScUnoGuard aGuard; 2123 ScTabViewShell* pViewSh = GetViewShell(); 2124 if (pViewSh) 2125 { 2126 String aInitVal, aTitle; 2127 sal_Bool bCloseOnButtonUp = sal_False; 2128 sal_Bool bSingleCell = sal_False; 2129 sal_Bool bMultiSelection = sal_False; 2130 2131 rtl::OUString aStrVal; 2132 const beans::PropertyValue* pPropArray = aArguments.getConstArray(); 2133 long nPropCount = aArguments.getLength(); 2134 for (long i = 0; i < nPropCount; i++) 2135 { 2136 const beans::PropertyValue& rProp = pPropArray[i]; 2137 String aPropName(rProp.Name); 2138 2139 if (aPropName.EqualsAscii( SC_UNONAME_CLOSEONUP )) 2140 bCloseOnButtonUp = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); 2141 else if (aPropName.EqualsAscii( SC_UNONAME_TITLE )) 2142 { 2143 if ( rProp.Value >>= aStrVal ) 2144 aTitle = String( aStrVal ); 2145 } 2146 else if (aPropName.EqualsAscii( SC_UNONAME_INITVAL )) 2147 { 2148 if ( rProp.Value >>= aStrVal ) 2149 aInitVal = String( aStrVal ); 2150 } 2151 else if (aPropName.EqualsAscii( SC_UNONAME_SINGLECELL )) 2152 bSingleCell = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); 2153 else if (aPropName.EqualsAscii( SC_UNONAME_MULTISEL )) 2154 bMultiSelection = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); 2155 } 2156 2157 pViewSh->StartSimpleRefDialog( aTitle, aInitVal, bCloseOnButtonUp, bSingleCell, bMultiSelection ); 2158 } 2159 } 2160 2161 void SAL_CALL ScTabViewObj::abortRangeSelection() throw(uno::RuntimeException) 2162 { 2163 ScUnoGuard aGuard; 2164 ScTabViewShell* pViewSh = GetViewShell(); 2165 if (pViewSh) 2166 pViewSh->StopSimpleRefDialog(); 2167 } 2168 2169 void SAL_CALL ScTabViewObj::addRangeSelectionListener( 2170 const uno::Reference<sheet::XRangeSelectionListener>& xListener ) 2171 throw(uno::RuntimeException) 2172 { 2173 ScUnoGuard aGuard; 2174 uno::Reference<sheet::XRangeSelectionListener>* pObj = 2175 new uno::Reference<sheet::XRangeSelectionListener>( xListener ); 2176 aRangeSelListeners.Insert( pObj, aRangeSelListeners.Count() ); 2177 } 2178 2179 void SAL_CALL ScTabViewObj::removeRangeSelectionListener( 2180 const uno::Reference<sheet::XRangeSelectionListener>& xListener ) 2181 throw(uno::RuntimeException) 2182 { 2183 ScUnoGuard aGuard; 2184 sal_uInt16 nCount = aRangeSelListeners.Count(); 2185 for ( sal_uInt16 n=nCount; n--; ) 2186 { 2187 uno::Reference<sheet::XRangeSelectionListener> *pObj = aRangeSelListeners[n]; 2188 if ( *pObj == xListener ) 2189 { 2190 aRangeSelListeners.DeleteAndDestroy( n ); 2191 break; 2192 } 2193 } 2194 } 2195 2196 void SAL_CALL ScTabViewObj::addRangeSelectionChangeListener( 2197 const uno::Reference<sheet::XRangeSelectionChangeListener>& xListener ) 2198 throw(uno::RuntimeException) 2199 { 2200 ScUnoGuard aGuard; 2201 uno::Reference<sheet::XRangeSelectionChangeListener>* pObj = 2202 new uno::Reference<sheet::XRangeSelectionChangeListener>( xListener ); 2203 aRangeChgListeners.Insert( pObj, aRangeChgListeners.Count() ); 2204 } 2205 2206 void SAL_CALL ScTabViewObj::removeRangeSelectionChangeListener( 2207 const uno::Reference<sheet::XRangeSelectionChangeListener>& xListener ) 2208 throw(uno::RuntimeException) 2209 { 2210 ScUnoGuard aGuard; 2211 sal_uInt16 nCount = aRangeChgListeners.Count(); 2212 for ( sal_uInt16 n=nCount; n--; ) 2213 { 2214 uno::Reference<sheet::XRangeSelectionChangeListener> *pObj = aRangeChgListeners[n]; 2215 if ( *pObj == xListener ) 2216 { 2217 aRangeChgListeners.DeleteAndDestroy( n ); 2218 break; 2219 } 2220 } 2221 } 2222 2223 void ScTabViewObj::RangeSelDone( const String& rText ) 2224 { 2225 sheet::RangeSelectionEvent aEvent; 2226 aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); 2227 aEvent.RangeDescriptor = rtl::OUString( rText ); 2228 2229 for ( sal_uInt16 n=0; n<aRangeSelListeners.Count(); n++ ) 2230 (*aRangeSelListeners[n])->done( aEvent ); 2231 } 2232 2233 void ScTabViewObj::RangeSelAborted( const String& rText ) 2234 { 2235 sheet::RangeSelectionEvent aEvent; 2236 aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); 2237 aEvent.RangeDescriptor = rtl::OUString( rText ); 2238 2239 for ( sal_uInt16 n=0; n<aRangeSelListeners.Count(); n++ ) 2240 (*aRangeSelListeners[n])->aborted( aEvent ); 2241 } 2242 2243 void ScTabViewObj::RangeSelChanged( const String& rText ) 2244 { 2245 sheet::RangeSelectionEvent aEvent; 2246 aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); 2247 aEvent.RangeDescriptor = rtl::OUString( rText ); 2248 2249 for ( sal_uInt16 n=0; n<aRangeChgListeners.Count(); n++ ) 2250 (*aRangeChgListeners[n])->descriptorChanged( aEvent ); 2251 } 2252 2253 // XServiceInfo 2254 2255 rtl::OUString SAL_CALL ScTabViewObj::getImplementationName() throw(uno::RuntimeException) 2256 { 2257 return rtl::OUString::createFromAscii( "ScTabViewObj" ); 2258 } 2259 2260 sal_Bool SAL_CALL ScTabViewObj::supportsService( const rtl::OUString& rServiceName ) 2261 throw(uno::RuntimeException) 2262 { 2263 String aServiceStr( rServiceName ); 2264 return aServiceStr.EqualsAscii( SCTABVIEWOBJ_SERVICE ) || 2265 aServiceStr.EqualsAscii( SCVIEWSETTINGS_SERVICE ); 2266 } 2267 2268 uno::Sequence<rtl::OUString> SAL_CALL ScTabViewObj::getSupportedServiceNames() 2269 throw(uno::RuntimeException) 2270 { 2271 uno::Sequence<rtl::OUString> aRet(2); 2272 rtl::OUString* pArray = aRet.getArray(); 2273 pArray[0] = rtl::OUString::createFromAscii( SCTABVIEWOBJ_SERVICE ); 2274 pArray[1] = rtl::OUString::createFromAscii( SCVIEWSETTINGS_SERVICE ); 2275 return aRet; 2276 } 2277 2278 // XUnoTunnel 2279 2280 sal_Int64 SAL_CALL ScTabViewObj::getSomething( 2281 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) 2282 { 2283 if ( rId.getLength() == 16 && 2284 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), 2285 rId.getConstArray(), 16 ) ) 2286 { 2287 return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); 2288 } 2289 return 0; 2290 } 2291 2292 // static 2293 const uno::Sequence<sal_Int8>& ScTabViewObj::getUnoTunnelId() 2294 { 2295 static uno::Sequence<sal_Int8> * pSeq = 0; 2296 if( !pSeq ) 2297 { 2298 osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() ); 2299 if( !pSeq ) 2300 { 2301 static uno::Sequence< sal_Int8 > aSeq( 16 ); 2302 rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True ); 2303 pSeq = &aSeq; 2304 } 2305 } 2306 return *pSeq; 2307 } 2308 2309 // static 2310 ScTabViewObj* ScTabViewObj::getImplementation( const uno::Reference<uno::XInterface> xObj ) 2311 { 2312 ScTabViewObj* pRet = NULL; 2313 uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); 2314 if (xUT.is()) 2315 pRet = reinterpret_cast<ScTabViewObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); 2316 return pRet; 2317 } 2318 2319 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > SAL_CALL ScTabViewObj::getTransferable( ) throw (::com::sun::star::uno::RuntimeException) 2320 { 2321 ScUnoGuard aGuard; 2322 ScEditShell* pShell = PTR_CAST( ScEditShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ); 2323 if (pShell) 2324 return pShell->GetEditView()->GetTransferable(); 2325 2326 ScDrawTextObjectBar* pTextShell = PTR_CAST( ScDrawTextObjectBar, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ); 2327 if (pTextShell) 2328 { 2329 ScViewData* pViewData = GetViewShell()->GetViewData(); 2330 ScDrawView* pView = pViewData->GetScDrawView(); 2331 OutlinerView* pOutView = pView->GetTextEditOutlinerView(); 2332 if (pOutView) 2333 return pOutView->GetEditView().GetTransferable(); 2334 } 2335 2336 ScDrawShell* pDrawShell = PTR_CAST( ScDrawShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ); 2337 if (pDrawShell) 2338 return pDrawShell->GetDrawView()->CopyToTransferable(); 2339 2340 ScTransferObj* pObj = GetViewShell()->CopyToTransferable(); 2341 uno::Reference<datatransfer::XTransferable> xTransferable( pObj ); 2342 return xTransferable; 2343 } 2344 2345 void SAL_CALL ScTabViewObj::insertTransferable( const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans ) throw (::com::sun::star::datatransfer::UnsupportedFlavorException, ::com::sun::star::uno::RuntimeException) 2346 { 2347 ScUnoGuard aGuard; 2348 ScEditShell* pShell = PTR_CAST( ScEditShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ); 2349 if (pShell) 2350 pShell->GetEditView()->InsertText( xTrans, ::rtl::OUString(), sal_False ); 2351 else 2352 { 2353 ScDrawTextObjectBar* pTextShell = PTR_CAST( ScDrawTextObjectBar, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ); 2354 if (pTextShell) 2355 { 2356 ScViewData* pViewData = GetViewShell()->GetViewData(); 2357 ScDrawView* pView = pViewData->GetScDrawView(); 2358 OutlinerView* pOutView = pView->GetTextEditOutlinerView(); 2359 if ( pOutView ) 2360 { 2361 pOutView->GetEditView().InsertText( xTrans, ::rtl::OUString(), sal_False ); 2362 return; 2363 } 2364 } 2365 2366 GetViewShell()->PasteFromTransferable( xTrans ); 2367 } 2368 } 2369 2370 //------------------------------------------------------------------------ 2371 2372 2373 2374 2375