#include <exec/types.h>

#include <string.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/gadtools.h>
#include <proto/intuition.h>
#include <proto/icon.h>
#include <proto/graphics.h>
#include <proto/wb.h>
#include <proto/commodities.h>
#include <proto/diskfont.h>
#include <proto/graphics.h>
#include <proto/utility.h>
#include <intuition/gadgetclass.h> /* PGA_Freedom */

#include "WBStartupPlusPrefs_Cat.h"

int GetPriority(int pri, UWORD x, UWORD y)
{
  ULONG signals;
  ULONG winsigflag;
  BOOL LOOP;
  struct IntuiMessage *winmsg;
  struct Window *win;
  struct Screen *scr;
  struct VisualInfo *vi;
  struct Gadget *gad;
  struct Gadget *glist=NULL;
  struct NewGadget ng;
  ULONG winheight,winwidth;

  if (scr=LockPubScreen(NULL))
  {
    if (vi=GetVisualInfo(scr,TAG_END))
    {
      winheight = scr->WBorTop + (2 * scr->Font->ta_YSize) + 1 + scr->WBorBottom + 8;
      winwidth  = (2 * TextLength(&scr->RastPort,GetString(STRPriority),strlen(GetString(STRPriority)))) + 40; /* 40 is for the close and depth gadgets */
      if (win = OpenWindowTags(NULL,
          WA_Left,   x - (winwidth/2),
          WA_Top,    y - (winheight/2),
          WA_Width, winwidth,
          WA_Height, winheight,
          WA_AutoAdjust, TRUE,
          WA_Gadgets, glist,
          WA_IDCMP,  IDCMP_REFRESHWINDOW | IDCMP_CLOSEWINDOW | IDCMP_ACTIVEWINDOW | IDCMP_GADGETUP | SLIDERIDCMP,
          WA_Flags,  WFLG_CLOSEGADGET | WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_SMART_REFRESH | WFLG_ACTIVATE,
          WA_Title,  GetString(STRPriority),
          WA_PubScreen, scr,
          TAG_END))
      {
        gad = CreateContext(&glist);

        ng.ng_LeftEdge = win->BorderLeft+2;
        ng.ng_TopEdge = win->BorderTop+2;
        ng.ng_Width = win->Width-win->BorderRight-win->BorderLeft-ng.ng_LeftEdge-2-(TextLength(&scr->RastPort," -000",5));
        ng.ng_Height = scr->Font->ta_YSize + 4;
        ng.ng_GadgetText = NULL;
        ng.ng_TextAttr = NULL;//win->WScreen->Font;
        ng.ng_VisualInfo = vi;
        ng.ng_GadgetID = 0;
        ng.ng_Flags = 0;

        gad = CreateGadget(SLIDER_KIND,gad,&ng,
          GTSL_Min, -128,
          GTSL_Max, 127,
          GTSL_Level, pri,
          PGA_Freedom, LORIENT_HORIZ,
          GTSL_LevelFormat, "%ld",
          GTSL_LevelPlace, PLACETEXT_RIGHT,
          GTSL_MaxLevelLen, 4,
          TAG_DONE);

        if (gad)
        {
          winsigflag = 1L<<win->UserPort->mp_SigBit;
          AddGList(win, glist, (UWORD)~0, -1, NULL);
          RefreshGList(glist,win,NULL,-1);
          GT_RefreshWindow(win,NULL);

          LOOP=TRUE;
          while (LOOP)
          {
            signals=Wait(SIGBREAKF_CTRL_C | winsigflag);

            if (signals & SIGBREAKF_CTRL_C)
              LOOP=FALSE;

            if (signals & winsigflag)
            {
              while (winmsg = (struct IntuiMessage *)GT_GetIMsg((struct MsgPort *)win->UserPort))
              {
                switch(winmsg->Class)
                {
//                  case IDCMP_GADGETUP:
//                    LOOP=FALSE;
//                    break;
                  case IDCMP_REFRESHWINDOW:
                    BeginRefresh(win);
                    EndRefresh(win, TRUE);
                    break;
                  case IDCMP_CLOSEWINDOW:
                    LOOP=FALSE;
                    break;
                }
                GT_ReplyIMsg(winmsg);
              }
            }  /* End of process window events */
          }   /* End of while (LOOP) */

          GT_GetGadgetAttrs(gad,win,NULL,GTSL_Level,&pri);
          if (pri > 127)
            pri=127;
          if (pri < -128)
            pri=-128;

          RemoveGList(win,glist,-1);
        }
        FreeGadgets(glist);
        CloseWindow(win);
      }  /* End of if (OpenWindowTags()) */
      FreeVisualInfo(vi);
    }
    UnlockPubScreen(NULL,scr);
  }
  return(pri);
}
