/**************************************************/
/*						                          */
/*						                          */
/*	SelectCode... EUDC Editor Dialog	          */
/*						                          */
/*                                                */
/* Copyright (c) 1997-1999 Microsoft Corporation. */
/**************************************************/

#include 	"stdafx.h"
#include 	"eudcedit.h"
#include 	"eudcdlg.h"
#include 	"registry.h"
#include	"util.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

typedef struct _tagRegistDef{
	TCHAR	RegFont[LF_FACESIZE];
	TCHAR	RegFile[MAX_PATH];
	BOOL	RegFlg;
} REGISTDEF;

static 	REGISTDEF	RegistDef;	
BEGIN_MESSAGE_MAP(CEudcDlg, CDialog)
	//{{AFX_MSG_MAP(CEudcDlg)
	ON_CBN_SELCHANGE(IDC_CHINARANGE, OnSelchangeChinarange)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/****************************************/
/*					*/
/*	Constructor			*/
/*					*/
/****************************************/
CEudcDlg::CEudcDlg( CWnd* pParent)
	: CDialog(CEudcDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CEudcDlg)
	//}}AFX_DATA_INIT
}

/****************************************/
/*					*/
/*	MESSAGE	"WM_INITDIALOG"		*/
/*					*/
/****************************************/
BOOL
CEudcDlg::OnInitDialog()
{
	LOGFONT	LogFont;
	CString	DialogTitle;		
	TCHAR	SBuf[5], EBuf[5], CodeBuf[15];
	TCHAR	SysFace[LF_FACESIZE];
	long	WindowStyle;

	CDialog::OnInitDialog();

	WindowStyle = GetWindowLong( this->GetSafeHwnd(), GWL_EXSTYLE);
	WindowStyle |= WS_EX_CONTEXTHELP;
	SetWindowLong( this->GetSafeHwnd(), GWL_EXSTYLE, WindowStyle);

	m_EditList.SubclassDlgItem( IDC_CUSTOMEDIT, this);
	m_ViewChar.SubclassDlgItem( IDC_CUSTOMCHR, this);
#ifdef BUILD_ON_WINNT
	m_ColumnHeading.SubclassDlgItem( IDC_COLUMNHEADING, this);
#endif //BUILD_ON_WINNT
	m_Frame.SubclassDlgItem( IDC_CUSTOMFRAME, this);
	m_ListFrame.SubclassDlgItem( IDC_CUSTOMLISTFRAME, this);
	m_InfoFrame2.SubclassDlgItem( IDC_CUSTOMFRAME2, this);
	m_InfoFrame3.SubclassDlgItem( IDC_CUSTOMFRAME3, this);
	m_StaticRange.SubclassDlgItem( IDC_STATICRANGE, this);
	m_ComboRange.SubclassDlgItem( IDC_CHINARANGE, this);

	if( CountryInfo.LangID != EUDC_KRW || CountryInfo.bUnicodeMode){
		m_EditList.EnableScrollBar( SB_VERT, ESB_ENABLE_BOTH);
	}else	m_EditList.ShowScrollBar( SB_VERT, FALSE);

	AdjustFileName();
	AdjustFontName();
	this->SetDlgItemText( IDC_SETFONTNAME, FontName);
	this->SetDlgItemText( IDC_SETFILENAME, FileName);
	if( WorRFlag)
		DialogTitle.LoadString( IDS_REGISTAS_DLGTITLE);
	else	DialogTitle.LoadString( IDS_SELECTCODE_DLGTITLE);
	this->SetWindowText( DialogTitle);

	m_EditList.cRange = CountryInfo.CurrentRange;
	if( CountryInfo.nRange > 2 && !CountryInfo.bUnicodeMode){
	    m_StaticRange.ShowWindow( SW_SHOWNORMAL);
		m_ComboRange.ShowWindow( SW_SHOWNORMAL);
		m_StaticRange.UpdateWindow();
		m_ComboRange.UpdateWindow();

		for( int i = 0; i < CountryInfo.nRange-1; i++){
			wsprintf( SBuf, TEXT("%X"), CountryInfo.sRange[i]);
			wsprintf( EBuf, TEXT("%X"), CountryInfo.eRange[i]);
			lstrcpy( CodeBuf, SBuf);
			lstrcat( CodeBuf, TEXT(" - "));
			lstrcat( CodeBuf, EBuf);
			m_ComboRange.InsertString( i, CodeBuf);
		}
		m_ComboRange.DeleteString( CountryInfo.nRange-1);
		m_ComboRange.SetCurSel( CountryInfo.CurrentRange);
	}

//	Set font for output character code
	GetFont()->GetObject( sizeof( LOGFONT), &LogFont);
	m_EditList.SysFFont.CreateFontIndirect( &LogFont);
	m_EditList.CalcCharSize();
#ifdef BUILD_ON_WINNT
//  Set font for the column heading
	m_ColumnHeading.SysFFont.CreateFontIndirect( &LogFont);
#endif //BUILD_ON_WINNT

//	Set font for output character
	memset( &LogFont, 0, sizeof( LogFont));
	if( m_EditList.CharSize.cx >= m_EditList.CharSize.cy)
		LogFont.lfHeight = m_EditList.CharSize.cy-2;
	else	LogFont.lfHeight = m_EditList.CharSize.cx-2;
	LogFont.lfCharSet = (BYTE)CountryInfo.CharacterSet;
	
  GetStringRes((TCHAR *)SysFace, IDS_SYSTEMEUDCFONT_STR);
  if( !lstrcmp(SelectEUDC.m_Font, (const TCHAR *)SysFace) )
  {
    lstrcpy (LogFont.lfFaceName, TEXT("System"));
	}else{
    lstrcpy( LogFont.lfFaceName, SelectEUDC.m_Font);
	}
	if( !m_EditList.EUDCFont.CreateFontIndirect( &LogFont))
		return FALSE;
//fix for 261529
	if( !m_ViewChar.EUDCFont.CreateFontIndirect( &LogFont))
		return FALSE;

	return TRUE;
}

/****************************************/
/*		Deal with "OK"		*/
/****************************************/
void CEudcDlg::OnOK()
{
	if( !m_EditList.SelectCode){
		if( WorRFlag){
			OutputMessageBox( this->GetSafeHwnd(),
				IDS_REGISTAS_DLGTITLE,
				IDS_NOTSELCHARACTER_MSG, TRUE);
		}else{
			OutputMessageBox( this->GetSafeHwnd(),
				IDS_SELECTCODE_DLGTITLE,
				IDS_NOTSELCHARACTER_MSG, TRUE);
		}
		return;
	}
	RegistRegFont();
	EndDialog(IDOK);
}
void CEudcDlg::OnCancel()
{
	RegistRegFont();
	CDialog::OnCancel();
}
/****************************************/
/*	Take off ".TTF" from filename	*/
/****************************************/
void CEudcDlg::AdjustFileName()
{
	TCHAR	*FilePtr;

	lstrcpy(FileName, SelectEUDC.m_FileTitle);
	if(( FilePtr = Mytcsrchr( FileName, '.')) != NULL)
		*FilePtr = '\0';	

#ifdef BUILD_ON_WINNT
    /*
     * Trim the string more better way...
     */
    CClientDC   dc(this);
	CRect	    ViewFileRect;
	CSize       FileNameSize;
	CWnd       *cWnd = GetDlgItem( IDC_SETFILENAME);
    INT         MaxChars;
    INT         cchString = lstrlen(FileName);

	cWnd->GetClientRect( &ViewFileRect);

	GetTextExtentExPoint( dc.GetSafeHdc(), FileName,
		cchString, ViewFileRect.Width(), &MaxChars, NULL ,&FileNameSize);

    if( cchString > MaxChars) {
        INT Chars = 0;

        FilePtr = FileName;
        while (Chars < (MaxChars-3)) {
            FilePtr++; Chars++;
        }

        for (; Chars < MaxChars; Chars++) {
            FileName[Chars] = TEXT('.');
        }
        FileName[Chars] = TEXT('\0');
    }
#else
	if( strlen((const char *)FileName) > 11){
		FileName[11] = '.';
		FileName[12] = '.';
		FileName[13] = '\0';
	}
#endif // BUILD_ON_WINNT

	return;
}

/****************************************/
/*	Adjust EUDC Font name		*/
/****************************************/
void CEudcDlg::AdjustFontName()
{
CClientDC	dc(this);
	CRect	ViewFontRect;
	CSize	FontNameSize, CharSize;
	int	i;

	lstrcpy(FontName, SelectEUDC.m_Font);

	CWnd *cWnd = GetDlgItem( IDC_SETFONTNAME);
	cWnd->GetClientRect( &ViewFontRect);

	GetTextExtentPoint32( dc.GetSafeHdc(), FontName,
		lstrlen(FontName), &FontNameSize);

	if( ViewFontRect.Width() <= FontNameSize.cx){
		GetTextExtentPoint32( dc.GetSafeHdc(), TEXT("<<"), 2, &CharSize);
		i = ( ViewFontRect.Width() /CharSize.cx) * 2;
		FontName[i-2] = '.';
		FontName[i-1] = '.';
		FontName[i] = '\0';
	}
}

/****************************************/
/*	Change EUDC code range(CHINESE)	*/
/****************************************/
void CEudcDlg::OnSelchangeChinarange()
{
	int nIndex = m_ComboRange.GetCurSel();

	m_EditList.cRange = nIndex;
	m_EditList.SetEUDCCodeRange( nIndex);
	this->SetDlgItemText( IDC_CUSTOMCHR, TEXT(""));
	this->SetDlgItemText( IDC_CODECUST,  TEXT(""));
	m_EditList.Invalidate();
	m_EditList.UpdateWindow();

	CWnd *cWnd = this->GetDlgItem( IDC_CUSTOMEDIT);
	this->GotoDlgCtrl( cWnd);
}

void CEudcDlg::RegistRegFont()
{
	if( RegistDef.RegFlg){

        // The code is to fix the related bug #421829 & #438677
        // It delays 1 second to call EnabelEUDC(FALSE).
        DWORD dwStart = GetTickCount();

        // Stop if this has taken too long
        while (1)
        {
            if( GetTickCount() - dwStart >= 1000 )
                break;
        }
        
		EnableEUDC(FALSE);
		RegistTypeFace( RegistDef.RegFont,  RegistDef.RegFile);
		EnableEUDC(TRUE);
	}
}

static DWORD aIds[] =
{
    IDC_CUSTOMEDIT, IDH_EUDC_SELLIST,
    IDC_COLUMNHEADING,  IDH_EUDC_SELLIST,
    IDC_CODECUST,   IDH_EUDC_SELCODE,
    IDC_CODE_NAME,  IDH_EUDC_SELCODE,
    IDC_CUSTOMFRAME,    IDH_EUDC_SELCODE,
    IDC_SETFONTNAME,IDH_EUDC_SELFONT,
    IDC_FONT_NAME, IDH_EUDC_SELFONT,
    IDC_CUSTOMFRAME3, IDH_EUDC_SELFONT,
    IDC_SETFILENAME,IDH_EUDC_SELFILE,
    IDC_FILE_NAME, IDH_EUDC_SELFILE,
    IDC_CUSTOMFRAME2, IDH_EUDC_SELFILE,
    IDC_CUSTOMCHR, IDH_EUDC_SELCHAR,
    IDC_STATICRANGE, IDH_EUDC_SELRANGE,
    IDC_CHINARANGE, IDH_EUDC_SELRANGE,
	0,0
};

static DWORD aIdsReg[] =
{
    IDC_CUSTOMEDIT, IDH_EUDC_REGLIST,
    IDC_COLUMNHEADING,  IDH_EUDC_REGLIST,
    IDC_CODECUST,   IDH_EUDC_REGCODE,
    IDC_CODE_NAME,  IDH_EUDC_REGCODE,
    IDC_CUSTOMFRAME,    IDH_EUDC_REGCODE,
    IDC_SETFONTNAME,IDH_EUDC_REGFONT,
    IDC_FONT_NAME, IDH_EUDC_REGFONT,
    IDC_CUSTOMFRAME3, IDH_EUDC_REGFONT,
    IDC_SETFILENAME,IDH_EUDC_REGFILE,
    IDC_FILE_NAME, IDH_EUDC_REGFILE,
    IDC_CUSTOMFRAME2, IDH_EUDC_REGFILE,
    IDC_CUSTOMCHR, IDH_EUDC_REGCHAR,
    IDC_STATICRANGE, IDH_EUDC_REGRANGE,
    IDC_CHINARANGE, IDH_EUDC_REGRANGE,
	0,0
};
/****************************************/
/*	Customdlg Window Procedure	*/
/****************************************/
LRESULT CEudcDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if( message == WM_VIEWUPDATE){
		m_ViewChar.Invalidate( FALSE);
		m_ViewChar.UpdateWindow();
		return(0);
	}
	if( message == WM_HELP){
		::WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle,
			HelpPath, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)(WorRFlag ? aIdsReg : aIds));
		return(0);
	}
	if( message == WM_CONTEXTMENU){
		::WinHelp((HWND)wParam, HelpPath,
			HELP_CONTEXTMENU, (DWORD_PTR)(LPTSTR) (WorRFlag ? aIdsReg : aIds));
		return(0);
	}
	return CDialog::WindowProc( message, wParam, lParam);
}


