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 --------------------------------------------------------------- 28 29 #include <com/sun/star/embed/EmbedStates.hpp> 30 31 #include <svx/svditer.hxx> 32 #include <svx/svdograf.hxx> 33 #include <svx/svdomedia.hxx> 34 #include <svx/svdogrp.hxx> 35 #include <svx/svdoole2.hxx> 36 #include <svx/svdouno.hxx> 37 #include <svx/svdpage.hxx> 38 #include <svx/svdundo.hxx> 39 #include <svx/svdocapt.hxx> 40 #include <editeng/outlobj.hxx> 41 #include <editeng/writingmodeitem.hxx> 42 #include <svx/sdrpaintwindow.hxx> 43 #include <sfx2/bindings.hxx> 44 #include <sfx2/viewfrm.hxx> 45 #include <svx/sdrundomanager.hxx> 46 47 #include "drawview.hxx" 48 #include "global.hxx" 49 #include "viewdata.hxx" 50 #include "document.hxx" 51 #include "drawutil.hxx" 52 #include "futext.hxx" 53 #include "globstr.hrc" 54 #include "tabvwsh.hxx" 55 #include "client.hxx" 56 #include "scmod.hxx" 57 #include "drwlayer.hxx" 58 #include "docsh.hxx" 59 #include "viewuno.hxx" 60 #include "userdat.hxx" 61 #include "postit.hxx" 62 #include "undocell.hxx" 63 #include "document.hxx" 64 65 #include "sc.hrc" 66 67 using namespace com::sun::star; 68 69 // ----------------------------------------------------------------------- 70 71 #define SC_HANDLESIZE_BIG 9 72 #define SC_HANDLESIZE_SMALL 7 73 74 // ----------------------------------------------------------------------- 75 76 #ifdef _MSC_VER 77 #pragma optimize ( "", off ) 78 #endif 79 80 81 void ScDrawView::Construct() 82 { 83 EnableExtendedKeyInputDispatcher(sal_False); 84 EnableExtendedMouseEventDispatcher(sal_False); 85 EnableExtendedCommandEventDispatcher(sal_False); 86 87 SetFrameDragSingles(sal_True); 88 // SetSolidMarkHdl(sal_True); // einstellbar -> UpdateUserViewOptions 89 90 SetMinMoveDistancePixel( 2 ); 91 SetHitTolerancePixel( 2 ); 92 93 if (pViewData) 94 { 95 SCTAB nViewTab = pViewData->GetTabNo(); 96 ShowSdrPage(GetModel()->GetPage(nViewTab)); 97 98 sal_Bool bEx = pViewData->GetViewShell()->IsDrawSelMode(); 99 sal_Bool bProt = pDoc->IsTabProtected( nViewTab ) || 100 pViewData->GetSfxDocShell()->IsReadOnly(); 101 102 SdrLayer* pLayer; 103 SdrLayerAdmin& rAdmin = GetModel()->GetLayerAdmin(); 104 pLayer = rAdmin.GetLayerPerID(SC_LAYER_BACK); 105 if (pLayer) 106 SetLayerLocked( pLayer->GetName(), bProt || !bEx ); 107 pLayer = rAdmin.GetLayerPerID(SC_LAYER_INTERN); 108 if (pLayer) 109 SetLayerLocked( pLayer->GetName(), sal_True ); 110 pLayer = rAdmin.GetLayerPerID(SC_LAYER_FRONT); 111 if (pLayer) 112 { 113 SetLayerLocked( pLayer->GetName(), bProt ); 114 SetActiveLayer( pLayer->GetName() ); // FRONT als aktiven Layer setzen 115 } 116 pLayer = rAdmin.GetLayerPerID(SC_LAYER_CONTROLS); 117 if (pLayer) 118 SetLayerLocked( pLayer->GetName(), bProt ); 119 pLayer = rAdmin.GetLayerPerID(SC_LAYER_HIDDEN); 120 if (pLayer) 121 { 122 SetLayerLocked( pLayer->GetName(), bProt ); 123 SetLayerVisible( pLayer->GetName(), sal_False); 124 } 125 126 SetSwapAsynchron(sal_True); 127 } 128 else 129 { 130 ShowSdrPage(GetModel()->GetPage(nTab)); 131 } 132 133 UpdateUserViewOptions(); 134 RecalcScale(); 135 UpdateWorkArea(); 136 137 bInConstruct = sal_False; 138 } 139 140 void ScDrawView::ImplClearCalcDropMarker() 141 { 142 if(pDropMarker) 143 { 144 delete pDropMarker; 145 pDropMarker = 0L; 146 } 147 } 148 149 __EXPORT ScDrawView::~ScDrawView() 150 { 151 ImplClearCalcDropMarker(); 152 } 153 154 void ScDrawView::AddCustomHdl() 155 { 156 sal_Bool bNegativePage = pDoc->IsNegativePage( nTab ); 157 158 const SdrMarkList &rMrkList = GetMarkedObjectList(); 159 sal_uInt32 nCount = rMrkList.GetMarkCount(); 160 for(sal_uInt32 nPos=0; nPos<nCount; nPos++ ) 161 { 162 const SdrObject* pObj = rMrkList.GetMark(nPos)->GetMarkedSdrObj(); 163 if(ScDrawLayer::GetAnchor(pObj) == SCA_CELL) 164 { 165 const sal_Int32 nDelta = 1; 166 167 Rectangle aBoundRect = pObj->GetCurrentBoundRect(); 168 Point aPos; 169 if (bNegativePage) 170 { 171 aPos = aBoundRect.TopRight(); 172 aPos.X() = -aPos.X(); // so the loop below is the same 173 } 174 else 175 aPos = aBoundRect.TopLeft(); 176 long nPosX = (long) (aPos.X() / HMM_PER_TWIPS) + nDelta; 177 long nPosY = (long) (aPos.Y() / HMM_PER_TWIPS) + nDelta; 178 179 SCCOL nCol; 180 sal_Int32 nWidth = 0; 181 182 for(nCol=0; nCol<=MAXCOL && nWidth<=nPosX; nCol++) 183 nWidth += pDoc->GetColWidth(nCol,nTab); 184 185 if(nCol > 0) 186 --nCol; 187 188 SCROW nRow = nPosY <= 0 ? 0 : pDoc->GetRowForHeight( nTab, 189 (sal_uLong) nPosY); 190 if(nRow > 0) 191 --nRow; 192 193 ScTabView* pView = pViewData->GetView(); 194 ScAddress aScAddress(nCol, nRow, nTab); 195 pView->CreateAnchorHandles(aHdl, aScAddress); 196 } 197 } 198 } 199 200 void ScDrawView::InvalidateAttribs() 201 { 202 if (!pViewData) return; 203 SfxBindings& rBindings = pViewData->GetBindings(); 204 205 // echte Statuswerte: 206 rBindings.InvalidateAll( sal_True ); 207 } 208 209 void ScDrawView::InvalidateDrawTextAttrs() 210 { 211 if (!pViewData) return; 212 SfxBindings& rBindings = pViewData->GetBindings(); 213 214 // cjk/ctl font items have no configured slots, 215 // need no invalidate 216 217 rBindings.Invalidate( SID_ATTR_CHAR_FONT ); 218 rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT ); 219 rBindings.Invalidate( SID_ATTR_CHAR_WEIGHT ); 220 rBindings.Invalidate( SID_ATTR_CHAR_POSTURE ); 221 rBindings.Invalidate( SID_ATTR_CHAR_UNDERLINE ); 222 rBindings.Invalidate( SID_ULINE_VAL_NONE ); 223 rBindings.Invalidate( SID_ULINE_VAL_SINGLE ); 224 rBindings.Invalidate( SID_ULINE_VAL_DOUBLE ); 225 rBindings.Invalidate( SID_ULINE_VAL_DOTTED ); 226 rBindings.Invalidate( SID_ATTR_CHAR_OVERLINE ); 227 rBindings.Invalidate( SID_ATTR_CHAR_COLOR ); 228 rBindings.Invalidate( SID_ALIGNLEFT ); 229 rBindings.Invalidate( SID_ALIGNCENTERHOR ); 230 rBindings.Invalidate( SID_ALIGNRIGHT ); 231 rBindings.Invalidate( SID_ALIGNBLOCK ); 232 rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_10 ); 233 rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_15 ); 234 rBindings.Invalidate( SID_ATTR_PARA_LINESPACE_20 ); 235 rBindings.Invalidate( SID_SET_SUPER_SCRIPT ); 236 rBindings.Invalidate( SID_SET_SUB_SCRIPT ); 237 rBindings.Invalidate( SID_TEXTDIRECTION_LEFT_TO_RIGHT ); 238 rBindings.Invalidate( SID_TEXTDIRECTION_TOP_TO_BOTTOM ); 239 rBindings.Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT ); 240 rBindings.Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT ); 241 // pseudo slots for Format menu 242 rBindings.Invalidate( SID_ALIGN_ANY_LEFT ); 243 rBindings.Invalidate( SID_ALIGN_ANY_HCENTER ); 244 rBindings.Invalidate( SID_ALIGN_ANY_RIGHT ); 245 rBindings.Invalidate( SID_ALIGN_ANY_JUSTIFIED ); 246 } 247 248 //void ScDrawView::DrawMarks( OutputDevice* pOut ) const 249 //{ 250 // DBG_ASSERT(pOut, "ScDrawView::DrawMarks: No OutputDevice (!)"); 251 // SdrPaintWindow* pPaintWindow = FindPaintWindow(*pOut); 252 // 253 // if(pPaintWindow) 254 // { 255 // if(pPaintWindow->isXorVisible()) 256 // { 257 // ToggleShownXor(pOut, 0L); 258 // } 259 // } 260 //} 261 262 void ScDrawView::SetMarkedToLayer( sal_uInt8 nLayerNo ) 263 { 264 if (AreObjectsMarked()) 265 { 266 // #i11702# use SdrUndoObjectLayerChange for undo 267 // STR_UNDO_SELATTR is "Attributes" - should use a different text later 268 BegUndo( ScGlobal::GetRscString( STR_UNDO_SELATTR ) ); 269 270 const SdrMarkList& rMark = GetMarkedObjectList(); 271 sal_uLong nCount = rMark.GetMarkCount(); 272 for (sal_uLong i=0; i<nCount; i++) 273 { 274 SdrObject* pObj = rMark.GetMark(i)->GetMarkedSdrObj(); 275 if ( !pObj->ISA(SdrUnoObj) && (pObj->GetLayer() != SC_LAYER_INTERN) ) 276 { 277 AddUndo( new SdrUndoObjectLayerChange( *pObj, pObj->GetLayer(), (SdrLayerID)nLayerNo) ); 278 pObj->SetLayer( nLayerNo ); 279 } 280 } 281 282 EndUndo(); 283 284 // repaint is done in SetLayer 285 286 pViewData->GetDocShell()->SetDrawModified(); 287 288 // #84073# check mark list now instead of later in a timer 289 CheckMarked(); 290 MarkListHasChanged(); 291 } 292 } 293 294 bool ScDrawView::HasMarkedControl() const 295 { 296 SdrObjListIter aIter( GetMarkedObjectList() ); 297 for( SdrObject* pObj = aIter.Next(); pObj; pObj = aIter.Next() ) 298 if( pObj->ISA( SdrUnoObj ) ) 299 return true; 300 return false; 301 } 302 303 bool ScDrawView::HasMarkedInternal() const 304 { 305 // internal objects should not be inside a group, but who knows... 306 SdrObjListIter aIter( GetMarkedObjectList() ); 307 for( SdrObject* pObj = aIter.Next(); pObj; pObj = aIter.Next() ) 308 if( pObj->GetLayer() == SC_LAYER_INTERN ) 309 return true; 310 return false; 311 } 312 313 void ScDrawView::UpdateWorkArea() 314 { 315 SdrPage* pPage = GetModel()->GetPage(static_cast<sal_uInt16>(nTab)); 316 if (pPage) 317 { 318 Point aPos; 319 Size aPageSize( pPage->GetSize() ); 320 Rectangle aNewArea( aPos, aPageSize ); 321 if ( aPageSize.Width() < 0 ) 322 { 323 // RTL: from max.negative (left) to zero (right) 324 aNewArea.Right() = 0; 325 aNewArea.Left() = aPageSize.Width() + 1; 326 } 327 SetWorkArea( aNewArea ); 328 } 329 else 330 { 331 DBG_ERROR("Page nicht gefunden"); 332 } 333 } 334 335 void ScDrawView::DoCut() 336 { 337 DoCopy(); 338 BegUndo( ScGlobal::GetRscString( STR_UNDO_CUT ) ); 339 DeleteMarked(); // auf dieser View - von der 505f Umstellung nicht betroffen 340 EndUndo(); 341 } 342 343 void ScDrawView::GetScale( Fraction& rFractX, Fraction& rFractY ) const 344 { 345 rFractX = aScaleX; 346 rFractY = aScaleY; 347 } 348 349 void ScDrawView::RecalcScale() 350 { 351 double nPPTX; 352 double nPPTY; 353 Fraction aZoomX(1,1); 354 Fraction aZoomY(1,1); 355 356 if (pViewData) 357 { 358 nTab = pViewData->GetTabNo(); 359 nPPTX = pViewData->GetPPTX(); 360 nPPTY = pViewData->GetPPTY(); 361 aZoomX = pViewData->GetZoomX(); 362 aZoomY = pViewData->GetZoomY(); 363 } 364 else 365 { 366 Point aLogic = pDev->LogicToPixel( Point(1000,1000), MAP_TWIP ); 367 nPPTX = aLogic.X() / 1000.0; 368 nPPTY = aLogic.Y() / 1000.0; 369 //! Zoom uebergeben ??? 370 } 371 372 SCCOL nEndCol = 0; 373 SCROW nEndRow = 0; 374 pDoc->GetTableArea( nTab, nEndCol, nEndRow ); 375 if (nEndCol<20) 376 nEndCol = 20; 377 if (nEndRow<20) 378 nEndRow = 20; // #i116848# instead of a large row number for an empty sheet, heights are multiplied in CalcScale 379 380 ScDrawUtil::CalcScale( pDoc, nTab, 0,0, nEndCol,nEndRow, pDev,aZoomX,aZoomY,nPPTX,nPPTY, 381 aScaleX,aScaleY ); 382 } 383 384 void ScDrawView::DoConnect(SdrOle2Obj* pOleObj) 385 { 386 if ( pViewData ) 387 pViewData->GetViewShell()->ConnectObject( pOleObj ); 388 } 389 390 void ScDrawView::MarkListHasChanged() 391 { 392 FmFormView::MarkListHasChanged(); 393 394 UpdateBrowser(); 395 396 ScTabViewShell* pViewSh = pViewData->GetViewShell(); 397 398 // #i110829# remove the cell selection only if drawing objects are selected 399 if ( !bInConstruct && GetMarkedObjectList().GetMarkCount() ) 400 { 401 pViewSh->Unmark(); // remove cell selection 402 403 // #65379# end cell edit mode if drawing objects are selected 404 SC_MOD()->InputEnterHandler(); 405 } 406 407 // IP deaktivieren 408 409 ScModule* pScMod = SC_MOD(); 410 bool bUnoRefDialog = pScMod->IsRefDialogOpen() && pScMod->GetCurRefDlgId() == WID_SIMPLE_REF; 411 412 ScClient* pClient = (ScClient*) pViewSh->GetIPClient(); 413 if ( pClient && pClient->IsObjectInPlaceActive() && !bUnoRefDialog ) 414 { 415 // #41730# beim ViewShell::Activate aus dem Reset2Open nicht die Handles anzeigen 416 //HMHbDisableHdl = sal_True; 417 pClient->DeactivateObject(); 418 //HMHbDisableHdl = sal_False; 419 // Image-Ole wieder durch Grafik ersetzen passiert jetzt in ScClient::UIActivate 420 } 421 422 // Ole-Objekt selektiert? 423 424 SdrOle2Obj* pOle2Obj = NULL; 425 SdrGrafObj* pGrafObj = NULL; 426 SdrMediaObj* pMediaObj = NULL; 427 428 const SdrMarkList& rMarkList = GetMarkedObjectList(); 429 sal_uLong nMarkCount = rMarkList.GetMarkCount(); 430 431 if ( nMarkCount == 0 && !pViewData->GetViewShell()->IsDrawSelMode() && !bInConstruct ) 432 { 433 // relock layers that may have been unlocked before 434 LockBackgroundLayer(); 435 LockInternalLayer(); 436 } 437 438 sal_Bool bSubShellSet = sal_False; 439 if (nMarkCount == 1) 440 { 441 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); 442 if (pObj->GetObjIdentifier() == OBJ_OLE2) 443 { 444 pOle2Obj = (SdrOle2Obj*) pObj; 445 if (!pDoc->IsChart(pObj) ) 446 pViewSh->SetOleObjectShell(sal_True); 447 else 448 pViewSh->SetChartShell(sal_True); 449 bSubShellSet = sal_True; 450 } 451 else if (pObj->GetObjIdentifier() == OBJ_GRAF) 452 { 453 pGrafObj = (SdrGrafObj*) pObj; 454 pViewSh->SetGraphicShell(sal_True); 455 bSubShellSet = sal_True; 456 } 457 else if (pObj->GetObjIdentifier() == OBJ_MEDIA) 458 { 459 pMediaObj = (SdrMediaObj*) pObj; 460 pViewSh->SetMediaShell(sal_True); 461 bSubShellSet = sal_True; 462 } 463 else if (pObj->GetObjIdentifier() != OBJ_TEXT // Verhindern, das beim Anlegen 464 || !pViewSh->IsDrawTextShell()) // eines TextObjekts auf die 465 { // DrawShell umgeschaltet wird. 466 pViewSh->SetDrawShell(sal_True); //@#70206# 467 } 468 } 469 470 if ( nMarkCount && !bSubShellSet ) 471 { 472 sal_Bool bOnlyControls = sal_True; 473 sal_Bool bOnlyGraf = sal_True; 474 for (sal_uLong i=0; i<nMarkCount; i++) 475 { 476 SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); 477 if ( pObj->ISA( SdrObjGroup ) ) 478 { 479 const SdrObjList *pLst = ((SdrObjGroup*)pObj)->GetSubList(); 480 sal_uLong nListCount = pLst->GetObjCount(); 481 if ( nListCount == 0 ) 482 { 483 // #104156# An empty group (may occur during Undo) is no control or graphics object. 484 // Creating the form shell during undo would lead to problems with the undo manager. 485 bOnlyControls = sal_False; 486 bOnlyGraf = sal_False; 487 } 488 for ( sal_uInt16 j = 0; j < nListCount; ++j ) 489 { 490 SdrObject *pSubObj = pLst->GetObj( j ); 491 492 if (!pSubObj->ISA(SdrUnoObj)) 493 bOnlyControls = sal_False; 494 if (pSubObj->GetObjIdentifier() != OBJ_GRAF) 495 bOnlyGraf = sal_False; 496 497 if ( !bOnlyControls && !bOnlyGraf ) break; 498 } 499 } 500 else 501 { 502 if (!pObj->ISA(SdrUnoObj)) 503 bOnlyControls = sal_False; 504 if (pObj->GetObjIdentifier() != OBJ_GRAF) 505 bOnlyGraf = sal_False; 506 } 507 508 if ( !bOnlyControls && !bOnlyGraf ) break; 509 } 510 511 if(bOnlyControls) 512 { 513 pViewSh->SetDrawFormShell(sal_True); // jetzt UNO-Controls 514 } 515 else if(bOnlyGraf) 516 { 517 pViewSh->SetGraphicShell(sal_True); 518 } 519 else if(nMarkCount>1) 520 { 521 pViewSh->SetDrawShell(sal_True); 522 } 523 } 524 525 526 527 // Verben anpassen 528 529 SfxViewFrame* pViewFrame = pViewSh->GetViewFrame(); 530 sal_Bool bOle = pViewSh->GetViewFrame()->GetFrame().IsInPlace(); 531 uno::Sequence< embed::VerbDescriptor > aVerbs; 532 if ( pOle2Obj && !bOle ) 533 { 534 uno::Reference < embed::XEmbeddedObject > xObj = pOle2Obj->GetObjRef(); 535 DBG_ASSERT( xObj.is(), "SdrOle2Obj ohne ObjRef" ); 536 if (xObj.is()) 537 aVerbs = xObj->getSupportedVerbs(); 538 } 539 pViewSh->SetVerbs( aVerbs ); 540 541 // Image-Map Editor 542 543 if ( pOle2Obj ) 544 UpdateIMap( pOle2Obj ); 545 else if ( pGrafObj ) 546 UpdateIMap( pGrafObj ); 547 548 InvalidateAttribs(); // nach dem IMap-Editor Update 549 InvalidateDrawTextAttrs(); 550 551 for(sal_uInt32 a(0L); a < PaintWindowCount(); a++) 552 { 553 SdrPaintWindow* pPaintWindow = GetPaintWindow(a); 554 OutputDevice& rOutDev = pPaintWindow->GetOutputDevice(); 555 556 if(OUTDEV_WINDOW == rOutDev.GetOutDevType()) 557 { 558 ((Window&)rOutDev).Update(); 559 } 560 } 561 562 // uno object for view returns drawing objects as selection, 563 // so it must notify its SelectionChangeListeners 564 565 if (pViewFrame) 566 { 567 SfxFrame& rFrame = pViewFrame->GetFrame(); 568 uno::Reference<frame::XController> xController = rFrame.GetController(); 569 if (xController.is()) 570 { 571 ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController ); 572 if (pImp) 573 pImp->SelectionChanged(); 574 } 575 } 576 577 // update selection transfer object 578 579 pViewSh->CheckSelectionTransfer(); 580 581 } 582 583 void __EXPORT ScDrawView::ModelHasChanged() 584 { 585 SdrObject* pEditObj = GetTextEditObject(); 586 if ( pEditObj && !pEditObj->IsInserted() && pViewData ) 587 { 588 // #111700# SdrObjEditView::ModelHasChanged will end text edit in this case, 589 // so make sure the EditEngine's undo manager is no longer used. 590 pViewData->GetViewShell()->SetDrawTextUndo(NULL); 591 SetCreateMode(); // don't leave FuText in a funny state 592 } 593 594 FmFormView::ModelHasChanged(); 595 } 596 597 void __EXPORT ScDrawView::UpdateUserViewOptions() 598 { 599 if (pViewData) 600 { 601 const ScViewOptions& rOpt = pViewData->GetOptions(); 602 const ScGridOptions& rGrid = rOpt.GetGridOptions(); 603 604 sal_Bool bBigHdl = rOpt.GetOption( VOPT_BIGHANDLES ); 605 606 SetDragStripes( rOpt.GetOption( VOPT_HELPLINES ) ); 607 SetSolidMarkHdl( rOpt.GetOption( VOPT_SOLIDHANDLES ) ); 608 SetMarkHdlSizePixel( bBigHdl ? SC_HANDLESIZE_BIG : SC_HANDLESIZE_SMALL ); 609 610 SetGridVisible( rGrid.GetGridVisible() ); 611 SetSnapEnabled( rGrid.GetUseGridSnap() ); 612 SetGridSnap( rGrid.GetUseGridSnap() ); 613 614 // Snap from grid options is no longer used 615 // SetSnapGrid( Size( rGrid.GetFldSnapX(), rGrid.GetFldSnapY() ) ); 616 617 Fraction aFractX( rGrid.GetFldDrawX(), rGrid.GetFldDivisionX() + 1 ); 618 Fraction aFractY( rGrid.GetFldDrawY(), rGrid.GetFldDivisionY() + 1 ); 619 SetSnapGridWidth( aFractX, aFractY ); 620 621 SetGridCoarse( Size( rGrid.GetFldDrawX(), rGrid.GetFldDrawY() ) ); 622 SetGridFine( Size( rGrid.GetFldDrawX() / (rGrid.GetFldDivisionX() + 1), 623 rGrid.GetFldDrawY() / (rGrid.GetFldDivisionY() + 1) ) ); 624 } 625 } 626 627 #ifdef _MSC_VER 628 #pragma optimize ( "", on ) 629 #endif 630 631 sal_Bool ScDrawView::SelectObject( const String& rName ) 632 { 633 UnmarkAll(); 634 635 SCTAB nObjectTab = 0; 636 SdrObject* pFound = NULL; 637 638 SfxObjectShell* pShell = pDoc->GetDocumentShell(); 639 if (pShell) 640 { 641 SdrModel* pDrawLayer = GetModel(); 642 SCTAB nTabCount = pDoc->GetTableCount(); 643 for (SCTAB i=0; i<nTabCount && !pFound; i++) 644 { 645 SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(i)); 646 DBG_ASSERT(pPage,"Page ?"); 647 if (pPage) 648 { 649 SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS ); 650 SdrObject* pObject = aIter.Next(); 651 while (pObject && !pFound) 652 { 653 if ( ScDrawLayer::GetVisibleName( pObject ) == rName ) 654 { 655 pFound = pObject; 656 nObjectTab = i; 657 } 658 pObject = aIter.Next(); 659 } 660 } 661 } 662 } 663 664 if ( pFound ) 665 { 666 ScTabView* pView = pViewData->GetView(); 667 if ( nObjectTab != nTab ) // Tabelle umschalten 668 pView->SetTabNo( nObjectTab ); 669 670 DBG_ASSERT( nTab == nObjectTab, "Tabellen umschalten hat nicht geklappt" ); 671 672 pView->ScrollToObject( pFound ); 673 674 /* #61585# To select an object on the background layer, the layer has to 675 be unlocked even if exclusive drawing selection mode is not active 676 (this is reversed in MarkListHasChanged when nothing is selected) */ 677 if ( pFound->GetLayer() == SC_LAYER_BACK && 678 !pViewData->GetViewShell()->IsDrawSelMode() && 679 !pDoc->IsTabProtected( nTab ) && 680 !pViewData->GetSfxDocShell()->IsReadOnly() ) 681 { 682 UnlockBackgroundLayer(); 683 } 684 685 SdrPageView* pPV = GetSdrPageView(); 686 MarkObj( pFound, pPV ); 687 } 688 689 return ( pFound != NULL ); 690 } 691 692 //UNUSED2008-05 String ScDrawView::GetSelectedChartName() const 693 //UNUSED2008-05 { 694 //UNUSED2008-05 // used for modifying a chart's data area - PersistName must always be used 695 //UNUSED2008-05 // (as in ScDocument::FindChartData and UpdateChartArea) 696 //UNUSED2008-05 697 //UNUSED2008-05 const SdrMarkList& rMarkList = GetMarkedObjectList(); 698 //UNUSED2008-05 if (rMarkList.GetMarkCount() == 1) 699 //UNUSED2008-05 { 700 //UNUSED2008-05 SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); 701 //UNUSED2008-05 if (pObj->GetObjIdentifier() == OBJ_OLE2) 702 //UNUSED2008-05 if ( pDoc->IsChart(pObj) ) 703 //UNUSED2008-05 return static_cast<SdrOle2Obj*>(pObj)->GetPersistName(); 704 //UNUSED2008-05 } 705 //UNUSED2008-05 706 //UNUSED2008-05 return EMPTY_STRING; // nichts gefunden 707 //UNUSED2008-05 } 708 709 FASTBOOL ScDrawView::InsertObjectSafe(SdrObject* pObj, SdrPageView& rPV, sal_uLong nOptions) 710 { 711 // Markierung nicht aendern, wenn Ole-Objekt aktiv 712 // (bei Drop aus Ole-Objekt wuerde sonst mitten im ExecuteDrag deaktiviert!) 713 714 if (pViewData) 715 { 716 SfxInPlaceClient* pClient = pViewData->GetViewShell()->GetIPClient(); 717 if ( pClient && pClient->IsObjectInPlaceActive() ) 718 nOptions |= SDRINSERT_DONTMARK; 719 } 720 721 return InsertObjectAtView( pObj, rPV, nOptions ); 722 } 723 724 SdrObject* ScDrawView::GetMarkedNoteCaption( ScDrawObjData** ppCaptData ) 725 { 726 const SdrMarkList& rMarkList = GetMarkedObjectList(); 727 if( pViewData && (rMarkList.GetMarkCount() == 1) ) 728 { 729 SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); 730 if( ScDrawObjData* pCaptData = ScDrawLayer::GetNoteCaptionData( pObj, pViewData->GetTabNo() ) ) 731 { 732 if( ppCaptData ) *ppCaptData = pCaptData; 733 return pObj; 734 } 735 } 736 return 0; 737 } 738 739 void ScDrawView::LockCalcLayer( SdrLayerID nLayer, bool bLock ) 740 { 741 SdrLayer* pLockLayer = GetModel()->GetLayerAdmin().GetLayerPerID( nLayer ); 742 if( pLockLayer && (IsLayerLocked( pLockLayer->GetName() ) != bLock) ) 743 SetLayerLocked( pLockLayer->GetName(), bLock ); 744 } 745 746 void __EXPORT ScDrawView::MakeVisible( const Rectangle& rRect, Window& rWin ) 747 { 748 //! rWin richtig auswerten 749 //! ggf Zoom aendern 750 751 if ( pViewData && pViewData->GetActiveWin() == &rWin ) 752 pViewData->GetView()->MakeVisible( rRect ); 753 } 754 755 void ScDrawView::DeleteMarked() 756 { 757 // try to delete a note caption object with its cell note in the Calc document 758 ScDrawObjData* pCaptData = 0; 759 if( SdrObject* pCaptObj = GetMarkedNoteCaption( &pCaptData ) ) 760 { 761 (void)pCaptObj; // prevent 'unused variable' compiler warning in pro builds 762 ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); 763 ScDocShell* pDocShell = pViewData ? pViewData->GetDocShell() : 0; 764 ::svl::IUndoManager* pUndoMgr = pDocShell ? pDocShell->GetUndoManager() : 0; 765 bool bUndo = pDrawLayer && pDocShell && pUndoMgr && pDoc->IsUndoEnabled(); 766 767 // remove the cell note from document, we are its owner now 768 ScPostIt* pNote = pDoc->ReleaseNote( pCaptData->maStart ); 769 DBG_ASSERT( pNote, "ScDrawView::DeleteMarked - cell note missing in document" ); 770 if( pNote ) 771 { 772 // rescue note data for undo (with pointer to caption object) 773 ScNoteData aNoteData = pNote->GetNoteData(); 774 DBG_ASSERT( aNoteData.mpCaption == pCaptObj, "ScDrawView::DeleteMarked - caption object does not match" ); 775 // collect the drawing undo action created while deleting the note 776 if( bUndo ) 777 pDrawLayer->BeginCalcUndo(); 778 // delete the note (already removed from document above) 779 delete pNote; 780 // add the undo action for the note 781 if( bUndo ) 782 pUndoMgr->AddUndoAction( new ScUndoReplaceNote( *pDocShell, pCaptData->maStart, aNoteData, false, pDrawLayer->GetCalcUndo() ) ); 783 // repaint the cell to get rid of the note marker 784 if( pDocShell ) 785 pDocShell->PostPaintCell( pCaptData->maStart ); 786 // done, return now to skip call of FmFormView::DeleteMarked() 787 return; 788 } 789 } 790 791 FmFormView::DeleteMarked(); 792 } 793 794 SdrEndTextEditKind ScDrawView::ScEndTextEdit() 795 { 796 sal_Bool bIsTextEdit = IsTextEdit(); 797 SdrEndTextEditKind eKind = SdrEndTextEdit(); 798 799 if ( bIsTextEdit && pViewData ) 800 pViewData->GetViewShell()->SetDrawTextUndo(NULL); // "normaler" Undo-Manager 801 802 return eKind; 803 } 804 805 void ScDrawView::MarkDropObj( SdrObject* pObj ) 806 { 807 if ( pDropMarkObj != pObj ) 808 { 809 pDropMarkObj = pObj; 810 ImplClearCalcDropMarker(); 811 812 if(pDropMarkObj) 813 { 814 pDropMarker = new SdrDropMarkerOverlay(*this, *pDropMarkObj); 815 } 816 } 817 } 818 819 // support enhanced text edit for draw objects 820 SdrUndoManager* ScDrawView::getSdrUndoManagerForEnhancedTextEdit() const 821 { 822 return pDoc ? dynamic_cast< SdrUndoManager* >(pDoc->GetUndoManager()) : 0; 823 } 824 825 // eof 826