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 9522 : bool isDefaultPos( const ::com::sun::star::awt::Point& rPos )
53 : {
54 9522 : return (( rPos.X == SAL_MAX_INT32 ) && ( rPos.Y == SAL_MAX_INT32 ));
55 : }
56 :
57 45640 : bool isReverseOrderDockingArea( const sal_Int32 nDockArea )
58 : {
59 45640 : ui::DockingArea eDockArea = static_cast< ui::DockingArea >( nDockArea );
60 45640 : return (( eDockArea == ui::DockingArea_DOCKINGAREA_BOTTOM ) ||
61 45640 : ( 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 53763 : bool isHorizontalDockingArea( const ui::DockingArea& nDockingArea )
72 : {
73 56425 : return (( nDockingArea == ui::DockingArea_DOCKINGAREA_TOP ) ||
74 56425 : ( nDockingArea == ui::DockingArea_DOCKINGAREA_BOTTOM ));
75 : }
76 :
77 36255 : bool isHorizontalDockingArea( const sal_Int32 nDockArea )
78 : {
79 36255 : return isHorizontalDockingArea(static_cast< ui::DockingArea >( nDockArea ));
80 : }
81 :
82 175118 : OUString retrieveToolbarNameFromHelpURL( vcl::Window* pWindow )
83 : {
84 175118 : OUString aToolbarName;
85 :
86 175118 : if ( pWindow->GetType() == WINDOW_TOOLBOX )
87 : {
88 175118 : ToolBox* pToolBox = dynamic_cast<ToolBox *>( pWindow );
89 175118 : if ( pToolBox )
90 : {
91 175118 : aToolbarName = OStringToOUString( pToolBox->GetHelpId(), RTL_TEXTENCODING_UTF8 );
92 175118 : sal_Int32 i = aToolbarName.lastIndexOf( ':' );
93 175118 : if ( !aToolbarName.isEmpty() && ( i > 0 ) && (( i + 1 ) < aToolbarName.getLength() ))
94 130067 : aToolbarName = aToolbarName.copy( i+1 ); // Remove ".HelpId:" protocol from toolbar name
95 : else
96 45051 : aToolbarName.clear();
97 : }
98 : }
99 175118 : return aToolbarName;
100 : }
101 :
102 175118 : ToolBox* getToolboxPtr( vcl::Window* pWindow )
103 : {
104 175118 : ToolBox* pToolbox(NULL);
105 175118 : if ( pWindow->GetType() == WINDOW_TOOLBOX )
106 175118 : pToolbox = dynamic_cast<ToolBox*>( pWindow );
107 175118 : return pToolbox;
108 : }
109 :
110 8407 : vcl::Window* getWindowFromXUIElement( const uno::Reference< ui::XUIElement >& xUIElement )
111 : {
112 8407 : SolarMutexGuard aGuard;
113 16814 : uno::Reference< awt::XWindow > xWindow;
114 8407 : if ( xUIElement.is() )
115 8407 : xWindow = uno::Reference< awt::XWindow >( xUIElement->getRealInterface(), uno::UNO_QUERY );
116 16814 : return VCLUnoHelper::GetWindow( xWindow );
117 : }
118 :
119 30256 : SystemWindow* getTopSystemWindow( const uno::Reference< awt::XWindow >& xWindow )
120 : {
121 30256 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
122 60525 : while ( pWindow && !pWindow->IsSystemWindow() )
123 13 : pWindow = pWindow->GetParent();
124 :
125 30256 : if ( pWindow )
126 30256 : return static_cast<SystemWindow *>(pWindow);
127 : else
128 0 : return 0;
129 : }
130 :
131 22737 : void setZeroRectangle( ::Rectangle& rRect )
132 : {
133 22737 : rRect.setX(0);
134 22737 : rRect.setY(0);
135 22737 : rRect.setWidth(0);
136 22737 : rRect.setHeight(0);
137 22737 : }
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 11714 : bool lcl_checkUIElement(const uno::Reference< ui::XUIElement >& xUIElement, awt::Rectangle& _rPosSize, uno::Reference< awt::XWindow >& _xWindow)
145 : {
146 11714 : bool bRet = xUIElement.is();
147 11714 : if ( bRet )
148 : {
149 11714 : SolarMutexGuard aGuard;
150 11714 : _xWindow.set( xUIElement->getRealInterface(), uno::UNO_QUERY );
151 11714 : _rPosSize = _xWindow->getPosSize();
152 :
153 11714 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( _xWindow );
154 11714 : if ( pWindow->GetType() == WINDOW_TOOLBOX )
155 : {
156 11714 : ::Size aSize = static_cast<ToolBox*>(pWindow)->CalcWindowSizePixel( 1 );
157 11714 : _rPosSize.Width = aSize.Width();
158 11714 : _rPosSize.Height = aSize.Height();
159 11714 : }
160 : } // if ( xUIElement.is() )
161 11714 : return bRet;
162 : }
163 :
164 26292 : uno::Reference< awt::XWindowPeer > createToolkitWindow( const uno::Reference< uno::XComponentContext >& rxContext, const uno::Reference< awt::XWindowPeer >& rParent, const char* pService )
165 : {
166 26292 : uno::Reference< awt::XToolkit2 > xToolkit = awt::Toolkit::create( rxContext );
167 :
168 : // describe window properties.
169 52584 : css::awt::WindowDescriptor aDescriptor;
170 26292 : aDescriptor.Type = awt::WindowClass_SIMPLE;
171 26292 : aDescriptor.WindowServiceName = OUString::createFromAscii( pService );
172 26292 : aDescriptor.ParentIndex = -1;
173 26292 : aDescriptor.Parent = uno::Reference< awt::XWindowPeer >( rParent, uno::UNO_QUERY );
174 26292 : aDescriptor.Bounds = awt::Rectangle(0,0,0,0);
175 26292 : aDescriptor.WindowAttributes = 0;
176 :
177 : // create a awt window
178 26292 : uno::Reference< awt::XWindowPeer > xPeer = xToolkit->createWindow( aDescriptor );
179 :
180 52584 : return xPeer;
181 : }
182 :
183 : // convert alignment constant to vcl's WindowAlign type
184 9522 : WindowAlign ImplConvertAlignment( sal_Int16 aAlignment )
185 : {
186 9522 : if ( aAlignment == ui::DockingArea_DOCKINGAREA_LEFT )
187 50 : return WINDOWALIGN_LEFT;
188 9472 : else if ( aAlignment == ui::DockingArea_DOCKINGAREA_RIGHT )
189 0 : return WINDOWALIGN_RIGHT;
190 9472 : else if ( aAlignment == ui::DockingArea_DOCKINGAREA_TOP )
191 9117 : return WINDOWALIGN_TOP;
192 : else
193 355 : return WINDOWALIGN_BOTTOM;
194 : }
195 :
196 8 : OUString getElementTypeFromResourceURL( const OUString& aResourceURL )
197 : {
198 8 : OUString aType;
199 :
200 16 : OUString aUIResourceURL( UIRESOURCE_URL );
201 8 : if ( aResourceURL.startsWith( aUIResourceURL ) )
202 : {
203 8 : sal_Int32 nIndex = 0;
204 8 : OUString aPathPart = aResourceURL.copy( aUIResourceURL.getLength() );
205 8 : aPathPart.getToken( 0, (sal_Unicode)'/', nIndex );
206 :
207 8 : return aPathPart.getToken( 0, (sal_Unicode)'/', nIndex );
208 : }
209 :
210 8 : return aType;
211 : }
212 :
213 322958 : void parseResourceURL( const OUString& aResourceURL, OUString& aElementType, OUString& aElementName )
214 : {
215 322958 : OUString aUIResourceURL( UIRESOURCE_URL );
216 322958 : if ( aResourceURL.startsWith( aUIResourceURL ) )
217 : {
218 322950 : sal_Int32 nIndex = 0;
219 322950 : OUString aPathPart = aResourceURL.copy( aUIResourceURL.getLength() );
220 322950 : aPathPart.getToken( 0, (sal_Unicode)'/', nIndex );
221 :
222 322950 : aElementType = aPathPart.getToken( 0, (sal_Unicode)'/', nIndex );
223 322950 : aElementName = aPathPart.getToken( 0, (sal_Unicode)'/', nIndex );
224 322958 : }
225 322958 : }
226 :
227 22866 : ::com::sun::star::awt::Rectangle putRectangleValueToAWT( const ::Rectangle& rRect )
228 : {
229 22866 : css::awt::Rectangle aRect;
230 22866 : aRect.X = rRect.Left();
231 22866 : aRect.Y = rRect.Top();
232 22866 : aRect.Width = rRect.Right();
233 22866 : aRect.Height = rRect.Bottom();
234 :
235 22866 : return aRect;
236 : }
237 :
238 11410 : ::Rectangle putAWTToRectangle( const ::com::sun::star::awt::Rectangle& rRect )
239 : {
240 11410 : ::Rectangle aRect;
241 11410 : aRect.Left() = rRect.X;
242 11410 : aRect.Top() = rRect.Y;
243 11410 : aRect.Right() = rRect.Width;
244 11410 : aRect.Bottom() = rRect.Height;
245 :
246 11410 : return aRect;
247 : }
248 :
249 11470 : bool equalRectangles( const css::awt::Rectangle& rRect1,
250 : const css::awt::Rectangle& rRect2 )
251 : {
252 22890 : return (( rRect1.X == rRect2.X ) &&
253 17583 : ( rRect1.Y == rRect2.Y ) &&
254 23796 : ( rRect1.Width == rRect2.Width ) &&
255 17633 : ( rRect1.Height == rRect2.Height ));
256 : }
257 :
258 6594 : 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 6594 : uno::Reference< frame::XModel > xModel;
262 6594 : if ( rFrame.is() )
263 : {
264 3315 : uno::Reference< frame::XController > xController( rFrame->getController(), uno::UNO_QUERY );
265 3315 : if ( xController.is() )
266 3311 : xModel = xController->getModel();
267 : }
268 :
269 6594 : return xModel;
270 : }
271 :
272 3299 : bool implts_isPreviewModel( const uno::Reference< frame::XModel >& xModel )
273 : {
274 3299 : if ( xModel.is() )
275 : {
276 15 : utl::MediaDescriptor aDesc( xModel->getArgs() );
277 15 : return aDesc.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_PREVIEW(), false);
278 : }
279 : else
280 3284 : return false;
281 : }
282 :
283 16157 : bool implts_isFrameOrWindowTop( const uno::Reference< frame::XFrame >& xFrame )
284 : {
285 16157 : if (xFrame->isTop())
286 16156 : return true;
287 :
288 1 : uno::Reference< awt::XTopWindow > xWindowCheck(xFrame->getContainerWindow(), uno::UNO_QUERY); // dont use _THROW here ... it's a check only
289 1 : if (xWindowCheck.is())
290 : {
291 : // #i76867# top and system window is required.
292 1 : SolarMutexGuard aGuard;
293 2 : uno::Reference< awt::XWindow > xWindow( xWindowCheck, uno::UNO_QUERY );
294 1 : vcl::Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
295 2 : 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 : } // namespace framework
357 :
358 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|