/**********************************************************************
This file is part of Crack dot Com's free source code release of Golgotha.
for information about compiling & licensing issues visit this URL
 If that doesn't help, contact Jonathan Clark at 
  golgotha_source@usa.net (Subject should have "GOLG" in it) 
***********************************************************************/

#include "status/status.hh"

i4_status_create_function_type i4_stat_fun=0;

void i4_set_status_create_function(i4_status_create_function_type fun)
{
  i4_stat_fun=fun;
}

i4_idle_class *i4_idle_class::first=0;


i4_idle_class::i4_idle_class()
{
  next=first;
  first=this;
}

i4_idle_class::~i4_idle_class()
{
  if (first==this)
    first=first->next;
  else 
  {
    i4_idle_class *p=first;
    for (;p->next && p->next!=this; p=p->next);
    p->next=next;
  }
}



#ifdef _WINDOWS
#include 
#include 
#include "main/win_main.hh"
#include "string/string.hh"
#include "time/time.hh"

enum {MAX_UPDATES=50};

static int stat_y=40;

class win32_status_class : public i4_status_class
{
public:
  HWND hwndPB;    // handle of progress bar 
  i4_time_class start_time;
  int last_p;
  i4_bool win_created;
  i4_str *description;

  virtual i4_bool update(float percent)
  {
    i4_time_class now;
    if (now.milli_diff(start_time)>500)
    {
      start_time.get();

      if (!win_created)
      {      
        InitCommonControls(); 

        char buf[100];
        i4_os_string(*description, buf, 100);

        hwndPB = CreateWindowEx(0, PROGRESS_CLASS, buf, 
                                WS_BORDER | WS_VISIBLE, 50, stat_y,
                                500, 40,
                                0, (HMENU) 0, i4_win32_instance, NULL); 
 
 
        // Set the range and increment of the progress bar. 
        SendMessage(hwndPB, PBM_SETRANGE, 0, MAKELPARAM(0, MAX_UPDATES)); 
        SendMessage(hwndPB, PBM_SETSTEP, (WPARAM) 1, 0); 
        win_created=i4_T;
      }   
    }

    if (win_created)
    {
      int p=percent*MAX_UPDATES;
      while (last_p!=p)
      {
        last_p++;
        SendMessage(hwndPB, PBM_STEPIT, 0, 0); 
      }
    }

    return i4_T;
  }

  win32_status_class(const i4_const_str &d)
  {
    description=new i4_str(d);
    win_created=i4_F;
    last_p=0;
    stat_y+=60;
  }

  virtual ~win32_status_class()
  {
    delete description;

    if (win_created)
    {
      while (last_p!=MAX_UPDATES)
      {
        last_p++;
        SendMessage(hwndPB, PBM_STEPIT, 0, 0); 
      }

      DestroyWindow(hwndPB);     
    }

    stat_y-=60;

  }
};



// this is operating system dependant
i4_status_class *i4_create_status(const i4_const_str &description, int flags)
{
  if (i4_stat_fun)
    return i4_stat_fun(description, flags);
  else
  {
    return new win32_status_class(description);
  }
} 


#else


class i4_null_status_class : public i4_status_class
{
public:
  i4_bool update(float percent) 
  { 
    for (i4_idle_class *p=i4_idle_class::first; p;p=p->next)
      p->idle();
    return i4_T; 
  }
};


i4_status_class *i4_create_status(const i4_const_str &description, int flags)
{
  if (i4_stat_fun)
    return i4_stat_fun(description, flags);
  else
    return new i4_null_status_class;
}



#endif