xref: /AOO41X/main/sc/source/ui/view/drawview.cxx (revision 0af288bd36294aa09e93d369656aab1681e705d2)
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 
Construct()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 
ImplClearCalcDropMarker()141 void ScDrawView::ImplClearCalcDropMarker()
142 {
143     if(pDropMarker)
144     {
145         delete pDropMarker;
146         pDropMarker = 0L;
147     }
148 }
149 
~ScDrawView()150 __EXPORT ScDrawView::~ScDrawView()
151 {
152     ImplClearCalcDropMarker();
153 }
154 
AddCustomHdl()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 
InvalidateAttribs()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 
InvalidateDrawTextAttrs()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 
SetMarkedToLayer(sal_uInt8 nLayerNo)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 
HasMarkedControl() const302 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 
HasMarkedInternal() const311 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 
UpdateWorkArea()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 
DoCut()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 
GetScale(Fraction & rFractX,Fraction & rFractY) const351 void ScDrawView::GetScale( Fraction& rFractX, Fraction& rFractY ) const
352 {
353     rFractX = aScaleX;
354     rFractY = aScaleY;
355 }
356 
RecalcScale()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 
DoConnect(SdrOle2Obj * pOleObj)392 void ScDrawView::DoConnect(SdrOle2Obj* pOleObj)
393 {
394     if ( pViewData )
395         pViewData->GetViewShell()->ConnectObject( pOleObj );
396 }
397 
MarkListHasChanged()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 
SdrBeginTextEdit(SdrObject * pObj,SdrPageView * pPV,::Window * pWinL,sal_Bool bIsNewObj,SdrOutliner * pGivenOutliner,OutlinerView * pGivenOutlinerView,sal_Bool bDontDeleteOutliner,sal_Bool bOnlyOneView,sal_Bool bGrabFocus)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 
SdrEndTextEdit(sal_Bool bDontDeleteReally)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 
ModelHasChanged()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 
UpdateUserViewOptions()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 
GetObjectByName(const String & rName)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 //==================================================
SelectCurrentViewObject(const String & rName)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 }
SelectObject(const String & rName)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 //==================================================
GetObjectIsMarked(SdrObject * pObject)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 
InsertObjectSafe(SdrObject * pObj,SdrPageView & rPV,sal_uLong nOptions)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 
GetMarkedNoteCaption(ScDrawObjData ** ppCaptData)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 
LockCalcLayer(SdrLayerID nLayer,bool bLock)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 
MakeVisible(const Rectangle & rRect,Window & rWin)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 
DeleteMarked()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 
ScEndTextEdit()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 
MarkDropObj(SdrObject * pObj)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
getSdrUndoManagerForEnhancedTextEdit() const975 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
ApplyGraphicToObject(SdrObject & rHitObject,const Graphic & rGraphic,const String & rBeginUndoText,const String & rFile,const String & rFilter)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 NULL;
1015 }
1016 
1017 // eof
1018