/*======== Example Source-Code for an external Window-Checker =========

   (C) Copyright 1997 by Steger Georg.
   
       Created with MaxonCPP 4.0 Pro


Description:
ŻŻŻŻŻŻŻŻŻŻŻŻ
This Windowchecker uses a Routine very similiar to the
standard one of PowerWindows. It also replaces the Look
of the Iconify-Gadget. You will get a little nice Smiley!
It looks a little bit strange on Lowres-Screens, but hey,
this is only an Example!!

====================================================================*/


/* OS-Includes */

#include <intuition/intuition.h>
#include <intuition/imageclass.h>
#include <graphics/gfx.h>

// #pragma header

/* Compiler-Includes */

#include <pragma/intuition_lib.h>
#include <pragma/graphics_lib.h>
#include <pragma/exec_lib.h>
#include <string.h>

/* Program-Includes */

#include "/PWDevelopper.h"

/* Macros */

#define CWDRAWIMAGE_Msg	(((struct cwRenderIG *)msg)->DrawImageMsg)
#define IG_IMAGE 			(((struct cwRenderIG *)msg)->GadImage)
#define IG_RP				(((struct cwRenderIG *)msg)->DrawImageMsg->imp_RPort)
#define DRI_PENS			di->dri_Pens

/* Vars */

struct GfxBase *GfxBase;
struct IntuitionBase *IntuitionBase;

/* Program */

LONG CheckWindow(Msg msg)
{
	struct DrawInfo *di;
	struct Gadget *gad;

	WORD x1,y1,x2,y2,width,leftmost,state;
	BYTE IsInactive,IsSelected;

	switch (msg->MethodID)
	{

/*==========  CW_INIT  ===========================================*/

		case CW_INIT:
			GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",36);
			if (!GfxBase) return RIR_FAIL;
			return CWR_OK;

/*==========  CW_EXIT  ===========================================*/

		case CW_EXIT:
			if (GfxBase) CloseLibrary((struct Library *)GfxBase);
			return CWR_OK;

/*==========  CW_CHECK  ==========================================*/

		case CW_CHECK:
			gad=CWCHECK_Msg->Win->FirstGadget;
		
			x1=0;y1=0;width=0;leftmost=1;
			while (gad)
			{
				x1++;
				if (gad->GadgetType&GTYP_SYSTYPEMASK)
				{
					if (!y1) y1=x1;
				}
				
				if ((gad->TopEdge==0) && (gad->Flags&GFLG_RELRIGHT) && (!(gad->Flags&(GFLG_RELWIDTH|GFLG_RELHEIGHT|GFLG_RELBOTTOM))))
				{
					if (((gad->GadgetType&GTYP_SYSTYPEMASK)==GTYP_WDEPTH) ||
					    ((gad->GadgetType&GTYP_SYSTYPEMASK)==GTYP_WZOOM))
					{
						width=gad->Width;
					}
					if (gad->LeftEdge<leftmost)
					{
						leftmost=gad->LeftEdge;
					}
				}
				gad=gad->NextGadget;
			}
		
			if (!width)
				width=24;

			CWCHECK_Msg->Gad_LeftEdge=leftmost-width+1;
			CWCHECK_Msg->Gad_TopEdge=0;
			CWCHECK_Msg->Gad_Width=width;
			CWCHECK_Msg->Gad_Height=CWCHECK_Msg->Win->BorderTop;
			CWCHECK_Msg->Gad_Flags=GFLG_RELRIGHT;
			CWCHECK_Msg->Gad_Position=y1;
			return CWR_OK|CWR_ICONIFYGAD|CWR_ICONIFYPOS;

/*==========  CW_RENDERIG  =======================================*/

		case CW_RENDERIG:
			if ((di=CWRENDERIG_Msg->DrawImageMsg->imp_DrInfo))
			{
				x1=CWDRAWIMAGE_Msg->imp_Offset.X+IG_IMAGE->LeftEdge;
				y1=CWDRAWIMAGE_Msg->imp_Offset.Y+IG_IMAGE->TopEdge;
				x2=x1-1+(CWDRAWIMAGE_Msg->MethodID==IM_DRAW ? IG_IMAGE->Width : CWDRAWIMAGE_Msg->imp_Dimensions.Width);
				y2=y1-1+(CWDRAWIMAGE_Msg->MethodID==IM_DRAW ? IG_IMAGE->Height : CWDRAWIMAGE_Msg->imp_Dimensions.Height);
				
				state=CWDRAWIMAGE_Msg->imp_State;
				
				IsInactive=((state==IDS_INACTIVENORMAL) || (state==IDS_INACTIVESELECTED) || (state==IDS_INACTIVEDISABLED));
				IsSelected=((state==IDS_SELECTED) || (state==IDS_INACTIVESELECTED) || (state==IDS_SELECTEDDISABLED));
	
				/* Standard Frame */

				SetAPen(IG_RP,DRI_PENS[IsInactive ? BACKGROUNDPEN : FILLPEN]);
				RectFill(IG_RP,x1+2,y1+1,x2-1,y2-1);
				SetAPen(IG_RP,DRI_PENS[SHADOWPEN]);
				RectFill(IG_RP,x1,y1+1,x1,y2-1);
			
				SetAPen(IG_RP,DRI_PENS[IsSelected ? SHADOWPEN : SHINEPEN]);
				RectFill(IG_RP,x1+1,y1,x1+1,y2-1);
				RectFill(IG_RP,x1,y1,x2,y1);
				SetAPen(IG_RP,DRI_PENS[IsSelected ? SHINEPEN : SHADOWPEN]);
				RectFill(IG_RP,x2,y1+1,x2,y2);
				RectFill(IG_RP,x1+1,y2,x2-1,y2);

				/* let's draw a Smiley!! */
				
				SetAPen(IG_RP,DRI_PENS[SHADOWPEN]);
				RectFill(IG_RP,x1+5,y1+3,x1+9,y1+7);
				RectFill(IG_RP,x2-8,y1+3,x2-4,y1+7);
				
				SetAPen(IG_RP,DRI_PENS[IsInactive ? BACKGROUNDPEN : SHINEPEN]);
				
				RectFill(IG_RP,x1+6,y1+5-(IsSelected ? 0 : 1),x1+8,y1+6);
				RectFill(IG_RP,x2-7,y1+5-(IsSelected ? 0 : 1),x2-5,y1+6);
				
				SetAPen(IG_RP,DRI_PENS[SHADOWPEN]);
				WritePixel(IG_RP,x1+7,y1+5);
				WritePixel(IG_RP,x2-6,y1+5);
				if (IsSelected)
				{
					RectFill(IG_RP,x1+8,y2-5,x2-7,y2-3);
					SetAPen(IG_RP,DRI_PENS[IsInactive ? BACKGROUNDPEN : SHINEPEN]);
					RectFill(IG_RP,x1+9,y2-4,x2-8,y2-4);
				} else {
					RectFill(IG_RP,x1+8,y2-5,x2-7,y2-3);
					RectFill(IG_RP,x1+6,y2-6,x1+9,y2-4);
					RectFill(IG_RP,x2-8,y2-6,x2-5,y2-4);
					SetAPen(IG_RP,DRI_PENS[IsInactive ? BACKGROUNDPEN : SHINEPEN]);
					RectFill(IG_RP,x1+9,y2-4,x2-8,y2-4);
					RectFill(IG_RP,x1+7,y2-5,x1+8,y2-5);
					RectFill(IG_RP,x2-7,y2-5,x2-6,y2-5);
				}
			}

			return CWR_OK;
			
/*==========  default  ===========================================*/

		default:
			return CWR_FAIL;
	}
}

