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