#include <windows.h>
#include "fconfig.h"
#include "xerror.h"
#include "ui_win32.h"
#include "about.h"
void
CenterWindow (HWND hwndChild, HWND hwndParent)
{
  RECT rChild, rParent, rWorkArea;
  int wChild, hChild, wParent, hParent;
  int xNew, yNew;
  BOOL bResult;

  GetWindowRect (hwndChild, &rChild);
  wChild = rChild.right - rChild.left;
  hChild = rChild.bottom - rChild.top;

  GetWindowRect (hwndParent, &rParent);
  wParent = rParent.right - rParent.left;
  hParent = rParent.bottom - rParent.top;

  bResult = SystemParametersInfo (SPI_GETWORKAREA,	// system parameter to query or set
				  sizeof (RECT), &rWorkArea, 0);
  if (!bResult)
    {
      rWorkArea.left = rWorkArea.top = 0;
      rWorkArea.right = GetSystemMetrics (SM_CXSCREEN);
      rWorkArea.bottom = GetSystemMetrics (SM_CYSCREEN);
    }

  xNew = rParent.left + ((wParent - wChild) / 2);
  if (xNew < rWorkArea.left)
    {
      xNew = rWorkArea.left;
    }
  else if ((xNew + wChild) > rWorkArea.right)
    {
      xNew = rWorkArea.right - wChild;
    }

  yNew = rParent.top + ((hParent - hChild) / 2);
  if (yNew < rWorkArea.top)
    {
      yNew = rWorkArea.top;
    }
  else if ((yNew + hChild) > rWorkArea.bottom)
    {
      yNew = rWorkArea.bottom - hChild;
    }

  SetWindowPos (hwndChild, NULL, xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
  return;
}


static LPTSTR
GetStringRes (int id)
{
  static TCHAR buffer[MAX_PATH];

  buffer[0] = 0;
  LoadString (GetModuleHandle (NULL), id, buffer, MAX_PATH);
  return buffer;
}

static LRESULT CALLBACK
About (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  static HFONT hfontDlg;	// Font for dialog text
  static HFONT hFinePrint;	// Font for 'fine print' in dialog
  DWORD dwVerInfoSize;		// Size of version information block
  LPSTR lpVersion;		// String pointer to 'version' text
  DWORD dwVerHnd = 0;		// An 'ignored' parameter, always '0'
  UINT uVersionLen;
  WORD wRootLen;
  BOOL bRetCode;
  int i;
  char szFullPath[256];
  char szResult[256];
  char szGetName[256];
  DWORD dwVersion;
  char szVersion[40];
  DWORD dwResult;

  switch (message)
    {
    case WM_INITDIALOG:
      ShowWindow (hDlg, SW_HIDE);

      if (PRIMARYLANGID (GetUserDefaultLangID ()) == LANG_JAPANESE)
	{
	  hfontDlg =
	    CreateFont (14, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0,
			VARIABLE_PITCH | FF_DONTCARE, "");
	  hFinePrint =
	    CreateFont (11, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0,
			VARIABLE_PITCH | FF_DONTCARE, "");
	}
      else
	{
	  hfontDlg = CreateFont (14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
				 VARIABLE_PITCH | FF_SWISS, "");
	  hFinePrint = CreateFont (11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
				   VARIABLE_PITCH | FF_SWISS, "");
	}

      CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));
      GetModuleFileName (hInstance, szFullPath, sizeof (szFullPath));
#if 0
      // Now lets dive in and pull out the version information:
      dwVerInfoSize = GetFileVersionInfoSize (szFullPath, &dwVerHnd);
      if (dwVerInfoSize)
	{
	  LPSTR lpstrVffInfo;
	  HANDLE hMem;
	  hMem = GlobalAlloc (GMEM_MOVEABLE, dwVerInfoSize);
	  lpstrVffInfo = GlobalLock (hMem);
	  GetFileVersionInfo (szFullPath, dwVerHnd, dwVerInfoSize,
			      lpstrVffInfo);
	  // The below 'hex' value looks a little confusing, but
	  // essentially what it is, is the hexidecimal representation
	  // of a couple different values that represent the language
	  // and character set that we are wanting string values for.
	  // 040904E4 is a very common one, because it means:
	  //   US English, Windows MultiLingual characterset
	  // Or to pull it all apart:
	  // 04------        = SUBLANG_ENGLISH_USA
	  // --09----        = LANG_ENGLISH
	  // --11----        = LANG_JAPANESE
	  // ----04E4 = 1252 = Codepage for Windows:Multilingual

	  lstrcpy (szGetName, GetStringRes (IDS_VER_INFO_LANG));

	  wRootLen = (WORD) lstrlen (szGetName);	// Save this position

	  // Set the title of the dialog:
	  lstrcat (szGetName, "ProductName");
	  bRetCode = VerQueryValue ((LPVOID) lpstrVffInfo,
				    (LPSTR) szGetName,
				    (LPVOID) & lpVersion,
				    (UINT *) & uVersionLen);

	  // Notice order of version and string...
	  if (PRIMARYLANGID (GetUserDefaultLangID ()) == LANG_JAPANESE)
	    {
	      lstrcpy (szResult, lpVersion);
	      lstrcat (szResult, " のバージョン情報");
	    }
	  else
	    {
	      lstrcpy (szResult, "About ");
	      lstrcat (szResult, lpVersion);
	    }

	  // -----------------------------------------------------

	  SetWindowText (hDlg, szResult);

	  // Walk through the dialog items that we want to replace:
	  for (i = DLG_VERFIRST; i <= DLG_VERLAST; i++)
	    {
	      GetDlgItemText (hDlg, i, szResult, sizeof (szResult));
	      szGetName[wRootLen] = (char) 0;
	      lstrcat (szGetName, szResult);
	      uVersionLen = 0;
	      lpVersion = NULL;
	      x_message ("lpstrVffInfo %s", lpstrVffInfo);
	      bRetCode = VerQueryValue ((LPVOID) lpstrVffInfo,
					(LPSTR) szGetName,
					(LPVOID) & lpVersion,
					(UINT *) & uVersionLen);

	      if (bRetCode && uVersionLen && lpVersion)
		{
		  // Replace dialog item text with version info
		  lstrcpy (szResult, lpVersion);
		  SetDlgItemText (hDlg, i, szResult);
		}
	      else
		{
		  dwResult = GetLastError ();

		  wsprintf (szResult, GetStringRes (IDS_VERSION_ERROR),
			    dwResult);
		  SetDlgItemText (hDlg, i, szResult);
		}
	      SendMessage (GetDlgItem (hDlg, i), WM_SETFONT,
			   /* (ULONG_PTR) */
			   (unsigned long *) ((i == DLG_VERLAST) ? hFinePrint
					      : hfontDlg), TRUE);
	    }			// for (i = DLG_VERFIRST; i <= DLG_VERLAST; i++)


	  GlobalUnlock (hMem);
	  GlobalFree (hMem);
	}
      else
	{
	  // No version information available.
	}			// if (dwVerInfoSize)
#endif
      for (i = DLG_VERFIRST; i <= IDC_LICENSE; i++)
	{
	  SendMessage (GetDlgItem (hDlg, i), WM_SETFONT,
		       /* (ULONG_PTR) */
		       (unsigned long *) ((i == DLG_VERLAST) ? hFinePrint :
					  hfontDlg), TRUE);
	}			// for (i = DLG_VERFIRST; i <= DLG_VERLAST; i++)

      SendMessage (GetDlgItem (hDlg, IDC_LABEL), WM_SETFONT,
		   (WPARAM) hfontDlg, (LPARAM) TRUE);

      // We are  using GetVersion rather then GetVersionEx
      // because earlier versions of Windows NT and Win32s
      // didn't include GetVersionEx:
      dwVersion = GetVersion ();

      if (dwVersion < 0x80000000)
	{
	  // Windows NT
	  wsprintf (szVersion, "Microsoft Windows NT %u.%u (Build: %u)",
		    (DWORD) (LOBYTE (LOWORD (dwVersion))),
		    (DWORD) (HIBYTE (LOWORD (dwVersion))),
		    (DWORD) (HIWORD (dwVersion)));
	}
      else if (LOBYTE (LOWORD (dwVersion)) < 4)
	{
	  // Win32s
	  wsprintf (szVersion, "Microsoft Win32s %u.%u (Build: %u)",
		    (DWORD) (LOBYTE (LOWORD (dwVersion))),
		    (DWORD) (HIBYTE (LOWORD (dwVersion))),
		    (DWORD) (HIWORD (dwVersion) & ~0x8000));
	}
      else
	{
	  // Windows 95
	  wsprintf (szVersion, "Microsoft Windows 95 %u.%u",
		    (DWORD) (LOBYTE (LOWORD (dwVersion))),
		    (DWORD) (HIBYTE (LOWORD (dwVersion))));
	}

      SetWindowText (GetDlgItem (hDlg, IDC_OSVERSION), szVersion);
      ShowWindow (hDlg, SW_SHOW);
      return (TRUE);

    case WM_COMMAND:
      if (LOWORD (wParam) == IDOK || LOWORD (wParam) == IDCANCEL)
	{
	  EndDialog (hDlg, TRUE);
	  DeleteObject (hfontDlg);
	  DeleteObject (hFinePrint);
	  return (TRUE);
	}
      break;
    }

  return FALSE;
}

void
AboutBox (void)
{
#ifdef DDRAW_DRIVER
  if (directX == 1)
    return;
#endif
  DialogBox (hInstance, "AboutBox", hWnd, (DLGPROC) About);
}
