Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "helpers.hxx"
21 : #include <services.h>
22 :
23 : #include <com/sun/star/ui/DockingArea.hpp>
24 : #include <com/sun/star/awt/Toolkit.hpp>
25 : #include <com/sun/star/awt/XTopWindow.hpp>
26 : #include <com/sun/star/frame/DispatchHelper.hpp>
27 : #include <com/sun/star/awt/XDockableWindow.hpp>
28 : #include <com/sun/star/awt/XDockableWindowListener.hpp>
29 : #include <com/sun/star/awt/XWindowListener.hpp>
30 : #include <com/sun/star/ui/XUIElement.hpp>
31 :
32 : #include <comphelper/processfactory.hxx>
33 : #include <unotools/mediadescriptor.hxx>
34 : #include <vcl/svapp.hxx>
35 : #include <toolkit/helper/vclunohelper.hxx>
36 :
37 : using namespace com::sun::star;
38 :
39 : namespace framework
40 : {
41 :
42 0 : bool hasEmptySize( const ::com::sun::star::awt::Size& rSize )
43 : {
44 0 : return ( rSize.Width == 0 ) && ( rSize.Height == 0 );
45 : }
46 :
47 0 : bool hasDefaultPosValue( const ::com::sun::star::awt::Point& rPos )
48 : {
49 0 : return (( rPos.X == SAL_MAX_INT32 ) || ( rPos.Y == SAL_MAX_INT32 ));
50 : }
51 :
52 16268 : bool isDefaultPos( const ::com::sun::star::awt::Point& rPos )
53 : {
54 16268 : return (( rPos.X == SAL_MAX_INT32 ) && ( rPos.Y == SAL_MAX_INT32 ));
55 : }
56 :
57 75188 : bool isReverseOrderDockingArea( const sal_Int32 nDockArea )
58 : {
59 75188 : ui::DockingArea eDockArea = static_cast< ui::DockingArea >( nDockArea );
60 75188 : return (( eDockArea == ui::DockingArea_DOCKINGAREA_BOTTOM ) ||
61 75188 : ( eDockArea == ui::DockingArea_DOCKINGAREA_RIGHT ));
62 : }
63 :
64 0 : bool isToolboxHorizontalAligned( ToolBox* pToolBox )
65 : {
66 0 : if ( pToolBox )
67 0 : return (( pToolBox->GetAlign() == WINDOWALIGN_TOP ) || ( pToolBox->GetAlign() == WINDOWALIGN_BOTTOM ));
68 0 : return false;
69 : }
70 :
71 87461 : bool isHorizontalDockingArea( const ui::DockingArea& nDockingArea )
72 : {
73 90873 : return (( nDockingArea == ui::DockingArea_DOCKINGAREA_TOP ) ||
74 90873 : ( nDockingArea == ui::DockingArea_DOCKINGAREA_BOTTOM ));
75 : }
76 :
77 58509 : bool isHorizontalDockingArea( const sal_Int32 nDockArea )
78 : {
79 58509 : return isHorizontalDockingArea(static_cast< ui::DockingArea >( nDockArea ));
80 : }
81 :
82 305982 : OUString retrieveToolbarNameFromHelpURL( vcl::Window* pWindow )
83 : {
84 305982 : OUString aToolbarName;
85 :
86 305982 : if ( pWindow->GetType() == WINDOW_TOOLBOX )
87 : {
88 305982 : ToolBox* pToolBox = dynamic_cast<ToolBox *>( pWindow );
89 305982 : if ( pToolBox )
90 : {
91 305982 : aToolbarName = OStringToOUString( pToolBox->GetHelpId(), RTL_TEXTENCODING_UTF8 );
92 305982 : sal_Int32 i = aToolbarName.lastIndexOf( ':' );
93 305982 : if ( !aToolbarName.isEmpty() && ( i > 0 ) && (( i + 1 ) < aToolbarName.getLength() ))
94 231666 : aToolbarName = aToolbarName.copy( i+1 ); // Remove ".HelpId:" protocol from toolbar name
95 : else
96 74316 : aToolbarName = OUString();
97 : }
98 : }
99 305982 : return aToolbarName;
100 : }
101 :
102 305982 : ToolBox* getToolboxPtr( vcl::Window* pWindow )
103 : {
104 305982 : ToolBox* pToolbox(NULL);
105 305982 : if ( pWindow->GetType() == WINDOW_TOOLBOX )
106 305982 : pToolbox = dynamic_cast<ToolBox*>( pWindow );
107 305982 : return pToolbox;
108 : }
109 :
110 16170 : vcl::Window* getWindowFromXUIElement( const uno::Reference< ui::XUIElement >& xUIElement )
111 : {
112 16170 : SolarMutexGuard aGuard;
113 32340 : uno::Reference< awt::XWindow > xWindow;
114 16170 : if ( xUIElement.is() )
115 16170 : xWindow = uno::Reference< awt::XWindow >( xUIElement->getRealInterface(), uno::UNO_QUERY );
116 32340 : return VCLUnoHelper::GetWindow( xWindow );
117 : }
118 :
119 52223 : SystemWindow* getTopSystemWindow( const uno::Reference< awt::XWindow >& xWindow )
120 : {
121 52223 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
122 104472 : while ( pWindow && !pWindow->IsSystemWindow() )
123 26 : pWindow = pWindow->GetParent();
124 :
125 52223 : if ( pWindow )
126 52223 : return static_cast<SystemWindow *>(pWindow);
127 : else
128 0 : return 0;
129 : }
130 :
131 37675 : void setZeroRectangle( ::Rectangle& rRect )
132 : {
133 37675 : rRect.setX(0);
134 37675 : rRect.setY(0);
135 37675 : rRect.setWidth(0);
136 37675 : rRect.setHeight(0);
137 37675 : }
138 :
139 : // ATTENTION!
140 : // This value is directly copied from the sfx2 project.
141 : // You have to change BOTH values, see sfx2/inc/sfx2/sfxsids.hrc (SID_DOCKWIN_START)
142 : static const sal_Int32 DOCKWIN_ID_BASE = 9800;
143 :
144 19264 : bool lcl_checkUIElement(const uno::Reference< ui::XUIElement >& xUIElement, awt::Rectangle& _rPosSize, uno::Reference< awt::XWindow >& _xWindow)
145 : {
146 19264 : bool bRet = xUIElement.is();
147 19264 : if ( bRet )
148 : {
149 19264 : SolarMutexGuard aGuard;
150 19264 : _xWindow.set( xUIElement->getRealInterface(), uno::UNO_QUERY );
151 19264 : _rPosSize = _xWindow->getPosSize();
152 :
153 19264 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( _xWindow );
154 19264 : if ( pWindow->GetType() == WINDOW_TOOLBOX )
155 : {
156 19264 : ::Size aSize = static_cast<ToolBox*>(pWindow)->CalcWindowSizePixel( 1 );
157 19264 : _rPosSize.Width = aSize.Width();
158 19264 : _rPosSize.Height = aSize.Height();
159 19264 : }
160 : } // if ( xUIElement.is() )
161 19264 : return bRet;
162 : }
163 :
164 44648 : uno::Reference< awt::XWindowPeer > createToolkitWindow( const uno::Reference< uno::XComponentContext >& rxContext, const uno::Reference< awt::XWindowPeer >& rParent, const char* pService )
165 : {
166 44648 : uno::Reference< awt::XToolkit2 > xToolkit = awt::Toolkit::create( rxContext );
167 :
168 : // describe window properties.
169 89296 : css::awt::WindowDescriptor aDescriptor;
170 44648 : aDescriptor.Type = awt::WindowClass_SIMPLE;
171 44648 : aDescriptor.WindowServiceName = OUString::createFromAscii( pService );
172 44648 : aDescriptor.ParentIndex = -1;
173 44648 : aDescriptor.Parent = uno::Reference< awt::XWindowPeer >( rParent, uno::UNO_QUERY );
174 44648 : aDescriptor.Bounds = awt::Rectangle(0,0,0,0);
175 44648 : aDescriptor.WindowAttributes = 0;
176 :
177 : // create a awt window
178 44648 : uno::Reference< awt::XWindowPeer > xPeer = xToolkit->createWindow( aDescriptor );
179 :
180 89296 : return xPeer;
181 : }
182 :
183 : // convert alignment constant to vcl's WindowAlign type
184 16268 : WindowAlign ImplConvertAlignment( sal_Int16 aAlignment )
185 : {
186 16268 : if ( aAlignment == ui::DockingArea_DOCKINGAREA_LEFT )
187 0 : return WINDOWALIGN_LEFT;
188 16268 : else if ( aAlignment == ui::DockingArea_DOCKINGAREA_RIGHT )
189 0 : return WINDOWALIGN_RIGHT;
190 16268 : else if ( aAlignment == ui::DockingArea_DOCKINGAREA_TOP )
191 15652 : return WINDOWALIGN_TOP;
192 : else
193 616 : return WINDOWALIGN_BOTTOM;
194 : }
195 :
196 16 : OUString getElementTypeFromResourceURL( const OUString& aResourceURL )
197 : {
198 16 : OUString aType;
199 :
200 32 : OUString aUIResourceURL( UIRESOURCE_URL );
201 16 : if ( aResourceURL.startsWith( aUIResourceURL ) )
202 : {
203 16 : sal_Int32 nIndex = 0;
204 16 : OUString aPathPart = aResourceURL.copy( aUIResourceURL.getLength() );
205 16 : aPathPart.getToken( 0, (sal_Unicode)'/', nIndex );
206 :
207 16 : return aPathPart.getToken( 0, (sal_Unicode)'/', nIndex );
208 : }
209 :
210 16 : return aType;
211 : }
212 :
213 533237 : void parseResourceURL( const OUString& aResourceURL, OUString& aElementType, OUString& aElementName )
214 : {
215 533237 : OUString aUIResourceURL( UIRESOURCE_URL );
216 533237 : if ( aResourceURL.startsWith( aUIResourceURL ) )
217 : {
218 533221 : sal_Int32 nIndex = 0;
219 533221 : OUString aPathPart = aResourceURL.copy( aUIResourceURL.getLength() );
220 533221 : aPathPart.getToken( 0, (sal_Unicode)'/', nIndex );
221 :
222 533221 : aElementType = aPathPart.getToken( 0, (sal_Unicode)'/', nIndex );
223 533221 : aElementName = aPathPart.getToken( 0, (sal_Unicode)'/', nIndex );
224 533237 : }
225 533237 : }
226 :
227 37656 : ::com::sun::star::awt::Rectangle putRectangleValueToAWT( const ::Rectangle& rRect )
228 : {
229 37656 : css::awt::Rectangle aRect;
230 37656 : aRect.X = rRect.Left();
231 37656 : aRect.Y = rRect.Top();
232 37656 : aRect.Width = rRect.Right();
233 37656 : aRect.Height = rRect.Bottom();
234 :
235 37656 : return aRect;
236 : }
237 :
238 18797 : ::Rectangle putAWTToRectangle( const ::com::sun::star::awt::Rectangle& rRect )
239 : {
240 18797 : ::Rectangle aRect;
241 18797 : aRect.Left() = rRect.X;
242 18797 : aRect.Top() = rRect.Y;
243 18797 : aRect.Right() = rRect.Width;
244 18797 : aRect.Bottom() = rRect.Height;
245 :
246 18797 : return aRect;
247 : }
248 :
249 18859 : bool equalRectangles( const css::awt::Rectangle& rRect1,
250 : const css::awt::Rectangle& rRect2 )
251 : {
252 37718 : return (( rRect1.X == rRect2.X ) &&
253 28545 : ( rRect1.Y == rRect2.Y ) &&
254 38231 : ( rRect1.Width == rRect2.Width ) &&
255 28545 : ( rRect1.Height == rRect2.Height ));
256 : }
257 :
258 11178 : uno::Reference< frame::XModel > impl_getModelFromFrame( const uno::Reference< frame::XFrame >& rFrame )
259 : {
260 : // Query for the model to get check the context information
261 11178 : uno::Reference< frame::XModel > xModel;
262 11178 : if ( rFrame.is() )
263 : {
264 5606 : uno::Reference< frame::XController > xController( rFrame->getController(), uno::UNO_QUERY );
265 5606 : if ( xController.is() )
266 5604 : xModel = xController->getModel();
267 : }
268 :
269 11178 : return xModel;
270 : }
271 :
272 5592 : bool implts_isPreviewModel( const uno::Reference< frame::XModel >& xModel )
273 : {
274 5592 : if ( xModel.is() )
275 : {
276 16 : utl::MediaDescriptor aDesc( xModel->getArgs() );
277 16 : return aDesc.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_PREVIEW(), sal_False);
278 : }
279 : else
280 5576 : return false;
281 : }
282 :
283 27597 : bool implts_isFrameOrWindowTop( const uno::Reference< frame::XFrame >& xFrame )
284 : {
285 27597 : if (xFrame->isTop())
286 27595 : return true;
287 :
288 2 : uno::Reference< awt::XTopWindow > xWindowCheck(xFrame->getContainerWindow(), uno::UNO_QUERY); // dont use _THROW here ... it's a check only
289 2 : if (xWindowCheck.is())
290 : {
291 : // #i76867# top and system window is required.
292 2 : SolarMutexGuard aGuard;
293 4 : uno::Reference< awt::XWindow > xWindow( xWindowCheck, uno::UNO_QUERY );
294 2 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
295 4 : return ( pWindow && pWindow->IsSystemWindow() );
296 : }
297 :
298 0 : return false;
299 : }
300 :
301 0 : void impl_setDockingWindowVisibility( const css::uno::Reference< css::uno::XComponentContext>& rxContext, const css::uno::Reference< css::frame::XFrame >& rFrame, const OUString& rDockingWindowName, bool bVisible )
302 : {
303 0 : const OUString aDockWinPrefixCommand( "DockingWindow" );
304 :
305 0 : sal_Int32 nID = rDockingWindowName.toInt32();
306 0 : sal_Int32 nIndex = nID - DOCKWIN_ID_BASE;
307 :
308 0 : css::uno::Reference< css::frame::XDispatchProvider > xProvider(rFrame, css::uno::UNO_QUERY);
309 0 : if ( nIndex >= 0 && xProvider.is() )
310 : {
311 0 : OUString aDockWinCommand( ".uno:" );
312 0 : OUString aDockWinArgName( aDockWinPrefixCommand );
313 :
314 0 : aDockWinArgName += OUString::number( nIndex );
315 :
316 0 : css::uno::Sequence< css::beans::PropertyValue > aArgs(1);
317 0 : aArgs[0].Name = aDockWinArgName;
318 0 : aArgs[0].Value = css::uno::makeAny( bVisible );
319 :
320 0 : css::uno::Reference< css::frame::XDispatchHelper > xDispatcher = css::frame::DispatchHelper::create( rxContext );
321 :
322 0 : aDockWinCommand = aDockWinCommand + aDockWinArgName;
323 0 : xDispatcher->executeDispatch(
324 : xProvider,
325 : aDockWinCommand,
326 : OUString("_self"),
327 : 0,
328 0 : aArgs);
329 0 : }
330 0 : }
331 :
332 0 : void impl_addWindowListeners(
333 : const css::uno::Reference< css::uno::XInterface >& xThis,
334 : const css::uno::Reference< css::ui::XUIElement >& xUIElement )
335 : {
336 0 : css::uno::Reference< css::awt::XWindow > xWindow( xUIElement->getRealInterface(), css::uno::UNO_QUERY );
337 0 : css::uno::Reference< css::awt::XDockableWindow > xDockWindow( xUIElement->getRealInterface(), css::uno::UNO_QUERY );
338 0 : if ( xDockWindow.is() && xWindow.is() )
339 : {
340 : try
341 : {
342 0 : xDockWindow->addDockableWindowListener(
343 : css::uno::Reference< css::awt::XDockableWindowListener >(
344 0 : xThis, css::uno::UNO_QUERY ));
345 0 : xWindow->addWindowListener(
346 : css::uno::Reference< css::awt::XWindowListener >(
347 0 : xThis, css::uno::UNO_QUERY ));
348 0 : xDockWindow->enableDocking( sal_True );
349 : }
350 0 : catch ( const css::uno::Exception& )
351 : {
352 : }
353 0 : }
354 0 : }
355 :
356 951 : } // namespace framework
357 :
358 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|