1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_vcl.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <string.h> 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #include <tools/debug.hxx> 34*cdf0e10cSrcweir #include <tools/svwin.h> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include <vcl/svapp.hxx> 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir #include <win/wincomp.hxx> 39*cdf0e10cSrcweir #include <win/saldata.hxx> 40*cdf0e10cSrcweir #include <win/salinst.h> 41*cdf0e10cSrcweir #include <win/salframe.h> 42*cdf0e10cSrcweir #include <win/salobj.h> 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir // ======================================================================= 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir static sal_Bool ImplIsSysWindowOrChild( HWND hWndParent, HWND hWndChild ) 47*cdf0e10cSrcweir { 48*cdf0e10cSrcweir if ( hWndParent == hWndChild ) 49*cdf0e10cSrcweir return TRUE; 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir HWND hTempWnd = ::GetParent( hWndChild ); 52*cdf0e10cSrcweir while ( hTempWnd ) 53*cdf0e10cSrcweir { 54*cdf0e10cSrcweir // Ab nicht Child-Fenstern hoeren wir auf zu suchen 55*cdf0e10cSrcweir if ( !(GetWindowStyle( hTempWnd ) & WS_CHILD) ) 56*cdf0e10cSrcweir return FALSE; 57*cdf0e10cSrcweir if ( hTempWnd == hWndParent ) 58*cdf0e10cSrcweir return TRUE; 59*cdf0e10cSrcweir hTempWnd = ::GetParent( hTempWnd ); 60*cdf0e10cSrcweir } 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir return FALSE; 63*cdf0e10cSrcweir } 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir // ----------------------------------------------------------------------- 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir WinSalObject* ImplFindSalObject( HWND hWndChild ) 68*cdf0e10cSrcweir { 69*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 70*cdf0e10cSrcweir WinSalObject* pObject = pSalData->mpFirstObject; 71*cdf0e10cSrcweir while ( pObject ) 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir if ( ImplIsSysWindowOrChild( pObject->mhWndChild, hWndChild ) ) 74*cdf0e10cSrcweir return pObject; 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir pObject = pObject->mpNextObject; 77*cdf0e10cSrcweir } 78*cdf0e10cSrcweir 79*cdf0e10cSrcweir return NULL; 80*cdf0e10cSrcweir } 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir // ----------------------------------------------------------------------- 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir WinSalFrame* ImplFindSalObjectFrame( HWND hWnd ) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir WinSalFrame* pFrame = NULL; 87*cdf0e10cSrcweir WinSalObject* pObject = ImplFindSalObject( hWnd ); 88*cdf0e10cSrcweir if ( pObject ) 89*cdf0e10cSrcweir { 90*cdf0e10cSrcweir // Dazugehoerenden Frame suchen 91*cdf0e10cSrcweir HWND hWnd = ::GetParent( pObject->mhWnd ); 92*cdf0e10cSrcweir pFrame = GetSalData()->mpFirstFrame; 93*cdf0e10cSrcweir while ( pFrame ) 94*cdf0e10cSrcweir { 95*cdf0e10cSrcweir if ( pFrame->mhWnd == hWnd ) 96*cdf0e10cSrcweir break; 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir pFrame = pFrame->mpNextFrame; 99*cdf0e10cSrcweir } 100*cdf0e10cSrcweir } 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir return pFrame; 103*cdf0e10cSrcweir } 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir // ----------------------------------------------------------------------- 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir sal_Bool ImplInterceptChildWindowKeyDown( MSG& rMsg ) 108*cdf0e10cSrcweir { 109*cdf0e10cSrcweir sal_Bool bResult = sal_False; 110*cdf0e10cSrcweir if ( rMsg.message == WM_KEYDOWN ) 111*cdf0e10cSrcweir { 112*cdf0e10cSrcweir wchar_t pClassName[10]; 113*cdf0e10cSrcweir sal_Int32 nLen = GetClassNameW( rMsg.hwnd, pClassName, 10 ); 114*cdf0e10cSrcweir if ( !( nLen == 9 && wcsncmp( pClassName, SAL_OBJECT_CLASSNAMEW, nLen ) == 0 ) ) 115*cdf0e10cSrcweir { 116*cdf0e10cSrcweir // look for the first SalObject in the parent hierarchy 117*cdf0e10cSrcweir HWND hWin = rMsg.hwnd; 118*cdf0e10cSrcweir HWND hLastOLEWindow = hWin; 119*cdf0e10cSrcweir WinSalObject* pSalObj = NULL; 120*cdf0e10cSrcweir do 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir hLastOLEWindow = hWin; 123*cdf0e10cSrcweir hWin = ::GetParent( hWin ); 124*cdf0e10cSrcweir if ( hWin ) 125*cdf0e10cSrcweir { 126*cdf0e10cSrcweir nLen = GetClassNameW( hWin, pClassName, 10 ); 127*cdf0e10cSrcweir if ( nLen == 9 && wcsncmp( pClassName, SAL_OBJECT_CLASSNAMEW, nLen ) == 0 ) 128*cdf0e10cSrcweir pSalObj = GetSalObjWindowPtr( hWin ); 129*cdf0e10cSrcweir } 130*cdf0e10cSrcweir } while( hWin && !pSalObj ); 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir if ( pSalObj && pSalObj->mbInterceptChildWindowKeyDown && pSalObj->maSysData.hWnd ) 133*cdf0e10cSrcweir { 134*cdf0e10cSrcweir bResult = ( 1 == ImplSendMessage( pSalObj->maSysData.hWnd, rMsg.message, rMsg.wParam, rMsg.lParam ) ); 135*cdf0e10cSrcweir } 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir } 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir return bResult; 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir // ----------------------------------------------------------------------- 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir // ----------------------------------------------------------------------- 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir LRESULT CALLBACK SalSysMsgProc( int nCode, WPARAM wParam, LPARAM lParam ) 148*cdf0e10cSrcweir { 149*cdf0e10cSrcweir // Used for Unicode and none Unicode 150*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 151*cdf0e10cSrcweir 152*cdf0e10cSrcweir if ( (nCode >= 0) && lParam ) 153*cdf0e10cSrcweir { 154*cdf0e10cSrcweir CWPSTRUCT* pData = (CWPSTRUCT*)lParam; 155*cdf0e10cSrcweir if ( (pData->message != WM_KEYDOWN) && 156*cdf0e10cSrcweir (pData->message != WM_KEYUP) ) 157*cdf0e10cSrcweir pSalData->mnSalObjWantKeyEvt = 0; 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir // Testen, ob wir Daten fuer ein SalObject-Fenster behandeln 160*cdf0e10cSrcweir // muessen 161*cdf0e10cSrcweir WinSalObject* pObject; 162*cdf0e10cSrcweir if ( pData->message == WM_SETFOCUS ) 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir pObject = ImplFindSalObject( pData->hwnd ); 165*cdf0e10cSrcweir if ( pObject ) 166*cdf0e10cSrcweir { 167*cdf0e10cSrcweir pObject->mhLastFocusWnd = pData->hwnd; 168*cdf0e10cSrcweir if ( ImplSalYieldMutexTryToAcquire() ) 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir pObject->CallCallback( SALOBJ_EVENT_GETFOCUS, 0 ); 171*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir else 174*cdf0e10cSrcweir ImplPostMessage( pObject->mhWnd, SALOBJ_MSG_POSTFOCUS, 0, 0 ); 175*cdf0e10cSrcweir } 176*cdf0e10cSrcweir } 177*cdf0e10cSrcweir else if ( pData->message == WM_KILLFOCUS ) 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir pObject = ImplFindSalObject( pData->hwnd ); 180*cdf0e10cSrcweir if ( pObject && !ImplFindSalObject( (HWND)pData->wParam ) ) 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir // LoseFocus nur rufen, wenn wirklich kein ChildFenster 183*cdf0e10cSrcweir // den Focus bekommt 184*cdf0e10cSrcweir if ( !pData->wParam || !ImplFindSalObject( (HWND)pData->wParam ) ) 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir if ( ImplSalYieldMutexTryToAcquire() ) 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir pObject->CallCallback( SALOBJ_EVENT_LOSEFOCUS, 0 ); 189*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir else 192*cdf0e10cSrcweir ImplPostMessage( pObject->mhWnd, SALOBJ_MSG_POSTFOCUS, 0, 0 ); 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir else 195*cdf0e10cSrcweir pObject->mhLastFocusWnd = (HWND)pData->wParam; 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir } 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir return CallNextHookEx( pSalData->mhSalObjMsgHook, nCode, wParam, lParam ); 201*cdf0e10cSrcweir } 202*cdf0e10cSrcweir 203*cdf0e10cSrcweir // ----------------------------------------------------------------------- 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir sal_Bool ImplSalPreDispatchMsg( MSG* pMsg ) 206*cdf0e10cSrcweir { 207*cdf0e10cSrcweir // Used for Unicode and none Unicode 208*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 209*cdf0e10cSrcweir WinSalObject* pObject; 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir if ( (pMsg->message == WM_LBUTTONDOWN) || 212*cdf0e10cSrcweir (pMsg->message == WM_RBUTTONDOWN) || 213*cdf0e10cSrcweir (pMsg->message == WM_MBUTTONDOWN) ) 214*cdf0e10cSrcweir { 215*cdf0e10cSrcweir ImplSalYieldMutexAcquireWithWait(); 216*cdf0e10cSrcweir pObject = ImplFindSalObject( pMsg->hwnd ); 217*cdf0e10cSrcweir if ( pObject && !pObject->IsMouseTransparent() ) 218*cdf0e10cSrcweir ImplPostMessage( pObject->mhWnd, SALOBJ_MSG_TOTOP, 0, 0 ); 219*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir if ( (pMsg->message == WM_KEYDOWN) || 223*cdf0e10cSrcweir (pMsg->message == WM_KEYUP) ) 224*cdf0e10cSrcweir { 225*cdf0e10cSrcweir // KeyEvents wollen wir nach Moeglichkeit auch abarbeiten, 226*cdf0e10cSrcweir // wenn das Control diese nicht selber auswertet 227*cdf0e10cSrcweir // SysKeys werden als WM_SYSCOMMAND verarbeitet 228*cdf0e10cSrcweir // Char-Events verarbeiten wir nicht, da wir nur 229*cdf0e10cSrcweir // Accelerator relevante Keys verarbeiten wollen 230*cdf0e10cSrcweir sal_Bool bWantedKeyCode = FALSE; 231*cdf0e10cSrcweir // A-Z, 0-9 nur in Verbindung mit Control-Taste 232*cdf0e10cSrcweir if ( ((pMsg->wParam >= 65) && (pMsg->wParam <= 90)) || 233*cdf0e10cSrcweir ((pMsg->wParam >= 48) && (pMsg->wParam <= 57)) ) 234*cdf0e10cSrcweir { 235*cdf0e10cSrcweir if ( GetKeyState( VK_CONTROL ) & 0x8000 ) 236*cdf0e10cSrcweir bWantedKeyCode = TRUE; 237*cdf0e10cSrcweir } 238*cdf0e10cSrcweir else if ( ((pMsg->wParam >= VK_F1) && (pMsg->wParam <= VK_F24)) || 239*cdf0e10cSrcweir ((pMsg->wParam >= VK_SPACE) && (pMsg->wParam <= VK_HELP)) || 240*cdf0e10cSrcweir (pMsg->wParam == VK_BACK) || (pMsg->wParam == VK_TAB) || 241*cdf0e10cSrcweir (pMsg->wParam == VK_CLEAR) || (pMsg->wParam == VK_RETURN) || 242*cdf0e10cSrcweir (pMsg->wParam == VK_ESCAPE) ) 243*cdf0e10cSrcweir bWantedKeyCode = TRUE; 244*cdf0e10cSrcweir if ( bWantedKeyCode ) 245*cdf0e10cSrcweir { 246*cdf0e10cSrcweir ImplSalYieldMutexAcquireWithWait(); 247*cdf0e10cSrcweir pObject = ImplFindSalObject( pMsg->hwnd ); 248*cdf0e10cSrcweir if ( pObject ) 249*cdf0e10cSrcweir pSalData->mnSalObjWantKeyEvt = pMsg->wParam; 250*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir } 253*cdf0e10cSrcweir // Hier WM_SYSCHAR abfangen, um mit Alt+Taste evtl. Menu zu aktivieren 254*cdf0e10cSrcweir else if ( pMsg->message == WM_SYSCHAR ) 255*cdf0e10cSrcweir { 256*cdf0e10cSrcweir pSalData->mnSalObjWantKeyEvt = 0; 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir sal_uInt16 nKeyCode = LOWORD( pMsg->wParam ); 259*cdf0e10cSrcweir // Nur 0-9 und A-Z 260*cdf0e10cSrcweir if ( ((nKeyCode >= 48) && (nKeyCode <= 57)) || 261*cdf0e10cSrcweir ((nKeyCode >= 65) && (nKeyCode <= 90)) || 262*cdf0e10cSrcweir ((nKeyCode >= 97) && (nKeyCode <= 122)) ) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir sal_Bool bRet = FALSE; 265*cdf0e10cSrcweir ImplSalYieldMutexAcquireWithWait(); 266*cdf0e10cSrcweir pObject = ImplFindSalObject( pMsg->hwnd ); 267*cdf0e10cSrcweir if ( pObject ) 268*cdf0e10cSrcweir { 269*cdf0e10cSrcweir if ( pMsg->hwnd == ::GetFocus() ) 270*cdf0e10cSrcweir { 271*cdf0e10cSrcweir WinSalFrame* pFrame = ImplFindSalObjectFrame( pMsg->hwnd ); 272*cdf0e10cSrcweir if ( pFrame ) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir if ( ImplHandleSalObjSysCharMsg( pFrame->mhWnd, pMsg->wParam, pMsg->lParam ) ) 275*cdf0e10cSrcweir bRet = TRUE; 276*cdf0e10cSrcweir } 277*cdf0e10cSrcweir } 278*cdf0e10cSrcweir } 279*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 280*cdf0e10cSrcweir if ( bRet ) 281*cdf0e10cSrcweir return TRUE; 282*cdf0e10cSrcweir } 283*cdf0e10cSrcweir } 284*cdf0e10cSrcweir else 285*cdf0e10cSrcweir pSalData->mnSalObjWantKeyEvt = 0; 286*cdf0e10cSrcweir 287*cdf0e10cSrcweir return FALSE; 288*cdf0e10cSrcweir } 289*cdf0e10cSrcweir 290*cdf0e10cSrcweir // ----------------------------------------------------------------------- 291*cdf0e10cSrcweir 292*cdf0e10cSrcweir void ImplSalPostDispatchMsg( MSG* pMsg, LRESULT /* nDispatchResult */ ) 293*cdf0e10cSrcweir { 294*cdf0e10cSrcweir // Used for Unicode and none Unicode 295*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 296*cdf0e10cSrcweir WinSalFrame* pFrame; 297*cdf0e10cSrcweir 298*cdf0e10cSrcweir if ( (pMsg->message == WM_KEYDOWN) || (pMsg->message == WM_KEYUP) ) 299*cdf0e10cSrcweir { 300*cdf0e10cSrcweir if ( pSalData->mnSalObjWantKeyEvt == pMsg->wParam ) 301*cdf0e10cSrcweir { 302*cdf0e10cSrcweir pSalData->mnSalObjWantKeyEvt = 0; 303*cdf0e10cSrcweir if ( pMsg->hwnd == ::GetFocus() ) 304*cdf0e10cSrcweir { 305*cdf0e10cSrcweir ImplSalYieldMutexAcquireWithWait(); 306*cdf0e10cSrcweir pFrame = ImplFindSalObjectFrame( pMsg->hwnd ); 307*cdf0e10cSrcweir if ( pFrame ) 308*cdf0e10cSrcweir ImplHandleSalObjKeyMsg( pFrame->mhWnd, pMsg->message, pMsg->wParam, pMsg->lParam ); 309*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 310*cdf0e10cSrcweir } 311*cdf0e10cSrcweir } 312*cdf0e10cSrcweir } 313*cdf0e10cSrcweir 314*cdf0e10cSrcweir pSalData->mnSalObjWantKeyEvt = 0; 315*cdf0e10cSrcweir } 316*cdf0e10cSrcweir 317*cdf0e10cSrcweir // ======================================================================= 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir LRESULT CALLBACK SalSysObjWndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam, int& rDef ) 320*cdf0e10cSrcweir { 321*cdf0e10cSrcweir WinSalObject* pSysObj; 322*cdf0e10cSrcweir LRESULT nRet = 0; 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir switch( nMsg ) 325*cdf0e10cSrcweir { 326*cdf0e10cSrcweir case WM_ERASEBKGND: 327*cdf0e10cSrcweir nRet = 1; 328*cdf0e10cSrcweir rDef = FALSE; 329*cdf0e10cSrcweir break; 330*cdf0e10cSrcweir case WM_PAINT: 331*cdf0e10cSrcweir { 332*cdf0e10cSrcweir PAINTSTRUCT aPs; 333*cdf0e10cSrcweir BeginPaint( hWnd, &aPs ); 334*cdf0e10cSrcweir EndPaint( hWnd, &aPs ); 335*cdf0e10cSrcweir rDef = FALSE; 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir break; 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir case WM_PARENTNOTIFY: 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir UINT nNotifyMsg = LOWORD( wParam ); 342*cdf0e10cSrcweir if ( (nNotifyMsg == WM_LBUTTONDOWN) || 343*cdf0e10cSrcweir (nNotifyMsg == WM_RBUTTONDOWN) || 344*cdf0e10cSrcweir (nNotifyMsg == WM_MBUTTONDOWN) ) 345*cdf0e10cSrcweir { 346*cdf0e10cSrcweir ImplSalYieldMutexAcquireWithWait(); 347*cdf0e10cSrcweir pSysObj = GetSalObjWindowPtr( hWnd ); 348*cdf0e10cSrcweir if ( pSysObj && !pSysObj->IsMouseTransparent() ) 349*cdf0e10cSrcweir pSysObj->CallCallback( SALOBJ_EVENT_TOTOP, 0 ); 350*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 351*cdf0e10cSrcweir } 352*cdf0e10cSrcweir } 353*cdf0e10cSrcweir break; 354*cdf0e10cSrcweir 355*cdf0e10cSrcweir case WM_MOUSEACTIVATE: 356*cdf0e10cSrcweir { 357*cdf0e10cSrcweir ImplSalYieldMutexAcquireWithWait(); 358*cdf0e10cSrcweir pSysObj = GetSalObjWindowPtr( hWnd ); 359*cdf0e10cSrcweir if ( pSysObj && !pSysObj->IsMouseTransparent() ) 360*cdf0e10cSrcweir ImplPostMessage( hWnd, SALOBJ_MSG_TOTOP, 0, 0 ); 361*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 362*cdf0e10cSrcweir } 363*cdf0e10cSrcweir break; 364*cdf0e10cSrcweir 365*cdf0e10cSrcweir case SALOBJ_MSG_TOTOP: 366*cdf0e10cSrcweir if ( ImplSalYieldMutexTryToAcquire() ) 367*cdf0e10cSrcweir { 368*cdf0e10cSrcweir pSysObj = GetSalObjWindowPtr( hWnd ); 369*cdf0e10cSrcweir pSysObj->CallCallback( SALOBJ_EVENT_TOTOP, 0 ); 370*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 371*cdf0e10cSrcweir rDef = FALSE; 372*cdf0e10cSrcweir } 373*cdf0e10cSrcweir else 374*cdf0e10cSrcweir ImplPostMessage( hWnd, SALOBJ_MSG_TOTOP, 0, 0 ); 375*cdf0e10cSrcweir break; 376*cdf0e10cSrcweir 377*cdf0e10cSrcweir case SALOBJ_MSG_POSTFOCUS: 378*cdf0e10cSrcweir if ( ImplSalYieldMutexTryToAcquire() ) 379*cdf0e10cSrcweir { 380*cdf0e10cSrcweir pSysObj = GetSalObjWindowPtr( hWnd ); 381*cdf0e10cSrcweir HWND hFocusWnd = ::GetFocus(); 382*cdf0e10cSrcweir sal_uInt16 nEvent; 383*cdf0e10cSrcweir if ( hFocusWnd && ImplIsSysWindowOrChild( hWnd, hFocusWnd ) ) 384*cdf0e10cSrcweir nEvent = SALOBJ_EVENT_GETFOCUS; 385*cdf0e10cSrcweir else 386*cdf0e10cSrcweir nEvent = SALOBJ_EVENT_LOSEFOCUS; 387*cdf0e10cSrcweir pSysObj->CallCallback( nEvent, 0 ); 388*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 389*cdf0e10cSrcweir } 390*cdf0e10cSrcweir else 391*cdf0e10cSrcweir ImplPostMessage( hWnd, SALOBJ_MSG_POSTFOCUS, 0, 0 ); 392*cdf0e10cSrcweir rDef = FALSE; 393*cdf0e10cSrcweir break; 394*cdf0e10cSrcweir 395*cdf0e10cSrcweir case WM_SIZE: 396*cdf0e10cSrcweir { 397*cdf0e10cSrcweir HWND hWndChild = GetWindow( hWnd, GW_CHILD ); 398*cdf0e10cSrcweir if ( hWndChild ) 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir SetWindowPos( hWndChild, 401*cdf0e10cSrcweir 0, 0, 0, (int)LOWORD( lParam ), (int)HIWORD( lParam ), 402*cdf0e10cSrcweir SWP_NOZORDER | SWP_NOACTIVATE ); 403*cdf0e10cSrcweir } 404*cdf0e10cSrcweir } 405*cdf0e10cSrcweir rDef = FALSE; 406*cdf0e10cSrcweir break; 407*cdf0e10cSrcweir 408*cdf0e10cSrcweir case WM_CREATE: 409*cdf0e10cSrcweir { 410*cdf0e10cSrcweir // Window-Instanz am Windowhandle speichern 411*cdf0e10cSrcweir // Can also be used for the W-Version, because the struct 412*cdf0e10cSrcweir // to access lpCreateParams is the same structure 413*cdf0e10cSrcweir CREATESTRUCTA* pStruct = (CREATESTRUCTA*)lParam; 414*cdf0e10cSrcweir pSysObj = (WinSalObject*)pStruct->lpCreateParams; 415*cdf0e10cSrcweir SetSalObjWindowPtr( hWnd, pSysObj ); 416*cdf0e10cSrcweir // HWND schon hier setzen, da schon auf den Instanzdaten 417*cdf0e10cSrcweir // gearbeitet werden kann, wenn Messages waehrend 418*cdf0e10cSrcweir // CreateWindow() gesendet werden 419*cdf0e10cSrcweir pSysObj->mhWnd = hWnd; 420*cdf0e10cSrcweir rDef = FALSE; 421*cdf0e10cSrcweir } 422*cdf0e10cSrcweir break; 423*cdf0e10cSrcweir } 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir return nRet; 426*cdf0e10cSrcweir } 427*cdf0e10cSrcweir 428*cdf0e10cSrcweir LRESULT CALLBACK SalSysObjWndProcA( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ) 429*cdf0e10cSrcweir { 430*cdf0e10cSrcweir int bDef = TRUE; 431*cdf0e10cSrcweir LRESULT nRet = SalSysObjWndProc( hWnd, nMsg, wParam, lParam, bDef ); 432*cdf0e10cSrcweir if ( bDef ) 433*cdf0e10cSrcweir nRet = DefWindowProcA( hWnd, nMsg, wParam, lParam ); 434*cdf0e10cSrcweir return nRet; 435*cdf0e10cSrcweir } 436*cdf0e10cSrcweir 437*cdf0e10cSrcweir LRESULT CALLBACK SalSysObjWndProcW( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ) 438*cdf0e10cSrcweir { 439*cdf0e10cSrcweir int bDef = TRUE; 440*cdf0e10cSrcweir LRESULT nRet = SalSysObjWndProc( hWnd, nMsg, wParam, lParam, bDef ); 441*cdf0e10cSrcweir if ( bDef ) 442*cdf0e10cSrcweir nRet = DefWindowProcW( hWnd, nMsg, wParam, lParam ); 443*cdf0e10cSrcweir return nRet; 444*cdf0e10cSrcweir } 445*cdf0e10cSrcweir 446*cdf0e10cSrcweir // ----------------------------------------------------------------------- 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir LRESULT CALLBACK SalSysObjChildWndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam, int& rDef ) 449*cdf0e10cSrcweir { 450*cdf0e10cSrcweir LRESULT nRet = 0; 451*cdf0e10cSrcweir 452*cdf0e10cSrcweir switch( nMsg ) 453*cdf0e10cSrcweir { 454*cdf0e10cSrcweir // Wegen PlugIn's loeschen wir erstmal den Hintergrund 455*cdf0e10cSrcweir case WM_ERASEBKGND: 456*cdf0e10cSrcweir { 457*cdf0e10cSrcweir WinSalObject* pSysObj = GetSalObjWindowPtr( ::GetParent( hWnd ) ); 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir if( pSysObj && !pSysObj->IsEraseBackgroundEnabled() ) 460*cdf0e10cSrcweir { 461*cdf0e10cSrcweir // do not erase background 462*cdf0e10cSrcweir nRet = 1; 463*cdf0e10cSrcweir rDef = FALSE; 464*cdf0e10cSrcweir } 465*cdf0e10cSrcweir } 466*cdf0e10cSrcweir break; 467*cdf0e10cSrcweir 468*cdf0e10cSrcweir case WM_PAINT: 469*cdf0e10cSrcweir { 470*cdf0e10cSrcweir PAINTSTRUCT aPs; 471*cdf0e10cSrcweir BeginPaint( hWnd, &aPs ); 472*cdf0e10cSrcweir EndPaint( hWnd, &aPs ); 473*cdf0e10cSrcweir rDef = FALSE; 474*cdf0e10cSrcweir } 475*cdf0e10cSrcweir break; 476*cdf0e10cSrcweir 477*cdf0e10cSrcweir case WM_MOUSEMOVE: 478*cdf0e10cSrcweir case WM_LBUTTONDOWN: 479*cdf0e10cSrcweir case WM_MBUTTONDOWN: 480*cdf0e10cSrcweir case WM_RBUTTONDOWN: 481*cdf0e10cSrcweir case WM_LBUTTONUP: 482*cdf0e10cSrcweir case WM_MBUTTONUP: 483*cdf0e10cSrcweir case WM_RBUTTONUP: 484*cdf0e10cSrcweir { 485*cdf0e10cSrcweir WinSalObject* pSysObj; 486*cdf0e10cSrcweir pSysObj = GetSalObjWindowPtr( ::GetParent( hWnd ) ); 487*cdf0e10cSrcweir 488*cdf0e10cSrcweir if( pSysObj && pSysObj->IsMouseTransparent() ) 489*cdf0e10cSrcweir { 490*cdf0e10cSrcweir // forward mouse events to parent frame 491*cdf0e10cSrcweir HWND hWndParent = ::GetParent( pSysObj->mhWnd ); 492*cdf0e10cSrcweir 493*cdf0e10cSrcweir // transform coordinates 494*cdf0e10cSrcweir POINT pt; 495*cdf0e10cSrcweir pt.x = (long) LOWORD( lParam ); 496*cdf0e10cSrcweir pt.y = (long) HIWORD( lParam ); 497*cdf0e10cSrcweir MapWindowPoints( hWnd, hWndParent, &pt, 1 ); 498*cdf0e10cSrcweir lParam = MAKELPARAM( (WORD) pt.x, (WORD) pt.y ); 499*cdf0e10cSrcweir 500*cdf0e10cSrcweir nRet = ImplSendMessage( hWndParent, nMsg, wParam, lParam ); 501*cdf0e10cSrcweir rDef = FALSE; 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir } 504*cdf0e10cSrcweir break; 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir 507*cdf0e10cSrcweir return nRet; 508*cdf0e10cSrcweir } 509*cdf0e10cSrcweir 510*cdf0e10cSrcweir LRESULT CALLBACK SalSysObjChildWndProcA( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ) 511*cdf0e10cSrcweir { 512*cdf0e10cSrcweir int bDef = TRUE; 513*cdf0e10cSrcweir LRESULT nRet = SalSysObjChildWndProc( hWnd, nMsg, wParam, lParam, bDef ); 514*cdf0e10cSrcweir if ( bDef ) 515*cdf0e10cSrcweir nRet = DefWindowProcA( hWnd, nMsg, wParam, lParam ); 516*cdf0e10cSrcweir return nRet; 517*cdf0e10cSrcweir } 518*cdf0e10cSrcweir 519*cdf0e10cSrcweir LRESULT CALLBACK SalSysObjChildWndProcW( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ) 520*cdf0e10cSrcweir { 521*cdf0e10cSrcweir int bDef = TRUE; 522*cdf0e10cSrcweir LRESULT nRet = SalSysObjChildWndProc( hWnd, nMsg, wParam, lParam, bDef ); 523*cdf0e10cSrcweir if ( bDef ) 524*cdf0e10cSrcweir nRet = DefWindowProcW( hWnd, nMsg, wParam, lParam ); 525*cdf0e10cSrcweir return nRet; 526*cdf0e10cSrcweir } 527*cdf0e10cSrcweir 528*cdf0e10cSrcweir // ======================================================================= 529*cdf0e10cSrcweir 530*cdf0e10cSrcweir SalObject* ImplSalCreateObject( WinSalInstance* pInst, WinSalFrame* pParent ) 531*cdf0e10cSrcweir { 532*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 533*cdf0e10cSrcweir 534*cdf0e10cSrcweir // Hook installieren, wenn es das erste SalObject ist 535*cdf0e10cSrcweir if ( !pSalData->mpFirstObject ) 536*cdf0e10cSrcweir { 537*cdf0e10cSrcweir pSalData->mhSalObjMsgHook = SetWindowsHookExW( WH_CALLWNDPROC, 538*cdf0e10cSrcweir SalSysMsgProc, 539*cdf0e10cSrcweir pSalData->mhInst, 540*cdf0e10cSrcweir pSalData->mnAppThreadId ); 541*cdf0e10cSrcweir } 542*cdf0e10cSrcweir 543*cdf0e10cSrcweir if ( !pSalData->mbObjClassInit ) 544*cdf0e10cSrcweir { 545*cdf0e10cSrcweir // #95301# shockwave plugin has bug; expects ASCII functions to be used 546*cdf0e10cSrcweir if ( false )//aSalShlData.mbWNT ) 547*cdf0e10cSrcweir { 548*cdf0e10cSrcweir WNDCLASSEXW aWndClassEx; 549*cdf0e10cSrcweir aWndClassEx.cbSize = sizeof( aWndClassEx ); 550*cdf0e10cSrcweir aWndClassEx.style = 0; 551*cdf0e10cSrcweir aWndClassEx.lpfnWndProc = SalSysObjWndProcW; 552*cdf0e10cSrcweir aWndClassEx.cbClsExtra = 0; 553*cdf0e10cSrcweir aWndClassEx.cbWndExtra = SAL_OBJECT_WNDEXTRA; 554*cdf0e10cSrcweir aWndClassEx.hInstance = pSalData->mhInst; 555*cdf0e10cSrcweir aWndClassEx.hIcon = 0; 556*cdf0e10cSrcweir aWndClassEx.hIconSm = 0; 557*cdf0e10cSrcweir aWndClassEx.hCursor = LoadCursor( 0, IDC_ARROW ); 558*cdf0e10cSrcweir aWndClassEx.hbrBackground = 0; 559*cdf0e10cSrcweir aWndClassEx.lpszMenuName = 0; 560*cdf0e10cSrcweir aWndClassEx.lpszClassName = SAL_OBJECT_CLASSNAMEW; 561*cdf0e10cSrcweir if ( RegisterClassExW( &aWndClassEx ) ) 562*cdf0e10cSrcweir { 563*cdf0e10cSrcweir // Wegen PlugIn's loeschen wir erstmal den Hintergrund 564*cdf0e10cSrcweir aWndClassEx.cbWndExtra = 0; 565*cdf0e10cSrcweir aWndClassEx.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 566*cdf0e10cSrcweir aWndClassEx.lpfnWndProc = SalSysObjChildWndProcW; 567*cdf0e10cSrcweir aWndClassEx.lpszClassName = SAL_OBJECT_CHILDCLASSNAMEW; 568*cdf0e10cSrcweir if ( RegisterClassExW( &aWndClassEx ) ) 569*cdf0e10cSrcweir pSalData->mbObjClassInit = TRUE; 570*cdf0e10cSrcweir } 571*cdf0e10cSrcweir } 572*cdf0e10cSrcweir else 573*cdf0e10cSrcweir { 574*cdf0e10cSrcweir WNDCLASSEXA aWndClassEx; 575*cdf0e10cSrcweir aWndClassEx.cbSize = sizeof( aWndClassEx ); 576*cdf0e10cSrcweir aWndClassEx.style = 0; 577*cdf0e10cSrcweir aWndClassEx.lpfnWndProc = SalSysObjWndProcA; 578*cdf0e10cSrcweir aWndClassEx.cbClsExtra = 0; 579*cdf0e10cSrcweir aWndClassEx.cbWndExtra = SAL_OBJECT_WNDEXTRA; 580*cdf0e10cSrcweir aWndClassEx.hInstance = pSalData->mhInst; 581*cdf0e10cSrcweir aWndClassEx.hIcon = 0; 582*cdf0e10cSrcweir aWndClassEx.hIconSm = 0; 583*cdf0e10cSrcweir aWndClassEx.hCursor = LoadCursor( 0, IDC_ARROW ); 584*cdf0e10cSrcweir aWndClassEx.hbrBackground = 0; 585*cdf0e10cSrcweir aWndClassEx.lpszMenuName = 0; 586*cdf0e10cSrcweir aWndClassEx.lpszClassName = SAL_OBJECT_CLASSNAMEA; 587*cdf0e10cSrcweir if ( RegisterClassExA( &aWndClassEx ) ) 588*cdf0e10cSrcweir { 589*cdf0e10cSrcweir // Wegen PlugIn's loeschen wir erstmal den Hintergrund 590*cdf0e10cSrcweir aWndClassEx.cbWndExtra = 0; 591*cdf0e10cSrcweir aWndClassEx.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 592*cdf0e10cSrcweir aWndClassEx.lpfnWndProc = SalSysObjChildWndProcA; 593*cdf0e10cSrcweir aWndClassEx.lpszClassName = SAL_OBJECT_CHILDCLASSNAMEA; 594*cdf0e10cSrcweir if ( RegisterClassExA( &aWndClassEx ) ) 595*cdf0e10cSrcweir pSalData->mbObjClassInit = TRUE; 596*cdf0e10cSrcweir } 597*cdf0e10cSrcweir } 598*cdf0e10cSrcweir } 599*cdf0e10cSrcweir 600*cdf0e10cSrcweir if ( pSalData->mbObjClassInit ) 601*cdf0e10cSrcweir { 602*cdf0e10cSrcweir WinSalObject* pObject = new WinSalObject; 603*cdf0e10cSrcweir 604*cdf0e10cSrcweir // #135235# Clip siblings of this 605*cdf0e10cSrcweir // SystemChildWindow. Otherwise, DXCanvas (using a hidden 606*cdf0e10cSrcweir // SystemChildWindow) clobbers applets/plugins during 607*cdf0e10cSrcweir // animations . 608*cdf0e10cSrcweir HWND hWnd = CreateWindowExA( 0, SAL_OBJECT_CLASSNAMEA, "", 609*cdf0e10cSrcweir WS_CHILD | WS_CLIPSIBLINGS, 0, 0, 0, 0, 610*cdf0e10cSrcweir pParent->mhWnd, 0, 611*cdf0e10cSrcweir pInst->mhInst, (void*)pObject ); 612*cdf0e10cSrcweir 613*cdf0e10cSrcweir HWND hWndChild = 0; 614*cdf0e10cSrcweir if ( hWnd ) 615*cdf0e10cSrcweir { 616*cdf0e10cSrcweir // #135235# Explicitely stack SystemChildWindows in 617*cdf0e10cSrcweir // the order they're created - since there's no notion 618*cdf0e10cSrcweir // of zorder. 619*cdf0e10cSrcweir SetWindowPos(hWnd,HWND_TOP,0,0,0,0, 620*cdf0e10cSrcweir SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOREDRAW|SWP_NOSIZE); 621*cdf0e10cSrcweir hWndChild = CreateWindowExA( 0, SAL_OBJECT_CHILDCLASSNAMEA, "", 622*cdf0e10cSrcweir WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE, 623*cdf0e10cSrcweir 0, 0, 0, 0, 624*cdf0e10cSrcweir hWnd, 0, 625*cdf0e10cSrcweir pInst->mhInst, NULL ); 626*cdf0e10cSrcweir } 627*cdf0e10cSrcweir 628*cdf0e10cSrcweir if ( !hWndChild ) 629*cdf0e10cSrcweir { 630*cdf0e10cSrcweir delete pObject; 631*cdf0e10cSrcweir return NULL; 632*cdf0e10cSrcweir } 633*cdf0e10cSrcweir 634*cdf0e10cSrcweir if ( hWnd ) 635*cdf0e10cSrcweir { 636*cdf0e10cSrcweir pObject->mhWnd = hWnd; 637*cdf0e10cSrcweir pObject->mhWndChild = hWndChild; 638*cdf0e10cSrcweir pObject->maSysData.hWnd = hWndChild; 639*cdf0e10cSrcweir return pObject; 640*cdf0e10cSrcweir } 641*cdf0e10cSrcweir } 642*cdf0e10cSrcweir 643*cdf0e10cSrcweir return NULL; 644*cdf0e10cSrcweir } 645*cdf0e10cSrcweir 646*cdf0e10cSrcweir // ======================================================================= 647*cdf0e10cSrcweir 648*cdf0e10cSrcweir WinSalObject::WinSalObject() 649*cdf0e10cSrcweir { 650*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 651*cdf0e10cSrcweir 652*cdf0e10cSrcweir mhWnd = 0; 653*cdf0e10cSrcweir mhWndChild = 0; 654*cdf0e10cSrcweir mhLastFocusWnd = 0; 655*cdf0e10cSrcweir maSysData.nSize = sizeof( SystemEnvData ); 656*cdf0e10cSrcweir mpStdClipRgnData = NULL; 657*cdf0e10cSrcweir mbInterceptChildWindowKeyDown = sal_False; 658*cdf0e10cSrcweir 659*cdf0e10cSrcweir // Insert object in objectlist 660*cdf0e10cSrcweir mpNextObject = pSalData->mpFirstObject; 661*cdf0e10cSrcweir pSalData->mpFirstObject = this; 662*cdf0e10cSrcweir } 663*cdf0e10cSrcweir 664*cdf0e10cSrcweir // ----------------------------------------------------------------------- 665*cdf0e10cSrcweir 666*cdf0e10cSrcweir WinSalObject::~WinSalObject() 667*cdf0e10cSrcweir { 668*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 669*cdf0e10cSrcweir 670*cdf0e10cSrcweir // remove frame from framelist 671*cdf0e10cSrcweir if ( this == pSalData->mpFirstObject ) 672*cdf0e10cSrcweir { 673*cdf0e10cSrcweir pSalData->mpFirstObject = mpNextObject; 674*cdf0e10cSrcweir 675*cdf0e10cSrcweir // Wenn letztes SalObject, dann Hook wieder entfernen 676*cdf0e10cSrcweir if ( !pSalData->mpFirstObject ) 677*cdf0e10cSrcweir UnhookWindowsHookEx( pSalData->mhSalObjMsgHook ); 678*cdf0e10cSrcweir } 679*cdf0e10cSrcweir else 680*cdf0e10cSrcweir { 681*cdf0e10cSrcweir WinSalObject* pTempObject = pSalData->mpFirstObject; 682*cdf0e10cSrcweir while ( pTempObject->mpNextObject != this ) 683*cdf0e10cSrcweir pTempObject = pTempObject->mpNextObject; 684*cdf0e10cSrcweir 685*cdf0e10cSrcweir pTempObject->mpNextObject = mpNextObject; 686*cdf0e10cSrcweir } 687*cdf0e10cSrcweir 688*cdf0e10cSrcweir // Cache-Daten zerstoeren 689*cdf0e10cSrcweir if ( mpStdClipRgnData ) 690*cdf0e10cSrcweir delete mpStdClipRgnData; 691*cdf0e10cSrcweir 692*cdf0e10cSrcweir HWND hWndParent = ::GetParent( mhWnd ); 693*cdf0e10cSrcweir 694*cdf0e10cSrcweir if ( mhWndChild ) 695*cdf0e10cSrcweir DestroyWindow( mhWndChild ); 696*cdf0e10cSrcweir if ( mhWnd ) 697*cdf0e10cSrcweir DestroyWindow( mhWnd ); 698*cdf0e10cSrcweir 699*cdf0e10cSrcweir // Palette wieder zuruecksetzen, wenn kein externes Child-Fenster 700*cdf0e10cSrcweir // mehr vorhanden ist, da diese unsere Palette ueberschrieben haben 701*cdf0e10cSrcweir // koennen 702*cdf0e10cSrcweir if ( hWndParent && 703*cdf0e10cSrcweir ::GetActiveWindow() == hWndParent && 704*cdf0e10cSrcweir !GetWindow( hWndParent, GW_CHILD ) ) 705*cdf0e10cSrcweir ImplSendMessage( hWndParent, SAL_MSG_FORCEPALETTE, 0, 0 ); 706*cdf0e10cSrcweir } 707*cdf0e10cSrcweir 708*cdf0e10cSrcweir // ----------------------------------------------------------------------- 709*cdf0e10cSrcweir 710*cdf0e10cSrcweir void WinSalObject::ResetClipRegion() 711*cdf0e10cSrcweir { 712*cdf0e10cSrcweir SetWindowRgn( mhWnd, 0, TRUE ); 713*cdf0e10cSrcweir } 714*cdf0e10cSrcweir 715*cdf0e10cSrcweir // ----------------------------------------------------------------------- 716*cdf0e10cSrcweir 717*cdf0e10cSrcweir sal_uInt16 WinSalObject::GetClipRegionType() 718*cdf0e10cSrcweir { 719*cdf0e10cSrcweir return SAL_OBJECT_CLIP_INCLUDERECTS; 720*cdf0e10cSrcweir } 721*cdf0e10cSrcweir 722*cdf0e10cSrcweir // ----------------------------------------------------------------------- 723*cdf0e10cSrcweir 724*cdf0e10cSrcweir void WinSalObject::BeginSetClipRegion( sal_uLong nRectCount ) 725*cdf0e10cSrcweir { 726*cdf0e10cSrcweir sal_uLong nRectBufSize = sizeof(RECT)*nRectCount; 727*cdf0e10cSrcweir if ( nRectCount < SAL_CLIPRECT_COUNT ) 728*cdf0e10cSrcweir { 729*cdf0e10cSrcweir if ( !mpStdClipRgnData ) 730*cdf0e10cSrcweir mpStdClipRgnData = (RGNDATA*)new BYTE[sizeof(RGNDATA)-1+(SAL_CLIPRECT_COUNT*sizeof(RECT))]; 731*cdf0e10cSrcweir mpClipRgnData = mpStdClipRgnData; 732*cdf0e10cSrcweir } 733*cdf0e10cSrcweir else 734*cdf0e10cSrcweir mpClipRgnData = (RGNDATA*)new BYTE[sizeof(RGNDATA)-1+nRectBufSize]; 735*cdf0e10cSrcweir mpClipRgnData->rdh.dwSize = sizeof( RGNDATAHEADER ); 736*cdf0e10cSrcweir mpClipRgnData->rdh.iType = RDH_RECTANGLES; 737*cdf0e10cSrcweir mpClipRgnData->rdh.nCount = nRectCount; 738*cdf0e10cSrcweir mpClipRgnData->rdh.nRgnSize = nRectBufSize; 739*cdf0e10cSrcweir SetRectEmpty( &(mpClipRgnData->rdh.rcBound) ); 740*cdf0e10cSrcweir mpNextClipRect = (RECT*)(&(mpClipRgnData->Buffer)); 741*cdf0e10cSrcweir mbFirstClipRect = TRUE; 742*cdf0e10cSrcweir } 743*cdf0e10cSrcweir 744*cdf0e10cSrcweir // ----------------------------------------------------------------------- 745*cdf0e10cSrcweir 746*cdf0e10cSrcweir void WinSalObject::UnionClipRegion( long nX, long nY, long nWidth, long nHeight ) 747*cdf0e10cSrcweir { 748*cdf0e10cSrcweir RECT* pRect = mpNextClipRect; 749*cdf0e10cSrcweir RECT* pBoundRect = &(mpClipRgnData->rdh.rcBound); 750*cdf0e10cSrcweir long nRight = nX + nWidth; 751*cdf0e10cSrcweir long nBottom = nY + nHeight; 752*cdf0e10cSrcweir 753*cdf0e10cSrcweir if ( mbFirstClipRect ) 754*cdf0e10cSrcweir { 755*cdf0e10cSrcweir pBoundRect->left = nX; 756*cdf0e10cSrcweir pBoundRect->top = nY; 757*cdf0e10cSrcweir pBoundRect->right = nRight; 758*cdf0e10cSrcweir pBoundRect->bottom = nBottom; 759*cdf0e10cSrcweir mbFirstClipRect = FALSE; 760*cdf0e10cSrcweir } 761*cdf0e10cSrcweir else 762*cdf0e10cSrcweir { 763*cdf0e10cSrcweir if ( nX < pBoundRect->left ) 764*cdf0e10cSrcweir pBoundRect->left = (int)nX; 765*cdf0e10cSrcweir 766*cdf0e10cSrcweir if ( nY < pBoundRect->top ) 767*cdf0e10cSrcweir pBoundRect->top = (int)nY; 768*cdf0e10cSrcweir 769*cdf0e10cSrcweir if ( nRight > pBoundRect->right ) 770*cdf0e10cSrcweir pBoundRect->right = (int)nRight; 771*cdf0e10cSrcweir 772*cdf0e10cSrcweir if ( nBottom > pBoundRect->bottom ) 773*cdf0e10cSrcweir pBoundRect->bottom = (int)nBottom; 774*cdf0e10cSrcweir } 775*cdf0e10cSrcweir 776*cdf0e10cSrcweir pRect->left = (int)nX; 777*cdf0e10cSrcweir pRect->top = (int)nY; 778*cdf0e10cSrcweir pRect->right = (int)nRight; 779*cdf0e10cSrcweir pRect->bottom = (int)nBottom; 780*cdf0e10cSrcweir mpNextClipRect++; 781*cdf0e10cSrcweir } 782*cdf0e10cSrcweir 783*cdf0e10cSrcweir // ----------------------------------------------------------------------- 784*cdf0e10cSrcweir 785*cdf0e10cSrcweir void WinSalObject::EndSetClipRegion() 786*cdf0e10cSrcweir { 787*cdf0e10cSrcweir HRGN hRegion; 788*cdf0e10cSrcweir 789*cdf0e10cSrcweir // Aus den Region-Daten muessen wir jetzt eine ClipRegion erzeugen 790*cdf0e10cSrcweir if ( mpClipRgnData->rdh.nCount == 1 ) 791*cdf0e10cSrcweir { 792*cdf0e10cSrcweir RECT* pRect = &(mpClipRgnData->rdh.rcBound); 793*cdf0e10cSrcweir hRegion = CreateRectRgn( pRect->left, pRect->top, 794*cdf0e10cSrcweir pRect->right, pRect->bottom ); 795*cdf0e10cSrcweir } 796*cdf0e10cSrcweir else 797*cdf0e10cSrcweir { 798*cdf0e10cSrcweir sal_uLong nSize = mpClipRgnData->rdh.nRgnSize+sizeof(RGNDATAHEADER); 799*cdf0e10cSrcweir hRegion = ExtCreateRegion( NULL, nSize, mpClipRgnData ); 800*cdf0e10cSrcweir if ( mpClipRgnData != mpStdClipRgnData ) 801*cdf0e10cSrcweir delete [] (BYTE*)mpClipRgnData; 802*cdf0e10cSrcweir } 803*cdf0e10cSrcweir 804*cdf0e10cSrcweir DBG_ASSERT( hRegion, "SalObject::EndSetClipRegion() - Can't create ClipRegion" ); 805*cdf0e10cSrcweir SetWindowRgn( mhWnd, hRegion, TRUE ); 806*cdf0e10cSrcweir } 807*cdf0e10cSrcweir 808*cdf0e10cSrcweir // ----------------------------------------------------------------------- 809*cdf0e10cSrcweir 810*cdf0e10cSrcweir void WinSalObject::SetPosSize( long nX, long nY, long nWidth, long nHeight ) 811*cdf0e10cSrcweir { 812*cdf0e10cSrcweir sal_uLong nStyle = 0; 813*cdf0e10cSrcweir sal_Bool bVisible = (GetWindowStyle( mhWnd ) & WS_VISIBLE) != 0; 814*cdf0e10cSrcweir if ( bVisible ) 815*cdf0e10cSrcweir { 816*cdf0e10cSrcweir ShowWindow( mhWnd, SW_HIDE ); 817*cdf0e10cSrcweir nStyle |= SWP_SHOWWINDOW; 818*cdf0e10cSrcweir } 819*cdf0e10cSrcweir SetWindowPos( mhWnd, 0, 820*cdf0e10cSrcweir (int)nX, (int)nY, (int)nWidth, (int)nHeight, 821*cdf0e10cSrcweir SWP_NOZORDER | SWP_NOACTIVATE | nStyle ); 822*cdf0e10cSrcweir } 823*cdf0e10cSrcweir 824*cdf0e10cSrcweir // ----------------------------------------------------------------------- 825*cdf0e10cSrcweir 826*cdf0e10cSrcweir void WinSalObject::Show( sal_Bool bVisible ) 827*cdf0e10cSrcweir { 828*cdf0e10cSrcweir if ( bVisible ) 829*cdf0e10cSrcweir ShowWindow( mhWnd, SW_SHOWNORMAL ); 830*cdf0e10cSrcweir else 831*cdf0e10cSrcweir ShowWindow( mhWnd, SW_HIDE ); 832*cdf0e10cSrcweir } 833*cdf0e10cSrcweir 834*cdf0e10cSrcweir // ----------------------------------------------------------------------- 835*cdf0e10cSrcweir 836*cdf0e10cSrcweir void WinSalObject::Enable( sal_Bool bEnable ) 837*cdf0e10cSrcweir { 838*cdf0e10cSrcweir EnableWindow( mhWnd, bEnable ); 839*cdf0e10cSrcweir } 840*cdf0e10cSrcweir 841*cdf0e10cSrcweir // ----------------------------------------------------------------------- 842*cdf0e10cSrcweir 843*cdf0e10cSrcweir void WinSalObject::GrabFocus() 844*cdf0e10cSrcweir { 845*cdf0e10cSrcweir if ( mhLastFocusWnd && 846*cdf0e10cSrcweir IsWindow( mhLastFocusWnd ) && 847*cdf0e10cSrcweir ImplIsSysWindowOrChild( mhWndChild, mhLastFocusWnd ) ) 848*cdf0e10cSrcweir ::SetFocus( mhLastFocusWnd ); 849*cdf0e10cSrcweir else 850*cdf0e10cSrcweir ::SetFocus( mhWndChild ); 851*cdf0e10cSrcweir } 852*cdf0e10cSrcweir 853*cdf0e10cSrcweir // ----------------------------------------------------------------------- 854*cdf0e10cSrcweir 855*cdf0e10cSrcweir void WinSalObject::SetBackground() 856*cdf0e10cSrcweir { 857*cdf0e10cSrcweir } 858*cdf0e10cSrcweir 859*cdf0e10cSrcweir // ----------------------------------------------------------------------- 860*cdf0e10cSrcweir 861*cdf0e10cSrcweir void WinSalObject::SetBackground( SalColor ) 862*cdf0e10cSrcweir { 863*cdf0e10cSrcweir } 864*cdf0e10cSrcweir 865*cdf0e10cSrcweir // ----------------------------------------------------------------------- 866*cdf0e10cSrcweir 867*cdf0e10cSrcweir const SystemEnvData* WinSalObject::GetSystemData() const 868*cdf0e10cSrcweir { 869*cdf0e10cSrcweir return &maSysData; 870*cdf0e10cSrcweir } 871*cdf0e10cSrcweir 872*cdf0e10cSrcweir // ----------------------------------------------------------------------- 873*cdf0e10cSrcweir 874*cdf0e10cSrcweir void WinSalObject::InterceptChildWindowKeyDown( sal_Bool bIntercept ) 875*cdf0e10cSrcweir { 876*cdf0e10cSrcweir mbInterceptChildWindowKeyDown = bIntercept; 877*cdf0e10cSrcweir } 878*cdf0e10cSrcweir 879