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.
1710 lines
43 KiB
1710 lines
43 KiB
/**************************************************/
|
|
/* */
|
|
/* */
|
|
/* EUDC Character List ( Japan, China, Korea) */
|
|
/* */
|
|
/* */
|
|
/* Copyright (c) 1997-1999 Microsoft Corporation. */
|
|
/**************************************************/
|
|
|
|
#include "stdafx.h"
|
|
#include "eudcedit.h"
|
|
#include "eudclist.h"
|
|
#include "util.h"
|
|
#define STRSAFE_LIB
|
|
#include <strsafe.h>
|
|
|
|
#ifdef BUILD_ON_WINNT
|
|
#include "extfunc.h"
|
|
#endif // BUILD_ON_WINNT
|
|
|
|
|
|
/* Matrics of Characterlist */
|
|
#define NUM_CHAR 16 // Row of matrics
|
|
#define NUM_LINE 6 // Line of matrics
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
IMPLEMENT_DYNCREATE( CEudcList, CEdit)
|
|
BEGIN_MESSAGE_MAP( CEudcList, CEdit)
|
|
//{{AFX_MSG_MAP( CEudcList)
|
|
ON_WM_PAINT()
|
|
ON_WM_VSCROLL()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_LBUTTONDBLCLK()
|
|
ON_WM_SETCURSOR()
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_SETFOCUS()
|
|
ON_WM_KILLFOCUS()
|
|
ON_WM_RBUTTONUP()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
#ifdef BUILD_ON_WINNT
|
|
static CRect rcColumnHead[NUM_CHAR];
|
|
#endif //BUILD_ON_WINNT
|
|
static CRect rcEditChar[NUM_LINE][NUM_CHAR];
|
|
static CRect rcEditCode[NUM_LINE];
|
|
static BYTE ViewCode[NUM_LINE];
|
|
static BOOL bHasGlyph;
|
|
#define EUDCCODEBASE ((unsigned short)0xe000)
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Default Constructor */
|
|
/* */
|
|
/****************************************/
|
|
CEudcList::CEudcList()
|
|
{
|
|
// Initialize parameter( Japan, China and Korea)
|
|
SetInitEUDCCodeRange( CountryInfo.CurrentRange);
|
|
FocusFlag = FALSE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Set coderange of EUDC */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::SetInitEUDCCodeRange(
|
|
int nIndex)
|
|
{
|
|
if ( (nIndex >= ARRAYLEN(CountryInfo.sRange)) || (nIndex >= ARRAYLEN(CountryInfo.eRange)))
|
|
{
|
|
return;
|
|
}
|
|
m_Index = nIndex;
|
|
EUDC_SCode = CountryInfo.sRange[m_Index];
|
|
EUDC_ECode = CountryInfo.eRange[m_Index];
|
|
|
|
EUDC_EView =(CountryInfo.eRange[m_Index] & 0xfff0) -(0x10*(NUM_LINE-1));
|
|
if( SelectEUDC.m_Code[0] != '\0'){
|
|
SelectCode = (WORD)Mytcstol(SelectEUDC.m_Code, (TCHAR **)0, 16);
|
|
EUDC_SView = (WORD)Mytcstol(SelectEUDC.m_Code, (TCHAR **)0, 16);
|
|
EUDC_SView &= 0xfff0;
|
|
if( EUDC_EView <= EUDC_SView)
|
|
EUDC_SView = EUDC_EView;
|
|
}else{
|
|
EUDC_SView = CountryInfo.sRange[m_Index] & 0xfff0;
|
|
SelectCode = EUDC_SCode;
|
|
|
|
}
|
|
|
|
#ifdef BUILD_ON_WINNT
|
|
//In case of CHS, each range will have a different trail byte range
|
|
//after user selects a new range, we have to correct them with
|
|
//sOrigTralByte and eOrigTralByte and form new trail byte range.
|
|
if (CountryInfo.LangID == EUDC_CHS && !CountryInfo.bUnicodeMode)
|
|
CorrectTrailByteRange(m_Index);
|
|
#endif // BUILD_ON_WINNT
|
|
|
|
LButtonPt.x = LButtonPt.y = 0;
|
|
ScrlBarPos = (short)GetBarPosition( EUDC_SView);
|
|
this->SetScrollPos( SB_VERT, ScrlBarPos, TRUE);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Set coderange of EUDC */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::SetEUDCCodeRange(
|
|
int nIndex)
|
|
{
|
|
if ( (nIndex >= ARRAYLEN(CountryInfo.sRange)) || (nIndex >= ARRAYLEN(CountryInfo.eRange)))
|
|
{
|
|
return;
|
|
}
|
|
m_Index = nIndex;
|
|
EUDC_SView = CountryInfo.sRange[m_Index] & 0xfff0;
|
|
EUDC_EView =(CountryInfo.eRange[m_Index] & 0xfff0) -(0x10*(NUM_LINE-1));
|
|
EUDC_SCode = CountryInfo.sRange[m_Index];
|
|
EUDC_ECode = CountryInfo.eRange[m_Index];
|
|
|
|
#ifdef BUILD_ON_WINNT
|
|
//In case of CHS, each range will have a different trail byte range
|
|
//after user selects a new range, we have to correct them with
|
|
//sOrigTralByte and eOrigTralByte and form new trail byte range.
|
|
if (CountryInfo.LangID == EUDC_CHS && !CountryInfo.bUnicodeMode)
|
|
CorrectTrailByteRange(m_Index);
|
|
#endif // BUILD_ON_WINNT
|
|
|
|
SelectCode = (WORD)EUDC_SCode;
|
|
LButtonPt.x = LButtonPt.y = 0;
|
|
ScrlBarPos = (short)0;
|
|
this->SetScrollPos( SB_VERT, ScrlBarPos, TRUE);
|
|
}
|
|
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Destructor */
|
|
/* */
|
|
/****************************************/
|
|
CEudcList::~CEudcList()
|
|
{
|
|
SysFFont.DeleteObject();
|
|
EUDCFont.DeleteObject();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Correct it if code is illegal */
|
|
/* */
|
|
/****************************************/
|
|
WORD
|
|
CEudcList::CorrectEUDCCode(
|
|
WORD Code,
|
|
BOOL UporDown)
|
|
{
|
|
COUNTRYINFO Info;
|
|
WORD wCode;
|
|
BYTE LByte, HByte;
|
|
int TralPos = 0;
|
|
|
|
LByte = LOBYTE( Code);
|
|
HByte = HIBYTE( Code);
|
|
Info = CountryInfo;
|
|
|
|
//decide code falls in which trail byte range
|
|
for( int i = 0; i < Info.nTralByte; i++){
|
|
if( LByte >= (Info.sTralByte[i] & 0xf0) &&
|
|
LByte <= (Info.eTralByte[i] & 0xf0)){
|
|
goto RET;
|
|
}else if( LByte < (Info.sTralByte[i] & 0xf0)){
|
|
TralPos = i;
|
|
break;
|
|
}else TralPos = i+1;
|
|
}
|
|
|
|
#ifdef BUILD_ON_WINNT
|
|
// If we are going up on the code range, make the code in the first
|
|
// first line of next valid trailbyte. Otherwise make the code in
|
|
// the last line the preivous valid range.
|
|
if( UporDown){
|
|
if( TralPos == Info.nTralByte){
|
|
TralPos =0;
|
|
HByte += 0x1;
|
|
}
|
|
LByte = Info.sTralByte[TralPos] & 0xf0;
|
|
}else{
|
|
if( TralPos ==0 ){
|
|
HByte -= 0x1;
|
|
TralPos = Info.nTralByte;
|
|
}
|
|
LByte = Info.eTralByte[TralPos-1] & 0xf0;
|
|
}
|
|
#else
|
|
if( UporDown)
|
|
if( TralPos == Info.nTralByte){
|
|
LByte = (Info.sTralByte[0] & 0xf0);
|
|
HByte += 0x1;
|
|
}else LByte = (Info.sTralByte[TralPos] & 0xf0);
|
|
else{
|
|
if( !TralPos){
|
|
LByte = (Info.eTralByte[Info.nTralByte-1] & 0xf0);
|
|
HByte -= 0x1;
|
|
}else LByte = (Info.eTralByte[TralPos-1] & 0xf0);
|
|
}
|
|
#endif // BUILD_ON_WINNT
|
|
|
|
RET:
|
|
wCode = MAKEWORD( LByte, HByte);
|
|
return wCode;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Get position of scrollbar */
|
|
/* */
|
|
/****************************************/
|
|
#ifdef BUILD_ON_WINNT
|
|
int
|
|
CEudcList::GetBarPosition(
|
|
WORD Code)
|
|
{
|
|
COUNTRYINFO Info;
|
|
WORD NumPage=0, NumCode=0;
|
|
BYTE Space[MAX_LEADBYTES];
|
|
int TotalSpace=0,TralPos=0;
|
|
int Err;
|
|
BOOL ValidCode=FALSE;
|
|
|
|
Info = CountryInfo;
|
|
NumPage = HIBYTE( Code) - HIBYTE( EUDC_SCode);
|
|
|
|
// Calculate each code space block for each trail byte range
|
|
// and decide how many of each we count.
|
|
|
|
/* space before first trailbyte range */
|
|
Space[0] = ( Info.sTralByte[0] & 0xf0);
|
|
for( int i = 1; i < Info.nTralByte; i++){
|
|
Space[i] = (( Info.sTralByte[i] & 0xf0)
|
|
- ( Info.eTralByte[i-1] & 0xf0) - 0x10);
|
|
}
|
|
|
|
/* space after last trailbyte range */
|
|
Space[i] = (0xff - Info.eTralByte[Info.nTralByte-1]) & 0xf0;
|
|
|
|
for (i = 0; i < Info.nTralByte; i++)
|
|
if( LOBYTE( Code) >= (Info.sTralByte[i] & 0xf0) &&
|
|
LOBYTE( Code) <= (Info.eTralByte[i] & 0xff)){
|
|
ValidCode=TRUE; //within our trail byte range.
|
|
TralPos=i;
|
|
break;
|
|
}
|
|
|
|
if (!ValidCode)
|
|
return(0); //not within our trail byte range.
|
|
|
|
for (i = 0; i < Info.nTralByte; i++){
|
|
if (Info.sTralByte[TralPos] > LOBYTE( EUDC_SCode )){
|
|
if((Info.sTralByte[i]) > LOBYTE(EUDC_SCode) && i <= TralPos)
|
|
TotalSpace += Space[i] * (NumPage + 1);
|
|
else
|
|
TotalSpace += Space[i] * NumPage ;
|
|
}else{
|
|
if((Info.sTralByte[i] & 0xf0) < LOBYTE(EUDC_SCode) && i > TralPos)
|
|
TotalSpace += Space[i] * (NumPage - 1);
|
|
else
|
|
TotalSpace += Space[i] * NumPage ;
|
|
}
|
|
|
|
}
|
|
TotalSpace += Space[i] * NumPage;
|
|
|
|
Err = EUDC_SCode & 0x000f;
|
|
NumCode = Code - EUDC_SCode - TotalSpace + Err;
|
|
return( NumCode /NUM_CHAR);
|
|
}
|
|
#else
|
|
int
|
|
CEudcList::GetBarPosition(
|
|
WORD Code)
|
|
{
|
|
COUNTRYINFO Info;
|
|
WORD NumPage, NumCode;
|
|
BYTE Space[MAX_LEADBYTES];
|
|
int LoSpace, HiSpace;
|
|
int Err;
|
|
|
|
Info = CountryInfo;
|
|
NumPage = HIBYTE( Code) - HIBYTE( EUDC_SCode);
|
|
Space[0] = ( Info.sTralByte[0] & 0xf0);
|
|
Space[1] = 0x00;
|
|
for( int i = 1; i < Info.nTralByte; i++){
|
|
Space[i] = (( Info.sTralByte[i] & 0xf0)
|
|
- ( Info.eTralByte[i-1] & 0xf0) - 0x10);
|
|
}
|
|
|
|
for( i = 0; i < Info.nTralByte; i++){
|
|
if( LOBYTE( Code) >= (Info.sTralByte[i] & 0xf0) &&
|
|
LOBYTE( Code) <= (Info.eTralByte[i] & 0xff)){
|
|
if( LOBYTE( EUDC_SCode) > Info.sTralByte[0]){
|
|
LoSpace = ( Space[0] * NumPage);
|
|
HiSpace = ( Space[1] * (i + NumPage - 1));
|
|
}else{
|
|
LoSpace = ( Space[0] * NumPage);
|
|
HiSpace = ( Space[1] * (i + NumPage));
|
|
}
|
|
Err = EUDC_SCode & 0x000f;
|
|
NumCode = Code - EUDC_SCode - LoSpace - HiSpace + Err;
|
|
break;
|
|
}
|
|
}
|
|
return( NumCode /NUM_CHAR);
|
|
}
|
|
#endif // BUILD_ON_WINNT
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Calculate bar pos from code */
|
|
/* */
|
|
/****************************************/
|
|
WORD
|
|
CEudcList::GetCodeScrPos(
|
|
int Pos)
|
|
{
|
|
WORD i;
|
|
WORD Code = 0;
|
|
WORD NumLine = 0;
|
|
WORD PNumLine = 0;
|
|
|
|
if( !Pos)
|
|
return( EUDC_SCode & 0xfff0);
|
|
#ifdef BUILD_ON_WINNT
|
|
// we dont't need to go through each char, instead we can examine each
|
|
// line to make this faster
|
|
for( i = EUDC_SCode; i <= EUDC_ECode; i+= NUM_CHAR){
|
|
#else
|
|
for( i = EUDC_SCode; i <= EUDC_ECode; ++i){
|
|
#endif // BUILD_ON_WINNT
|
|
NumLine = (WORD)GetBarPosition( i);
|
|
if( NumLine >= Pos){
|
|
NumLine = PNumLine;
|
|
break;
|
|
}
|
|
PNumLine = NumLine;
|
|
}
|
|
Code = i;
|
|
Pos -= NumLine;
|
|
Code &= 0xfff0;
|
|
|
|
return Code;
|
|
}
|
|
|
|
#define FIX_SPACE 6
|
|
#define LINEWIDTH 4
|
|
/****************************************/
|
|
/* */
|
|
/* Calcurate character size */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::CalcCharSize()
|
|
{
|
|
TCHAR Dummy[] = TEXT("FA40");
|
|
int Sx;
|
|
int OldMode;
|
|
|
|
CClientDC dc( this);
|
|
|
|
this->GetClientRect( &EditListRect);
|
|
OldMode = dc.SetMapMode( MM_TEXT);
|
|
|
|
CFont *OldFont = dc.SelectObject( &SysFFont);
|
|
GetTextExtentPoint32( dc.GetSafeHdc(), Dummy, 4, &FixSize);
|
|
FixSize.cx += FIX_SPACE;
|
|
dc.SelectObject( OldFont);
|
|
|
|
CharSize.cy = ( EditListRect.Height()
|
|
- (NUM_LINE-1)*LINEWIDTH - 2) / NUM_LINE;
|
|
CharSize.cx = ( EditListRect.Width()
|
|
- FixSize.cx - 2 - (NUM_CHAR*LINEWIDTH)) / NUM_CHAR;
|
|
|
|
for( int i = 0; i < NUM_LINE; i++){
|
|
rcEditCode[i].left = 1;
|
|
rcEditCode[i].top = 1 + i*( CharSize.cy + LINEWIDTH);
|
|
rcEditCode[i].right = rcEditCode[i].left + FixSize.cx;
|
|
rcEditCode[i].bottom = rcEditCode[i].top + CharSize.cy;
|
|
Sx = rcEditCode[i].right + LINEWIDTH;
|
|
for( int j = 0; j < NUM_CHAR; j++){
|
|
rcEditChar[i][j].left = Sx +j*(CharSize.cx+LINEWIDTH);
|
|
rcEditChar[i][j].top = rcEditCode[i].top;
|
|
rcEditChar[i][j].right = rcEditChar[i][j].left
|
|
+ CharSize.cx;
|
|
rcEditChar[i][j].bottom = rcEditChar[i][j].top
|
|
+ CharSize.cy;
|
|
}
|
|
}
|
|
#ifdef BUILD_ON_WINNT
|
|
for( int j = 0; j < NUM_CHAR; j++){
|
|
rcColumnHead[j].left = Sx +j*(CharSize.cx+LINEWIDTH);
|
|
rcColumnHead[j].top = 1;
|
|
rcColumnHead[j].right = rcColumnHead[j].left + CharSize.cx;
|
|
rcColumnHead[j].bottom = 1 + FixSize.cy;
|
|
}
|
|
#endif //BUILD_ON_WINNT
|
|
dc.SetMapMode( MM_TEXT);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_PAINT" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::OnPaint()
|
|
{
|
|
register int i, j, k;
|
|
WORD Code;
|
|
CFont *OldFont;
|
|
BYTE Glyph[800];
|
|
BOOL bGlyph = FALSE;
|
|
HRESULT hresult;
|
|
|
|
CPaintDC dc( this);
|
|
int BottomCode = GetBarPosition((WORD)EUDC_EView);
|
|
SetScrollRange( SB_VERT, 0, BottomCode, FALSE);
|
|
this->SetScrollPos( SB_VERT, ScrlBarPos, TRUE);
|
|
|
|
Code = EUDC_SView;
|
|
int OldMapMode = dc.SetMapMode( MM_TEXT);
|
|
dc.SetViewportOrg( 0, 0);
|
|
OldFont = dc.SelectObject( &SysFFont);
|
|
|
|
//
|
|
// access *.euf to set bits in the array (800 * 8 = 6400)
|
|
// to indicate a char has a glyph
|
|
//
|
|
bGlyph = GetGlyph(SelectEUDC.m_File, Glyph);
|
|
for( i = 0; i < NUM_LINE; i++){
|
|
BYTE CodeArray[10];
|
|
int xOffset, yOffset;
|
|
|
|
// Check character code
|
|
dc.SelectObject( &SysFFont);
|
|
Code = CorrectEUDCCode( Code, TRUE);
|
|
//*STRSAFE* wsprintf((LPTSTR)CodeArray, TEXT("%04X"), Code);
|
|
hresult = StringCbPrintf((LPTSTR)CodeArray , sizeof(CodeArray), TEXT("%04X"), Code);
|
|
if (!SUCCEEDED(hresult))
|
|
{
|
|
return ;
|
|
}
|
|
|
|
dc.SetBkColor( COLOR_FACE);
|
|
dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT)); // COLOR_BLACK);
|
|
if( rcEditChar[i][0].Height() > FixSize.cy){
|
|
yOffset = ( rcEditChar[i][0].Height() - FixSize.cy) /2;
|
|
}else yOffset = 0;
|
|
|
|
ExtTextOut( dc.GetSafeHdc(), rcEditCode[i].left,
|
|
rcEditCode[i].top + yOffset,
|
|
ETO_OPAQUE, &rcEditCode[i],
|
|
(LPCTSTR)CodeArray, 4, NULL);
|
|
|
|
dc.SelectObject( &EUDCFont);
|
|
for( j = 0; j < NUM_CHAR; j++,Code++){
|
|
BYTE sOffset;
|
|
CSize cSize;
|
|
BOOL flg;
|
|
int wLength;
|
|
|
|
//
|
|
// see if the character has a glyph
|
|
//
|
|
bHasGlyph = TRUE;
|
|
if(bGlyph == TRUE)
|
|
{
|
|
WORD wIndex;
|
|
if (CountryInfo.bUnicodeMode)
|
|
wIndex = Code - EUDCCODEBASE;
|
|
else
|
|
{
|
|
CHAR pchar[3];
|
|
WCHAR wpchar[2];
|
|
pchar[0] = HIBYTE(Code);
|
|
pchar[1] = LOBYTE(Code);
|
|
pchar[2] = 0;
|
|
MultiByteToWideChar(CP_ACP, 0, pchar, 2, wpchar, 1);
|
|
wIndex = wpchar[0] - EUDCCODEBASE;
|
|
}
|
|
if((Glyph[wIndex>>3] & (0x80>>(wIndex%8))) == 0)
|
|
bHasGlyph = FALSE;
|
|
}
|
|
//fix for FontIsLinked
|
|
else
|
|
bHasGlyph = FALSE;
|
|
//
|
|
|
|
flg = FALSE;
|
|
sOffset = LOBYTE( Code);
|
|
for( k = 0; k < CountryInfo.nTralByte; k++){
|
|
if( sOffset >= CountryInfo.sTralByte[k] &&
|
|
sOffset <= CountryInfo.eTralByte[k]){
|
|
flg = TRUE;
|
|
}
|
|
}
|
|
if((Code < CountryInfo.sRange[cRange])
|
|
||(Code > CountryInfo.eRange[cRange]))
|
|
flg = FALSE;
|
|
|
|
|
|
if( !flg) continue;
|
|
|
|
if (CountryInfo.bUnicodeMode){
|
|
CodeArray[1] = HIBYTE(Code);
|
|
CodeArray[0] = LOBYTE(Code);
|
|
wLength = 1;
|
|
}
|
|
else{
|
|
CodeArray[0] = HIBYTE(Code);
|
|
CodeArray[1] = LOBYTE(Code);
|
|
wLength = 2;
|
|
}
|
|
CodeArray[2] = (BYTE)'\0';
|
|
|
|
BOOL PtIn;
|
|
|
|
if(( rcEditChar[i][j].PtInRect( LButtonPt) ||
|
|
SelectCode == Code) && wLength != 0){
|
|
TCHAR CodeNum[10];
|
|
|
|
// If character is selected by left clickking ,
|
|
// Put it on dialog.
|
|
PtIn = TRUE;
|
|
SelectCode = Code;
|
|
dc.SetBkColor(COLOR_FACE);
|
|
dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT)); // COLOR_BLACK);
|
|
//*STRSAFE* wsprintf(CodeNum, TEXT("%04X"),Code);
|
|
hresult = StringCchPrintf(CodeNum , ARRAYLEN(CodeNum), TEXT("%04X"),Code);
|
|
if (!SUCCEEDED(hresult))
|
|
{
|
|
return ;
|
|
}
|
|
|
|
GetParent()->SetDlgItemText(IDC_CODECUST,CodeNum);
|
|
|
|
if (CountryInfo.bUnicodeMode)
|
|
{
|
|
//*STRSAFE* lstrcpyW((WCHAR *)ViewCode, (WCHAR *)CodeArray);
|
|
hresult = StringCbCopyW((WCHAR *)ViewCode, sizeof(ViewCode), (WCHAR *)CodeArray);
|
|
if (!SUCCEEDED(hresult))
|
|
{
|
|
return ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//*STRSAFE* lstrcpyA((CHAR *)ViewCode, (CHAR *)CodeArray);
|
|
hresult = StringCbCopyA((CHAR *)ViewCode, sizeof(ViewCode), (CHAR *)CodeArray);
|
|
if (!SUCCEEDED(hresult))
|
|
{
|
|
return ;
|
|
}
|
|
|
|
}
|
|
GetParent()->SendMessage( WM_VIEWUPDATE, 0, 0);
|
|
}else{
|
|
PtIn = FALSE;
|
|
dc.SetBkColor( COLOR_FACE);
|
|
dc.SetTextColor( GetSysColor(COLOR_WINDOWTEXT)); //COLOR_BLACK);
|
|
}
|
|
|
|
if (CountryInfo.bUnicodeMode)
|
|
GetTextExtentPoint32W( dc.GetSafeHdc(), (LPCWSTR)CodeArray, wLength, &cSize);
|
|
else
|
|
GetTextExtentPoint32A( dc.GetSafeHdc(), (LPCSTR)CodeArray, wLength, &cSize);
|
|
|
|
if( rcEditChar[i][j].Width() > cSize.cx){
|
|
xOffset = rcEditChar[i][j].Width() - cSize.cx;
|
|
xOffset /= 2;
|
|
}else xOffset = 0;
|
|
|
|
if( rcEditChar[i][j].Height() > cSize.cy){
|
|
yOffset = rcEditChar[i][j].Height() - cSize.cy;
|
|
yOffset /= 2;
|
|
}else yOffset = 0;
|
|
|
|
if(bHasGlyph == TRUE)
|
|
{
|
|
if (CountryInfo.bUnicodeMode)
|
|
{
|
|
#ifdef UNICODE
|
|
ExtTextOutW(dc.GetSafeHdc(),rcEditChar[i][j].left + xOffset,
|
|
rcEditChar[i][j].top + yOffset, ETO_OPAQUE,
|
|
&rcEditChar[i][j], (LPCWSTR)CodeArray, wLength, NULL);
|
|
|
|
#else
|
|
CHAR ViewTmp[2];
|
|
wLength = WideCharToMultiByte(CP_ACP, 0, (LPWSTR) CodeArray, 1, ViewTmp, 2, NULL, NULL);
|
|
ExtTextOutA(dc.GetSafeHdc(),rcEditChar[i][j].left + xOffset,
|
|
rcEditChar[i][j].top + yOffset, ETO_OPAQUE,
|
|
&rcEditChar[i][j], (LPCSTR)ViewTmp, wLength, NULL);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
ExtTextOutA(dc.GetSafeHdc(), rcEditChar[i][j].left + xOffset,
|
|
rcEditChar[i][j].top + yOffset, ETO_OPAQUE,
|
|
&rcEditChar[i][j], (LPCSTR)CodeArray,
|
|
wLength, NULL);
|
|
}
|
|
}
|
|
DrawConcave( &dc, rcEditChar[i][j], PtIn);
|
|
}
|
|
}
|
|
dc.SetMapMode( OldMapMode);
|
|
dc.SelectObject( OldFont);
|
|
|
|
LButtonPt.x = LButtonPt.y = 0;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_VSCROLL" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::OnVScroll(
|
|
UINT nSBCode,
|
|
UINT nPos,
|
|
CScrollBar* pScrollBar)
|
|
{
|
|
int MoveScr;
|
|
BOOL ThumbTrkFlag;
|
|
BOOL ThumbPosFlag;
|
|
|
|
MoveScr = 0;
|
|
ThumbTrkFlag = FALSE;
|
|
ThumbPosFlag = FALSE;
|
|
BarRange = GetBarPosition((WORD)EUDC_EView);
|
|
SetScrollRange( SB_VERT, 0, BarRange, FALSE);
|
|
switch( nSBCode)
|
|
{
|
|
case SB_LINEDOWN:
|
|
if(( EUDC_SView + NUM_CHAR) <= EUDC_EView){
|
|
MoveScr = 0 - (CharSize.cy + LINEWIDTH);
|
|
EUDC_SView += NUM_CHAR;
|
|
EUDC_SView = CorrectEUDCCode(EUDC_SView,TRUE);
|
|
ScrlBarPos = (short)GetBarPosition( EUDC_SView);
|
|
}
|
|
break;
|
|
|
|
case SB_LINEUP:
|
|
if(( EUDC_SView - NUM_CHAR) >= ( EUDC_SCode & 0xfff0)){
|
|
MoveScr = CharSize.cy + LINEWIDTH;
|
|
EUDC_SView -= NUM_CHAR;
|
|
EUDC_SView = CorrectEUDCCode(EUDC_SView,FALSE);
|
|
ScrlBarPos = (short)GetBarPosition( EUDC_SView);
|
|
}
|
|
break;
|
|
|
|
case SB_PAGEDOWN:
|
|
if(( EUDC_SView + NUM_CHAR*NUM_LINE) <= EUDC_EView){
|
|
MoveScr = ( 0-(CharSize.cy+LINEWIDTH))*NUM_LINE;
|
|
ScrlBarPos = (short)GetBarPosition( EUDC_SView);
|
|
ScrlBarPos += NUM_LINE;
|
|
EUDC_SView = GetCodeScrPos( ScrlBarPos);
|
|
}else{
|
|
MoveScr = ( 0-(CharSize.cy+LINEWIDTH))*NUM_LINE;
|
|
EUDC_SView = EUDC_EView;
|
|
ScrlBarPos = (short)GetBarPosition( EUDC_SView);
|
|
}
|
|
break;
|
|
|
|
case SB_PAGEUP:
|
|
if(( EUDC_SView - NUM_CHAR*NUM_LINE)
|
|
>= ( EUDC_SCode & 0xfff0)){
|
|
MoveScr = (CharSize.cy + LINEWIDTH)*NUM_LINE;
|
|
ScrlBarPos = (short)GetBarPosition( EUDC_SView);
|
|
ScrlBarPos -= NUM_LINE;
|
|
EUDC_SView = GetCodeScrPos( ScrlBarPos);
|
|
}else{
|
|
MoveScr = (CharSize.cy + LINEWIDTH)*NUM_LINE;
|
|
EUDC_SView = (EUDC_SCode & 0xfff0);
|
|
ScrlBarPos = (short)GetBarPosition( EUDC_SView);
|
|
}
|
|
break;
|
|
|
|
case SB_TOP:
|
|
EUDC_SView = ( EUDC_SCode & 0xfff0);
|
|
ScrlBarPos = 0;
|
|
break;
|
|
|
|
case SB_BOTTOM:
|
|
EUDC_SView = EUDC_EView;
|
|
ScrlBarPos = (short)BarRange;
|
|
break;
|
|
|
|
case SB_THUMBPOSITION:
|
|
ThumbPosFlag = TRUE;
|
|
ScrlBarPos = (short)nPos;
|
|
EUDC_SView = GetCodeScrPos( nPos);
|
|
break;
|
|
|
|
case SB_THUMBTRACK:
|
|
ThumbTrkFlag = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if( abs( MoveScr) < (CharSize.cy + LINEWIDTH)*NUM_LINE &&
|
|
abs( MoveScr) > 0 && !ThumbTrkFlag){
|
|
CRect ScrllRect;
|
|
CRect ClintRect;
|
|
|
|
GetClientRect( &ClintRect);
|
|
ScrllRect.CopyRect( &ClintRect);
|
|
if( MoveScr < 0){
|
|
ClintRect.top = 0 - MoveScr;
|
|
this->ScrollWindow( 0, MoveScr, &ClintRect, NULL);
|
|
ScrllRect.top = ( 0 - MoveScr)*(NUM_LINE-1);
|
|
}else{
|
|
ClintRect.top = LINEWIDTH;
|
|
ClintRect.bottom = MoveScr*(NUM_LINE - 1);
|
|
this->ScrollWindow( 0, MoveScr, &ClintRect, NULL);
|
|
ScrllRect.top = 0;
|
|
ScrllRect.bottom = ScrllRect.top + MoveScr;
|
|
}
|
|
this->InvalidateRect( &ScrllRect, FALSE);
|
|
}else if(!ThumbTrkFlag && ( MoveScr || ThumbPosFlag)){
|
|
this->Invalidate( TRUE);
|
|
}
|
|
this->SetScrollPos( SB_VERT, ScrlBarPos, TRUE);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_LBUTTONDOWN" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::OnLButtonDown(
|
|
UINT nFlags,
|
|
CPoint point)
|
|
{
|
|
CRect test;
|
|
BOOL PtIn;
|
|
unsigned int i, j;
|
|
|
|
PtIn = FALSE;
|
|
this->SetFocus();
|
|
for( i = 0; i < NUM_LINE; i++){
|
|
for( j = 0; j < NUM_CHAR; j++){
|
|
if( rcEditChar[i][j].PtInRect( point)){
|
|
if( IsCorrectChar( i, j))
|
|
PtIn = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if( !PtIn){
|
|
MessageBeep((UINT)-1);
|
|
return;
|
|
}
|
|
|
|
LButtonPt = point;
|
|
SearchSelectPosition();
|
|
SelectCode = 0;
|
|
|
|
|
|
for( i = 0; i < NUM_LINE; i++){
|
|
for( j = 0; j < NUM_CHAR; j++){
|
|
if( rcEditChar[i][j].PtInRect( LButtonPt)){
|
|
|
|
test.SetRect( rcEditChar[i][j].left - 2,
|
|
rcEditChar[i][j].top - 2,
|
|
rcEditChar[i][j].right + 2,
|
|
rcEditChar[i][j].bottom + 2);
|
|
|
|
this->InvalidateRect( &test, FALSE);
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
this->UpdateWindow();
|
|
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_LBUTTONDBLCLK" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::OnLButtonDblClk(
|
|
UINT nFlags,
|
|
CPoint point)
|
|
{
|
|
BOOL PtIn;
|
|
unsigned int i, j;
|
|
|
|
LButtonPt = point;
|
|
this->Invalidate( FALSE);
|
|
this->UpdateWindow();
|
|
|
|
PtIn = FALSE;
|
|
this->SetFocus();
|
|
for( i = 0; i < NUM_LINE; i++){
|
|
for( j = 0; j < NUM_CHAR; j++){
|
|
if( rcEditChar[i][j].PtInRect( point)){
|
|
if( IsCorrectChar( i, j))
|
|
PtIn = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if( !PtIn){
|
|
MessageBeep((UINT)-1);
|
|
return;
|
|
}else{
|
|
GetParent()->PostMessage( WM_COMMAND, IDOK, 0L);
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_SETCURSOR" */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEudcList::OnSetCursor(
|
|
CWnd* pWnd,
|
|
UINT nHitTest,
|
|
UINT message)
|
|
{
|
|
::SetCursor( AfxGetApp()->LoadStandardCursor(IDC_ARROW));
|
|
return TRUE;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw ConcaveRectangle */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::DrawConcave(
|
|
CDC *dc,
|
|
CRect rect,
|
|
BOOL PtIn)
|
|
{
|
|
CBrush ConBrush, *OldBrush;
|
|
CRect Rt, Rf;
|
|
|
|
if (!dc)
|
|
{
|
|
return;
|
|
}
|
|
Rt.SetRect( rect.left-1, rect.top-1, rect.right+1, rect.bottom+1);
|
|
Rf.CopyRect( &rect);
|
|
|
|
if( !PtIn){
|
|
ConBrush.CreateSolidBrush( COLOR_HLIGHT);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.top, Rt.Width(), 1, PATCOPY);
|
|
dc->PatBlt( Rt.left, Rt.top, 1, Rt.Height(), PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
|
|
ConBrush.CreateSolidBrush( COLOR_SHADOW);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.bottom, Rt.Width(), 1, PATCOPY);
|
|
dc->PatBlt( Rt.right, Rt.top, 1, Rt.Height()+1, PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
|
|
if( FocusFlag){
|
|
CBrush fBrush;
|
|
CPen fPen, *OldPen;
|
|
|
|
fBrush.CreateStockObject( NULL_BRUSH);
|
|
fPen.CreatePen( PS_SOLID, 1, COLOR_FACE);
|
|
OldBrush = dc->SelectObject( &fBrush);
|
|
OldPen = dc->SelectObject( &fPen);
|
|
dc->Rectangle( &Rf);
|
|
dc->SelectObject( OldBrush);
|
|
dc->SelectObject( OldPen);
|
|
fBrush.DeleteObject();
|
|
fPen.DeleteObject();
|
|
}
|
|
}else{
|
|
ConBrush.CreateSolidBrush( COLOR_SHADOW);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.top, Rt.Width(), 1, PATCOPY);
|
|
dc->PatBlt( Rt.left, Rt.top, 1, Rt.Height(), PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
|
|
ConBrush.CreateSolidBrush( COLOR_HLIGHT);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.bottom, Rt.Width(), 1, PATCOPY);
|
|
dc->PatBlt( Rt.right, Rt.top, 1, Rt.Height()+1, PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
|
|
if( FocusFlag){
|
|
CBrush fBrush;
|
|
CPen fPen, *OldPen;
|
|
|
|
fBrush.CreateStockObject( NULL_BRUSH);
|
|
fPen.CreatePen( PS_SOLID, 1, COLOR_SHADOW);
|
|
OldBrush = dc->SelectObject( &fBrush);
|
|
OldPen = dc->SelectObject( &fPen);
|
|
dc->Rectangle( &Rf);
|
|
dc->SelectObject( OldBrush);
|
|
dc->SelectObject( OldPen);
|
|
fBrush.DeleteObject();
|
|
fPen.DeleteObject();
|
|
}
|
|
}
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_KEYDOWN" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::OnKeyDown(
|
|
UINT nChar,
|
|
UINT nRepCnt,
|
|
UINT nFlags)
|
|
{
|
|
int sPos;
|
|
int ePos;
|
|
#ifdef BUILD_ON_WINNT
|
|
int i;
|
|
WORD TmpCode;
|
|
#endif // BUILD_ON_WINNT
|
|
|
|
if( nChar == VK_DOWN || nChar == VK_UP ||
|
|
nChar == VK_RIGHT || nChar == VK_LEFT){
|
|
sPos = GetBarPosition( EUDC_SView);
|
|
ePos = GetBarPosition( SelectCode);
|
|
if( ePos - sPos >= NUM_LINE || ePos < sPos){
|
|
EUDC_SView = SelectCode & 0xfff0;
|
|
ScrlBarPos = (short)GetBarPosition( EUDC_SView);
|
|
this->Invalidate(FALSE);
|
|
this->UpdateWindow();
|
|
}
|
|
|
|
switch( nChar){
|
|
|
|
case VK_DOWN:
|
|
if( SelectCode + NUM_CHAR > EUDC_ECode)
|
|
break;
|
|
#ifdef BUILD_ON_WINNT
|
|
TmpCode = SelectCode + NUM_CHAR;
|
|
TmpCode = CorrectEUDCCodeKey( TmpCode, NUM_CHAR, TRUE);
|
|
sPos = GetBarPosition( EUDC_SView);
|
|
ePos = GetBarPosition( TmpCode);
|
|
for (i=0;i <= ePos - sPos - NUM_LINE; i++){
|
|
#else
|
|
if( ePos - sPos >= NUM_LINE - 1){
|
|
#endif // BUILD_ON_WINNT
|
|
this->SendMessage( WM_VSCROLL, SB_LINEDOWN, 0);
|
|
}
|
|
SearchSelectPosition();
|
|
SelectCode += NUM_CHAR;
|
|
SelectCode = CorrectEUDCCodeKey( SelectCode,
|
|
NUM_CHAR, TRUE);
|
|
SearchSelectPosition();
|
|
this->UpdateWindow();
|
|
break;
|
|
|
|
case VK_UP:
|
|
if( SelectCode - NUM_CHAR < EUDC_SCode)
|
|
break;
|
|
#ifdef BUILD_ON_WINNT
|
|
TmpCode = SelectCode - NUM_CHAR;
|
|
TmpCode = CorrectEUDCCodeKey( TmpCode, NUM_CHAR, FALSE);
|
|
sPos = GetBarPosition( EUDC_SView);
|
|
ePos = GetBarPosition( TmpCode);
|
|
for ( i=0; i < sPos - ePos; i++){
|
|
#else
|
|
if( SelectCode - NUM_CHAR < EUDC_SView){
|
|
#endif // BUILD_ON_WINNT
|
|
this->SendMessage( WM_VSCROLL, SB_LINEUP, 0);
|
|
}
|
|
|
|
SearchSelectPosition();
|
|
SelectCode -= NUM_CHAR;
|
|
SelectCode = CorrectEUDCCodeKey( SelectCode,
|
|
NUM_CHAR, FALSE);
|
|
SearchSelectPosition();
|
|
this->UpdateWindow();
|
|
break;
|
|
|
|
case VK_LEFT:
|
|
if( SelectCode - 1 < EUDC_SCode)
|
|
break;
|
|
#ifdef BUILD_ON_WINNT
|
|
TmpCode = SelectCode - 1;
|
|
TmpCode = CorrectEUDCCodeKey( TmpCode, 1, FALSE);
|
|
sPos = GetBarPosition( EUDC_SView);
|
|
ePos = GetBarPosition( TmpCode);
|
|
if( ePos < sPos){
|
|
#else
|
|
if( SelectCode - 1 < EUDC_SView){
|
|
#endif // BUILD_ON_WINNT
|
|
this->SendMessage( WM_VSCROLL, SB_LINEUP, 0);
|
|
}
|
|
SearchSelectPosition();
|
|
SelectCode--;
|
|
SelectCode = CorrectEUDCCodeKey( SelectCode, 1, FALSE);
|
|
SearchSelectPosition();
|
|
this->UpdateWindow();
|
|
break;
|
|
|
|
case VK_RIGHT:
|
|
#ifdef BUILD_ON_WINNT
|
|
// Move to above...
|
|
#else
|
|
WORD TmpCode;
|
|
#endif // BUILD_ON_WINNT
|
|
|
|
if( SelectCode + 1 > EUDC_ECode)
|
|
break;
|
|
TmpCode = SelectCode + 1;
|
|
TmpCode = CorrectEUDCCodeKey( TmpCode, 1, TRUE);
|
|
sPos = GetBarPosition( EUDC_SView);
|
|
ePos = GetBarPosition( TmpCode);
|
|
if( ePos - sPos >= NUM_LINE){
|
|
this->SendMessage( WM_VSCROLL, SB_LINEDOWN, 0);
|
|
}
|
|
SearchSelectPosition();
|
|
SelectCode++;
|
|
SelectCode = CorrectEUDCCodeKey( SelectCode, 1, TRUE);
|
|
SearchSelectPosition();
|
|
this->UpdateWindow();
|
|
break;
|
|
}
|
|
}else CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_SETFOCUS" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::OnSetFocus(
|
|
CWnd* pOldWnd)
|
|
{
|
|
CEdit::OnSetFocus(pOldWnd);
|
|
FocusFlag = TRUE;
|
|
SearchSelectPosition();
|
|
this->UpdateWindow();
|
|
::HideCaret( NULL);
|
|
// DestroyCaret();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Search select posistion */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::SearchSelectPosition()
|
|
{
|
|
|
|
CRect test;
|
|
int sViewPt, sCodePt;
|
|
unsigned int i, j;
|
|
|
|
|
|
sViewPt = GetBarPosition( EUDC_SView);
|
|
sCodePt = GetBarPosition( SelectCode);
|
|
|
|
#ifdef BUILD_ON_WINNT
|
|
// the new view does not contain previsouly selected char,
|
|
// we don't need to redraw the concave.
|
|
if (sCodePt < sViewPt || sCodePt > sViewPt+NUM_LINE)
|
|
return;
|
|
#endif
|
|
|
|
|
|
|
|
i = (unsigned int)(sCodePt - sViewPt);
|
|
j = (unsigned int)(SelectCode & 0x000f);
|
|
test.SetRect( rcEditChar[i][j].left - 2,
|
|
rcEditChar[i][j].top - 2,
|
|
rcEditChar[i][j].right + 2,
|
|
rcEditChar[i][j].bottom + 2);
|
|
this->InvalidateRect( &test, FALSE);
|
|
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Correct it if code is illegal */
|
|
/* */
|
|
/****************************************/
|
|
#ifdef BUILD_ON_WINNT
|
|
WORD
|
|
CEudcList::CorrectEUDCCodeKey(
|
|
WORD Code,
|
|
int MovePt,
|
|
BOOL UporDown)
|
|
{
|
|
COUNTRYINFO Info;
|
|
WORD wCode;
|
|
BYTE LByte, HByte, Tmp0;
|
|
int TralPos = 0;
|
|
|
|
LByte = LOBYTE( Code);
|
|
HByte = HIBYTE( Code);
|
|
Info = CountryInfo;
|
|
for( int i = 0; i < Info.nTralByte; i++){
|
|
if( LByte >= Info.sTralByte[i] && LByte <= Info.eTralByte[i]){
|
|
goto RET;
|
|
}else if( LByte < Info.sTralByte[i]){
|
|
/* decide which range of starting trailbyte we are less than */
|
|
TralPos = i;
|
|
break;
|
|
}else TralPos = i+1;
|
|
}
|
|
if( UporDown){ //code increasing
|
|
if( TralPos == Info.nTralByte){ //greater than last eTrailByte
|
|
HByte += 0x1; //same as less than next sTraiByte
|
|
TralPos=0;
|
|
}
|
|
|
|
if( MovePt < NUM_CHAR){ //
|
|
LByte = Info.sTralByte[TralPos];
|
|
}else{
|
|
Tmp0 = LByte & 0x0f;
|
|
LByte = Info.sTralByte[TralPos] & 0xf0;
|
|
LByte |= Tmp0;
|
|
if (LByte < Info.sTralByte[TralPos])
|
|
LByte += NUM_CHAR;
|
|
|
|
}
|
|
}else{
|
|
if( TralPos == 0){ //greater than last eTrailByte
|
|
TralPos = Info.nTralByte;
|
|
HByte -= 0x1;
|
|
}
|
|
|
|
if( MovePt < NUM_CHAR){
|
|
LByte = Info.eTralByte[TralPos-1];
|
|
}else{
|
|
Tmp0 = LByte & 0x0f;
|
|
LByte = Info.eTralByte[TralPos-1] & 0xf0;
|
|
LByte |= Tmp0;
|
|
if (LByte > Info.eTralByte[TralPos-1])
|
|
LByte -= NUM_CHAR;
|
|
}
|
|
}
|
|
RET:
|
|
wCode = MAKEWORD( LByte, HByte);
|
|
return wCode;
|
|
}
|
|
#else
|
|
WORD
|
|
CEudcList::CorrectEUDCCodeKey(
|
|
WORD Code,
|
|
int MovePt,
|
|
BOOL UporDown)
|
|
{
|
|
COUNTRYINFO Info;
|
|
WORD wCode;
|
|
BYTE LByte, HByte;
|
|
int TralPos = 0;
|
|
|
|
LByte = LOBYTE( Code);
|
|
HByte = HIBYTE( Code);
|
|
Info = CountryInfo;
|
|
for( int i = 0; i < Info.nTralByte; i++){
|
|
if( LByte >= Info.sTralByte[i] && LByte <= Info.eTralByte[i]){
|
|
goto RET;
|
|
}else if( LByte < Info.sTralByte[i]){
|
|
TralPos = i;
|
|
break;
|
|
}else TralPos = i+1;
|
|
}
|
|
if( UporDown)
|
|
if( TralPos == Info.nTralByte){
|
|
if( MovePt < NUM_CHAR){
|
|
LByte = Info.sTralByte[0];
|
|
HByte += 0x1;
|
|
}else{
|
|
LByte = Info.eTralByte[Info.nTralByte - 1];
|
|
}
|
|
}else if( MovePt < NUM_CHAR){
|
|
LByte = Info.sTralByte[TralPos];
|
|
}else{
|
|
if( TralPos){
|
|
BYTE Tmp1;
|
|
BYTE Tmp2;
|
|
|
|
Tmp1 = Info.eTralByte[TralPos-1] & 0xf0;
|
|
Tmp2 = LByte & 0xf0;
|
|
if( Tmp1 == Tmp2){
|
|
LByte = Info.eTralByte[TralPos-1];
|
|
}else{
|
|
Tmp1 = LByte & 0x0f;
|
|
LByte = Info.sTralByte[TralPos] & 0xf0;
|
|
LByte |= Tmp1;
|
|
}
|
|
}else{
|
|
LByte += (Info.sTralByte[0] & 0xf0);
|
|
}
|
|
}
|
|
else{
|
|
if( !TralPos){
|
|
if( MovePt < NUM_CHAR){
|
|
LByte = Info.eTralByte[Info.nTralByte - 1];
|
|
HByte -= 0x1;
|
|
}else{
|
|
BYTE Tmp;
|
|
|
|
Tmp = LByte & 0x0f;
|
|
LByte = Info.eTralByte[Info.nTralByte - 1]&0xf0;
|
|
LByte |= Tmp;
|
|
HByte -= 0x1;
|
|
if( LByte > Info.eTralByte[Info.nTralByte-1]){
|
|
LByte = Info.eTralByte[Info.nTralByte-1];
|
|
}
|
|
}
|
|
}else{
|
|
BYTE Tmp;
|
|
|
|
Tmp = LByte & 0x0f;
|
|
LByte = Info.eTralByte[TralPos-1] & 0xf0;
|
|
LByte |= Tmp;
|
|
if( LByte > Info.eTralByte[TralPos-1])
|
|
LByte = Info.eTralByte[TralPos-1];
|
|
|
|
}
|
|
}
|
|
RET:
|
|
wCode = MAKEWORD( LByte, HByte);
|
|
return wCode;
|
|
}
|
|
#endif // BUILD_ON_WINNT
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Whether correct or not? */
|
|
/* */
|
|
/****************************************/
|
|
BOOL
|
|
CEudcList::IsCorrectChar(
|
|
UINT i,
|
|
UINT j)
|
|
{
|
|
int sViewPt;
|
|
WORD wCode;
|
|
BYTE sOffset;
|
|
BOOL flg;
|
|
|
|
flg = FALSE;
|
|
BarRange = GetBarPosition((WORD)EUDC_EView);
|
|
sViewPt = GetBarPosition( EUDC_SView);
|
|
wCode = GetCodeScrPos( sViewPt + i);
|
|
wCode |= j;
|
|
|
|
sOffset = LOBYTE( wCode);
|
|
for( int k = 0; k < CountryInfo.nTralByte; k++){
|
|
if( sOffset >= CountryInfo.sTralByte[k] &&
|
|
sOffset <= CountryInfo.eTralByte[k]){
|
|
flg = TRUE;
|
|
}
|
|
}
|
|
return flg;
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_KILLFOCUS" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::OnKillFocus(
|
|
CWnd* pNewWnd)
|
|
{
|
|
FocusFlag = FALSE;
|
|
SearchSelectPosition();
|
|
this->UpdateWindow();
|
|
CEdit::OnKillFocus( pNewWnd);
|
|
::HideCaret( NULL);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_RBUTTONUP" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CEudcList::OnRButtonUp(
|
|
UINT nFlags,
|
|
CPoint point)
|
|
{
|
|
GetParent()->SendMessage( WM_CONTEXTMENU, (WPARAM)this->GetSafeHwnd(), 0);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP( CViewEdit, CEdit)
|
|
//{{AFX_MSG_MAP( CViewEdit)
|
|
ON_WM_PAINT()
|
|
ON_WM_SETCURSOR()
|
|
ON_WM_SETFOCUS()
|
|
ON_WM_KILLFOCUS()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_LBUTTONDBLCLK()
|
|
ON_WM_RBUTTONUP()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Default Constructor */
|
|
/* */
|
|
/****************************************/
|
|
CViewEdit::CViewEdit()
|
|
{
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Destructor */
|
|
/* */
|
|
/****************************************/
|
|
CViewEdit::~CViewEdit()
|
|
{
|
|
//fix for 261529
|
|
EUDCFont.DeleteObject();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_PAINT" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CViewEdit::OnPaint()
|
|
{
|
|
LOGFONT LogFont;
|
|
CFont ViewFont, *OldFont;
|
|
CSize cSize;
|
|
CRect ViewRect;
|
|
int xOffset, yOffset;
|
|
CPaintDC dc( this);
|
|
|
|
|
|
GetClientRect( &ViewRect);
|
|
DrawConcave( &dc, ViewRect);
|
|
|
|
if(bHasGlyph == FALSE) return;
|
|
|
|
memset( &LogFont, 0, sizeof( LogFont));
|
|
//fix for 261529
|
|
EUDCFont.GetLogFont(&LogFont);
|
|
|
|
if( ViewRect.Width() >= ViewRect.Height())
|
|
LogFont.lfHeight = ViewRect.Height() - 10;
|
|
else LogFont.lfHeight = ViewRect.Width() - 10;
|
|
|
|
if( !ViewFont.CreateFontIndirect( &LogFont))
|
|
return;
|
|
OldFont = dc.SelectObject( &ViewFont);
|
|
|
|
#ifdef BUILD_ON_WINNT
|
|
if (CountryInfo.bUnicodeMode)
|
|
GetTextExtentPoint32W(dc.GetSafeHdc(), (LPCWSTR)ViewCode, 1, &cSize);
|
|
else
|
|
#endif //BUILD_ON_WINNT
|
|
GetTextExtentPoint32A(dc.GetSafeHdc(), (LPCSTR)ViewCode, 2, &cSize);
|
|
|
|
if( ViewRect.Width() > cSize.cx){
|
|
xOffset = ViewRect.Width() - cSize.cx;
|
|
xOffset /= 2;
|
|
}else xOffset = 0;
|
|
|
|
if( ViewRect.Height() > cSize.cy){
|
|
yOffset = ViewRect.Height() - cSize.cy;
|
|
yOffset /= 2;
|
|
}else yOffset = 0;
|
|
|
|
dc.SetBkColor( COLOR_FACE);
|
|
dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT)); // COLOR_BLACK);
|
|
|
|
if (CountryInfo.bUnicodeMode)
|
|
{
|
|
#ifdef UNICODE
|
|
ExtTextOutW(dc.GetSafeHdc(), xOffset, yOffset, ETO_OPAQUE,
|
|
&ViewRect, (LPCWSTR)ViewCode, 1, NULL);
|
|
#else
|
|
CHAR ViewTmp[2];
|
|
WideCharToMultiByte(CP_ACP, 0, (LPWSTR) ViewCode, 1, ViewTmp, 2, NULL, NULL);
|
|
ExtTextOutA(dc.GetSafeHdc(), xOffset, yOffset, ETO_OPAQUE,
|
|
&ViewRect, (LPCSTR)ViewTmp, 2, NULL);
|
|
#endif
|
|
|
|
}
|
|
else
|
|
{
|
|
ExtTextOutA(dc.GetSafeHdc(), xOffset, yOffset, ETO_OPAQUE,
|
|
&ViewRect, (LPCSTR)ViewCode, 2, NULL);
|
|
}
|
|
dc.SelectObject( OldFont);
|
|
ViewFont.DeleteObject();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw Concave Rect */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CViewEdit::DrawConcave(
|
|
CDC *dc,
|
|
CRect rect)
|
|
{
|
|
CBrush ConBrush, *OldBrush;
|
|
CRect Rt;
|
|
if (!dc)
|
|
{
|
|
return;
|
|
}
|
|
Rt.SetRect( rect.left-1, rect.top-1, rect.right, rect.bottom);
|
|
|
|
ConBrush.CreateSolidBrush(COLOR_FACE);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.top, Rt.right, Rt.bottom, PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
|
|
ConBrush.CreateSolidBrush( COLOR_HLIGHT);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.top, Rt.Width(), 1, PATCOPY);
|
|
dc->PatBlt( Rt.left, Rt.top, 1, Rt.Height(), PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
|
|
ConBrush.CreateSolidBrush( COLOR_SHADOW);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.bottom, Rt.Width(), 1, PATCOPY);
|
|
dc->PatBlt( Rt.right, Rt.top, 1, Rt.Height()+1, PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP( CCustomListFrame, CStatic)
|
|
//{{AFX_MSG_MAP( CCustomListFrame)
|
|
ON_WM_PAINT()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Default Constructor */
|
|
/* */
|
|
/****************************************/
|
|
CCustomListFrame::CCustomListFrame()
|
|
{
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Destructor */
|
|
/* */
|
|
/****************************************/
|
|
CCustomListFrame::~CCustomListFrame()
|
|
{
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_PAINT" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CCustomListFrame::OnPaint()
|
|
{
|
|
CRect FrameRect;
|
|
CPaintDC dc( this);
|
|
|
|
this->GetClientRect( &FrameRect);
|
|
this->DrawConcave( &dc, FrameRect);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw Concave Rect */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CCustomListFrame::DrawConcave(
|
|
CDC *dc,
|
|
CRect rect)
|
|
{
|
|
CBrush ConBrush, *OldBrush;
|
|
CRect Rt;
|
|
|
|
if (!dc)
|
|
{
|
|
return;
|
|
}
|
|
Rt.SetRect( rect.left-1, rect.top-1, rect.right, rect.bottom);
|
|
|
|
ConBrush.CreateSolidBrush( COLOR_HLIGHT);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.top, Rt.Width(), 1, PATCOPY);
|
|
dc->PatBlt( Rt.left, Rt.top, 1, Rt.Height(), PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
|
|
ConBrush.CreateSolidBrush( COLOR_SHADOW);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.bottom, Rt.Width(), 1, PATCOPY);
|
|
dc->PatBlt( Rt.right, Rt.top, 1, Rt.Height()+1, PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP( CCustomInfoFrame, CStatic)
|
|
//{{AFX_MSG_MAP( CCustomInfoFrame)
|
|
ON_WM_PAINT()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Default Constructor */
|
|
/* */
|
|
/****************************************/
|
|
CCustomInfoFrame::CCustomInfoFrame()
|
|
{
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Destructor */
|
|
/* */
|
|
/****************************************/
|
|
CCustomInfoFrame::~CCustomInfoFrame()
|
|
{
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_PAINT" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CCustomInfoFrame::OnPaint()
|
|
{
|
|
CRect FrameRect;
|
|
CPaintDC dc( this);
|
|
|
|
this->GetClientRect( &FrameRect);
|
|
this->DrawConcave( &dc, FrameRect);
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Draw Concave Rect */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CCustomInfoFrame::DrawConcave(
|
|
CDC *dc,
|
|
CRect rect)
|
|
{
|
|
CBrush ConBrush, *OldBrush;
|
|
CRect Rt;
|
|
|
|
if (!dc)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Rt.SetRect( rect.left-1, rect.top-1, rect.right, rect.bottom);
|
|
|
|
ConBrush.CreateSolidBrush( COLOR_SHADOW);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.top, Rt.Width(), 1, PATCOPY);
|
|
dc->PatBlt( Rt.left, Rt.top, 1, Rt.Height(), PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
|
|
ConBrush.CreateSolidBrush( COLOR_HLIGHT);
|
|
OldBrush = dc->SelectObject( &ConBrush);
|
|
dc->PatBlt( Rt.left, Rt.bottom, Rt.Width(), 1, PATCOPY);
|
|
dc->PatBlt( Rt.right, Rt.top, 1, Rt.Height()+1, PATCOPY);
|
|
dc->SelectObject( OldBrush);
|
|
ConBrush.DeleteObject();
|
|
}
|
|
|
|
BOOL CViewEdit::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
|
|
{
|
|
::SetCursor( AfxGetApp()->LoadStandardCursor(IDC_ARROW));
|
|
return TRUE;
|
|
}
|
|
|
|
void CViewEdit::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
CEdit::OnSetFocus(pOldWnd);
|
|
::HideCaret( NULL);
|
|
}
|
|
|
|
void CViewEdit::OnKillFocus(CWnd* pNewWnd)
|
|
{
|
|
CEdit::OnKillFocus(pNewWnd);
|
|
::HideCaret( NULL);
|
|
}
|
|
|
|
void CViewEdit::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
}
|
|
|
|
void CViewEdit::OnLButtonDblClk(UINT nFlags, CPoint point)
|
|
{
|
|
}
|
|
|
|
void CViewEdit::OnRButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
GetParent()->SendMessage( WM_CONTEXTMENU, (WPARAM)this->GetSafeHwnd(), 0);
|
|
}
|
|
|
|
#ifdef BUILD_ON_WINNT
|
|
|
|
BEGIN_MESSAGE_MAP( CColumnHeading, CWnd)
|
|
//{{AFX_MSG_MAP( CColumnHeading)
|
|
ON_WM_PAINT()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
/****************************************/
|
|
/* */
|
|
/* Default Constructor */
|
|
/* */
|
|
/****************************************/
|
|
CColumnHeading::CColumnHeading()
|
|
{
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* Destructor */
|
|
/* */
|
|
/****************************************/
|
|
CColumnHeading::~CColumnHeading()
|
|
{
|
|
SysFFont.DeleteObject();
|
|
}
|
|
|
|
/****************************************/
|
|
/* */
|
|
/* MESSAGE "WM_PAINT" */
|
|
/* */
|
|
/****************************************/
|
|
void
|
|
CColumnHeading::OnPaint()
|
|
{
|
|
// column heading support
|
|
CPaintDC dc( this);
|
|
TCHAR ColumnHead[2];
|
|
CSize cSize;
|
|
int j,xOffset;
|
|
HRESULT hresult;
|
|
|
|
dc.SetMapMode( MM_TEXT);
|
|
dc.SelectObject( &SysFFont);
|
|
dc.SetBkColor( COLOR_FACE);
|
|
dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT)); // COLOR_BLACK);
|
|
for( j = 0; j < NUM_CHAR; j++){
|
|
//*STRSAFE* wsprintf(ColumnHead, TEXT("%X"), j);
|
|
hresult = StringCchPrintf(ColumnHead , ARRAYLEN(ColumnHead), TEXT("%X"), j);
|
|
if (!SUCCEEDED(hresult))
|
|
{
|
|
return ;
|
|
}
|
|
GetTextExtentPoint32(dc.GetSafeHdc(),
|
|
ColumnHead, 1, &cSize);
|
|
if( rcColumnHead[j].Width() > cSize.cx){
|
|
xOffset = rcColumnHead[j].Width() - cSize.cx;
|
|
xOffset /= 2;
|
|
}else
|
|
xOffset= 0;
|
|
|
|
dc.ExtTextOut( rcColumnHead[j].left + xOffset,
|
|
rcColumnHead[j].top,
|
|
ETO_OPAQUE, &rcColumnHead[j],
|
|
ColumnHead, 1, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
#endif //BUILD_ON_WINNT
|