// WinTool.c by Fredrik Söderberg
// Any questions, suggestions, anything, email me.
// ///S and ///E means fold, S for Start and E for End (GoldEd)

///S includes
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <intuition/IntuitionBase.h>
#include <libraries/gadtools.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <stdio.h>
#include <string.h>
///E

///S Defines for gadgets
#define TITLEG     1
#define WIDTHG     2
#define HEIGHTG    3
#define LEFTEDGEG  4
#define TOPEDGEG   5
#define MOUSEXG    6
#define MOUSEYG    7
#define CLOSEG     8
#define FORCEG     9
#define ZIPG      10
#define EXECUTEG  11
#define SAFEG     12
///E

///S Global
struct IntuitionBase *IntuitionBase;
struct Library *GadToolsBase;
struct Window *wtwin;

struct TextAttr topaz8 = {"topaz.font", 8, 0, 0};
struct Gadget *titleg, *widthg, *heightg, *topg, *leftg, *mxg, *myg, *closeg;
struct Gadget *forceg, *zipg, *executeg, *safeg;
struct Gadget *gadgetlist=NULL;
///E

///S prototypes
void killwin(struct Window *);
void executewin(struct Window *, int );
unsigned int getwinstat(struct Window *);
void eventloop(void);
struct Window *createwin(struct Screen *,struct VisualInfo *);
int main(void);
///E



///S main(void)
int main(void)
{
   struct Screen *wtscreen;
   struct VisualInfo *wtvi;
   
   if(IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 37L))
   {
      if(GadToolsBase = OpenLibrary("gadtools.library", 37L))
      {
         if(wtscreen = LockPubScreen(NULL))
         {
            if(wtvi = GetVisualInfo(wtscreen, TAG_END))
            {
               if(wtwin = createwin(wtscreen, wtvi))
               {
                  GT_RefreshWindow(wtwin, NULL);
                  eventloop();
                  CloseWindow(wtwin);
                  if(gadgetlist) FreeGadgets(gadgetlist);
               }
               else puts("Could not open buttons");
               FreeVisualInfo(wtvi);
            }
            else puts("Could not open VisualInfo");
            UnlockPubScreen(NULL, wtscreen);
         }
         else puts("Could not LockPubScreen");
         CloseLibrary(GadToolsBase);
      }
      else puts("Could not open gadtools.library V37");
   }
   else puts("Could not open intuition.library V37");

return 0;

}     
///E

///S executewin(win, title, tlen)
void executewin(struct Window *win, int tlen)
{
   LONG le=0, te=0, w=0, h=0;
   LONG czip=FALSE, cclear=FALSE, cforce=FALSE, csafe=FALSE;
   char *title;

   GT_GetGadgetAttrs(titleg, wtwin,NULL,
      GTST_String, &title, TAG_END);
   if(strlen(title)!=tlen)
      title[tlen]='\0';
   strcpy(win->Title, title);

   GT_GetGadgetAttrs(leftg, wtwin,NULL,
      GTIN_Number, &le, TAG_END);
   GT_GetGadgetAttrs(topg, wtwin,NULL,
      GTIN_Number, &te, TAG_END);
   GT_GetGadgetAttrs(widthg, wtwin,NULL,
      GTIN_Number, &w, TAG_END);
   GT_GetGadgetAttrs(heightg, wtwin,NULL,
      GTIN_Number, &h, TAG_END);
   GT_GetGadgetAttrs(zipg, wtwin,NULL,
      GTCB_Checked, &czip, TAG_END);
   GT_GetGadgetAttrs(closeg, wtwin,NULL,
      GTCB_Checked, &cclear, TAG_END);
   GT_GetGadgetAttrs(forceg, wtwin,NULL,
      GTCB_Checked, &cforce, TAG_END);
   GT_GetGadgetAttrs(safeg, wtwin,NULL,
      GTCB_Checked, &csafe, TAG_END);

   SetWindowTitles(win, win->Title, (UBYTE *) ~0);

   if(csafe)
   {
      win->MinWidth=1;
      win->MinHeight=1;
   }
   ChangeWindowBox(win, le, te, w, h);

   if(czip)
      ZipWindow(win);
   if(cclear)
      killwin(win);
   if(cforce)
      CloseWindow(win);
   getwinstat(win);
}
///E

///S getwinstat(win)
unsigned int getwinstat(struct Window *win)
{
   GT_SetGadgetAttrs(titleg, wtwin,NULL,
      GTST_String, win->Title, TAG_END);
   GT_SetGadgetAttrs(widthg, wtwin,NULL,
      GTIN_Number, win->Width, TAG_END);
   GT_SetGadgetAttrs(heightg, wtwin,NULL,
      GTIN_Number, win->Height, TAG_END);
   GT_SetGadgetAttrs(topg, wtwin,NULL,
      GTIN_Number, win->TopEdge, TAG_END);
   GT_SetGadgetAttrs(leftg, wtwin,NULL,
      GTIN_Number, win->LeftEdge, TAG_END);
   GT_SetGadgetAttrs(mxg, wtwin,NULL,
      GTIN_Number, win->MouseX, TAG_END);
   GT_SetGadgetAttrs(myg, wtwin,NULL,
      GTIN_Number, win->MouseY, TAG_END);
   return(strlen(win->Title));
}
///E

///S eventloop(void)
void eventloop(void)
{
   struct IntuiMessage *intmess;
   struct Gadget *gad;
   int going = TRUE, tlen=0;
   ULONG class, code;
   struct Window *win;

   win = wtwin;
   while(going)
   {
      WaitPort(wtwin->UserPort);
      while((intmess = GT_GetIMsg(wtwin->UserPort)) && going)
      {
         class = intmess->Class;
         code = intmess->Code;
         gad = (struct Gadget *) intmess->IAddress;
         GT_ReplyIMsg(intmess);
         switch(class)
         {
            case IDCMP_GADGETUP:
               if(gad->GadgetID == EXECUTEG)
               {
                  executewin(win, tlen);
                  tlen = getwinstat(win);
               }
               break;

            case IDCMP_INACTIVEWINDOW:
               {
                  win = IntuitionBase->ActiveWindow;
                  tlen = getwinstat(win);
               }
               break;

            case IDCMP_CLOSEWINDOW:
               going = FALSE;
               break;

            case VANILLAKEY:
               if(code==27)
                  going = FALSE;
               break;

            case IDCMP_REFRESHWINDOW:
               GT_BeginRefresh(wtwin);
               GT_EndRefresh(wtwin, TRUE);
               break;
         }
      }
   }
}
///E

///S win = createwin(screen, vi, gadgetlist)
struct Window *createwin(struct Screen *screen, struct VisualInfo *vi)
{
   struct NewGadget newgadget;
   struct Window *win;

   titleg = CreateContext(&gadgetlist);

   newgadget.ng_TextAttr = &topaz8;
   newgadget.ng_VisualInfo = vi;
   newgadget.ng_LeftEdge = 84;
   newgadget.ng_TopEdge = 15;
   newgadget.ng_Width = 250;
   newgadget.ng_Height = 12;
   newgadget.ng_GadgetText = "Title";
   newgadget.ng_GadgetID = TITLEG;
   newgadget.ng_Flags = 0;
   titleg = CreateGadget(STRING_KIND, titleg, &newgadget,
      GTST_MaxChars, 255, TAG_END);

   newgadget.ng_TopEdge += 15;
   newgadget.ng_Width = 40;
   newgadget.ng_GadgetText = "Width";
   newgadget.ng_GadgetID = WIDTHG;
   widthg = CreateGadget(INTEGER_KIND, titleg, &newgadget,
      TAG_END);

   newgadget.ng_TopEdge += 15;
   newgadget.ng_GadgetText = "Height";
   newgadget.ng_GadgetID = HEIGHTG;
   heightg = CreateGadget(INTEGER_KIND, widthg, &newgadget,
      TAG_END);

   newgadget.ng_TopEdge += 15;
   newgadget.ng_GadgetText = "LeftEdge";
   newgadget.ng_GadgetID = LEFTEDGEG;
   leftg = CreateGadget(INTEGER_KIND, heightg, &newgadget,
      TAG_END);

   newgadget.ng_TopEdge += 15;
   newgadget.ng_GadgetText = "TopEdge";
   newgadget.ng_GadgetID = TOPEDGEG;
   topg = CreateGadget(INTEGER_KIND, leftg, &newgadget,
      TAG_END);

   newgadget.ng_TopEdge += 15;
   newgadget.ng_GadgetText = "MouseX";
   newgadget.ng_GadgetID = MOUSEXG;
   mxg = CreateGadget(INTEGER_KIND, topg, &newgadget,
      TAG_END);

   newgadget.ng_LeftEdge += 120;
   newgadget.ng_GadgetText = "MouseY";
   newgadget.ng_GadgetID = MOUSEYG;
   myg = CreateGadget(INTEGER_KIND, mxg, &newgadget,
      TAG_END);

   newgadget.ng_LeftEdge = 245;
   newgadget.ng_TopEdge = 42;
   newgadget.ng_GadgetText = "Close Window";
   newgadget.ng_GadgetID = CLOSEG;
   closeg = CreateGadget(CHECKBOX_KIND, myg, &newgadget, TAG_END);

   newgadget.ng_LeftEdge += 35;
   newgadget.ng_Flags = PLACETEXT_ABOVE;
   newgadget.ng_GadgetText = "With Force";
   newgadget.ng_GadgetID = FORCEG;
   forceg = CreateGadget(CHECKBOX_KIND, closeg, &newgadget, TAG_END);

   newgadget.ng_LeftEdge = 245;
   newgadget.ng_TopEdge += 15;
   newgadget.ng_Flags = PLACETEXT_LEFT;
   newgadget.ng_GadgetText = "Zip Window";
   newgadget.ng_GadgetID = ZIPG;
   zipg = CreateGadget(CHECKBOX_KIND, forceg, &newgadget, TAG_END);

   newgadget.ng_LeftEdge = 280;
   newgadget.ng_TopEdge += 15;
   newgadget.ng_Flags = PLACETEXT_LEFT;
   newgadget.ng_GadgetText = "Remove size limits";
   newgadget.ng_GadgetID = SAFEG;
   safeg = CreateGadget(CHECKBOX_KIND, zipg, &newgadget, TAG_END);

   newgadget.ng_LeftEdge = 260;
   newgadget.ng_TopEdge = 90;
   newgadget.ng_Width = 100;
   newgadget.ng_Flags = PLACETEXT_IN;
   newgadget.ng_GadgetText = "Execute";
   newgadget.ng_GadgetID = EXECUTEG;
   executeg = CreateGadget(BUTTON_KIND, safeg, &newgadget, TAG_END);

   if(executeg)
   {
      if(!(win = OpenWindowTags(NULL,
         WA_Gadgets, gadgetlist,
         WA_Width, 380,
         WA_Height, 110,
         WA_DragBar, TRUE,
         WA_DepthGadget, TRUE,
         WA_CloseGadget, TRUE,
         WA_Activate, TRUE ,
         WA_IDCMP,    IDCMP_REFRESHWINDOW |
                      IDCMP_CLOSEWINDOW |
                      CHECKBOXIDCMP |
                      INACTIVEWINDOW |
                      VANILLAKEY,
         WA_PubScreen, screen,
         WA_Title, "WinTool",
         WA_ScreenTitle, "WinTool 1.11 by Fredrik Söderberg. (virus free:)",
         TAG_END)))
      {
         puts("Could not open window");
         FreeGadgets(gadgetlist);
         gadgetlist=FALSE;
         return(FALSE);
      }
   }
   else
      return(FALSE);
   return(win);
}
///E

///S killwin(win)
// Sends a IDCMP_CLOSEWINDOW to the window win
void killwin(struct Window *win)
{
   struct IntuiMessage msg;
   struct MsgPort *port;
   if(!(port = CreateMsgPort()))
   {
       Permit();
       return;
   }
   msg.ExecMessage.mn_Node.ln_Succ = NULL;
   msg.ExecMessage.mn_Node.ln_Pred = NULL;
   msg.ExecMessage.mn_Node.ln_Type = NT_MESSAGE;
   msg.ExecMessage.mn_Node.ln_Name = NULL;
   msg.ExecMessage.mn_Node.ln_Pri  = 0;
   msg.ExecMessage.mn_ReplyPort = port;
   msg.ExecMessage.mn_Length    = sizeof(struct IntuiMessage);
   msg.Class       = IDCMP_CLOSEWINDOW;
   msg.Code        = 0;
   msg.Qualifier   = 0;
   msg.IAddress    = NULL;
   msg.MouseX      = 0;
   msg.MouseY      = 0;
   msg.Seconds     = 0;
   msg.Micros      = 0;
   msg.IDCMPWindow = win;
   msg.SpecialLink = NULL;
   PutMsg(win->UserPort, (struct Message *)&msg);
   WaitPort(port);
   DeleteMsgPort(port);
}
///E
