/* monitor.c */

#include "common.h"

#include "monitor.h"

typedef enum {
  monitor_WINDOW = 4,
  monitor_ICON,
  monitor_XMIN,
  monitor_YMIN,
  monitor_XMAX,
  monitor_YMAX,
  monitor_SIZE
} monitor_icons;

BOOL monitor_isactive;
BOOL monitor_moved = FALSE;
static BOOL monitor_isopen;

static window_handle monitor_window;

browser_winentry *monitor_winentry;

static int monitor_numactive;

static icon_handle monitor_lasticon = event_ANY;

BOOL monitor_close(event_pollblock *event,void *reference);

void monitor_init()
{
  window_block *templat;

  templat = templates_load("Monitor",0,0,0,0);
  Error_CheckFatal(Wimp_CreateWindow(templat,&monitor_window));
  free(templat);

  Event_Claim(event_OPEN,monitor_window,event_ANY,Handler_OpenWindow,0);
  Event_Claim(event_CLOSE,monitor_window,event_ANY,monitor_close,0);
  help_claim_window(monitor_window,"MON");

  monitor_numactive = 0;
  monitor_isactive = FALSE;
  monitor_isopen = FALSE;
}

void monitor_open()
{
  window_state wstate;
/*
  wimp_point size;

  Screen_CacheModeInfo();
*/
  Wimp_GetWindowState(monitor_window,&wstate);
/*
  if (!wstate.flags.data.open)
  {
    size.x = wstate.openblock.screenrect.max.x -
    	 wstate.openblock.screenrect.min.x;
    size.y = wstate.openblock.screenrect.max.y -
    	 wstate.openblock.screenrect.min.y;
    wstate.openblock.screenrect.min.x = screen_size.x - size.x;
    wstate.openblock.screenrect.min.y = screen_size.y - size.y;
    wstate.openblock.screenrect.max.x = screen_size.x;
    wstate.openblock.screenrect.max.y = screen_size.y;
  }
*/
  wstate.openblock.behind = -1;
  Wimp_OpenWindow(&wstate.openblock);
  monitor_isopen = TRUE;
}

BOOL monitor_close(event_pollblock *event,void *reference)
{
  Wimp_CloseWindow(monitor_window);
  monitor_isopen = FALSE;
  if (monitor_isactive)
    monitor_deactivate(event,monitor_winentry);
  return TRUE;
}

void monitor_activeinc()
{
  monitor_numactive++;
  monitor_open();
}

void monitor_activedec()
{
  if (--monitor_numactive <= 0)
  {
    monitor_numactive = 0;
    monitor_close(0,0);
  }
}

BOOL monitor_activate(event_pollblock *event,void *reference)
{
  monitor_winentry = reference;
  if (monitor_isopen)
  {
    char buffer[16];

    Event_Claim(event_NULL,event_ANY,event_ANY,monitor_update,reference);
    strcpycr(buffer,monitor_winentry->identifier);
    if (monitor_winentry->status == status_EDITING)
      strcat(buffer," *");
    Icon_SetText(monitor_window,monitor_WINDOW,buffer);
    monitor_isactive = TRUE;
  }
  return TRUE;
}

BOOL monitor_deactivate(event_pollblock *event,void *reference)
{
  if (monitor_isactive)
  {
    Event_Release(event_NULL,event_ANY,event_ANY,monitor_update,reference);
    monitor_isactive = FALSE;
    Icon_SetText(monitor_window,monitor_WINDOW,"");
    Icon_SetText(monitor_window,monitor_ICON,"");
    Icon_SetText(monitor_window,monitor_XMIN,"");
    Icon_SetText(monitor_window,monitor_YMIN,"");
    Icon_SetText(monitor_window,monitor_XMAX,"");
    Icon_SetText(monitor_window,monitor_YMAX,"");
    Icon_SetText(monitor_window,monitor_SIZE,"");
  }
  monitor_lasticon = event_ANY;
  return TRUE;
}

BOOL monitor_update(event_pollblock *event,void *reference)
{
  mouse_block ptrinfo;
  browser_winentry *winentry = reference;
  char buffer[16];
  wimp_point size;

  Wimp_GetPointerInfo(&ptrinfo);

  if (ptrinfo.window == winentry->handle &&
      (ptrinfo.icon != monitor_lasticon || monitor_moved))
  {
    monitor_moved = FALSE;
    if (ptrinfo.icon == -1) /* Show dimensions of visible part of WA */
    {
      size.x = winentry->window->window.screenrect.max.x -
      	       winentry->window->window.screenrect.min.x;
      size.y = winentry->window->window.screenrect.max.y -
      	       winentry->window->window.screenrect.min.y;
      MsgTrans_Lookup(messages,"WorkArea",buffer,16);
      Icon_SetText(monitor_window,monitor_ICON,buffer);
      Icon_SetInteger(monitor_window,monitor_XMIN,
      		      winentry->window->window.workarearect.min.x +
      		      winentry->window->window.scroll.x);
      Icon_SetInteger(monitor_window,monitor_YMIN,
      		      winentry->window->window.workarearect.max.y +
      		      winentry->window->window.scroll.y - size.y);
      Icon_SetInteger(monitor_window,monitor_XMAX,
      		      winentry->window->window.workarearect.min.x +
      		      winentry->window->window.scroll.x + size.x);
      Icon_SetInteger(monitor_window,monitor_YMAX,
      		      winentry->window->window.workarearect.max.y +
      		      winentry->window->window.scroll.y);
      sprintf(buffer,"%d x %d",size.x,size.y);
      Icon_SetText(monitor_window,monitor_SIZE,buffer);
    }
    else
    {
      Icon_SetInteger(monitor_window,monitor_ICON,ptrinfo.icon);
      Icon_SetInteger(monitor_window,monitor_XMIN,
      		      winentry->window->icon[ptrinfo.icon].workarearect.min.x);
      Icon_SetInteger(monitor_window,monitor_YMIN,
      		      winentry->window->icon[ptrinfo.icon].workarearect.min.y);
      Icon_SetInteger(monitor_window,monitor_XMAX,
      		      winentry->window->icon[ptrinfo.icon].workarearect.max.x);
      Icon_SetInteger(monitor_window,monitor_YMAX,
      		      winentry->window->icon[ptrinfo.icon].workarearect.max.y);
      sprintf(buffer,"%d x %d",
      	      winentry->window->icon[ptrinfo.icon].workarearect.max.x -
      	      winentry->window->icon[ptrinfo.icon].workarearect.min.x,
      	      winentry->window->icon[ptrinfo.icon].workarearect.max.y -
      	      winentry->window->icon[ptrinfo.icon].workarearect.min.y);
      Icon_SetText(monitor_window,monitor_SIZE,buffer);
    }
    monitor_lasticon = ptrinfo.icon;
  }

  return FALSE;
}
