#define MYLIB_BOOPSI

#ifndef INTUITION_GADGETCLASS_H
#include <intuition/gadgetclass.h>
#endif

#ifndef INTUITION_IMAGECLASS_H
#include <intuition/imageclass.h>
#endif

#include <proto/layers.h>

#include "xmris.h"
#include "ChangeUser.h"
#include "BOOPSILib.h"

#include "Catalog.h"

/************************************************************************/

struct Window *ChangeUserWindow;

/************************************************************************/

static Object *Contents;
static Object *String, *UseButton;

static struct TagItem WindowTags[]=
{
  {WA_Left, ~0},
  {WA_Top, ~0},
  {WA_Height, 0},
  {WA_Width, 0},
  {WA_CustomScreen, (ULONG)NULL},
  {WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_GADGETUP | IDCMP_ACTIVEWINDOW | IDCMP_NEWSIZE},
  {WA_MaxWidth, 0},
  {WA_MaxHeight, 0},
  {WA_MinWidth, 0},
  {WA_MinHeight, 0},
  {WA_Gadgets, NULL},
  {WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_SIMPLE_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP | WFLG_NEWLOOKMENUS | WFLG_NOCAREREFRESH},
  {TAG_DONE}
};

/************************************************************************/

void CloseChangeUserWindow(void)

{
  if (ChangeUserWindow!=NULL)
    {
      LockLayerInfo(ChangeUserWindow->WLayer->LayerInfo);
      WindowTags[0].ti_Data=ChangeUserWindow->LeftEdge;
      WindowTags[1].ti_Data=ChangeUserWindow->TopEdge;
      WindowTags[2].ti_Data=ChangeUserWindow->Height;
      WindowTags[3].ti_Data=ChangeUserWindow->Width;
      UnlockLayerInfo(ChangeUserWindow->WLayer->LayerInfo);
      CloseWindowSafely(ChangeUserWindow);
      ChangeUserWindow=NULL;
    }
  DisposeObject(Contents);
  Contents=NULL;
  FreeBOOPSIClasses();
}

/************************************************************************/

void OpenChangeUserWindow(void)

{
  if (ChangeUserWindow==NULL)
    {
      if (CreateBOOPSIClasses())
	{
	  char *UseLabel, *CancelLabel;

	  UseLabel=GetString(MSG_USE_BUTTON);
	  CancelLabel=GetString(MSG_CANCEL_BUTTON);
	  Contents=BOOPSILibO(Root),
		     BOOPSILibA_Group_Spacing, (1<<16)|1,

		     BOOPSILibA_Group_Child, BOOPSILibO(Frame),
		       IA_FrameType, FRAME_RIDGE,
		       BOOPSILibA_Frame_Gadget, String=BOOPSILibO(String),
		         STRINGA_MaxChars, sizeof(scoring.UserName),
		         STRINGA_TextVal, scoring.UserName,
		         GA_ID, MSG_GAME_USER_MENU,
		         BOOPSILibO_End,  /* String */
		       BOOPSILibO_End,  /* Frame */

		     BOOPSILibA_Group_Child, BOOPSILibO(Group),
		       BOOPSILibA_Group_Horizontal, TRUE,
		       BOOPSILibA_Group_SameSize, TRUE,

		       BOOPSILibA_Group_Child, BOOPSILibO(Frame),
		         IA_FrameType, FRAME_BUTTON,
		         BOOPSILibA_Frame_Space, (40<<8),
		         BOOPSILibA_Frame_Gadget, UseButton=BOOPSILibO(Button),
		           GA_Text, UseLabel+1,
		           BOOPSILibA_ControlChar, *UseLabel,
		           GA_ID, MSG_USE_BUTTON,
		           BOOPSILibO_End,  /* Button */
		         BOOPSILibO_End,  /* Frame */

		       BOOPSILibA_Group_Child, BOOPSILibO(Frame),
		         IA_FrameType, FRAME_BUTTON,
		         BOOPSILibA_Frame_Space, (40<<8),
		         BOOPSILibA_Frame_Gadget, BOOPSILibO(Button),
		           GA_Text, CancelLabel+1,
		           BOOPSILibA_ControlChar, *CancelLabel,
		           GA_ID, MSG_CANCEL_BUTTON,
		           BOOPSILibO_End,  /* Button */
		         BOOPSILibO_End,  /* Frame */

		       BOOPSILibO_End,  /* Group */
		     BOOPSILibO_End;  /* Group */

	  if (Contents!=NULL)
	    {
	      WindowTags[4].ti_Data=(ULONG)display.Screen->Screen;
	      WindowTags[5].ti_Tag=WA_IDCMP;
	      if (DoMethod(Contents,BOOPSILibM_Root_Init,WindowTags,20)==0)
		{
		  WindowTags[5].ti_Tag=TAG_IGNORE;
		  ChangeUserWindow=OpenWindowTags(NULL,
						  WA_ScreenTitle, display.window->ScreenTitle,
						  WA_Title, GetString(MSG_CHANGEUSER_TITLE),
						  TAG_MORE, WindowTags);
		  if (ChangeUserWindow!=NULL)
		    {
		      ChangeUserWindow->UserPort=&WindowPort;
		      if (ModifyIDCMP(ChangeUserWindow,WindowTags[5].ti_Data))
			{
			  ActivateGadget((struct Gadget *)String,ChangeUserWindow,NULL);
			  return;
			}
		    }
		}
	    }
	}
      CloseChangeUserWindow();
    }
  else
    {
      ShowWindow(ChangeUserWindow);
    }
}

/************************************************************************/

static int NormalizeUser(char *User)

{
  WORD Space;
  WORD i;
  int Changed;

  Changed=FALSE;
  Space=TRUE;
  for (i=0; User[i]!='\0'; i++)
    {
      if (User[i]==' ')
	{
	  if (Space)
	    {
	      int j;

	      for (j=i; (User[j]=User[j+1])!='\0'; j++)
		;
	      i--;
	      Changed=TRUE;
	    }
	  else
	    {
	      Space=TRUE;
	    }
	}
      else
	{
	  Space=FALSE;
	}
    }
  if (Space && i>0)
    {
      User[i-1]='\0';
      Changed=TRUE;
    }
  return Changed;
}

/************************************************************************/

static int NormalizeUserGadget(char *User)

{
  WORD Position;

  Position=RemoveGadget(ChangeUserWindow,(struct Gadget *)String);
  strcpy(User,(char *)AttrGet(String,STRINGA_TextVal));
  if (NormalizeUser(User))
    {
      SetAttrs((struct Gadget *)String,STRINGA_TextVal,User,TAG_DONE);
    }
  AddGadget(ChangeUserWindow,(struct Gadget *)String,Position);
  RefreshGList((struct Gadget *)String,ChangeUserWindow,NULL,1);
  return User[0]!='\0';
}

/************************************************************************/

void ProcessChangeUserWindow(struct IntuiMessage *Message)

{
  if ((Message=(struct IntuiMessage *)DoMethod(Contents,BOOPSILibM_Root_ProcessMessage,Message))!=NULL)
    {
      switch (Message->Class)
	{
	case IDCMP_GADGETUP:
	  {
	    switch (((struct ExtGadget *)Message->IAddress)->GadgetID)
	      {
	      case MSG_GAME_USER_MENU:
	      case MSG_USE_BUTTON:
		{
		  char User[80];

		  assert(sizeof(User)==sizeof(scoring.UserName));
		  if (NormalizeUserGadget(User))
		    {
		      GS_ReleaseScoreHandle(scoring.ScoreHandle);
		      scoring.ScoreHandle=NULL;
		      strcpy(scoring.UserName,User);
		      UpdateWindowTitle();
		      /* fall through */

		    case MSG_CANCEL_BUTTON:
		      DoMethod(Contents,BOOPSILibM_Root_ReplyMessage,Message);
		      CloseChangeUserWindow();
		      return;
		    }
		}
		ActivateGadget((struct Gadget *)String,ChangeUserWindow,NULL);
		break;
	      }
	  }
	  break;

	case IDCMP_CLOSEWINDOW:
	  DoMethod(Contents,BOOPSILibM_Root_ReplyMessage,Message);
	  CloseChangeUserWindow();
	  return;

	case IDCMP_ACTIVEWINDOW:
	case IDCMP_NEWSIZE:
	  ActivateGadget((struct Gadget *)String,ChangeUserWindow,NULL);
	  break;
	}
      DoMethod(Contents,BOOPSILibM_Root_ReplyMessage,Message);
    }
}
