#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "kernel.h"
#include "swis.h"
#include "bbc.h"
#include "Global/FileTypes.h"
#include "Interface/HighFSI.h"

#include "toolbox.h"
#include "wimp.h"
#include "wimplib.h"
#include "flex.h"
#include "window.h"
#include "gadgets.h"
#include "colourdbox.h"
#include "fontdbox.h"
#include "saveas.h"

#include "msgtrans.h"
#include "main.h"
#include "mystring.h"
#include "defines.h"
#include "spritegen.h"
#include "settings.h"
#include "path.h"

static const struct {
       ComponentId c;
       watermark_type loc;
       char *cmd_option;
} wm_mapping[9] ={{WM_TL,WATERMARK_TOPLEFT,"-TL"},
                                   {WM_TC,WATERMARK_TOPCENTRE,"-TC"},
                                   {WM_TR,WATERMARK_TOPRIGHT,"-TR"},
                                   {WM_L,WATERMARK_LEFT,"-L"},
                                   {WM_C,WATERMARK_CENTRE,"-C"},
                                   {WM_R,WATERMARK_RIGHT,"-R"},
                                   {WM_BL,WATERMARK_BOTTOMLEFT,"-BL"},
                                   {WM_BC,WATERMARK_BOTTOMCENTRE,"-BC"},
                                   {WM_BR,WATERMARK_BOTTOMRIGHT,"-BR"}};

#define gadget_set_fade(w,c,f) gadget_set_flags(0,(w),(c),(f)*Gadget_Faded)

static int *client_sprite_area=NULL;

void ui_init(int *spritearea)
{
  client_sprite_area=spritearea;
}

int changefsi(settings *s,char *filename)
{
  // try to changefsi it...
  char cfsi[80+strlen(filename)];
  char modenumber[12];
  // generate a mode number
  int bpp=1<<bbc_modevar(-1,9);
  os_filestr file;
  _kernel_oserror *e;
  
  if (bpp>8) {
    sprintf(modenumber,"S%d,%d,%d",bpp==32?32:16,180/(1<<bbc_modevar(-1,4)),180/(1<<bbc_modevar(-1,5)));
  } else {
    // get current mode settings
    int mode,r1=0;
    os_byte(135,&r1,&mode);//_swix(OS_Byte,_IN(0)|_OUT(2),135,&mode);
    sprintf(modenumber,"%d",mode);
  }

  file.action=OSFile_Delete;
  file.name="<Wimp$ScrapDir>.PinSetup";
  os_file(&file);
  
  sprintf(cfsi,"<ChangeFSI$Dir>.ChangeFSI %s <Wimp$ScrapDir>.PinSetup %s -nomode",filename,modenumber);
  wimp_start_task(cfsi, NULL);

  file.action=OSFile_ReadNoPath;
  file.name="<Wimp$ScrapDir>.PinSetup";
  e=os_file(&file);
  if (e) {
    error(e,FALSE);
    return 0;
  }
  
  if (file.action==1) {
    error(pinboard_do_custom_image_sprite(client_sprite_area,
                                                       "<Wimp$ScrapDir>.PinSetup",
                                                       s->custom_image_type,
                                                       s->background_colour), FALSE);
   
    // tidy up
    file.action=OSFile_Delete;
    file.name="<Wimp$ScrapDir>.PinSetup";
    os_file(&file);
  } else {
    msgtrans_error("BadImage");
  }
  
  return 1;
}

void window_set_fades(ComponentId page,ObjectId win,settings *s)
{
  switch (page) {
    case Page_Background:
      switch (s->background_type) {
        case BACKDROP_PLAIN:
          gadget_set_fade(win,BG_StdImage,1);
          gadget_set_fade(win,BG_Up,1);
          gadget_set_fade(win,BG_Down,1);
          gadget_set_fade(win,BG_Lighter,1);
          gadget_set_fade(win,BG_Random,1);
          gadget_set_fade(win,BG_Scaled,1);
          gadget_set_fade(win,BG_Centred,1);
          gadget_set_fade(win,BG_Tiled,1);
          gadget_set_fade(win,BG_Fullscreen,1);
          gadget_set_fade(win,BG_Cache,1);
          gadget_set_fade(win,BG_Carousel,1);
          gadget_set_fade(win,BG_BGcolour,0);
          gadget_set_fade(win,BG_BGcolourlabel,0);
          gadget_set_fade(win,BG_BGcolourmenu,0);
          gadget_set_fade(win,BG_CarouselLabel,1);
          gadget_set_fade(win,BG_CarouselTime,1);
          gadget_set_fade(win,BG_CarouselLabel2,1);
          gadget_set_fade(win,BG_OpacityLabel,1);
          gadget_set_fade(win,BG_Opacity,1);
          gadget_set_fade(win,BG_OpacityLabel2,1);
          break;

      case BACKDROP_CUSTOM:
          gadget_set_fade(win,BG_StdImage,1);
          gadget_set_fade(win,BG_Up,1);
          gadget_set_fade(win,BG_Down,1);
          gadget_set_fade(win,BG_Lighter,1);
          gadget_set_fade(win,BG_Random,1);
          gadget_set_fade(win,BG_Scaled,s->filetype==0); // stays faded until we have a file
          gadget_set_fade(win,BG_Centred,s->filetype==0);
          gadget_set_fade(win,BG_Tiled,s->filetype==0);
          gadget_set_fade(win,BG_Fullscreen,s->filetype==0);
          if (s->filetype==0xc85 || s->filetype==0x1000) gadget_set_fade(win,BG_Cache,0);
            else gadget_set_fade(win,BG_Cache,1);
          gadget_set_fade(win,BG_Carousel,0);
          gadget_set_fade(win,BG_BGcolour,0);
          gadget_set_fade(win,BG_BGcolourlabel,0);
          gadget_set_fade(win,BG_BGcolourmenu,0);
          gadget_set_fade(win,BG_CarouselLabel,s->filetype!=0x1000);
          gadget_set_fade(win,BG_CarouselTime,s->filetype!=0x1000);
          gadget_set_fade(win,BG_CarouselLabel2,s->filetype!=0x1000);

          if (s->custom_image_type==CUSTOM_FULLSCREEN && iconbar_opacity_supported) {
            gadget_set_fade(win,BG_OpacityLabel,0);
            gadget_set_fade(win,BG_Opacity,0);
            gadget_set_fade(win,BG_OpacityLabel2,0);
          } else {
            gadget_set_fade(win,BG_OpacityLabel,1);
            gadget_set_fade(win,BG_Opacity,1);
            gadget_set_fade(win,BG_OpacityLabel2,1);
          }
          break;                                   

      case BACKDROP_STANDARD:
          gadget_set_fade(win,BG_StdImage,0);
          gadget_set_fade(win,BG_Up,0);
          gadget_set_fade(win,BG_Down,0);
          gadget_set_fade(win,BG_Lighter,0);
          gadget_set_fade(win,BG_Random,0);
          gadget_set_fade(win,BG_Scaled,1);
          gadget_set_fade(win,BG_Centred,1);
          gadget_set_fade(win,BG_Tiled,1);
          gadget_set_fade(win,BG_Fullscreen,1);
          gadget_set_fade(win,BG_Cache,1);
          gadget_set_fade(win,BG_Carousel,1);
          gadget_set_fade(win,BG_BGcolour,1);
          gadget_set_fade(win,BG_BGcolourlabel,1);
          gadget_set_fade(win,BG_BGcolourmenu,1);
          gadget_set_fade(win,BG_CarouselLabel,1);
          gadget_set_fade(win,BG_CarouselTime,1);
          gadget_set_fade(win,BG_CarouselLabel2,1);
          gadget_set_fade(win,BG_OpacityLabel,1);
          gadget_set_fade(win,BG_Opacity,1);
          gadget_set_fade(win,BG_OpacityLabel2,1);
          break;
      }
      break;

    case Page_PinAppear:
      switch (s->icon_appearance) {
        case APPEARANCE_THEME:
        case APPEARANCE_BLENDED:
          gadget_set_fade(win,PA_OutlineColour,1);
          gadget_set_fade(win,PA_OutlineLabel,1);
          gadget_set_fade(win,PA_OutlineMenu,1);
          break;

        case APPEARANCE_OUTLINE:
          gadget_set_fade(win,PA_OutlineColour,0);
          gadget_set_fade(win,PA_OutlineLabel,0);
          gadget_set_fade(win,PA_OutlineMenu,0);
          break;
      }
      break;

    case Page_PinArrange:
      if (s->iconize_dest==ICONIZE_BUTTON || s->iconize_dest==ICONIZE_ICONBAR) {
        gadget_set_fade(win,PA_IconStack,1);
      } else {
        gadget_set_fade(win,PA_IconStack,0);
      }
      break;

    case Page_Watermark:
      {
        int i,xfade=0,yfade=0;
        for (i=0;i<9;i++) gadget_set_fade(win,wm_mapping[i].c,s->watermark_enabled==FALSE);
        if (s->watermark_enabled) {
          switch (s->watermark_location) {
          case WATERMARK_TOPLEFT:
          case WATERMARK_TOPRIGHT:
          case WATERMARK_BOTTOMLEFT:
          case WATERMARK_BOTTOMRIGHT:
            xfade=0;
            yfade=0;
            break;

          case WATERMARK_TOPCENTRE:
          case WATERMARK_BOTTOMCENTRE:
            xfade=1;
            yfade=0;
            break;

          case WATERMARK_LEFT:
          case WATERMARK_RIGHT:
            xfade=0;
            yfade=1;
            break;
            
          case WATERMARK_CENTRE:
            xfade=1;
            yfade=1;
            break;
          }
        } else {
          xfade=1;
          yfade=1;
        }
            
        gadget_set_fade(win,WM_Xlabel,xfade);
        gadget_set_fade(win,WM_Xoffset,xfade);
        gadget_set_fade(win,WM_Xosu,xfade);
        gadget_set_fade(win,WM_Ylabel,yfade);
        gadget_set_fade(win,WM_Yoffset,yfade);
        gadget_set_fade(win,WM_Yosu,yfade);

        gadget_set_fade(win,WM_ScaleLabel,s->watermark_enabled==FALSE);
        gadget_set_fade(win,WM_ScalePerc,s->watermark_enabled==FALSE);
        gadget_set_fade(win,WM_ScalePopup,s->watermark_enabled==FALSE);
      }
      break;

    case Page_Misc:
      gadget_set_fade(win,Misc_HeldLabel,s->dclick_hold==0);
      gadget_set_fade(win,Misc_DclickTime,s->dclick_hold==0);
      gadget_set_fade(win,Misc_SecLabel,s->dclick_hold==0);
      break;
  }

}

void background_show_texture(settings *s,ObjectId win)
{
    BBox gadget_bbox;
    char tilename[128];

    while (!pinboard_get_tile_filename(s->standard_image_ref, s->standard_image_max, s->lighter, tilename) && s->standard_image_ref>1) s->standard_image_ref--;

    /* Update sprite and redraw */
    error(pinboard_plot_texture_into_sprite(client_sprite_area,
                                                 tilename,
                                                 0,
                                                 "std_tile"), 0);

    gadget_get_bbox(0, win, BG_StdImage, &gadget_bbox);
    gadget_bbox.xmin += 8;
    gadget_bbox.xmax -= 8;
    gadget_bbox.ymin += 8;
    gadget_bbox.ymax -= 8;
    window_force_redraw(0, win, &gadget_bbox);
}

void background_show_custom(settings *s,ObjectId win)
{
  // update the custom image and display
  BBox gadget_bbox;

  switch (s->filetype) {
    case 0x000:
      // nothing present
      button_set_validation(0,win,BG_CustomImage,"R2");
      break;

    case 0xc85:
      button_set_validation(0,win,BG_CustomImage,"scust_tile;R2");
      error(pinboard_do_custom_image_jpeg(client_sprite_area,
                                                       s->custom_image_filename,
                                                       s->custom_image_type,
                                                       s->background_colour), FALSE);
      break;

    case 0xff9:
      button_set_validation(0,win,BG_CustomImage,"scust_tile;R2");
      error(pinboard_do_custom_image_sprite(client_sprite_area,
                                                       s->custom_image_filename,
                                                       s->custom_image_type,
                                                       s->background_colour), FALSE);
      break;

    case 0x1000: // directory, ie carousel
      button_set_validation(0,win,BG_CustomImage,"scust_tile;R2");
      error(pinboard_do_custom_image_sprite(client_sprite_area,
                                                       "<PinSetup$Dir>.Carousel",
                                                       s->custom_image_type,
                                                       s->background_colour), FALSE);
      break;

    default: // alredy updated by cfsi, no need to reload image
      button_set_validation(0,win,BG_CustomImage,"scust_tile;R2");
      break;
  }

  gadget_get_bbox(0, win, BG_CustomImage, &gadget_bbox);
  gadget_bbox.xmin += 8;
  gadget_bbox.xmax -= 8;
  gadget_bbox.ymin += 8;
  gadget_bbox.ymax -= 8;
  window_force_redraw(0, win, &gadget_bbox);

}

static void background_refresh_custom(ObjectId win,settings *s)
{
  switch (s->filetype) {
    case 0xc85:
    case 0xff9:
    case 0x1000:
      background_show_custom(s,win);
      break;

    default:
      changefsi(s,s->custom_image_filename);
      background_show_custom(s,win);
      break;
  }
}

int background_radioclick(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  RadioButtonStateChangedEvent *e=(RadioButtonStateChangedEvent *)event;
  settings *s=(settings *)handle;

  if (e->state==0) return 1;

  switch (id->self_component) {
    case BG_Standard:
      s->background_type=BACKDROP_STANDARD;
      break;

    case BG_Custom:
      s->background_type=BACKDROP_CUSTOM;
      break;

    case BG_Plain:
      s->background_type=BACKDROP_PLAIN;
      break;

    case BG_Scaled:
      s->custom_image_type=CUSTOM_SCALED;
      background_refresh_custom(id->self_id,s);
      break;

    case BG_Tiled:
      s->custom_image_type=CUSTOM_TILED;
      background_refresh_custom(id->self_id,s);
      break;

    case BG_Centred:
      s->custom_image_type=CUSTOM_CENTRED;
      background_refresh_custom(id->self_id,s);
      break;

    case BG_Fullscreen:
      s->custom_image_type=CUSTOM_FULLSCREEN;
      background_refresh_custom(id->self_id,s);
      break;
  }
  window_set_fades(Page_Background,id->self_id,&edited_settings);

  return 1;
}

int background_numberchange(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  NumberRangeValueChangedEvent *e=(NumberRangeValueChangedEvent *)event;
  settings *s=(settings *)handle;

  switch (id->self_component) {
    case BG_CarouselTime:
      s->carousel_time=e->new_value;
      break;

    case BG_Opacity:
      s->opacity=e->new_value;
      break;

    default:
      return 0;
  }

  return 1;
}

int background_adjusterclick(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
//  AdjusterClickedEvent *e=(AdjusterClickedEvent *)event;
  settings *s=(settings *)handle;

  switch (id->self_component) {
    case BG_Up:
      s->standard_image_ref++;
      if (s->standard_image_ref>s->standard_image_max) s->standard_image_ref=1;
      background_show_texture(s,id->self_id);
      break;

    case BG_Down:
      s->standard_image_ref--;
      if (s->standard_image_ref<1) s->standard_image_ref=s->standard_image_max;
      background_show_texture(s,id->self_id);
      break;
  }

  return 1;
}

int background_optionclick(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  OptionButtonStateChangedEvent *e=(OptionButtonStateChangedEvent *)event;
  settings *s=(settings *)handle;

  switch (id->self_component) {
    case BG_Lighter:
      s->lighter=e->new_state;
      background_show_texture(s,id->self_id);
      break;

    case BG_Random:
      s->random=e->new_state;
      break;

    case BG_Cache:
      s->cache=e->new_state;
      break;

  }

  return 1;
}

int appearance_radioclick(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  RadioButtonStateChangedEvent *e=(RadioButtonStateChangedEvent *)event;
  settings *s=(settings *)handle;

  if (e->state==0) return 1;

  switch (id->self_component) {
    case PA_Theme:
      s->icon_appearance=APPEARANCE_THEME;
      break;

    case PA_Blend:
      s->icon_appearance=APPEARANCE_BLENDED;
      break;

    case PA_Outline:
      s->icon_appearance=APPEARANCE_OUTLINE;
      break;
  }


  window_set_fades(Page_PinAppear,id->self_id,s);

  return 1;
}

int arrange_optionclick(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  OptionButtonStateChangedEvent *e=(OptionButtonStateChangedEvent *)event;
  settings *s=(settings *)handle;

  switch (id->self_component) {
    case PA_Grid:
      s->snap_to_grid=e->new_state;
      break;
  }

  return 1;
}

int sticky_fontshow(int event_code,WimpPollBlock *event,IdBlock *id,void *handle)
{
//  FontDboxAboutToBeShownEvent *e=(FontDboxAboutToBeShownEvent *)event;
//  settings *s=(settings *)handle;
 
  if (id->self_component==ST_FontMenu) {
    // transfer settings to font dbox
    if (edited_settings.sticky_font) {
      fontdbox_set_font(0,id->self_id,edited_settings.sticky_font);
      fontdbox_set_size(3,id->self_id,edited_settings.sticky_height,edited_settings.sticky_aspect);
    }

    toolbox_show_object(0,(ObjectId)handle,0,0,id->self_id,id->self_component);
  }

  return 1;
}

int sticky_fontset(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  FontDboxApplyFontEvent *e=(FontDboxApplyFontEvent *)event;
  settings *s=(settings *)handle;
  char text[16];

  if (s->sticky_font) {
    flex_free((flex_ptr)&s->sticky_font);
    s->sticky_font=NULL;
  }
  if (!flex_alloc((flex_ptr)&s->sticky_font,1+strlen(e->font))) {
    msgtrans_error("NoMem");
    return 1;
  }

  
  strcpy(s->sticky_font,e->font);
  s->sticky_height=e->height*16;
  s->sticky_aspect=e->aspect;

  // fill in the main window again
  displayfield_set_value(0,id->parent_id,ST_Font,s->sticky_font);
  sprintf(text,"%d pt",s->sticky_height/16);
  displayfield_set_value(0,id->parent_id,ST_Height,text);
  sprintf(text,"%d %%",s->sticky_aspect);
  displayfield_set_value(0,id->parent_id,ST_Aspect,text);

  return 1;
}

int sticky_saveshow(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
//  SaveAsAboutToBeShownEvent *e=(SaveAsAboutToBeShownEvent *)event;
  settings *s=(settings *)handle;

  // fill in the filename
  if (s->sticky_filename!=NULL) {
    saveas_set_file_name(0,id->self_id,s->sticky_filename);
  }

  return 1;
}

int sticky_savetofile(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  settings *s=(settings *)handle;
  SaveAsSaveToFileEvent *e=(SaveAsSaveToFileEvent *)event;  

  if (strcasecmp(e->filename,"<Wimp$Scrap>")==0) return 1;

  if (path_readonly(e->filename)) {
    msgtrans_error("PathRO");
    return 1;
  }
  
  if (s->sticky_filename) {
    flex_free((flex_ptr)&s->sticky_filename);
    s->sticky_filename=NULL;
  }
  if (!flex_alloc((flex_ptr)&s->sticky_filename,1+strlen(e->filename))) {
    msgtrans_error("NoMem");
    return 1;
  }

  strcpy(s->sticky_filename,e->filename);
  writablefield_set_value(0,id->parent_id,ST_SaveTo,e->filename);

  toolbox_hide_object(0,id->self_id);

  return 1;
}

int storage_saveshow(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
//  SaveAsAboutToBeShownEvent *e=(SaveAsAboutToBeShownEvent *)event;
  settings *s=(settings *)handle;

  // fill in the filename
  if (s->savedfiles_path!=NULL) {
    saveas_set_file_name(0,id->self_id,s->savedfiles_path);
  }

  return 1;
}

int storage_savetofile(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  settings *s=(settings *)handle;
  SaveAsSaveToFileEvent *e=(SaveAsSaveToFileEvent *)event;  

  if (strcasecmp(e->filename,"<Wimp$Scrap>")==0) return 1;

  if (path_readonly(e->filename)) {
    msgtrans_error("PathRO");
    return 1;
  }

  if (s->savedfiles_path) {
    flex_free((flex_ptr)&s->savedfiles_path);
    s->savedfiles_path=NULL;
  }
  if (!flex_alloc((flex_ptr)&s->savedfiles_path,1+strlen(e->filename))) {
    msgtrans_error("NoMem");
    return 1;
  }

  strcpy(s->savedfiles_path,e->filename);
  writablefield_set_value(0,id->parent_id,SF_Location,e->filename);

  toolbox_hide_object(0,id->self_id);

  return 1;
}

int writable_changed(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  WritableFieldValueChangedEvent *e=(WritableFieldValueChangedEvent *)event;
  char **ptr=(char **)handle;

  if (*ptr) {
    flex_free((flex_ptr)ptr);
    *ptr=NULL;
  }
  if (!flex_alloc((flex_ptr)ptr,1+strlen(e->string))) {
    msgtrans_error("NoMem");
    return 1;
  }

  strcpy(*ptr,e->string);

  return 1;
}

ComponentId watermark_component(watermark_type loc)
{
  int i;
  for (i=0;i<9;i++) {
    if (wm_mapping[i].loc==loc) return wm_mapping[i].c;
  }
  return -1;
}

watermark_type watermark_get_type(ComponentId c)
{
  int i;
  for (i=0;i<9;i++) {
    if (wm_mapping[i].c==c) return wm_mapping[i].loc;
  }
  return (watermark_type)-1;
}

char *watermark_get_cmd(watermark_type loc)
{
  int i;
  for (i=0;i<9;i++) {
    if (wm_mapping[i].loc==loc) return wm_mapping[i].cmd_option;
  }
  return "";
}

int watermark_optionclick(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  settings *s=(settings *)handle;
  OptionButtonStateChangedEvent *e=(OptionButtonStateChangedEvent *)event;

  if (id->self_component==WM_Enable) {
    s->watermark_enabled=e->new_state;
  }

  window_set_fades(Page_Watermark,id->self_id,s);

  return 1;
}

int watermark_radioclick(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  RadioButtonStateChangedEvent *e=(RadioButtonStateChangedEvent *)event;
  settings *s=(settings *)handle;
  watermark_type t;

  if (e->state==0) return 1;

  t=watermark_get_type(id->self_component);
  if (t!=(watermark_type)-1) {
    s->watermark_location=t;
  }

  window_set_fades(Page_Watermark,id->self_id,s);
  
  return 1;
}

int misc_numberchange(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  NumberRangeValueChangedEvent *e=(NumberRangeValueChangedEvent *)event;
  settings *s=(settings *)handle;

  if (id->self_component!=Misc_DclickTime) return 0;

  s->dclick_hold=e->new_value*10;
  if (s->dclick_hold==0) {
    s->dclick_hold=10;
    numberrange_set_value(0,id->self_id,id->self_component,10);
  }

  return 1;
}

int misc_optionclick(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  settings *s=(settings *)handle;
  OptionButtonStateChangedEvent *e=(OptionButtonStateChangedEvent *)event;

  switch (id->self_component) {
    case Misc_NoAdjust:
      s->disable_adjust=e->new_state;
      break;

    case Misc_Dclick:
      if (e->new_state) {
        // toggle on
        numberrange_get_value(0,id->self_id,Misc_DclickTime,&s->dclick_hold);
        s->dclick_hold*=10;
        if (s->dclick_hold==0) {
          s->dclick_hold=40;
          numberrange_set_value(0,id->self_id,Misc_DclickTime,4);
        }
      } else {
        // off
        s->dclick_hold=0;
      }
      window_set_fades(Page_Misc,id->self_id,s);
      break;

    case Misc_MenuInfo:
      s->menu_info=e->new_state;
      break;

    case Misc_Deletes:
      s->delete_confirm=e->new_state;
  }

  return 1;
}

int watermark_offsetchange(int event_code,ToolboxEvent *event,IdBlock *id,void *handle)
{
  settings *s=(settings *)handle;
  NumberRangeValueChangedEvent *e=(NumberRangeValueChangedEvent *)event;

  switch (id->self_component) {
    case WM_Xoffset:
      s->x_offset=e->new_value;
      break;

    case WM_Yoffset:
      s->y_offset=e->new_value;
      break;
  }
  return 1;
}
