windows-nt/Source/XPSP1/NT/windows/feime/chnuconv/tgtproc.c
2020-09-26 16:20:57 +08:00

464 lines
15 KiB
C

/*************************************************
* tgtproc.c *
* *
* Copyright (C) 1992-1999 Microsoft Inc. *
* *
*************************************************/
#include "chnuconv.h"
#include "resource.h"
INT_PTR
TargetTabProc(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
TCHAR szBuffer[MAX_PATH];
int i;
switch( message ) {
case WM_INITDIALOG:
{
RECT rcTab;
//GetTab window size
// first get the size of the tab control
if (GetWindowRect( hMainTabControl, &rcTab )){
// adjust it to compensate for the tabs
TabCtrl_AdjustRect( hMainTabControl, FALSE , &rcTab);
// convert the screen coordinates to client coordinates
MapWindowPoints( HWND_DESKTOP, GetParent(hMainTabControl),
(LPPOINT)&rcTab, 2);
}
SetWindowPos(hWnd, HWND_TOP,
rcTab.left,
rcTab.top,
rcTab.right - rcTab.left,
rcTab.bottom - rcTab.top,
SWP_NOACTIVATE );
LoadString(_hModule, IDS_BUT_SAVEAS, szBuffer, EXTENSION_LENGTH);
SetDlgItemText(hWnd,IDC_OPENORSAVEAS, szBuffer);
LoadString(_hModule, IDS_BUT_TOCLIPBOARD,szBuffer,EXTENSION_LENGTH);
SetDlgItemText(hWnd, IDC_PASTEORCOPY, szBuffer);
for (i=0;i<NumCodePage;i++)
{
LoadString(_hModule, IDS_CTLUNICODE+i,szBuffer,EXTENSION_LENGTH);
ShowWindow(GetDlgItem(hWnd, IDC_RBUNICODE1+i), SW_SHOW);
SetDlgItemText(hWnd, IDC_RBUNICODE1+i, szBuffer);
}
SendMessage(hWnd, WM_COMMAND, IDC_CLEAR, 0);
return(FALSE);
}
case WM_COMMAND:
{
switch(wParam){
/******************************************************************\
* WM_COMMAND, IDC_OPENORSAVEAS
*
* Put up common dialog, try to open file, and write data to it.
\******************************************************************/
case IDC_OPENORSAVEAS:
{
HANDLE hFile;
DWORD nBytesRead;
TCHAR szFile[MAX_PATH],szFileTitle[MAX_PATH];
TCHAR szDefExt[4];
OPENFILENAME OpenFileName;
/* buffers for the file names. */
if (nBytesDestination == NODATA ) {
LoadString(_hModule,IDS_NOTEXTSAVE,MBMessage,EXTENSION_LENGTH);
MessageBox (hWnd, MBMessage,MBTitle, MBFlags);
return 0;
}
//see if user selects swap destination
SwapDest(FALSE);
/* Set up the structure for the GetSaveFileName
* common dialog.
*/
lstrcpy(szDefExt, TEXT("txt") );
wsprintf (szFile, szBlank);
wsprintf (szFileTitle, szBlank);
OpenFileName.lStructSize = sizeof(OPENFILENAME);
OpenFileName.hwndOwner = hWnd;
OpenFileName.hInstance = (HANDLE) _hModule;
OpenFileName.lpstrFilter = szFilter;
OpenFileName.lpstrCustomFilter = NULL;
OpenFileName.nMaxCustFilter = 0L;
OpenFileName.nFilterIndex = 1L;
OpenFileName.lpstrFile = szFile;
OpenFileName.nMaxFile = MAX_PATH;
OpenFileName.lpstrFileTitle = szFileTitle;
OpenFileName.nMaxFileTitle = MAX_PATH;
OpenFileName.lpstrInitialDir = NULL;
LoadString(_hModule, IDS_SAVEAS, szBuffer, 50);
OpenFileName.lpstrTitle = szBuffer;
OpenFileName.nFileOffset = 0;
OpenFileName.nFileExtension = 0;
OpenFileName.lpstrDefExt = szDefExt;
OpenFileName.lCustData = 0;
OpenFileName.lpfnHook = NULL;
OpenFileName.lpTemplateName = NULL;
OpenFileName.Flags = OFN_HIDEREADONLY;
if (!GetSaveFileName(&OpenFileName)) return 0;
/* User has filled in the file information.
* Try to open that file for writing.
*/
hFile = CreateFile(szFile,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE) {
LoadString(_hModule,IDS_CREATEERROR,MBMessage,EXTENSION_LENGTH);
MessageBox (hWnd, MBMessage,MBTitle, MBFlags);
return 0;
}
/* if destination is unicode, try to write BOM first.
* unless the bytes have been swapped
* (criterion: hwndByteOrder contains text)
* in which case, write a Reverse Byte Order Mark.
*/
if (gTypeDest == TYPEUNICODE)
if (!SendDlgItemMessage(hWndTab[1],IDC_SWAPHIGHLOW,
BM_GETCHECK, 0, 0)){
if (!WriteFile (hFile, szBOM, SIZEOFBOM, &nBytesRead, NULL)) {
LoadString(_hModule,IDS_WRITEERROR,MBMessage,EXTENSION_LENGTH);
MessageBox (hWnd, MBMessage,MBTitle, MBFlags);
CloseHandle (hFile);
return 0;
}
}
else
{
if (!WriteFile (hFile, szRBOM, SIZEOFBOM, &nBytesRead, NULL)) {
LoadString(_hModule,IDS_WRITEERROR,MBMessage,EXTENSION_LENGTH);
MessageBox (hWnd, MBMessage,MBTitle, MBFlags);
CloseHandle (hFile);
return 0;
}
}
/* try to write all of it into memory */
if (!WriteFile (hFile, pDestinationData,nBytesDestination, &nBytesRead, NULL)) {
LoadString(_hModule,IDS_WRITEERROR,MBMessage,EXTENSION_LENGTH);
MessageBox (hWnd, MBMessage,MBTitle, MBFlags);
CloseHandle (hFile);
return 0;
}
SetDlgItemText (hWnd,IDC_NAMETEXT,szFile);
CloseHandle (hFile);
break;
}
case IDC_VIEW:
{
SwapDest(FALSE);
if (gTypeDest == TYPEUNICODE)
DialogBoxW (_hModule, MAKEINTRESOURCEW(IDD_SHOWTEXT), hWnd,
ViewTargetProc);
else
DialogBoxA (_hModule, MAKEINTRESOURCEA(IDD_SHOWTEXT), hWnd,
ViewTargetProc);
break;
}
/**********************************************************************\
* WM_COMMAND, IDC_CLEAR
*
* Clear the SOURCE information. May cause data to be lost.
\**********************************************************************/
case IDC_CLEAR:
{
int i;
SetDlgItemText (hWnd, IDC_NAMETEXT, szBlank);
SetDlgItemText (hWnd, IDC_SIZETEXT, szBlank);
for(i=0;i<NumCodePage;i++)
SendDlgItemMessage(hWnd,IDC_RBUNICODE1+i, BM_SETCHECK, 0,0);
pDestinationData= ManageMemory (MMFREE, MMSOURCE, 0, pDestinationData);
nBytesDestination=0;
pTempData1= ManageMemory (MMFREE, MMDESTINATION, 0, pTempData1);
EnableControl(hWnd, IDC_VIEW, FALSE);
EnableControl(hWnd, IDC_PASTEORCOPY, FALSE);
EnableControl(hWnd, IDC_OPENORSAVEAS, FALSE);
EnableControl(hWnd, IDC_CLEAR, FALSE);
EnableControl(hWnd, IDC_SWAPHIGHLOW, FALSE);
SendDlgItemMessage (hWnd,IDC_SWAPHIGHLOW, BM_SETCHECK, 0, 0);
// set gDestSwapped as FALSE
gDestSwapped = FALSE;
EnableMenuItem (GetMenu (_hWndMain),IDM_FILE_SAVEAS,MF_GRAYED);
break;
}
/**********************************************************************\
* WM_COMMAND, IDC_PASTEORCOPY
*
* Copy destination data to the clipboard.
\**********************************************************************/
case IDC_PASTEORCOPY:
{
int i;
if (pDestinationData == NULL) return FALSE;
//see if user selects swap hi-low byte order
SwapDest(FALSE);
OpenClipboard (hWnd);
if( EmptyClipboard() ) {
GlobalUnlock(hglbMem);
GlobalFree(hglbMem);
hglbMem = GlobalAlloc (GMEM_MOVEABLE | GMEM_DDESHARE,
nBytesDestination+40);
p=(PBYTE)GlobalLock(hglbMem);
for(i=0;i<nBytesDestination;i++)
*(p+i)=*(pDestinationData+i);
*(p+i)=0;
//if source NOT unicode, destination is, else look at dest CP
if (gTypeDest == TYPEUNICODE) {
*(p+i+1)=0;
GlobalUnlock(hglbMem);
SetClipboardData (CF_UNICODETEXT, hglbMem);
}
else {
GlobalUnlock(hglbMem);
if (gTypeDestID == giRBInit-CODEPAGEBASE)
SetClipboardData (CF_TEXT, hglbMem);
else
SetClipboardData (CF_OEMTEXT, hglbMem);
}
}
CloseClipboard ();
}
break;
}
}
default:
break;
}
return DefWindowProc( hWnd, message, wParam, lParam );
}
/***************************************************************************\
* FUNCTION: ViewTargetProc
*
* Fill Text, Name, and Type information into the dialog.
* Set a proper font to display the text depending on what type it is.
*
\***************************************************************************/
INT_PTR
ViewTargetProc(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
RECT rect;
switch (message) {
/******************************************************************\
* WM_INITDIALOG
\******************************************************************/
case WM_INITDIALOG:
{
GetSettings();
// Text is unicode... use *W() variants of functions.
if (gTypeDest == TYPEUNICODE) {
WCHAR szBuffer[MAX_PATH];
SetDlgItemTextW (hWnd, IDC_SHOWTEXT_EDIT, (LPCWSTR)pDestinationData);
GetDlgItemTextW (hWndTab[1], IDC_NAMETEXT, szBuffer, MAX_PATH);
SetDlgItemTextW (hWnd, IDC_SHOWTEXT_NAME, szBuffer);
LoadStringW(_hModule, gTypeDestID+STRCODEPAGEBASE, szBuffer,EXTENSION_LENGTH);
SetDlgItemTextW (hWnd, IDC_SHOWTEXT_TYPE, szBuffer);
// Text is codepage... use *A() variants of functions.
} else {
char szBuffer[MAX_PATH];
SetDlgItemTextA (hWnd, IDC_SHOWTEXT_EDIT, (LPCSTR)pDestinationData);
GetDlgItemTextA (hWndTab[1], IDC_NAMETEXT, szBuffer, MAX_PATH);
SetDlgItemTextA (hWnd, IDC_SHOWTEXT_NAME, szBuffer);
LoadStringA(_hModule, gTypeDestID+STRCODEPAGEBASE, szBuffer,EXTENSION_LENGTH);
SetDlgItemTextA (hWnd, IDC_SHOWTEXT_TYPE, szBuffer);
}
LoadString(_hModule, IDS_VIEWTARGET, &gszExtensions[11][0], EXTENSION_LENGTH);
SetWindowText (hWnd,&gszExtensions[11][0] );
GetClientRect (hWnd, &rect);
SendMessage (hWnd, WM_SIZE, 0,
MAKELPARAM ((rect.right - rect.left), (rect.bottom - rect.top)));
return TRUE;
}
case WM_SIZE: {
HWND hwndText;
HWND hwndNotice;
RECT rc;
POINT pt;
hwndNotice = GetDlgItem (hWnd,IDC_SHOWTEXT_FONT);
GetWindowRect(hwndNotice,&rc);
pt.x = 0;
pt.y = rc.bottom;
ScreenToClient(hWnd, &pt);
hwndText = GetDlgItem (hWnd, IDC_SHOWTEXT_EDIT);
MoveWindow (hwndText, DLGBORDER, pt.y+5, (int) LOWORD(lParam) - 2*DLGBORDER,
(int) HIWORD(lParam) - (pt.y+5) - DLGBORDER , TRUE);
}
break;
case WM_COMMAND:
switch (LOWORD (wParam)) {
case IDCANCEL:
case IDOK:
EndDialog (hWnd, TRUE);
}
break; /* end WM_COMMAND */
case WM_SYSCOMMAND:
if (LOWORD (wParam) == SC_CLOSE)
EndDialog (hWnd, FALSE);
break;
} /* end switch */
return FALSE;
}
BOOL
SwapDest(
BOOL bForceSwap
)
{
int i, end;
BYTE temp;
if (pDestinationData == NULL) return FALSE;
//Is the Destination already swapped?
if (SendDlgItemMessage(hWndTab[1], IDC_SWAPHIGHLOW,
BM_GETCHECK,0,0) == gDestSwapped && !bForceSwap)
return FALSE;
end = nBytesDestination - 2;
for (i = 0; i<= end; i+=2) {
temp = pDestinationData[i];
pDestinationData[i] = pDestinationData[i+1];
pDestinationData[i+1] = temp;
}
//set flag that source has been swapped;
gDestSwapped = 1 - gDestSwapped;
return TRUE;
}
VOID
AdjustTargetTab()
{
int i;
GetSettings();
//if user change swap option in source tab, we'd better reset dest.
if (SendDlgItemMessage(hWndTab[0], IDC_SWAPHIGHLOW,
BM_GETCHECK, 0,0) != gSourceSwapped)
SendMessage(hWndTab[1], WM_COMMAND, IDC_CLEAR,0);
//Do we have a source yet?
if(IsWindowEnabled(GetDlgItem(hWndTab[0], IDC_VIEW))){
for (i=0;i<NumCodePage;i++){
EnableControl(hWndTab[1], i+CODEPAGEBASE, TRUE);
SendDlgItemMessage (hWndTab[1],i+CODEPAGEBASE,
BM_SETCHECK, 0, 0);
}
if (gTCSCMapStatus==DONOTMAP && gFWHWMapStatus==DONOTMAP)
EnableControl(hWndTab[1], gTypeSourceID+CODEPAGEBASE,FALSE);
SendDlgItemMessage (hWndTab[1],gTypeDestID+CODEPAGEBASE,
BM_SETCHECK, 1, 0);
}
}
BOOL
EnableControl(
IN HWND hWnd,
IN int ControlId,
IN BOOL Enable
)
/*++
Routine Description:
Enable or diable the specified control based on the supplied flag.
Arguments:
hWnd - Supplies the window (dialog box) handle that contains the
control.
ControlId - Supplies the control id.
Enable - Supplies a flag which if TRUE causes the control to be enabled
and disables the control if FALSE.
Return Value:
BOOL - Returns TRUE if the control is succesfully enabled / disabled.
--*/
{
HWND hWndControl;
BOOL Success;
hWndControl = GetDlgItem( hWnd, ControlId );
if( hWndControl == NULL ) {
return FALSE;
}
if( Enable == IsWindowEnabled( hWndControl )) {
return TRUE;
}
Success = EnableWindow( hWndControl, Enable );
return TRUE;
}