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