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