//****************************************************************************
//
//  File:       main.c
//  Content:    main cpl control code
//  History:
//   Date	By	Reason
//   ====	==	======
//   29-nov-94	craige	initial implementation
//   11-dec-94	craige	added ShowJoyCPL
//
//  Copyright (c) Microsoft Corporation 1994-1995
//
//****************************************************************************
#include "joycpl.h"

HINSTANCE hInstance = NULL;
LPCTSTR cszHelpFile = TEXT("joy.hlp");

#define JOYSTICK_CPL	0
#define MAX_PAGES	16	/* maximum number of joysticks supported */

#ifdef DEBUG
void FAR cdecl dprintf(LPSTR szFormat, ...)
{
    char str[256];

    wsprintf( str, "JOYCPL: " );
    wvsprintf( str+lstrlen( str ), szFormat, (LPVOID)(&szFormat+1) );

    OutputDebugString( str );
}
#endif

/*
 * LibMain - main entry point for DLL
 */
BOOL APIENTRY LibMain( HANDLE hDll, DWORD dwReason, LPVOID lpReserved )
{
    switch( dwReason ) {
    case DLL_PROCESS_ATTACH:
    	hInstance = hDll;
    	DPF( "DLL_PROCESS_ATTACH: hInstance = %08lx\r\n" );
    	break;
    case DLL_PROCESS_DETACH:
    	DPF( "DLL_PROCESS_DETACH: hInstance = %08lx\r\n" );
    	break;
    case DLL_THREAD_DETACH:
    	DPF( "DLL_THREAD_DETACH: hInstance = %08lx\r\n" );
        break;
    case DLL_THREAD_ATTACH:
    	DPF( "DLL_THREAD_DETACH: hInstance = %08lx\r\n" );
    	break;
    default:
    	break;
    }

    return TRUE;

} /* LibMain */

/*
 * startJoyCPL - start the joystick CPL
 */
static void startJoyCPL( HWND hwnd )
{
    PROPSHEETHEADER	psh;
    char		title[MAX_STR];
    PROPSHEETPAGE	psp;
    LPJOYDATA		pjd;
    #if defined( WANT_SHEETS )
	JOYDATAPTR	jdp[MAX_PAGES];
	HPROPSHEETPAGE	hpsp[MAX_PAGES];
	int		numsheets;
	int		i;
	char		str[MAX_STR];
    #else
	JOYDATAPTR	jdp;
	HPROPSHEETPAGE	hpsp[1];
    #endif

    #if defined(WANT_SHEETS)
	numsheets = joyGetNumDevs();
	if( numsheets == 0 ) {
	    return;
	}
    #endif

    InitCommonControls();
    LoadString( hInstance, IDS_JOY, title, sizeof(title));

    psh.dwSize = sizeof(PROPSHEETHEADER);
    psh.dwFlags = PSH_PROPTITLE;
    psh.hwndParent = hwnd;
    psh.hInstance = hInstance;
    psh.pszCaption = (LPSTR) MAKEINTRESOURCE( IDS_JOY );
    psh.nPages = 0;
    psh.nStartPage = 0;
    psh.phpage = hpsp;

    psp.dwSize = sizeof( PROPSHEETPAGE );
    psp.dwFlags = PSP_DEFAULT | PSP_USETITLE;
    psp.hInstance = hInstance;
    psp.pszTemplate = MAKEINTRESOURCE( IDD_JOYSTICK );
    psp.pszIcon = NULL;
    psp.pfnDlgProc = JoystickDlg;
    psp.pfnCallback = NULL;
    psp.pcRefParent = NULL;
    pjd = JoystickDataInit();
    #if defined(WANT_SHEETS)
	for( i=0;i<numsheets;i++ ) {
	    wsprintf( str, "%s %d", title, i+1 );
	    psp.pszTitle = str;
	    jdp[i].pjd = pjd;
	    jdp[i].iJoyId = i;
	    psp.lParam = (LPARAM) &jdp[i];
	    if( psh.phpage[ psh.nPages ] = CreatePropertySheetPage( &psp ) ) {
		psh.nPages++;
		DPF( "PropertySheetPage()\r\n" );
	    }
	}
    #else
	psp.pszTitle = title;
	jdp.pjd = pjd;
	jdp.iJoyId = JOYSTICKID1;
	psp.lParam = (LPARAM) &jdp;
	if( psh.phpage[ psh.nPages ] = CreatePropertySheetPage( &psp ) ) {
	    psh.nPages++;
	    DPF( "PropertySheetPage()\r\n" );
	}
    #endif
    if( psh.nPages ) {
	PropertySheet( &psh );
	DPF( "PropertySheet()\r\n" );
    }
    JoystickDataFini( pjd );

} /* startJoyCPL */

/*
 * ShowJoyCPL - exported function to allow apps to show the joystick CPL
 */
void WINAPI ShowJoyCPL( HWND hwnd )
{
    HWND    hwnd_parent;

    hwnd_parent = hwnd;
    if( hwnd != NULL ) {
	if( GetWindowLong( hwnd, GWL_EXSTYLE ) & WS_EX_TOPMOST ) {
	    hwnd_parent = NULL;
	}
    }
    startJoyCPL( hwnd_parent );

} /* ShowJoyCPL */

/*
 * CPlApplet - applet manager
 */
LONG WINAPI CPlApplet(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
{
    LPCPLINFO		pcplinfo;
    LPNEWCPLINFO	pnewcplinfo;

    switch( uMsg ) {
    case CPL_INIT:
    	DPF( "CPL_INIT:\r\n" );
        // return TRUE; // (fall through to CPL_GETCOUNT--fail if no joysticks)
    
    case CPL_GETCOUNT:
        /*
	 * number  of applets in this DLL - 1 per device
	 * no joystick devices installed (i.e., no CPL's to display)
	 */
	if( joyGetNumDevs() ) {
	    DPF( "CPL_GETCOUNT = 1\r\n" );
	    return 1;
	} else {
	    DPF( "CPL_GETCOUNT = 0\r\n" );
	    return 0;
	}

    case CPL_INQUIRE:
        /*
	 * Fill the CPLINFO with the pertinent information for each applet
	 */
    	DPF( "CPL_INQUIRE:\r\n" );
	pcplinfo = (LPCPLINFO) lParam2;
        switch( lParam1 ) {
        case JOYSTICK_CPL:
            pcplinfo->idIcon = CPL_DYNAMIC_RES;
            pcplinfo->idName = CPL_DYNAMIC_RES;
            pcplinfo->idInfo = CPL_DYNAMIC_RES;
            break;
        }
        pcplinfo->lData = 0L;
        return TRUE;

    case CPL_NEWINQUIRE:
    	DPF( "CPL_NEWINQUIRE\r\n" );
    	pnewcplinfo = (LPNEWCPLINFO) lParam2;
    	switch( lParam1 ) {
	case JOYSTICK_CPL:
	    pnewcplinfo->hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_JOYSTICK));
	    LoadString(hInstance, IDS_JOY, pnewcplinfo->szName,
	    			sizeof(pnewcplinfo->szName));
	    LoadString( hInstance, IDS_JOYINFO, pnewcplinfo->szInfo,
	    			sizeof(pnewcplinfo->szInfo) );
	    DPF( "hIcon = %04x\r\n", pnewcplinfo->hIcon );
	    DPF( "szName = \"%s\"\r\n", pnewcplinfo->szName );
	    DPF( "szInfo = \"%s\"\r\n", pnewcplinfo->szInfo );
	    break;
	}
        pnewcplinfo->dwHelpContext = 0;
        pnewcplinfo->dwSize = sizeof( NEWCPLINFO );
        pnewcplinfo->lData = 0L;
        pnewcplinfo->szHelpFile[0] = 0;
        return TRUE;

    case CPL_DBLCLK:
    	DPF( "CPL_DBLCLK\r\n" );
        switch( lParam1 ) {
        case JOYSTICK_CPL:
	    startJoyCPL( hwnd );
            break;
        }
        break;      

    case CPL_EXIT:
    	DPF( "CPL_EXIT\r\n" );
        break;
            
    default:
        return 0L;
    }

    return 1L;

} /* CPlApplet */