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 "vclxdialog.hxx" 25 26 #include <com/sun/star/awt/PosSize.hpp> 27 #include <com/sun/star/awt/SystemDependentXWindow.hpp> 28 #include <com/sun/star/lang/SystemDependent.hpp> 29 30 #include <cppuhelper/typeprovider.hxx> 31 32 #include <toolkit/awt/vclxmenu.hxx> 33 #include <toolkit/helper/macros.hxx> 34 #include <toolkit/helper/property.hxx> 35 36 #ifdef WNT 37 #include <tools/prewin.h> 38 #include <windows.h> 39 #include <tools/postwin.h> 40 #elif defined ( OS2 ) 41 #include <svpm.h> 42 #elif defined ( QUARTZ ) 43 #include "premac.h" 44 #include <Cocoa/Cocoa.h> 45 #include "postmac.h" 46 #endif 47 48 #include <vcl/dialog.hxx> 49 #include <vcl/msgbox.hxx> 50 #include <vcl/svapp.hxx> 51 #include <vcl/sysdata.hxx> 52 #include <vcl/wrkwin.hxx> 53 54 #include "forward.hxx" 55 56 namespace layoutimpl 57 { 58 59 DBG_NAME( VCLXDialog ) 60 61 VCLXDialog::VCLXDialog() 62 : VCLXWindow() 63 , VCLXTopWindow_Base( true ) 64 , VCLXDialog_Base() 65 , Bin() 66 , bRealized( false ) 67 , bResizeSafeguard( false ) 68 { 69 DBG_CTOR( VCLXDialog, NULL ); 70 71 /* mxLayoutUnit = uno::Reference< awt::XLayoutUnit >( new LayoutUnit() ); 72 assert(mxLayoutUnit.is());*/ 73 } 74 75 VCLXDialog::~VCLXDialog() 76 { 77 DBG_DTOR( VCLXDialog, NULL ); 78 } 79 80 vos::IMutex& VCLXDialog::GetMutexImpl() 81 { 82 return VCLXWindow::GetMutex(); 83 } 84 85 Window* VCLXDialog::GetWindowImpl() 86 { 87 return VCLXWindow::GetWindow(); 88 } 89 90 ::cppu::OInterfaceContainerHelper& VCLXDialog::GetTopWindowListenersImpl() 91 { 92 return GetTopWindowListeners(); 93 } 94 95 IMPLEMENT_2_FORWARD_XINTERFACE2( VCLXDialog, VCLXWindow, Bin, VCLXDialog_Base ); 96 97 IMPLEMENT_FORWARD_XTYPEPROVIDER2( VCLXDialog, VCLXWindow, VCLXDialog_Base ); 98 99 void SAL_CALL VCLXDialog::dispose() throw(::com::sun::star::uno::RuntimeException) 100 { 101 { 102 ::vos::OGuard aGuard( GetMutex() ); 103 104 ::com::sun::star::lang::EventObject aDisposeEvent; 105 aDisposeEvent.Source = W3K_EXPLICIT_CAST (*this); 106 // maTabListeners.disposeAndClear( aDisposeEvent ); 107 } 108 109 VCLXWindow::dispose(); 110 } 111 112 void VCLXDialog::resizedCb() 113 { 114 queueResize(); 115 } 116 117 void SAL_CALL VCLXDialog::allocateArea( const css::awt::Rectangle &rArea ) 118 throw (css::uno::RuntimeException) 119 { 120 ::com::sun::star::awt::Size reqSize = Bin::getMinimumSize(); 121 reqSize.Height = getHeightForWidth( rArea.Width ); 122 123 if ( !bRealized ) 124 { 125 setPosSize( 0, 0, reqSize.Width, reqSize.Height, ::com::sun::star::awt::PosSize::SIZE ); 126 bRealized = true; 127 setVisible( true ); 128 } 129 else 130 { 131 ::com::sun::star::awt::Size curSize = getSize(); 132 if ( reqSize.Width > curSize.Width ) 133 setPosSize( 0, 0, reqSize.Width, 0, ::com::sun::star::awt::PosSize::WIDTH ); 134 if ( reqSize.Height > curSize.Height ) 135 setPosSize( 0, 0, 0, reqSize.Height, ::com::sun::star::awt::PosSize::HEIGHT ); 136 } 137 138 ::com::sun::star::awt::Size size = getSize(); 139 maAllocation.Width = size.Width; 140 maAllocation.Height = size.Height; 141 142 Bin::allocateArea( maAllocation ); 143 } 144 145 void VCLXDialog::ProcessWindowEvent( const VclWindowEvent& _rVclWindowEvent ) 146 { 147 ::vos::OClearableGuard aGuard( GetMutex() ); 148 149 switch ( _rVclWindowEvent.GetId() ) 150 { 151 case VCLEVENT_WINDOW_RESIZE: 152 resizedCb(); 153 default: 154 aGuard.clear(); 155 VCLXWindow::ProcessWindowEvent( _rVclWindowEvent ); 156 break; 157 } 158 } 159 160 void SAL_CALL VCLXDialog::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any &Value ) throw(::com::sun::star::uno::RuntimeException) 161 { 162 ::vos::OGuard aGuard( GetMutex() ); 163 164 if ( GetWindow() ) 165 { 166 /* sal_uInt16 nPropertyId = GetPropertyId( PropertyName ); 167 switch ( nPropertyId ) 168 { 169 default: 170 */ 171 VCLXWindow::setProperty( PropertyName, Value ); 172 /* } 173 */ 174 } 175 } 176 177 ::com::sun::star::uno::Any SAL_CALL VCLXDialog::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException) 178 { 179 ::vos::OGuard aGuard( GetMutex() ); 180 181 ::com::sun::star::uno::Any aReturn; 182 if ( GetWindow() ) 183 { 184 /* 185 sal_uInt16 nPropertyId = GetPropertyId( PropertyName ); 186 switch ( nPropertyId ) 187 { 188 default: 189 */ 190 aReturn = VCLXWindow::getProperty( PropertyName ); 191 /* 192 } 193 */ 194 } 195 return aReturn; 196 } 197 198 void VCLXDialog::setTitle( const ::rtl::OUString& Title ) throw(::com::sun::star::uno::RuntimeException) 199 { 200 ::vos::OGuard aGuard( GetMutex() ); 201 202 Window* pWindow = GetWindow(); 203 if ( pWindow ) 204 pWindow->SetText( Title ); 205 } 206 207 void VCLXDialog::setHelpId( const rtl::OUString& rId ) throw(::com::sun::star::uno::RuntimeException) 208 { 209 ::vos::OGuard aGuard( GetMutex() ); 210 211 Window* pWindow = GetWindow(); 212 if ( pWindow ) 213 pWindow->SetHelpId( rtl::OUStringToOString( rId, RTL_TEXTENCODING_UTF8 ) ); 214 } 215 216 ::rtl::OUString VCLXDialog::getTitle() throw(::com::sun::star::uno::RuntimeException) 217 { 218 ::vos::OGuard aGuard( GetMutex() ); 219 220 ::rtl::OUString aTitle; 221 Window* pWindow = GetWindow(); 222 if ( pWindow ) 223 aTitle = pWindow->GetText(); 224 return aTitle; 225 } 226 227 sal_Int16 VCLXDialog::execute() throw(::com::sun::star::uno::RuntimeException) 228 { 229 ::vos::OGuard aGuard( GetMutex() ); 230 231 sal_Int16 nRet = 0; 232 if ( GetWindow() ) 233 { 234 Dialog* pDlg = (Dialog*) GetWindow(); 235 Window* pParent = pDlg->GetWindow( WINDOW_PARENTOVERLAP ); 236 Window* pOldParent = NULL; 237 if ( pParent && !pParent->IsReallyVisible() ) 238 { 239 pOldParent = pDlg->GetParent(); 240 Window* pFrame = pDlg->GetWindow( WINDOW_FRAME ); 241 if ( pFrame != pDlg ) 242 pDlg->SetParent( pFrame ); 243 } 244 nRet = pDlg->Execute(); 245 if ( pOldParent ) 246 pDlg->SetParent( pOldParent ); 247 } 248 return nRet; 249 } 250 251 void VCLXDialog::endDialog( sal_Int32 nResult ) throw(::com::sun::star::uno::RuntimeException) 252 { 253 ::vos::OGuard aGuard( GetMutex() ); 254 255 if ( nResult == BUTTONID_HELP ) 256 { 257 // UGH: c&p button.cxx 258 ::Window* pFocusWin = Application::GetFocusWindow(); 259 if ( !pFocusWin ) 260 pFocusWin = GetWindow(); 261 262 HelpEvent aEvt( pFocusWin->GetPointerPosPixel(), HELPMODE_CONTEXT ); 263 pFocusWin->RequestHelp( aEvt ); 264 return; 265 } 266 267 Dialog* pDlg = (Dialog*) GetWindow(); 268 if ( pDlg ) 269 pDlg->EndDialog( nResult ); 270 } 271 272 void VCLXDialog::endExecute() throw(::com::sun::star::uno::RuntimeException) 273 { 274 endDialog( 0 ); 275 } 276 277 } // namespace layoutimpl 278