/* proggresbar window */

#include <intuition/screens.h>
#include <stdio.h>

#include "proggressbar.h"

ProggresWindow::ProggresWindow(char *fmttext, char *wintitle, char *scrtitle)
  {
    DrawInfo *dri;
    Screen *wbscr;
    long fontsize, stringlen;
    long errnum = 0;
    long inw, inh;

    msgtext = fmttext;

    if (wbscr = LockPubScreen(NULL))
      {
        dri = GetScreenDrawInfo(wbscr);
        fontsize = dri->dri_Font->tf_YSize;
        spc = fontsize / 3;
        stringlen = TextLength(&wbscr->RastPort, fmttext, strlen(fmttext));
        inw = (stringlen + spc + 1) * 2;
        inh = fontsize + 2 + spc * 4;

        if (win = OpenWindowTags(NULL,
          WA_Left, (wbscr->Width - inw - wbscr->WBorLeft - wbscr->WBorRight) / 2,
          WA_Top, (wbscr->Height - inh - wbscr->WBorTop - wbscr->WBorBottom - fontsize) / 2,
          WA_InnerWidth, inw,
          WA_InnerHeight, inh,
          WA_DragBar, TRUE,
//          WA_CloseGadget, TRUE,
          WA_DepthGadget, TRUE,
          WA_SmartRefresh, TRUE,
          WA_Title, (long)wintitle,
          WA_ScreenTitle, (long)scrtitle,
          TAG_END))
          {
            rp = win->RPort;
            SetFont(rp, dri->dri_Font);
            rminx = win->BorderLeft + spc + 1;
            rmaxx = win->Width - win->BorderRight - spc - 1;
            rminy = win->BorderTop + spc + 1;
            rmaxy = win->Height - win->BorderBottom - spc - 1;
            rectpen = dri->dri_Pens[FILLPEN];
            textpen = dri->dri_Pens[SHINEPEN];
            bgpen = dri->dri_Pens[BACKGROUNDPEN];
            SetAPen(rp, dri->dri_Pens[SHINEPEN]);
            Move(rp, rminx - 1, rmaxy + 1);
            Draw(rp, rmaxx + 1, rmaxy + 1);
            Draw(rp, rmaxx + 1, rminy - 1);
            SetAPen(rp, dri->dri_Pens[SHADOWPEN]);
            Draw(rp, rminx - 1, rminy - 1);
            Draw(rp, rminx - 1, rmaxy + 1);
          }
        else errnum = ERROR_WINDOW_OPEN;
        FreeScreenDrawInfo(wbscr, dri);
        UnlockPubScreen(NULL, wbscr);
      }
    else errnum = ERROR_SCREEN_LOCK;

    if (errnum) throw SysErr(errnum);
  }

//-----------------------------------------------------------------------------------------------

void ProggresWindow::update(long current, long max, long txtparam)
  {
    long strwidth, xdelta, xsize = rmaxx - rminx + 1;
    char msg[96];

    xdelta = xsize * current / max;

    if (xdelta)
      {
        SetAPen(rp, rectpen);
        RectFill(rp, rminx, rminy, rminx + xdelta - 1, rmaxy);
      }

    if (xdelta < xsize)
      {
        SetAPen(rp, bgpen);
        RectFill(rp, rminx + xdelta + 1, rminy, rmaxx, rmaxy);
      }

    sprintf(msg, msgtext, txtparam);
    strwidth = TextLength(rp, msg, strlen(msg));
    SetAPen(rp, textpen);
    SetDrMd(rp, JAM1);
    Move(rp, rminx + (xsize - strwidth) / 2, rminy + spc + rp->Font->tf_Baseline);
    Text(rp, msg, strlen(msg));
  }


//-----------------------------------------------------------------------------------------------

ProggresWindow::~ProggresWindow()
  {
    CloseWindow(win);
  }
