#include <windows.h>
#include <windowsx.h>
#include <shlobj.h>
#include "resource.h"
#include "debug.h"

#include "nsc.h"

typedef struct {
    HWND hDlg;
    HWND hwndNSC;
} DLGDATA;


BOOL CALLBACK DlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
    DLGDATA * pdd = (DLGDATA *)GetWindowLong(hDlg, DWL_USER);

    switch (uMessage) {
    case WM_INITDIALOG:
        SetWindowLong(hDlg, DWL_USER, lParam);
	pdd = (DLGDATA *)lParam;
	pdd->hDlg = hDlg;
	pdd->hwndNSC = GetDlgItem(hDlg, IDC_USER1);

	SetWindowLong(pdd->hwndNSC, GWL_STYLE, NSS_DROPTARGET | GetWindowLong(pdd->hwndNSC, GWL_STYLE));

	{
            NSC_SETROOT sr = {NSSR_CREATEPIDL, NULL, (LPCITEMIDLIST)CSIDL_FAVORITES, 5, NULL};
            // NSC_SETROOT sr = {NSSR_CREATEPIDL, NULL, (LPCITEMIDLIST)CSIDL_FAVORITES, 10, NULL};

	    // SetWindowLong(pdd->hwndNSC, GWL_STYLE, GetWindowLong(pdd->hwndNSC, GWL_STYLE));
	    SetWindowLong(pdd->hwndNSC, GWL_STYLE, NSS_SHOWNONFOLDERS | GetWindowLong(pdd->hwndNSC, GWL_STYLE));
	    NameSpace_SetRoot(pdd->hwndNSC, &sr);
	}
        break;

    case WM_COMMAND:
        switch (GET_WM_COMMAND_ID(wParam, lParam)) {
        case IDOK:
        case IDCANCEL:
	    EndDialog(hDlg, GET_WM_COMMAND_ID(wParam, lParam));
        }
        break;

    case WM_NOTIFY:
        switch (((NMHDR *)lParam)->code) {
        // case PSN_SETACTIVE:
        // case PSN_APPLY:
    	    break;

	default:
	    return FALSE;
        }
        break;

    default:
        return FALSE;
    }

    return TRUE;
}



int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, LPSTR pszCmdLine, int nCmdShow)
{
    DLGDATA dd;

    NameSpace_RegisterClass(hInst);

    OleInitialize(NULL);

    DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc, (LPARAM)&dd);

    OleUninitialize();

    return 0;
}


// stolen from the CRT, used to shirink our code

int _stdcall WinMainCRTStartup(void)
{
    int i;
    STARTUPINFO si;
    LPSTR pszCmdLine = GetCommandLine();

    if ( *pszCmdLine == '\"' ) {
        /*
         * Scan, and skip over, subsequent characters until
         * another double-quote or a null is encountered.
         */
        while ( *++pszCmdLine && (*pszCmdLine
    	     != '\"') );
        /*
         * If we stopped on a double-quote (usual case), skip
         * over it.
         */
        if ( *pszCmdLine == '\"' )
    	    pszCmdLine++;
    }
    else {
        while (*pszCmdLine > ' ')
    	    pszCmdLine++;
    }

    /*
     * Skip past any white space preceeding the second token.
     */
    while (*pszCmdLine && (*pszCmdLine <= ' ')) {
        pszCmdLine++;
    }

    si.dwFlags = 0;
    GetStartupInfoA(&si);

    i = WinMain(GetModuleHandle(NULL), NULL, pszCmdLine,
                   si.dwFlags & STARTF_USESHOWWINDOW ? si.wShowWindow : SW_SHOWDEFAULT);

    // Since we now have a way for an extension to tell us when it is finished,
    // we will terminate all processes when the main thread goes away.

    ExitProcess(i);

    return i;	// We only come here when we are not the shell...
}