xref: /AOO41X/main/sdext/source/presenter/PresenterWindowManager.cxx (revision ca62e2c2083b5d0995f1245bad6c2edfb455fbec)
1c142477cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3c142477cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4c142477cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5c142477cSAndrew Rist  * distributed with this work for additional information
6c142477cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7c142477cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8c142477cSAndrew Rist  * "License"); you may not use this file except in compliance
9c142477cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11c142477cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13c142477cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14c142477cSAndrew Rist  * software distributed under the License is distributed on an
15c142477cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16c142477cSAndrew Rist  * KIND, either express or implied.  See the License for the
17c142477cSAndrew Rist  * specific language governing permissions and limitations
18c142477cSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20c142477cSAndrew Rist  *************************************************************/
21c142477cSAndrew Rist 
22c142477cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sdext.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #undef ENABLE_PANE_RESIZING
28cdf0e10cSrcweir //#define ENABLE_PANE_RESIZING
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include "PresenterWindowManager.hxx"
31cdf0e10cSrcweir #include "PresenterAnimation.hxx"
32cdf0e10cSrcweir #include "PresenterAnimator.hxx"
33cdf0e10cSrcweir #include "PresenterController.hxx"
34cdf0e10cSrcweir #include "PresenterGeometryHelper.hxx"
35cdf0e10cSrcweir #include "PresenterHelper.hxx"
36cdf0e10cSrcweir #include "PresenterPaintManager.hxx"
37cdf0e10cSrcweir #include "PresenterPaneBase.hxx"
38cdf0e10cSrcweir #include "PresenterPaneBorderManager.hxx"
39cdf0e10cSrcweir #include "PresenterPaneBorderPainter.hxx"
40cdf0e10cSrcweir #include "PresenterPaneContainer.hxx"
41cdf0e10cSrcweir #include "PresenterPaneFactory.hxx"
42cdf0e10cSrcweir #include "PresenterSprite.hxx"
43cdf0e10cSrcweir #include "PresenterToolBar.hxx"
44cdf0e10cSrcweir #include "PresenterViewFactory.hxx"
45cdf0e10cSrcweir #include "PresenterTheme.hxx"
46cdf0e10cSrcweir #include <com/sun/star/awt/InvalidateStyle.hpp>
47cdf0e10cSrcweir #include <com/sun/star/awt/PosSize.hpp>
48cdf0e10cSrcweir #include <com/sun/star/awt/SystemPointer.hpp>
49cdf0e10cSrcweir #include <com/sun/star/awt/XDevice.hpp>
50cdf0e10cSrcweir #include <com/sun/star/awt/XWindow2.hpp>
51cdf0e10cSrcweir #include <com/sun/star/awt/XWindowPeer.hpp>
52cdf0e10cSrcweir #include <com/sun/star/awt/WindowAttribute.hpp>
53cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp>
54cdf0e10cSrcweir #include <com/sun/star/drawing/framework/ResourceId.hpp>
55cdf0e10cSrcweir #include <com/sun/star/rendering/CompositeOperation.hpp>
56cdf0e10cSrcweir #include <com/sun/star/rendering/FillRule.hpp>
57cdf0e10cSrcweir #include <com/sun/star/rendering/PathCapType.hpp>
58cdf0e10cSrcweir #include <com/sun/star/rendering/PathJoinType.hpp>
59cdf0e10cSrcweir #include <com/sun/star/rendering/Texture.hpp>
60cdf0e10cSrcweir #include <com/sun/star/rendering/TexturingMode.hpp>
61cdf0e10cSrcweir #include <com/sun/star/rendering/XSpriteCanvas.hpp>
62cdf0e10cSrcweir #include <boost/bind.hpp>
63cdf0e10cSrcweir #include <boost/bind/protect.hpp>
64cdf0e10cSrcweir #include <math.h>
65cdf0e10cSrcweir 
66cdf0e10cSrcweir using namespace ::com::sun::star;
67cdf0e10cSrcweir using namespace ::com::sun::star::uno;
68cdf0e10cSrcweir using namespace ::com::sun::star::drawing::framework;
69cdf0e10cSrcweir using ::rtl::OUString;
70cdf0e10cSrcweir 
71cdf0e10cSrcweir #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
72cdf0e10cSrcweir 
73cdf0e10cSrcweir namespace sdext { namespace presenter {
74cdf0e10cSrcweir 
75cdf0e10cSrcweir namespace {
76cdf0e10cSrcweir 
77cdf0e10cSrcweir     typedef ::cppu::WeakComponentImplHelper1<
78cdf0e10cSrcweir         css::drawing::framework::XConfigurationChangeListener
79cdf0e10cSrcweir         > ModeChangeAnimationStarterInterfaceBase;
80cdf0e10cSrcweir 
81cdf0e10cSrcweir     class ModeChangeAnimationStarter
82cdf0e10cSrcweir         : protected ::cppu::BaseMutex,
83cdf0e10cSrcweir           public ModeChangeAnimationStarterInterfaceBase
84cdf0e10cSrcweir     {
85cdf0e10cSrcweir     public:
86cdf0e10cSrcweir         ModeChangeAnimationStarter (
87cdf0e10cSrcweir             const Reference<drawing::framework::XConfigurationController>& rxConfigurationController,
88cdf0e10cSrcweir             const Reference<awt::XWindow>& rxWindow,
89cdf0e10cSrcweir             const Reference<rendering::XSpriteCanvas>& rxCanvas,
90cdf0e10cSrcweir             const ::boost::shared_ptr<PresenterAnimator>& rpAnimator);
91cdf0e10cSrcweir         virtual ~ModeChangeAnimationStarter (void);
92cdf0e10cSrcweir         virtual void SAL_CALL disposing (void);
93cdf0e10cSrcweir 
94cdf0e10cSrcweir         // XConfigurationChangeListener
95cdf0e10cSrcweir 
96cdf0e10cSrcweir         virtual void SAL_CALL notifyConfigurationChange (
97cdf0e10cSrcweir             const com::sun::star::drawing::framework::ConfigurationChangeEvent& rEvent)
98cdf0e10cSrcweir             throw (com::sun::star::uno::RuntimeException);
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 
101cdf0e10cSrcweir         // XEventListener
102cdf0e10cSrcweir 
103cdf0e10cSrcweir         virtual void SAL_CALL disposing (
104cdf0e10cSrcweir             const com::sun::star::lang::EventObject& rEvent)
105cdf0e10cSrcweir             throw (com::sun::star::uno::RuntimeException);
106cdf0e10cSrcweir 
107cdf0e10cSrcweir     private:
108cdf0e10cSrcweir         Reference<drawing::framework::XConfigurationController> mxConfigurationController;
109cdf0e10cSrcweir         ::boost::shared_ptr<PresenterAnimator> mpAnimator;
110cdf0e10cSrcweir         ::boost::shared_ptr<PresenterSprite> mpSprite;
111cdf0e10cSrcweir         Reference<rendering::XSpriteCanvas> mxCanvas;
112cdf0e10cSrcweir     };
113cdf0e10cSrcweir 
114cdf0e10cSrcweir }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 
119cdf0e10cSrcweir //===== PresenterWindowManager ================================================
120cdf0e10cSrcweir 
PresenterWindowManager(const Reference<XComponentContext> & rxContext,const::rtl::Reference<PresenterPaneContainer> & rpPaneContainer,const::rtl::Reference<PresenterController> & rpPresenterController)121cdf0e10cSrcweir PresenterWindowManager::PresenterWindowManager (
122cdf0e10cSrcweir     const Reference<XComponentContext>& rxContext,
123cdf0e10cSrcweir     const ::rtl::Reference<PresenterPaneContainer>& rpPaneContainer,
124cdf0e10cSrcweir     const ::rtl::Reference<PresenterController>& rpPresenterController)
125cdf0e10cSrcweir     : PresenterWindowManagerInterfaceBase(m_aMutex),
126cdf0e10cSrcweir       mxComponentContext(rxContext),
127cdf0e10cSrcweir       mpPresenterController(rpPresenterController),
128cdf0e10cSrcweir       mxParentWindow(),
129cdf0e10cSrcweir       mxParentCanvas(),
130cdf0e10cSrcweir       mxPaneBorderManager(),
131cdf0e10cSrcweir       mpPaneBorderPainter(),
132cdf0e10cSrcweir       mpPaneContainer(rpPaneContainer),
133cdf0e10cSrcweir       mbIsLayoutPending(true),
134cdf0e10cSrcweir       mbIsLayouting(false),
135cdf0e10cSrcweir       mpTheme(),
136cdf0e10cSrcweir       mpBackgroundBitmap(),
137cdf0e10cSrcweir       mxScaledBackgroundBitmap(),
138cdf0e10cSrcweir       maPaneBackgroundColor(),
139cdf0e10cSrcweir       mxClipPolygon(),
140cdf0e10cSrcweir       meLayoutMode(LM_Generic),
141cdf0e10cSrcweir       mbIsSlideSorterActive(false),
142cdf0e10cSrcweir       mbIsHelpViewActive(false),
143cdf0e10cSrcweir       maLayoutListeners(),
144cdf0e10cSrcweir       mbIsMouseClickPending(false)
145cdf0e10cSrcweir {
146cdf0e10cSrcweir     UpdateWindowList();
147cdf0e10cSrcweir }
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 
~PresenterWindowManager(void)152cdf0e10cSrcweir PresenterWindowManager::~PresenterWindowManager (void)
153cdf0e10cSrcweir {
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 
disposing(void)159cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::disposing (void)
160cdf0e10cSrcweir {
161cdf0e10cSrcweir     NotifyDisposing();
162cdf0e10cSrcweir 
163cdf0e10cSrcweir     SetParentPane(NULL);
164cdf0e10cSrcweir 
165cdf0e10cSrcweir     Reference<lang::XComponent> xComponent (mxPaneBorderManager, UNO_QUERY);
166cdf0e10cSrcweir     if (xComponent.is())
167cdf0e10cSrcweir         xComponent->dispose();
168cdf0e10cSrcweir     mxPaneBorderManager = NULL;
169cdf0e10cSrcweir 
170cdf0e10cSrcweir     PresenterPaneContainer::PaneList::const_iterator iPane;
171cdf0e10cSrcweir     PresenterPaneContainer::PaneList::const_iterator iEnd (mpPaneContainer->maPanes.end());
172cdf0e10cSrcweir     for (iPane=mpPaneContainer->maPanes.begin(); iPane!=iEnd; ++iPane)
173cdf0e10cSrcweir     {
174cdf0e10cSrcweir         if ((*iPane)->mxBorderWindow.is())
175cdf0e10cSrcweir         {
176cdf0e10cSrcweir             (*iPane)->mxBorderWindow->removeWindowListener(this);
177cdf0e10cSrcweir             (*iPane)->mxBorderWindow->removeFocusListener(this);
178cdf0e10cSrcweir #ifndef ENABLE_PANE_RESIZING
179cdf0e10cSrcweir             (*iPane)->mxBorderWindow->removeMouseListener(this);
180cdf0e10cSrcweir #endif
181cdf0e10cSrcweir         }
182cdf0e10cSrcweir     }
183cdf0e10cSrcweir }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 
187cdf0e10cSrcweir 
SetParentPane(const Reference<drawing::framework::XPane> & rxPane)188cdf0e10cSrcweir void PresenterWindowManager::SetParentPane (
189cdf0e10cSrcweir     const Reference<drawing::framework::XPane>& rxPane)
190cdf0e10cSrcweir {
191cdf0e10cSrcweir     if (mxParentWindow.is())
192cdf0e10cSrcweir     {
193cdf0e10cSrcweir         mxParentWindow->removeWindowListener(this);
194cdf0e10cSrcweir         mxParentWindow->removePaintListener(this);
195cdf0e10cSrcweir         mxParentWindow->removeMouseListener(this);
196cdf0e10cSrcweir         mxParentWindow->removeFocusListener(this);
197cdf0e10cSrcweir     }
198cdf0e10cSrcweir     mxParentWindow = NULL;
199cdf0e10cSrcweir     mxParentCanvas = NULL;
200cdf0e10cSrcweir 
201cdf0e10cSrcweir     if (rxPane.is())
202cdf0e10cSrcweir     {
203cdf0e10cSrcweir         mxParentWindow = rxPane->getWindow();
204cdf0e10cSrcweir         mxParentCanvas = rxPane->getCanvas();
205cdf0e10cSrcweir     }
206cdf0e10cSrcweir     else
207cdf0e10cSrcweir     {
208cdf0e10cSrcweir         mxParentWindow = NULL;
209cdf0e10cSrcweir     }
210cdf0e10cSrcweir 
211cdf0e10cSrcweir     if (mxParentWindow.is())
212cdf0e10cSrcweir     {
213cdf0e10cSrcweir         mxParentWindow->addWindowListener(this);
214cdf0e10cSrcweir         mxParentWindow->addPaintListener(this);
215cdf0e10cSrcweir         mxParentWindow->addMouseListener(this);
216cdf0e10cSrcweir         mxParentWindow->addFocusListener(this);
217cdf0e10cSrcweir 
218cdf0e10cSrcweir         // We paint our own background, make that of the parent window transparent.
219cdf0e10cSrcweir         Reference<awt::XWindowPeer> xPeer (mxParentWindow, UNO_QUERY);
220cdf0e10cSrcweir         if (xPeer.is())
221cdf0e10cSrcweir             xPeer->setBackground(util::Color(0xff000000));
222cdf0e10cSrcweir     }
223cdf0e10cSrcweir }
224cdf0e10cSrcweir 
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 
227cdf0e10cSrcweir 
SetTheme(const::boost::shared_ptr<PresenterTheme> & rpTheme)228cdf0e10cSrcweir void PresenterWindowManager::SetTheme (const ::boost::shared_ptr<PresenterTheme>& rpTheme)
229cdf0e10cSrcweir {
230cdf0e10cSrcweir     mpTheme = rpTheme;
231cdf0e10cSrcweir 
232cdf0e10cSrcweir     // Get background bitmap or background color from the theme.
233cdf0e10cSrcweir 
234cdf0e10cSrcweir     if (mpTheme.get() != NULL)
235cdf0e10cSrcweir     {
236cdf0e10cSrcweir         mpBackgroundBitmap = mpTheme->GetBitmap(OUString(), A2S("Background"));
237cdf0e10cSrcweir     }
238cdf0e10cSrcweir }
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 
241cdf0e10cSrcweir 
242cdf0e10cSrcweir 
NotifyPaneCreation(const PresenterPaneContainer::SharedPaneDescriptor & rpDescriptor)243cdf0e10cSrcweir void PresenterWindowManager::NotifyPaneCreation (
244cdf0e10cSrcweir     const PresenterPaneContainer::SharedPaneDescriptor& rpDescriptor)
245cdf0e10cSrcweir {
246cdf0e10cSrcweir     if (rpDescriptor.get()==NULL)
247cdf0e10cSrcweir     {
248cdf0e10cSrcweir         OSL_ASSERT(rpDescriptor.get()!=NULL);
249cdf0e10cSrcweir         return;
250cdf0e10cSrcweir     }
251cdf0e10cSrcweir     if ( ! rpDescriptor->mxContentWindow.is())
252cdf0e10cSrcweir     {
253cdf0e10cSrcweir         OSL_ASSERT(rpDescriptor->mxContentWindow.is());
254cdf0e10cSrcweir         return;
255cdf0e10cSrcweir     }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir     mbIsLayoutPending = true;
258cdf0e10cSrcweir 
259cdf0e10cSrcweir     Reference<awt::XWindow> xBorderWindow (rpDescriptor->mxBorderWindow);
260cdf0e10cSrcweir     OSL_ASSERT(xBorderWindow.is());
261cdf0e10cSrcweir     if (xBorderWindow.is() && ! rpDescriptor->mbIsSprite)
262cdf0e10cSrcweir     {
263cdf0e10cSrcweir         Invalidate();
264cdf0e10cSrcweir 
265cdf0e10cSrcweir         xBorderWindow->addWindowListener(this);
266cdf0e10cSrcweir         xBorderWindow->addFocusListener(this);
267cdf0e10cSrcweir #ifndef ENABLE_PANE_RESIZING
268cdf0e10cSrcweir         xBorderWindow->addMouseListener(this);
269cdf0e10cSrcweir #endif
270cdf0e10cSrcweir     }
271cdf0e10cSrcweir 
272cdf0e10cSrcweir     UpdateWindowList();
273cdf0e10cSrcweir     Layout();
274cdf0e10cSrcweir }
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 
278cdf0e10cSrcweir 
NotifyViewCreation(const Reference<XView> & rxView)279cdf0e10cSrcweir void PresenterWindowManager::NotifyViewCreation (const Reference<XView>& rxView)
280cdf0e10cSrcweir {
281cdf0e10cSrcweir     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
282cdf0e10cSrcweir         mpPaneContainer->FindPaneId(rxView->getResourceId()->getAnchor()));
283cdf0e10cSrcweir     OSL_ASSERT(pDescriptor.get() != NULL);
284cdf0e10cSrcweir     if (pDescriptor.get() != NULL)
285cdf0e10cSrcweir     {
286cdf0e10cSrcweir         Layout();
287cdf0e10cSrcweir 
288cdf0e10cSrcweir         mpPresenterController->GetPaintManager()->Invalidate(
289cdf0e10cSrcweir             pDescriptor->mxContentWindow,
290cdf0e10cSrcweir             (sal_Int16)(awt::InvalidateStyle::TRANSPARENT
291cdf0e10cSrcweir             | awt::InvalidateStyle::CHILDREN));
292cdf0e10cSrcweir     }
293cdf0e10cSrcweir }
294cdf0e10cSrcweir 
295cdf0e10cSrcweir 
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 
SetPanePosSizeRelative(const Reference<XResourceId> & rxPaneId,const double nRelativeX,const double nRelativeY,const double nRelativeWidth,const double nRelativeHeight)298cdf0e10cSrcweir void PresenterWindowManager::SetPanePosSizeRelative (
299cdf0e10cSrcweir     const Reference<XResourceId>& rxPaneId,
300cdf0e10cSrcweir     const double nRelativeX,
301cdf0e10cSrcweir     const double nRelativeY,
302cdf0e10cSrcweir     const double nRelativeWidth,
303cdf0e10cSrcweir     const double nRelativeHeight)
304cdf0e10cSrcweir {
305cdf0e10cSrcweir     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
306cdf0e10cSrcweir         mpPaneContainer->FindPaneId(rxPaneId));
307cdf0e10cSrcweir     if (pDescriptor.get() != NULL)
308cdf0e10cSrcweir     {
309cdf0e10cSrcweir         pDescriptor->mnLeft = nRelativeX;
310cdf0e10cSrcweir         pDescriptor->mnTop = nRelativeY;
311cdf0e10cSrcweir         pDescriptor->mnRight = nRelativeX + nRelativeWidth;
312cdf0e10cSrcweir         pDescriptor->mnBottom = nRelativeY + nRelativeHeight;
313cdf0e10cSrcweir 
314cdf0e10cSrcweir         mpPaneContainer->ToTop(pDescriptor);
315cdf0e10cSrcweir     }
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir 
319cdf0e10cSrcweir 
320cdf0e10cSrcweir 
SetPanePosSizeAbsolute(const OUString & rsPaneURL,const double nX,const double nY,const double nWidth,const double nHeight)321cdf0e10cSrcweir void PresenterWindowManager::SetPanePosSizeAbsolute (
322cdf0e10cSrcweir     const OUString& rsPaneURL,
323cdf0e10cSrcweir     const double nX,
324cdf0e10cSrcweir     const double nY,
325cdf0e10cSrcweir     const double nWidth,
326cdf0e10cSrcweir     const double nHeight)
327cdf0e10cSrcweir {
328cdf0e10cSrcweir     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
329cdf0e10cSrcweir         mpPaneContainer->FindPaneURL(rsPaneURL));
330cdf0e10cSrcweir     if (pDescriptor.get() != NULL)
331cdf0e10cSrcweir     {
332cdf0e10cSrcweir         awt::Rectangle aParentBox = mxParentWindow->getPosSize();
333cdf0e10cSrcweir         if (aParentBox.Width > 0 && aParentBox.Height > 0)
334cdf0e10cSrcweir         {
335cdf0e10cSrcweir             pDescriptor->mnLeft = nX / aParentBox.Width;
336cdf0e10cSrcweir             pDescriptor->mnTop = nY / aParentBox.Height;
337cdf0e10cSrcweir             pDescriptor->mnRight = (nX + nWidth) / aParentBox.Width;
338cdf0e10cSrcweir             pDescriptor->mnBottom = (nY + nHeight) / aParentBox.Height;
339cdf0e10cSrcweir         }
340cdf0e10cSrcweir         if (pDescriptor->mxBorderWindow.is())
341cdf0e10cSrcweir             pDescriptor->mxBorderWindow->setPosSize(
342cdf0e10cSrcweir                 ::sal::static_int_cast<sal_Int32>(nX),
343cdf0e10cSrcweir                 ::sal::static_int_cast<sal_Int32>(nY),
344cdf0e10cSrcweir                 ::sal::static_int_cast<sal_Int32>(nWidth),
345cdf0e10cSrcweir                 ::sal::static_int_cast<sal_Int32>(nHeight),
346cdf0e10cSrcweir                 awt::PosSize::POSSIZE);
347cdf0e10cSrcweir     }
348cdf0e10cSrcweir }
349cdf0e10cSrcweir 
350cdf0e10cSrcweir 
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 
SetPaneBorderPainter(const::rtl::Reference<PresenterPaneBorderPainter> & rPainter)353cdf0e10cSrcweir void PresenterWindowManager::SetPaneBorderPainter (
354cdf0e10cSrcweir     const ::rtl::Reference<PresenterPaneBorderPainter>& rPainter)
355cdf0e10cSrcweir {
356cdf0e10cSrcweir     mpPaneBorderPainter = rPainter;
357cdf0e10cSrcweir }
358cdf0e10cSrcweir 
359cdf0e10cSrcweir 
360cdf0e10cSrcweir 
361cdf0e10cSrcweir 
362cdf0e10cSrcweir //----- XWindowListener -------------------------------------------------------
363cdf0e10cSrcweir 
windowResized(const awt::WindowEvent & rEvent)364cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::windowResized (const awt::WindowEvent& rEvent)
365cdf0e10cSrcweir     throw (RuntimeException)
366cdf0e10cSrcweir {
367cdf0e10cSrcweir     ThrowIfDisposed();
368cdf0e10cSrcweir     if (rEvent.Source == mxParentWindow)
369cdf0e10cSrcweir     {
370cdf0e10cSrcweir         Layout();
371cdf0e10cSrcweir     }
372cdf0e10cSrcweir     else
373cdf0e10cSrcweir     {
374cdf0e10cSrcweir         Reference<awt::XWindow> xWindow (rEvent.Source,UNO_QUERY);
375cdf0e10cSrcweir         if (xWindow.is())
376cdf0e10cSrcweir         {
377cdf0e10cSrcweir             UpdateWindowSize(xWindow);
378cdf0e10cSrcweir 
379cdf0e10cSrcweir             // Make sure the background of a transparent window is painted.
380cdf0e10cSrcweir             mpPresenterController->GetPaintManager()->Invalidate(mxParentWindow);
381cdf0e10cSrcweir         }
382cdf0e10cSrcweir     }
383cdf0e10cSrcweir }
384cdf0e10cSrcweir 
385cdf0e10cSrcweir 
386cdf0e10cSrcweir 
387cdf0e10cSrcweir 
windowMoved(const awt::WindowEvent & rEvent)388cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::windowMoved (const awt::WindowEvent& rEvent)
389cdf0e10cSrcweir     throw (RuntimeException)
390cdf0e10cSrcweir {
391cdf0e10cSrcweir     ThrowIfDisposed();
392cdf0e10cSrcweir     if (rEvent.Source != mxParentWindow)
393cdf0e10cSrcweir     {
394cdf0e10cSrcweir         Reference<awt::XWindow> xWindow (rEvent.Source,UNO_QUERY);
395cdf0e10cSrcweir         UpdateWindowSize(xWindow);
396cdf0e10cSrcweir 
397cdf0e10cSrcweir         // Make sure the background of a transparent window is painted.
398cdf0e10cSrcweir         mpPresenterController->GetPaintManager()->Invalidate(xWindow);
399cdf0e10cSrcweir     }
400cdf0e10cSrcweir }
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 
403cdf0e10cSrcweir 
404cdf0e10cSrcweir 
windowShown(const lang::EventObject & rEvent)405cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::windowShown (const lang::EventObject& rEvent)
406cdf0e10cSrcweir     throw (RuntimeException)
407cdf0e10cSrcweir {
408cdf0e10cSrcweir     (void)rEvent;
409cdf0e10cSrcweir }
410cdf0e10cSrcweir 
411cdf0e10cSrcweir 
412cdf0e10cSrcweir 
413cdf0e10cSrcweir 
windowHidden(const lang::EventObject & rEvent)414cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::windowHidden (const lang::EventObject& rEvent)
415cdf0e10cSrcweir     throw (RuntimeException)
416cdf0e10cSrcweir {
417cdf0e10cSrcweir     (void)rEvent;
418cdf0e10cSrcweir }
419cdf0e10cSrcweir 
420cdf0e10cSrcweir 
421cdf0e10cSrcweir 
422cdf0e10cSrcweir 
423cdf0e10cSrcweir //----- XPaintListener --------------------------------------------------------
424cdf0e10cSrcweir 
windowPaint(const awt::PaintEvent & rEvent)425cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::windowPaint (const awt::PaintEvent& rEvent)
426cdf0e10cSrcweir     throw (RuntimeException)
427cdf0e10cSrcweir {
428cdf0e10cSrcweir     ThrowIfDisposed();
429cdf0e10cSrcweir 
430cdf0e10cSrcweir     if ( ! mxParentWindow.is())
431cdf0e10cSrcweir         return;
432cdf0e10cSrcweir     if ( ! mxParentCanvas.is())
433cdf0e10cSrcweir         return;
434cdf0e10cSrcweir 
435cdf0e10cSrcweir     if (mpTheme.get()!=NULL)
436cdf0e10cSrcweir     {
437cdf0e10cSrcweir         try
438cdf0e10cSrcweir         {
439cdf0e10cSrcweir             if (mbIsLayoutPending)
440cdf0e10cSrcweir                 Layout();
441cdf0e10cSrcweir             PaintBackground(rEvent.UpdateRect);
442cdf0e10cSrcweir             if ( ! PaintChildren(rEvent))
443cdf0e10cSrcweir             {
444cdf0e10cSrcweir                 Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxParentCanvas, UNO_QUERY);
445cdf0e10cSrcweir                 //                if (xSpriteCanvas.is())
446cdf0e10cSrcweir                 //                    xSpriteCanvas->updateScreen(sal_False);
447cdf0e10cSrcweir             }
448cdf0e10cSrcweir         }
449cdf0e10cSrcweir         catch (RuntimeException&)
450cdf0e10cSrcweir         {
451cdf0e10cSrcweir             OSL_ASSERT(sal_False);
452cdf0e10cSrcweir         }
453cdf0e10cSrcweir     }
454cdf0e10cSrcweir }
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 
457cdf0e10cSrcweir 
458cdf0e10cSrcweir 
459cdf0e10cSrcweir //----- XMouseListener --------------------------------------------------------
460cdf0e10cSrcweir 
mousePressed(const css::awt::MouseEvent & rEvent)461cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::mousePressed (const css::awt::MouseEvent& rEvent)
462cdf0e10cSrcweir     throw(css::uno::RuntimeException)
463cdf0e10cSrcweir {
464cdf0e10cSrcweir     (void)rEvent;
465cdf0e10cSrcweir     mbIsMouseClickPending = true;
466cdf0e10cSrcweir }
467cdf0e10cSrcweir 
468cdf0e10cSrcweir 
469cdf0e10cSrcweir 
470cdf0e10cSrcweir 
mouseReleased(const css::awt::MouseEvent & rEvent)471cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::mouseReleased (const css::awt::MouseEvent& rEvent)
472cdf0e10cSrcweir     throw(css::uno::RuntimeException)
473cdf0e10cSrcweir {
474cdf0e10cSrcweir #ifndef ENABLE_PANE_RESIZING
475cdf0e10cSrcweir     if (mbIsMouseClickPending)
476cdf0e10cSrcweir     {
477cdf0e10cSrcweir         mbIsMouseClickPending = false;
478cdf0e10cSrcweir         mpPresenterController->HandleMouseClick(rEvent);
479cdf0e10cSrcweir     }
480cdf0e10cSrcweir #else
481cdf0e10cSrcweir     (void)rEvent;
482cdf0e10cSrcweir #endif
483cdf0e10cSrcweir }
484cdf0e10cSrcweir 
485cdf0e10cSrcweir 
486cdf0e10cSrcweir 
487cdf0e10cSrcweir 
mouseEntered(const css::awt::MouseEvent & rEvent)488cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::mouseEntered (const css::awt::MouseEvent& rEvent)
489cdf0e10cSrcweir     throw(css::uno::RuntimeException)
490cdf0e10cSrcweir {
491cdf0e10cSrcweir     (void)rEvent;
492cdf0e10cSrcweir     mbIsMouseClickPending = false;
493cdf0e10cSrcweir }
494cdf0e10cSrcweir 
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 
497cdf0e10cSrcweir 
mouseExited(const css::awt::MouseEvent & rEvent)498cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::mouseExited (const css::awt::MouseEvent& rEvent)
499cdf0e10cSrcweir     throw(css::uno::RuntimeException)
500cdf0e10cSrcweir {
501cdf0e10cSrcweir     (void)rEvent;
502cdf0e10cSrcweir     mbIsMouseClickPending = false;
503cdf0e10cSrcweir }
504cdf0e10cSrcweir 
505cdf0e10cSrcweir 
506cdf0e10cSrcweir 
507cdf0e10cSrcweir 
508cdf0e10cSrcweir //----- XFocusListener --------------------------------------------------------
509cdf0e10cSrcweir 
focusGained(const css::awt::FocusEvent & rEvent)510cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::focusGained (const css::awt::FocusEvent& rEvent)
511cdf0e10cSrcweir     throw (css::uno::RuntimeException)
512cdf0e10cSrcweir {
513cdf0e10cSrcweir     ThrowIfDisposed();
514cdf0e10cSrcweir     (void)rEvent;
515cdf0e10cSrcweir     OSL_TRACE("PresenterWindowManager::focusGained window %x\n",
516cdf0e10cSrcweir         rEvent.Source.get());
517cdf0e10cSrcweir }
518cdf0e10cSrcweir 
519cdf0e10cSrcweir 
520cdf0e10cSrcweir 
521cdf0e10cSrcweir 
focusLost(const css::awt::FocusEvent & rEvent)522cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::focusLost (const css::awt::FocusEvent& rEvent)
523cdf0e10cSrcweir     throw (css::uno::RuntimeException)
524cdf0e10cSrcweir {
525cdf0e10cSrcweir     ThrowIfDisposed();
526cdf0e10cSrcweir     (void)rEvent;
527cdf0e10cSrcweir }
528cdf0e10cSrcweir 
529cdf0e10cSrcweir 
530cdf0e10cSrcweir 
531cdf0e10cSrcweir 
532cdf0e10cSrcweir //----- XEventListener --------------------------------------------------------
533cdf0e10cSrcweir 
disposing(const lang::EventObject & rEvent)534cdf0e10cSrcweir void SAL_CALL PresenterWindowManager::disposing (const lang::EventObject& rEvent)
535cdf0e10cSrcweir     throw (RuntimeException)
536cdf0e10cSrcweir {
537cdf0e10cSrcweir     if (rEvent.Source == mxParentWindow)
538cdf0e10cSrcweir         mxParentWindow = NULL;
539cdf0e10cSrcweir     else
540cdf0e10cSrcweir     {
541cdf0e10cSrcweir         Reference<awt::XWindow> xWindow (rEvent.Source, UNO_QUERY);
542cdf0e10cSrcweir     }
543cdf0e10cSrcweir }
544cdf0e10cSrcweir 
545cdf0e10cSrcweir 
546cdf0e10cSrcweir 
547cdf0e10cSrcweir 
548cdf0e10cSrcweir //-----------------------------------------------------------------------------
549cdf0e10cSrcweir 
PaintChildren(const awt::PaintEvent & rEvent) const550cdf0e10cSrcweir bool PresenterWindowManager::PaintChildren (const awt::PaintEvent& rEvent) const
551cdf0e10cSrcweir {
552cdf0e10cSrcweir     bool bChildInvalidated (false);
553cdf0e10cSrcweir 
554cdf0e10cSrcweir     // Call windowPaint on all children that lie in or touch the
555cdf0e10cSrcweir     // update rectangle.
556cdf0e10cSrcweir     PresenterPaneContainer::PaneList::const_iterator iPane;
557cdf0e10cSrcweir     PresenterPaneContainer::PaneList::const_iterator iEnd (mpPaneContainer->maPanes.end());
558cdf0e10cSrcweir     for (iPane=mpPaneContainer->maPanes.begin(); iPane!=iEnd; ++iPane)
559cdf0e10cSrcweir     {
560cdf0e10cSrcweir         try
561cdf0e10cSrcweir         {
562cdf0e10cSrcweir             // Make sure that the pane shall and can be painted.
563cdf0e10cSrcweir             if ( ! (*iPane)->mbIsActive)
564cdf0e10cSrcweir                 continue;
565cdf0e10cSrcweir             if ((*iPane)->mbIsSprite)
566cdf0e10cSrcweir                 continue;
567cdf0e10cSrcweir             if ( ! (*iPane)->mxPane.is())
568cdf0e10cSrcweir                 continue;
569cdf0e10cSrcweir             if ( ! (*iPane)->mxBorderWindow.is())
570cdf0e10cSrcweir                 continue;
571cdf0e10cSrcweir             Reference<awt::XWindow> xBorderWindow ((*iPane)->mxBorderWindow);
572cdf0e10cSrcweir             if ( ! xBorderWindow.is())
573cdf0e10cSrcweir                 continue;
574cdf0e10cSrcweir 
575cdf0e10cSrcweir             // Get the area in which the border of the pane has to be painted.
576cdf0e10cSrcweir             const awt::Rectangle aBorderBox (xBorderWindow->getPosSize());
577cdf0e10cSrcweir             const awt::Rectangle aBorderUpdateBox(
578cdf0e10cSrcweir                 PresenterGeometryHelper::Intersection(
579cdf0e10cSrcweir                     rEvent.UpdateRect,
580cdf0e10cSrcweir                     aBorderBox));
581cdf0e10cSrcweir             if (aBorderUpdateBox.Width<=0 || aBorderUpdateBox.Height<=0)
582cdf0e10cSrcweir                 continue;
583cdf0e10cSrcweir 
584cdf0e10cSrcweir             const awt::Rectangle aLocalBorderUpdateBox(
585cdf0e10cSrcweir                 PresenterGeometryHelper::TranslateRectangle(
586cdf0e10cSrcweir                     aBorderUpdateBox,
587cdf0e10cSrcweir                     -aBorderBox.X,
588cdf0e10cSrcweir                     -aBorderBox.Y));
589cdf0e10cSrcweir 
590cdf0e10cSrcweir             // Invalidate the area of the content window.
591cdf0e10cSrcweir             mpPresenterController->GetPaintManager()->Invalidate(
592cdf0e10cSrcweir                 xBorderWindow,
593cdf0e10cSrcweir                 aLocalBorderUpdateBox,
594cdf0e10cSrcweir                 sal_Int16(awt::InvalidateStyle::CHILDREN
595cdf0e10cSrcweir                     | awt::InvalidateStyle::NOTRANSPARENT));
596cdf0e10cSrcweir         }
597cdf0e10cSrcweir         catch (RuntimeException&)
598cdf0e10cSrcweir         {
599cdf0e10cSrcweir             OSL_ASSERT(sal_False);
600cdf0e10cSrcweir         }
601cdf0e10cSrcweir     }
602cdf0e10cSrcweir 
603cdf0e10cSrcweir     return bChildInvalidated;
604cdf0e10cSrcweir }
605cdf0e10cSrcweir 
606cdf0e10cSrcweir 
607cdf0e10cSrcweir 
608cdf0e10cSrcweir 
SetLayoutMode(const LayoutMode eMode)609cdf0e10cSrcweir void PresenterWindowManager::SetLayoutMode (const LayoutMode eMode)
610cdf0e10cSrcweir {
611cdf0e10cSrcweir     OSL_ASSERT(mpPresenterController.get() != NULL);
612cdf0e10cSrcweir 
613cdf0e10cSrcweir     if (meLayoutMode != eMode
614cdf0e10cSrcweir         || mbIsSlideSorterActive
615cdf0e10cSrcweir         || mbIsHelpViewActive)
616cdf0e10cSrcweir     {
617cdf0e10cSrcweir         meLayoutMode = eMode;
618cdf0e10cSrcweir         mbIsSlideSorterActive = false;
619cdf0e10cSrcweir         mbIsHelpViewActive = false;
620cdf0e10cSrcweir 
621cdf0e10cSrcweir         mpPresenterController->RequestViews(
622cdf0e10cSrcweir             mbIsSlideSorterActive,
623cdf0e10cSrcweir             meLayoutMode==LM_Notes,
624cdf0e10cSrcweir             mbIsHelpViewActive);
625cdf0e10cSrcweir         Layout();
626cdf0e10cSrcweir         NotifyLayoutModeChange();
627cdf0e10cSrcweir     }
628cdf0e10cSrcweir }
629cdf0e10cSrcweir 
630cdf0e10cSrcweir 
631cdf0e10cSrcweir 
632cdf0e10cSrcweir 
GetLayoutMode(void) const633cdf0e10cSrcweir PresenterWindowManager::LayoutMode PresenterWindowManager::GetLayoutMode (void) const
634cdf0e10cSrcweir {
635cdf0e10cSrcweir     return meLayoutMode;
636cdf0e10cSrcweir }
637cdf0e10cSrcweir 
638cdf0e10cSrcweir 
639cdf0e10cSrcweir 
640cdf0e10cSrcweir 
SetSlideSorterState(bool bIsActive)641cdf0e10cSrcweir void PresenterWindowManager::SetSlideSorterState (bool bIsActive)
642cdf0e10cSrcweir {
643cdf0e10cSrcweir     if (mbIsSlideSorterActive != bIsActive)
644cdf0e10cSrcweir     {
645cdf0e10cSrcweir         mbIsSlideSorterActive = bIsActive;
646cdf0e10cSrcweir         if (mbIsSlideSorterActive)
647cdf0e10cSrcweir             mbIsHelpViewActive = false;
648cdf0e10cSrcweir         StoreViewMode(GetViewMode());
649cdf0e10cSrcweir 
650cdf0e10cSrcweir         mpPresenterController->RequestViews(
651cdf0e10cSrcweir             mbIsSlideSorterActive,
652cdf0e10cSrcweir             meLayoutMode==LM_Notes,
653cdf0e10cSrcweir             mbIsHelpViewActive);
654cdf0e10cSrcweir         Layout();
655cdf0e10cSrcweir         NotifyLayoutModeChange();
656cdf0e10cSrcweir     }
657cdf0e10cSrcweir }
658cdf0e10cSrcweir 
659cdf0e10cSrcweir 
660cdf0e10cSrcweir 
661cdf0e10cSrcweir 
IsSlideSorterActive(void) const662cdf0e10cSrcweir bool PresenterWindowManager::IsSlideSorterActive (void) const
663cdf0e10cSrcweir {
664cdf0e10cSrcweir     return mbIsSlideSorterActive;
665cdf0e10cSrcweir }
666cdf0e10cSrcweir 
667cdf0e10cSrcweir 
668cdf0e10cSrcweir 
669cdf0e10cSrcweir 
SetHelpViewState(bool bIsActive)670cdf0e10cSrcweir void PresenterWindowManager::SetHelpViewState (bool bIsActive)
671cdf0e10cSrcweir {
672cdf0e10cSrcweir     if (mbIsHelpViewActive != bIsActive)
673cdf0e10cSrcweir     {
674cdf0e10cSrcweir         mbIsHelpViewActive = bIsActive;
675cdf0e10cSrcweir         if (mbIsHelpViewActive)
676cdf0e10cSrcweir             mbIsSlideSorterActive = false;
677cdf0e10cSrcweir         StoreViewMode(GetViewMode());
678cdf0e10cSrcweir 
679cdf0e10cSrcweir         mpPresenterController->RequestViews(
680cdf0e10cSrcweir             mbIsSlideSorterActive,
681cdf0e10cSrcweir             meLayoutMode==LM_Notes,
682cdf0e10cSrcweir             mbIsHelpViewActive);
683cdf0e10cSrcweir         Layout();
684cdf0e10cSrcweir         NotifyLayoutModeChange();
685cdf0e10cSrcweir     }
686cdf0e10cSrcweir }
687cdf0e10cSrcweir 
688cdf0e10cSrcweir 
689cdf0e10cSrcweir 
690cdf0e10cSrcweir 
IsHelpViewActive(void) const691cdf0e10cSrcweir bool PresenterWindowManager::IsHelpViewActive (void) const
692cdf0e10cSrcweir {
693cdf0e10cSrcweir     return mbIsHelpViewActive;
694cdf0e10cSrcweir }
695cdf0e10cSrcweir 
696cdf0e10cSrcweir 
697cdf0e10cSrcweir 
698cdf0e10cSrcweir 
SetViewMode(const ViewMode eMode)699cdf0e10cSrcweir void PresenterWindowManager::SetViewMode (const ViewMode eMode)
700cdf0e10cSrcweir {
701cdf0e10cSrcweir     switch (eMode)
702cdf0e10cSrcweir     {
703cdf0e10cSrcweir         case VM_Standard:
704cdf0e10cSrcweir             SetSlideSorterState(false);
705cdf0e10cSrcweir             SetHelpViewState(false);
706cdf0e10cSrcweir             SetLayoutMode(LM_Standard);
707cdf0e10cSrcweir             break;
708cdf0e10cSrcweir 
709cdf0e10cSrcweir         case VM_Notes:
710cdf0e10cSrcweir             SetSlideSorterState(false);
711cdf0e10cSrcweir             SetHelpViewState(false);
712cdf0e10cSrcweir             SetLayoutMode(LM_Notes);
713cdf0e10cSrcweir             break;
714cdf0e10cSrcweir 
715cdf0e10cSrcweir         case VM_SlideOverview:
716cdf0e10cSrcweir             SetHelpViewState(false);
717cdf0e10cSrcweir             SetSlideSorterState(true);
718cdf0e10cSrcweir             break;
719cdf0e10cSrcweir 
720cdf0e10cSrcweir         case VM_Help:
721cdf0e10cSrcweir             SetHelpViewState(true);
722cdf0e10cSrcweir             SetSlideSorterState(false);
723cdf0e10cSrcweir             break;
724cdf0e10cSrcweir     }
725cdf0e10cSrcweir 
726cdf0e10cSrcweir     StoreViewMode(eMode);
727cdf0e10cSrcweir }
728cdf0e10cSrcweir 
729cdf0e10cSrcweir 
730cdf0e10cSrcweir 
731cdf0e10cSrcweir 
GetViewMode(void) const732cdf0e10cSrcweir PresenterWindowManager::ViewMode PresenterWindowManager::GetViewMode (void) const
733cdf0e10cSrcweir {
734cdf0e10cSrcweir     if (mbIsHelpViewActive)
735cdf0e10cSrcweir         return VM_Help;
736cdf0e10cSrcweir     else if (mbIsSlideSorterActive)
737cdf0e10cSrcweir         return VM_SlideOverview;
738cdf0e10cSrcweir     else if (meLayoutMode == LM_Notes)
739cdf0e10cSrcweir         return VM_Notes;
740cdf0e10cSrcweir     else
741cdf0e10cSrcweir         return VM_Standard;
742cdf0e10cSrcweir }
743cdf0e10cSrcweir 
744cdf0e10cSrcweir 
745cdf0e10cSrcweir 
746cdf0e10cSrcweir 
RestoreViewMode(void)747cdf0e10cSrcweir void PresenterWindowManager::RestoreViewMode (void)
748cdf0e10cSrcweir {
749cdf0e10cSrcweir     sal_Int32 nMode (0);
750cdf0e10cSrcweir     PresenterConfigurationAccess aConfiguration (
751cdf0e10cSrcweir         mxComponentContext,
752*79e0a548SAriel Constenla-Haile         OUString::createFromAscii("/org.openoffice.Office.PresenterScreen/"),
753cdf0e10cSrcweir         PresenterConfigurationAccess::READ_ONLY);
754cdf0e10cSrcweir     aConfiguration.GetConfigurationNode(A2S("Presenter/InitialViewMode")) >>= nMode;
755cdf0e10cSrcweir     switch (nMode)
756cdf0e10cSrcweir     {
757cdf0e10cSrcweir         default:
758cdf0e10cSrcweir         case 0:
759cdf0e10cSrcweir             SetViewMode(VM_Standard);
760cdf0e10cSrcweir             break;
761cdf0e10cSrcweir 
762cdf0e10cSrcweir         case 1:
763cdf0e10cSrcweir             SetViewMode(VM_Notes);
764cdf0e10cSrcweir             break;
765cdf0e10cSrcweir 
766cdf0e10cSrcweir         case 2:
767cdf0e10cSrcweir             SetViewMode(VM_SlideOverview);
768cdf0e10cSrcweir             break;
769cdf0e10cSrcweir     }
770cdf0e10cSrcweir }
771cdf0e10cSrcweir 
772cdf0e10cSrcweir 
773cdf0e10cSrcweir 
774cdf0e10cSrcweir 
StoreViewMode(const ViewMode eViewMode)775cdf0e10cSrcweir void PresenterWindowManager::StoreViewMode (const ViewMode eViewMode)
776cdf0e10cSrcweir {
777cdf0e10cSrcweir     try
778cdf0e10cSrcweir     {
779cdf0e10cSrcweir         PresenterConfigurationAccess aConfiguration (
780cdf0e10cSrcweir             mxComponentContext,
781*79e0a548SAriel Constenla-Haile             OUString::createFromAscii("/org.openoffice.Office.PresenterScreen/"),
782cdf0e10cSrcweir             PresenterConfigurationAccess::READ_WRITE);
783cdf0e10cSrcweir         aConfiguration.GoToChild(A2S("Presenter"));
784cdf0e10cSrcweir         Any aValue;
785cdf0e10cSrcweir         switch (eViewMode)
786cdf0e10cSrcweir         {
787cdf0e10cSrcweir             default:
788cdf0e10cSrcweir             case VM_Standard:
789cdf0e10cSrcweir                 aValue = Any(sal_Int32(0));
790cdf0e10cSrcweir                 break;
791cdf0e10cSrcweir 
792cdf0e10cSrcweir             case VM_Notes:
793cdf0e10cSrcweir                 aValue = Any(sal_Int32(1));
794cdf0e10cSrcweir                 break;
795cdf0e10cSrcweir 
796cdf0e10cSrcweir             case VM_SlideOverview:
797cdf0e10cSrcweir                 aValue = Any(sal_Int32(2));
798cdf0e10cSrcweir                 break;
799cdf0e10cSrcweir         }
800cdf0e10cSrcweir 
801cdf0e10cSrcweir         aConfiguration.SetProperty (A2S("InitialViewMode"), aValue);
802cdf0e10cSrcweir         aConfiguration.CommitChanges();
803cdf0e10cSrcweir     }
804cdf0e10cSrcweir     catch (Exception&)
805cdf0e10cSrcweir     {
806cdf0e10cSrcweir     }
807cdf0e10cSrcweir }
808cdf0e10cSrcweir 
809cdf0e10cSrcweir 
810cdf0e10cSrcweir 
811cdf0e10cSrcweir 
AddLayoutListener(const Reference<document::XEventListener> & rxListener)812cdf0e10cSrcweir void PresenterWindowManager::AddLayoutListener (
813cdf0e10cSrcweir     const Reference<document::XEventListener>& rxListener)
814cdf0e10cSrcweir {
815cdf0e10cSrcweir     maLayoutListeners.push_back(rxListener);
816cdf0e10cSrcweir }
817cdf0e10cSrcweir 
818cdf0e10cSrcweir 
819cdf0e10cSrcweir 
820cdf0e10cSrcweir 
RemoveLayoutListener(const Reference<document::XEventListener> & rxListener)821cdf0e10cSrcweir void PresenterWindowManager::RemoveLayoutListener (
822cdf0e10cSrcweir     const Reference<document::XEventListener>& rxListener)
823cdf0e10cSrcweir {
824cdf0e10cSrcweir     LayoutListenerContainer::iterator iListener (maLayoutListeners.begin());
825cdf0e10cSrcweir     LayoutListenerContainer::iterator iEnd (maLayoutListeners.end());
826cdf0e10cSrcweir     for ( ; iListener!=iEnd; ++iListener)
827cdf0e10cSrcweir     {
828cdf0e10cSrcweir         if (*iListener == rxListener)
829cdf0e10cSrcweir         {
830cdf0e10cSrcweir             maLayoutListeners.erase(iListener);
831cdf0e10cSrcweir             // Assume that there are no multiple entries.
832cdf0e10cSrcweir             break;
833cdf0e10cSrcweir         }
834cdf0e10cSrcweir     }
835cdf0e10cSrcweir }
836cdf0e10cSrcweir 
837cdf0e10cSrcweir 
838cdf0e10cSrcweir 
839cdf0e10cSrcweir 
Layout(void)840cdf0e10cSrcweir void PresenterWindowManager::Layout (void)
841cdf0e10cSrcweir {
842cdf0e10cSrcweir     if (mxParentWindow.is() && ! mbIsLayouting)
843cdf0e10cSrcweir     {
844cdf0e10cSrcweir         mbIsLayoutPending = false;
845cdf0e10cSrcweir         mbIsLayouting = true;
846cdf0e10cSrcweir         mxScaledBackgroundBitmap = NULL;
847cdf0e10cSrcweir         mxClipPolygon = NULL;
848cdf0e10cSrcweir 
849cdf0e10cSrcweir         try
850cdf0e10cSrcweir         {
851cdf0e10cSrcweir             if (mbIsSlideSorterActive)
852cdf0e10cSrcweir                 LayoutSlideSorterMode();
853cdf0e10cSrcweir             else if (mbIsHelpViewActive)
854cdf0e10cSrcweir                 LayoutHelpMode();
855cdf0e10cSrcweir             else
856cdf0e10cSrcweir                 switch (meLayoutMode)
857cdf0e10cSrcweir                 {
858cdf0e10cSrcweir                     case LM_Standard:
859cdf0e10cSrcweir                     default:
860cdf0e10cSrcweir                         LayoutStandardMode();
861cdf0e10cSrcweir                         break;
862cdf0e10cSrcweir 
863cdf0e10cSrcweir                     case LM_Notes:
864cdf0e10cSrcweir                         LayoutNotesMode();
865cdf0e10cSrcweir                         break;
866cdf0e10cSrcweir                 }
867cdf0e10cSrcweir         }
868cdf0e10cSrcweir         catch (Exception&)
869cdf0e10cSrcweir         {
870cdf0e10cSrcweir             OSL_ASSERT(false);
871cdf0e10cSrcweir             throw;
872cdf0e10cSrcweir         }
873cdf0e10cSrcweir 
874cdf0e10cSrcweir         mbIsLayouting = false;
875cdf0e10cSrcweir     }
876cdf0e10cSrcweir }
877cdf0e10cSrcweir 
878cdf0e10cSrcweir 
879cdf0e10cSrcweir 
880cdf0e10cSrcweir 
LayoutStandardMode(void)881cdf0e10cSrcweir void PresenterWindowManager::LayoutStandardMode (void)
882cdf0e10cSrcweir {
883cdf0e10cSrcweir     awt::Rectangle aBox = mxParentWindow->getPosSize();
884cdf0e10cSrcweir 
885cdf0e10cSrcweir     const double nGoldenRatio ((1 + sqrt(5.0)) / 2);
886cdf0e10cSrcweir     const double nGap (20);
887cdf0e10cSrcweir     const double nHorizontalSlideDivide (aBox.Width / nGoldenRatio);
888cdf0e10cSrcweir     double nSlidePreviewTop (0);
889cdf0e10cSrcweir 
890cdf0e10cSrcweir     // For the current slide view calculate the outer height from the outer
891cdf0e10cSrcweir     // width.  This takes into acount the slide aspect ratio and thus has to
892cdf0e10cSrcweir     // go over the inner pane size.
893cdf0e10cSrcweir     PresenterPaneContainer::SharedPaneDescriptor pPane (
894cdf0e10cSrcweir         mpPaneContainer->FindPaneURL(PresenterPaneFactory::msCurrentSlidePreviewPaneURL));
895cdf0e10cSrcweir     if (pPane.get() != NULL)
896cdf0e10cSrcweir     {
897cdf0e10cSrcweir         const awt::Size aCurrentSlideOuterBox(CalculatePaneSize(
898cdf0e10cSrcweir             nHorizontalSlideDivide - 1.5*nGap,
899cdf0e10cSrcweir             PresenterPaneFactory::msCurrentSlidePreviewPaneURL));
900cdf0e10cSrcweir         nSlidePreviewTop = (aBox.Height - aCurrentSlideOuterBox.Height) / 2;
901cdf0e10cSrcweir         SetPanePosSizeAbsolute (
902cdf0e10cSrcweir             PresenterPaneFactory::msCurrentSlidePreviewPaneURL,
903cdf0e10cSrcweir             nGap,
904cdf0e10cSrcweir             nSlidePreviewTop,
905cdf0e10cSrcweir             aCurrentSlideOuterBox.Width,
906cdf0e10cSrcweir             aCurrentSlideOuterBox.Height);
907cdf0e10cSrcweir     }
908cdf0e10cSrcweir 
909cdf0e10cSrcweir 
910cdf0e10cSrcweir     // For the next slide view calculate the outer height from the outer
911cdf0e10cSrcweir     // width.  This takes into acount the slide aspect ratio and thus has to
912cdf0e10cSrcweir     // go over the inner pane size.
913cdf0e10cSrcweir     pPane = mpPaneContainer->FindPaneURL(PresenterPaneFactory::msNextSlidePreviewPaneURL);
914cdf0e10cSrcweir     if (pPane.get() != NULL)
915cdf0e10cSrcweir     {
916cdf0e10cSrcweir         const awt::Size aNextSlideOuterBox (CalculatePaneSize(
917cdf0e10cSrcweir             aBox.Width - nHorizontalSlideDivide - 1.5*nGap,
918cdf0e10cSrcweir             PresenterPaneFactory::msNextSlidePreviewPaneURL));
919cdf0e10cSrcweir         SetPanePosSizeAbsolute (
920cdf0e10cSrcweir             PresenterPaneFactory::msNextSlidePreviewPaneURL,
921cdf0e10cSrcweir             aBox.Width - aNextSlideOuterBox.Width - nGap,
922cdf0e10cSrcweir             nSlidePreviewTop,
923cdf0e10cSrcweir             aNextSlideOuterBox.Width,
924cdf0e10cSrcweir             aNextSlideOuterBox.Height);
925cdf0e10cSrcweir     }
926cdf0e10cSrcweir 
927cdf0e10cSrcweir     LayoutToolBar();
928cdf0e10cSrcweir }
929cdf0e10cSrcweir 
930cdf0e10cSrcweir 
931cdf0e10cSrcweir 
932cdf0e10cSrcweir 
LayoutNotesMode(void)933cdf0e10cSrcweir void PresenterWindowManager::LayoutNotesMode (void)
934cdf0e10cSrcweir {
935cdf0e10cSrcweir     awt::Rectangle aBox = mxParentWindow->getPosSize();
936cdf0e10cSrcweir 
937cdf0e10cSrcweir     const geometry::RealRectangle2D aToolBarBox (LayoutToolBar());
938cdf0e10cSrcweir 
939cdf0e10cSrcweir     const double nGoldenRatio ((1 + sqrt(5.0)) / 2);
940cdf0e10cSrcweir     const double nGap (20);
941cdf0e10cSrcweir     const double nPrimaryWidth (aBox.Width / nGoldenRatio);
942cdf0e10cSrcweir     const double nSecondaryWidth (aBox.Width - nPrimaryWidth);
943cdf0e10cSrcweir     const double nTertiaryWidth (nSecondaryWidth / nGoldenRatio);
944cdf0e10cSrcweir     double nSlidePreviewTop (0);
945cdf0e10cSrcweir     double nNotesViewBottom (aToolBarBox.Y1 - nGap);
946cdf0e10cSrcweir 
947cdf0e10cSrcweir     // The notes view has no fixed aspect ratio.
948cdf0e10cSrcweir     PresenterPaneContainer::SharedPaneDescriptor pPane (
949cdf0e10cSrcweir         mpPaneContainer->FindPaneURL(PresenterPaneFactory::msNotesPaneURL));
950cdf0e10cSrcweir     if (pPane.get() != NULL)
951cdf0e10cSrcweir     {
952cdf0e10cSrcweir         const geometry::RealSize2D aNotesViewOuterSize(
953cdf0e10cSrcweir             nPrimaryWidth - 1.5*nGap + 0.5,
954cdf0e10cSrcweir             nNotesViewBottom);
955cdf0e10cSrcweir         nSlidePreviewTop = (aBox.Height
956cdf0e10cSrcweir             - aToolBarBox.Y2 + aToolBarBox.Y1 - aNotesViewOuterSize.Height) / 2;
957cdf0e10cSrcweir         SetPanePosSizeAbsolute (
958cdf0e10cSrcweir             PresenterPaneFactory::msNotesPaneURL,
959cdf0e10cSrcweir             aBox.Width - aNotesViewOuterSize.Width - nGap,
960cdf0e10cSrcweir             nSlidePreviewTop,
961cdf0e10cSrcweir             aNotesViewOuterSize.Width,
962cdf0e10cSrcweir             aNotesViewOuterSize.Height);
963cdf0e10cSrcweir         nNotesViewBottom = nSlidePreviewTop + aNotesViewOuterSize.Height;
964cdf0e10cSrcweir     }
965cdf0e10cSrcweir 
966cdf0e10cSrcweir     // For the current slide view calculate the outer height from the outer
967cdf0e10cSrcweir     // width.  This takes into acount the slide aspect ratio and thus has to
968cdf0e10cSrcweir     // go over the inner pane size.
969cdf0e10cSrcweir     pPane = mpPaneContainer->FindPaneURL(PresenterPaneFactory::msCurrentSlidePreviewPaneURL);
970cdf0e10cSrcweir     if (pPane.get() != NULL)
971cdf0e10cSrcweir     {
972cdf0e10cSrcweir         const awt::Size aCurrentSlideOuterBox(CalculatePaneSize(
973cdf0e10cSrcweir             nSecondaryWidth - 1.5*nGap,
974cdf0e10cSrcweir             PresenterPaneFactory::msCurrentSlidePreviewPaneURL));
975cdf0e10cSrcweir         SetPanePosSizeAbsolute (
976cdf0e10cSrcweir             PresenterPaneFactory::msCurrentSlidePreviewPaneURL,
977cdf0e10cSrcweir             nGap,
978cdf0e10cSrcweir             nSlidePreviewTop,
979cdf0e10cSrcweir             aCurrentSlideOuterBox.Width,
980cdf0e10cSrcweir             aCurrentSlideOuterBox.Height);
981cdf0e10cSrcweir     }
982cdf0e10cSrcweir 
983cdf0e10cSrcweir 
984cdf0e10cSrcweir     // For the next slide view calculate the outer height from the outer
985cdf0e10cSrcweir     // width.  This takes into acount the slide aspect ratio and thus has to
986cdf0e10cSrcweir     // go over the inner pane size.
987cdf0e10cSrcweir     pPane = mpPaneContainer->FindPaneURL(PresenterPaneFactory::msNextSlidePreviewPaneURL);
988cdf0e10cSrcweir     if (pPane.get() != NULL)
989cdf0e10cSrcweir     {
990cdf0e10cSrcweir         const awt::Size aNextSlideOuterBox (CalculatePaneSize(
991cdf0e10cSrcweir             nTertiaryWidth,
992cdf0e10cSrcweir             PresenterPaneFactory::msNextSlidePreviewPaneURL));
993cdf0e10cSrcweir         SetPanePosSizeAbsolute (
994cdf0e10cSrcweir             PresenterPaneFactory::msNextSlidePreviewPaneURL,
995cdf0e10cSrcweir             nGap,
996cdf0e10cSrcweir             nNotesViewBottom - aNextSlideOuterBox.Height,
997cdf0e10cSrcweir             aNextSlideOuterBox.Width,
998cdf0e10cSrcweir             aNextSlideOuterBox.Height);
999cdf0e10cSrcweir     }
1000cdf0e10cSrcweir }
1001cdf0e10cSrcweir 
1002cdf0e10cSrcweir 
1003cdf0e10cSrcweir 
1004cdf0e10cSrcweir 
LayoutSlideSorterMode(void)1005cdf0e10cSrcweir void PresenterWindowManager::LayoutSlideSorterMode (void)
1006cdf0e10cSrcweir {
1007cdf0e10cSrcweir     const geometry::RealRectangle2D aToolBarBox (LayoutToolBar());
1008cdf0e10cSrcweir 
1009cdf0e10cSrcweir     awt::Rectangle aWindowBox = mxParentWindow->getPosSize();
1010cdf0e10cSrcweir     const double nGap (20);
1011cdf0e10cSrcweir     SetPanePosSizeAbsolute(
1012cdf0e10cSrcweir         mpPaneContainer->GetPaneURLForViewURL(PresenterViewFactory::msSlideSorterURL),
1013cdf0e10cSrcweir         nGap,
1014cdf0e10cSrcweir         nGap,
1015cdf0e10cSrcweir         aWindowBox.Width - 2*nGap,
1016cdf0e10cSrcweir         aToolBarBox.Y1 - 2*nGap);
1017cdf0e10cSrcweir }
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir 
1020cdf0e10cSrcweir 
1021cdf0e10cSrcweir 
LayoutHelpMode(void)1022cdf0e10cSrcweir void PresenterWindowManager::LayoutHelpMode (void)
1023cdf0e10cSrcweir {
1024cdf0e10cSrcweir     const geometry::RealRectangle2D aToolBarBox (LayoutToolBar());
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir     awt::Rectangle aWindowBox = mxParentWindow->getPosSize();
1027cdf0e10cSrcweir     const double nGap (20);
1028cdf0e10cSrcweir     const double nGoldenRatio ((1 + sqrt(5.0)) / 2);
1029cdf0e10cSrcweir     const double nWidth = ::std::min(aWindowBox.Width - 2*nGap, aWindowBox.Width/nGoldenRatio);
1030cdf0e10cSrcweir     SetPanePosSizeAbsolute(
1031cdf0e10cSrcweir         mpPaneContainer->GetPaneURLForViewURL(PresenterViewFactory::msHelpViewURL),
1032cdf0e10cSrcweir         (aWindowBox.Width - nWidth)/2,
1033cdf0e10cSrcweir         nGap,
1034cdf0e10cSrcweir         nWidth,
1035cdf0e10cSrcweir         aToolBarBox.Y1 - 2*nGap);
1036cdf0e10cSrcweir }
1037cdf0e10cSrcweir 
1038cdf0e10cSrcweir 
1039cdf0e10cSrcweir 
1040cdf0e10cSrcweir 
LayoutToolBar(void)1041cdf0e10cSrcweir geometry::RealRectangle2D PresenterWindowManager::LayoutToolBar (void)
1042cdf0e10cSrcweir {
1043cdf0e10cSrcweir     double nToolBarWidth (400);
1044cdf0e10cSrcweir     double nToolBarHeight (80);
1045cdf0e10cSrcweir 
1046cdf0e10cSrcweir     // Get access to the tool bar.
1047cdf0e10cSrcweir     PresenterPaneContainer::SharedPaneDescriptor pDescriptor(
1048cdf0e10cSrcweir         mpPaneContainer->FindPaneURL(PresenterPaneFactory::msToolBarPaneURL));
1049cdf0e10cSrcweir     if (pDescriptor.get() != NULL)
1050cdf0e10cSrcweir     {
1051cdf0e10cSrcweir         PresenterToolBarView* pToolBarView
1052cdf0e10cSrcweir             = dynamic_cast<PresenterToolBarView*>(pDescriptor->mxView.get());
1053cdf0e10cSrcweir         if (pToolBarView != NULL && pToolBarView->GetPresenterToolBar().is())
1054cdf0e10cSrcweir         {
1055cdf0e10cSrcweir             geometry::RealSize2D aSize (pToolBarView->GetPresenterToolBar()->GetMinimalSize());
1056cdf0e10cSrcweir 
1057cdf0e10cSrcweir             if (mpPaneBorderPainter.is())
1058cdf0e10cSrcweir             {
1059cdf0e10cSrcweir                 const awt::Rectangle aBox (mpPaneBorderPainter->addBorder (
1060cdf0e10cSrcweir                     PresenterPaneFactory::msToolBarPaneURL,
1061cdf0e10cSrcweir                     awt::Rectangle(
1062cdf0e10cSrcweir                         0,
1063cdf0e10cSrcweir                         0,
1064cdf0e10cSrcweir                         PresenterGeometryHelper::Round(aSize.Width),
1065cdf0e10cSrcweir                         PresenterGeometryHelper::Round(aSize.Height)),
1066cdf0e10cSrcweir                     css::drawing::framework::BorderType_TOTAL_BORDER));
1067cdf0e10cSrcweir 
1068cdf0e10cSrcweir                 nToolBarWidth = aBox.Width;
1069cdf0e10cSrcweir                 nToolBarHeight = aBox.Height;
1070cdf0e10cSrcweir             }
1071cdf0e10cSrcweir             else
1072cdf0e10cSrcweir             {
1073cdf0e10cSrcweir                 nToolBarWidth = aSize.Width + 20;
1074cdf0e10cSrcweir                 nToolBarHeight = aSize.Height + 10;
1075cdf0e10cSrcweir             }
1076cdf0e10cSrcweir         }
1077cdf0e10cSrcweir     }
1078cdf0e10cSrcweir 
1079cdf0e10cSrcweir     const awt::Rectangle aBox = mxParentWindow->getPosSize();
1080cdf0e10cSrcweir     const double nToolBarX ((aBox.Width - nToolBarWidth) / 2);
1081cdf0e10cSrcweir     const double nToolBarY (aBox.Height - nToolBarHeight);
1082cdf0e10cSrcweir     SetPanePosSizeAbsolute(
1083cdf0e10cSrcweir         PresenterPaneFactory::msToolBarPaneURL,
1084cdf0e10cSrcweir         nToolBarX,
1085cdf0e10cSrcweir         nToolBarY,
1086cdf0e10cSrcweir         nToolBarWidth,
1087cdf0e10cSrcweir         nToolBarHeight);
1088cdf0e10cSrcweir 
1089cdf0e10cSrcweir     return geometry::RealRectangle2D(
1090cdf0e10cSrcweir         nToolBarX,
1091cdf0e10cSrcweir         nToolBarY,
1092cdf0e10cSrcweir         nToolBarX + nToolBarWidth - 1,
1093cdf0e10cSrcweir         nToolBarY + nToolBarHeight - 1);
1094cdf0e10cSrcweir }
1095cdf0e10cSrcweir 
1096cdf0e10cSrcweir 
1097cdf0e10cSrcweir 
1098cdf0e10cSrcweir 
CalculatePaneSize(const double nOuterWidth,const OUString & rsPaneURL)1099cdf0e10cSrcweir awt::Size PresenterWindowManager::CalculatePaneSize (
1100cdf0e10cSrcweir     const double nOuterWidth,
1101cdf0e10cSrcweir     const OUString& rsPaneURL)
1102cdf0e10cSrcweir {
1103cdf0e10cSrcweir     // Calculate the inner width by removing the pane border.
1104cdf0e10cSrcweir     awt::Rectangle aInnerBox (mpPaneBorderPainter->RemoveBorder (
1105cdf0e10cSrcweir         rsPaneURL,
1106cdf0e10cSrcweir         awt::Rectangle(0,0,
1107cdf0e10cSrcweir             sal_Int32(nOuterWidth+0.5),sal_Int32(nOuterWidth)),
1108cdf0e10cSrcweir         drawing::framework::BorderType_TOTAL_BORDER));
1109cdf0e10cSrcweir 
1110cdf0e10cSrcweir     // Calculate the inner height with the help of the slide aspect ratio.
1111cdf0e10cSrcweir     const double nCurrentSlideInnerHeight (
1112cdf0e10cSrcweir         aInnerBox.Width / mpPresenterController->GetSlideAspectRatio());
1113cdf0e10cSrcweir 
1114cdf0e10cSrcweir     // Add the pane border to get the outer box.
1115cdf0e10cSrcweir     awt::Rectangle aOuterBox (mpPaneBorderPainter->AddBorder (
1116cdf0e10cSrcweir         rsPaneURL,
1117cdf0e10cSrcweir         awt::Rectangle(0,0,
1118cdf0e10cSrcweir             aInnerBox.Width,sal_Int32(nCurrentSlideInnerHeight+0.5)),
1119cdf0e10cSrcweir         drawing::framework::BorderType_TOTAL_BORDER));
1120cdf0e10cSrcweir 
1121cdf0e10cSrcweir     return awt::Size(aOuterBox.Width, aOuterBox.Height);
1122cdf0e10cSrcweir }
1123cdf0e10cSrcweir 
1124cdf0e10cSrcweir 
1125cdf0e10cSrcweir 
1126cdf0e10cSrcweir 
NotifyLayoutModeChange(void)1127cdf0e10cSrcweir void PresenterWindowManager::NotifyLayoutModeChange (void)
1128cdf0e10cSrcweir {
1129cdf0e10cSrcweir     document::EventObject aEvent;
1130cdf0e10cSrcweir     aEvent.Source = Reference<XInterface>(static_cast<XWeak*>(this));
1131cdf0e10cSrcweir 
1132cdf0e10cSrcweir     LayoutListenerContainer aContainerCopy (maLayoutListeners);
1133cdf0e10cSrcweir     LayoutListenerContainer::iterator iListener (aContainerCopy.begin());
1134cdf0e10cSrcweir     LayoutListenerContainer::iterator iEnd (aContainerCopy.end());
1135cdf0e10cSrcweir     for ( ; iListener!=iEnd; ++iListener)
1136cdf0e10cSrcweir     {
1137cdf0e10cSrcweir         if (iListener->is())
1138cdf0e10cSrcweir         {
1139cdf0e10cSrcweir             try
1140cdf0e10cSrcweir             {
1141cdf0e10cSrcweir                 (*iListener)->notifyEvent(aEvent);
1142cdf0e10cSrcweir             }
1143cdf0e10cSrcweir             catch (lang::DisposedException&)
1144cdf0e10cSrcweir             {
1145cdf0e10cSrcweir                 RemoveLayoutListener(*iListener);
1146cdf0e10cSrcweir             }
1147cdf0e10cSrcweir             catch (RuntimeException&)
1148cdf0e10cSrcweir             {
1149cdf0e10cSrcweir             }
1150cdf0e10cSrcweir         }
1151cdf0e10cSrcweir     }
1152cdf0e10cSrcweir }
1153cdf0e10cSrcweir 
1154cdf0e10cSrcweir 
1155cdf0e10cSrcweir 
1156cdf0e10cSrcweir 
NotifyDisposing(void)1157cdf0e10cSrcweir void PresenterWindowManager::NotifyDisposing (void)
1158cdf0e10cSrcweir {
1159cdf0e10cSrcweir     lang::EventObject aEvent;
1160cdf0e10cSrcweir     aEvent.Source = static_cast<XWeak*>(this);
1161cdf0e10cSrcweir 
1162cdf0e10cSrcweir     LayoutListenerContainer aContainer;
1163cdf0e10cSrcweir     aContainer.swap(maLayoutListeners);
1164cdf0e10cSrcweir     LayoutListenerContainer::iterator iListener (aContainer.begin());
1165cdf0e10cSrcweir     LayoutListenerContainer::iterator iEnd (aContainer.end());
1166cdf0e10cSrcweir     for ( ; iListener!=iEnd; ++iListener)
1167cdf0e10cSrcweir     {
1168cdf0e10cSrcweir         if (iListener->is())
1169cdf0e10cSrcweir         {
1170cdf0e10cSrcweir             try
1171cdf0e10cSrcweir             {
1172cdf0e10cSrcweir                 (*iListener)->disposing(aEvent);
1173cdf0e10cSrcweir             }
1174cdf0e10cSrcweir             catch (lang::DisposedException&)
1175cdf0e10cSrcweir             {
1176cdf0e10cSrcweir             }
1177cdf0e10cSrcweir             catch (RuntimeException&)
1178cdf0e10cSrcweir             {
1179cdf0e10cSrcweir             }
1180cdf0e10cSrcweir         }
1181cdf0e10cSrcweir     }
1182cdf0e10cSrcweir }
1183cdf0e10cSrcweir 
1184cdf0e10cSrcweir 
1185cdf0e10cSrcweir 
1186cdf0e10cSrcweir 
LayoutUnknownMode(void)1187cdf0e10cSrcweir void PresenterWindowManager::LayoutUnknownMode (void)
1188cdf0e10cSrcweir {
1189cdf0e10cSrcweir     awt::Rectangle aBox = mxParentWindow->getPosSize();
1190cdf0e10cSrcweir 
1191cdf0e10cSrcweir     PresenterPaneContainer::PaneList::const_iterator iPane;
1192cdf0e10cSrcweir     PresenterPaneContainer::PaneList::const_iterator iEnd (mpPaneContainer->maPanes.end());
1193cdf0e10cSrcweir     for (iPane=mpPaneContainer->maPanes.begin(); iPane!=iEnd; ++iPane)
1194cdf0e10cSrcweir     {
1195cdf0e10cSrcweir         const PresenterPaneContainer::SharedPaneDescriptor& pDescriptor (*iPane);
1196cdf0e10cSrcweir         if ( ! pDescriptor->mxBorderWindow.is())
1197cdf0e10cSrcweir             continue;
1198cdf0e10cSrcweir 
1199cdf0e10cSrcweir         // Layout the border window.
1200cdf0e10cSrcweir         const sal_Int32 nX = (sal_Int32)(pDescriptor->mnLeft * aBox.Width);
1201cdf0e10cSrcweir         const sal_Int32 nY = (sal_Int32)(pDescriptor->mnTop * aBox.Height);
1202cdf0e10cSrcweir         const sal_Int32 nWidth = (sal_Int32)(pDescriptor->mnRight * aBox.Width) - nX;
1203cdf0e10cSrcweir         const sal_Int32 nHeight = (sal_Int32)(pDescriptor->mnBottom * aBox.Height) - nY;
1204cdf0e10cSrcweir 
1205cdf0e10cSrcweir         pDescriptor->mxBorderWindow->setPosSize(
1206cdf0e10cSrcweir             nX,nY,nWidth,nHeight,
1207cdf0e10cSrcweir             awt::PosSize::POSSIZE);
1208cdf0e10cSrcweir     }
1209cdf0e10cSrcweir }
1210cdf0e10cSrcweir 
1211cdf0e10cSrcweir 
1212cdf0e10cSrcweir 
1213cdf0e10cSrcweir 
UpdateWindowSize(const Reference<awt::XWindow> & rxBorderWindow)1214cdf0e10cSrcweir void PresenterWindowManager::UpdateWindowSize (const Reference<awt::XWindow>& rxBorderWindow)
1215cdf0e10cSrcweir {
1216cdf0e10cSrcweir     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
1217cdf0e10cSrcweir         mpPaneContainer->FindBorderWindow(rxBorderWindow));
1218cdf0e10cSrcweir     if (pDescriptor.get() != NULL)
1219cdf0e10cSrcweir     {
1220cdf0e10cSrcweir         mxClipPolygon = NULL;
1221cdf0e10cSrcweir 
1222cdf0e10cSrcweir         awt::Rectangle aParentBox = mxParentWindow->getPosSize();
1223cdf0e10cSrcweir         awt::Rectangle aBorderBox (pDescriptor->mxBorderWindow->getPosSize());
1224cdf0e10cSrcweir 
1225cdf0e10cSrcweir         if ( ! mbIsLayouting)
1226cdf0e10cSrcweir         {
1227cdf0e10cSrcweir             const double nWidth (aParentBox.Width);
1228cdf0e10cSrcweir             const double nHeight (aParentBox.Height);
1229cdf0e10cSrcweir             pDescriptor->mnLeft = double(aBorderBox.X) / nWidth;
1230cdf0e10cSrcweir             pDescriptor->mnTop = double(aBorderBox.Y) / nHeight;
1231cdf0e10cSrcweir             pDescriptor->mnRight = double(aBorderBox.X + aBorderBox.Width) / nWidth;
1232cdf0e10cSrcweir             pDescriptor->mnBottom = double(aBorderBox.Y + aBorderBox.Height) / nHeight;
1233cdf0e10cSrcweir         }
1234cdf0e10cSrcweir         else
1235cdf0e10cSrcweir         {
1236cdf0e10cSrcweir             // This update of the window size was initiated by
1237cdf0e10cSrcweir             // Layout(). Therefore the window size does not have to be
1238cdf0e10cSrcweir             // updated.
1239cdf0e10cSrcweir         }
1240cdf0e10cSrcweir 
1241cdf0e10cSrcweir         // ToTop is called last because it may invalidate the iterator.
1242cdf0e10cSrcweir         if ( ! mbIsLayouting)
1243cdf0e10cSrcweir             mpPaneContainer->ToTop(pDescriptor);
1244cdf0e10cSrcweir     }
1245cdf0e10cSrcweir }
1246cdf0e10cSrcweir 
1247cdf0e10cSrcweir 
1248cdf0e10cSrcweir 
1249cdf0e10cSrcweir 
PaintBackground(const awt::Rectangle & rUpdateBox)1250cdf0e10cSrcweir void PresenterWindowManager::PaintBackground (const awt::Rectangle& rUpdateBox)
1251cdf0e10cSrcweir {
1252cdf0e10cSrcweir     (void)rUpdateBox;
1253cdf0e10cSrcweir     if ( ! mxParentWindow.is())
1254cdf0e10cSrcweir         return;
1255cdf0e10cSrcweir 
1256cdf0e10cSrcweir     Reference<rendering::XGraphicDevice> xDevice (mxParentCanvas->getDevice());
1257cdf0e10cSrcweir     if ( ! xDevice.is())
1258cdf0e10cSrcweir         return;
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir     // Create a polygon for the background and for clipping.
1261cdf0e10cSrcweir     Reference<rendering::XPolyPolygon2D> xBackgroundPolygon (
1262cdf0e10cSrcweir         PresenterGeometryHelper::CreatePolygon(mxParentWindow->getPosSize(), xDevice));
1263cdf0e10cSrcweir     if ( ! mxClipPolygon.is())
1264cdf0e10cSrcweir         mxClipPolygon = CreateClipPolyPolygon();
1265cdf0e10cSrcweir 
1266cdf0e10cSrcweir     // Create View- and RenderState structs.
1267cdf0e10cSrcweir     const rendering::ViewState aViewState(
1268cdf0e10cSrcweir         geometry::AffineMatrix2D(1,0,0, 0,1,0),
1269cdf0e10cSrcweir         PresenterGeometryHelper::CreatePolygon(rUpdateBox, xDevice));
1270cdf0e10cSrcweir     rendering::RenderState aRenderState (
1271cdf0e10cSrcweir         geometry::AffineMatrix2D(1,0,0, 0,1,0),
1272cdf0e10cSrcweir         mxClipPolygon,
1273cdf0e10cSrcweir         Sequence<double>(4),
1274cdf0e10cSrcweir         rendering::CompositeOperation::SOURCE);
1275cdf0e10cSrcweir 
1276cdf0e10cSrcweir     // Paint the background.
1277cdf0e10cSrcweir     if (mpBackgroundBitmap.get() != NULL)
1278cdf0e10cSrcweir     {
1279cdf0e10cSrcweir         ProvideBackgroundBitmap();
1280cdf0e10cSrcweir 
1281cdf0e10cSrcweir         if (mxScaledBackgroundBitmap.is())
1282cdf0e10cSrcweir         {
1283cdf0e10cSrcweir             Sequence<rendering::Texture> aTextures (1);
1284cdf0e10cSrcweir             const geometry::IntegerSize2D aBitmapSize(mxScaledBackgroundBitmap->getSize());
1285cdf0e10cSrcweir             aTextures[0] = rendering::Texture (
1286cdf0e10cSrcweir                 geometry::AffineMatrix2D(
1287cdf0e10cSrcweir                     aBitmapSize.Width,0,0,
1288cdf0e10cSrcweir                     0,aBitmapSize.Height,0),
1289cdf0e10cSrcweir                 1,
1290cdf0e10cSrcweir                 0,
1291cdf0e10cSrcweir                 mxScaledBackgroundBitmap,
1292cdf0e10cSrcweir                 NULL,
1293cdf0e10cSrcweir                 NULL,
1294cdf0e10cSrcweir                 rendering::StrokeAttributes(),
1295cdf0e10cSrcweir                 rendering::TexturingMode::REPEAT,
1296cdf0e10cSrcweir                 rendering::TexturingMode::REPEAT);
1297cdf0e10cSrcweir 
1298cdf0e10cSrcweir             mxParentCanvas->fillTexturedPolyPolygon(
1299cdf0e10cSrcweir                 xBackgroundPolygon,
1300cdf0e10cSrcweir                 aViewState,
1301cdf0e10cSrcweir                 aRenderState,
1302cdf0e10cSrcweir                 aTextures);
1303cdf0e10cSrcweir         }
1304cdf0e10cSrcweir         else
1305cdf0e10cSrcweir         {
1306cdf0e10cSrcweir             const util::Color aBackgroundColor (mpBackgroundBitmap->maReplacementColor);
1307cdf0e10cSrcweir             aRenderState.DeviceColor[0] = ((aBackgroundColor >> 16) & 0x0ff) / 255.0;
1308cdf0e10cSrcweir             aRenderState.DeviceColor[1] = ((aBackgroundColor >> 8) & 0x0ff) / 255.0;
1309cdf0e10cSrcweir             aRenderState.DeviceColor[2] = ((aBackgroundColor >> 0) & 0x0ff) / 255.0;
1310cdf0e10cSrcweir             aRenderState.DeviceColor[3] = ((aBackgroundColor >> 24) & 0x0ff) / 255.0;
1311cdf0e10cSrcweir             mxParentCanvas->fillPolyPolygon(
1312cdf0e10cSrcweir                 xBackgroundPolygon,
1313cdf0e10cSrcweir                 aViewState,
1314cdf0e10cSrcweir                 aRenderState);
1315cdf0e10cSrcweir         }
1316cdf0e10cSrcweir     }
1317cdf0e10cSrcweir }
1318cdf0e10cSrcweir 
1319cdf0e10cSrcweir 
1320cdf0e10cSrcweir 
1321cdf0e10cSrcweir 
ProvideBackgroundBitmap(void)1322cdf0e10cSrcweir void PresenterWindowManager::ProvideBackgroundBitmap (void)
1323cdf0e10cSrcweir {
1324cdf0e10cSrcweir     if ( ! mxScaledBackgroundBitmap.is())
1325cdf0e10cSrcweir     {
1326cdf0e10cSrcweir         Reference<rendering::XBitmap> xBitmap (mpBackgroundBitmap->GetNormalBitmap());
1327cdf0e10cSrcweir         if (xBitmap.is())
1328cdf0e10cSrcweir         {
1329cdf0e10cSrcweir             const bool bStretchVertical (mpBackgroundBitmap->meVerticalTexturingMode
1330cdf0e10cSrcweir                 == PresenterBitmapDescriptor::Stretch);
1331cdf0e10cSrcweir             const bool bStretchHorizontal (mpBackgroundBitmap->meHorizontalTexturingMode
1332cdf0e10cSrcweir                 == PresenterBitmapDescriptor::Stretch);
1333cdf0e10cSrcweir             if (bStretchHorizontal || bStretchVertical)
1334cdf0e10cSrcweir             {
1335cdf0e10cSrcweir                 geometry::RealSize2D aSize;
1336cdf0e10cSrcweir                 if (bStretchVertical)
1337cdf0e10cSrcweir                     aSize.Height = mxParentWindow->getPosSize().Height;
1338cdf0e10cSrcweir                 else
1339cdf0e10cSrcweir                     aSize.Height = xBitmap->getSize().Height;
1340cdf0e10cSrcweir                 if (bStretchHorizontal)
1341cdf0e10cSrcweir                     aSize.Width = mxParentWindow->getPosSize().Width;
1342cdf0e10cSrcweir                 else
1343cdf0e10cSrcweir                     aSize.Width = xBitmap->getSize().Width;
1344cdf0e10cSrcweir                 mxScaledBackgroundBitmap = xBitmap->getScaledBitmap(aSize, sal_False);
1345cdf0e10cSrcweir             }
1346cdf0e10cSrcweir             else
1347cdf0e10cSrcweir             {
1348cdf0e10cSrcweir                 mxScaledBackgroundBitmap
1349cdf0e10cSrcweir                     = Reference<rendering::XBitmap>(xBitmap, UNO_QUERY);
1350cdf0e10cSrcweir             }
1351cdf0e10cSrcweir         }
1352cdf0e10cSrcweir     }
1353cdf0e10cSrcweir }
1354cdf0e10cSrcweir 
1355cdf0e10cSrcweir 
1356cdf0e10cSrcweir 
1357cdf0e10cSrcweir 
CreateClipPolyPolygon(void) const1358cdf0e10cSrcweir Reference<rendering::XPolyPolygon2D> PresenterWindowManager::CreateClipPolyPolygon (void) const
1359cdf0e10cSrcweir {
1360cdf0e10cSrcweir     // Create a clip polygon that includes the whole update area but has the
1361cdf0e10cSrcweir     // content windows as holes.
1362cdf0e10cSrcweir     const sal_Int32 nPaneCount (mpPaneContainer->maPanes.size());
1363cdf0e10cSrcweir     ::std::vector<awt::Rectangle> aRectangles;
1364cdf0e10cSrcweir     aRectangles.reserve(1+nPaneCount);
1365cdf0e10cSrcweir     aRectangles.push_back(mxParentWindow->getPosSize());
1366cdf0e10cSrcweir     PresenterPaneContainer::PaneList::const_iterator iPane;
1367cdf0e10cSrcweir     PresenterPaneContainer::PaneList::const_iterator iEnd (mpPaneContainer->maPanes.end());
1368cdf0e10cSrcweir     for (iPane=mpPaneContainer->maPanes.begin(); iPane!=iEnd; ++iPane)
1369cdf0e10cSrcweir     {
1370cdf0e10cSrcweir         PresenterPaneContainer::SharedPaneDescriptor pDescriptor (*iPane);
1371cdf0e10cSrcweir         if ( ! pDescriptor->mbIsActive)
1372cdf0e10cSrcweir             continue;
1373cdf0e10cSrcweir         if ( ! pDescriptor->mbIsOpaque)
1374cdf0e10cSrcweir             continue;
1375cdf0e10cSrcweir         if ( ! pDescriptor->mxBorderWindow.is() || ! pDescriptor->mxContentWindow.is())
1376cdf0e10cSrcweir             continue;
1377cdf0e10cSrcweir         Reference<awt::XWindow2> xWindow (pDescriptor->mxBorderWindow, UNO_QUERY);
1378cdf0e10cSrcweir         if (xWindow.is() && ! xWindow->isVisible())
1379cdf0e10cSrcweir             continue;
1380cdf0e10cSrcweir 
1381cdf0e10cSrcweir         const awt::Rectangle aOuterBorderBox (pDescriptor->mxBorderWindow->getPosSize());
1382cdf0e10cSrcweir         awt::Rectangle aInnerBorderBox (pDescriptor->mxContentWindow->getPosSize());
1383cdf0e10cSrcweir         aInnerBorderBox.X += aOuterBorderBox.X;
1384cdf0e10cSrcweir         aInnerBorderBox.Y += aOuterBorderBox.Y;
1385cdf0e10cSrcweir         aRectangles.push_back(aInnerBorderBox);
1386cdf0e10cSrcweir     }
1387cdf0e10cSrcweir     Reference<rendering::XPolyPolygon2D> xPolyPolygon (
1388cdf0e10cSrcweir         PresenterGeometryHelper::CreatePolygon(
1389cdf0e10cSrcweir             aRectangles,
1390cdf0e10cSrcweir             mxParentCanvas->getDevice()));
1391cdf0e10cSrcweir     if (xPolyPolygon.is())
1392cdf0e10cSrcweir         xPolyPolygon->setFillRule(rendering::FillRule_EVEN_ODD);
1393cdf0e10cSrcweir     return xPolyPolygon;
1394cdf0e10cSrcweir }
1395cdf0e10cSrcweir 
1396cdf0e10cSrcweir 
1397cdf0e10cSrcweir 
1398cdf0e10cSrcweir 
UpdateWindowList(void)1399cdf0e10cSrcweir void PresenterWindowManager::UpdateWindowList (void)
1400cdf0e10cSrcweir {
1401cdf0e10cSrcweir #ifdef ENABLE_PANE_RESIZING
1402cdf0e10cSrcweir     try
1403cdf0e10cSrcweir     {
1404cdf0e10cSrcweir         OSL_ASSERT(mxComponentContext.is());
1405cdf0e10cSrcweir 
1406cdf0e10cSrcweir         Reference<lang::XComponent> xComponent (mxPaneBorderManager, UNO_QUERY);
1407cdf0e10cSrcweir         if (xComponent.is())
1408cdf0e10cSrcweir             xComponent->dispose();
1409cdf0e10cSrcweir 
1410cdf0e10cSrcweir         Reference<lang::XMultiComponentFactory> xFactory (mxComponentContext->getServiceManager());
1411cdf0e10cSrcweir         if (xFactory.is())
1412cdf0e10cSrcweir         {
1413cdf0e10cSrcweir             Sequence<Any> aArguments (1 + mpPaneContainer->maPanes.size()*2);
1414cdf0e10cSrcweir             sal_Int32 nIndex (0);
1415cdf0e10cSrcweir             aArguments[nIndex++] = Any(mxParentWindow);
1416cdf0e10cSrcweir             for (sal_uInt32 nPaneIndex=0; nPaneIndex<mpPaneContainer->maPanes.size(); ++nPaneIndex)
1417cdf0e10cSrcweir             {
1418cdf0e10cSrcweir                 if ( ! mpPaneContainer->maPanes[nPaneIndex]->mbIsActive)
1419cdf0e10cSrcweir                     continue;
1420cdf0e10cSrcweir 
1421cdf0e10cSrcweir                 const Reference<awt::XWindow> xBorderWindow (
1422cdf0e10cSrcweir                     mpPaneContainer->maPanes[nPaneIndex]->mxBorderWindow);
1423cdf0e10cSrcweir                 const Reference<awt::XWindow> xContentWindow (
1424cdf0e10cSrcweir                     mpPaneContainer->maPanes[nPaneIndex]->mxContentWindow);
1425cdf0e10cSrcweir                 const Reference<awt::XWindow2> xBorderWindow2(xBorderWindow, UNO_QUERY);
1426cdf0e10cSrcweir                 if (xBorderWindow.is()
1427cdf0e10cSrcweir                     && xContentWindow.is()
1428cdf0e10cSrcweir                     && ( ! xBorderWindow2.is() || xBorderWindow2->isVisible()))
1429cdf0e10cSrcweir                 {
1430cdf0e10cSrcweir                     aArguments[nIndex++] = Any(xBorderWindow);
1431cdf0e10cSrcweir                     aArguments[nIndex++] = Any(xContentWindow);
1432cdf0e10cSrcweir                 }
1433cdf0e10cSrcweir             }
1434cdf0e10cSrcweir 
1435cdf0e10cSrcweir             aArguments.realloc(nIndex);
1436cdf0e10cSrcweir             rtl::Reference<PresenterPaneBorderManager> pManager (
1437cdf0e10cSrcweir                 new PresenterPaneBorderManager (
1438cdf0e10cSrcweir                     mxComponentContext,
1439cdf0e10cSrcweir                     mpPresenterController));
1440cdf0e10cSrcweir             pManager->initialize(aArguments);
1441cdf0e10cSrcweir             mxPaneBorderManager = Reference<XInterface>(static_cast<XWeak*>(pManager.get()));
1442cdf0e10cSrcweir         }
1443cdf0e10cSrcweir     }
1444cdf0e10cSrcweir     catch (RuntimeException&)
1445cdf0e10cSrcweir     {
1446cdf0e10cSrcweir     }
1447cdf0e10cSrcweir #endif
1448cdf0e10cSrcweir }
1449cdf0e10cSrcweir 
1450cdf0e10cSrcweir 
1451cdf0e10cSrcweir 
1452cdf0e10cSrcweir 
Invalidate(void)1453cdf0e10cSrcweir void PresenterWindowManager::Invalidate (void)
1454cdf0e10cSrcweir {
1455cdf0e10cSrcweir     mpPresenterController->GetPaintManager()->Invalidate(mxParentWindow);
1456cdf0e10cSrcweir }
1457cdf0e10cSrcweir 
1458cdf0e10cSrcweir 
1459cdf0e10cSrcweir 
1460cdf0e10cSrcweir 
GetParentWindow(void) const1461cdf0e10cSrcweir Reference<awt::XWindow> PresenterWindowManager::GetParentWindow (void) const
1462cdf0e10cSrcweir {
1463cdf0e10cSrcweir     return mxParentWindow;
1464cdf0e10cSrcweir }
1465cdf0e10cSrcweir 
1466cdf0e10cSrcweir 
1467cdf0e10cSrcweir 
1468cdf0e10cSrcweir 
GetParentCanvas(void) const1469cdf0e10cSrcweir Reference<rendering::XCanvas> PresenterWindowManager::GetParentCanvas (void) const
1470cdf0e10cSrcweir {
1471cdf0e10cSrcweir     return mxParentCanvas;
1472cdf0e10cSrcweir }
1473cdf0e10cSrcweir 
1474cdf0e10cSrcweir 
1475cdf0e10cSrcweir 
1476cdf0e10cSrcweir 
Update(void)1477cdf0e10cSrcweir void PresenterWindowManager::Update (void)
1478cdf0e10cSrcweir {
1479cdf0e10cSrcweir     mxClipPolygon = NULL;
1480cdf0e10cSrcweir     mbIsLayoutPending = true;
1481cdf0e10cSrcweir 
1482cdf0e10cSrcweir     UpdateWindowList();
1483cdf0e10cSrcweir     Invalidate();
1484cdf0e10cSrcweir }
1485cdf0e10cSrcweir 
1486cdf0e10cSrcweir 
1487cdf0e10cSrcweir 
1488cdf0e10cSrcweir 
ThrowIfDisposed(void) const1489cdf0e10cSrcweir void PresenterWindowManager::ThrowIfDisposed (void) const
1490cdf0e10cSrcweir     throw (::com::sun::star::lang::DisposedException)
1491cdf0e10cSrcweir {
1492cdf0e10cSrcweir 	if (rBHelper.bDisposed || rBHelper.bInDispose)
1493cdf0e10cSrcweir 	{
1494cdf0e10cSrcweir         throw lang::DisposedException (
1495cdf0e10cSrcweir             OUString(RTL_CONSTASCII_USTRINGPARAM(
1496cdf0e10cSrcweir                 "PresenterWindowManager has already been disposed")),
1497cdf0e10cSrcweir             const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
1498cdf0e10cSrcweir     }
1499cdf0e10cSrcweir }
1500cdf0e10cSrcweir 
1501cdf0e10cSrcweir 
1502cdf0e10cSrcweir 
1503cdf0e10cSrcweir namespace {
1504cdf0e10cSrcweir 
1505cdf0e10cSrcweir //===== ModeChangeAnimation ===================================================
1506cdf0e10cSrcweir 
1507cdf0e10cSrcweir class ModeChangeAnimation : public PresenterAnimation
1508cdf0e10cSrcweir {
1509cdf0e10cSrcweir public:
ModeChangeAnimation(const::boost::shared_ptr<PresenterSprite> & rpSprite,const Reference<rendering::XSpriteCanvas> & rxCanvas)1510cdf0e10cSrcweir     ModeChangeAnimation (
1511cdf0e10cSrcweir         const ::boost::shared_ptr<PresenterSprite>& rpSprite,
1512cdf0e10cSrcweir         const Reference<rendering::XSpriteCanvas>& rxCanvas)
1513cdf0e10cSrcweir         : PresenterAnimation (0, 1000, 20),
1514cdf0e10cSrcweir           mpSprite(rpSprite),
1515cdf0e10cSrcweir           mxCanvas(rxCanvas)
1516cdf0e10cSrcweir     {
1517cdf0e10cSrcweir     }
1518cdf0e10cSrcweir 
Run(const double nProgress,const sal_uInt64 nCurrentTime)1519cdf0e10cSrcweir     virtual void Run (const double nProgress, const sal_uInt64 nCurrentTime)
1520cdf0e10cSrcweir     {
1521cdf0e10cSrcweir         (void)nCurrentTime;
1522cdf0e10cSrcweir         mpSprite->SetAlpha(1.0 - nProgress);
1523cdf0e10cSrcweir         mxCanvas->updateScreen(sal_False);
1524cdf0e10cSrcweir     }
1525cdf0e10cSrcweir 
1526cdf0e10cSrcweir private:
1527cdf0e10cSrcweir     ::boost::shared_ptr<PresenterSprite> mpSprite;
1528cdf0e10cSrcweir     Reference<rendering::XSpriteCanvas> mxCanvas;
1529cdf0e10cSrcweir };
1530cdf0e10cSrcweir 
1531cdf0e10cSrcweir 
1532cdf0e10cSrcweir 
1533cdf0e10cSrcweir 
ModeChangeAnimationStarter(const Reference<drawing::framework::XConfigurationController> & rxConfigurationController,const Reference<awt::XWindow> & rxWindow,const Reference<rendering::XSpriteCanvas> & rxCanvas,const::boost::shared_ptr<PresenterAnimator> & rpAnimator)1534cdf0e10cSrcweir ModeChangeAnimationStarter::ModeChangeAnimationStarter (
1535cdf0e10cSrcweir     const Reference<drawing::framework::XConfigurationController>& rxConfigurationController,
1536cdf0e10cSrcweir     const Reference<awt::XWindow>& rxWindow,
1537cdf0e10cSrcweir     const Reference<rendering::XSpriteCanvas>& rxCanvas,
1538cdf0e10cSrcweir     const ::boost::shared_ptr<PresenterAnimator>& rpAnimator)
1539cdf0e10cSrcweir     : ModeChangeAnimationStarterInterfaceBase(m_aMutex),
1540cdf0e10cSrcweir       mxConfigurationController(rxConfigurationController),
1541cdf0e10cSrcweir       mpAnimator(rpAnimator),
1542cdf0e10cSrcweir       mpSprite(new PresenterSprite()),
1543cdf0e10cSrcweir       mxCanvas(rxCanvas)
1544cdf0e10cSrcweir {
1545cdf0e10cSrcweir     OSL_ASSERT(rxWindow.is());
1546cdf0e10cSrcweir     OSL_ASSERT(rxCanvas.is());
1547cdf0e10cSrcweir 
1548cdf0e10cSrcweir     // Get the bitmap of the background.
1549cdf0e10cSrcweir     Reference<rendering::XBitmap> xBackgroundBitmap (rxCanvas, UNO_QUERY);
1550cdf0e10cSrcweir     if ( ! xBackgroundBitmap.is())
1551cdf0e10cSrcweir         return;
1552cdf0e10cSrcweir 
1553cdf0e10cSrcweir     // Create the sprite.
1554cdf0e10cSrcweir     const awt::Rectangle aWindowSize (rxWindow->getPosSize());
1555cdf0e10cSrcweir     mpSprite->SetFactory(rxCanvas);
1556cdf0e10cSrcweir     mpSprite->Resize(geometry::RealSize2D(aWindowSize.Width, aWindowSize.Height));
1557cdf0e10cSrcweir     mpSprite->SetPriority(10);
1558cdf0e10cSrcweir 
1559cdf0e10cSrcweir     // Fill it with the background inside the bounding box.
1560cdf0e10cSrcweir     const rendering::ViewState aViewState (
1561cdf0e10cSrcweir         geometry::AffineMatrix2D(1,0,0, 0,1,0),
1562cdf0e10cSrcweir         NULL);
1563cdf0e10cSrcweir     const rendering::RenderState aRenderState (
1564cdf0e10cSrcweir         geometry::AffineMatrix2D(1,0,0, 0,1,0),
1565cdf0e10cSrcweir         NULL,
1566cdf0e10cSrcweir         Sequence<double>(4),
1567cdf0e10cSrcweir         rendering::CompositeOperation::SOURCE);
1568cdf0e10cSrcweir     Reference<rendering::XCanvas> xSpriteCanvas (mpSprite->GetCanvas());
1569cdf0e10cSrcweir     if (xSpriteCanvas.is())
1570cdf0e10cSrcweir     {
1571cdf0e10cSrcweir         xSpriteCanvas->drawBitmap(xBackgroundBitmap, aViewState, aRenderState);
1572cdf0e10cSrcweir         mpSprite->Show();
1573cdf0e10cSrcweir     }
1574cdf0e10cSrcweir 
1575cdf0e10cSrcweir     // Register as listener to be notified when the new panes are visible
1576cdf0e10cSrcweir     // and the sprite can be faded out.
1577cdf0e10cSrcweir     mxConfigurationController->addConfigurationChangeListener(
1578cdf0e10cSrcweir             this,
1579cdf0e10cSrcweir             A2S("ConfigurationUpdateEnd"),
1580cdf0e10cSrcweir             Any());
1581cdf0e10cSrcweir }
1582cdf0e10cSrcweir 
1583cdf0e10cSrcweir 
1584cdf0e10cSrcweir 
1585cdf0e10cSrcweir 
~ModeChangeAnimationStarter(void)1586cdf0e10cSrcweir ModeChangeAnimationStarter::~ModeChangeAnimationStarter (void)
1587cdf0e10cSrcweir {
1588cdf0e10cSrcweir }
1589cdf0e10cSrcweir 
1590cdf0e10cSrcweir 
1591cdf0e10cSrcweir 
1592cdf0e10cSrcweir 
disposing(void)1593cdf0e10cSrcweir void SAL_CALL ModeChangeAnimationStarter::disposing (void)
1594cdf0e10cSrcweir {
1595cdf0e10cSrcweir     mxConfigurationController = NULL;
1596cdf0e10cSrcweir     mpAnimator.reset();
1597cdf0e10cSrcweir     mpSprite.reset();
1598cdf0e10cSrcweir }
1599cdf0e10cSrcweir 
1600cdf0e10cSrcweir 
1601cdf0e10cSrcweir 
1602cdf0e10cSrcweir 
1603cdf0e10cSrcweir // XConfigurationChangeListener
1604cdf0e10cSrcweir 
notifyConfigurationChange(const com::sun::star::drawing::framework::ConfigurationChangeEvent & rEvent)1605cdf0e10cSrcweir void SAL_CALL ModeChangeAnimationStarter::notifyConfigurationChange (
1606cdf0e10cSrcweir     const com::sun::star::drawing::framework::ConfigurationChangeEvent& rEvent)
1607cdf0e10cSrcweir     throw (com::sun::star::uno::RuntimeException)
1608cdf0e10cSrcweir {
1609cdf0e10cSrcweir     (void)rEvent;
1610cdf0e10cSrcweir 
1611cdf0e10cSrcweir     // Start the actual animation.
1612cdf0e10cSrcweir     mpAnimator->AddAnimation(SharedPresenterAnimation(new ModeChangeAnimation(
1613cdf0e10cSrcweir         mpSprite,
1614cdf0e10cSrcweir         mxCanvas)));
1615cdf0e10cSrcweir 
1616cdf0e10cSrcweir     mxConfigurationController->removeConfigurationChangeListener(this);
1617cdf0e10cSrcweir }
1618cdf0e10cSrcweir 
1619cdf0e10cSrcweir 
1620cdf0e10cSrcweir 
1621cdf0e10cSrcweir 
1622cdf0e10cSrcweir // XEventListener
1623cdf0e10cSrcweir 
disposing(const com::sun::star::lang::EventObject & rEvent)1624cdf0e10cSrcweir void SAL_CALL ModeChangeAnimationStarter::disposing (
1625cdf0e10cSrcweir     const com::sun::star::lang::EventObject& rEvent)
1626cdf0e10cSrcweir     throw (com::sun::star::uno::RuntimeException)
1627cdf0e10cSrcweir {
1628cdf0e10cSrcweir     if (rEvent.Source == mxConfigurationController)
1629cdf0e10cSrcweir         mxConfigurationController = NULL;
1630cdf0e10cSrcweir }
1631cdf0e10cSrcweir 
1632cdf0e10cSrcweir 
1633cdf0e10cSrcweir 
1634cdf0e10cSrcweir } // end of anonymous namespace
1635cdf0e10cSrcweir 
1636cdf0e10cSrcweir 
1637cdf0e10cSrcweir } } // end of namespace ::sdext::presenter
1638