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