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 "FullScreenPane.hxx"
27 #include "ViewShellBase.hxx"
28 #include <cppcanvas/vclfactory.hxx>
29 #include <sfx2/dispatch.hxx>
30 #include <vcl/wrkwin.hxx>
31 #include <vcl/svapp.hxx>
32 #include <vcl/dialog.hxx>
33 #include <toolkit/helper/vclunohelper.hxx>
34 #include <com/sun/star/beans/XPropertySet.hpp>
35 #include <com/sun/star/frame/XLayoutManager.hpp>
36 #include <com/sun/star/lang/IllegalArgumentException.hpp>
37 #include <com/sun/star/lang/XInitialization.hpp>
38 #include <com/sun/star/util/URL.hpp>
39
40 using namespace ::com::sun::star;
41 using namespace ::com::sun::star::uno;
42 using namespace ::com::sun::star::drawing::framework;
43 using ::rtl::OUString;
44
45 #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
46
47 namespace sd { namespace framework {
48
FullScreenPane(const Reference<XComponentContext> & rxComponentContext,const Reference<XResourceId> & rxPaneId,const::Window * pViewShellWindow)49 FullScreenPane::FullScreenPane (
50 const Reference<XComponentContext>& rxComponentContext,
51 const Reference<XResourceId>& rxPaneId,
52 const ::Window* pViewShellWindow)
53 : FrameWindowPane(rxPaneId,NULL),
54 mxComponentContext(rxComponentContext),
55 mpWorkWindow(NULL)
56 {
57 ::Window* pParent = NULL;
58 mpWorkWindow.reset(new WorkWindow(
59 pParent,
60 0)); // For debugging (non-fullscreen) use WB_BORDER | WB_MOVEABLE | WB_SIZEABLE));
61
62 if ( ! rxPaneId.is())
63 throw lang::IllegalArgumentException();
64
65 sal_Int32 nScreenNumber = 1;
66 ExtractArguments(rxPaneId, nScreenNumber);
67
68 if (mpWorkWindow.get() == NULL)
69 return;
70
71 // Create a new top-leve window that is displayed full screen.
72 mpWorkWindow->ShowFullScreenMode(sal_True, nScreenNumber);
73 // For debugging (non-fullscreen) use mpWorkWindow->SetScreenNumber(nScreenNumber);
74 mpWorkWindow->SetMenuBarMode(MENUBAR_MODE_HIDE);
75 mpWorkWindow->SetBorderStyle(WINDOW_BORDER_REMOVEBORDER);
76 mpWorkWindow->SetBackground(Wallpaper());
77 // Don't show the window right now in order to allow the setting of an
78 // accessibility object: accessibility objects are typically
79 // requested by AT-tools when the window is shown. Chaning it
80 // afterwards may or may not work.
81
82 // Add resize listener at the work window.
83 Link aWindowEventHandler (LINK(this, FullScreenPane, WindowEventHandler));
84 mpWorkWindow->AddEventListener(aWindowEventHandler);
85
86 // Set title and icon of the new window to those of the current window
87 // of the view shell.
88 if (pViewShellWindow != NULL)
89 {
90 const SystemWindow* pSystemWindow = pViewShellWindow->GetSystemWindow();
91 mpWorkWindow->SetText(pSystemWindow->GetText());
92 mpWorkWindow->SetIcon(pSystemWindow->GetIcon());
93 }
94
95 // For some reason the VCL canvas can not paint into a WorkWindow.
96 // Therefore a child window is created that covers the WorkWindow
97 // completely.
98 mpWindow = new ::Window(mpWorkWindow.get());
99 mpWindow->SetPosSizePixel(Point(0,0), mpWorkWindow->GetSizePixel());
100 mpWindow->SetBackground(Wallpaper());
101 mxWindow = VCLUnoHelper::GetInterface(mpWindow);
102
103 // Create the canvas.
104 mxCanvas = CreateCanvas();
105
106 mpWindow->GrabFocus();
107 }
108
109
110
111
~FullScreenPane(void)112 FullScreenPane::~FullScreenPane (void) throw()
113 {
114 }
115
116
117
118
disposing(void)119 void SAL_CALL FullScreenPane::disposing (void)
120 {
121 // We have created the window pointed to by mpWindow, we delete it.
122 if (mpWindow != NULL)
123 {
124 delete mpWindow;
125 }
126
127 if (mpWorkWindow.get() != NULL)
128 {
129 Link aWindowEventHandler (LINK(this, FullScreenPane, WindowEventHandler));
130 mpWorkWindow->RemoveEventListener(aWindowEventHandler);
131 mpWorkWindow.reset();
132 }
133
134
135 FrameWindowPane::disposing();
136 }
137
138
139
140
141 //----- XPane -----------------------------------------------------------------
142
isVisible(void)143 sal_Bool SAL_CALL FullScreenPane::isVisible (void)
144 throw (RuntimeException)
145 {
146 ThrowIfDisposed();
147
148 if (mpWindow != NULL)
149 return mpWindow->IsReallyVisible();
150 else
151 return false;
152 }
153
154
155
156
setVisible(const sal_Bool bIsVisible)157 void SAL_CALL FullScreenPane::setVisible (const sal_Bool bIsVisible)
158 throw (RuntimeException)
159 {
160 ThrowIfDisposed();
161
162 if (mpWindow != NULL)
163 mpWindow->Show(bIsVisible);
164 if( bool(mpWorkWindow))
165 mpWorkWindow->Show(bIsVisible);
166 }
167
168
169
170
getAccessible(void)171 Reference<accessibility::XAccessible> SAL_CALL FullScreenPane::getAccessible (void)
172 throw (RuntimeException)
173 {
174 ThrowIfDisposed();
175
176 if( bool(mpWorkWindow))
177 return mpWorkWindow->GetAccessible(sal_False);
178 else
179 return NULL;
180 }
181
182
183
184
setAccessible(const Reference<accessibility::XAccessible> & rxAccessible)185 void SAL_CALL FullScreenPane::setAccessible (
186 const Reference<accessibility::XAccessible>& rxAccessible)
187 throw (RuntimeException)
188 {
189 ThrowIfDisposed();
190
191 if (mpWindow != NULL)
192 {
193 Reference<lang::XInitialization> xInitializable (rxAccessible, UNO_QUERY);
194 if (xInitializable.is())
195 {
196 ::Window* pParentWindow = mpWindow->GetParent();
197 Reference<accessibility::XAccessible> xAccessibleParent;
198 if (pParentWindow != NULL)
199 xAccessibleParent = pParentWindow->GetAccessible();
200 Sequence<Any> aArguments (1);
201 aArguments[0] = Any(xAccessibleParent);
202 xInitializable->initialize(aArguments);
203 }
204 GetWindow()->SetAccessible(rxAccessible);
205 }
206 }
207
208
209
210
211 //-----------------------------------------------------------------------------
212
IMPL_LINK(FullScreenPane,WindowEventHandler,VclWindowEvent *,pEvent)213 IMPL_LINK(FullScreenPane, WindowEventHandler, VclWindowEvent*, pEvent)
214 {
215 switch (pEvent->GetId())
216 {
217 case VCLEVENT_WINDOW_RESIZE:
218 GetWindow()->SetPosPixel(Point(0,0));
219 GetWindow()->SetSizePixel(Size(
220 mpWorkWindow->GetSizePixel().Width(),
221 mpWorkWindow->GetSizePixel().Height()));
222 break;
223
224 case VCLEVENT_OBJECT_DYING:
225 mpWorkWindow.reset();
226 break;
227 }
228 return 1;
229 }
230
231
232
233
CreateCanvas(void)234 Reference<rendering::XCanvas> FullScreenPane::CreateCanvas (void)
235 throw (RuntimeException)
236 {
237 ::Window* pWindow = VCLUnoHelper::GetWindow(mxWindow);
238 if (pWindow != NULL)
239 {
240 Sequence<Any> aArg (5);
241
242 // common: first any is VCL pointer to window (for VCL canvas)
243 aArg[0] = makeAny(reinterpret_cast<sal_Int64>(pWindow));
244 aArg[1] = Any();
245 aArg[2] = makeAny(::com::sun::star::awt::Rectangle());
246 aArg[3] = makeAny(sal_False);
247 aArg[4] = makeAny(mxWindow);
248
249 Reference<lang::XMultiServiceFactory> xFactory (
250 mxComponentContext->getServiceManager(), UNO_QUERY_THROW);
251 return Reference<rendering::XCanvas>(
252 xFactory->createInstanceWithArguments(
253 OUString::createFromAscii("com.sun.star.rendering.SpriteCanvas.VCL"),
254 aArg),
255 UNO_QUERY);
256 }
257 else
258 throw RuntimeException();
259 }
260
261
262
263
ExtractArguments(const Reference<XResourceId> & rxPaneId,sal_Int32 & rnScreenNumberReturnValue)264 void FullScreenPane::ExtractArguments (
265 const Reference<XResourceId>& rxPaneId,
266 sal_Int32& rnScreenNumberReturnValue)
267 {
268 // Extract arguments from the resource URL.
269 const util::URL aURL = rxPaneId->getFullResourceURL();
270 sal_Int32 nIndex = 0;
271 while (nIndex >= 0)
272 {
273 const OUString aToken = aURL.Arguments.getToken(0, '&', nIndex);
274 if (aToken.getLength() > 0)
275 {
276 // Split at the first '='.
277 const sal_Int32 nAssign = aToken.indexOf('=');
278 const OUString sKey = aToken.copy(0, nAssign);
279 const OUString sValue = aToken.copy(nAssign+1);
280
281 if (sKey.compareToAscii("ScreenNumber") == 0)
282 {
283 rnScreenNumberReturnValue = sValue.toInt32();
284 }
285 }
286 }
287 }
288
289
290 } } // end of namespace sd::framework
291