/*
    DEFKERN.CPP - (C) 1990 by Joachim Kainz 'On a mission from Bhudda'
*/
    #include <windows.hpp>

    METHOD WINDOW::WndKernelProc (WORD wMsg, WORD wParam, long lParam)
    {
        switch(wMsg) {

          case WM_NULL:
            return WMNull ();

          case WM_CREATE:
            return WMCreate ((LPCREATESTRUCT) lParam);

          case WM_DESTROY:
             return WMDestroy ();

          case WM_MOVE:
            return WMMove (MAKEPOINT (lParam));

          case WM_SIZE:
			return WMSize (wParam, LOWORD (lParam), HIWORD (lParam));

		  case WM_ACTIVATE:
			return WMActivate (
						wParam,
						HIWORD (lParam),
						LOWORD (lParam)
				   );

		  case WM_SETFOCUS:
			return WMSetFocus (wParam);

		  case WM_KILLFOCUS:
			return WMKillFocus (wParam);

		  case WM_ENABLE:
			return WMEnable (wParam);

		  case WM_SETREDRAW:
			return WMSetRedraw (wParam);

		  case WM_SETTEXT:
			return WMSetText ((LPSTR) lParam);

		  case WM_GETTEXT:
			return WMGetText ((LPSTR) lParam, wParam);

		  case WM_GETTEXTLENGTH:
			return WMGetTextLength ();

		  case WM_PAINT:
			return WMPaint ();

		  case WM_CLOSE:
			return WMClose ();

		  case WM_QUERYENDSESSION:
			return WMQueryEndSession ();

		  case WM_QUERYOPEN:
			return WMQueryOpen ();

		  case WM_ERASEBKGND:
			return WMEraseBkgnd (wParam);

		  case WM_SYSCOLORCHANGE:
			return WMSysColorChange ();

		  case WM_ENDSESSION:
			return WMEndSession (wParam);

		  case WM_SHOWWINDOW:
			return WMShowWindow (wParam, lParam);

		  case WM_CTLCOLOR:
			return WMCtlColor (
						wParam,
						HIWORD (lParam),
						LOWORD (lParam)
				   );

		  case WM_WININICHANGE:
			return WMWinIniChange ((LPSTR) lParam);

		  case WM_DEVMODECHANGE:
			return WMDevModeChange ((LPSTR) lParam);

		  case WM_ACTIVATEAPP:
			return WMActivateApp	(wParam, LOWORD (wParam));

		  case WM_FONTCHANGE:
			return WMFontChange ();

		  case WM_TIMECHANGE:
			return WMTimeChange ();

		  case WM_CANCELMODE:
			return WMCancelMode ();

		  case WM_SETCURSOR:
			return WMSetCursor (
						wParam,
						LOWORD (lParam),
						HIWORD (lParam)
				   );

		  case WM_MOUSEACTIVATE:
			return WMMouseActivate (
						wParam,
						LOWORD (lParam),
						HIWORD (lParam)
				   );

		  case WM_CHILDACTIVATE:
			return WMChildActivate ();

		  case WM_QUEUESYNC:
			return WMQueueSync ();

		  case WM_GETMINMAXINFO:
			return WMGetMinMaxInfo ((LPRECT) lParam);

		  case WM_PAINTICON:
			return WMPaintIcon (wParam);

		  case WM_ICONERASEBKGND:
			return WMIconEraseBkgnd (wParam);

		  case WM_NEXTDLGCTL:
			return WMNextDlgCtl     (wParam, lParam != 0l);

		  case WM_SPOOLERSTATUS:
			return WMSpoolerStatus  (LOWORD (lParam));

		  case WM_DRAWITEM:
			return WMDrawItem ((LPDRAWITEMSTRUCT) lParam);

		  case WM_MEASUREITEM:
			return WMMeasureItem ((LPMEASUREITEMSTRUCT) lParam);

		  case WM_DELETEITEM:
			return WMDeleteItem ((LPDELETEITEMSTRUCT) lParam);

		  case WM_VKEYTOITEM:
			return WMVKeyToItem (
						wParam,
						HIWORD (lParam),
						LOWORD (lParam)
				   );

		  case WM_CHARTOITEM:
			return WMCharToItem (
						wParam,
						HIWORD (lParam),
						LOWORD (lParam)
				   );

		  case WM_SETFONT:
			return WMSetFont (wParam, (BOOL) lParam);

		  case WM_GETFONT:
			return WMGetFont ();

		}

		return DefWindowProc (GetWindowHandle (), wMsg, wParam, lParam);
	}

	METHOD WINDOW::WMCreate(LPCREATESTRUCT lpCreate)
	{
		wCount ++;

		return 0l;
	}

	METHOD WINDOW::WMDestroy()
	{
		if(!(--wCount))
			PostQuitMessage(0);

		SetWindowLong (
			GetWindowHandle (),
			GWL_WNDPROC,
			(long) lpDefWndProc
		);

		hWnd = 0;

		return 0l;
	}

	METHOD WINDOW::WMActivate(
						WORD wActivate,
						BOOL bMin,
						HWND hLast
					 )
	{
		if(wActivate)
			SetFocus (GetWindowHandle ());

		return 0l;
	}

	METHOD WINDOW::WMSetRedraw(BOOL bRedrawFlag)
	{
		return DefWindowProc (GetWindowHandle (), WM_SETREDRAW, bRedrawFlag, NULL);
	}

	METHOD WINDOW::WMSetText(LPSTR lpText)
	{
		return DefWindowProc(GetWindowHandle (), WM_SETTEXT, NULL, (long) lpText);
	}

	METHOD WINDOW::WMGetText(LPSTR lpText, WORD wMax)
	{
		return DefWindowProc(GetWindowHandle (), WM_GETTEXT, wMax, (long) lpText);
	}

	METHOD WINDOW::WMGetTextLength()
	{
		return DefWindowProc(GetWindowHandle (), WM_GETTEXTLENGTH, NULL, NULL);
	}

	METHOD WINDOW::WMPaint()
	{
		PAINTSTRUCT ps;

		BeginPaint(GetWindowHandle (), &ps);
		EndPaint  (GetWindowHandle (), &ps);

		return 0l;
	}

	METHOD WINDOW::WMClose()
	{
		DestroyWindow (GetWindowHandle ());

		return 0l;
	}

	METHOD WINDOW::WMEraseBkgnd(HANDLE hDC)
	{
		return DefWindowProc(GetWindowHandle (), WM_ERASEBKGND, hDC, NULL);
	}

	METHOD WINDOW::WMShowWindow(BOOL bShow, long lShow)
	{
		return DefWindowProc(
					GetWindowHandle (),
					WM_SHOWWINDOW,
					bShow,
					lShow
			   );
	}

	METHOD WINDOW::WMCtlColor(
						HDC  hCtlDC,
						WORD wCtlStyle,
						HWND hCtl
					 )
	{
		return DefWindowProc(
					GetWindowHandle (),
					WM_CTLCOLOR,
					hCtlDC,
					MAKELONG(hCtl, wCtlStyle)
			   );
	}

	METHOD WINDOW::WMCancelMode()
	{
		return DefWindowProc(GetWindowHandle (), WM_CANCELMODE, NULL, NULL);
	}

	METHOD WINDOW::WMSetCursor(
						HCURSOR hCursorOwner,
						WORD	wNCHitTest,
						WORD	wMouseMsg
					 )
	{
		return DefWindowProc(
					GetWindowHandle (),
					WM_SETCURSOR,
					hCursorOwner,
					MAKELONG(wNCHitTest, wMouseMsg)
			   );
	}

	METHOD WINDOW::WMMouseActivate(
						HWND hTopWnd,
						WORD NCHitTest,
						WORD wMouseMsg
					 )
	{
		return DefWindowProc(
					GetWindowHandle (),
					WM_MOUSEACTIVATE,
					hTopWnd,
					wMouseMsg
			   );
	}

	METHOD WINDOW::WMPaintIcon(BOOL bDraw)
	{
		return DefWindowProc(GetWindowHandle (), WM_PAINTICON, bDraw, NULL);
	}

	METHOD WINDOW::WMIconEraseBkgnd(HDC hDC)
	{
		return DefWindowProc(
					GetWindowHandle (),
					WM_ICONERASEBKGND,
					hDC,
					NULL
			   );
	}

	METHOD WINDOW::WMDrawItem(LPDRAWITEMSTRUCT lpDrawItem)
	{
		return DefWindowProc(
					GetWindowHandle (),
                    WM_DRAWITEM,
                    NULL,
                    (long) lpDrawItem
               );
    }
