/* ==========================================================================
**
**                         HSlider.c
** ©1991 WILLISoft
**
** ==========================================================================
*/

#include "minmax.h"
#include "HSlider.h"
#include "HSliderClass.h"
#include <proto/exec.h>
#include <proto/intuition.h>
#include "amigamem.h"


tPoint HSlider_AskSize( HSlider *self,
                        PIXELS  Width,
                        PIXELS  Height )
{
   tPoint size;

   size.x = MAX( Width,  20 );
   size.y = MAX( Height, 10 );

   return size;
}



LONG HSlider_Value( HSlider *self )
{
   return self->Prop.HorizPot;
}


USHORT HSlider_KnobSize( HSlider *self )
{
   return self->Prop.HorizBody;
}


LONG HSlider_SetValue( HSlider *self, LONG value )
{
   struct pcgWindow *window;
   struct PropInfo   propinfo;
   USHORT position;
   
   position = value;
   propinfo = self->Prop;

   if ((window = InteractorWindow( self )) &&
       (window->Window))
   {
      NewModifyProp( &self->eg.g, window->Window, NULL, propinfo.Flags,
         position, propinfo.VertPot,
         propinfo.HorizBody, propinfo.VertBody,
         1 );
   }
   else
   {
      self->Prop.HorizPot  = position;
   }

   return position;
}


USHORT HSlider_SetKnobSize( HSlider *self, USHORT knobsize )
{
   struct pcgWindow *window;
   struct PropInfo   propinfo;

   propinfo = self->Prop;

   if ((window = InteractorWindow( self )) &&
       (window->Window))
   {
      NewModifyProp( &self->eg.g, window->Window, NULL, propinfo.Flags,
         propinfo.HorizPot,  propinfo.VertPot,
         knobsize, propinfo.VertBody,
         1 );
   }
   else
   {
      self->Prop.HorizBody = knobsize;
   }

   return knobsize;
}


#ifdef BUILDER
#include "BuilderMethods.h"
#include "GraphicObject_Builder.h"
#include "Positioner_Builder.h"
#include "Positioner_Coder.h"

Slider *HSlider_New( HSlider *self )
{
   Slider *new_HSlider = NULL;
   Point loc, size;

   if (new_HSlider = (HSlider *) Amalloc(sizeof(HSlider)))
   {
      loc  = Location(self);
      size = Size(self);

      HSlider_Init( new_HSlider, loc.x, loc.y, size.x, size.y,
                    self->eg.Pens, Title(self) );
      GiveItAName( new_HSlider );
   }
   return new_HSlider;
}
struct BuilderMethods HSlider_bm;
#endif


BOOL HSlider_elaborated = FALSE;

struct PositionerClass HSlider_Class;

void HSliderClass_Init( struct PositionerClass *class )
{
   SliderClass_Init( class );
   class->isa         = SliderClass();
   class->ClassName   = "HSlider";
   class->AskSize     = HSlider_AskSize;
   class->SetValue    = HSlider_SetValue;
   class->Value       = HSlider_Value;
   class->SetKnobSize = HSlider_SetKnobSize;
   class->KnobSize    = HSlider_KnobSize;

#ifdef BUILDER
   go_InitBuilderMethods( &HSlider_bm );
   HSlider_bm.New        = HSlider_New;
   HSlider_bm.PropEdit   = Positioner_PropEdit;
   HSlider_bm.WriteCode  = Positioner_WriteCode;
   class->BuilderMethods = &HSlider_bm;
#endif

}


struct PositionerClass *HSliderClass( void )
{
   if (! HSlider_elaborated)
   {
      HSliderClass_Init( &HSlider_Class );
      HSlider_elaborated = TRUE;
   }

   return &HSlider_Class;
}


void HSlider_Init( HSlider    *self,
                   PIXELS      LeftEdge,
                   PIXELS      TopEdge,
                   PIXELS      Width,
                   PIXELS      Height,
                   pcg_3DPens  Pens,
                   char       *label )
{
   Point size;

   size = HSlider_AskSize( self, Width, Height );

   Slider_Init( self, LeftEdge, TopEdge, size.x, size.y, Pens );

   self->eg.isa        = HSliderClass();
   self->Prop.Flags   |= FREEHORIZ;
   self->Prop.HorizBody = 0x4000;

   SetTitle( self, label );
   SetTextAlignment( self, tx_OUTSIDE | tx_LEFT | tx_YCENTER,
      STD_XPAD, STD_YPAD );
}



