/*******************************************************************************
*
*  (C) COPYRIGHT MICROSOFT CORP., 1993-1994
*
*  TITLE:       REGSTRED.C
*
*  VERSION:     4.01
*
*  AUTHOR:      Tracy Sharpe
*
*  DATE:        05 Mar 1994
*
*  String edit dialog for use by the Registry Editor.
*
********************************************************************************
*
*  CHANGE LOG:
*
*  DATE        REV DESCRIPTION
*  ----------- --- -------------------------------------------------------------
*  05 Mar 1994 TCS Original implementation.
*
*******************************************************************************/

#include "pch.h"
#include "regresid.h"
#include "reghelp.h"
#include "regedit.h"

const DWORD s_EditStringValueHelpIDs[] = {
    IDC_VALUEDATA, IDH_REGEDIT_VALUEDATA,
    IDC_VALUENAME, IDH_REGEDIT_VALUENAME,
    0, 0
};

BOOL
PASCAL
EditStringValue_OnInitDialog(
    HWND hWnd,
    HWND hFocusWnd,
    LPARAM lParam
    );

/*******************************************************************************
*
*  EditStringValueDlgProc
*
*  DESCRIPTION:
*
*  PARAMETERS:
*
*******************************************************************************/

INT_PTR
CALLBACK
EditStringValueDlgProc(
    HWND hWnd,
    UINT Message,
    WPARAM wParam,
    LPARAM lParam
    )
{
    
    LPEDITVALUEPARAM lpEditValueParam;
    
    
    switch (Message) 
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, EditStringValue_OnInitDialog);
        
    case WM_COMMAND:
        {
            DWORD dwCommand = GET_WM_COMMAND_ID(wParam, lParam);
            switch (dwCommand) 
            {
            case IDOK:
                {
                    UINT ccValueData;
                    UINT cbValueData;
                    PBYTE pbValueData = NULL;
                    
                    lpEditValueParam = (LPEDITVALUEPARAM) GetWindowLongPtr(hWnd, DWLP_USER);
                    
                    // this maybe a multi-string, if so the sizeof(TCHAR) is added to 
                    // allow for the multi-string to be terminated also.
                    ccValueData = (UINT) SendDlgItemMessage(hWnd, IDC_VALUEDATA, WM_GETTEXTLENGTH, 0, 0) + 2;
                    
                    cbValueData = ccValueData * sizeof(TCHAR);
                    
                    if (cbValueData > lpEditValueParam->cbValueData)
                    {
                        // need a bigger buffer
                        PBYTE pbValueData = 
                            LocalReAlloc(lpEditValueParam->pValueData, cbValueData, LMEM_MOVEABLE);

                        if (!pbValueData)
                        { 
                            InternalMessageBox(g_hInstance, hWnd, MAKEINTRESOURCE(IDS_EDITVALNOMEMORY),
                                MAKEINTRESOURCE(IDS_EDITVALERRORTITLE), MB_ICONERROR | MB_OK, NULL);
                            dwCommand = IDCANCEL;
                        }
                        else
                        {
                            lpEditValueParam->pValueData = pbValueData;
                        }
                    }
                    
                    // sizeof(TCHAR) to remove multi-string null char from count
                    lpEditValueParam->cbValueData = cbValueData - sizeof(TCHAR);
                    
                    GetDlgItemText(hWnd, IDC_VALUEDATA, (PTSTR)lpEditValueParam->pValueData, 
                                      lpEditValueParam->cbValueData/sizeof(TCHAR));
                }
                //  FALL THROUGH
                
            case IDCANCEL:
                EndDialog(hWnd, dwCommand);
                break;
                
            }
        }
        break;
        
    case WM_HELP:
        WinHelp(((LPHELPINFO) lParam)-> hItemHandle, g_pHelpFileName,
            HELP_WM_HELP, (ULONG_PTR) s_EditStringValueHelpIDs);
        break;
        
    case WM_CONTEXTMENU:
        WinHelp((HWND) wParam, g_pHelpFileName, HELP_CONTEXTMENU,
            (ULONG_PTR) s_EditStringValueHelpIDs);
        break;
        
    default:
        return FALSE;
        
    }
    
    return TRUE;
    
}

/*******************************************************************************
*
*  EditStringValue_OnInitDialog
*
*  DESCRIPTION:
*
*  PARAMETERS:
*     hWnd, handle of EditStringValue window.
*     hFocusWnd,
*     lParam,
*
*******************************************************************************/

BOOL
PASCAL
EditStringValue_OnInitDialog(
    HWND hWnd,
    HWND hFocusWnd,
    LPARAM lParam
    )
{
    LPEDITVALUEPARAM lpEditValueParam;

    //  Change maximum number of characters of the edit control, to its
    //  maximum limit (from 3000 characters to 4G characters).
    SendDlgItemMessage( hWnd, IDC_VALUEDATA, EM_LIMITTEXT, 0, 0L );

    SetWindowLongPtr(hWnd, DWLP_USER, lParam);
    lpEditValueParam = (LPEDITVALUEPARAM) lParam;

    if (lpEditValueParam->pValueName && lpEditValueParam->pValueName[0])
    {
        SetDlgItemText(hWnd, IDC_VALUENAME, lpEditValueParam->pValueName);
    }
    else
    {
        SetDlgItemText(hWnd, IDC_VALUENAME, g_RegEditData.pDefaultValue);
    }
    SetDlgItemText(hWnd, IDC_VALUEDATA, (PTSTR)lpEditValueParam-> pValueData);

    return TRUE;

    UNREFERENCED_PARAMETER(hFocusWnd);

}