/* write.c */

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

#include "colourdbox.h"
#include "colourmenu.h"
#include "event.h"
#include "fontdbox.h"
#include "fontmenu.h"
#include "saveas.h"
#include "scale.h"
#include "toolbox.h"
#include "wimplib.h"
#include "window.h"

#include "error.h"

#include "dboxtools.h"
#include "write.h"

#define ColourDbox 0x829c0
#define ColourMenu 0x82980
#define DCS        0x82a80
#define FileInfo   0x82ac0
#define FontDbox   0x82a00
#define FontMenu   0x82a40
#define Iconbar    0x82900
#define Menu       0x828c0
#define ProgInfo   0x82b40
#define Quit       0x82a90
#define SaveAs     0x82bc0
#define Scale      0x82c00
#define Window     0x82890

_kernel_oserror *write_object( ObjectId object, char *buffer )
{ int class, value;
  _kernel_oserror *er = NULL;
  char *end;
  
  NER( toolbox_get_object_class( 0, object, &class ));
  switch( class )
  { case ColourDbox:
      { int colour[2];
        colour[0] = (int) strtol( buffer, &end, 16 );
        colour[1] = 0;
        NER( colourdbox_set_colour( 0, object, colour));
      }  
      break;

    case ColourMenu:
      value = (int) strtol( buffer, &end, 16 );
      NER( colourmenu_set_colour( 0, object, value ));
      break;

    case FontDbox:
      NER( fontdbox_set_font( 0, object, buffer));
      break;

    case FontMenu:
      NER( fontmenu_set_font( 0, object, buffer));
      break;

    case SaveAs:
      NER( saveas_set_file_name( 0, object, buffer));
      break;

    case Scale:
      value = (int) strtol( buffer, &end, 16 );
      NER( scale_set_value( 0, object, value ));
      break;

    case Window:
    case Quit:
    case ProgInfo:
    case Menu:
    case Iconbar:
    case FileInfo:
    case DCS:
      sprintf
      (error_block.errmess, "Object class %i can not be given a value", class );
      error_block.errnum = ERROR_CLASS_NO_VALUE;
      error_displayRet( &error_block );
      *buffer = 0;
      break;

    default:
      sprintf( error_block.errmess, "Object class %i not understood", class );
      error_block.errnum = ERROR_CLASS_NOT_UNDERSTOOD;
      error_displayRet( &error_block );
      *buffer = 0;
      break;
  }
  return er;
}

_kernel_oserror *write_gadget
( ObjectId object, ComponentId component, char *buffer)
{ int type, state, value;
  _kernel_oserror *er = NULL;
  char *end;

  if( component == -1 ) /* no component, so write the object */
    return write_object( object, buffer);
    
  er = gadget_get_type( 0, object, component, &type );
  if( er ) return er;
  switch( type )
  { case 192: /* Option Button  */
      state = (int) strtol( buffer, &end, 16 );
      er = optionbutton_set_state( 0, object, component, state );
      break;    
      
    case 384: /* Radio Button   */
      state = (int) strtol( buffer, &end, 16 );
      er = radiobutton_set_state ( 0, object, component, state );
      break;
            
    case 448: /* Display Field  */
      er = displayfield_set_value( 0, object, component, buffer );
      break;
      
    case 512: /* Writable Field */
      er = writablefield_set_value( 0, object, component, buffer );
      break;
    
    case 576: /* Slider         */
      value = (int) strtol( buffer, &end, 16 );
      er = slider_set_value ( 0, object, component, value );
      break;
      
    case 832: /* Number Range   */
      value = (int) strtol( buffer, &end, 16 );   
      er = numberrange_set_value( 0, object, component, value );
      break;
      
    case 896: /* String Set     */
      er = stringset_set_selected( 0, object, component, buffer );
      break;

    case 128: /* Action Button  */
    case 256: /* Labelled Box   */
    case 320: /* Label          */
    case 640: /* Draggable      */
    case 704: /* Pop Up Menu    */
    case 768: /* Adjuster Arrow */
    case 960: /* Button         */
      sprintf
      ( error_block.errmess, "Component type %i can not return a value", type );
      error_block.errnum = ERROR_GADGET_NO_VALUE;
      er = &error_block;
      *buffer = 0;
      break;
         
    default:
      sprintf( error_block.errmess, "Component type %i not understood", type );
      error_block.errnum = ERROR_GADGET_NOT_UNDERSTOOD;
      er = &error_block;
      *buffer = 0;
      break;
  }
  return er;
}

/* end of write.c */
