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 //***************************************************************************************************************** 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 //***************************************************************************************************************** 86 DockingAreaDefaultAcceptor::~DockingAreaDefaultAcceptor() 87 { 88 } 89 90 //***************************************************************************************************************** 91 // XDockingAreaAcceptor 92 //***************************************************************************************************************** 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 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 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