/* windiag.c */

#include "common.h"

#include "diagutils.h"
#include "title.h"
#include "usersprt.h"
#include "viewex.h"
#include "windiag.h"

typedef enum {
  windiag_UPDATE,
  windiag_CANCEL,
  windiag_NOSCROLL = 11,
  windiag_BACK,
  windiag_CLOSE,
  windiag_TITLE,
  windiag_TOGGLE,
  windiag_VSCROLL,
  windiag_ADJUST,
  windiag_HSCROLL,
  windiag_SCROLLDEBOUNCED,
  windiag_SCROLLAUTOREPEAT,
  windiag_MOVEABLE,
  windiag_AUTOREDRAW,
  windiag_PANE,
  windiag_BACKDROP,
  windiag_HOTKEYS,
  windiag_NOBOUNDS,
  windiag_CONFINE,
  windiag_IGNORERIGHT,
  windiag_IGNOREBOTTOM,
  windiag_BUTTONTYPE,
  windiag_WIMPSPRITES = 32,
  windiag_USERSPRITES,
  wincolour_TITLEFORE = 34,
  wincolour_TITLEBACK = 38,
  wincolour_WORKFORE = 42,
  wincolour_WORKBACK = 46,
  wincolour_SCROLLOUTER = 50,
  wincolour_SCROLLINNER = 54,
  wincolour_FOCUS = 58,
  wincolour_DEFAULT = 62,
  wincolour_GCOL,
  windiag_FURNITURE = 72
} windiag_icons;

/* Handlers for window */
BOOL windiag_OpenWindow(event_pollblock *event,void *reference);
BOOL windiag_CloseWindow(event_pollblock *event,void *reference);
/* Update icon clicked */
BOOL windiag_update(event_pollblock *event,void *reference);
BOOL windiag_cancel(event_pollblock *event,void *reference);
/* Shade some options depending on state of others */
BOOL windiag_optionclick(event_pollblock *event,void *reference);
/* Make window colours default */
BOOL windiag_clickdefault(event_pollblock *event,void *reference);

/* Update icons in windiag window */
void windiag_seticons(window_block *wblock);

/* Read icons in windiag window into window block */
void windiag_readicons(window_block *wblock);

/* winentry being edited */
browser_winentry *windiag_winentry;

/* Window handles */
window_handle windiag_window, windiag_pane;

/* Height of pane */
int windiag_paneheight;

void windiag_init()
{
  window_block *templat;

  templat = templates_load("WinEdit",0,0,0,0);
  Error_CheckFatal(Wimp_CreateWindow(templat,&windiag_window));
  free(templat);
  templat = templates_load("WinPane",0,0,0,0);
  Error_CheckFatal(Wimp_CreateWindow(templat,&windiag_pane));
  windiag_paneheight = templat->screenrect.max.y - templat->screenrect.min.y;
  free(templat);

  Event_Claim(event_OPEN,windiag_window,event_ANY,windiag_OpenWindow,0);
  Event_Claim(event_CLOSE,windiag_window,event_ANY,windiag_CloseWindow,0);
  Event_Claim(event_CLICK,windiag_window,windiag_UPDATE,windiag_update,0);
  Event_Claim(event_CLICK,windiag_pane,windiag_CANCEL,windiag_cancel,0);
  Event_Claim(event_CLICK,windiag_pane,windiag_UPDATE,windiag_update,0);
  Event_Claim(event_CLICK,windiag_window,windiag_CANCEL,windiag_cancel,0);
  Event_Claim(event_CLICK,windiag_window,windiag_TITLE,windiag_optionclick,0);
  Event_Claim(event_CLICK,windiag_window,windiag_FURNITURE,
  	windiag_optionclick,0);
  Event_Claim(event_CLICK,windiag_window,windiag_PANE,windiag_optionclick,0);
  Event_Claim(event_CLICK,windiag_window,windiag_VSCROLL,
  	      windiag_optionclick,0);
  Event_Claim(event_CLICK,windiag_window,windiag_HSCROLL,
  	      windiag_optionclick,0);
  Event_Claim(event_CLICK,windiag_window,wincolour_DEFAULT,
  	      windiag_clickdefault,0);
  help_claim_window(windiag_window,"WEC");
  help_claim_window(windiag_pane,"WEC");

  diagutils_btype(windiag_window,windiag_BUTTONTYPE);
  diagutils_colour(windiag_window,wincolour_TITLEFORE,TRUE);
  diagutils_colour(windiag_window,wincolour_TITLEBACK,FALSE);
  diagutils_colour(windiag_window,wincolour_WORKFORE,FALSE);
  diagutils_colour(windiag_window,wincolour_WORKBACK,TRUE);
  diagutils_colour(windiag_window,wincolour_SCROLLOUTER,FALSE);
  diagutils_colour(windiag_window,wincolour_SCROLLINNER,FALSE);
  diagutils_colour(windiag_window,wincolour_FOCUS,FALSE);
}

BOOL windiag_OpenWindow(event_pollblock *event, void *ref)
{
  wimp_rect visarea;
  window_state panestate;
  if (choices->editpanes)
  {
    visarea = event->data.openblock.screenrect;
    Error_Check(Wimp_GetWindowState(windiag_pane, &panestate));
    panestate.openblock.screenrect = event->data.openblock.screenrect;
    panestate.openblock.screenrect.max.y =
    	panestate.openblock.screenrect.min.y + windiag_paneheight;
    if (event->data.openblock.behind != windiag_pane)
    {
      panestate.openblock.behind = event->data.openblock.behind;
      event->data.openblock.behind = windiag_pane;
    }
    Error_Check(Wimp_OpenWindow(&panestate.openblock));
  }
  Error_Check(Wimp_OpenWindow(&event->data.openblock));
  if (choices->editpanes &&
  	(event->data.openblock.screenrect.min.x != visarea.min.x ||
  	 event->data.openblock.screenrect.min.y != visarea.min.y ||
  	 event->data.openblock.screenrect.max.x != visarea.max.x ||
  	 event->data.openblock.screenrect.max.y != visarea.max.y))
  {
    panestate.openblock.screenrect = event->data.openblock.screenrect;
    panestate.openblock.screenrect.max.y =
    	panestate.openblock.screenrect.min.y + windiag_paneheight;
    panestate.openblock.behind = event->data.openblock.behind;
    Error_Check(Wimp_OpenWindow(&panestate.openblock));
  }
  return TRUE;
}

BOOL windiag_CloseWindow(event_pollblock *event, void *ref)
{
  windiag_close();
  return TRUE;
}

void windiag_open(browser_winentry *winentry)
{
  window_state wstate;
  event_pollblock dumev;
/*
  mouse_block ptrinfo;
  wimp_point moveby;
*/
  char buffer[28];

/*
  Wimp_GetPointerInfo(&ptrinfo);
*/

  windiag_winentry = winentry;
  windiag_seticons(&winentry->window->window);

  Str_MakeASCIIZ(winentry->identifier,12);
  MsgTrans_LookupPS(messages,"WinDgT",buffer,28,winentry->identifier,0,0,0);
  Window_SetTitle(windiag_window,buffer);

  windiag_optionclick(NULL, NULL);

  Wimp_GetWindowState(windiag_window,&wstate);
/*
  moveby.x = ptrinfo.pos.x - 64 - wstate.openblock.screenrect.min.x;
  moveby.y = ptrinfo.pos.y + 64 - wstate.openblock.screenrect.max.y;
  wstate.openblock.screenrect.min.x += moveby.x;
  wstate.openblock.screenrect.min.y += moveby.y;
  wstate.openblock.screenrect.max.x += moveby.x;
  wstate.openblock.screenrect.max.y += moveby.y;
*/
  dumev.data.openblock = wstate.openblock;
  windiag_OpenWindow(&dumev, 0);
}

BOOL windiag_cancel(event_pollblock *event,void *reference)
{
  if (!event->data.mouse.button.data.select &&
      !event->data.mouse.button.data.adjust)
    return FALSE;

  windiag_close();
  return TRUE;
}

BOOL windiag_optionclick(event_pollblock *event,void *reference)
{
  BOOL back = TRUE, close = TRUE, toggle = TRUE,
  	moveable = TRUE, adjust = TRUE;

  if (!Icon_GetSelect(windiag_window,windiag_TITLE))
  {
    back = close = FALSE;
    if (!Icon_GetSelect(windiag_window,windiag_VSCROLL))
      toggle = FALSE;
  }
  if (Icon_GetSelect(windiag_window,windiag_FURNITURE) ||
  	choices->strict_panes && Icon_GetSelect(windiag_window,windiag_PANE))
  {
    moveable = adjust = back = toggle = FALSE;
  }
  if (!Icon_GetSelect(windiag_window,windiag_VSCROLL))
  {
    if (!Icon_GetSelect(windiag_window,windiag_HSCROLL))
      adjust = FALSE;
    if (!Icon_GetSelect(windiag_window,windiag_TITLE))
      toggle = FALSE;
  }

  if (back)
    Icon_Unshade(windiag_window,windiag_BACK);
  else
  {
    Icon_Deselect(windiag_window,windiag_BACK);
    Icon_Shade(windiag_window,windiag_BACK);
  }
  if (close)
    Icon_Unshade(windiag_window,windiag_CLOSE);
  else
  {
    Icon_Deselect(windiag_window,windiag_CLOSE);
    Icon_Shade(windiag_window,windiag_CLOSE);
  }
  if (toggle)
    Icon_Unshade(windiag_window,windiag_TOGGLE);
  else
  {
    Icon_Deselect(windiag_window,windiag_TOGGLE);
    Icon_Shade(windiag_window,windiag_TOGGLE);
  }
  if (moveable)
    Icon_Unshade(windiag_window,windiag_MOVEABLE);
  else
  {
    Icon_Deselect(windiag_window,windiag_MOVEABLE);
    Icon_Shade(windiag_window,windiag_MOVEABLE);
  }
  if (adjust)
    Icon_Unshade(windiag_window,windiag_ADJUST);
  else
  {
    Icon_Deselect(windiag_window,windiag_ADJUST);
    Icon_Shade(windiag_window,windiag_ADJUST);
  }
  return TRUE;
}

BOOL windiag_clickdefault(event_pollblock *event,void *reference)
{
  if (!event->data.mouse.button.data.select &&
      !event->data.mouse.button.data.adjust)
    return FALSE;

  diagutils_writecolour(windiag_window,wincolour_TITLEFORE,7);
  diagutils_writecolour(windiag_window,wincolour_TITLEBACK,2);
  diagutils_writecolour(windiag_window,wincolour_WORKFORE,7);
  diagutils_writecolour(windiag_window,wincolour_WORKBACK,1);
  diagutils_writecolour(windiag_window,wincolour_SCROLLOUTER,3);
  diagutils_writecolour(windiag_window,wincolour_SCROLLINNER,1);
  diagutils_writecolour(windiag_window,wincolour_FOCUS,12);
  return TRUE;
}

void windiag_seticons(window_block *wblock)
{
  Icon_SetSelect(windiag_window,windiag_BACK,wblock->flags.data.backicon);
  Icon_SetSelect(windiag_window,windiag_CLOSE,wblock->flags.data.closeicon);
  Icon_SetSelect(windiag_window,windiag_TITLE,wblock->flags.data.titlebar);
  Icon_SetSelect(windiag_window,windiag_TOGGLE,wblock->flags.data.toggleicon);
  Icon_SetSelect(windiag_window,windiag_VSCROLL,wblock->flags.data.vscroll);
  Icon_SetSelect(windiag_window,windiag_ADJUST,wblock->flags.data.adjusticon);
  Icon_SetSelect(windiag_window,windiag_HSCROLL,wblock->flags.data.hscroll);
  Icon_SetSelect(windiag_window,windiag_MOVEABLE,wblock->flags.data.moveable);
  Icon_SetSelect(windiag_window,windiag_AUTOREDRAW,
  		 wblock->flags.data.autoredraw);
  Icon_SetSelect(windiag_window,windiag_PANE,wblock->flags.data.pane);
  Icon_SetSelect(windiag_window,windiag_BACKDROP,
  		 wblock->flags.data.backwindow);
  Icon_SetSelect(windiag_window,windiag_HOTKEYS,wblock->flags.data.hotkeys);
  Icon_SetSelect(windiag_window,windiag_NOBOUNDS,wblock->flags.data.nobounds);
  Icon_SetSelect(windiag_window,windiag_CONFINE,
  		 wblock->flags.data.keeponscreen);
  Icon_SetSelect(windiag_window,windiag_IGNORERIGHT,
  		 wblock->flags.data.ignoreright);
  Icon_SetSelect(windiag_window,windiag_IGNOREBOTTOM,
  		 wblock->flags.data.ignorebottom);
  Icon_SetSelect(windiag_window,windiag_SCROLLDEBOUNCED,
  		 wblock->flags.data.scrollrqdebounced);
  Icon_SetSelect(windiag_window,windiag_SCROLLAUTOREPEAT,
  		 wblock->flags.data.scrollrq);
  Icon_SetSelect(windiag_window,windiag_NOSCROLL,
  		 !(wblock->flags.data.scrollrq ||
  		 	wblock->flags.data.scrollrqdebounced));
  Icon_SetSelect(windiag_window,windiag_FURNITURE,
                 wblock->flags.data.childfurniture);
  diagutils_writebtype(windiag_window,windiag_BUTTONTYPE,
  		       wblock->workflags.data.buttontype);
  /*
  if ((int) wblock->spritearea == 1)
  {
    Icon_Select(windiag_window,windiag_WIMPSPRITES);
    Icon_Deselect(windiag_window,windiag_USERSPRITES);
  }
  else
  {
    Icon_Deselect(windiag_window,windiag_WIMPSPRITES);
    Icon_Select(windiag_window,windiag_USERSPRITES);
  }
  */
  diagutils_writecolour(windiag_window,wincolour_TITLEFORE,wblock->colours[0]);
  diagutils_writecolour(windiag_window,wincolour_TITLEBACK,wblock->colours[1]);
  diagutils_writecolour(windiag_window,wincolour_WORKFORE,
  			wblock->colours[2]);
  diagutils_writecolour(windiag_window,wincolour_WORKBACK,wblock->colours[3]);
  diagutils_writecolour(windiag_window,wincolour_SCROLLOUTER,
  			wblock->colours[4]);
  diagutils_writecolour(windiag_window,wincolour_SCROLLINNER,
  			wblock->colours[5]);
  diagutils_writecolour(windiag_window,wincolour_FOCUS,wblock->colours[6]);
  Icon_SetSelect(windiag_window,wincolour_GCOL,wblock->flags.data.realcolours);
}

void windiag_readicons(window_block *wblock)
{
  wblock->flags.data.backicon = Icon_GetSelect(windiag_window,windiag_BACK);
  wblock->flags.data.closeicon = Icon_GetSelect(windiag_window,windiag_CLOSE);
  wblock->flags.data.titlebar = Icon_GetSelect(windiag_window,windiag_TITLE);
  wblock->flags.data.toggleicon =
    Icon_GetSelect(windiag_window,windiag_TOGGLE);
  wblock->flags.data.vscroll = Icon_GetSelect(windiag_window,windiag_VSCROLL);
  wblock->flags.data.adjusticon =
    Icon_GetSelect(windiag_window,windiag_ADJUST);
  wblock->flags.data.hscroll = Icon_GetSelect(windiag_window,windiag_HSCROLL);
  wblock->flags.data.moveable =
    Icon_GetSelect(windiag_window,windiag_MOVEABLE);
  wblock->flags.data.autoredraw =
    Icon_GetSelect(windiag_window,windiag_AUTOREDRAW);
  wblock->flags.data.pane = Icon_GetSelect(windiag_window,windiag_PANE);
  wblock->flags.data.backwindow =
    Icon_GetSelect(windiag_window,windiag_BACKDROP);
  wblock->flags.data.hotkeys = Icon_GetSelect(windiag_window,windiag_HOTKEYS);
  wblock->flags.data.nobounds =
    Icon_GetSelect(windiag_window,windiag_NOBOUNDS);
  wblock->flags.data.keeponscreen =
    Icon_GetSelect(windiag_window,windiag_CONFINE);
  wblock->flags.data.ignoreright =
    Icon_GetSelect(windiag_window,windiag_IGNORERIGHT);
  wblock->flags.data.ignorebottom =
    Icon_GetSelect(windiag_window,windiag_IGNOREBOTTOM);
  wblock->flags.data.scrollrqdebounced =
    Icon_GetSelect(windiag_window,windiag_SCROLLDEBOUNCED);
  wblock->flags.data.scrollrq =
    Icon_GetSelect(windiag_window,windiag_SCROLLAUTOREPEAT);
  wblock->flags.data.childfurniture =
          Icon_GetSelect(windiag_window,windiag_FURNITURE);
  wblock->workflags.data.buttontype =
    diagutils_readbtype(windiag_window,windiag_BUTTONTYPE);
  /*if (Icon_GetSelect(windiag_window,windiag_USERSPRITES))*/
  wblock->spritearea = user_sprites;
  /*else
    wblock->spritearea = (void *) 1;*/
  wblock->colours[0] =
    diagutils_readcolour(windiag_window,wincolour_TITLEFORE);
  wblock->colours[1] =
    diagutils_readcolour(windiag_window,wincolour_TITLEBACK);
  wblock->colours[2] =
    diagutils_readcolour(windiag_window,wincolour_WORKFORE);
  wblock->colours[3] =
    diagutils_readcolour(windiag_window,wincolour_WORKBACK);
  wblock->colours[4] =
    diagutils_readcolour(windiag_window,wincolour_SCROLLOUTER);
  wblock->colours[5] =
    diagutils_readcolour(windiag_window,wincolour_SCROLLINNER);
  wblock->colours[6] =
    diagutils_readcolour(windiag_window,wincolour_FOCUS);
  wblock->flags.data.realcolours =
    Icon_GetSelect(windiag_window,wincolour_GCOL);
}

BOOL windiag_update(event_pollblock *event,void *reference)
{
  if (event->data.mouse.button.data.menu)
    return FALSE;

  windiag_readicons(&windiag_winentry->window->window);
  viewer_reopen(windiag_winentry,FALSE);
  browser_settitle(windiag_winentry->browser,0,TRUE);

  if (event->data.mouse.button.data.select)
    windiag_close();

  Window_GainCaret(windiag_winentry->handle);

  return TRUE;
}

void windiag_close()
{
  return_caret(windiag_window, windiag_winentry->handle);
  Wimp_CloseWindow(windiag_window);
  if (choices->editpanes)
    Wimp_CloseWindow(windiag_pane);
}

void windiag_responder(choices_str *old, choices_str *new_ch)
{
  window_state wstate;

  Wimp_GetWindowState(windiag_window, &wstate);
  if (!wstate.flags.data.open) return;

  if (old->editpanes && !new_ch->editpanes)
    Wimp_CloseWindow(windiag_pane);
  else if (!old->editpanes && new_ch->editpanes)
  {
    event_pollblock dummyev;

    dummyev.data.openblock = wstate.openblock;
    windiag_OpenWindow(&dummyev, 0);
  }
  if (old->strict_panes != new_ch->strict_panes)
    windiag_optionclick(NULL,NULL);
}
