1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include "PresenterPaneContainer.hxx"
21 #include "PresenterPaneBase.hxx"
22 #include <com/sun/star/awt/XGraphics.hpp>
23 #include <com/sun/star/beans/XPropertySet.hpp>
24 #include <com/sun/star/container/XChild.hpp>
25 #include <com/sun/star/drawing/framework/ResourceId.hpp>
27 using namespace ::com::sun::star
;
28 using namespace ::com::sun::star::uno
;
29 using namespace ::com::sun::star::drawing::framework
;
31 namespace sdext
{ namespace presenter
{
33 PresenterPaneContainer::PresenterPaneContainer (
34 const Reference
<XComponentContext
>& rxContext
)
35 : PresenterPaneContainerInterfaceBase(m_aMutex
),
39 Reference
<lang::XMultiComponentFactory
> xFactory (rxContext
->getServiceManager());
42 mxPresenterHelper
= Reference
<drawing::XPresenterHelper
>(
43 xFactory
->createInstanceWithContext(
44 OUString("com.sun.star.comp.Draw.PresenterHelper"),
50 PresenterPaneContainer::~PresenterPaneContainer()
54 void PresenterPaneContainer::PreparePane (
55 const Reference
<XResourceId
>& rxPaneId
,
56 const OUString
& rsViewURL
,
57 const OUString
& rsTitle
,
58 const OUString
& rsAccessibleTitle
,
60 const ViewInitializationFunction
& rViewInitialization
,
69 SharedPaneDescriptor
pPane (FindPaneURL(rxPaneId
->getResourceURL()));
70 if (pPane
.get() == NULL
)
72 // No entry found for the given pane id. Create a new one.
73 SharedPaneDescriptor
pDescriptor (new PaneDescriptor());
74 pDescriptor
->mxPaneId
= rxPaneId
;
75 pDescriptor
->msViewURL
= rsViewURL
;
76 pDescriptor
->mxPane
= NULL
;
77 if (rsTitle
.indexOf('%') < 0)
79 pDescriptor
->msTitle
= rsTitle
;
80 (pDescriptor
->msTitleTemplate
).clear();
84 pDescriptor
->msTitleTemplate
= rsTitle
;
85 (pDescriptor
->msTitle
).clear();
87 pDescriptor
->msAccessibleTitleTemplate
= rsAccessibleTitle
;
88 pDescriptor
->maViewInitialization
= rViewInitialization
;
89 pDescriptor
->mnLeft
= nLeft
;
90 pDescriptor
->mnTop
= nTop
;
91 pDescriptor
->mnRight
= nRight
;
92 pDescriptor
->mnBottom
= nBottom
;
93 pDescriptor
->mbIsActive
= true;
94 pDescriptor
->mbIsOpaque
= bIsOpaque
;
95 pDescriptor
->maSpriteProvider
= PaneDescriptor::SpriteProvider();
96 pDescriptor
->mbIsSprite
= false;
97 pDescriptor
->maCalloutAnchorLocation
= awt::Point(-1,-1);
98 pDescriptor
->mbHasCalloutAnchor
= false;
100 maPanes
.push_back(pDescriptor
);
104 void SAL_CALL
PresenterPaneContainer::disposing()
106 PaneList::iterator
iPane (maPanes
.begin());
107 PaneList::const_iterator
iEnd (maPanes
.end());
108 for ( ; iPane
!=iEnd
; ++iPane
)
109 if ((*iPane
)->mxPaneId
.is())
110 RemovePane((*iPane
)->mxPaneId
);
113 PresenterPaneContainer::SharedPaneDescriptor
114 PresenterPaneContainer::StorePane (const rtl::Reference
<PresenterPaneBase
>& rxPane
)
116 SharedPaneDescriptor pDescriptor
;
121 Reference
<XResourceId
> xPaneId (rxPane
->getResourceId());
123 sPaneURL
= xPaneId
->getResourceURL();
125 pDescriptor
= FindPaneURL(sPaneURL
);
126 if (pDescriptor
.get() == NULL
)
127 PreparePane(xPaneId
, OUString(), OUString(), OUString(),
128 false, ViewInitializationFunction(), 0,0,0,0);
129 pDescriptor
= FindPaneURL(sPaneURL
);
130 if (pDescriptor
.get() != NULL
)
132 Reference
<awt::XWindow
> xWindow (rxPane
->getWindow());
133 pDescriptor
->mxContentWindow
= xWindow
;
134 pDescriptor
->mxPaneId
= xPaneId
;
135 pDescriptor
->mxPane
= rxPane
;
136 pDescriptor
->mxPane
->SetTitle(pDescriptor
->msTitle
);
138 // When there is a call out anchor location set then tell the
140 if (pDescriptor
->mbHasCalloutAnchor
)
141 pDescriptor
->mxPane
->SetCalloutAnchor(pDescriptor
->maCalloutAnchorLocation
);
144 xWindow
->addEventListener(this);
151 PresenterPaneContainer::SharedPaneDescriptor
152 PresenterPaneContainer::StoreBorderWindow(
153 const Reference
<XResourceId
>& rxPaneId
,
154 const Reference
<awt::XWindow
>& rxBorderWindow
)
156 // The content window may not be present. Use the resource URL of the
160 sPaneURL
= rxPaneId
->getResourceURL();
162 SharedPaneDescriptor
pDescriptor (FindPaneURL(sPaneURL
));
163 if (pDescriptor
.get() != NULL
)
165 pDescriptor
->mxBorderWindow
= rxBorderWindow
;
169 return SharedPaneDescriptor();
172 PresenterPaneContainer::SharedPaneDescriptor
173 PresenterPaneContainer::StoreView (
174 const Reference
<XView
>& rxView
,
175 const SharedBitmapDescriptor
& rpViewBackground
)
177 SharedPaneDescriptor pDescriptor
;
182 Reference
<XResourceId
> xViewId (rxView
->getResourceId());
185 Reference
<XResourceId
> xPaneId (xViewId
->getAnchor());
187 sPaneURL
= xPaneId
->getResourceURL();
190 pDescriptor
= FindPaneURL(sPaneURL
);
191 if (pDescriptor
.get() != NULL
)
193 pDescriptor
->mxView
= rxView
;
194 pDescriptor
->mpViewBackground
= rpViewBackground
;
195 if (pDescriptor
->mxPane
.is())
196 pDescriptor
->mxPane
->SetBackground(rpViewBackground
);
199 if ( ! pDescriptor
->maViewInitialization
.empty())
200 pDescriptor
->maViewInitialization(rxView
);
202 // Activate or deactivate the pane/view.
203 if ( ! pDescriptor
->maActivator
.empty())
204 pDescriptor
->maActivator(pDescriptor
->mbIsActive
);
206 catch (RuntimeException
&)
216 PresenterPaneContainer::SharedPaneDescriptor
217 PresenterPaneContainer::RemovePane (const Reference
<XResourceId
>& rxPaneId
)
219 SharedPaneDescriptor
pDescriptor (FindPaneId(rxPaneId
));
220 if (pDescriptor
.get() != NULL
)
222 if (pDescriptor
->mxContentWindow
.is())
223 pDescriptor
->mxContentWindow
->removeEventListener(this);
224 pDescriptor
->mxContentWindow
= NULL
;
225 pDescriptor
->mxBorderWindow
= NULL
;
226 pDescriptor
->mxPane
= NULL
;
227 pDescriptor
->mxView
= NULL
;
228 pDescriptor
->mbIsActive
= false;
233 PresenterPaneContainer::SharedPaneDescriptor
234 PresenterPaneContainer::RemoveView (const Reference
<XView
>& rxView
)
236 SharedPaneDescriptor pDescriptor
;
241 Reference
<XResourceId
> xViewId (rxView
->getResourceId());
244 Reference
<XResourceId
> xPaneId (xViewId
->getAnchor());
246 sPaneURL
= xPaneId
->getResourceURL();
249 pDescriptor
= FindPaneURL(sPaneURL
);
250 if (pDescriptor
.get() != NULL
)
252 pDescriptor
->mxView
= NULL
;
253 pDescriptor
->mpViewBackground
= SharedBitmapDescriptor();
260 PresenterPaneContainer::SharedPaneDescriptor
PresenterPaneContainer::FindBorderWindow (
261 const Reference
<awt::XWindow
>& rxBorderWindow
)
263 PaneList::const_iterator iPane
;
264 PaneList::iterator
iEnd (maPanes
.end());
265 for (iPane
=maPanes
.begin(); iPane
!=iEnd
; ++iPane
)
267 if ((*iPane
)->mxBorderWindow
== rxBorderWindow
)
270 return SharedPaneDescriptor();
273 PresenterPaneContainer::SharedPaneDescriptor
PresenterPaneContainer::FindContentWindow (
274 const Reference
<awt::XWindow
>& rxContentWindow
)
276 PaneList::const_iterator iPane
;
277 PaneList::iterator
iEnd (maPanes
.end());
278 for (iPane
=maPanes
.begin(); iPane
!=iEnd
; ++iPane
)
280 if ((*iPane
)->mxContentWindow
== rxContentWindow
)
283 return SharedPaneDescriptor();
286 PresenterPaneContainer::SharedPaneDescriptor
PresenterPaneContainer::FindPaneURL (
287 const OUString
& rsPaneURL
)
289 PaneList::const_iterator iPane
;
290 PaneList::const_iterator
iEnd (maPanes
.end());
291 for (iPane
=maPanes
.begin(); iPane
!=iEnd
; ++iPane
)
293 if ((*iPane
)->mxPaneId
->getResourceURL() == rsPaneURL
)
296 return SharedPaneDescriptor();
299 PresenterPaneContainer::SharedPaneDescriptor
PresenterPaneContainer::FindPaneId (
300 const Reference
<XResourceId
>& rxPaneId
)
302 PaneList::iterator
iEnd (maPanes
.end());
304 if ( ! rxPaneId
.is())
305 return SharedPaneDescriptor();
307 PaneList::iterator iPane
;
308 for (iPane
=maPanes
.begin(); iPane
!=iEnd
; ++iPane
)
310 if (rxPaneId
->compareTo((*iPane
)->mxPaneId
) == 0)
313 return SharedPaneDescriptor();
316 PresenterPaneContainer::SharedPaneDescriptor
PresenterPaneContainer::FindViewURL (
317 const OUString
& rsViewURL
)
319 PaneList::iterator
iEnd (maPanes
.end());
320 PaneList::iterator iPane
;
321 for (iPane
=maPanes
.begin(); iPane
!=iEnd
; ++iPane
)
323 if (rsViewURL
== (*iPane
)->msViewURL
)
326 return SharedPaneDescriptor();
329 OUString
PresenterPaneContainer::GetPaneURLForViewURL (const OUString
& rsViewURL
)
331 SharedPaneDescriptor
pDescriptor (FindViewURL(rsViewURL
));
332 if (pDescriptor
.get() != NULL
)
333 if (pDescriptor
->mxPaneId
.is())
334 return pDescriptor
->mxPaneId
->getResourceURL();
338 void PresenterPaneContainer::ToTop (const SharedPaneDescriptor
& rpDescriptor
)
340 if (rpDescriptor
.get() != NULL
)
342 // Find iterator for pDescriptor.
343 PaneList::iterator iPane
;
344 PaneList::iterator
iEnd (maPanes
.end());
345 for (iPane
=maPanes
.begin(); iPane
!=iEnd
; ++iPane
)
346 if (iPane
->get() == rpDescriptor
.get())
348 OSL_ASSERT(iPane
!=iEnd
);
352 if (mxPresenterHelper
.is())
353 mxPresenterHelper
->toTop(rpDescriptor
->mxBorderWindow
);
355 maPanes
.erase(iPane
);
356 maPanes
.push_back(rpDescriptor
);
360 //----- XEventListener --------------------------------------------------------
362 void SAL_CALL
PresenterPaneContainer::disposing (
363 const com::sun::star::lang::EventObject
& rEvent
)
364 throw (com::sun::star::uno::RuntimeException
, std::exception
)
366 SharedPaneDescriptor
pDescriptor (
367 FindContentWindow(Reference
<awt::XWindow
>(rEvent
.Source
, UNO_QUERY
)));
368 if (pDescriptor
.get() != NULL
)
370 RemovePane(pDescriptor
->mxPaneId
);
374 //===== PresenterPaneContainer::PaneDescriptor ================================
376 void PresenterPaneContainer::PaneDescriptor::SetActivationState (const bool bIsActive
)
378 mbIsActive
= bIsActive
;
379 if ( ! maActivator
.empty())
380 maActivator(mbIsActive
);
383 } } // end of namespace ::sdext::presenter
385 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */