xref: /aoo41x/main/vcl/win/source/window/salobj.cxx (revision cdf0e10c)
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