/*****************************************************************************
 *
 *      diqeprop.c
 *
 *      The dialog box that displays effect properties.
 *
 *****************************************************************************/

#include "diquick.h"

#pragma BEGIN_CONST_DATA

CHECKLISTFLAG c_rgclfDieft[] = {
    { DIEFT_FFATTACK,           IDS_FFATTACK,           },
    { DIEFT_FFFADE,             IDS_FFFADE,             },
    { DIEFT_SATURATION,         IDS_SATURATION,         },
    { DIEFT_POSNEGCOEFFICIENTS, IDS_POSNEGCOEFFICIENTS  },
    { DIEFT_POSNEGSATURATION,   IDS_POSNEGSATURATION,   },
};

#pragma END_CONST_DATA

/*****************************************************************************
 *
 *      Effect property dialog instance data
 *
 *****************************************************************************/

typedef struct EFFPROPINFO {

    PDEVDLGINFO pddi;
    const GUID *rguidEff;

} EFFPROPINFO, *PEFFPROPINFO;

/*****************************************************************************
 *
 *      EffProp_OnInitDialog
 *
 *****************************************************************************/

BOOL INTERNAL
EffProp_OnInitDialog(HWND hdlg, LPARAM lp)
{
    PEFFPROPINFO pepi = (PV)lp;
    DIEFFECTINFO ei;
    HRESULT hres;

    /*
     *  Don't SetDialogPtr until we're finished.  This prevents
     *  WM_COMMAND from causing us to do wacky things before
     *  we're ready.
     */

    ei.dwSize = cbX(ei);
    hres = GetEffectInfo(pepi->pddi, &ei, pepi->rguidEff);
    if (SUCCEEDED(hres)) {

        SetWindowText(hdlg, ei.tszName);

        SetDlgItemText(hdlg, IDC_EPROP_GUID, MapGUID(&ei.guid, ei.tszName));

        LoadString(g_hinst, IDS_EFFECT_TYPEARRAY +
                            DIEFT_GETTYPE(ei.dwEffType),
                            ei.tszName, cA(ei.tszName));

        if (ei.tszName[0]) {
            SetDlgItemText(hdlg, IDC_EPROP_TYPE, ei.tszName);
        } else {
            SetDlgItemInt(hdlg, IDC_EPROP_TYPE, DIEFT_GETTYPE(ei.dwEffType), 0);
        }

        Checklist_InitFlags(hdlg, IDC_EPROP_FLAGS, ei.dwEffType,
                            c_rgclfDieft, cA(c_rgclfDieft));

        wsprintf(ei.tszName, TEXT("%08x"), ei.dwStaticParams);
        SetDlgItemText(hdlg, IDC_EPROP_STATICPARM, ei.tszName);

        wsprintf(ei.tszName, TEXT("%08x"), ei.dwDynamicParams);
        SetDlgItemText(hdlg, IDC_EPROP_DYNAMICPARM, ei.tszName);

    }

    SetDialogPtr(hdlg, pepi);

    #if 0   // temp hack to test effect goo
    _asm int 3
    hres = IDirectInputDevice8_Acquire(pepi->pddi->pdid);
    {
            LPDIRECTINPUTEFFECT peff;
            hres = IDirectInputDevice8_CreateEffect(
                        pepi->pddi->pdid, &ei.guid, 0, &peff, 0);
            if (SUCCEEDED(hres)) {
                DWORD dw = 3;
                DIEFFESCAPE esc = { cbX(esc), 0, &dw, 4, &dw, 4 };
                peff->lpVtbl->Escape(peff, &esc);
//                hres = IDirectInputDevice8_EnumCreatedEffects(pdev2,
//                EnumCallback, 0, 0);

                peff->lpVtbl->Release(peff);

            }

    }
    hres = IDirectInputDevice8_Unacquire(pepi->pddi->pdid);

    #endif

    return 1;
}

/*****************************************************************************
 *
 *      EffProp_DlgProc
 *
 *****************************************************************************/

INT_PTR INTERNAL
EffProp_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp)
{
    switch (wm) {
    case WM_INITDIALOG:
        return EffProp_OnInitDialog(hdlg, lp);

    case WM_DESTROY:
        Checklist_OnDestroy(GetDlgItem(hdlg, IDC_EPROP_FLAGS));
        break;

    case WM_CLOSE:
        EndDialog(hdlg, TRUE);
        return TRUE;
    }

    return 0;
}

/*****************************************************************************
 *
 *      EffProp_Create
 *
 *      Display info about an effect.
 *
 *****************************************************************************/

INT_PTR EXTERNAL
EffProp_Create(HWND hdlg, PDEVDLGINFO pddi, REFGUID rguidEff)
{
    EFFPROPINFO epi;

    epi.pddi = pddi;
    epi.rguidEff = rguidEff;

    return DialogBoxParam(g_hinst, MAKEINTRESOURCE(IDD_EFFPROP),
                          hdlg, EffProp_DlgProc, (LPARAM)&epi);
}