home *** CD-ROM | disk | FTP | other *** search
- #include <classes/BOOPSI/gadgets.h>
- #include <classes/BOOPSI/boopsilib.h>
-
- #include <intuition/icclass.h>
-
- #pragma -
- #include <pragma/utility_lib.h>
- #include <clib/alib_protos.h>
- #include <pragma/intuition_lib.h>
- #include <pragma/graphics_lib.h>
- #pragma +
-
- struct InstanceData {
- struct TextAttr *tattr;
- struct TextFont *font;
- ULONG labelplace;
- ULONG valueplace;
- UWORD min;
- UWORD max;
- ULONG freedom;
- Object *prop;
- Object *frame;
- WORD leftborder;
- WORD rightborder;
- WORD topborder;
- WORD bottomborder;
- };
-
- SliderClass::SliderClass()
- : BoopsiClass(sizeof(struct InstanceData),(ULONG (*)()) &dispatcher,GADGETCLASS,NULL)
- {
- }
-
- ULONG SliderClass::dispatcher(Class *cl, Object *o, Msg msg)
- {
- struct InstanceData *data;
- ULONG retval = FALSE;
- switch (msg->MethodID)
- {
- case OM_NEW:
- {
- Object *object;
- if (object = (Object *) DoSuperMethodA(cl,o,msg))
- {
- data = (struct InstanceData *) INST_DATA(cl,object);
- data->tattr = NULL;
- data->font = NULL;
- data->labelplace = 0;
- data->valueplace = 0;
- data->min = 0;
- data->max = 65535;
- data->freedom = FREEVERT;
- WORD otop = 0;
- WORD oleft = 0;
- WORD oheight = 0;
- WORD owidth = 0;
- UWORD olevel = 0;
- TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
- while (!tic.isDone()) {
- /* register */ ULONG ticData = tic.itemData();
- switch (tic.itemTag())
- {
- case GA_Top:
- otop = (WORD) ticData;
- break;
- case GA_Left:
- oleft = (WORD) ticData;
- break;
- case GA_Width:
- owidth = (WORD) ticData;
- break;
- case GA_Height:
- oheight = (WORD) ticData;
- break;
- case SLA_Font:
- data->tattr = (struct TextAttr *) ticData;
- break;
- case SLA_ValuePlace:
- break;
- case SLA_LabelPlace:
- break;
- case SLA_Min:
- data->min = (UWORD) ticData;
- break;
- case SLA_Max:
- data->max = (UWORD) ticData;
- break;
- case SLA_Level:
- olevel = (UWORD) ticData;
- break;
- case SLA_Freedom:
- data->freedom = (ULONG) ticData;
- break;
- default:
- break;
- };
- tic.next();
- };
- calcBorders(cl,(struct Gadget *) object, data);
- data->prop = (Object *) NewObject(NULL,PROPGCLASS,
- GA_Top, otop + 2,
- GA_Left, oleft + 2,
- GA_Width, owidth - 4,
- GA_Height, oheight - 4,
- PGA_Borderless, TRUE,
- PGA_Freedom, data->freedom,
- PGA_NewLook, FALSE,
- PGA_Top, olevel - data->min,
- PGA_Visible, 1,
- PGA_Total, data->max - data->min + 1,
- ICA_TARGET, object,
- TAG_END);
- data->frame = (Object *) NewObject(NULL,FRAMEICLASS,
- IA_Top, otop,
- IA_Left, oleft,
- IA_Width, owidth,
- IA_Height, oheight,
- IA_Recessed, FALSE,
- IA_EdgesOnly, TRUE,
- TAG_END);
- if (data->tattr)
- data->font = OpenFont(data->tattr);
- retval = (ULONG) object;
- };
- break;
- };
- case OM_DISPOSE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- if (data->prop)
- {
- DisposeObject(data->prop);
- };
- if (data->font)
- CloseFont(data->font);
- retval = DoSuperMethodA(cl,o,msg);
- break;
- };
- case OM_GET:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- switch (((struct opGet *) msg)->opg_AttrID)
- {
- case GA_Left:
- *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->LeftEdge;
- retval = TRUE;
- break;
- case GA_Top:
- *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->TopEdge;
- retval = TRUE;
- break;
- case GA_Width:
- *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->Width;
- retval = TRUE;
- break;
- case GA_Height:
- *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->Height;
- retval = TRUE;
- break;
- case SLA_Font:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->tattr;
- retval = TRUE;
- break;
- case SLA_ValuePlace:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->valueplace;
- retval = TRUE;
- break;
- case SLA_LabelPlace:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->labelplace;
- retval = TRUE;
- break;
- case SLA_Min:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->min;
- retval = TRUE;
- break;
- case SLA_Max:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->max;
- retval = TRUE;
- break;
- case SLA_Level:
- if (data->prop)
- {
- ULONG level;
- GetAttr(PGA_Top, data->prop, &level);
- *(((struct opGet *) msg)->opg_Storage) = level + data->min;
- }
- else
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) 0;
- retval = TRUE;
- break;
- case SLA_LeftBorder:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->leftborder;
- retval = TRUE;
- break;
- case SLA_RightBorder:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->rightborder;
- retval = TRUE;
- break;
- case SLA_TopBorder:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->topborder;
- retval = TRUE;
- break;
- case SLA_BottomBorder:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->bottomborder;
- retval = TRUE;
- break;
- case SLA_AutoWidth:
- *(((struct opGet *) msg)->opg_Storage) =
- (ULONG) calcWidth(cl,(struct Gadget *) o, data);
- retval = TRUE;
- break;
- case SLA_AutoHeight:
- *(((struct opGet *) msg)->opg_Storage) =
- (ULONG) calcHeight(cl,(struct Gadget *) o, data);
- retval = TRUE;
- break;
- case SLA_Freedom:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->freedom;
- retval = TRUE;
- break;
- default:
- retval = DoSuperMethodA(cl,o,msg);
- break;
- };
- break;
- };
- case OM_SET:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
- ULONG olevel = 0;
- if (data->prop)
- GetAttr(PGA_Top, data->prop, &olevel);
- BOOL newProp = FALSE;
- while (!tic.isDone()) {
- /* register */ ULONG ticData = tic.itemData();
- switch (tic.itemTag())
- {
- case GA_Top:
- newProp = TRUE;
- break;
- case GA_Left:
- newProp = TRUE;
- break;
- case GA_Width:
- newProp = TRUE;
- break;
- case GA_Height:
- newProp = TRUE;
- break;
- case SLA_Font:
- if (data->font)
- {
- CloseFont(data->font);
- data->font = NULL;
- };
- data->tattr = (struct TextAttr *) ticData;
- if (data->tattr)
- data->font = OpenFont(data->tattr);
- calcBorders(cl,(struct Gadget *) o, data);
- break;
- case SLA_Min:
- data->min = (UWORD) ticData;
- newProp = TRUE;
- break;
- case SLA_Max:
- data->max = (UWORD) ticData;
- newProp = TRUE;
- break;
- case SLA_Level:
- olevel = (ULONG) ticData;
- newProp = TRUE;
- break;
- default:
- break;
- };
- tic.next();
- };
- retval = DoSuperMethodA(cl,o,msg);
- if (newProp && data->prop)
- {
- SetGInfoAttrs(data->prop,((struct opSet *) msg)->ops_GInfo,
- GA_Left, ((struct Gadget *) o)->LeftEdge + 2,
- GA_Top, ((struct Gadget *) o)->TopEdge + 2,
- GA_Width, ((struct Gadget *) o)->Width - 4,
- GA_Height, ((struct Gadget *) o)->Height - 4,
- PGA_Top, olevel - data->min,
- PGA_Visible, 1,
- PGA_Total, data->max - data->min + 1,
- TAG_END);
- };
- break;
- };
- case OM_UPDATE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
- ULONG olevel = 0;
- if (data->prop)
- GetAttr(PGA_Top, data->prop, &olevel);
- BOOL newProp = FALSE;
- while (!tic.isDone()) {
- /* register */ ULONG ticData = tic.itemData();
- switch (tic.itemTag())
- {
- case PGA_Top:
- {
- struct TagItem tt[2];
- tt[0].ti_Tag = SLA_Level;
- tt[0].ti_Data = ticData + data->min;
- tt[1].ti_Tag = TAG_END;
- DoMethod(o,OM_NOTIFY,tt,((struct opSet *) msg)->ops_GInfo,0);
- break;
- };
- case SLA_Min:
- data->min = (UWORD) ticData;
- newProp = TRUE;
- break;
- case SLA_Max:
- data->max = (UWORD) ticData;
- newProp = TRUE;
- break;
- case SLA_Level:
- olevel = (ULONG) ticData;
- newProp = TRUE;
- break;
- default:
- break;
- };
- tic.next();
- };
- if (newProp && data->prop)
- {
- SetGInfoAttrs(data->prop,((struct opSet *) msg)->ops_GInfo,
- PGA_Top, olevel - data->min,
- PGA_Visible, 1,
- PGA_Total, data->max - data->min + 1,
- TAG_END);
- };
- break;
- };
- case GM_RENDER:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- retval = render(cl,(struct Gadget *) o,
- (struct gpRender *) msg,data);
- break;
- };
- case GM_HITTEST:
- {
- retval = GMR_GADGETHIT;
- break;
- };
- case GM_GOACTIVE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- ((struct Gadget *) o)->Flags |= GFLG_SELECTED;
- if (data->prop)
- {
- struct gpInput *gpi = (struct gpInput *) msg;
- if (gpi->gpi_Mouse.X >= 2 &&
- gpi->gpi_Mouse.X < ((struct Gadget *) o)->Width - 4 &&
- gpi->gpi_Mouse.Y >= 2 &&
- gpi->gpi_Mouse.Y < ((struct Gadget *) o)->Height - 4)
- {
- gpi->gpi_Mouse.X -= 2;
- gpi->gpi_Mouse.Y -= 2;
- retval = DoMethodA(data->prop,(Msg) msg);
- }
- else
- retval = GMR_NOREUSE;
- };
- break;
- };
- case GM_GOINACTIVE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- if (data->prop)
- retval = DoMethodA(data->prop,(Msg) msg);
- ((struct Gadget *) o)->Flags &= ~GFLG_SELECTED;
- break;
- };
- case GM_HANDLEINPUT:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- if (data->prop)
- {
- struct gpInput *gpi = (struct gpInput *) msg;
- gpi->gpi_Mouse.X -= 2;
- gpi->gpi_Mouse.Y -= 2;
- retval = DoMethodA(data->prop,(Msg) msg);
- };
- break;
- };
- default:
- {
- retval = DoSuperMethodA(cl,o,msg);
- break;
- };
- };
- return retval;
- }
-
- ULONG SliderClass::render(Class *cl, struct Gadget *g,
- struct gpRender *msg, struct InstanceData *data)
- {
- struct RastPort *rp;
- struct GadgetInfo *ginfo;
- if (msg->MethodID == OM_SET || msg->MethodID == OM_UPDATE)
- ginfo = ((struct opSet *) msg)->ops_GInfo
- else
- ginfo = msg->gpr_GInfo;
- if (!ginfo)
- return TRUE;
- UWORD *pens = ginfo->gi_DrInfo->dri_Pens;
- if (msg->MethodID == GM_RENDER)
- rp = msg->gpr_RPort
- else
- rp = ObtainGIRPort(ginfo);
- if (rp)
- {
- if (data->frame)
- {
- SetAttrs(data->frame,
- IA_Left,g->LeftEdge,
- IA_Top,g->TopEdge,
- IA_Width,g->Width,
- IA_Height,g->Height,
- TAG_END);
- DrawImageState(rp,(struct Image *) data->frame,
- 0, 0, IDS_NORMAL,ginfo->gi_DrInfo);
- };
- if (data->prop)
- {
- DoMethodA(data->prop,(Msg) msg);
- };
- if (msg->MethodID != GM_RENDER)
- ReleaseGIRPort(rp);
- return TRUE;
- };
- return FALSE;
- }
-
- VOID SliderClass::calcBorders(Class *cl, struct Gadget *g,
- struct InstanceData *data)
- {
- data->leftborder = 0;
- data->rightborder = 0;
- data->topborder = 0;
- data->bottomborder = 0;
- }
-
- WORD SliderClass::calcWidth(Class *cl, struct Gadget *g,
- struct InstanceData *data)
- {
- if (data->freedom == FREEVERT)
- return 15;
- return (data->max - data->min + 1) * 8;
- }
-
- WORD SliderClass::calcHeight(Class *cl, struct Gadget *g,
- struct InstanceData *data)
- {
- if (data->freedom == FREEHORIZ)
- return 13;
- return (data->max - data->min + 1) * 8;
- }
-
- // *************************************************************
-
- SliderClass BSliderC::sc;
-
- // *************************************************************
-
-