/*
 * Property Sheets
 *
 * Copyright 1998 Francis Beaudet
 *
 * TODO:
 *   - All the functions are simply stubs
 *
 */

#include "winbase.h"
#include "commctrl.h"
#include "prsht.h"
#include "propsheet.h"
#include "debug.h"


LRESULT WINAPI
PROPSHEET_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);







/*****************************************************************
 *            PropertySheet32A   (COMCTL32.84)(COMCTL32.83)
 */
INT WINAPI PropertySheetA(LPCPROPSHEETHEADERA lppsh)
{
	HWND hwnd;

    FIXME(propsheet, "(%p): stub\n", lppsh);

	if (lppsh->dwFlags & PSH_MODELESS) {
        hwnd = CreateDialogParamA ( lppsh->hInstance, WC_PROPSHEETA,
                    lppsh->hwndParent, (DLGPROC)PROPSHEET_WindowProc,
		    (LPARAM) lppsh );
		ShowWindow (hwnd, TRUE);
	} else {
		hwnd =  DialogBoxParamA ( lppsh->hInstance, WC_PROPSHEETA,
                    lppsh->hwndParent, (DLGPROC)PROPSHEET_WindowProc,
		    (LPARAM) lppsh );
	}
    return hwnd;
}

/*****************************************************************
 *            PropertySheet32W   (COMCTL32.85)
 */
INT WINAPI PropertySheetW(LPCPROPSHEETHEADERW propertySheetHeader)
{
    FIXME(propsheet, "(%p): stub\n", propertySheetHeader);

    return -1;
}





/*****************************************************************
 *            CreatePropertySheetPage32A   (COMCTL32.19)(COMCTL32.18)
 */
HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(LPCPROPSHEETPAGEA lpPropSheetPage)
{
    FIXME(propsheet, "(%p): stub\n", lpPropSheetPage);

    return 0;
}

/*****************************************************************
 *            CreatePropertySheetPage32W   (COMCTL32.20)
 */
HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
{
    FIXME(propsheet, "(%p): stub\n", lpPropSheetPage);

    return 0;
}

/*****************************************************************
 *            DestroyPropertySheetPage32   (COMCTL32.24)
 */
BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
{
    FIXME(propsheet, "(0x%08lx): stub\n", (DWORD)hPropPage);
    return FALSE;
}



LRESULT WINAPI
PROPSHEET_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    /* WND *wndPtr = WIN_FindWndPtr(hwnd); */

    switch (uMsg) {
       case PSM_SETCURSEL:
           FIXME (propsheet, "Unimplemented msg PSM_SETCURSEL\n");
           return 0;
       case PSM_REMOVEPAGE:
           FIXME (propsheet, "Unimplemented msg PSM_REMOVEPAGE\n");
           return 0;
       case PSM_ADDPAGE:
           FIXME (propsheet, "Unimplemented msg PSM_ADDPAGE\n");
           return 0;
       case PSM_CHANGED:
           FIXME (propsheet, "Unimplemented msg PSM_CHANGED\n");
           return 0;
       case PSM_RESTARTWINDOWS:
           FIXME (propsheet, "Unimplemented msg PSM_RESTARTWINDOWS\n");
           return 0;
       case PSM_REBOOTSYSTEM:
           FIXME (propsheet, "Unimplemented msg PSM_REBOOTSYSTEM\n");
           return 0;
       case PSM_CANCELTOCLOSE:
           FIXME (propsheet, "Unimplemented msg PSM_CANCELTOCLOSE\n");
           return 0;
       case PSM_QUERYSIBLINGS:
           FIXME (propsheet, "Unimplemented msg PSM_QUERYSIBLINGS\n");
           return 0;
       case PSM_UNCHANGED:
           FIXME (propsheet, "Unimplemented msg PSM_UNCHANGED\n");
           return 0;
       case PSM_APPLY:
           FIXME (propsheet, "Unimplemented msg PSM_APPLY\n");
           return 0;
       case PSM_SETTITLEA:
           FIXME (propsheet, "Unimplemented msg PSM_SETTITLE32A\n");
           return 0;
       case PSM_SETTITLEW:
           FIXME (propsheet, "Unimplemented msg PSM_SETTITLE32W\n");
           return 0;
       case PSM_SETWIZBUTTONS:
           FIXME (propsheet, "Unimplemented msg PSM_SETWIZBUTTONS\n");
           return 0;
       case PSM_PRESSBUTTON:
           FIXME (propsheet, "Unimplemented msg PSM_PRESSBUTTON\n");
           return 0;
       case PSM_SETCURSELID:
           FIXME (propsheet, "Unimplemented msg PSM_SETCURSELID\n");
           return 0;
       case PSM_SETFINISHTEXTA:
           FIXME (propsheet, "Unimplemented msg PSM_SETFINISHTEXT32A\n");
           return 0;
       case PSM_SETFINISHTEXTW:
           FIXME (propsheet, "Unimplemented msg PSM_SETFINISHTEXT32W\n");
           return 0;
       case PSM_GETTABCONTROL:
           FIXME (propsheet, "Unimplemented msg PSM_GETTABCONTROL\n");
           return 0;
       case PSM_ISDIALOGMESSAGE:
           FIXME (propsheet, "Unimplemented msg PSM_ISDIALOGMESSAGE\n");
           return 0;
       case PSM_GETCURRENTPAGEHWND:
           FIXME (propsheet, "Unimplemented msg PSM_GETCURRENTPAGEHWND\n");
           return 0;

       default:
        if (uMsg >= WM_USER)
	    ERR (propsheet, "unknown msg %04x wp=%08x lp=%08lx\n",
		 uMsg, wParam, lParam);
	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
    }
}


VOID
PROPSHEET_Register (VOID)
{
    WNDCLASSA wndClass;

    if (GlobalFindAtomA (WC_PROPSHEETA)) return;

    ZeroMemory (&wndClass, sizeof(WNDCLASSA));
    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
    wndClass.lpfnWndProc   = (WNDPROC)PROPSHEET_WindowProc;
    wndClass.cbClsExtra    = 0;
    wndClass.cbWndExtra    = sizeof(PROPSHEET_INFO *);
    wndClass.hCursor       = LoadCursorA (0, IDC_ARROWA);
    wndClass.hbrBackground = 0;
    wndClass.lpszClassName = WC_PROPSHEETA;

    RegisterClassA (&wndClass);
}


VOID
PROPSHEET_UnRegister (VOID)
{
    if (GlobalFindAtomA (WC_PROPSHEETA))
        UnregisterClassA (WC_PROPSHEETA, (HINSTANCE)NULL);
}
