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