/*======== Example Source-Code for an external Icon-Renderer =========

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


Description:
ŻŻŻŻŻŻŻŻŻŻŻŻ
This IconRenderer does a very simple Rendering. But it also shows
you how to use the UserData in riInitIcon, riRenderIcon and
riExitIcon. When you iconify a Window opened by the "Workbench"
Task it will look a little bit different. Try it out!

NOTE: This IconRenderer does not support the method RI_REFRESHITITLE
      (refreshing of the icon title)
      
====================================================================*/


/* OS-Includes */

#include <intuition/intuition.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"


/* Vars */

struct GfxBase *GfxBase;
struct IntuitionBase *IntuitionBase;

static struct TextExtent MyTE;
static STRPTR title;
static WORD   a,b,c,slen,x1,y1,x2,y2;

/* Program */

void DrawRect(struct Window *win, struct RastPort *rp,WORD col)
{
	SetAPen(rp,col);
	RectFill(rp,0,0,win->Width-1,0);
	RectFill(rp,win->Width-1,1,win->Width-1,win->Height-1);
	RectFill(rp,0,win->Height-1,win->Width-2,win->Height-1);
	RectFill(rp,0,1,0,win->Height-2);
}

ULONG Icon_INIT(struct riInit *msg)
{
	ULONG rc=RIR_OK;

	GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",36);
	IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",36);

	if ((!GfxBase) || (!IntuitionBase))
	{
		if (GfxBase) CloseLibrary((struct Library *)GfxBase);
		if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
		rc=RIR_FAIL;
	}
	return rc;
}

ULONG Icon_EXIT(struct riExit *msg)
{
	if (GfxBase) CloseLibrary((struct Library *)GfxBase);
	if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
	return RIR_OK;
}

ULONG Icon_INITICON(struct riInitIcon *msg)
{
	if (msg->WinTask)
	{
		if (strcmp(msg->WinTask->tc_Node.ln_Name,"Workbench")==0)
		{
			msg->UserData=(APTR)1;
		}
	}
	return RIR_OK;
}

ULONG Icon_EXITICON(struct riExitIcon *msg)
{
	return RIR_OK;
}

ULONG Icon_RENDERICON(struct riRenderIcon *msg)
{
	struct DrawInfo *di;
	struct Window *IconWin;
	struct RastPort *rp;
	struct Gadget *gad;
	ULONG rc=RIR_FAIL;

	IconWin=msg->Icon;
	rp=IconWin->RPort;
	di=GetScreenDrawInfo(IconWin->WScreen);
	if (di)
	{
		rc=RIR_OK;
		
		DrawRect(IconWin,rp,di->dri_Pens[SHADOWPEN]);
		SetAPen(rp,di->dri_Pens[SHINEPEN]);
		RectFill(rp,1,1,IconWin->Width-2,IconWin->Height-2);
		title=msg->ParentWin->Title;
		if (title)
		{
			a=rp->TxBaseline+(IconWin->Height - rp->TxHeight + 1) / 2;
			b=TextFit(rp,title,strlen(title),&MyTE,0,1,IconWin->Width-4,IconWin->Height);
			
			while (b && (title[b-1]==' ')) b--;
	
			c=(IconWin->Width - TextLength(rp,title,b))/2;
	
			SetAPen(rp,di->dri_Pens[SHADOWPEN]);
			SetDrMd(rp,JAM1);
	
			Move(rp,c+1,a+1);
			Text(rp,title,b);				
		}
		
		if (msg->UserData == (APTR) 1 )
		{
			SetAPen(rp,di->dri_Pens[SHADOWPEN]);
			RectFill(rp,2,2,IconWin->Width-1-2,2);
			RectFill(rp,2,IconWin->Height-1-2,IconWin->Width-1-2,IconWin->Height-1-2);
		}
	
		/* Let's check if there's any Close/Depth-Gadget */
		
		gad=IconWin->FirstGadget;
		while (gad)
		{
			x1=gad->LeftEdge;if (gad->Flags&GFLG_RELRIGHT) x1+=(IconWin->Width-1);
			y1=gad->TopEdge;if (gad->Flags&GFLG_RELBOTTOM) y1+=(IconWin->Height-1);
			x2=x1+gad->Width-1;if (gad->Flags&GFLG_RELWIDTH) x2+=(IconWin->Width);
			y2=y1+gad->Height-1;if (gad->Flags&GFLG_RELHEIGHT) y2+=(IconWin->Height);
	
			if ((gad->GadgetType&GTYP_SYSTYPEMASK)==GTYP_CLOSE)	/* Close-Gadget found! */
			{
				SetAPen(rp,di->dri_Pens[SHADOWPEN]);
				RectFill(rp,x1,y1,x2,y2);
				SetAPen(rp,di->dri_Pens[SHINEPEN]);
				RectFill(rp,x1+1,y1+1,x2-1,y2-1);
				SetAPen(rp,di->dri_Pens[SHADOWPEN]);
				RectFill(rp,x1+5,y1+3,x2-5,y2-3);
			} else if (gad->GadgetID==GID_WDEPTH)						/* Depth-Gadget found! */
			{
				SetAPen(rp,di->dri_Pens[SHADOWPEN]);
				RectFill(rp,x1,y1,x2,y2);
				SetAPen(rp,di->dri_Pens[SHINEPEN]);
				RectFill(rp,x1+1,y1+1,x2-1,y2-1);
				SetAPen(rp,di->dri_Pens[SHADOWPEN]);
				RectFill(rp,x1+3,y1+3,x1+7,y1+6);
				RectFill(rp,x1+4,y1+4,x1+8,y1+7);
				SetAPen(rp,di->dri_Pens[SHINEPEN]);
				RectFill(rp,x1+5,y1+5,x1+7,y1+6);
			}
			gad=gad->NextGadget;
		}
		FreeScreenDrawInfo(IconWin->WScreen,di);
	} // if (di)
	
	return rc;
	
}

ULONG Icon_REFRESHIFRAME(struct riRefreshIFrame *msg)
{
	struct Window *IconWin;
	struct DrawInfo *di;

	IconWin=msg->Icon;
	if ((di=GetScreenDrawInfo(IconWin->WScreen)))
	{
		DrawRect(IconWin,IconWin->RPort,di->dri_Pens[SHADOWPEN]);
		FreeScreenDrawInfo(IconWin->WScreen,di);
	}
	return RIR_OK;
}

ULONG Icon_RENDERFRAME(struct riRenderFrame *msg)
{
	struct Window *IconWin;
	struct RastPort *rp;
	struct DrawInfo *di;

	IconWin=msg->Icon;
	rp=msg->rp;
	if ((di=GetScreenDrawInfo(IconWin->WScreen)))
	{
		DrawRect(IconWin,rp,di->dri_Pens[SHADOWPEN]);
		FreeScreenDrawInfo(IconWin->WScreen,di);
	}
	return RIR_OK;
}

ULONG Icon_RENDERFRAMESEL(struct riRenderFrameSel *msg)
{
	struct Window *IconWin;
	struct RastPort *rp;
	struct DrawInfo *di;

	IconWin=msg->Icon;
	rp=msg->rp;
	if ((di=GetScreenDrawInfo(IconWin->WScreen)))
	{
		DrawRect(IconWin,rp,di->dri_Pens[FILLPEN]);
		FreeScreenDrawInfo(IconWin->WScreen,di);
	}
	return RIR_OK;

}


/************* ENTRY **************/

LONG RenderIcon(Msg msg)
{
	ULONG rc=RIR_FAIL;
	
	switch (msg->MethodID)
	{

		case RI_INIT:
			rc=Icon_INIT((struct riInit *)msg);
			break;
			
		case RI_EXIT:
			rc=Icon_EXIT((struct riExit *)msg);
			break;
			
		case RI_INITICON:
			rc=Icon_INITICON((struct riInitIcon *)msg);
			break;

		case RI_EXITICON:
			rc=Icon_EXITICON((struct riExitIcon *)msg);
			break;
			
		case RI_REFRESHIFRAME:
			rc=Icon_REFRESHIFRAME((struct riRefreshIFrame *)msg);
			break;
			
		case RI_RENDERICON:
			rc=Icon_RENDERICON((struct riRenderIcon *)msg);
			break;
			
		case RI_RENDERFRAME:
			rc=Icon_RENDERFRAME((struct riRenderFrame *)msg);
			break;
			
		case RI_RENDERFRAMESEL:
			rc=Icon_RENDERFRAMESEL((struct riRenderFrameSel *)msg);
			break;
			
	}
	return rc;
}


