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