/*++

Copyright (c) 2000 Microsoft Corporation

Module Name:

    gesture.c

Abstract: Tablet PC Gesture Property Sheet module.

Environment:

    User mode

Author:

    Michael Tsang (MikeTs) 20-Apr-2000

Revision History:

--*/

#include "pch.h"

GESTURE_SETTINGS gGestureSettings = {0};
int giGestureControls[] =
{
    IDC_GESTUREMAP_GROUPBOX,
    IDC_UPSPIKE_TEXT,
    IDC_UPSPIKE,
    IDC_DOWNSPIKE_TEXT,
    IDC_DOWNSPIKE,
    IDC_LEFTSPIKE_TEXT,
    IDC_LEFTSPIKE,
    IDC_RIGHTSPIKE_TEXT,
    IDC_RIGHTSPIKE,
    0
};
COMBOBOX_STRING GestureComboStringTable[] =
{
    GestureNoAction,    IDS_GESTCOMBO_NONE,
    PopupSuperTIP,      IDS_GESTCOMBO_POPUP_SUPERTIP,
    PopupMIP,           IDS_GESTCOMBO_POPUP_MIP,
    0,                  0
};
int giGestureComboIDs[] =
{
    IDC_UPSPIKE,
    IDC_DOWNSPIKE,
    IDC_LEFTSPIKE,
    IDC_RIGHTSPIKE
};
DWORD gGestureHelpIDs[] =
{
    IDC_ENABLE_GESTURE, IDH_GESTURE_MAP,
    IDC_UPSPIKE,        IDH_GESTURE_MAP,
    IDC_DOWNSPIKE,      IDH_GESTURE_MAP,
    IDC_LEFTSPIKE,      IDH_GESTURE_MAP,
    IDC_RIGHTSPIKE,     IDH_GESTURE_MAP,
    0,                  0
};

/*****************************************************************************
 *
 *  @doc    EXTERNAL
 *
 *  @func   INT_PTR | GestureDlgProc |
 *          Dialog procedure for the Gesture map page.
 *
 *  @parm   IN HWND | hwnd | Window handle.
 *  @parm   IN UINT | uMsg | Message.
 *  @parm   IN WPARAM | wParam | Word Parameter.
 *  @parm   IN LPARAM | lParam | Long Parameter.
 *
 *  @rvalue Return value depends on the message.
 *
 *****************************************************************************/

INT_PTR APIENTRY
GestureDlgProc(
    IN HWND   hwnd,
    IN UINT   uMsg,
    IN WPARAM wParam,
    IN LPARAM lParam
    )
{
    TRACEPROC("GestureDlgProc", 2)
    INT_PTR rc = FALSE;

    TRACEENTER(("(hwnd=%p,Msg=%s,wParam=%x,lParam=%x)\n",
                hwnd, LookupName(uMsg, WMMsgNames), wParam, lParam));

    switch (uMsg)
    {
        case WM_INITDIALOG:
            rc = InitGesturePage(hwnd);
            if (rc == FALSE)
            {
                EnableWindow(hwnd, FALSE);
            }
            break;

        case WM_NOTIFY:
        {
            NMHDR FAR *lpnm = (NMHDR FAR *)lParam;

            switch (lpnm->code)
            {
                case PSN_APPLY:
                    RPC_TRY("TabSrvSetGestureSettings",
                            rc = TabSrvSetGestureSettings(ghBinding,
                                                          &gGestureSettings));

                    break;
            }
            break;
        }

        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
                int iGestureMapping;
                int i;

                case IDC_ENABLE_GESTURE:
                    gGestureSettings.dwfFeatures &=
                        ~GESTURE_FEATURE_RECOG_ENABLED;
                    if (IsDlgButtonChecked(hwnd, IDC_ENABLE_GESTURE))
                    {
                        gGestureSettings.dwfFeatures |=
                            GESTURE_FEATURE_RECOG_ENABLED;
                    }
                    EnableDlgControls(hwnd,
                                      giGestureControls,
                                      (gGestureSettings.dwfFeatures &
                                       GESTURE_FEATURE_RECOG_ENABLED) != 0);

                    SendMessage(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0);
                    break;

                case IDC_UPSPIKE:
                    i = UP_SPIKE;
                    goto GestureCommon;

                case IDC_DOWNSPIKE:
                    i = DOWN_SPIKE;
                    goto GestureCommon;

                case IDC_LEFTSPIKE:
                    i = LEFT_SPIKE;
                    goto GestureCommon;

                case IDC_RIGHTSPIKE:
                    i = RIGHT_SPIKE;

                GestureCommon:
                    switch (HIWORD(wParam))
                    {
                        case CBN_SELCHANGE:
                            iGestureMapping =
                                (int)SendMessage(GetDlgItem(hwnd,
                                                            LOWORD(wParam)),
                                                 CB_GETCURSEL,
                                                 0,
                                                 0);
                            if (iGestureMapping !=
                                gGestureSettings.GestureMap[i])
                            {
                                //
                                // Mapping has changed, mark the property
                                // sheet dirty.
                                //
                                gGestureSettings.GestureMap[i] =
                                        iGestureMapping;
                                SendMessage(GetParent(hwnd),
                                            PSM_CHANGED,
                                            (WPARAM)hwnd,
                                            0);
                                rc = TRUE;
                            }
                            break;
                    }
                    break;

                case IDC_ENABLE_PRESSHOLD:
                    gGestureSettings.dwfFeatures &=
                        ~GESTURE_FEATURE_PRESSHOLD_ENABLED;
                    if (IsDlgButtonChecked(hwnd, IDC_ENABLE_PRESSHOLD))
                    {
                        gGestureSettings.dwfFeatures |=
                            GESTURE_FEATURE_PRESSHOLD_ENABLED;
                    }
                    SendMessage(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0);
                    break;

#ifdef DEBUG
                case IDC_ENABLE_MOUSE:
                    gGestureSettings.dwfFeatures &=
                        ~GESTURE_FEATURE_MOUSE_ENABLED;
                    if (IsDlgButtonChecked(hwnd, IDC_ENABLE_MOUSE))
                    {
                        gGestureSettings.dwfFeatures |=
                            GESTURE_FEATURE_MOUSE_ENABLED;
                    }
                    SendMessage(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0);
                    break;
#endif
            }
            break;

        case WM_HELP:
            WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle,
                    TEXT("tabletpc.hlp"),
                    HELP_WM_HELP,
                    (DWORD_PTR)gGestureHelpIDs);
            break;

        case WM_CONTEXTMENU:
            WinHelp((HWND)wParam,
                    TEXT("tabletpc.hlp"),
                    HELP_CONTEXTMENU,
                    (DWORD_PTR)gGestureHelpIDs);
            break;
    }

    TRACEEXIT(("=%x\n", rc));
    return rc;
}       //GestureDlgProc

/*****************************************************************************
 *
 *  @doc    INTERNAL
 *
 *  @func   BOOL | InitGesturePage |
 *          Initialize the Gesture property page.
 *
 *  @parm   IN HWND | hwnd | Window handle.
 *
 *  @rvalue SUCCESS | Returns TRUE.
 *  @rvalue FAILURE | Returns FALSE.
 *
 *****************************************************************************/

BOOL
InitGesturePage(
    IN HWND hwnd
    )
{
    TRACEPROC("InitGesturePage", 2)
    BOOL rc;

    TRACEENTER(("(hwnd=%x)\n", hwnd));

    RPC_TRY("TabSrvGetGestureSettings",
            rc = TabSrvGetGestureSettings(ghBinding,
                                          &gGestureSettings));
    if (rc == TRUE)
    {
        int i;

        CheckDlgButton(hwnd,
                       IDC_ENABLE_GESTURE,
                       (gGestureSettings.dwfFeatures &
                        GESTURE_FEATURE_RECOG_ENABLED) != 0);

        EnableDlgControls(hwnd,
                          giGestureControls,
                          (gGestureSettings.dwfFeatures &
                           GESTURE_FEATURE_RECOG_ENABLED) != 0);

        CheckDlgButton(hwnd,
                       IDC_ENABLE_PRESSHOLD,
                       (gGestureSettings.dwfFeatures &
                        GESTURE_FEATURE_PRESSHOLD_ENABLED)
                       != 0);

#ifdef DEBUG
        CheckDlgButton(hwnd,
                       IDC_ENABLE_MOUSE,
                       (gGestureSettings.dwfFeatures &
                        GESTURE_FEATURE_MOUSE_ENABLED)
                       != 0);
#endif

        for (i = 0; i < NUM_GESTURES; i++)
        {
            InsertComboBoxStrings(hwnd,
                                  giGestureComboIDs[i],
                                  GestureComboStringTable);
            SendDlgItemMessage(hwnd,
                               giGestureComboIDs[i],
                               CB_SETCURSEL,
                               gGestureSettings.GestureMap[i],
                               0);
        }
    }
    else
    {
        ErrorMsg(IDSERR_TABSRV_GETGESTURESETTINGS);
    }

    TRACEEXIT(("=%x\n", rc));
    return rc;
}       //InitGesturePage