You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
640 lines
15 KiB
640 lines
15 KiB
//#--------------------------------------------------------------
|
|
//
|
|
// File: SADataEntryCtrl.cpp
|
|
//
|
|
// Synopsis: This file holds the implmentation of the
|
|
// CSADataEntryCtrl class
|
|
//
|
|
// History: 12/15/2000 serdarun Created
|
|
//
|
|
// Copyright (C) 1999-2000 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
//#--------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
#include "LocalUIControls.h"
|
|
#include "HostName.h"
|
|
#include "satrace.h"
|
|
|
|
//
|
|
// registry path for LCID value
|
|
//
|
|
const WCHAR LOCALIZATION_MANAGER_REGISTRY_PATH [] =
|
|
L"SOFTWARE\\Microsoft\\ServerAppliance\\LocalizationManager\\resources";
|
|
|
|
|
|
const WCHAR LANGID_VALUE [] = L"LANGID";
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSADataEntryCtrl
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: get_TextValue
|
|
//
|
|
// Synopsis: This is the ISADataEntryCtrl interface method
|
|
// through which data entry is retrieved
|
|
//
|
|
// Arguments: BSTR *pVal
|
|
//
|
|
// Returns: HRESULT - success/failure
|
|
//
|
|
// History: serdarun Created 12/15/2000
|
|
//
|
|
//----------------------------------------------------------------
|
|
STDMETHODIMP CSADataEntryCtrl::get_TextValue(BSTR *pVal)
|
|
{
|
|
|
|
WCHAR strTextValue[SADataEntryCtrlMaxSize+1];
|
|
|
|
int iFirstIndex = 0;
|
|
int iSecondIndex = 0;
|
|
BOOL bCopiedFirstChar = FALSE;
|
|
|
|
if (pVal == NULL)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
|
|
//
|
|
// trim the beginning spaces and copy until next space
|
|
//
|
|
while ( iFirstIndex < m_lMaxSize+1 )
|
|
{
|
|
if ( m_strTextValue[iFirstIndex] == ' ' )
|
|
{
|
|
//
|
|
// this is one of the trailing spaces, stop copying
|
|
//
|
|
if ( bCopiedFirstChar )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bCopiedFirstChar = TRUE;
|
|
strTextValue[iSecondIndex] = m_strTextValue[iFirstIndex];
|
|
iSecondIndex++;
|
|
}
|
|
|
|
iFirstIndex++;
|
|
}
|
|
|
|
strTextValue[iSecondIndex] = 0;
|
|
*pVal = SysAllocString(strTextValue);
|
|
|
|
if (*pVal)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
return E_OUTOFMEMORY;
|
|
|
|
} // end of CSADataEntryCtrl::get_TextValue method
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: put_TextValue
|
|
//
|
|
// Synopsis: This is the ISADataEntryCtrl interface method
|
|
// through which data entry is set
|
|
//
|
|
// Arguments: BSTR newVal
|
|
//
|
|
// Returns: HRESULT - success/failure
|
|
//
|
|
// History: serdarun Created 12/15/2000
|
|
//
|
|
//----------------------------------------------------------------
|
|
STDMETHODIMP CSADataEntryCtrl::put_TextValue(BSTR newVal)
|
|
{
|
|
|
|
if (newVal == NULL)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
|
|
//
|
|
// reset the focus position
|
|
//
|
|
m_iPositionFocus = 0;
|
|
|
|
//
|
|
// must have at least one character
|
|
//
|
|
int iLength = wcslen(newVal);
|
|
if (iLength == 0)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
int iIndex = 0;
|
|
while ( (iIndex < m_lMaxSize ) )
|
|
{
|
|
if ( iIndex < iLength )
|
|
{
|
|
m_strTextValue[iIndex] = newVal[iIndex];
|
|
}
|
|
else
|
|
{
|
|
m_strTextValue[iIndex] = ' ';
|
|
}
|
|
iIndex++;
|
|
}
|
|
|
|
m_strTextValue[iIndex] = 0;
|
|
|
|
_wcsupr(m_strTextValue);
|
|
|
|
//
|
|
// draw the control again
|
|
//
|
|
FireViewChange();
|
|
return S_OK;
|
|
|
|
} // end of CSADataEntryCtrl::put_TextValue method
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: put_MaxSize
|
|
//
|
|
// Synopsis: This is the ISADataEntryCtrl interface method
|
|
// through which size of the data entry is set
|
|
//
|
|
// Arguments: LONG lMaxSize
|
|
//
|
|
// Returns: HRESULT - success/failure
|
|
//
|
|
// History: serdarun Created 12/15/2000
|
|
//
|
|
//----------------------------------------------------------------
|
|
STDMETHODIMP CSADataEntryCtrl::put_MaxSize(LONG lMaxSize)
|
|
{
|
|
|
|
if (lMaxSize <= 0)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
if (lMaxSize > SADataEntryCtrlMaxSize)
|
|
{
|
|
m_lMaxSize = SADataEntryCtrlMaxSize;
|
|
}
|
|
|
|
//
|
|
// reset the focus position
|
|
//
|
|
m_iPositionFocus = 0;
|
|
|
|
m_lMaxSize = lMaxSize;
|
|
|
|
//
|
|
// add and remove characters from current value based on max size
|
|
//
|
|
int iIndex = wcslen(m_strTextValue);
|
|
if (iIndex < m_lMaxSize+1)
|
|
{
|
|
while (iIndex < m_lMaxSize)
|
|
{
|
|
m_strTextValue[iIndex] = ' ';
|
|
iIndex++;
|
|
}
|
|
m_strTextValue[iIndex] = 0;
|
|
|
|
}
|
|
else if (iIndex > m_lMaxSize)
|
|
{
|
|
while (iIndex > m_lMaxSize)
|
|
{
|
|
m_strTextValue[iIndex] = 0;
|
|
iIndex--;
|
|
}
|
|
}
|
|
|
|
//
|
|
// draw the control again
|
|
//
|
|
FireViewChange();
|
|
|
|
return S_OK;
|
|
|
|
} // end of CSADataEntryCtrl::put_MaxSize method
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: put_TextCharSet
|
|
//
|
|
// Synopsis: This is the ISADataEntryCtrl interface method
|
|
// through which character set is set
|
|
//
|
|
// Arguments: BSTR newVal
|
|
//
|
|
// Returns: HRESULT - success/failure
|
|
//
|
|
// History: serdarun Created 12/15/2000
|
|
//
|
|
//----------------------------------------------------------------
|
|
STDMETHODIMP CSADataEntryCtrl::put_TextCharSet(BSTR newVal)
|
|
{
|
|
|
|
if (newVal == NULL)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
|
|
m_szTextCharSet = newVal;
|
|
|
|
return S_OK;
|
|
|
|
} // end of CSADataEntryCtrl::put_TextCharSet method
|
|
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: FinalConstruct
|
|
//
|
|
// Synopsis: Called just after the constructor,
|
|
// creates the font
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: HRESULT - success/failure
|
|
//
|
|
// History: serdarun Created 04/18/2001
|
|
//
|
|
//----------------------------------------------------------------
|
|
STDMETHODIMP CSADataEntryCtrl::FinalConstruct(void)
|
|
{
|
|
|
|
//
|
|
// set the font now
|
|
//
|
|
LOGFONT logfnt;
|
|
|
|
::memset (&logfnt, 0, sizeof (logfnt));
|
|
logfnt.lfOutPrecision = OUT_TT_PRECIS;
|
|
logfnt.lfClipPrecision = CLIP_DEFAULT_PRECIS;
|
|
logfnt.lfQuality = PROOF_QUALITY;
|
|
logfnt.lfPitchAndFamily = FF_SWISS | VARIABLE_PITCH;
|
|
logfnt.lfHeight = 12;
|
|
|
|
logfnt.lfCharSet = GetCharacterSet ();
|
|
|
|
//
|
|
// we chose the fontface for Japanese and let GDI
|
|
// decide for the rest
|
|
//
|
|
if (SHIFTJIS_CHARSET == logfnt.lfCharSet)
|
|
{
|
|
lstrcpy(logfnt.lfFaceName, TEXT("MS UI Gothic"));
|
|
}
|
|
else
|
|
{
|
|
lstrcpy(logfnt.lfFaceName, TEXT("Arial"));
|
|
}
|
|
|
|
m_hFont = ::CreateFontIndirect(&logfnt);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: FinalRelease
|
|
//
|
|
// Synopsis: Called just after the destructor,
|
|
// deletes the font
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// Returns: HRESULT - success/failure
|
|
//
|
|
// History: serdarun Created 04/18/2001
|
|
//
|
|
//----------------------------------------------------------------
|
|
STDMETHODIMP CSADataEntryCtrl::FinalRelease(void)
|
|
{
|
|
if (m_hFont)
|
|
{
|
|
DeleteObject(m_hFont);
|
|
}
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: GetCharacterSet
|
|
//
|
|
// Synopsis: This is method used to get the character set to use
|
|
// for the FONTS
|
|
// Arguments:
|
|
//
|
|
// Returns: BYTE - CharacterSet
|
|
//
|
|
// History: serdarun Created 04/18/2001
|
|
//
|
|
// Called By: FinalConstruct method
|
|
//
|
|
//----------------------------------------------------------------
|
|
BYTE CSADataEntryCtrl::GetCharacterSet ()
|
|
{
|
|
HKEY hOpenKey = NULL;
|
|
BYTE byCharSet = DEFAULT_CHARSET;
|
|
|
|
do
|
|
{
|
|
DWORD dwLangId = 0;
|
|
|
|
//
|
|
// open the local machine registry
|
|
//
|
|
LONG lRetVal = ::RegOpenKeyEx (
|
|
HKEY_LOCAL_MACHINE,
|
|
LOCALIZATION_MANAGER_REGISTRY_PATH,
|
|
NULL, //reserved
|
|
KEY_QUERY_VALUE,
|
|
&hOpenKey
|
|
);
|
|
if (ERROR_SUCCESS == lRetVal)
|
|
{
|
|
DWORD dwBufferSize = sizeof (dwLangId);
|
|
//
|
|
// get the LANGID now
|
|
//
|
|
lRetVal = ::RegQueryValueEx (
|
|
hOpenKey,
|
|
LANGID_VALUE,
|
|
NULL, //reserved
|
|
NULL,
|
|
(LPBYTE) &dwLangId,
|
|
&dwBufferSize
|
|
);
|
|
if (ERROR_SUCCESS == lRetVal)
|
|
{
|
|
SATracePrintf (
|
|
"CSADataEntryCtrl got the language ID:%d",
|
|
dwLangId
|
|
);
|
|
}
|
|
else
|
|
{
|
|
SATraceFailure (
|
|
"CSADataEntryCtrl unable to get language ID",
|
|
GetLastError()
|
|
);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SATraceFailure (
|
|
"CSADataEntryCtrl failed to open registry to get language id",
|
|
GetLastError());
|
|
}
|
|
|
|
switch (dwLangId)
|
|
{
|
|
case 0x401:
|
|
// Arabic
|
|
byCharSet = ARABIC_CHARSET;
|
|
break;
|
|
case 0x404:
|
|
//Chinese (Taiwan)
|
|
byCharSet = CHINESEBIG5_CHARSET;
|
|
break;
|
|
case 0x804:
|
|
//Chinese (PRC)
|
|
byCharSet = GB2312_CHARSET;
|
|
break;
|
|
case 0x408:
|
|
//Greek
|
|
byCharSet = GREEK_CHARSET;
|
|
break;
|
|
case 0x40D:
|
|
//Hebrew
|
|
byCharSet = HEBREW_CHARSET;
|
|
break;
|
|
case 0x411:
|
|
//Japanese
|
|
byCharSet = SHIFTJIS_CHARSET;
|
|
break;
|
|
case 0x419:
|
|
//Russian
|
|
byCharSet = RUSSIAN_CHARSET;
|
|
break;
|
|
case 0x41E:
|
|
//Thai
|
|
byCharSet = THAI_CHARSET;
|
|
break;
|
|
case 0x41F:
|
|
//Turkish
|
|
byCharSet = TURKISH_CHARSET;
|
|
break;
|
|
default:
|
|
byCharSet = ANSI_CHARSET;
|
|
break;
|
|
}
|
|
}
|
|
while (false);
|
|
|
|
if (hOpenKey) {::RegCloseKey (hOpenKey);}
|
|
|
|
SATracePrintf ("CSADataEntryCtrl using Character Set:%d", byCharSet);
|
|
|
|
return (byCharSet);
|
|
|
|
} // end of CSADataEntryCtrl::GetCharacterSet method
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: OnDraw
|
|
//
|
|
// Synopsis: This is the public method of CSADataEntryCtrl
|
|
// which handles paint messages
|
|
//
|
|
// Arguments: ATL_DRAWINFO& di
|
|
//
|
|
// Returns: HRESULT - success/failure
|
|
//
|
|
// History: serdarun Created 12/15/2000
|
|
//
|
|
//----------------------------------------------------------------
|
|
HRESULT CSADataEntryCtrl::OnDraw(ATL_DRAWINFO& di)
|
|
{
|
|
|
|
|
|
|
|
HFONT hOldFont;
|
|
|
|
//
|
|
// select this font
|
|
//
|
|
|
|
if (m_hFont)
|
|
{
|
|
hOldFont = (HFONT) ::SelectObject(di.hdcDraw, m_hFont);
|
|
}
|
|
|
|
|
|
//
|
|
// get the drawing rectangle
|
|
//
|
|
RECT& rc = *(RECT*)di.prcBounds;
|
|
|
|
WCHAR strTextValue[SADataEntryCtrlMaxSize+2];
|
|
|
|
int iIndex = 0;
|
|
int iDestIndex = 0;
|
|
|
|
int iLength = wcslen(m_strTextValue);
|
|
|
|
while (iIndex < m_lMaxSize)
|
|
{
|
|
if (iIndex == m_iPositionFocus)
|
|
{
|
|
strTextValue[iDestIndex] = '&';
|
|
iDestIndex++;
|
|
}
|
|
strTextValue[iDestIndex] = m_strTextValue[iIndex];
|
|
iDestIndex++;
|
|
iIndex++;
|
|
}
|
|
strTextValue[iDestIndex] = 0;
|
|
|
|
|
|
DrawText(
|
|
di.hdcDraw,
|
|
strTextValue,
|
|
wcslen(strTextValue),
|
|
&rc,
|
|
DT_VCENTER|DT_LEFT
|
|
);
|
|
|
|
if (m_hFont)
|
|
{
|
|
SelectObject(di.hdcDraw, hOldFont);
|
|
}
|
|
|
|
|
|
return S_OK;
|
|
|
|
}// end of CSADataEntryCtrl::OnDraw method
|
|
|
|
|
|
//++--------------------------------------------------------------
|
|
//
|
|
// Function: OnKeyDown
|
|
//
|
|
// Synopsis: This is the public method of CSADataEntryCtrl
|
|
// to handle keydown messages
|
|
//
|
|
// Arguments: windows message arguments
|
|
//
|
|
// Returns: HRESULT - success/failure
|
|
//
|
|
// History: serdarun Created 12/15/2000
|
|
//
|
|
//----------------------------------------------------------------
|
|
LRESULT CSADataEntryCtrl::OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
|
|
//
|
|
// notify the container about any key press
|
|
//
|
|
Fire_KeyPressed();
|
|
|
|
//
|
|
// Enter key received, notify the container
|
|
//
|
|
if (wParam == VK_RETURN)
|
|
{
|
|
Fire_DataEntered();
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// Escape key received, notify the container
|
|
//
|
|
if (wParam == VK_ESCAPE)
|
|
{
|
|
Fire_OperationCanceled();
|
|
return 0;
|
|
}
|
|
|
|
if (wParam == VK_RIGHT)
|
|
{
|
|
m_iPositionFocus++;
|
|
if (m_iPositionFocus >= m_lMaxSize)
|
|
{
|
|
m_iPositionFocus--;
|
|
|
|
}
|
|
}
|
|
else if (wParam == VK_LEFT)
|
|
{
|
|
m_iPositionFocus--;
|
|
if (m_iPositionFocus < 0)
|
|
{
|
|
m_iPositionFocus = 0;
|
|
|
|
}
|
|
}
|
|
else if (wParam == VK_UP)
|
|
{
|
|
WCHAR * pwStrCurrentValue = NULL;
|
|
|
|
pwStrCurrentValue = wcschr(m_szTextCharSet, m_strTextValue[m_iPositionFocus]);
|
|
if (NULL == pwStrCurrentValue)
|
|
{
|
|
m_strTextValue[m_iPositionFocus] = m_szTextCharSet[0];
|
|
}
|
|
else
|
|
{
|
|
pwStrCurrentValue++;
|
|
|
|
if (*pwStrCurrentValue != NULL)
|
|
{
|
|
m_strTextValue[m_iPositionFocus] = m_szTextCharSet[pwStrCurrentValue-m_szTextCharSet];
|
|
}
|
|
else
|
|
{
|
|
m_strTextValue[m_iPositionFocus] = m_szTextCharSet[0];
|
|
}
|
|
}
|
|
}
|
|
else if (wParam == VK_DOWN)
|
|
{
|
|
|
|
WCHAR * pwStrCurrentValue = NULL;
|
|
|
|
pwStrCurrentValue = wcschr(m_szTextCharSet, m_strTextValue[m_iPositionFocus]);
|
|
if (NULL == pwStrCurrentValue)
|
|
{
|
|
m_strTextValue[m_iPositionFocus] = m_szTextCharSet[0];
|
|
}
|
|
else
|
|
{
|
|
|
|
if (pwStrCurrentValue == m_szTextCharSet)
|
|
{
|
|
m_strTextValue[m_iPositionFocus] = m_szTextCharSet[wcslen(m_szTextCharSet)-1];
|
|
}
|
|
else
|
|
{
|
|
m_strTextValue[m_iPositionFocus] = m_szTextCharSet[pwStrCurrentValue-m_szTextCharSet-1];
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
FireViewChange();
|
|
return 0;
|
|
|
|
|
|
|
|
}// end of CSADataEntryCtrl::OnKeyDown method
|