1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <com/sun/star/embed/EmbedStates.hpp>
22 #include <svx/svditer.hxx>
23 #include <svx/svdograf.hxx>
24 #include <svx/svdomedia.hxx>
25 #include <svx/svdogrp.hxx>
26 #include <svx/svdoole2.hxx>
27 #include <svx/svdouno.hxx>
28 #include <svx/svdpage.hxx>
29 #include <svx/svdundo.hxx>
30 #include <svx/svdocapt.hxx>
31 #include <editeng/outlobj.hxx>
32 #include <editeng/writingmodeitem.hxx>
33 #include <svx/sdrpaintwindow.hxx>
34 #include <sfx2/bindings.hxx>
35 #include <sfx2/viewfrm.hxx>
37 #include "drawview.hxx"
39 #include "viewdata.hxx"
40 #include "document.hxx"
41 #include "drawutil.hxx"
43 #include "globstr.hrc"
44 #include "tabvwsh.hxx"
47 #include "drwlayer.hxx"
49 #include "viewuno.hxx"
50 #include "userdat.hxx"
52 #include "undocell.hxx"
53 #include "gridwin.hxx"
57 using namespace com::sun::star
;
59 // -----------------------------------------------------------------------
61 #define SC_HANDLESIZE_BIG 9
63 // -----------------------------------------------------------------------
65 void ScDrawView::Construct()
67 EnableExtendedKeyInputDispatcher(false);
68 EnableExtendedMouseEventDispatcher(false);
69 EnableExtendedCommandEventDispatcher(false);
71 SetFrameDragSingles(true);
73 SetMinMoveDistancePixel( 2 );
74 SetHitTolerancePixel( 2 );
78 SCTAB nViewTab
= pViewData
->GetTabNo();
79 ShowSdrPage(GetModel()->GetPage(nViewTab
));
81 sal_Bool bEx
= pViewData
->GetViewShell()->IsDrawSelMode();
82 sal_Bool bProt
= pDoc
->IsTabProtected( nViewTab
) ||
83 pViewData
->GetSfxDocShell()->IsReadOnly();
86 SdrLayerAdmin
& rAdmin
= GetModel()->GetLayerAdmin();
87 pLayer
= rAdmin
.GetLayerPerID(SC_LAYER_BACK
);
89 SetLayerLocked( pLayer
->GetName(), bProt
|| !bEx
);
90 pLayer
= rAdmin
.GetLayerPerID(SC_LAYER_INTERN
);
92 SetLayerLocked( pLayer
->GetName(), sal_True
);
93 pLayer
= rAdmin
.GetLayerPerID(SC_LAYER_FRONT
);
96 SetLayerLocked( pLayer
->GetName(), bProt
);
97 SetActiveLayer( pLayer
->GetName() ); // set active layer to FRONT
99 pLayer
= rAdmin
.GetLayerPerID(SC_LAYER_CONTROLS
);
101 SetLayerLocked( pLayer
->GetName(), bProt
);
102 pLayer
= rAdmin
.GetLayerPerID(SC_LAYER_HIDDEN
);
105 SetLayerLocked( pLayer
->GetName(), bProt
);
106 SetLayerVisible( pLayer
->GetName(), false);
109 SetSwapAsynchron(sal_True
);
113 ShowSdrPage(GetModel()->GetPage(nTab
));
116 UpdateUserViewOptions();
120 bInConstruct
= false;
123 void ScDrawView::ImplClearCalcDropMarker()
132 ScDrawView::~ScDrawView()
134 ImplClearCalcDropMarker();
137 void ScDrawView::AddCustomHdl()
139 const SdrMarkList
&rMrkList
= GetMarkedObjectList();
140 sal_uInt32 nCount
= rMrkList
.GetMarkCount();
141 for(sal_uInt32 nPos
=0; nPos
<nCount
; nPos
++ )
143 SdrObject
* pObj
= rMrkList
.GetMark(nPos
)->GetMarkedSdrObj();
144 if (ScDrawObjData
*pAnchor
= ScDrawLayer::GetObjDataTab(pObj
, nTab
))
146 if (ScTabView
* pView
= pViewData
->GetView())
147 pView
->CreateAnchorHandles(aHdl
, pAnchor
->maStart
);
152 void ScDrawView::InvalidateAttribs()
154 if (!pViewData
) return;
155 SfxBindings
& rBindings
= pViewData
->GetBindings();
157 // true status values:
158 rBindings
.InvalidateAll( true );
161 void ScDrawView::InvalidateDrawTextAttrs()
163 if (!pViewData
) return;
164 SfxBindings
& rBindings
= pViewData
->GetBindings();
166 // cjk/ctl font items have no configured slots,
167 // need no invalidate
169 rBindings
.Invalidate( SID_ATTR_CHAR_FONT
);
170 rBindings
.Invalidate( SID_ATTR_CHAR_FONTHEIGHT
);
171 rBindings
.Invalidate( SID_ATTR_CHAR_WEIGHT
);
172 rBindings
.Invalidate( SID_ATTR_CHAR_POSTURE
);
173 rBindings
.Invalidate( SID_ATTR_CHAR_UNDERLINE
);
174 rBindings
.Invalidate( SID_ULINE_VAL_NONE
);
175 rBindings
.Invalidate( SID_ULINE_VAL_SINGLE
);
176 rBindings
.Invalidate( SID_ULINE_VAL_DOUBLE
);
177 rBindings
.Invalidate( SID_ULINE_VAL_DOTTED
);
178 rBindings
.Invalidate( SID_ATTR_CHAR_OVERLINE
);
179 rBindings
.Invalidate( SID_ATTR_CHAR_COLOR
);
180 rBindings
.Invalidate( SID_ATTR_PARA_ADJUST_LEFT
);
181 rBindings
.Invalidate( SID_ATTR_PARA_ADJUST_RIGHT
);
182 rBindings
.Invalidate( SID_ATTR_PARA_ADJUST_BLOCK
);
183 rBindings
.Invalidate( SID_ATTR_PARA_ADJUST_CENTER
);
184 rBindings
.Invalidate( SID_ALIGNLEFT
);
185 rBindings
.Invalidate( SID_ALIGNCENTERHOR
);
186 rBindings
.Invalidate( SID_ALIGNRIGHT
);
187 rBindings
.Invalidate( SID_ALIGNBLOCK
);
188 rBindings
.Invalidate( SID_ATTR_PARA_LINESPACE_10
);
189 rBindings
.Invalidate( SID_ATTR_PARA_LINESPACE_15
);
190 rBindings
.Invalidate( SID_ATTR_PARA_LINESPACE_20
);
191 rBindings
.Invalidate( SID_SET_SUPER_SCRIPT
);
192 rBindings
.Invalidate( SID_SET_SUB_SCRIPT
);
193 rBindings
.Invalidate( SID_ATTR_CHAR_KERNING
);
194 rBindings
.Invalidate( SID_ATTR_CHAR_STRIKEOUT
);
195 rBindings
.Invalidate( SID_ATTR_CHAR_SHADOWED
);
196 rBindings
.Invalidate( SID_TEXTDIRECTION_LEFT_TO_RIGHT
);
197 rBindings
.Invalidate( SID_TEXTDIRECTION_TOP_TO_BOTTOM
);
198 rBindings
.Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT
);
199 rBindings
.Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT
);
200 // pseudo slots for Format menu
201 rBindings
.Invalidate( SID_ALIGN_ANY_LEFT
);
202 rBindings
.Invalidate( SID_ALIGN_ANY_HCENTER
);
203 rBindings
.Invalidate( SID_ALIGN_ANY_RIGHT
);
204 rBindings
.Invalidate( SID_ALIGN_ANY_JUSTIFIED
);
207 void ScDrawView::SetMarkedToLayer( sal_uInt8 nLayerNo
)
209 if (AreObjectsMarked())
211 // #i11702# use SdrUndoObjectLayerChange for undo
212 // STR_UNDO_SELATTR is "Attributes" - should use a different text later
213 BegUndo( ScGlobal::GetRscString( STR_UNDO_SELATTR
) );
215 const SdrMarkList
& rMark
= GetMarkedObjectList();
216 sal_uLong nCount
= rMark
.GetMarkCount();
217 for (sal_uLong i
=0; i
<nCount
; i
++)
219 SdrObject
* pObj
= rMark
.GetMark(i
)->GetMarkedSdrObj();
220 if ( !pObj
->ISA(SdrUnoObj
) && (pObj
->GetLayer() != SC_LAYER_INTERN
) )
222 AddUndo( new SdrUndoObjectLayerChange( *pObj
, pObj
->GetLayer(), (SdrLayerID
)nLayerNo
) );
223 pObj
->SetLayer( nLayerNo
);
229 // repaint is done in SetLayer
231 pViewData
->GetDocShell()->SetDrawModified();
233 // check mark list now instead of later in a timer
235 MarkListHasChanged();
239 bool ScDrawView::HasMarkedControl() const
241 SdrObjListIter
aIter( GetMarkedObjectList() );
242 for( SdrObject
* pObj
= aIter
.Next(); pObj
; pObj
= aIter
.Next() )
243 if( pObj
->ISA( SdrUnoObj
) )
248 bool ScDrawView::HasMarkedInternal() const
250 // internal objects should not be inside a group, but who knows...
251 SdrObjListIter
aIter( GetMarkedObjectList() );
252 for( SdrObject
* pObj
= aIter
.Next(); pObj
; pObj
= aIter
.Next() )
253 if( pObj
->GetLayer() == SC_LAYER_INTERN
)
258 void ScDrawView::UpdateWorkArea()
260 SdrPage
* pPage
= GetModel()->GetPage(static_cast<sal_uInt16
>(nTab
));
264 Size
aPageSize( pPage
->GetSize() );
265 Rectangle
aNewArea( aPos
, aPageSize
);
266 if ( aPageSize
.Width() < 0 )
268 // RTL: from max.negative (left) to zero (right)
269 aNewArea
.Right() = 0;
270 aNewArea
.Left() = aPageSize
.Width() + 1;
272 SetWorkArea( aNewArea
);
276 OSL_FAIL("Page nicht gefunden");
280 void ScDrawView::DoCut()
283 BegUndo( ScGlobal::GetRscString( STR_UNDO_CUT
) );
284 DeleteMarked(); // auf dieser View - von der 505f Umstellung nicht betroffen
288 void ScDrawView::GetScale( Fraction
& rFractX
, Fraction
& rFractY
) const
294 void ScDrawView::RecalcScale()
298 Fraction
aZoomX(1,1);
299 Fraction
aZoomY(1,1);
303 nTab
= pViewData
->GetTabNo();
304 nPPTX
= pViewData
->GetPPTX();
305 nPPTY
= pViewData
->GetPPTY();
306 aZoomX
= pViewData
->GetZoomX();
307 aZoomY
= pViewData
->GetZoomY();
311 Point aLogic
= pDev
->LogicToPixel( Point(1000,1000), MAP_TWIP
);
312 nPPTX
= aLogic
.X() / 1000.0;
313 nPPTY
= aLogic
.Y() / 1000.0;
314 //! Zoom uebergeben ???
319 pDoc
->GetTableArea( nTab
, nEndCol
, nEndRow
);
325 ScDrawUtil::CalcScale( pDoc
, nTab
, 0,0, nEndCol
,nEndRow
, pDev
,aZoomX
,aZoomY
,nPPTX
,nPPTY
,
327 SdrPageView
* pPV
= GetSdrPageView();
328 if ( pViewData
&& pPV
)
330 if ( SdrPage
* pPage
= pPV
->GetPage() )
332 sal_uLong nCount
= pPage
->GetObjCount();
333 for ( sal_uLong i
= 0; i
< nCount
; i
++ )
335 SdrObject
* pObj
= pPage
->GetObj( i
);
336 // Align objects to nearset grid position
343 void ScDrawView::DoConnect(SdrOle2Obj
* pOleObj
)
346 pViewData
->GetViewShell()->ConnectObject( pOleObj
);
349 void ScDrawView::MarkListHasChanged()
351 FmFormView::MarkListHasChanged();
355 ScTabViewShell
* pViewSh
= pViewData
->GetViewShell();
357 // #i110829# remove the cell selection only if drawing objects are selected
358 if ( !bInConstruct
&& GetMarkedObjectList().GetMarkCount() )
360 pViewSh
->Unmark(); // remove cell selection
362 // end cell edit mode if drawing objects are selected
363 SC_MOD()->InputEnterHandler();
368 ScModule
* pScMod
= SC_MOD();
369 bool bUnoRefDialog
= pScMod
->IsRefDialogOpen() && pScMod
->GetCurRefDlgId() == WID_SIMPLE_REF
;
371 ScClient
* pClient
= (ScClient
*) pViewSh
->GetIPClient();
372 if ( pClient
&& pClient
->IsObjectInPlaceActive() && !bUnoRefDialog
)
374 // beim ViewShell::Activate aus dem Reset2Open nicht die Handles anzeigen
375 pClient
->DeactivateObject();
376 // Image-Ole wieder durch Grafik ersetzen passiert jetzt in ScClient::UIActivate
379 // Ole-Objekt selektiert?
381 SdrOle2Obj
* pOle2Obj
= NULL
;
382 SdrGrafObj
* pGrafObj
= NULL
;
384 const SdrMarkList
& rMarkList
= GetMarkedObjectList();
385 sal_uLong nMarkCount
= rMarkList
.GetMarkCount();
387 if ( nMarkCount
== 0 && !pViewData
->GetViewShell()->IsDrawSelMode() && !bInConstruct
)
389 // relock layers that may have been unlocked before
390 LockBackgroundLayer();
394 sal_Bool bSubShellSet
= false;
397 SdrObject
* pObj
= rMarkList
.GetMark(0)->GetMarkedSdrObj();
398 if (pObj
->GetObjIdentifier() == OBJ_OLE2
)
400 pOle2Obj
= (SdrOle2Obj
*) pObj
;
401 if (!pDoc
->IsChart(pObj
) )
402 pViewSh
->SetOleObjectShell(sal_True
);
404 pViewSh
->SetChartShell(sal_True
);
405 bSubShellSet
= sal_True
;
407 else if (pObj
->GetObjIdentifier() == OBJ_GRAF
)
409 pGrafObj
= (SdrGrafObj
*) pObj
;
410 pViewSh
->SetGraphicShell(sal_True
);
411 bSubShellSet
= sal_True
;
413 else if (pObj
->GetObjIdentifier() == OBJ_MEDIA
)
415 pViewSh
->SetMediaShell(true);
418 else if (pObj
->GetObjIdentifier() != OBJ_TEXT
// Verhindern, das beim Anlegen
419 || !pViewSh
->IsDrawTextShell()) // eines TextObjekts auf die
420 { // DrawShell umgeschaltet wird.
421 pViewSh
->SetDrawShell(sal_True
); //@#70206#
425 if ( nMarkCount
&& !bSubShellSet
)
427 sal_Bool bOnlyControls
= sal_True
;
428 sal_Bool bOnlyGraf
= sal_True
;
429 for (sal_uLong i
=0; i
<nMarkCount
; i
++)
431 SdrObject
* pObj
= rMarkList
.GetMark(i
)->GetMarkedSdrObj();
432 if ( pObj
->ISA( SdrObjGroup
) )
434 const SdrObjList
*pLst
= ((SdrObjGroup
*)pObj
)->GetSubList();
435 sal_uLong nListCount
= pLst
->GetObjCount();
436 if ( nListCount
== 0 )
438 // An empty group (may occur during Undo) is no control or graphics object.
439 // Creating the form shell during undo would lead to problems with the undo manager.
440 bOnlyControls
= false;
443 for ( sal_uInt16 j
= 0; j
< nListCount
; ++j
)
445 SdrObject
*pSubObj
= pLst
->GetObj( j
);
447 if (!pSubObj
->ISA(SdrUnoObj
))
448 bOnlyControls
= false;
449 if (pSubObj
->GetObjIdentifier() != OBJ_GRAF
)
452 if ( !bOnlyControls
&& !bOnlyGraf
) break;
457 if (!pObj
->ISA(SdrUnoObj
))
458 bOnlyControls
= false;
459 if (pObj
->GetObjIdentifier() != OBJ_GRAF
)
463 if ( !bOnlyControls
&& !bOnlyGraf
) break;
468 pViewSh
->SetDrawFormShell(sal_True
); // jetzt UNO-Controls
472 pViewSh
->SetGraphicShell(sal_True
);
474 else if(nMarkCount
>1)
476 pViewSh
->SetDrawShell(sal_True
);
484 SfxViewFrame
* pViewFrame
= pViewSh
->GetViewFrame();
485 sal_Bool bOle
= pViewSh
->GetViewFrame()->GetFrame().IsInPlace();
486 uno::Sequence
< embed::VerbDescriptor
> aVerbs
;
487 if ( pOle2Obj
&& !bOle
)
489 uno::Reference
< embed::XEmbeddedObject
> xObj
= pOle2Obj
->GetObjRef();
490 OSL_ENSURE( xObj
.is(), "SdrOle2Obj ohne ObjRef" );
492 aVerbs
= xObj
->getSupportedVerbs();
494 pViewSh
->SetVerbs( aVerbs
);
499 UpdateIMap( pOle2Obj
);
501 UpdateIMap( pGrafObj
);
503 InvalidateAttribs(); // nach dem IMap-Editor Update
504 InvalidateDrawTextAttrs();
506 for(sal_uInt32
a(0L); a
< PaintWindowCount(); a
++)
508 SdrPaintWindow
* pPaintWindow
= GetPaintWindow(a
);
509 OutputDevice
& rOutDev
= pPaintWindow
->GetOutputDevice();
511 if(OUTDEV_WINDOW
== rOutDev
.GetOutDevType())
513 ((Window
&)rOutDev
).Update();
517 // uno object for view returns drawing objects as selection,
518 // so it must notify its SelectionChangeListeners
522 SfxFrame
& rFrame
= pViewFrame
->GetFrame();
523 uno::Reference
<frame::XController
> xController
= rFrame
.GetController();
524 if (xController
.is())
526 ScTabViewObj
* pImp
= ScTabViewObj::getImplementation( xController
);
528 pImp
->SelectionChanged();
532 // update selection transfer object
534 pViewSh
->CheckSelectionTransfer();
538 sal_Bool
ScDrawView::SdrBeginTextEdit(
543 SdrOutliner
* pGivenOutliner
,
544 OutlinerView
* pGivenOutlinerView
,
545 sal_Bool bDontDeleteOutliner
,
546 sal_Bool bOnlyOneView
,
547 sal_Bool bGrabFocus
)
549 const sal_Bool bRet
= FmFormView::SdrBeginTextEdit(
550 pObj
, pPV
, pWinL
, bIsNewObj
,
551 pGivenOutliner
, pGivenOutlinerView
, bDontDeleteOutliner
,
552 bOnlyOneView
, bGrabFocus
);
554 ScTabViewShell
* pViewSh
= pViewData
->GetViewShell();
555 if ( pViewSh
->GetViewFrame() )
557 SfxFrame
& rFrame
= pViewSh
->GetViewFrame()->GetFrame();
558 uno::Reference
< frame::XController
> xController
= rFrame
.GetController();
559 if (xController
.is())
561 ScTabViewObj
* pImp
= ScTabViewObj::getImplementation( xController
);
563 pImp
->SelectionChanged();
571 SdrEndTextEditKind
ScDrawView::SdrEndTextEdit( sal_Bool bDontDeleteReally
)
573 const SdrEndTextEditKind eRet
= FmFormView::SdrEndTextEdit( bDontDeleteReally
);
575 ScTabViewShell
* pViewSh
= pViewData
->GetViewShell();
576 if ( pViewSh
->GetViewFrame() )
578 SfxFrame
& rFrame
= pViewSh
->GetViewFrame()->GetFrame();
579 uno::Reference
< frame::XController
> xController
= rFrame
.GetController();
580 if (xController
.is())
582 ScTabViewObj
* pImp
= ScTabViewObj::getImplementation( xController
);
584 pImp
->SelectionChanged();
592 void ScDrawView::ModelHasChanged()
594 SdrObject
* pEditObj
= GetTextEditObject();
595 if ( pEditObj
&& !pEditObj
->IsInserted() && pViewData
)
597 // SdrObjEditView::ModelHasChanged will end text edit in this case,
598 // so make sure the EditEngine's undo manager is no longer used.
599 pViewData
->GetViewShell()->SetDrawTextUndo(NULL
);
600 SetCreateMode(); // don't leave FuText in a funny state
603 FmFormView::ModelHasChanged();
606 void ScDrawView::UpdateUserViewOptions()
610 const ScViewOptions
& rOpt
= pViewData
->GetOptions();
611 const ScGridOptions
& rGrid
= rOpt
.GetGridOptions();
613 SetDragStripes( rOpt
.GetOption( VOPT_HELPLINES
) );
614 SetMarkHdlSizePixel( SC_HANDLESIZE_BIG
);
616 SetGridVisible( rGrid
.GetGridVisible() );
617 SetSnapEnabled( rGrid
.GetUseGridSnap() );
618 SetGridSnap( rGrid
.GetUseGridSnap() );
620 Fraction
aFractX( rGrid
.GetFldDrawX(), rGrid
.GetFldDivisionX() + 1 );
621 Fraction
aFractY( rGrid
.GetFldDrawY(), rGrid
.GetFldDivisionY() + 1 );
622 SetSnapGridWidth( aFractX
, aFractY
);
624 SetGridCoarse( Size( rGrid
.GetFldDrawX(), rGrid
.GetFldDrawY() ) );
625 SetGridFine( Size( rGrid
.GetFldDrawX() / (rGrid
.GetFldDivisionX() + 1),
626 rGrid
.GetFldDrawY() / (rGrid
.GetFldDivisionY() + 1) ) );
630 sal_Bool
ScDrawView::SelectObject( const String
& rName
)
634 SCTAB nObjectTab
= 0;
635 SdrObject
* pFound
= NULL
;
637 SfxObjectShell
* pShell
= pDoc
->GetDocumentShell();
640 SdrModel
* pDrawLayer
= GetModel();
641 SCTAB nTabCount
= pDoc
->GetTableCount();
642 for (SCTAB i
=0; i
<nTabCount
&& !pFound
; i
++)
644 SdrPage
* pPage
= pDrawLayer
->GetPage(static_cast<sal_uInt16
>(i
));
645 OSL_ENSURE(pPage
,"Page ?");
648 SdrObjListIter
aIter( *pPage
, IM_DEEPWITHGROUPS
);
649 SdrObject
* pObject
= aIter
.Next();
650 while (pObject
&& !pFound
)
652 if ( ScDrawLayer::GetVisibleName( pObject
) == rName
)
657 pObject
= aIter
.Next();
665 ScTabView
* pView
= pViewData
->GetView();
666 if ( nObjectTab
!= nTab
) // Tabelle umschalten
667 pView
->SetTabNo( nObjectTab
);
669 OSL_ENSURE( nTab
== nObjectTab
, "Tabellen umschalten hat nicht geklappt" );
671 pView
->ScrollToObject( pFound
);
673 /* To select an object on the background layer, the layer has to
674 be unlocked even if exclusive drawing selection mode is not active
675 (this is reversed in MarkListHasChanged when nothing is selected) */
676 if ( pFound
->GetLayer() == SC_LAYER_BACK
&&
677 !pViewData
->GetViewShell()->IsDrawSelMode() &&
678 !pDoc
->IsTabProtected( nTab
) &&
679 !pViewData
->GetSfxDocShell()->IsReadOnly() )
681 UnlockBackgroundLayer();
684 SdrPageView
* pPV
= GetSdrPageView();
685 MarkObj( pFound
, pPV
);
688 return ( pFound
!= NULL
);
692 bool ScDrawView::InsertObjectSafe(SdrObject
* pObj
, SdrPageView
& rPV
, sal_uLong nOptions
)
694 // Markierung nicht aendern, wenn Ole-Objekt aktiv
695 // (bei Drop aus Ole-Objekt wuerde sonst mitten im ExecuteDrag deaktiviert!)
699 SfxInPlaceClient
* pClient
= pViewData
->GetViewShell()->GetIPClient();
700 if ( pClient
&& pClient
->IsObjectInPlaceActive() )
701 nOptions
|= SDRINSERT_DONTMARK
;
704 return InsertObjectAtView( pObj
, rPV
, nOptions
);
707 SdrObject
* ScDrawView::GetMarkedNoteCaption( ScDrawObjData
** ppCaptData
)
709 const SdrMarkList
& rMarkList
= GetMarkedObjectList();
710 if( pViewData
&& (rMarkList
.GetMarkCount() == 1) )
712 SdrObject
* pObj
= rMarkList
.GetMark( 0 )->GetMarkedSdrObj();
713 if( ScDrawObjData
* pCaptData
= ScDrawLayer::GetNoteCaptionData( pObj
, pViewData
->GetTabNo() ) )
715 if( ppCaptData
) *ppCaptData
= pCaptData
;
722 void ScDrawView::LockCalcLayer( SdrLayerID nLayer
, bool bLock
)
724 SdrLayer
* pLockLayer
= GetModel()->GetLayerAdmin().GetLayerPerID( nLayer
);
725 if( pLockLayer
&& (IsLayerLocked( pLockLayer
->GetName() ) != bLock
) )
726 SetLayerLocked( pLockLayer
->GetName(), bLock
);
729 void ScDrawView::MakeVisible( const Rectangle
& rRect
, Window
& rWin
)
731 //! rWin richtig auswerten
734 if ( pViewData
&& pViewData
->GetActiveWin() == &rWin
)
735 pViewData
->GetView()->MakeVisible( rRect
);
738 void ScDrawView::DeleteMarked()
740 // try to delete a note caption object with its cell note in the Calc document
741 ScDrawObjData
* pCaptData
= 0;
742 if( SdrObject
* pCaptObj
= GetMarkedNoteCaption( &pCaptData
) )
744 (void)pCaptObj
; // prevent 'unused variable' compiler warning in pro builds
745 ScDrawLayer
* pDrawLayer
= pDoc
->GetDrawLayer();
746 ScDocShell
* pDocShell
= pViewData
? pViewData
->GetDocShell() : 0;
747 ::svl::IUndoManager
* pUndoMgr
= pDocShell
? pDocShell
->GetUndoManager() : 0;
748 bool bUndo
= pDrawLayer
&& pDocShell
&& pUndoMgr
&& pDoc
->IsUndoEnabled();
750 // remove the cell note from document, we are its owner now
751 ScPostIt
* pNote
= pDoc
->GetNotes(pCaptData
->maStart
.Tab())->ReleaseNote( pCaptData
->maStart
);
752 OSL_ENSURE( pNote
, "ScDrawView::DeleteMarked - cell note missing in document" );
755 // rescue note data for undo (with pointer to caption object)
756 ScNoteData aNoteData
= pNote
->GetNoteData();
757 OSL_ENSURE( aNoteData
.mpCaption
== pCaptObj
, "ScDrawView::DeleteMarked - caption object does not match" );
758 // collect the drawing undo action created while deleting the note
760 pDrawLayer
->BeginCalcUndo();
761 // delete the note (already removed from document above)
763 // add the undo action for the note
765 pUndoMgr
->AddUndoAction( new ScUndoReplaceNote( *pDocShell
, pCaptData
->maStart
, aNoteData
, false, pDrawLayer
->GetCalcUndo() ) );
766 // repaint the cell to get rid of the note marker
768 pDocShell
->PostPaintCell( pCaptData
->maStart
);
769 // done, return now to skip call of FmFormView::DeleteMarked()
774 FmFormView::DeleteMarked();
777 SdrEndTextEditKind
ScDrawView::ScEndTextEdit()
779 sal_Bool bIsTextEdit
= IsTextEdit();
780 SdrEndTextEditKind eKind
= SdrEndTextEdit();
782 if ( bIsTextEdit
&& pViewData
)
783 pViewData
->GetViewShell()->SetDrawTextUndo(NULL
); // "normaler" Undo-Manager
788 void ScDrawView::MarkDropObj( SdrObject
* pObj
)
790 if ( pDropMarkObj
!= pObj
)
793 ImplClearCalcDropMarker();
797 pDropMarker
= new SdrDropMarkerOverlay(*this, *pDropMarkObj
);
802 // In order to counteract the effects of rounding due to the nature of how the
803 // grid positions are calcuated and drawn we calculate the offset needed at the
804 // current zoom to be applied to an SrdObject when it is drawn in order to make
805 // sure that it's position relative to the nearest cell anchor doesn't change.
806 // Of course not all shape(s)/control(s) are cell anchored, if the
807 // object doesn't have a cell anchor we synthesise a temporary anchor.
808 void ScDrawView::SyncForGrid( SdrObject
* pObj
)
810 // process members of a group shape separately
811 if ( pObj
->ISA( SdrObjGroup
) )
813 SdrObjList
*pLst
= ((SdrObjGroup
*)pObj
)->GetSubList();
814 for ( sal_uLong i
= 0, nCount
= pLst
->GetObjCount(); i
< nCount
; ++i
)
815 SyncForGrid( pLst
->GetObj( i
) );
818 ScSplitPos eWhich
= pViewData
->GetActivePart();
819 ScGridWindow
* pGridWin
= (ScGridWindow
*)pViewData
->GetActiveWin();
820 ScDrawObjData
* pData
= ScDrawLayer::GetObjData( pObj
);
826 aOldStt
= pData
->maStart
;
830 // Page anchored object so...
831 // synthesise an anchor ( but don't attach it to
832 // the object as we want to maintain page anchoring )
833 ScDrawObjData aAnchor
;
834 ScDrawLayer::GetCellAnchorFromPosition( *pObj
, aAnchor
, *pDoc
, GetTab() );
835 aOldStt
= aAnchor
.maStart
;
837 MapMode aDrawMode
= pGridWin
->GetDrawMapMode();
838 // find pos anchor position
839 Point
aOldPos( pDoc
->GetColOffset( aOldStt
.Col(), aOldStt
.Tab() ), pDoc
->GetRowOffset( aOldStt
.Row(), aOldStt
.Tab() ) );
840 aOldPos
.X() = sc::TwipsToHMM( aOldPos
.X() );
841 aOldPos
.Y() = sc::TwipsToHMM( aOldPos
.Y() );
842 // find position of same point on the screen ( e.g. grid )
843 Point aCurPos
= pViewData
->GetScrPos( aOldStt
.Col(), aOldStt
.Row(), eWhich
, sal_True
);
844 Point aCurPosHmm
= pGridWin
->PixelToLogic(aCurPos
, aDrawMode
);
845 Point aGridOff
= ( aCurPosHmm
- aOldPos
);
846 // fdo#63878 Fix the X position for RTL Sheet
847 if( pDoc
->IsNegativePage( GetTab() ) )
848 aGridOff
.setX( aCurPosHmm
.getX() + aOldPos
.getX() );
849 pObj
->SetGridOffset( aGridOff
);
852 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */