www.pudn.com > Uconvert.zip > DIALOGS.C


/**************************************************************************\ 
* dialogs.c -- dialog procedure support for uconvert 
* 
*         Steve Firebaugh 
*         Microsoft Developer Support 
*         Copyright (c) 1992-1997 Microsoft Corporation 
* 
\**************************************************************************/ 
#define UNICODE 
 
 
#include  
#include "uconvert.h" 
#include "install.h" 
 
 
/* Define affecting the positioning of child windows in dialog. */ 
#define DLGBORDER    GetSystemMetrics (SM_CXFRAME)*2 
 
 
/***************************************************************************\ 
*    FUNCTION: ConversionOptionsProc 
* 
* Fill Dlg with state information on WM_INITDIALOG. 
*  Take it back down and change internal state on WM_COMMAND, IDOK. 
* 
* Global variables: 
*  gMBFlags 
*  gWCFlags 
*  glpDefaultChar 
*  glpUsedDefaultChar 
* 
\***************************************************************************/ 
LRESULT CALLBACK ConversionOptionsProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
 
  switch (message) { 
 
    /******************************************************************\ 
    *  WM_INITDIALOG 
    * 
    * Set radio buttons appropriately. 
    \******************************************************************/ 
    case WM_INITDIALOG: 
      if (gMBFlags & MB_PRECOMPOSED) 
        SendDlgItemMessage (hwnd, DID_PRECOMPOSED, BM_SETCHECK, 1, 0); 
 
      if (gMBFlags & MB_COMPOSITE) 
        SendDlgItemMessage (hwnd, DID_COMPOSITE, BM_SETCHECK, 1, 0); 
 
      if (gMBFlags & MB_USEGLYPHCHARS) 
        SendDlgItemMessage (hwnd, DID_USEGLYPHCHARS, BM_SETCHECK, 1, 0); 
 
      if (gWCFlags & WC_COMPOSITECHECK) 
        SendDlgItemMessage (hwnd, DID_COMPOSITECHECK, BM_SETCHECK, 1, 0); 
 
      if (gWCFlags & WC_DISCARDNS) 
        SendDlgItemMessage (hwnd, DID_DISCARDNS, BM_SETCHECK, 1, 0); 
 
      if (gWCFlags & WC_SEPCHARS) 
        SendDlgItemMessage (hwnd, DID_SEPCHARS, BM_SETCHECK, 1, 0); 
 
      if (gWCFlags & WC_DEFAULTCHAR) 
        SendDlgItemMessage (hwnd, DID_DEFAULTCHAR, BM_SETCHECK, 1, 0); 
 
      SendDlgItemMessage (hwnd, DID_EFDEFAULTCHAR, EM_LIMITTEXT, 1, 0); 
      SetDlgItemTextA (hwnd, DID_EFDEFAULTCHAR, glpDefaultChar); 
 
      if (gUsedDefaultChar) 
        SendDlgItemMessage (hwnd, DID_USEDDEFAULTCHAR, BM_SETCHECK, 1, 0); 
 
 
      SetFocus (GetDlgItem (hwnd, IDOK)); 
    return FALSE; 
 
 
    case WM_COMMAND: 
      switch (LOWORD (wParam)) { 
        case IDCANCEL: 
          EndDialog (hwnd, FALSE); 
        break; 
 
        /******************************************************************\ 
        *  WM_COMMAND, IDOK 
        * 
        * Get state from radio buttons and others. 
        \******************************************************************/ 
        case IDOK: { 
 
          if (SendDlgItemMessage(hwnd, DID_PRECOMPOSED, BM_GETCHECK, 0,0)) 
            gMBFlags |= MB_PRECOMPOSED; 
          else 
            gMBFlags &= ~MB_PRECOMPOSED; 
 
          if (SendDlgItemMessage(hwnd, DID_COMPOSITE, BM_GETCHECK, 0,0)) 
            gMBFlags |= MB_COMPOSITE; 
          else 
            gMBFlags &= ~MB_COMPOSITE; 
 
          if (SendDlgItemMessage(hwnd, DID_USEGLYPHCHARS, BM_GETCHECK, 0,0)) 
            gMBFlags |= MB_USEGLYPHCHARS; 
          else 
            gMBFlags &= ~MB_USEGLYPHCHARS; 
 
          if (SendDlgItemMessage(hwnd, DID_DISCARDNS, BM_GETCHECK, 0,0)) 
            gWCFlags |= WC_DISCARDNS; 
          else 
            gWCFlags &= ~WC_DISCARDNS; 
 
          if (SendDlgItemMessage(hwnd, DID_COMPOSITECHECK, BM_GETCHECK, 0,0)) 
            gWCFlags |= WC_COMPOSITECHECK; 
          else 
            gWCFlags &= ~WC_COMPOSITECHECK; 
 
          if (SendDlgItemMessage(hwnd, DID_SEPCHARS, BM_GETCHECK, 0,0)) 
            gWCFlags |= WC_SEPCHARS; 
          else 
            gWCFlags &= ~WC_SEPCHARS; 
 
          if (SendDlgItemMessage(hwnd, DID_DEFAULTCHAR, BM_GETCHECK, 0,0)) 
            gWCFlags |= WC_DEFAULTCHAR; 
          else 
            gWCFlags &= ~WC_DEFAULTCHAR; 
 
          GetDlgItemTextA (hwnd, DID_EFDEFAULTCHAR, glpDefaultChar, 2); // CHAR + NULL 
 
          EndDialog (hwnd, TRUE); 
        } break; 
 
 
        /******************************************************************\ 
        *  WM_COMMAND, DID_* 
        * 
        * Manage radio button pattern. 
        \******************************************************************/ 
        case DID_PRECOMPOSED: 
          SendDlgItemMessage (hwnd, DID_PRECOMPOSED, BM_SETCHECK, TRUE, 0); 
          SendDlgItemMessage (hwnd, DID_COMPOSITE,   BM_SETCHECK, FALSE, 0); 
        break; 
 
        case DID_COMPOSITE: 
          SendDlgItemMessage (hwnd, DID_PRECOMPOSED, BM_SETCHECK, FALSE, 0); 
          SendDlgItemMessage (hwnd, DID_COMPOSITE,   BM_SETCHECK, TRUE, 0); 
        break; 
 
      } 
    break; /* end WM_COMMAND */ 
 
 
 
    case WM_SYSCOMMAND: 
      if (LOWORD (wParam) == SC_CLOSE) 
          EndDialog (hwnd, FALSE); 
    break; 
 
  } /* end switch */ 
  return FALSE; 
} 
 
 
 
/***************************************************************************\ 
*    FUNCTION: SourceOptionsProc 
* 
* Fill Dlg with state information on WM_INITDIALOG. 
*  Take it back down and change internal state on WM_COMMAND, IDOK. 
* 
* Global variables: 
*   gTypeSource 
*   giSourceCodePage 
*   giDestinationCodePage 
* 
\***************************************************************************/ 
LRESULT CALLBACK SourceOptionsProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
TCHAR buffer[50]; 
 
  switch (message) { 
 
    /******************************************************************\ 
    *  WM_INITDIALOG 
    * 
    * Set radio buttons appropriately. 
    \******************************************************************/ 
    case WM_INITDIALOG: 
      SetWindowText (hwnd, LoadResourceString(IDS_INTERPRET_SOURCE_AS)); 
      ListInstalledTables (GetDlgItem (hwnd, DID_CODEPAGELIST),CB_ADDSTRING, TRUE); 
      if (gTypeSource == TYPEUNICODE) 
        SendDlgItemMessage (hwnd, DID_RBUNICODE, BM_SETCHECK, 1, 0); 
 
      /* 
       * if gTypeSource == TYPECODEPAGE, then see if it is one of the 
       *  standard radio buttons.  If so, check the right one. 
       *  if not, check, "other" and select correct entry in combobox. 
       */ 
      else if (gTypeSource == TYPECODEPAGE) { 
        if (giSourceCodePage == GetACP()) 
          SendDlgItemMessage (hwnd, DID_RBANSICP, BM_SETCHECK, 1, 0); 
        else if (giSourceCodePage == GetOEMCP()) 
          SendDlgItemMessage (hwnd, DID_RBOEMCP, BM_SETCHECK, 1, 0); 
        else { 
          SendDlgItemMessage (hwnd, DID_RBOTHERCP, BM_SETCHECK, 1, 0); 
          wsprintf (buffer, TEXT("%d"), giSourceCodePage); 
          SendDlgItemMessage (hwnd, DID_CODEPAGELIST, CB_SELECTSTRING, 0, (LPARAM)buffer); 
        } 
      } else { 
        // OK to not be specified here.  Wait for user to make choice. 
      } 
 
 
      SetFocus (GetDlgItem (hwnd, IDOK)); 
    return FALSE; 
 
 
    case WM_COMMAND: 
      switch (LOWORD (wParam)) { 
        case IDCANCEL: 
          EndDialog (hwnd, FALSE); 
        break; 
 
        /******************************************************************\ 
        *  WM_COMMAND, IDOK 
        * 
        * Get state from radio buttons and others. 
        \******************************************************************/ 
        case IDOK: { 
          BOOL success; 
 
          if (SendDlgItemMessage(hwnd, DID_RBUNICODE, BM_GETCHECK, 0,0)) { 
            gTypeSource = TYPEUNICODE; 
          } else if (SendDlgItemMessage(hwnd, DID_RBANSICP, BM_GETCHECK, 0,0)) { 
            gTypeSource = TYPECODEPAGE; 
            giSourceCodePage=GetACP(); 
          } else if (SendDlgItemMessage(hwnd, DID_RBOEMCP, BM_GETCHECK, 0,0)) { 
            gTypeSource = TYPECODEPAGE; 
            giSourceCodePage=GetOEMCP(); 
          } else if (SendDlgItemMessage(hwnd, DID_RBOTHERCP, BM_GETCHECK, 0,0)) { 
            gTypeSource = TYPECODEPAGE; 
            giSourceCodePage=GetDlgItemInt (hwnd, DID_CODEPAGELIST, &success, FALSE); 
          } else 
            gTypeSource = TYPEUNKNOWN; 
          EndDialog (hwnd, TRUE); 
        } break; 
      } 
    break; /* end WM_COMMAND */ 
 
 
    case WM_SYSCOMMAND: 
      if (LOWORD (wParam) == SC_CLOSE) 
          EndDialog (hwnd, FALSE); 
    break; 
 
  } /* end switch */ 
  return FALSE; 
} 
 
/***************************************************************************\ 
*    FUNCTION: DestinationOptionsProc 
* 
* Fill Dlg with state information on WM_INITDIALOG. 
*  Take it back down and change internal state on WM_COMMAND, IDOK. 
* 
* 
* Global variables: 
*   gTypeSource 
*   giSourceCodePage 
*   giDestinationCodePage 
* 
\***************************************************************************/ 
LRESULT CALLBACK DestinationOptionsProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
TCHAR buffer[50]; 
 
  switch (message) { 
 
    /******************************************************************\ 
    *  WM_INITDIALOG 
    * 
    * Set radio buttons appropriately. 
    \******************************************************************/ 
    case WM_INITDIALOG: 
      SetWindowText (hwnd, LoadResourceString(IDS_CONVERT_DEST_TO)); 
      ListInstalledTables (GetDlgItem (hwnd, DID_CODEPAGELIST),CB_ADDSTRING, TRUE); 
 
      /* if source is unicode, destination will be code page. */ 
      if (gTypeSource == TYPEUNICODE) { 
        EnableWindow (GetDlgItem (hwnd, DID_RBUNICODE), FALSE); 
 
        if (giDestinationCodePage == GetACP()) 
          SendDlgItemMessage (hwnd, DID_RBANSICP, BM_SETCHECK, 1, 0); 
        else if (giDestinationCodePage == GetOEMCP()) 
          SendDlgItemMessage (hwnd, DID_RBOEMCP, BM_SETCHECK, 1, 0); 
        else { 
          SendDlgItemMessage (hwnd, DID_RBOTHERCP, BM_SETCHECK, 1, 0); 
          wsprintf (buffer, TEXT("%d"), giDestinationCodePage); 
          SendDlgItemMessage (hwnd, DID_CODEPAGELIST, CB_SELECTSTRING, 0, (LPARAM)buffer); 
        } 
 
      /* otherwise destination is unicode, so disable most of the checkboxes. */ 
      } else if (gTypeSource == TYPECODEPAGE) { 
        SendDlgItemMessage (hwnd, DID_RBUNICODE, BM_SETCHECK, 1, 0); 
        EnableWindow (GetDlgItem (hwnd, DID_RBANSICP), FALSE); 
        EnableWindow (GetDlgItem (hwnd, DID_RBOEMCP), FALSE); 
        EnableWindow (GetDlgItem (hwnd, DID_RBOTHERCP), FALSE); 
        EnableWindow (GetDlgItem (hwnd, DID_CODEPAGELIST), FALSE); 
      } else { 
        EndDialog (hwnd, FALSE);  // shouldn't get here. 
      } 
 
      SetFocus (GetDlgItem (hwnd, IDOK)); 
    return FALSE; 
 
 
    case WM_COMMAND: 
      switch (LOWORD (wParam)) { 
        case IDCANCEL: 
          EndDialog (hwnd, FALSE); 
        break; 
 
        /******************************************************************\ 
        *  WM_COMMAND, IDOK 
        * 
        * Get state from radio buttons and others. 
        \******************************************************************/ 
        case IDOK: { 
          BOOL success; 
          if (SendDlgItemMessage(hwnd, DID_RBUNICODE, BM_GETCHECK, 0,0)) { 
            // Do nothing. gTypeSource already implies dest <-> unicode. 
          } else if (SendDlgItemMessage(hwnd, DID_RBANSICP, BM_GETCHECK, 0,0)) { 
            giDestinationCodePage=GetACP(); 
          } else if (SendDlgItemMessage(hwnd, DID_RBOEMCP, BM_GETCHECK, 0,0)) { 
            giDestinationCodePage=GetOEMCP(); 
          } else if (SendDlgItemMessage(hwnd, DID_RBOTHERCP, BM_GETCHECK, 0,0)) { 
            giDestinationCodePage=GetDlgItemInt (hwnd, DID_CODEPAGELIST, &success, FALSE); 
          } 
 
          EndDialog (hwnd, TRUE); 
        } break; 
      } 
    break; /* end WM_COMMAND */ 
 
    case WM_SYSCOMMAND: 
      if (LOWORD (wParam) == SC_CLOSE) 
          EndDialog (hwnd, FALSE); 
    break; 
 
  } /* end switch */ 
  return FALSE; 
} 
 
 
/***************************************************************************\ 
*    FUNCTION: ViewSourceProc 
* 
* Fill Text, Name, and Type information into the dialog. 
*  Set a proper font to display the text depending on what type it is. 
* 
\***************************************************************************/ 
LRESULT CALLBACK ViewSourceProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
RECT rect; 
 
  switch (message) { 
 
    /******************************************************************\ 
    *  WM_INITDIALOG 
    \******************************************************************/ 
    case WM_INITDIALOG: 
 
      /* Text is unicode... use *W() variants of functions. */ 
      if (gTypeSource == TYPEUNICODE) { 
        WCHAR buffer[MAX_PATH]; 
        LOGFONTW logfont; 
        HFONT hFont; 
 
        SetWindowTextW (GetDlgItem (hwnd, DID_TEXT), (LPCWSTR)pSourceData); 
        GetWindowTextW (hwndName0, buffer, MAX_PATH); 
        SetWindowTextW (GetDlgItem (hwnd, DID_NAME), buffer); 
        GetWindowTextW (hwndCodePage0, buffer, MAX_PATH); 
        SetWindowTextW (GetDlgItem (hwnd, DID_TYPE), buffer); 
 
        GetObjectW (GetStockObject (SYSTEM_FONT), sizeof(LOGFONTW), &logfont); 
        logfont.lfCharSet = UNICODE_CHARSET; 
        lstrcpyW (logfont.lfFaceName, L"Lucida Sans Unicode"); 
        hFont = CreateFontIndirectW (&logfont); 
        SendMessageW (GetDlgItem (hwnd, DID_TEXT), WM_SETFONT, (WPARAM) hFont, 0); 
 
 
      /* Text is codepage... use *A() variants of functions. */ 
      } else { 
        char buffer[MAX_PATH]; 
        LOGFONTA logfont; 
        HFONT hFont; 
 
        SetWindowTextA (GetDlgItem (hwnd, DID_TEXT), pSourceData); 
        GetWindowTextA (hwndName0, buffer, MAX_PATH); 
        SetWindowTextA (GetDlgItem (hwnd, DID_NAME), buffer); 
        GetWindowTextA (hwndCodePage0, buffer, MAX_PATH); 
        SetWindowTextA (GetDlgItem (hwnd, DID_TYPE), buffer); 
 
        GetObjectA (GetStockObject (SYSTEM_FONT), sizeof(LOGFONTA), &logfont); 
        logfont.lfCharSet = giSourceCodePage; 
        lstrcpyA (logfont.lfFaceName, "System"); 
        hFont = CreateFontIndirectA (&logfont); 
        SendMessageA (GetDlgItem (hwnd, DID_TEXT), WM_SETFONT, (WPARAM) hFont, 0); 
 
      } 
      SetWindowText (hwnd, LoadResourceString(IDS_VIEW_SOURCE_TITLE)); 
      GetClientRect (hwnd, &rect); 
      SendMessage (hwnd, WM_SIZE, 0, 
                 MAKELPARAM ((rect.right - rect.left), (rect.bottom - rect.top))); 
      return TRUE; 
    break; 
 
    case WM_SIZE: { 
      HWND hwndText; 
 
      hwndText = GetDlgItem (hwnd, DID_TEXT); 
      MoveWindow (hwndText, DLGBORDER, 60, (int) LOWORD(lParam) - 2*DLGBORDER, 
                                (int) HIWORD(lParam) - 60 - DLGBORDER , TRUE); 
    } 
 
    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; 
} 
 
 
 
/***************************************************************************\ 
*    FUNCTION: ViewDestinationProc 
* 
* Fill Text, Name, and Type information into the dialog. 
*  Set a proper font to display the text depending on what type it is. 
* 
\***************************************************************************/ 
LRESULT CALLBACK ViewDestinationProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
RECT rect; 
 
  switch (message) { 
 
    /******************************************************************\ 
    *  WM_INITDIALOG 
    \******************************************************************/ 
    case WM_INITDIALOG: 
 
      /* Destination text is unicode... use *W() variants of functions. */ 
      if (gTypeSource != TYPEUNICODE) { 
        WCHAR buffer[MAX_PATH]; 
        LOGFONTW logfont; 
        HFONT hFont; 
 
        SetWindowTextW (GetDlgItem (hwnd, DID_TEXT), (LPCWSTR)pDestinationData); 
        GetWindowTextW (hwndName1, buffer, MAX_PATH); 
        SetWindowTextW (GetDlgItem (hwnd, DID_NAME), buffer); 
        GetWindowTextW (hwndCodePage1, buffer, MAX_PATH); 
        SetWindowTextW (GetDlgItem (hwnd, DID_TYPE), buffer); 
 
        GetObjectW (GetStockObject (SYSTEM_FONT), sizeof(LOGFONTW), &logfont); 
        logfont.lfCharSet = UNICODE_CHARSET; 
        lstrcpyW (logfont.lfFaceName, L"Lucida Sans Unicode"); 
        hFont = CreateFontIndirectW (&logfont); 
        SendMessageW (GetDlgItem (hwnd, DID_TEXT), WM_SETFONT, (WPARAM) hFont, 0); 
 
 
      /* Destination text is codepage... use *A() variants of functions. */ 
      } else { 
        char buffer[MAX_PATH]; 
        LOGFONTA logfont; 
        HFONT hFont; 
 
        SetWindowTextA (GetDlgItem (hwnd, DID_TEXT), pDestinationData); 
        GetWindowTextA (hwndName1, buffer, MAX_PATH); 
        SetWindowTextA (GetDlgItem (hwnd, DID_NAME), buffer); 
        GetWindowTextA (hwndCodePage1, buffer, MAX_PATH); 
        SetWindowTextA (GetDlgItem (hwnd, DID_TYPE), buffer); 
 
        GetObjectA (GetStockObject (SYSTEM_FONT), sizeof(LOGFONTA), &logfont); 
        logfont.lfCharSet = giDestinationCodePage; 
        lstrcpyA (logfont.lfFaceName, "System"); 
        hFont = CreateFontIndirectA (&logfont); 
        SendMessageA (GetDlgItem (hwnd, DID_TEXT), WM_SETFONT, (WPARAM) hFont, 0); 
 
      } 
      SetWindowText (hwnd, LoadResourceString(IDS_VIEW_DEST_TITLE)); 
      GetClientRect (hwnd, &rect); 
      SendMessage (hwnd, WM_SIZE, 0, 
                 MAKELPARAM ((rect.right - rect.left),(rect.bottom - rect.top))); 
 
      return TRUE; 
    break; 
 
 
    case WM_SIZE: { 
      HWND hwndText; 
 
      hwndText = GetDlgItem (hwnd, DID_TEXT); 
      MoveWindow (hwndText, DLGBORDER, 60, (int) LOWORD(lParam) - 2*DLGBORDER, 
                                (int) HIWORD(lParam) - 60 - DLGBORDER , TRUE); 
    } 
 
    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; 
}