xref: /AOO41X/main/framework/source/helper/dockingareadefaultacceptor.cxx (revision 6d739b60ff8f4ed2134ae1442e284f9da90334b4)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_framework.hxx"
26 
27 //_________________________________________________________________________________________________________________
28 //  my own includes
29 //_________________________________________________________________________________________________________________
30 #include <helper/dockingareadefaultacceptor.hxx>
31 #include <threadhelp/resetableguard.hxx>
32 
33 //_________________________________________________________________________________________________________________
34 //  interface includes
35 //_________________________________________________________________________________________________________________
36 #include <com/sun/star/awt/XDevice.hpp>
37 #include <com/sun/star/awt/PosSize.hpp>
38 #include <com/sun/star/awt/XLayoutConstrains.hpp>
39 
40 //_________________________________________________________________________________________________________________
41 //  includes of other projects
42 //_________________________________________________________________________________________________________________
43 
44 #include <vcl/svapp.hxx>
45 
46 //_________________________________________________________________________________________________________________
47 //  namespace
48 //_________________________________________________________________________________________________________________
49 
50 namespace framework{
51 
52 using namespace ::com::sun::star::container     ;
53 using namespace ::com::sun::star::frame         ;
54 using namespace ::com::sun::star::lang          ;
55 using namespace ::com::sun::star::uno           ;
56 using namespace ::cppu                          ;
57 using namespace ::osl                           ;
58 using namespace ::rtl                           ;
59 
60 //_________________________________________________________________________________________________________________
61 //  non exported const
62 //_________________________________________________________________________________________________________________
63 
64 //_________________________________________________________________________________________________________________
65 //  non exported definitions
66 //_________________________________________________________________________________________________________________
67 
68 //_________________________________________________________________________________________________________________
69 //  declarations
70 //_________________________________________________________________________________________________________________
71 
72 //*****************************************************************************************************************
73 //  constructor
74 //*****************************************************************************************************************
DockingAreaDefaultAcceptor(const css::uno::Reference<XFrame> & xOwner)75 DockingAreaDefaultAcceptor::DockingAreaDefaultAcceptor( const   css::uno::Reference< XFrame >&      xOwner  )
76         //  Init baseclasses first
77         :   ThreadHelpBase  ( &Application::GetSolarMutex() )
78         // Init member
79         ,   m_xOwner        ( xOwner    )
80 {
81 }
82 
83 //*****************************************************************************************************************
84 //  destructor
85 //*****************************************************************************************************************
~DockingAreaDefaultAcceptor()86 DockingAreaDefaultAcceptor::~DockingAreaDefaultAcceptor()
87 {
88 }
89 
90 //*****************************************************************************************************************
91 //  XDockingAreaAcceptor
92 //*****************************************************************************************************************
getContainerWindow()93 css::uno::Reference< css::awt::XWindow > SAL_CALL DockingAreaDefaultAcceptor::getContainerWindow() throw (css::uno::RuntimeException)
94 {
95     // Ready for multithreading
96     ResetableGuard aGuard( m_aLock );
97 
98     // Try to "lock" the frame for access to taskscontainer.
99     css::uno::Reference< XFrame > xFrame( m_xOwner.get(), UNO_QUERY );
100     css::uno::Reference< css::awt::XWindow > xContainerWindow( xFrame->getContainerWindow() );
101 
102     return xContainerWindow;
103 }
104 
requestDockingAreaSpace(const css::awt::Rectangle & RequestedSpace)105 sal_Bool SAL_CALL DockingAreaDefaultAcceptor::requestDockingAreaSpace( const css::awt::Rectangle& RequestedSpace ) throw (css::uno::RuntimeException)
106 {
107     // Ready for multithreading
108     ResetableGuard aGuard( m_aLock );
109 
110     // Try to "lock" the frame for access to taskscontainer.
111     css::uno::Reference< XFrame > xFrame( m_xOwner.get(), UNO_QUERY );
112     aGuard.unlock();
113 
114     if ( xFrame.is() == sal_True )
115     {
116         css::uno::Reference< css::awt::XWindow > xContainerWindow( xFrame->getContainerWindow() );
117         css::uno::Reference< css::awt::XWindow > xComponentWindow( xFrame->getComponentWindow() );
118 
119         if (( xContainerWindow.is() == sal_True ) &&
120             ( xComponentWindow.is() == sal_True )       )
121         {
122             css::uno::Reference< css::awt::XDevice > xDevice( xContainerWindow, css::uno::UNO_QUERY );
123             // Convert relativ size to output size.
124             css::awt::Rectangle  aRectangle  = xContainerWindow->getPosSize();
125             css::awt::DeviceInfo aInfo       = xDevice->getInfo();
126             css::awt::Size       aSize       (  aRectangle.Width  - aInfo.LeftInset - aInfo.RightInset  ,
127                                                 aRectangle.Height - aInfo.TopInset  - aInfo.BottomInset );
128 
129             // client size of container window
130 //            css::uno::Reference< css::awt::XLayoutConstrains > xLayoutContrains( xComponentWindow, css::uno::UNO_QUERY );
131             css::awt::Size aMinSize( 0, 0 ); // = xLayoutContrains->getMinimumSize();
132 
133             // Check if request border space would decrease component window size below minimum size
134             if ((( aSize.Width - RequestedSpace.X - RequestedSpace.Width ) < aMinSize.Width ) ||
135                 (( aSize.Height - RequestedSpace.Y - RequestedSpace.Height ) < aMinSize.Height  )       )
136                 return sal_False;
137 
138             return sal_True;
139         }
140     }
141 
142     return sal_False;
143 }
144 
setDockingAreaSpace(const css::awt::Rectangle & BorderSpace)145 void SAL_CALL DockingAreaDefaultAcceptor::setDockingAreaSpace( const css::awt::Rectangle& BorderSpace ) throw (css::uno::RuntimeException)
146 {
147     // Ready for multithreading
148     ResetableGuard aGuard( m_aLock );
149 
150     // Try to "lock" the frame for access to taskscontainer.
151     css::uno::Reference< XFrame > xFrame( m_xOwner.get(), UNO_QUERY );
152     if ( xFrame.is() == sal_True )
153     {
154         css::uno::Reference< css::awt::XWindow > xContainerWindow( xFrame->getContainerWindow() );
155         css::uno::Reference< css::awt::XWindow > xComponentWindow( xFrame->getComponentWindow() );
156 
157         if (( xContainerWindow.is() == sal_True ) &&
158             ( xComponentWindow.is() == sal_True )       )
159         {
160             css::uno::Reference< css::awt::XDevice > xDevice( xContainerWindow, css::uno::UNO_QUERY );
161             // Convert relativ size to output size.
162             css::awt::Rectangle  aRectangle  = xContainerWindow->getPosSize();
163             css::awt::DeviceInfo aInfo       = xDevice->getInfo();
164             css::awt::Size       aSize       (  aRectangle.Width  - aInfo.LeftInset - aInfo.RightInset  ,
165                                                 aRectangle.Height - aInfo.TopInset  - aInfo.BottomInset );
166             // client size of container window
167 //            css::uno::Reference< css::awt::XLayoutConstrains > xLayoutContrains( xComponentWindow, css::uno::UNO_QUERY );
168             css::awt::Size aMinSize( 0, 0 );// = xLayoutContrains->getMinimumSize();
169 
170             // Check if request border space would decrease component window size below minimum size
171             sal_Int32 nWidth     = aSize.Width - BorderSpace.X - BorderSpace.Width;
172             sal_Int32 nHeight    = aSize.Height - BorderSpace.Y - BorderSpace.Height;
173 
174             if (( nWidth > aMinSize.Width ) && ( nHeight > aMinSize.Height ))
175             {
176                 // Resize our component window.
177                 xComponentWindow->setPosSize( BorderSpace.X, BorderSpace.Y, nWidth, nHeight, css::awt::PosSize::POSSIZE );
178             }
179         }
180     }
181 }
182 
183 } // namespace framework
184