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 #include <svpm.h> 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir #define _SV_SALOBJ_CXX 31*cdf0e10cSrcweir #include <saldata.hxx> 32*cdf0e10cSrcweir #include <salinst.h> 33*cdf0e10cSrcweir #include <salframe.h> 34*cdf0e10cSrcweir #include <salobj.h> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir // ======================================================================= 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir static BOOL ImplIsSysWindowOrChild( HWND hWndParent, HWND hWndChild ) 39*cdf0e10cSrcweir { 40*cdf0e10cSrcweir if ( hWndParent == hWndChild ) 41*cdf0e10cSrcweir return TRUE; 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir HWND hTempWnd = WinQueryWindow( hWndChild, QW_PARENT ); 44*cdf0e10cSrcweir while ( hTempWnd ) 45*cdf0e10cSrcweir { 46*cdf0e10cSrcweir if ( hTempWnd == hWndParent ) 47*cdf0e10cSrcweir return TRUE; 48*cdf0e10cSrcweir hTempWnd = WinQueryWindow( hTempWnd, QW_PARENT ); 49*cdf0e10cSrcweir } 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir return FALSE; 52*cdf0e10cSrcweir } 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir // ----------------------------------------------------------------------- 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir static Os2SalObject* ImplFindOs2SalObject( HWND hWndChild ) 57*cdf0e10cSrcweir { 58*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 59*cdf0e10cSrcweir Os2SalObject* pObject = pSalData->mpFirstObject; 60*cdf0e10cSrcweir while ( pObject ) 61*cdf0e10cSrcweir { 62*cdf0e10cSrcweir if ( ImplIsSysWindowOrChild( pObject->mhWndChild, hWndChild ) ) 63*cdf0e10cSrcweir return pObject; 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir pObject = pObject->mpNextObject; 66*cdf0e10cSrcweir } 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir return NULL; 69*cdf0e10cSrcweir } 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir // ======================================================================= 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir BOOL EXPENTRY SalSysMsgProc( HAB /* hAB */, QMSG* pMsg, ULONG /* fs */ ) 74*cdf0e10cSrcweir { 75*cdf0e10cSrcweir if ( (pMsg->msg == WM_BUTTON1DOWN) || 76*cdf0e10cSrcweir (pMsg->msg == WM_BUTTON2DOWN) || 77*cdf0e10cSrcweir (pMsg->msg == WM_BUTTON3DOWN) ) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 80*cdf0e10cSrcweir Os2SalObject* pObject = ImplFindOs2SalObject( pMsg->hwnd ); 81*cdf0e10cSrcweir if ( pObject ) 82*cdf0e10cSrcweir WinPostMsg( pObject->mhWnd, SALOBJ_MSG_TOTOP, 0, 0 ); 83*cdf0e10cSrcweir } 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir // Focus fangen wir hier nicht ab, da wir erstmal davon ausgehen, 86*cdf0e10cSrcweir // das unser Os2SalObject-Fenster immer eine WM_FOCUSCHANGE-Message 87*cdf0e10cSrcweir // bekommt. 88*cdf0e10cSrcweir 89*cdf0e10cSrcweir return FALSE; 90*cdf0e10cSrcweir } 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir // ----------------------------------------------------------------------- 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir MRESULT EXPENTRY SalSysObjWndProc( HWND hWnd, ULONG nMsg, 95*cdf0e10cSrcweir MPARAM nMP1, MPARAM nMP2 ) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir Os2SalObject* pSysObj; 98*cdf0e10cSrcweir MRESULT nRet = 0; 99*cdf0e10cSrcweir int bDef = TRUE; 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL>0 102*cdf0e10cSrcweir debug_printf( "SalSysObjWndProc hWnd 0x%x nMsg %d\n", hWnd, nMsg); 103*cdf0e10cSrcweir #endif 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir switch( nMsg ) 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir case WM_ERASEBACKGROUND: 108*cdf0e10cSrcweir nRet = (MRESULT)FALSE; 109*cdf0e10cSrcweir bDef = FALSE; 110*cdf0e10cSrcweir break; 111*cdf0e10cSrcweir case WM_PAINT: 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir HPS hPS; 114*cdf0e10cSrcweir RECTL aRect; 115*cdf0e10cSrcweir hPS = WinBeginPaint( hWnd, NULLHANDLE, &aRect ); 116*cdf0e10cSrcweir WinEndPaint( hPS ); 117*cdf0e10cSrcweir bDef = FALSE; 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir bDef = FALSE; 120*cdf0e10cSrcweir break; 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir case WM_BUTTON1DOWN: 123*cdf0e10cSrcweir case WM_BUTTON2DOWN: 124*cdf0e10cSrcweir case WM_BUTTON3DOWN: 125*cdf0e10cSrcweir case SALOBJ_MSG_TOTOP: 126*cdf0e10cSrcweir if ( ImplSalYieldMutexTryToAcquire() ) 127*cdf0e10cSrcweir { 128*cdf0e10cSrcweir pSysObj = GetSalObjWindowPtr( hWnd ); 129*cdf0e10cSrcweir pSysObj->mpProc( pSysObj->mpInst, pSysObj, 130*cdf0e10cSrcweir SALOBJ_EVENT_TOTOP, 0 ); 131*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir else 134*cdf0e10cSrcweir WinPostMsg( hWnd, SALOBJ_MSG_TOTOP, 0, 0 ); 135*cdf0e10cSrcweir break; 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir case WM_FOCUSCHANGE: 138*cdf0e10cSrcweir case SALOBJ_MSG_POSTFOCUS: 139*cdf0e10cSrcweir if ( ImplSalYieldMutexTryToAcquire() ) 140*cdf0e10cSrcweir { 141*cdf0e10cSrcweir pSysObj = GetSalObjWindowPtr( hWnd ); 142*cdf0e10cSrcweir if ( SHORT1FROMMP( nMP2 ) ) 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir pSysObj->mhLastFocusWnd = WinQueryFocus( HWND_DESKTOP ); 145*cdf0e10cSrcweir pSysObj->mpProc( pSysObj->mpInst, pSysObj, 146*cdf0e10cSrcweir SALOBJ_EVENT_GETFOCUS, 0 ); 147*cdf0e10cSrcweir } 148*cdf0e10cSrcweir else 149*cdf0e10cSrcweir { 150*cdf0e10cSrcweir HWND hWndFocus = HWNDFROMMP( nMP1 ); 151*cdf0e10cSrcweir if ( !hWndFocus || !ImplIsSysWindowOrChild( hWnd, hWndFocus ) ) 152*cdf0e10cSrcweir { 153*cdf0e10cSrcweir pSysObj->mpProc( pSysObj->mpInst, pSysObj, 154*cdf0e10cSrcweir SALOBJ_EVENT_LOSEFOCUS, 0 ); 155*cdf0e10cSrcweir } 156*cdf0e10cSrcweir } 157*cdf0e10cSrcweir ImplSalYieldMutexRelease(); 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir else 160*cdf0e10cSrcweir WinPostMsg( hWnd, SALOBJ_MSG_POSTFOCUS, nMP1, nMP2 ); 161*cdf0e10cSrcweir break; 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir case WM_SIZE: 164*cdf0e10cSrcweir { 165*cdf0e10cSrcweir pSysObj = GetSalObjWindowPtr( hWnd ); 166*cdf0e10cSrcweir pSysObj->mnHeight = (short)SHORT2FROMMP( nMP2 ); 167*cdf0e10cSrcweir WinSetWindowPos( pSysObj->mhWndChild, 0, 168*cdf0e10cSrcweir 0, 0, 169*cdf0e10cSrcweir (short)SHORT1FROMMP( nMP2 ), (short)SHORT2FROMMP( nMP2 ), 170*cdf0e10cSrcweir SWP_SIZE | SWP_MOVE ); 171*cdf0e10cSrcweir bDef = FALSE; 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir break; 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir case WM_CREATE: 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir // Window-Instanz am Windowhandle speichern 178*cdf0e10cSrcweir CREATESTRUCT* pStruct = (CREATESTRUCT*)nMP2; 179*cdf0e10cSrcweir pSysObj = (Os2SalObject*)pStruct->pPresParams; 180*cdf0e10cSrcweir SetSalObjWindowPtr( hWnd, pSysObj ); 181*cdf0e10cSrcweir bDef = FALSE; 182*cdf0e10cSrcweir } 183*cdf0e10cSrcweir break; 184*cdf0e10cSrcweir } 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir if ( bDef ) 187*cdf0e10cSrcweir nRet = WinDefWindowProc( hWnd, nMsg, nMP1, nMP2 ); 188*cdf0e10cSrcweir return nRet; 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir // ----------------------------------------------------------------------- 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir MRESULT EXPENTRY SalSysObjChildWndProc( HWND hWnd, ULONG nMsg, 194*cdf0e10cSrcweir MPARAM nMP1, MPARAM nMP2 ) 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir MRESULT nRet = 0; 197*cdf0e10cSrcweir int bDef = TRUE; 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir debug_printf( "SalSysObjChildWndProc hWnd 0x%x nMsg %d\n", hWnd, nMsg); 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir switch( nMsg ) 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir case WM_ERASEBACKGROUND: 204*cdf0e10cSrcweir // Wegen PlugIn's loeschen wir erstmal den Hintergrund 205*cdf0e10cSrcweir /* 206*cdf0e10cSrcweir nRet = (MRESULT)FALSE; 207*cdf0e10cSrcweir bDef = FALSE; 208*cdf0e10cSrcweir */ 209*cdf0e10cSrcweir break; 210*cdf0e10cSrcweir case WM_PAINT: 211*cdf0e10cSrcweir { 212*cdf0e10cSrcweir HPS hPS; 213*cdf0e10cSrcweir RECTL aRect; 214*cdf0e10cSrcweir hPS = WinBeginPaint( hWnd, NULLHANDLE, &aRect ); 215*cdf0e10cSrcweir WinEndPaint( hPS ); 216*cdf0e10cSrcweir bDef = FALSE; 217*cdf0e10cSrcweir } 218*cdf0e10cSrcweir break; 219*cdf0e10cSrcweir } 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir if ( bDef ) 222*cdf0e10cSrcweir nRet = WinDefWindowProc( hWnd, nMsg, nMP1, nMP2 ); 223*cdf0e10cSrcweir return nRet; 224*cdf0e10cSrcweir } 225*cdf0e10cSrcweir 226*cdf0e10cSrcweir // ----------------------------------------------------------------------- 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir MRESULT EXPENTRY SalSysObjClipWndProc( HWND hWnd, ULONG nMsg, 229*cdf0e10cSrcweir MPARAM nMP1, MPARAM nMP2 ) 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir MRESULT nRet = 0; 232*cdf0e10cSrcweir int bDef = TRUE; 233*cdf0e10cSrcweir 234*cdf0e10cSrcweir debug_printf( "SalSysObjClipWndProc hWnd 0x%x nMsg %d\n", hWnd, nMsg); 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir switch( nMsg ) 237*cdf0e10cSrcweir { 238*cdf0e10cSrcweir case WM_MOUSEMOVE: 239*cdf0e10cSrcweir case WM_BUTTON1DOWN: 240*cdf0e10cSrcweir case WM_BUTTON2DOWN: 241*cdf0e10cSrcweir case WM_BUTTON3DOWN: 242*cdf0e10cSrcweir case WM_BUTTON1DBLCLK: 243*cdf0e10cSrcweir case WM_BUTTON2DBLCLK: 244*cdf0e10cSrcweir case WM_BUTTON3DBLCLK: 245*cdf0e10cSrcweir case WM_BUTTON1UP: 246*cdf0e10cSrcweir case WM_BUTTON2UP: 247*cdf0e10cSrcweir case WM_BUTTON3UP: 248*cdf0e10cSrcweir { 249*cdf0e10cSrcweir // Alle Events an den Frame weiterreichen, da diese Bereiche 250*cdf0e10cSrcweir // dem Frame gehoeren. Dazu muessen die Mouse-Koordinaaten 251*cdf0e10cSrcweir // entsprechend umgerechnet werden 252*cdf0e10cSrcweir HWND hWndParent = WinQueryWindow( hWnd, QW_PARENT ); // ergibt SysChild-Fenster 253*cdf0e10cSrcweir hWndParent = WinQueryWindow( hWndParent, QW_PARENT ); 254*cdf0e10cSrcweir short nX = (short)SHORT1FROMMP( nMP1 ); 255*cdf0e10cSrcweir short nY = (short)SHORT2FROMMP( nMP1 ); 256*cdf0e10cSrcweir POINTL aPos; 257*cdf0e10cSrcweir aPos.x = nX; 258*cdf0e10cSrcweir aPos.y = nY; 259*cdf0e10cSrcweir WinMapWindowPoints( hWnd, hWndParent, &aPos, 1 ); 260*cdf0e10cSrcweir nMP1 = MPFROM2SHORT( (short)aPos.x, (short)aPos.y ); 261*cdf0e10cSrcweir bDef = FALSE; 262*cdf0e10cSrcweir nRet = WinSendMsg( hWndParent, nMsg, nMP1, nMP2 ); 263*cdf0e10cSrcweir } 264*cdf0e10cSrcweir break; 265*cdf0e10cSrcweir 266*cdf0e10cSrcweir case WM_HITTEST: 267*cdf0e10cSrcweir // Damit im disablten Zustand die MouseKlicks immer noch 268*cdf0e10cSrcweir // an den Frame geschickt werden 269*cdf0e10cSrcweir // Dieser Code reicht leider nicht aus, deshalb wir unter 270*cdf0e10cSrcweir // OS2 immer das Child-Fenster disablen, im Gegensatz 271*cdf0e10cSrcweir // zu Windows, wo immer der Parent disablte wird, da 272*cdf0e10cSrcweir // sich das Fenster evtl. anders Darstellen koennte, 273*cdf0e10cSrcweir // wenn es disablte wird. Da dieser Fall uns bisher 274*cdf0e10cSrcweir // nicht bekannt ist, ignorieren wir das. 275*cdf0e10cSrcweir nRet = HT_NORMAL; 276*cdf0e10cSrcweir bDef = FALSE; 277*cdf0e10cSrcweir break; 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir case WM_ERASEBACKGROUND: 280*cdf0e10cSrcweir nRet = (MRESULT)FALSE; 281*cdf0e10cSrcweir bDef = FALSE; 282*cdf0e10cSrcweir break; 283*cdf0e10cSrcweir case WM_PAINT: 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir HPS hPS; 286*cdf0e10cSrcweir RECTL aRect; 287*cdf0e10cSrcweir hPS = WinBeginPaint( hWnd, NULLHANDLE, &aRect ); 288*cdf0e10cSrcweir WinEndPaint( hPS ); 289*cdf0e10cSrcweir bDef = FALSE; 290*cdf0e10cSrcweir } 291*cdf0e10cSrcweir break; 292*cdf0e10cSrcweir } 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir if ( bDef ) 295*cdf0e10cSrcweir nRet = WinDefWindowProc( hWnd, nMsg, nMP1, nMP2 ); 296*cdf0e10cSrcweir return nRet; 297*cdf0e10cSrcweir } 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir // ======================================================================= 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir void ImplDestroyAllClipWindows( HWND hWndLast ) 302*cdf0e10cSrcweir { 303*cdf0e10cSrcweir if ( hWndLast == HWND_TOP ) 304*cdf0e10cSrcweir return; 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir HWND hWndPrev; 307*cdf0e10cSrcweir while ( hWndLast ) 308*cdf0e10cSrcweir { 309*cdf0e10cSrcweir hWndPrev = WinQueryWindow( hWndLast, QW_PREV ); 310*cdf0e10cSrcweir WinDestroyWindow( hWndLast ); 311*cdf0e10cSrcweir hWndLast = hWndPrev; 312*cdf0e10cSrcweir } 313*cdf0e10cSrcweir } 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir // ======================================================================= 316*cdf0e10cSrcweir 317*cdf0e10cSrcweir SalObject* ImplSalCreateObject( Os2SalInstance* pInst, Os2SalFrame* pParent ) 318*cdf0e10cSrcweir { 319*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 320*cdf0e10cSrcweir 321*cdf0e10cSrcweir if ( !pSalData->mbObjClassInit ) 322*cdf0e10cSrcweir { 323*cdf0e10cSrcweir if ( WinRegisterClass( pSalData->mhAB, (PSZ)SAL_OBJECT_CLASSNAME, 324*cdf0e10cSrcweir (PFNWP)SalSysObjWndProc, CS_MOVENOTIFY, 325*cdf0e10cSrcweir SAL_OBJECT_WNDEXTRA ) ) 326*cdf0e10cSrcweir { 327*cdf0e10cSrcweir if ( WinRegisterClass( pSalData->mhAB, (PSZ)SAL_OBJECT_CLIPCLASSNAME, 328*cdf0e10cSrcweir (PFNWP)SalSysObjClipWndProc, CS_HITTEST | CS_MOVENOTIFY, 0 ) ) 329*cdf0e10cSrcweir { 330*cdf0e10cSrcweir if ( WinRegisterClass( pSalData->mhAB, (PSZ)SAL_OBJECT_CHILDCLASSNAME, 331*cdf0e10cSrcweir (PFNWP)SalSysObjChildWndProc, CS_HITTEST | CS_MOVENOTIFY, 32 ) ) 332*cdf0e10cSrcweir pSalData->mbObjClassInit = TRUE; 333*cdf0e10cSrcweir } 334*cdf0e10cSrcweir } 335*cdf0e10cSrcweir } 336*cdf0e10cSrcweir 337*cdf0e10cSrcweir if ( pSalData->mbObjClassInit ) 338*cdf0e10cSrcweir { 339*cdf0e10cSrcweir Os2SalObject* pObject = new Os2SalObject; 340*cdf0e10cSrcweir HWND hWnd = WinCreateWindow( pParent->mhWndClient, SAL_OBJECT_CLASSNAME, "", 341*cdf0e10cSrcweir 0, 342*cdf0e10cSrcweir 0, 0, 0, 0, 343*cdf0e10cSrcweir pParent->mhWndClient, HWND_TOP, 344*cdf0e10cSrcweir 0, NULL, (void*)pObject ); 345*cdf0e10cSrcweir HWND hWndChild = WinCreateWindow( hWnd, SAL_OBJECT_CHILDCLASSNAME, "", 346*cdf0e10cSrcweir WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE, 347*cdf0e10cSrcweir 0, 0, 0, 0, 348*cdf0e10cSrcweir hWnd, HWND_TOP, 349*cdf0e10cSrcweir 0, NULL, NULL ); 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir if ( !hWndChild ) 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir if ( hWnd ) 354*cdf0e10cSrcweir WinDestroyWindow( hWnd ); 355*cdf0e10cSrcweir delete pObject; 356*cdf0e10cSrcweir return NULL; 357*cdf0e10cSrcweir } 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir if ( hWnd ) 360*cdf0e10cSrcweir { 361*cdf0e10cSrcweir debug_printf("ImplSalCreateObject hWndChild %x\n", hWndChild); 362*cdf0e10cSrcweir debug_printf("ImplSalCreateObject hWnd %x\n", hWnd); 363*cdf0e10cSrcweir pObject->mhWnd = hWnd; 364*cdf0e10cSrcweir pObject->mhWndChild = hWndChild; 365*cdf0e10cSrcweir pObject->maSysData.hWnd = hWndChild; 366*cdf0e10cSrcweir return pObject; 367*cdf0e10cSrcweir } 368*cdf0e10cSrcweir } 369*cdf0e10cSrcweir 370*cdf0e10cSrcweir return NULL; 371*cdf0e10cSrcweir } 372*cdf0e10cSrcweir 373*cdf0e10cSrcweir // ======================================================================= 374*cdf0e10cSrcweir 375*cdf0e10cSrcweir long ImplSalObjCallbackDummy( void*, SalObject*, USHORT, const void* ) 376*cdf0e10cSrcweir { 377*cdf0e10cSrcweir return 0; 378*cdf0e10cSrcweir } 379*cdf0e10cSrcweir 380*cdf0e10cSrcweir // ======================================================================= 381*cdf0e10cSrcweir 382*cdf0e10cSrcweir Os2SalObject::Os2SalObject() 383*cdf0e10cSrcweir { 384*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir mhLastClipWnd = HWND_TOP; 387*cdf0e10cSrcweir 388*cdf0e10cSrcweir mhWnd = 0; 389*cdf0e10cSrcweir mhWndChild = 0; 390*cdf0e10cSrcweir mhLastFocusWnd = 0; 391*cdf0e10cSrcweir maSysData.nSize = sizeof( SystemEnvData ); 392*cdf0e10cSrcweir mnHeight = 0; 393*cdf0e10cSrcweir mpInst = NULL; 394*cdf0e10cSrcweir mpProc = ImplSalObjCallbackDummy; 395*cdf0e10cSrcweir 396*cdf0e10cSrcweir // Hook installieren, wenn es das erste Os2SalObject ist 397*cdf0e10cSrcweir if ( !pSalData->mpFirstObject ) 398*cdf0e10cSrcweir { 399*cdf0e10cSrcweir WinSetHook( pSalData->mhAB, pSalData->mhMQ, 400*cdf0e10cSrcweir HK_INPUT, (PFN)SalSysMsgProc, (HMODULE)0 ); 401*cdf0e10cSrcweir } 402*cdf0e10cSrcweir 403*cdf0e10cSrcweir // Insert object in objectlist 404*cdf0e10cSrcweir mpNextObject = pSalData->mpFirstObject; 405*cdf0e10cSrcweir pSalData->mpFirstObject = this; 406*cdf0e10cSrcweir } 407*cdf0e10cSrcweir 408*cdf0e10cSrcweir // ----------------------------------------------------------------------- 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir Os2SalObject::~Os2SalObject() 411*cdf0e10cSrcweir { 412*cdf0e10cSrcweir SalData* pSalData = GetSalData(); 413*cdf0e10cSrcweir 414*cdf0e10cSrcweir // remove frame from framelist 415*cdf0e10cSrcweir if ( this == pSalData->mpFirstObject ) 416*cdf0e10cSrcweir { 417*cdf0e10cSrcweir pSalData->mpFirstObject = mpNextObject; 418*cdf0e10cSrcweir 419*cdf0e10cSrcweir // Wenn letztes Os2SalObject, dann Hook wieder entfernen 420*cdf0e10cSrcweir if ( !pSalData->mpFirstObject ) 421*cdf0e10cSrcweir { 422*cdf0e10cSrcweir WinReleaseHook( pSalData->mhAB, pSalData->mhMQ, 423*cdf0e10cSrcweir HK_INPUT, (PFN)SalSysMsgProc, (HMODULE)0 ); 424*cdf0e10cSrcweir } 425*cdf0e10cSrcweir } 426*cdf0e10cSrcweir else 427*cdf0e10cSrcweir { 428*cdf0e10cSrcweir Os2SalObject* pTempObject = pSalData->mpFirstObject; 429*cdf0e10cSrcweir while ( pTempObject->mpNextObject != this ) 430*cdf0e10cSrcweir pTempObject = pTempObject->mpNextObject; 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir pTempObject->mpNextObject = mpNextObject; 433*cdf0e10cSrcweir } 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir // Cache-Daten zerstoeren 436*cdf0e10cSrcweir ImplDestroyAllClipWindows( mhLastClipWnd ); 437*cdf0e10cSrcweir 438*cdf0e10cSrcweir if ( mhWndChild ) 439*cdf0e10cSrcweir WinDestroyWindow( mhWndChild ); 440*cdf0e10cSrcweir if ( mhWnd ) 441*cdf0e10cSrcweir WinDestroyWindow( mhWnd ); 442*cdf0e10cSrcweir } 443*cdf0e10cSrcweir 444*cdf0e10cSrcweir // ----------------------------------------------------------------------- 445*cdf0e10cSrcweir 446*cdf0e10cSrcweir void Os2SalObject::ResetClipRegion() 447*cdf0e10cSrcweir { 448*cdf0e10cSrcweir ImplDestroyAllClipWindows( mhLastClipWnd ); 449*cdf0e10cSrcweir mhLastClipWnd = HWND_TOP; 450*cdf0e10cSrcweir } 451*cdf0e10cSrcweir 452*cdf0e10cSrcweir // ----------------------------------------------------------------------- 453*cdf0e10cSrcweir 454*cdf0e10cSrcweir USHORT Os2SalObject::GetClipRegionType() 455*cdf0e10cSrcweir { 456*cdf0e10cSrcweir return SAL_OBJECT_CLIP_EXCLUDERECTS; 457*cdf0e10cSrcweir } 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir // ----------------------------------------------------------------------- 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir void Os2SalObject::BeginSetClipRegion( ULONG nRectCount ) 462*cdf0e10cSrcweir { 463*cdf0e10cSrcweir mhOldLastClipWnd = mhLastClipWnd; 464*cdf0e10cSrcweir } 465*cdf0e10cSrcweir 466*cdf0e10cSrcweir // ----------------------------------------------------------------------- 467*cdf0e10cSrcweir 468*cdf0e10cSrcweir void Os2SalObject::UnionClipRegion( long nX, long nY, long nWidth, long nHeight ) 469*cdf0e10cSrcweir { 470*cdf0e10cSrcweir HWND hClipWnd = WinCreateWindow( mhWnd, SAL_OBJECT_CLIPCLASSNAME, "", 471*cdf0e10cSrcweir WS_VISIBLE, 472*cdf0e10cSrcweir nX, mnHeight-(nY+nHeight), nWidth, nHeight, 473*cdf0e10cSrcweir mhWnd, mhLastClipWnd, 474*cdf0e10cSrcweir 0, NULL, NULL ); 475*cdf0e10cSrcweir debug_printf("Os2SalObject::UnionClipRegion hClipWnd %x\n", hClipWnd); 476*cdf0e10cSrcweir mhLastClipWnd = hClipWnd; 477*cdf0e10cSrcweir } 478*cdf0e10cSrcweir 479*cdf0e10cSrcweir // ----------------------------------------------------------------------- 480*cdf0e10cSrcweir 481*cdf0e10cSrcweir void Os2SalObject::EndSetClipRegion() 482*cdf0e10cSrcweir { 483*cdf0e10cSrcweir ImplDestroyAllClipWindows( mhOldLastClipWnd ); 484*cdf0e10cSrcweir } 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir // ----------------------------------------------------------------------- 487*cdf0e10cSrcweir 488*cdf0e10cSrcweir void Os2SalObject::SetPosSize( long nX, long nY, long nWidth, long nHeight ) 489*cdf0e10cSrcweir { 490*cdf0e10cSrcweir ULONG nStyle = 0; 491*cdf0e10cSrcweir BOOL bVisible = WinIsWindowVisible( mhWnd ); 492*cdf0e10cSrcweir if ( bVisible ) 493*cdf0e10cSrcweir { 494*cdf0e10cSrcweir WinShowWindow( mhWnd, FALSE ); 495*cdf0e10cSrcweir nStyle |= SWP_SHOW; 496*cdf0e10cSrcweir } 497*cdf0e10cSrcweir SWP aParentSWP; 498*cdf0e10cSrcweir WinQueryWindowPos( WinQueryWindow( mhWnd, QW_PARENT ), &aParentSWP ); 499*cdf0e10cSrcweir WinSetWindowPos( mhWnd, 0, nX, aParentSWP.cy-(nY+nHeight), nWidth, nHeight, 500*cdf0e10cSrcweir SWP_MOVE | SWP_SIZE | nStyle ); 501*cdf0e10cSrcweir } 502*cdf0e10cSrcweir 503*cdf0e10cSrcweir // ----------------------------------------------------------------------- 504*cdf0e10cSrcweir 505*cdf0e10cSrcweir void Os2SalObject::Show( BOOL bVisible ) 506*cdf0e10cSrcweir { 507*cdf0e10cSrcweir WinShowWindow( mhWnd, bVisible ); 508*cdf0e10cSrcweir } 509*cdf0e10cSrcweir 510*cdf0e10cSrcweir // ----------------------------------------------------------------------- 511*cdf0e10cSrcweir 512*cdf0e10cSrcweir void Os2SalObject::Enable( BOOL bEnable ) 513*cdf0e10cSrcweir { 514*cdf0e10cSrcweir // Im Gegensatz zu Windows disablen wir das Childfenster, 515*cdf0e10cSrcweir // da ansonsten unser Clippen nicht mehr funktioniert, da 516*cdf0e10cSrcweir // wir keine Events mehr bekommen. Dadurch kann sich evtl. 517*cdf0e10cSrcweir // das Fenster anders darstellen, was wir eigentlich nicht 518*cdf0e10cSrcweir // wollen. Aber da uns bisher kein Fall bekannt ist, 519*cdf0e10cSrcweir // ignorieren wir dies. Ansonsten muss ein Fenster dazwischen 520*cdf0e10cSrcweir // gezogen werden oder getestet werden, wie wir die 521*cdf0e10cSrcweir // Maustransparenz erreichen, wenn mhWnd 522*cdf0e10cSrcweir // disablte wird. 523*cdf0e10cSrcweir WinEnableWindow( mhWndChild, bEnable ); 524*cdf0e10cSrcweir } 525*cdf0e10cSrcweir 526*cdf0e10cSrcweir // ----------------------------------------------------------------------- 527*cdf0e10cSrcweir 528*cdf0e10cSrcweir void Os2SalObject::GrabFocus() 529*cdf0e10cSrcweir { 530*cdf0e10cSrcweir if ( mhLastFocusWnd && 531*cdf0e10cSrcweir WinIsWindow( GetSalData()->mhAB, mhLastFocusWnd ) && 532*cdf0e10cSrcweir ImplIsSysWindowOrChild( mhWndChild, mhLastFocusWnd ) ) 533*cdf0e10cSrcweir WinSetFocus( HWND_DESKTOP, mhLastFocusWnd ); 534*cdf0e10cSrcweir else 535*cdf0e10cSrcweir WinSetFocus( HWND_DESKTOP, mhWndChild ); 536*cdf0e10cSrcweir } 537*cdf0e10cSrcweir 538*cdf0e10cSrcweir // ----------------------------------------------------------------------- 539*cdf0e10cSrcweir 540*cdf0e10cSrcweir void Os2SalObject::SetBackground() 541*cdf0e10cSrcweir { 542*cdf0e10cSrcweir } 543*cdf0e10cSrcweir 544*cdf0e10cSrcweir // ----------------------------------------------------------------------- 545*cdf0e10cSrcweir 546*cdf0e10cSrcweir void Os2SalObject::SetBackground( SalColor nSalColor ) 547*cdf0e10cSrcweir { 548*cdf0e10cSrcweir } 549*cdf0e10cSrcweir 550*cdf0e10cSrcweir // ----------------------------------------------------------------------- 551*cdf0e10cSrcweir 552*cdf0e10cSrcweir const SystemChildData* Os2SalObject::GetSystemData() const 553*cdf0e10cSrcweir { 554*cdf0e10cSrcweir return &maSysData; 555*cdf0e10cSrcweir } 556*cdf0e10cSrcweir 557*cdf0e10cSrcweir // ----------------------------------------------------------------------- 558*cdf0e10cSrcweir #if 0 559*cdf0e10cSrcweir void Os2SalObject::SetCallback( void* pInst, SALOBJECTPROC pProc ) 560*cdf0e10cSrcweir { 561*cdf0e10cSrcweir mpInst = pInst; 562*cdf0e10cSrcweir if ( pProc ) 563*cdf0e10cSrcweir mpProc = pProc; 564*cdf0e10cSrcweir else 565*cdf0e10cSrcweir mpProc = ImplSalObjCallbackDummy; 566*cdf0e10cSrcweir } 567*cdf0e10cSrcweir #endif 568*cdf0e10cSrcweir 569*cdf0e10cSrcweir // ----------------------------------------------------------------------- 570*cdf0e10cSrcweir 571*cdf0e10cSrcweir void Os2SalObject::InterceptChildWindowKeyDown( sal_Bool /*bIntercept*/ ) 572*cdf0e10cSrcweir { 573*cdf0e10cSrcweir } 574*cdf0e10cSrcweir 575