xref: /aoo41x/main/sd/source/ui/view/drviewsa.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sd.hxx"
30 
31 #include "DrawViewShell.hxx"
32 #include <cppuhelper/implbase1.hxx>
33 #include <comphelper/processfactory.hxx>
34 #ifndef _SVX_SIZEITEM
35 #include <editeng/sizeitem.hxx>
36 #endif
37 #include <svx/svdlayer.hxx>
38 #ifndef _SVX_ZOOMITEM
39 #include <svx/zoomitem.hxx>
40 #endif
41 #include <svx/svdpagv.hxx>
42 #include <svl/ptitem.hxx>
43 #include <svl/stritem.hxx>
44 #include <sfx2/request.hxx>
45 #include <sfx2/dispatch.hxx>
46 #include <svx/svdopath.hxx>
47 #include <sfx2/docfile.hxx>
48 #include <svx/zoomslideritem.hxx>
49 #include <svl/eitem.hxx>
50 
51 #ifndef _SVX_DIALOGS_HRC
52 #include <svx/dialogs.hrc>
53 #endif
54 #include <svx/extrusionbar.hxx>
55 #include <svx/fontworkbar.hxx>
56 #include <svx/clipfmtitem.hxx>
57 
58 
59 #include <sfx2/viewfrm.hxx>
60 #include <svx/fmshell.hxx>
61 #include <sfx2/dispatch.hxx>
62 #include <svtools/cliplistener.hxx>
63 #include <svx/float3d.hxx>
64 #include "helpids.h"
65 
66 #include "view/viewoverlaymanager.hxx"
67 #include "app.hrc"
68 #include "helpids.h"
69 #include "strings.hrc"
70 #include "res_bmp.hrc"
71 #include "sdpage.hxx"
72 #include "FrameView.hxx"
73 #include "drawdoc.hxx"
74 #include "sdresid.hxx"
75 #include "DrawDocShell.hxx"
76 #include "Window.hxx"
77 #include "fupoor.hxx"
78 #include "fusel.hxx"
79 #include "drawview.hxx"
80 #include "SdUnoDrawView.hxx"
81 #include "ViewShellBase.hxx"
82 #include "SdUnoDrawView.hxx"
83 #include "slideshow.hxx"
84 #include "ToolBarManager.hxx"
85 #include "annotationmanager.hxx"
86 
87 using namespace ::rtl;
88 using namespace ::com::sun::star;
89 using namespace ::com::sun::star::uno;
90 
91 namespace {
92 static const ::rtl::OUString MASTER_VIEW_TOOL_BAR_NAME(
93     ::rtl::OUString::createFromAscii("masterviewtoolbar"));
94 }
95 
96 namespace sd {
97 
98 sal_Bool DrawViewShell::mbPipette = sal_False;
99 
100 // ------------------------
101 // - ScannerEventListener -
102 // ------------------------
103 
104 class ScannerEventListener : public ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener >
105 {
106 private:
107 
108 	DrawViewShell*		mpParent;
109 
110 public:
111 
112 							ScannerEventListener( DrawViewShell* pParent ) : mpParent( pParent )  {};
113 							~ScannerEventListener();
114 
115 	// XEventListener
116 	virtual void SAL_CALL 	disposing( const ::com::sun::star::lang::EventObject& rEventObject ) throw (::com::sun::star::uno::RuntimeException);
117 
118 	void					ParentDestroyed() { mpParent = NULL; }
119 };
120 
121 // -----------------------------------------------------------------------------
122 
123 ScannerEventListener::~ScannerEventListener()
124 {
125 }
126 
127 // -----------------------------------------------------------------------------
128 
129 void SAL_CALL ScannerEventListener::disposing( const ::com::sun::star::lang::EventObject& rEventObject ) throw (::com::sun::star::uno::RuntimeException)
130 {
131 	if( mpParent )
132 		mpParent->ScannerEvent( rEventObject );
133 }
134 
135 /*************************************************************************
136 |*
137 |* Standard-Konstruktor
138 |*
139 \************************************************************************/
140 
141 DrawViewShell::DrawViewShell( SfxViewFrame* pFrame, ViewShellBase& rViewShellBase, ::Window* pParentWindow, PageKind ePageKind, FrameView* pFrameViewArgument )
142 : ViewShell (pFrame, pParentWindow, rViewShellBase)
143 , maTabControl(this, pParentWindow)
144 , mbIsInSwitchPage(false)
145 {
146 	if (pFrameViewArgument != NULL)
147 		mpFrameView = pFrameViewArgument;
148 	else
149         mpFrameView = new FrameView(GetDoc());
150     Construct(GetDocSh(), ePageKind);
151 }
152 
153 /*************************************************************************
154 |*
155 |* Destruktor
156 |*
157 \************************************************************************/
158 
159 DrawViewShell::~DrawViewShell()
160 {
161     mpAnnotationManager.reset();
162     mpViewOverlayManager.reset();
163 
164     OSL_ASSERT (GetViewShell()!=NULL);
165 
166     if( mxScannerListener.is() )
167 		static_cast< ScannerEventListener* >( mxScannerListener.get() )->ParentDestroyed();
168 
169     // #96642# Remove references to items within Svx3DWin
170     // (maybe do a listening sometime in Svx3DWin)
171     sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId();
172     SfxChildWindow* pWindow = GetViewFrame() ? GetViewFrame()->GetChildWindow(nId) : NULL;
173     if(pWindow)
174     {
175         Svx3DWin* p3DWin = static_cast< Svx3DWin* > (pWindow->GetWindow());
176         if(p3DWin)
177             p3DWin->DocumentReload();
178     }
179 
180     EndListening (*GetDoc());
181     EndListening (*GetDocSh());
182 
183 	if( SlideShow::IsRunning(*this) )
184         StopSlideShow(false);
185 
186 	DisposeFunctions();
187 
188 	SdPage* pPage;
189 	sal_uInt16 aPageCnt = GetDoc()->GetSdPageCount(mePageKind);
190 
191 	for (sal_uInt16 i = 0; i < aPageCnt; i++)
192 	{
193 		pPage = GetDoc()->GetSdPage(i, mePageKind);
194 
195 		if (pPage == mpActualPage)
196 		{
197 			GetDoc()->SetSelected(pPage, sal_True);
198 		}
199 		else
200 		{
201 			GetDoc()->SetSelected(pPage, sal_False);
202 		}
203 	}
204 
205 	if ( mpClipEvtLstnr )
206 	{
207 		mpClipEvtLstnr->AddRemoveListener( GetActiveWindow(), sal_False );
208 		mpClipEvtLstnr->ClearCallbackLink();		// #103849# prevent callback if another thread is waiting
209 		mpClipEvtLstnr->release();
210 	}
211 
212 	delete mpDrawView;
213     // Set mpView to NULL so that the destructor of the ViewShell base class
214     // does not access it.
215 	mpView = mpDrawView = NULL;
216 
217 	mpFrameView->Disconnect();
218 	delete [] mpSlotArray;
219 }
220 
221 /*************************************************************************
222 |*
223 |* gemeinsamer Initialisierungsanteil der beiden Konstruktoren
224 |*
225 \************************************************************************/
226 
227 void DrawViewShell::Construct(DrawDocShell* pDocSh, PageKind eInitialPageKind)
228 {
229 	mpActualPage = 0;
230 	mbMousePosFreezed = sal_False;
231 	mbReadOnly = GetDocSh()->IsReadOnly();
232 	mpSlotArray = 0;
233 	mpClipEvtLstnr = 0;
234 	mbPastePossible = sal_False;
235 	mbIsLayerModeActive = false;
236 
237 	mpFrameView->Connect();
238 
239     OSL_ASSERT (GetViewShell()!=NULL);
240 
241 	// Array fuer Slot-/ImageMapping:
242 	// Gerader Eintrag: Haupt-/ToolboxSlot
243 	// Ungerader Eintrag: gemappter Slot
244 	// Achtung: Anpassen von GetIdBySubId() !!!
245 	// Reihenfolge (insbesondere Zoom) darf nicht geaendert werden !!!
246 	mpSlotArray = new sal_uInt16[ SLOTARRAY_COUNT ];
247 	mpSlotArray[ 0 ]  = SID_OBJECT_CHOOSE_MODE;
248 	mpSlotArray[ 1 ]  = SID_OBJECT_ROTATE;
249 	mpSlotArray[ 2 ]  = SID_OBJECT_ALIGN;
250 	mpSlotArray[ 3 ]  = SID_OBJECT_ALIGN_LEFT;
251 	mpSlotArray[ 4 ]  = SID_ZOOM_TOOLBOX;
252 	mpSlotArray[ 5 ]  = SID_ZOOM_TOOLBOX;
253 	mpSlotArray[ 6 ]  = SID_DRAWTBX_TEXT;
254 	mpSlotArray[ 7 ]  = SID_ATTR_CHAR;
255 	mpSlotArray[ 8 ]  = SID_DRAWTBX_RECTANGLES;
256 	mpSlotArray[ 9 ]  = SID_DRAW_RECT;
257 	mpSlotArray[ 10 ] = SID_DRAWTBX_ELLIPSES;
258 	mpSlotArray[ 11 ] = SID_DRAW_ELLIPSE;
259 	mpSlotArray[ 12 ] = SID_DRAWTBX_LINES;
260 	mpSlotArray[ 13 ] = SID_DRAW_FREELINE_NOFILL;
261 	mpSlotArray[ 14 ] = SID_DRAWTBX_3D_OBJECTS;
262 	mpSlotArray[ 15 ] = SID_3D_CUBE;
263 	mpSlotArray[ 16 ] = SID_DRAWTBX_INSERT;
264 	mpSlotArray[ 17 ] = SID_INSERT_DIAGRAM;
265 	mpSlotArray[ 18 ] = SID_POSITION;
266 	mpSlotArray[ 19 ] = SID_FRAME_TO_TOP;
267 	mpSlotArray[ 20 ] = SID_DRAWTBX_CONNECTORS;
268 	mpSlotArray[ 21 ] = SID_TOOL_CONNECTOR;
269 	mpSlotArray[ 22 ] = SID_DRAWTBX_ARROWS;
270 	mpSlotArray[ 23 ] = SID_LINE_ARROW_END;
271 
272 	SetPool( &GetDoc()->GetPool() );
273 
274 	GetDoc()->CreateFirstPages();
275 
276 	mpDrawView = new DrawView(pDocSh, GetActiveWindow(), this);
277 	mpView = mpDrawView;			 // Pointer der Basisklasse ViewShell
278 	mpDrawView->SetSwapAsynchron(sal_True); // Asynchrones Laden von Graphiken
279 
280     // We do not read the page kind from the frame view anymore so we have
281     // to set it in order to resync frame view and this view.
282     mpFrameView->SetPageKind(eInitialPageKind);
283 	mePageKind = eInitialPageKind;
284 	meEditMode = EM_PAGE;
285 	DocumentType eDocType = GetDoc()->GetDocumentType(); // RTTI fasst hier noch nicht
286     switch (mePageKind)
287     {
288         case PK_STANDARD:
289             meShellType = ST_IMPRESS;
290             break;
291 
292         case PK_NOTES:
293             meShellType = ST_NOTES;
294             break;
295 
296         case PK_HANDOUT:
297             meShellType = ST_HANDOUT;
298             break;
299     }
300 
301 	Size aPageSize( GetDoc()->GetSdPage(0, mePageKind)->GetSize() );
302 	Point aPageOrg( aPageSize.Width(), aPageSize.Height() / 2);
303 	Size aSize(aPageSize.Width() * 3, aPageSize.Height() * 2);
304 	InitWindows(aPageOrg, aSize, Point(-1, -1));
305 
306 	Point aVisAreaPos;
307 
308 	if ( pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
309 	{
310 		aVisAreaPos = pDocSh->GetVisArea(ASPECT_CONTENT).TopLeft();
311 	}
312 
313 	mpDrawView->SetWorkArea(Rectangle(Point() - aVisAreaPos - aPageOrg, aSize));
314 
315 	// Objekte koennen max. so gross wie die ViewSize werden
316 	GetDoc()->SetMaxObjSize(aSize);
317 
318 	// Split-Handler fuer TabControls
319 	maTabControl.SetSplitHdl( LINK( this, DrawViewShell, TabSplitHdl ) );
320 
321 	// Damit der richtige EditMode von der FrameView komplett eingestellt
322 	// werden kann, wird hier ein aktuell anderer gewaehlt (kleiner Trick)
323 	if (mpFrameView->GetViewShEditMode(mePageKind) == EM_PAGE)
324 	{
325 		meEditMode = EM_MASTERPAGE;
326 	}
327 	else
328 	{
329 		meEditMode = EM_PAGE;
330 	}
331 
332 	// Einstellungen der FrameView uebernehmen
333 	ReadFrameViewData(mpFrameView);
334 
335 	if( eDocType == DOCUMENT_TYPE_DRAW )
336 	{
337 		SetHelpId( SD_IF_SDGRAPHICVIEWSHELL );
338 		GetActiveWindow()->SetHelpId( HID_SDGRAPHICVIEWSHELL );
339 		GetActiveWindow()->SetUniqueId( HID_SDGRAPHICVIEWSHELL );
340 	}
341 	else
342 	{
343 		if (mePageKind == PK_NOTES)
344 		{
345 			SetHelpId( SID_NOTESMODE );
346 			GetActiveWindow()->SetHelpId( CMD_SID_NOTESMODE );
347 			GetActiveWindow()->SetUniqueId( CMD_SID_NOTESMODE );
348 
349 			// AutoLayouts muessen erzeugt sein
350 			GetDoc()->StopWorkStartupDelay();
351 		}
352 		else if (mePageKind == PK_HANDOUT)
353 		{
354 			SetHelpId( SID_HANDOUTMODE );
355 			GetActiveWindow()->SetHelpId( CMD_SID_HANDOUTMODE );
356 			GetActiveWindow()->SetUniqueId( CMD_SID_HANDOUTMODE );
357 
358 			// AutoLayouts muessen erzeugt sein
359 			GetDoc()->StopWorkStartupDelay();
360 		}
361 		else
362 		{
363 			SetHelpId( SD_IF_SDDRAWVIEWSHELL );
364 			GetActiveWindow()->SetHelpId( HID_SDDRAWVIEWSHELL );
365 			GetActiveWindow()->SetUniqueId( HID_SDDRAWVIEWSHELL );
366 		}
367 	}
368 
369 	// Selektionsfunktion starten
370 	SfxRequest aReq(SID_OBJECT_SELECT, 0, GetDoc()->GetItemPool());
371 	FuPermanent(aReq);
372 	mpDrawView->SetFrameDragSingles(sal_True);
373 
374 	if (pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED)
375 	{
376 		mbZoomOnPage = sal_False;
377 	}
378 	else
379 	{
380 		mbZoomOnPage = sal_True;
381 	}
382 
383 	mbIsRulerDrag = sal_False;
384 
385 	String aName( RTL_CONSTASCII_USTRINGPARAM("DrawViewShell"));
386 	SetName (aName);
387 
388 	mnLockCount = 0UL;
389 
390 	::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() );
391 
392 	if( xMgr.is() )
393 	{
394 		mxScannerManager = ::com::sun::star::uno::Reference< ::com::sun::star::scanner::XScannerManager >(
395 						   xMgr->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.scanner.ScannerManager" ) ),
396 						   ::com::sun::star::uno::UNO_QUERY );
397 
398 		if( mxScannerManager.is() )
399 		{
400 			mxScannerListener = ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >(
401 								static_cast< ::cppu::OWeakObject* >( new ScannerEventListener( this ) ),
402 								::com::sun::star::uno::UNO_QUERY );
403 		}
404 	}
405 
406     mpAnnotationManager.reset( new AnnotationManager( GetViewShellBase() ) );
407     mpViewOverlayManager.reset( new ViewOverlayManager( GetViewShellBase() ) );
408 }
409 
410 
411 
412 
413 void DrawViewShell::Init (bool bIsMainViewShell)
414 {
415     ViewShell::Init(bIsMainViewShell);
416 
417     StartListening (*GetDocSh());
418 }
419 
420 
421 
422 
423 void DrawViewShell::Shutdown (void)
424 {
425     ViewShell::Shutdown();
426 
427 	if(SlideShow::IsRunning( GetViewShellBase() ) )
428     {
429         // Turn off effects.
430         GetDrawView()->SetAnimationMode(SDR_ANIMATION_DISABLE);
431     }
432 }
433 
434 
435 
436 
437 css::uno::Reference<css::drawing::XDrawSubController> DrawViewShell::CreateSubController (void)
438 {
439     css::uno::Reference<css::drawing::XDrawSubController> xSubController;
440 
441     if (IsMainViewShell())
442     {
443         // Create uno sub controller for the main view shell.
444         xSubController = css::uno::Reference<css::drawing::XDrawSubController>(
445             new SdUnoDrawView (
446                 GetViewShellBase().GetDrawController(),
447                 *this,
448                 *GetView()));
449     }
450 
451     return xSubController;
452 }
453 
454 
455 
456 
457 bool DrawViewShell::RelocateToParentWindow (::Window* pParentWindow)
458 {
459     // DrawViewShells can not be relocated to a new parent window at the
460     // moment, so return <FALSE/> except when the given parent window is the
461     // parent window that is already in use.
462     return pParentWindow==GetParentWindow();
463 }
464 
465 
466 
467 
468 /*************************************************************************
469 |*
470 |* pruefe ob linienzuege gezeichnet werden muessen
471 |*
472 \************************************************************************/
473 
474 /*
475 	linienzuege werden ueber makros als folge von
476 		MoveTo (x, y)
477 		LineTo (x, y)	[oder BezierTo (x, y)]
478 		LineTo (x, y)
479 			:
480 	dargestellt. einen endbefehl fuer die linienzuege
481 	gibt es nicht, also muessen alle befehle in den
482 	requests nach LineTo (BezierTo) abgetestet und die
483 	punktparameter gesammelt werden.
484 	der erste nicht-LineTo fuehrt dann dazu, dass aus
485 	den gesammelten punkten der linienzug erzeugt wird
486 */
487 
488 void DrawViewShell::CheckLineTo(SfxRequest& rReq)
489 {
490 	(void)rReq;
491 #ifdef DBG_UTIL
492 	if(rReq.IsAPI())
493 	{
494 		if(SID_LINETO == rReq.GetSlot() || SID_BEZIERTO == rReq.GetSlot() || SID_MOVETO == rReq.GetSlot() )
495 		{
496 			DBG_ERROR("DrawViewShell::CheckLineTo: slots SID_LINETO, SID_BEZIERTO, SID_MOVETO no longer supported.");
497 		}
498 	}
499 #endif
500 
501 	rReq.Ignore ();
502 }
503 
504 /*************************************************************************
505 |*
506 |* veraendere die seitemparameter, wenn SID_PAGESIZE oder SID_PAGEMARGIN
507 |*
508 \************************************************************************/
509 
510 void DrawViewShell::SetupPage (Size &rSize,
511 								 long nLeft,
512 								 long nRight,
513 								 long nUpper,
514 								 long nLower,
515 								 sal_Bool bSize,
516 								 sal_Bool bMargin,
517 								 sal_Bool bScaleAll)
518 {
519 	sal_uInt16 nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
520 	sal_uInt16 i;
521 
522 	for (i = 0; i < nPageCnt; i++)
523 	{
524 		/**********************************************************************
525 		* Erst alle MasterPages bearbeiten
526 		**********************************************************************/
527 		SdPage *pPage = GetDoc()->GetMasterSdPage(i, mePageKind);
528 
529 		if( pPage )
530 		{
531 			if( bSize )
532 			{
533 				Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
534 				pPage->ScaleObjects(rSize, aBorderRect, bScaleAll);
535 				pPage->SetSize(rSize);
536 
537 			}
538 			if( bMargin )
539 			{
540 				pPage->SetLftBorder(nLeft);
541 				pPage->SetRgtBorder(nRight);
542 				pPage->SetUppBorder(nUpper);
543 				pPage->SetLwrBorder(nLower);
544 			}
545 
546 			if ( mePageKind == PK_STANDARD )
547 			{
548 				GetDoc()->GetMasterSdPage(i, PK_NOTES)->CreateTitleAndLayout();
549 			}
550 
551 			pPage->CreateTitleAndLayout();
552 		}
553 	}
554 
555 	nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
556 
557 	for (i = 0; i < nPageCnt; i++)
558 	{
559 		/**********************************************************************
560 		* Danach alle Pages bearbeiten
561 		**********************************************************************/
562 		SdPage *pPage = GetDoc()->GetSdPage(i, mePageKind);
563 
564 		if( pPage )
565 		{
566 			if( bSize )
567 			{
568 				Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
569 				pPage->ScaleObjects(rSize, aBorderRect, bScaleAll);
570 				pPage->SetSize(rSize);
571 			}
572 			if( bMargin )
573 			{
574 				pPage->SetLftBorder(nLeft);
575 				pPage->SetRgtBorder(nRight);
576 				pPage->SetUppBorder(nUpper);
577 				pPage->SetLwrBorder(nLower);
578 			}
579 
580 			if ( mePageKind == PK_STANDARD )
581 			{
582 				SdPage* pNotesPage = GetDoc()->GetSdPage(i, PK_NOTES);
583 				pNotesPage->SetAutoLayout( pNotesPage->GetAutoLayout() );
584 			}
585 
586 			pPage->SetAutoLayout( pPage->GetAutoLayout() );
587 		}
588 	}
589 
590 	if ( mePageKind == PK_STANDARD )
591 	{
592 		SdPage* pHandoutPage = GetDoc()->GetSdPage(0, PK_HANDOUT);
593 		pHandoutPage->CreateTitleAndLayout(sal_True);
594 	}
595 
596 	long nWidth = mpActualPage->GetSize().Width();
597 	long nHeight = mpActualPage->GetSize().Height();
598 
599 	Point aPageOrg(nWidth, nHeight / 2);
600 	Size aSize( nWidth * 3, nHeight * 2);
601 
602 	InitWindows(aPageOrg, aSize, Point(-1, -1), sal_True);
603 
604 	Point aVisAreaPos;
605 
606 	if ( GetDocSh()->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
607 	{
608 		aVisAreaPos = GetDocSh()->GetVisArea(ASPECT_CONTENT).TopLeft();
609 	}
610 
611 	GetView()->SetWorkArea(Rectangle(Point() - aVisAreaPos - aPageOrg, aSize));
612 
613 	UpdateScrollBars();
614 
615 	Point aNewOrigin(mpActualPage->GetLftBorder(), mpActualPage->GetUppBorder());
616 	GetView()->GetSdrPageView()->SetPageOrigin(aNewOrigin);
617 
618 	GetViewFrame()->GetBindings().Invalidate(SID_RULER_NULL_OFFSET);
619 
620 	// auf (neue) Seitengroesse zoomen
621 	GetViewFrame()->GetDispatcher()->Execute(SID_SIZE_PAGE,
622 						SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
623 }
624 
625 /*************************************************************************
626 |*
627 |* Statuswerte der Statusbar zurueckgeben
628 |*
629 \************************************************************************/
630 
631 void DrawViewShell::GetStatusBarState(SfxItemSet& rSet)
632 {
633 	// Zoom-Item
634 	// Hier sollte der entsprechende Wert (Optimal ?, Seitenbreite oder
635 	// Seite) mit Hilfe des ZoomItems weitergegeben werden !!!
636 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOM ) )
637 	{
638 		if (GetDocSh()->IsUIActive() || (SlideShow::IsRunning(GetViewShellBase())) )
639 		{
640 			rSet.DisableItem( SID_ATTR_ZOOM );
641 		}
642 		else
643 		{
644 			SvxZoomItem* pZoomItem;
645 			sal_uInt16 nZoom = (sal_uInt16) GetActiveWindow()->GetZoom();
646 
647 			if( mbZoomOnPage )
648 				pZoomItem = new SvxZoomItem( SVX_ZOOM_WHOLEPAGE, nZoom );
649 			else
650 				pZoomItem = new SvxZoomItem( SVX_ZOOM_PERCENT, nZoom );
651 
652 			// Bereich einschraenken
653 			sal_uInt16 nZoomValues = SVX_ZOOM_ENABLE_ALL;
654 			SdrPageView* pPageView = mpDrawView->GetSdrPageView();
655 
656 			if( ( pPageView && pPageView->GetObjList()->GetObjCount() == 0 ) )
657 				// || ( mpDrawView->GetMarkedObjectList().GetMarkCount() == 0 ) )
658 			{
659 				nZoomValues &= ~SVX_ZOOM_ENABLE_OPTIMAL;
660 			}
661 
662 			pZoomItem->SetValueSet( nZoomValues );
663 			rSet.Put( *pZoomItem );
664 			delete pZoomItem;
665 		}
666 	}
667 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) )
668 	{
669         rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetDoc() ) );
670 		if (GetDocSh()->IsUIActive() || (xSlideshow.is() && xSlideshow->isRunning()) || !GetActiveWindow() )
671 		{
672 			rSet.DisableItem( SID_ATTR_ZOOMSLIDER );
673 		}
674 		else
675 		{
676 			sd::Window * pActiveWindow = GetActiveWindow();
677 			SvxZoomSliderItem aZoomItem( (sal_uInt16) pActiveWindow->GetZoom(), (sal_uInt16)pActiveWindow->GetMinZoom(), (sal_uInt16)pActiveWindow->GetMaxZoom() ) ;
678 
679             SdrPageView* pPageView = mpDrawView->GetSdrPageView();
680             if( pPageView )
681             {
682                 Point aPagePos(0, 0);
683 				Size aPageSize = pPageView->GetPage()->GetSize();
684 
685 				aPagePos.X() += aPageSize.Width()  / 2;
686                 aPageSize.Width() = (long) (aPageSize.Width() * 1.03);
687 
688 				aPagePos.Y() += aPageSize.Height() / 2;
689                 aPageSize.Height() = (long) (aPageSize.Height() * 1.03);
690 				aPagePos.Y() -= aPageSize.Height() / 2;
691 
692 				aPagePos.X() -= aPageSize.Width()  / 2;
693 
694                 Rectangle aFullPageZoomRect( aPagePos, aPageSize );
695                 aZoomItem.AddSnappingPoint( pActiveWindow->GetZoomForRect( aFullPageZoomRect ) );
696             }
697 			aZoomItem.AddSnappingPoint(100);
698 			rSet.Put( aZoomItem );
699 		}
700 	}
701 
702 	Point aPos = GetActiveWindow()->PixelToLogic(maMousePos);
703 	mpDrawView->GetSdrPageView()->LogicToPagePos(aPos);
704 	Fraction aUIScale(GetDoc()->GetUIScale());
705 	aPos.X() = Fraction(aPos.X()) / aUIScale;
706 	aPos.Y() = Fraction(aPos.Y()) / aUIScale;
707 
708 	// Position- und Groesse-Items
709 	if ( mpDrawView->IsAction() )
710 	{
711 		Rectangle aRect;
712 		mpDrawView->TakeActionRect( aRect );
713 
714 		if ( aRect.IsEmpty() )
715 			rSet.Put( SfxPointItem(SID_ATTR_POSITION, aPos) );
716 		else
717 		{
718 			mpDrawView->GetSdrPageView()->LogicToPagePos(aRect);
719 			aPos = aRect.TopLeft();
720 			aPos.X() = Fraction(aPos.X()) / aUIScale;
721 			aPos.Y() = Fraction(aPos.Y()) / aUIScale;
722 			rSet.Put( SfxPointItem( SID_ATTR_POSITION, aPos) );
723 			Size aSize( aRect.Right() - aRect.Left(), aRect.Bottom() - aRect.Top() );
724 			aSize.Height() = Fraction(aSize.Height()) / aUIScale;
725 			aSize.Width()  = Fraction(aSize.Width())  / aUIScale;
726 			rSet.Put( SvxSizeItem( SID_ATTR_SIZE, aSize) );
727 		}
728 	}
729 	else
730 	{
731 		if ( mpDrawView->AreObjectsMarked() )
732 		{
733 			Rectangle aRect = mpDrawView->GetAllMarkedRect();
734 			mpDrawView->GetSdrPageView()->LogicToPagePos(aRect);
735 
736             // Show the position of the selected shape(s)
737             Point aShapePosition (aRect.TopLeft());
738             aShapePosition.X() = Fraction(aShapePosition.X()) / aUIScale;
739             aShapePosition.Y() = Fraction(aShapePosition.Y()) / aUIScale;
740             rSet.Put (SfxPointItem(SID_ATTR_POSITION, aShapePosition));
741 
742 			Size aSize( aRect.Right() - aRect.Left(), aRect.Bottom() - aRect.Top() );
743 			aSize.Height() = Fraction(aSize.Height()) / aUIScale;
744 			aSize.Width()  = Fraction(aSize.Width())  / aUIScale;
745 			rSet.Put( SvxSizeItem( SID_ATTR_SIZE, aSize) );
746 		}
747 		else
748         {
749             rSet.Put( SfxPointItem(SID_ATTR_POSITION, aPos) );
750 			rSet.Put( SvxSizeItem( SID_ATTR_SIZE, Size( 0, 0 ) ) );
751         }
752 	}
753 
754 	// Display of current page and layer.
755 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_PAGE ) )
756 	{
757         // Allways show the slide/page number.
758 		String aString (SdResId( STR_SD_PAGE ));
759         aString += sal_Unicode(' ');
760         aString += UniString::CreateFromInt32( maTabControl.GetCurPageId() );
761         aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " / " ));
762         aString += UniString::CreateFromInt32( GetDoc()->GetSdPageCount( mePageKind ) );
763 
764         // If in layer mode additionally show the layer that contains all
765         // selected shapes of the page.  If the shapes are distributed on
766         // more than one layer, no layer name is shown.
767 		if (IsLayerModeActive())
768 		{
769 			SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
770 			SdrLayerID nLayer = 0, nOldLayer = 0;
771 			SdrLayer*  pLayer = NULL;
772 			SdrObject* pObj = NULL;
773 			const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
774 			sal_uLong nMarkCount = rMarkList.GetMarkCount();
775 			FASTBOOL bOneLayer = sal_True;
776 
777             // Use the first ten selected shapes as a (hopefully
778             // representative) sample of all shapes of the current page.
779             // Detect whether they belong to the same layer.
780 			for( sal_uLong j = 0; j < nMarkCount && bOneLayer && j < 10; j++ )
781 			{
782 				pObj = rMarkList.GetMark( j )->GetMarkedSdrObj();
783 				if( pObj )
784 				{
785 					nLayer = pObj->GetLayer();
786 
787 					if( j != 0 && nLayer != nOldLayer )
788 						bOneLayer = sal_False;
789 
790 					nOldLayer = nLayer;
791 				}
792 			}
793 
794             // Append the layer name to the current page number.
795 			if( bOneLayer && nMarkCount )
796 			{
797 				pLayer = rLayerAdmin.GetLayerPerID( nLayer );
798 				if( pLayer )
799                 {
800                     aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " (" ));
801 					aString += pLayer->GetName();
802                     aString += sal_Unicode(')');
803                 }
804 			}
805 		}
806 
807 		rSet.Put (SfxStringItem (SID_STATUS_PAGE, aString));
808 	}
809 	// Layout
810 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_LAYOUT ) )
811 	{
812 		String aString = mpActualPage->GetLayoutName();
813 		aString.Erase( aString.SearchAscii( SD_LT_SEPARATOR ) );
814 		rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aString ) );
815 	}
816 }
817 
818 
819 
820 void DrawViewShell::Notify (SfxBroadcaster&, const SfxHint& rHint)
821 {
822 	const SfxSimpleHint* pSimple = dynamic_cast< const SfxSimpleHint* >(&rHint);
823 	if (pSimple!=NULL && pSimple->GetId()==SFX_HINT_MODECHANGED)
824 	{
825         // Change to selection when turning on read-only mode.
826 		if(GetDocSh()->IsReadOnly() && dynamic_cast< FuSelection* >( GetCurrentFunction().get() ) )
827 		{
828 			SfxRequest aReq(SID_OBJECT_SELECT, 0, GetDoc()->GetItemPool());
829 			FuPermanent(aReq);
830 		}
831 
832         // Turn on design mode when document is not read-only.
833 		if (GetDocSh()->IsReadOnly() != mbReadOnly )
834 		{
835 			mbReadOnly = GetDocSh()->IsReadOnly();
836 
837 			SfxBoolItem aItem( SID_FM_DESIGN_MODE, !mbReadOnly );
838 			GetViewFrame()->GetDispatcher()->Execute( SID_FM_DESIGN_MODE,
839                 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L );
840 		}
841 	}
842 
843 }
844 
845 void DrawViewShell::ExecuteAnnotation (SfxRequest& rRequest)
846 {
847     if( mpAnnotationManager.get() )
848         mpAnnotationManager->ExecuteAnnotation( rRequest );
849 }
850 
851 // --------------------------------------------------------------------
852 
853 void DrawViewShell::GetAnnotationState (SfxItemSet& rItemSet )
854 {
855     if( mpAnnotationManager.get() )
856         mpAnnotationManager->GetAnnotationState( rItemSet );
857 }
858 
859 
860 } // end of namespace sd
861