/********************************************************************
*        Keygen.c                                                   *
*                                                                   *
*        - Keygen pour Hexa.exe                                     *
*                                                                   *
*        Auteur                  : - Krom -                         *
*        Date de Création        : - 07 - 12 - 2007 -               *
*        Dernière modification   : - 21 - 12 - 2007 -               *
*                                                                   *
********************************************************************/

#define  WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "identifiers.h"

#define CR_FIELD    RGB(210, 226, 235)
#define CR_INFIELD  RGB(0  , 0  , 0  )
#define CR_OUTFIELD RGB(215, 65 , 75 )

BOOL Init(HWND);
BOOL Gen (HWND);
BOOL Copy(HWND);
BOOL Exit(HWND);

BOOL CALLBACK DlgProc    (HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK InfoDlgProc(HWND, UINT, WPARAM, LPARAM);
BOOL EnableDlgItem(HWND, DWORD, BOOL);
BOOL SetStatusText(HWND, LPCTSTR);

#include "core.c"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
  return DialogBox(hInstance, MAKEINTRESOURCE(IDD_KEYGEN), NULL, DlgProc);
}

BOOL CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  static HINSTANCE hInstance;
  static HBRUSH hFieldColor;
  static HFONT hBoldFont;
  HICON hIcon;
  LOGFONT BoldFont;
  int nFieldId;

  #if !AUTO_UPDATE
    TCHAR sGen[] = TEXT("Hit Generate, please");
  #endif

  switch (uMsg) {

    case WM_COMMAND:

      switch(LOWORD(wParam)) {


        case IDC_INFO:
          DialogBox(hInstance, MAKEINTRESOURCE(IDD_INFO), hWnd, InfoDlgProc);
          break;


        case IDC_GEN:

          if(Gen(hWnd)) {

            #if !AUTO_UPDATE && !MULTI_SERIALS
              EnableDlgItem(hWnd, IDC_GEN, FALSE);
            #endif

            EnableDlgItem(hWnd, IDC_COPY, TRUE);
          }
          else {
            EnableDlgItem(hWnd, IDC_GEN, FALSE);
            EnableDlgItem(hWnd, IDC_COPY, FALSE);
          }

          break;


        case IDC_COPY:

          if(Copy(hWnd))
            EnableDlgItem(hWnd, IDC_COPY, FALSE);

          break;


        case IDC_EXIT:
          SendMessage(hWnd, WM_CLOSE, 0, 0);
          break;


        default:

          if(LOWORD(wParam) >= INFIELD_BEGIN && LOWORD(wParam) <= INFIELD_END && HIWORD(wParam) == EN_UPDATE) {

            #if AUTO_UPDATE

              if(Gen(hWnd)) {

                #if MULTI_SERIALS
                  EnableDlgItem(hWnd, IDC_GEN, TRUE);
                #endif

                EnableDlgItem(hWnd, IDC_COPY, TRUE);
              }
              else {

                #if MULTI_SERIALS
                  EnableDlgItem(hWnd, IDC_GEN, FALSE);
                #endif

                EnableDlgItem(hWnd, IDC_COPY, FALSE);
              }

            #else
              EnableDlgItem(hWnd, IDC_GEN, TRUE);
              EnableDlgItem(hWnd, IDC_COPY, FALSE);
              SetStatusText(hWnd, sGen);
            #endif

          }
          else
            return FALSE;
      }

      break;

    case WM_INITDIALOG:
      hInstance = GetModuleHandle(NULL);
      hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_KEYGEN));

      SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM) hIcon);
      SendMessage(hWnd, WM_SETICON, ICON_SMALL,(LPARAM) hIcon);



      hFieldColor = CreateSolidBrush(CR_FIELD);
      GetObject((HFONT) SendMessage(hWnd, WM_GETFONT, 0, 0), sizeof(LOGFONT), &BoldFont);
      BoldFont.lfWeight = FW_BOLD;
      hBoldFont = CreateFontIndirect(&BoldFont);

      for(nFieldId = OUTFIELD_BEGIN; nFieldId <= OUTFIELD_END; nFieldId++)

        if(GetDlgItem(hWnd, nFieldId) != NULL)
          SendDlgItemMessage(hWnd, nFieldId, WM_SETFONT, (WPARAM) hBoldFont, TRUE);
        else
          break;

      for(nFieldId = INFIELD_BEGIN; nFieldId <= INFIELD_END; nFieldId++)

        if(GetDlgItem(hWnd, nFieldId) != NULL)
          SendDlgItemMessage(hWnd, nFieldId, WM_SETFONT, (WPARAM) hBoldFont, TRUE);
        else
          break;


      #ifdef TARGET_VERSION
        SetWindowText(hWnd, TEXT(TARGET " " TARGET_VERSION " " TYPE));
      #else
        SetWindowText(hWnd, TEXT(TARGET " " TYPE));
      #endif


      if(!Init(hWnd)) {
        SendMessage(hWnd, WM_CLOSE, 0, 0);
        break;
      }

      #if AUTO_UPDATE

        #if !MULTI_SERIALS
          EnableDlgItem(hWnd, IDC_GEN, FALSE);
        #endif

        if(!Gen(hWnd)) {

          #if MULTISERIALS
            EnableDlgItem(hWnd, IDC_GEN, FALSE);
          #endif

          EnableDlgItem(hWnd, IDC_COPY, FALSE);
        }

      #else
        EnableDlgItem(hWnd, IDC_COPY, FALSE);
        SetDlgItemText(hWnd, IDC_STATUS, sGen);
      #endif

      break;

    case WM_CLOSE:

      Exit(hWnd);

      DeleteObject(hBoldFont);
      DeleteObject(hFieldColor);

      EndDialog(hWnd, TRUE);
      break;


    case WM_CTLCOLORSTATIC:
      nFieldId = GetDlgCtrlID((HWND) lParam);

      if(nFieldId >= OUTFIELD_BEGIN && nFieldId <= OUTFIELD_END) {
        SetBkColor((HDC) wParam, CR_FIELD);
        SetTextColor((HDC) wParam, CR_OUTFIELD);
        return (LRESULT) hFieldColor;
      }
      else
        return FALSE;


    case WM_CTLCOLOREDIT:
      SetBkColor((HDC) wParam, CR_FIELD);
      SetTextColor((HDC) wParam, CR_INFIELD);
      return (LRESULT) hFieldColor;

    default:
      return FALSE;

  }

  return TRUE;
}

BOOL CALLBACK InfoDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

  switch(uMsg) {

    case WM_COMMAND:

      switch(LOWORD(wParam)) {

        case IDOK:
          EndDialog(hWnd, TRUE);

        default:
          return FALSE;

      }

      break;

    case WM_INITDIALOG:

      SetDlgItemText(hWnd, IDC_TITLE, TEXT("HexDecCharEditor 1.02 - Keygen"));


      break;

    default:
      return FALSE;

  }

  return TRUE;
}

BOOL EnableDlgItem(HWND hWnd, DWORD nDlgItem, BOOL bEnable) {
  return EnableWindow(GetDlgItem(hWnd, nDlgItem), bEnable);
}

BOOL SetStatusText(HWND hWnd, LPCTSTR sText) {
  return SetDlgItemText(hWnd, IDC_STATUS, sText);
}