windows-nt/Source/XPSP1/NT/shell/osshell/accesory/eudcedit/eudcedit.cpp
2020-09-26 16:20:57 +08:00

556 lines
15 KiB
C++

/********************************************************/
/* */
/* */
/* EUDC EDITOR ( Windows 95) */
/* */
/* * Japanese Version */
/* * Korea Version */
/* * Chinese Version */
/* */
/* */
/* Copyright (c) 1997-1999 Microsoft Corporation. */
/********************************************************/
#include "stdafx.h"
#include <afxpriv.h>
#include "eudcedit.h"
#include "mainfrm.h"
#include "registry.h"
#include "util.h"
#include "assocdlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CEudcApp, CWinApp)
//{{AFX_MSG_MAP(CEudcApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
//}}AFX_MSG_MAP
ON_COMMAND(ID_CONTEXT_HELP, CWinApp::OnContextHelp)
END_MESSAGE_MAP()
/* Global parameter */
INT CAPTION_HEIGHT; // height of caption
INT BITMAP_WIDTH; // width of bitmap
INT BITMAP_HEIGHT; // height of bitmap
TCHAR HelpPath[MAX_PATH]; // help file path
TCHAR ChmHelpPath[MAX_PATH]; // help file path for HtmlHelp
TCHAR FontPath[MAX_PATH]; // font file path
DWORD COLOR_GRID; // grid color
DWORD COLOR_FITTING; // bitmap color on show outline
DWORD COLOR_CURVE; // color of outline
DWORD COLOR_FACE; // Win95 3D Face SystemColor
DWORD COLOR_HLIGHT; // Win95 3D HighLight System Color
DWORD COLOR_SHADOW; // Win95 3D Shadow SystemColor
DWORD COLOR_WIN; // Win95 Window System Color
CString NotMemTtl;
CString NotMemMsg;
HCURSOR ToolCursor[NUMTOOL]; // cursor for tool
HCURSOR ArrowCursor[NUMRESIZE]; // cursor for resize
COUNTRYINFO CountryInfo; // country information structure
/* Global function */
extern BOOL SetCountryInfo( UINT LocalCP);
BOOL g_bKeepEUDCLink = TRUE;
extern "C" BOOL AnyLinkedFonts();
CEudcApp NEAR theApp;
/************************************************/
/* */
/* Default Constructor */
/* */
/************************************************/
CEudcApp::CEudcApp()
{
}
/************************************************/
/* */
/* Initialize Instance */
/* */
/************************************************/
BOOL
CEudcApp::InitInstance()
{
CString MainWndTitle;
CRect MainWndRect;
UINT MaxWndFlag;
// Check whether EUDC editor can open or not
if( !CheckPrevInstance())
return FALSE;
//
// Cicero and Cicero TIP currently does not support EUDC mode.
// Use IMM32's IMEs on eudcedit.exe.
//
DisableCUAS();
/*------------------------------------------------
* check if it's Administrator
*------------------------------------------------*/
TCHAR winpath[MAX_PATH];
HANDLE nfh;
GetSystemWindowsDirectory( winpath, MAX_PATH);
#ifdef IN_FONTS_DIR // CAssocDlg::OnOK()
lstrcat( winpath, TEXT("\\FONTS\\"));
#else
lstrcat( winpath, TEXT("\\"));
#endif // IN_FONTS_DIR
lstrcat(winpath, _T("eudcadm.tte"));
nfh = CreateFile(winpath,
GENERIC_WRITE,
FILE_SHARE_DELETE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( nfh == INVALID_HANDLE_VALUE)
{
HINSTANCE hInst = AfxGetInstanceHandle();
TCHAR szMessage[256];
LoadString(hInst, IDS_ACCESSDENIED, szMessage, sizeof(szMessage) / sizeof(TCHAR));
AfxMessageBox(szMessage, MB_OK, 0);
return FALSE;
}
else
{
CloseHandle(nfh);
DeleteFile(winpath);
}
// Set background color for dialog
COLOR_FACE = ::GetSysColor( COLOR_3DFACE);
COLOR_HLIGHT = ::GetSysColor( COLOR_3DHILIGHT);
COLOR_SHADOW = ::GetSysColor( COLOR_3DSHADOW);
COLOR_WIN = ::GetSysColor( COLOR_WINDOW);
// SetDialogBkColor( COLOR_FACE);
// Set 3d controls
Enable3dControls();
// Create registry subkey
if( !CreateRegistrySubkey())
return FALSE;
// Open "EUDCEDIT.INI", read data
if( !GetProfileText( &MainWndRect, &MaxWndFlag))
return FALSE;
// Get Language ID with GetSystemDefaultLCID()
// Get area of EUDC from registry and WideCharToMultiByte().
if( !GetCountryInfo())
return FALSE;
#if WINVER >= 0x0500
// Remember original font link status before we do anything
//pliu g_bKeepEUDCLink = AnyLinkedFonts();
#endif
// Get Cursor from resource
if( !GetCursorRes())
return FALSE;
// Get font and help file path
if( !GetFilePath())
return FALSE;
// Create MDI mainFrame window
MainWndTitle.LoadString( IDS_MAINFRAMETITLE);
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->Create( MainWndTitle,
WS_OVERLAPPEDWINDOW , MainWndRect,
MAKEINTRESOURCE( IDR_MAINFRAME))){
return FALSE;
}
pMainFrame->ShowWindow( m_nCmdShow);
if( MaxWndFlag){
pMainFrame->ShowWindow( SW_SHOWMAXIMIZED);
}
pMainFrame->UpdateWindow();
m_pMainWnd = pMainFrame;
CAssocDlg dlg(m_pMainWnd);
if (!dlg.InitSystemFontAssoc())
{
return FALSE;
}
pMainFrame->m_wndGuideBar.PositionStatusPane();
pMainFrame->SendMessage(WM_COMMAND, ID_READ_CHAR, NULL);
return TRUE;
}
BOOL
CEudcApp::ExitInstance()
{
if (!g_bKeepEUDCLink && CountryInfo.bOnlyUnicode)
{
// 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);
TCHAR szDefaultFace[LF_FACESIZE];
TCHAR szFontPath[MAX_PATH];
TCHAR *Ptr;
GetStringRes(szDefaultFace, IDS_SYSTEMEUDCFONT_STR);
if (InqTypeFace(szDefaultFace, szFontPath,MAX_PATH))
{
//
// delete file eudc.tte
//
DeleteFile(szFontPath);
if(( Ptr = Mytcsrchr( szFontPath, '.')) != NULL)
{
*Ptr = '\0';
lstrcat( szFontPath, TEXT(".EUF"));
//
// delete file eudc.euf
//
DeleteFile(szFontPath);
}
}
DeleteRegistrySubkey();
EnableEUDC(TRUE);
}
return CWinApp::ExitInstance();
}
/************************************************/
/* */
/* Check whether editor can open or not */
/* */
/************************************************/
BOOL
CEudcApp::CheckPrevInstance()
{
HWND hWnd;
TCHAR TitleBuf[50];
GetStringRes(TitleBuf, IDS_MAINFRAMETITLE);
// Search previous eudcedit mainframe.
hWnd = ::FindWindow( NULL, TitleBuf);
if( hWnd == NULL)
return TRUE;
else ::SetForegroundWindow( hWnd);
return FALSE;
}
/************************************************/
/* */
/* disable CUAS */
/* */
/************************************************/
void
CEudcApp::DisableCUAS()
{
typedef BOOL (*PFNIMMDISABLETEXTFRAMESERVICE)(DWORD);
PFNIMMDISABLETEXTFRAMESERVICE pfn;
HMODULE hMod = LoadLibrary(TEXT("imm32.dll"));
if (hMod)
{
pfn = (PFNIMMDISABLETEXTFRAMESERVICE)GetProcAddress(hMod,
"ImmDisableTextFrameService");
if (pfn)
pfn(-1);
}
}
/************************************************/
/* */
/* Correspond to waitting for Input */
/* */
/************************************************/
BOOL
CEudcApp::OnIdle(
LONG lCount)
{
CWnd *pWnd;
if( !lCount){
for( pWnd = m_pMainWnd->GetWindow( GW_HWNDFIRST); pWnd != NULL;
pWnd = pWnd->GetNextWindow( GW_HWNDNEXT)){
if( m_pMainWnd == pWnd->GetParent()){
if( pWnd == m_pMainWnd->GetActiveWindow() &&
( ::GetCapture() == NULL))
m_pMainWnd->SetActiveWindow();
pWnd->SendMessage( WM_IDLEUPDATECMDUI,
(WPARAM)TRUE, 0L);
}
}
}
return CWinApp::OnIdle( lCount);
}
/************************************************/
/* */
/* Open "EUDCEDIT.INI" */
/* Set parameter of EUDC Editor */
/* */
/************************************************/
BOOL
CEudcApp::GetProfileText(
LPRECT MainWndRect,
UINT *MaxWndFlag)
{
TCHAR ProfileBuf[MAX_PATH], *pString;
TCHAR Separation[] = TEXT(" ,");
INT xScreen , yScreen;
UINT BitmapSiz;
BYTE Rcolor, Gcolor, Bcolor;
CString GridColor, CurvColor, FittColor, MainWnd;
// Get system metrics
CAPTION_HEIGHT = ::GetSystemMetrics( SM_CYCAPTION);
xScreen = ::GetSystemMetrics( SM_CXSCREEN);
yScreen = ::GetSystemMetrics( SM_CYSCREEN);
// Read bitmapsize and maxflag
BitmapSiz = this->GetProfileInt(TEXT("Bitmap"), TEXT("BitmapSize"), DEF_BITMAPSIZE);
if( BitmapSiz <= 0)
BitmapSiz = DEF_BITMAPSIZE;
if( BitmapSiz > MAX_BITMAPSIZE)
BitmapSiz = DEF_BITMAPSIZE;
BitmapSiz = ((BitmapSiz + sizeof(WORD)-1)/sizeof(WORD))*sizeof(WORD);
if( BitmapSiz > MAX_BITMAPSIZE)
BitmapSiz = MAX_BITMAPSIZE;
if( BitmapSiz < MIN_BITMAPSIZE)
BitmapSiz = MIN_BITMAPSIZE;
BITMAP_WIDTH = BitmapSiz;
BITMAP_HEIGHT = BitmapSiz;
*MaxWndFlag = this->GetProfileInt(TEXT("WindowSize"), TEXT("MinMaxFlag"), 0);
// Read color
GridColor = this->GetProfileString(TEXT("Color"), TEXT("Grid"), TEXT("128 128 128"));
CurvColor = this->GetProfileString(TEXT("Color"), TEXT("Curve"), TEXT("255 0 0"));
FittColor = this->GetProfileString(TEXT("Color"), TEXT("Fitting"), TEXT("128 128 128"));
// Read grid color
ConvStringRes((TCHAR *)ProfileBuf, GridColor);
if(( pString = Mytcstok( ProfileBuf, Separation)) == NULL)
Rcolor = 0;
else Rcolor = (BYTE)Myttoi( pString);
if(( pString = Mytcstok( NULL, Separation)) == NULL)
Gcolor = 0;
else Gcolor = (BYTE)Myttoi( pString);
if(( pString = Mytcstok( NULL, Separation)) == NULL)
Bcolor = 0;
else Bcolor = (BYTE)Myttoi( pString);
COLOR_GRID = RGB( Rcolor, Gcolor, Bcolor);
// Read outline color
ConvStringRes(ProfileBuf, CurvColor);
if(( pString = Mytcstok( ProfileBuf, Separation)) == NULL)
Rcolor = 0;
else Rcolor = (BYTE)Myttoi( pString);
if(( pString = Mytcstok( NULL, Separation)) == NULL)
Gcolor = 0;
else Gcolor = (BYTE)Myttoi( pString);
if(( pString = Mytcstok( NULL, Separation)) == NULL)
Bcolor = 0;
else Bcolor = (BYTE)Myttoi( pString);
COLOR_CURVE = RGB( Rcolor, Gcolor, Bcolor);
// Read bitmap color in show outline
ConvStringRes(ProfileBuf, FittColor);
if(( pString = Mytcstok( ProfileBuf, Separation)) == NULL)
Rcolor = 0;
else Rcolor = (BYTE)Myttoi( pString);
if(( pString = Mytcstok( NULL, Separation)) == NULL)
Gcolor = 0;
else Gcolor = (BYTE)Myttoi( pString);
if(( pString = Mytcstok( NULL, Separation)) == NULL)
Bcolor = 0;
else Bcolor = (BYTE)Myttoi( pString);
COLOR_FITTING = RGB( Rcolor, Gcolor, Bcolor);
// Read main window size
MainWnd = this->GetProfileString(TEXT("WindowSize"),TEXT("MainWindowSize"), TEXT(""));
if( *MainWnd == '\0'){
MainWndRect->left = 0;
MainWndRect->top = 0;
MainWndRect->right = (xScreen/5)*4;
MainWndRect->bottom =(yScreen/5)*4;
}else{
ConvStringRes(ProfileBuf, MainWnd);
pString = Mytcstok( ProfileBuf, Separation);
MainWndRect->left = Myttoi( pString);
pString = Mytcstok( NULL, Separation);
MainWndRect->top = Myttoi( pString);
pString = Mytcstok( NULL, Separation);
MainWndRect->right = Myttoi( pString);
pString = Mytcstok( NULL, Separation);
MainWndRect->bottom = Myttoi( pString);
}
return TRUE;
}
/************************************************/
/* */
/* Get country information */
/* */
/************************************************/
BOOL
CEudcApp::GetCountryInfo()
{
UINT LocalCP;
CountryInfo.CurrentRange = 0;
CountryInfo.LangID = (int)GetSystemDefaultLCID();
LocalCP = GetACP();
CountryInfo.bUnicodeMode = FALSE;
CountryInfo.bOnlyUnicode = FALSE;
switch( CountryInfo.LangID){
case EUDC_JPN:
CountryInfo.CharacterSet = SHIFTJIS_CHARSET;
break;
case EUDC_HKG:
CountryInfo.LangID = EUDC_CHT;
//
// fall through
//
case EUDC_CHT:
CountryInfo.CharacterSet = CHINESEBIG5_CHARSET;
break;
case EUDC_KRW:
CountryInfo.CharacterSet = HANGEUL_CHARSET;
break;
case EUDC_SIN:
CountryInfo.LangID = EUDC_CHS;
//
// Fall through
//
case EUDC_CHS:
CountryInfo.CharacterSet = GB2312_CHARSET;
break;
default:
CHARSETINFO csi;
if (TranslateCharsetInfo((DWORD*)IntToPtr(LocalCP), &csi, TCI_SRCCODEPAGE))
CountryInfo.CharacterSet = csi.ciCharset;
CountryInfo.bOnlyUnicode = TRUE;
CountryInfo.bUnicodeMode = TRUE;
lstrcpy(CountryInfo.szForceFont, _T("Microsoft Sans Serif"));
break;
}
if( !SetCountryInfo( LocalCP))
return FALSE;
else return TRUE;
}
/************************************************/
/* */
/* Get Cursor resource file */
/* */
/************************************************/
BOOL
CEudcApp::GetCursorRes()
{
int i;
// For tool cursor
ToolCursor[PEN] = this->LoadCursor(IDC_PENCIL);
ToolCursor[BRUSH] = this->LoadCursor(IDC_BRUSH);
ToolCursor[CIRCLE] = this->LoadStandardCursor(IDC_CROSS);
ToolCursor[CIRCLEFILL] = this->LoadStandardCursor(IDC_CROSS);
ToolCursor[SLOPE] = this->LoadStandardCursor(IDC_CROSS);
ToolCursor[RECTBAND] = this->LoadStandardCursor(IDC_CROSS);
ToolCursor[RECTFILL] = this->LoadStandardCursor(IDC_CROSS);
ToolCursor[FREEFORM] = this->LoadStandardCursor(IDC_CROSS);
ToolCursor[RECTCLIP] = this->LoadStandardCursor(IDC_CROSS);
ToolCursor[ERASER] = this->LoadCursor(IDC_ERASER);
for( i = PEN; i <= ERASER; i++){
if( ToolCursor[i] == NULL){
return FALSE;
}
}
// For select rectangle cursur
ArrowCursor[VERTICAL] = this->LoadStandardCursor(
MAKEINTRESOURCE(IDC_SIZEWE));
ArrowCursor[RIGHTSLOPE]= this->LoadStandardCursor(
MAKEINTRESOURCE(IDC_SIZENESW));
ArrowCursor[LEFTSLOPE] = this->LoadStandardCursor(
MAKEINTRESOURCE(IDC_SIZENWSE));
ArrowCursor[HORIZONTAL]= this->LoadStandardCursor(
MAKEINTRESOURCE(IDC_SIZENS));
ArrowCursor[ALLDIRECT] = this->LoadStandardCursor(
MAKEINTRESOURCE(IDC_SIZEALL));
for( i = VERTICAL; i <= ALLDIRECT; i++){
if( ArrowCursor[i] == NULL){
return FALSE;
}
}
return TRUE;
}
/************************************************/
/* */
/* Get help file path */
/* */
/************************************************/
BOOL
CEudcApp::GetFilePath()
{
if( !GetSystemWindowsDirectory( FontPath, MAX_PATH))
return FALSE;
lstrcat(FontPath, TEXT("\\"));
lstrcpy(HelpPath, FontPath);
lstrcpy(ChmHelpPath, FontPath);
lstrcat(HelpPath, TEXT("Help\\EUDCEDIT.HLP"));
lstrcat(ChmHelpPath, TEXT("Help\\EUDCEDIT.CHM"));
NotMemTtl.LoadString( IDS_MAINFRAMETITLE);
NotMemMsg.LoadString( IDS_NOTENOUGHMEMORY_ERROR);
return TRUE;
}
/************************************************/
/* */
/* COMMAND "About" */
/* */
/************************************************/
void
CEudcApp::OnAppAbout()
{
HICON hIcon;
TCHAR TitleBuf[50];
hIcon = LoadIcon( IDR_MAINFRAME);
GetStringRes((TCHAR *)TitleBuf, IDS_MAINFRAMETITLE);
ShellAbout( m_pMainWnd->GetSafeHwnd(), TitleBuf, TEXT(""), hIcon);
}