/****************************************************************/
/*								*/
#define PRGN	"TUNA.C"
#define PRGMOD	"01/05/1987	22:21:04"
#define PRGCRT	"01/05/1987	14:44:54"
#define PRGBASE	"12/20/1986	14:00:54"
/*  Copyright (C) 1986-87, Alan Cooper - All Rights Reserved.	*/
/*								*/
/*	WinMain for "Tuna", the Color Tuner Tester.		*/
/*								*/
/****************************************************************/
#include "windows.h"
#include "personal.h"
#include "tuna.h"
#include "about.equ"
#include "tuner.equ"
/****************************************************************
*								*
*	Declaratives.						*
*								*
*****************************************************************/
INT PASCAL WinMain(HANDLE,HANDLE,LPSTR,INT);
LONG FAR PASCAL WndProc_tuna_main(HWND,UNSIGNED,WORD,LONG);
VOID do_error(POINTER);
PRIVATE BOOL init_register_windows(VOID);
PRIVATE BOOL init_create_main_window(VOID);
PRIVATE BOOL init_load_resources(VOID);
PRIVATE BOOL init_preset_local_vars(VOID);
PRIVATE BOOL main_command(HWND,UNSIGNED,WORD,LONG);
PRIVATE VOID set_new_system_color(SWORD,WORD);
PRIVATE VOID set_color_main_bg(VOID);
PRIVATE BOOL main_syscommand(HWND,UNSIGNED,WORD,LONG);
/****************************************************************
*								*
*	Private (Local Static) Variables.			*
*								*
*****************************************************************/
PRIVATE struct
{
	struct
	{
	  STRING application[WRKSTRLEN];
	} title;
	COLOR standard_color[10];
} pvt;

/****************************************************************
*								*
*	Actual Declaration of Systemwide Public Variables.	*
*								*
*****************************************************************/
struct TUNA_PUBLICS pub;


/****************************************************************
*								*
*	Public Procedures.					*
*								*
*****************************************************************/
/****************************************************************
*								*
*	Vectored here by system on Program start.		*
*	Returns TRUE if OK, FALSE if fails.			*
*								*
*****************************************************************/
INT PASCAL WinMain(hInstance,hPrevInstance,lpszCmdLine,nCmdShow)
HANDLE hInstance;
HANDLE hPrevInstance;
LPSTR lpszCmdLine;
INT nCmdShow;
{
	MSG msg;

	pub.inst = hInstance;		/* save this instance locally */
	pub.previnst = hPrevInstance;	/* save previous instance locally */
	pub.state = nCmdShow;		/* save display state locally */

	if (!init_load_resources())
	  return (FALSE);

	if (!init_register_windows())
	  return (FALSE);

	if (!init_preset_local_vars())
	  return (FALSE);

	if (!init_create_main_window())
	  return (FALSE);

	if (!init_about_box(pub.inst,pub.previnst,pub.wnd.main))
	  return (FALSE);

	while (GetMessage(&msg,NULL,0,0))
	{
	  TranslateMessage(&msg);
	  DispatchMessage(&msg);
	}
	return (msg.wParam);
}

/****************************************************************
*								*
*	System vectors here on input to the Main window.	*
*								*
*****************************************************************/
LONG FAR PASCAL WndProc_tuna_main(hWnd,message,wParam,lParam)
HWND hWnd;
UNSIGNED message;
WORD wParam;
LONG lParam;
{
	BOOL processed_locally;

	processed_locally = TRUE;	/* guilty until proven innocent */
	switch (message)
	{
	  case (WM_COMMAND):	/* Menu command */
	  {
	    processed_locally = main_command(hWnd,message,wParam,lParam);
	    break;
	  }	/* end of case */
	  case (WM_SYSCOMMAND):	/* Ventilator command */
	  {
	    processed_locally = main_syscommand(hWnd,message,wParam,lParam);
	    break;
	  }	/* end of case */
	  default:
	  {
	    processed_locally = FALSE;		/* proven innocent */
	    break;
	  }	/* end of default case */
	}	/* end of switch */
	if (!processed_locally)
	  return (DefWindowProc(hWnd,message,wParam,lParam));
	else
	  return (0L);
}

/****************************************************************
*								*
*	Stop and Display a Debugging Message.			*
*								*
*****************************************************************/
VOID do_error(string)
POINTER string;
{
	MessageBox(pub.wnd.main,string,NULL,MB_OK | MB_ICONEXCLAMATION);
}

/****************************************************************
*								*
*	Private Procedures.					*
*								*
*****************************************************************/
/****************************************************************
*								*
*	Register Window Classes.				*
*								*
*****************************************************************/
PRIVATE BOOL init_register_windows()
{
	WNDCLASS class;

	LONG FAR PASCAL WndProc_tuna_main();

/* Main Window Class: */
	class.style = 		CS_HREDRAW | CS_VREDRAW;
	class.lpfnWndProc = 	WndProc_tuna_main;
	class.cbClsExtra = 	0;
	class.cbWndExtra = 	0;
	class.hInstance = 	pub.inst;
	class.hIcon = 		pub.icon.application;
	class.hCursor = 	pub.cursor.arrow;
	class.hbrBackground = 	pub.hBrush.White;
	class.lpszMenuName = 	MAKEINTRESOURCE(MENU_MAIN);
	class.lpszClassName = 	WNDNAME_MAIN;
	if (!RegisterClass(&class))
	{
	  return (FALSE);	/* registration failed */
	}
	return (TRUE);
}


/****************************************************************
*								*
*	Create the main window.					*
*								*
*****************************************************************/
PRIVATE BOOL init_create_main_window()
{
	STRING str[88];

	sprintf(str,"TUNA -- %s",PRGMOD);
	if ((pub.wnd.main = CreateWindow(
		WNDNAME_MAIN,		/* window class name */
		str,			/* window text/title */
		WNDSTYLE_MAIN,		/* window style */
		0,0,			/* location */
		0,0,			/* size */
		NULL,			/* parent window */
		NULL,			/* menu */
		pub.inst,		/* this instance */
		NULL			/* optional parameters */
		)) == NULL)
	{
	  return (FALSE);
	}
	ShowWindow(pub.wnd.main,pub.state);
	UpdateWindow(pub.wnd.main);
	return (TRUE);
}
/****************************************************************
*								*
*								*
*								*
*****************************************************************/
PRIVATE BOOL init_load_resources()
{
	pub.icon.application = LoadIcon(pub.inst,
			MAKEINTRESOURCE(ICON_APPLICATION));
	pub.cursor.arrow = 	LoadCursor(NULL,IDC_ARROW);
	pub.hBrush.White = 	GetStockObject(WHITE_BRUSH);

	return (TRUE);
}
/****************************************************************
*								*
*	Initialize any static local variables.			*
*								*
*****************************************************************/
PRIVATE BOOL init_preset_local_vars()
{
	WORD i;

	for (i = COLOR_SCROLLBAR; i < COLOR_CAPTIONTEXT + 1; i++)
	{
	  pvt.standard_color[i] = GetSysColor(i);
	}
	return (TRUE);
}


/****************************************************************
*								*
*	Process a user menu command.				*
*								*
*****************************************************************/
PRIVATE BOOL main_command(hWnd,message,wParam,lParam)
HWND hWnd;
UNSIGNED message;
WORD wParam;
LONG lParam;
{
	BOOL processed_locally;

	processed_locally = TRUE;	/* guilty until proven innocent */
	switch (wParam)
	{
	  case (CMD_COAP_MAIN_BG):
	  {
	    set_color_main_bg();
	    break;
	  }	/* end of case */
	  case (CMD_COSY_DESKTOP):
	  {
	    set_new_system_color(COLOR_BACKGROUND,STR_COSY_DESKTOP);
	    break;
	  }	/* end of case */
	  case (CMD_COSY_SCROLLBAR):
	  {
	    set_new_system_color(COLOR_SCROLLBAR,STR_COSY_SCROLLBAR);
	    break;
	  }	/* end of case */
	  case (CMD_COSY_ACTIVECAPTION):
	  {
	    set_new_system_color(COLOR_ACTIVECAPTION,STR_COSY_ACTIVECAPTION);
	    break;
	  }	/* end of case */
	  case (CMD_COSY_INACTIVECAPTION):
	  {
	    set_new_system_color(COLOR_INACTIVECAPTION,
				STR_COSY_INACTIVECAPTION);
	    break;
	  }	/* end of case */
	  case (CMD_COSY_MENU):
	  {
	    set_new_system_color(COLOR_MENU,STR_COSY_MENU);
	    break;
	  }	/* end of case */

/* This Procedure Continued on Next Page ... */

	  case (CMD_COSY_WINDOW):
	  {
	    set_new_system_color(COLOR_WINDOW,STR_COSY_WINDOW);
	    break;
	  }	/* end of case */
	  case (CMD_COSY_WINDOWFRAME):
	  {
	    set_new_system_color(COLOR_WINDOWFRAME,STR_COSY_WINDOWFRAME);
	    break;
	  }	/* end of case */
	  case (CMD_COSY_MENUTEXT):
	  {
	    set_new_system_color(COLOR_MENUTEXT,STR_COSY_MENUTEXT);
	    break;
	  }	/* end of case */
	  case (CMD_COSY_WINDOWTEXT):
	  {
	    set_new_system_color(COLOR_WINDOWTEXT,STR_COSY_WINDOWTEXT);
	    break;
	  }	/* end of case */
	  case (CMD_COSY_CAPTIONTEXT):
	  {
	    set_new_system_color(COLOR_CAPTIONTEXT,STR_COSY_CAPTIONTEXT);
	    break;
	  }	/* end of case */
	  default:
	  {
	    processed_locally = FALSE;		/* proven innocent */
	    break;
	  }	/* end of default case */
	}	/* end of switch */
	return (processed_locally);
}

/****************************************************************
*								*
*	Use Color Tuner to get and set a new system color.	*
*								*
*****************************************************************/
PRIVATE VOID set_new_system_color(index,stringid)
SWORD index;
WORD stringid;
{
	COLOR newcolor;
	STRING string[88];

	if (LoadString(pub.inst,stringid,string,88) == 0)
	  string[0] = EOS;
	newcolor = tune_color(
		pub.inst,
		pub.wnd.main,
		GetSysColor(index),
		pvt.standard_color[index],
		string);
	SetSysColors(1,&index,&newcolor);
}

/****************************************************************
*								*
*								*
*								*
*****************************************************************/
PRIVATE VOID set_color_main_bg()
{
	COLOR newcolor;
	HBRUSH handle;
	LOGBRUSH brush;
	STRING string[88];

	if (LoadString(pub.inst,STR_COAP_MAIN_BG,string,88) == 0)
	  string[0] = EOS;
	handle = GetClassWord(pub.wnd.main,GCW_HBRBACKGROUND);
	GetObject(handle,sizeof(LOGBRUSH),(LPSTR)&brush);
	newcolor = tune_color(
		pub.inst,
		pub.wnd.main,
		brush.lbColor,
		GetSysColor(COLOR_WINDOW),
		string);
	handle = CreateSolidBrush(newcolor);
	SetClassWord(pub.wnd.main,GCW_HBRBACKGROUND,handle);
	InvalidateRect(pub.wnd.main,NULL,TRUE);	/* entire window */
}


/****************************************************************
*								*
*	Process a ventilator command.				*
*								*
*****************************************************************/
PRIVATE BOOL main_syscommand(hWnd,message,wParam,lParam)
HWND hWnd;
UNSIGNED message;
WORD wParam;
LONG lParam;
{
	BOOL processed_locally;

	processed_locally = TRUE;	/* guilty until proven innocent */
	switch (wParam)
	{
	  case (SCMD_ABOUT):	/* About requested */
	  {
	    do_about_box(hWnd,message,wParam,lParam);
	    break;
	  }	/* end of case */
	  default:
	  {
	    processed_locally = FALSE;		/* proven innocent */
	    break;
	  }	/* end of default case */
	}	/* end of switch */
	return (processed_locally);
}
