xref: /trunk/main/sd/source/ui/presenter/PresenterHelper.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include "precompiled_sd.hxx"
25 
26 #include "PresenterHelper.hxx"
27 #include "CanvasUpdateRequester.hxx"
28 #include "PresenterCanvas.hxx"
29 #include <cppcanvas/vclfactory.hxx>
30 #include <com/sun/star/awt/WindowAttribute.hpp>
31 #include <com/sun/star/awt/WindowClass.hpp>
32 #include <com/sun/star/awt/WindowDescriptor.hpp>
33 #include <osl/file.hxx>
34 #include <toolkit/helper/vclunohelper.hxx>
35 #include <vcl/svapp.hxx>
36 #include <vcl/window.hxx>
37 #include <vcl/wrkwin.hxx>
38 #include <vcl/imagerepository.hxx>
39 
40 using namespace ::com::sun::star;
41 using namespace ::com::sun::star::uno;
42 using ::rtl::OUString;
43 
44 namespace sd { namespace presenter {
45 
46 //===== Service ===============================================================
47 
PresenterHelperService_createInstance(const Reference<XComponentContext> & rxContext)48 Reference<XInterface> SAL_CALL PresenterHelperService_createInstance (
49     const Reference<XComponentContext>& rxContext)
50 {
51     return Reference<XInterface>(static_cast<XWeak*>(new PresenterHelper(rxContext)));
52 }
53 
54 
55 
56 
PresenterHelperService_getImplementationName(void)57 ::rtl::OUString PresenterHelperService_getImplementationName (void)
58 {
59     return OUString::createFromAscii("com.sun.star.comp.Draw.PresenterHelper");
60 }
61 
62 
63 
64 
PresenterHelperService_getSupportedServiceNames(void)65 Sequence<rtl::OUString> SAL_CALL PresenterHelperService_getSupportedServiceNames (void)
66 {
67     static const ::rtl::OUString sServiceName(
68         ::rtl::OUString::createFromAscii("com.sun.star.drawing.PresenterHelper"));
69     return Sequence<rtl::OUString>(&sServiceName, 1);
70 }
71 
72 
73 
74 
75 //===== PresenterHelper =======================================================
76 
PresenterHelper(const Reference<XComponentContext> & rxContext)77 PresenterHelper::PresenterHelper (
78     const Reference<XComponentContext>& rxContext)
79     : PresenterHelperInterfaceBase(m_aMutex),
80       mxComponentContext(rxContext)
81 {
82 }
83 
84 
85 
~PresenterHelper(void)86 PresenterHelper::~PresenterHelper (void)
87 {
88 }
89 
90 
91 
92 
93 //----- XInitialize -----------------------------------------------------------
94 
initialize(const Sequence<Any> & rArguments)95 void SAL_CALL PresenterHelper::initialize (const Sequence<Any>& rArguments)
96 {
97     (void)rArguments;
98 }
99 
100 
101 
102 
103 //----- XPaneHelper ----------------------------------------------------
104 
createWindow(const Reference<awt::XWindow> & rxParentWindow,sal_Bool bCreateSystemChildWindow,sal_Bool bInitiallyVisible,sal_Bool bEnableChildTransparentMode,sal_Bool bEnableParentClip)105 Reference<awt::XWindow> SAL_CALL PresenterHelper::createWindow (
106     const Reference<awt::XWindow>& rxParentWindow,
107     sal_Bool bCreateSystemChildWindow,
108     sal_Bool bInitiallyVisible,
109     sal_Bool bEnableChildTransparentMode,
110     sal_Bool bEnableParentClip)
111 {
112     ::Window* pParentWindow = VCLUnoHelper::GetWindow(rxParentWindow);
113 
114     // Create a new window.
115     ::Window* pWindow = NULL;
116     if (bCreateSystemChildWindow)
117     {
118         pWindow = new WorkWindow(pParentWindow, WB_SYSTEMCHILDWINDOW);
119     }
120     else
121     {
122         pWindow = new ::Window(pParentWindow);
123     }
124     Reference<awt::XWindow> xWindow (pWindow->GetComponentInterface(), UNO_QUERY);
125 
126     if (bEnableChildTransparentMode)
127     {
128         // Make the frame window transparent and make the parent able to
129         // draw behind it.
130         if (pParentWindow != NULL)
131             pParentWindow->EnableChildTransparentMode(sal_True);
132     }
133 
134     if (pWindow != NULL)
135     {
136         pWindow->Show(bInitiallyVisible);
137 
138         pWindow->SetMapMode(MAP_PIXEL);
139         pWindow->SetBackground();
140         if ( ! bEnableParentClip)
141         {
142             pWindow->SetParentClipMode(PARENTCLIPMODE_NOCLIP);
143             pWindow->SetPaintTransparent(sal_True);
144         }
145         else
146         {
147             pWindow->SetParentClipMode(PARENTCLIPMODE_CLIP);
148             pWindow->SetPaintTransparent(sal_False);
149         }
150 
151     }
152 
153     return xWindow;
154 }
155 
156 
157 
158 
createSharedCanvas(const Reference<rendering::XSpriteCanvas> & rxUpdateCanvas,const Reference<awt::XWindow> & rxUpdateWindow,const Reference<rendering::XCanvas> & rxSharedCanvas,const Reference<awt::XWindow> & rxSharedWindow,const Reference<awt::XWindow> & rxWindow)159 Reference<rendering::XCanvas> SAL_CALL PresenterHelper::createSharedCanvas (
160     const Reference<rendering::XSpriteCanvas>& rxUpdateCanvas,
161     const Reference<awt::XWindow>& rxUpdateWindow,
162     const Reference<rendering::XCanvas>& rxSharedCanvas,
163     const Reference<awt::XWindow>& rxSharedWindow,
164     const Reference<awt::XWindow>& rxWindow)
165 {
166     if ( ! rxSharedCanvas.is()
167         || ! rxSharedWindow.is()
168         || ! rxWindow.is())
169     {
170         throw RuntimeException(
171             OUString::createFromAscii("illegal argument"),
172             Reference<XInterface>(static_cast<XWeak*>(this)));
173     }
174 
175     if (rxWindow == rxSharedWindow)
176         return rxSharedCanvas;
177     else
178         return new PresenterCanvas(
179             rxUpdateCanvas,
180             rxUpdateWindow,
181             rxSharedCanvas,
182             rxSharedWindow,
183             rxWindow);
184 }
185 
186 
187 
188 
createCanvas(const Reference<awt::XWindow> & rxWindow,sal_Int16 nRequestedCanvasFeatures,const OUString & rsOptionalCanvasServiceName)189 Reference<rendering::XCanvas> SAL_CALL PresenterHelper::createCanvas (
190     const Reference<awt::XWindow>& rxWindow,
191     sal_Int16 nRequestedCanvasFeatures,
192     const OUString& rsOptionalCanvasServiceName)
193 {
194     (void)nRequestedCanvasFeatures;
195 
196     // No shared window is given or an explicit canvas service name is
197     // specified.  Create a new canvas.
198     ::Window* pWindow = VCLUnoHelper::GetWindow(rxWindow);
199     if (pWindow != NULL)
200     {
201         Sequence<Any> aArg (5);
202 
203         // common: first any is VCL pointer to window (for VCL canvas)
204         aArg[0] = makeAny(reinterpret_cast<sal_Int64>(pWindow));
205         aArg[1] = Any();
206         aArg[2] = makeAny(::com::sun::star::awt::Rectangle());
207         aArg[3] = makeAny(sal_False);
208         aArg[4] = makeAny(rxWindow);
209 
210         Reference<lang::XMultiServiceFactory> xFactory (
211             mxComponentContext->getServiceManager(), UNO_QUERY_THROW);
212         return Reference<rendering::XCanvas>(
213             xFactory->createInstanceWithArguments(
214                 rsOptionalCanvasServiceName.getLength()>0
215                     ? rsOptionalCanvasServiceName
216                     : OUString::createFromAscii("com.sun.star.rendering.VCLCanvas"),
217                 aArg),
218             UNO_QUERY);
219     }
220     else
221         throw RuntimeException();
222 }
223 
224 
225 
226 
toTop(const Reference<awt::XWindow> & rxWindow)227 void SAL_CALL PresenterHelper::toTop (
228     const Reference<awt::XWindow>& rxWindow)
229 {
230     ::Window* pWindow = VCLUnoHelper::GetWindow(rxWindow);
231     if (pWindow != NULL)
232     {
233         pWindow->ToTop();
234         pWindow->SetZOrder(NULL, WINDOW_ZORDER_LAST);
235     }
236 }
237 
238 
239 
240 
loadBitmap(const OUString & rsURL,const Reference<rendering::XCanvas> & rxCanvas)241 Reference<rendering::XBitmap> SAL_CALL PresenterHelper::loadBitmap (
242     const OUString& rsURL,
243     const Reference<rendering::XCanvas>& rxCanvas)
244 {
245     if ( ! rxCanvas.is())
246         return NULL;
247 
248     ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
249 
250     if (mpGraphicFilter.get() == NULL)
251         mpGraphicFilter.reset(new GraphicFilter(sal_False));
252 
253     const cppcanvas::CanvasSharedPtr pCanvas (
254         cppcanvas::VCLFactory::getInstance().createCanvas(
255             Reference<css::rendering::XBitmapCanvas>(rxCanvas,UNO_QUERY)));
256 
257     if (pCanvas.get()!=NULL && rsURL.getLength()>0 && mpGraphicFilter.get()!=NULL)
258     {
259         sal_Int32 nIndex = 0;
260         if( rsURL.getToken( 0, '/', nIndex ).equalsAsciiL(
261             RTL_CONSTASCII_STRINGPARAM( "private:graphicrepository" ) ) )
262         {
263             OUString sPathName( rsURL.copy( nIndex ) );
264             BitmapEx aBitmap;
265             if ( ::vcl::ImageRepository::loadImage( sPathName, aBitmap, false )
266                 && !aBitmap.IsEmpty() )
267                 return cppcanvas::VCLFactory::getInstance().createBitmap(
268                     pCanvas,
269                     aBitmap)->getUNOBitmap();
270         }
271     }
272 
273     return NULL;
274 }
275 
276 
277 
278 
279 
captureMouse(const Reference<awt::XWindow> & rxWindow)280 void SAL_CALL PresenterHelper::captureMouse (
281     const Reference<awt::XWindow>& rxWindow)
282 {
283     ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
284 
285     // Capture the mouse (if not already done.)
286     ::Window* pWindow = VCLUnoHelper::GetWindow(rxWindow);
287     if (pWindow != NULL && ! pWindow->IsMouseCaptured())
288     {
289         pWindow->CaptureMouse();
290     }
291 }
292 
293 
294 
295 
releaseMouse(const Reference<awt::XWindow> & rxWindow)296 void SAL_CALL PresenterHelper::releaseMouse (const Reference<awt::XWindow>& rxWindow)
297 {
298     ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
299 
300     // Release the mouse (if not already done.)
301     ::Window* pWindow = VCLUnoHelper::GetWindow(rxWindow);
302     if (pWindow != NULL && pWindow->IsMouseCaptured())
303     {
304         pWindow->ReleaseMouse();
305     }
306 }
307 
308 
309 
310 
getWindowExtentsRelative(const Reference<awt::XWindow> & rxChildWindow,const Reference<awt::XWindow> & rxParentWindow)311 awt::Rectangle PresenterHelper::getWindowExtentsRelative (
312     const Reference<awt::XWindow>& rxChildWindow,
313     const Reference<awt::XWindow>& rxParentWindow)
314 {
315     ::Window* pChildWindow = VCLUnoHelper::GetWindow(rxChildWindow);
316     ::Window* pParentWindow = VCLUnoHelper::GetWindow(rxParentWindow);
317     if (pChildWindow!=NULL && pParentWindow!=NULL)
318     {
319         Rectangle aBox (pChildWindow->GetWindowExtentsRelative(pParentWindow));
320         return awt::Rectangle(aBox.Left(),aBox.Top(),aBox.GetWidth(),aBox.GetHeight());
321     }
322     else
323         return awt::Rectangle();
324 }
325 
326 
327 
328 } } // end of namespace ::sd::presenter
329