home *** CD-ROM | disk | FTP | other *** search
- #include <classes/BOOPSI/gadgets.h>
- #include <classes/BOOPSI/boopsilib.h>
-
- #include <intuition/icclass.h>
- #include <exec/libraries.h>
-
- #pragma -
- #include <pragma/utility_lib.h>
- #include <clib/alib_protos.h>
- #include <pragma/intuition_lib.h>
- #include <pragma/graphics_lib.h>
- #include <graphics/gfxmacros.h>
- #pragma +
-
- extern struct Library *IntuitionBase;
-
- struct InstanceData {
- struct TextAttr *tattr;
- struct TextFont *font;
- WORD leftborder;
- WORD rightborder;
- WORD topborder;
- WORD bottomborder;
- UBYTE labelmark;
- Object *string;
- Object *frame;
- ULONG columns;
- struct LabelText *label;
- };
-
- static Tag stringtags[] = {
- STRA_Font, STRA_LabelMark,
- STRA_LeftBorder, STRA_RightBorder, STRA_TopBorder, STRA_BottomBorder,
- STRA_AutoWidth, STRA_AutoHeight, STRA_Columns,
- GA_Text,
- TAG_END };
-
- StringClass::StringClass()
- : BoopsiClass(sizeof(struct InstanceData),(ULONG (*)()) &dispatcher,GADGETCLASS,NULL)
- {
- }
-
- ULONG StringClass::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->labelmark = '_';
- data->columns = 0;
- TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
- while (!tic.isDone()) {
- /* register */ ULONG ticData = tic.itemData();
- switch (tic.itemTag())
- {
- case STRA_Font:
- data->tattr = (struct TextAttr *) ticData;
- break;
- case STRA_LabelMark:
- data->labelmark = (UBYTE) ticData;
- break;
- case STRA_Columns:
- data->columns = (ULONG) ticData;
- break;
- default:
- break;
- };
- tic.next();
- };
- if (data->tattr)
- {
- data->font = OpenFont(data->tattr);
- };
- data->label = AllocLText(
- (STRPTR) ((struct Gadget *) object)->GadgetText,
- data->tattr,1,0,JAM2,data->labelmark);
- calcBorders(cl,(struct Gadget *) object, data);
- data->frame = (Object *) NewObject(NULL,FRAMEICLASS,
- IA_FrameType, FRAME_RIDGE,
- IA_Recessed, FALSE,
- TAG_END);
- FilterTagItems(((struct opSet *) msg)->ops_AttrList,
- stringtags, TAGFILTER_NOT);
- data->string = (Object *) NewObjectA(NULL,STRGCLASS,
- ((struct opSet *) msg)->ops_AttrList);
- if (data->string)
- {
- SetAttrs(data->string,
- GA_Left, ((struct Gadget *) object)->LeftEdge + 6,
- GA_Top, ((struct Gadget *) object)->TopEdge + 2,
- GA_Width, ((struct Gadget *) object)->Width - 12,
- GA_Height, ((struct Gadget *) object)->Height - 4,
- ICA_TARGET,object,
- STRINGA_Font,data->font,
- TAG_END);
- };
- retval = (ULONG) object;
- };
- break;
- };
- case OM_DISPOSE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- if (data->string)
- DisposeObject(data->string);
- if (data->frame)
- DisposeObject(data->frame);
- FreeLText(data->label);
- 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 STRA_Font:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->tattr;
- retval = TRUE;
- break;
- case STRA_LabelMark:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->labelmark;
- retval = TRUE;
- break;
- case STRA_LeftBorder:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->leftborder;
- retval = TRUE;
- break;
- case STRA_RightBorder:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->rightborder;
- retval = TRUE;
- break;
- case STRA_TopBorder:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->topborder;
- retval = TRUE;
- break;
- case STRA_BottomBorder:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->bottomborder;
- retval = TRUE;
- break;
- case STRA_AutoWidth:
- *(((struct opGet *) msg)->opg_Storage) =
- (ULONG) calcWidth(cl,(struct Gadget *) o, data);
- retval = TRUE;
- break;
- case STRA_AutoHeight:
- *(((struct opGet *) msg)->opg_Storage) =
- (ULONG) calcHeight(cl,(struct Gadget *) o, data);
- retval = TRUE;
- break;
- case STRA_Columns:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->columns;
- retval = TRUE;
- break;
- default:
- if (!(retval = DoSuperMethodA(cl,o,msg)))
- {
- if (data->string)
- retval = DoMethodA(data->string,(Msg) msg);
- };
- break;
- };
- break;
- };
- case OM_SET:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- BOOL recalcIt = FALSE;
- TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
- while (!tic.isDone()) {
- /* register */ ULONG ticData = tic.itemData();
- switch (tic.itemTag())
- {
- case GA_Top:
- case GA_Left:
- case GA_Width:
- case GA_Height:
- recalcIt = TRUE;
- break;
- case STRA_Font:
- if (data->font)
- {
- CloseFont(data->font);
- data->font = NULL;
- };
- data->tattr = (struct TextAttr *) ticData;
- if (data->tattr)
- data->font = OpenFont(data->tattr);
- if (data->string)
- SetGInfoAttrs(data->string,((struct opSet *) msg)->ops_GInfo,
- STRINGA_Font,data->font,
- TAG_END);
- ChangeLTextFont(data->label,data->tattr);
- calcBorders(cl,(struct Gadget *) o, data);
- break;
- case STRA_Columns:
- data->columns = (ULONG) ticData;
- break;
- default:
- break;
- };
- tic.next();
- };
- retval = DoSuperMethodA(cl,o,msg);
- if (data->string)
- {
- FilterTagItems(((struct opSet *) msg)->ops_AttrList,
- stringtags, TAGFILTER_NOT);
- DoMethodA(data->string,(Msg) msg);
- if (recalcIt)
- {
- SetGInfoAttrs(data->string,((struct opSet *) msg)->ops_GInfo,
- GA_Left, ((struct Gadget *) o)->LeftEdge + 6,
- GA_Top, ((struct Gadget *) o)->TopEdge + 2,
- GA_Width, ((struct Gadget *) o)->Width - 12,
- GA_Height, ((struct Gadget *) o)->Height - 4,
- 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 gpInput *gpi = (struct gpInput *) msg;
- gpi->gpi_Mouse.X -= 6;
- gpi->gpi_Mouse.Y -= 2;
- if (data->string)
- retval = DoMethodA(data->string,(Msg) msg)
- else
- retval = GMR_NOREUSE;
- break;
- };
- case GM_GOINACTIVE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- if (data->string)
- retval = DoMethodA(data->string,(Msg) msg);
- break;
- };
- case GM_HANDLEINPUT:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- struct gpInput *gpi = (struct gpInput *) msg;
- gpi->gpi_Mouse.X -= 6;
- gpi->gpi_Mouse.Y -= 3;
- if (data->string)
- retval = DoMethodA(data->string,(Msg) msg)
- else
- retval = GMR_NOREUSE;
- break;
- };
- default:
- {
- retval = DoSuperMethodA(cl,o,msg);
- break;
- };
- };
- return retval;
- }
-
- ULONG StringClass::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 (IntuitionBase->lib_Version >= 39)
- {
- 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);
- };
- }
- else {
- SetAPen(rp,pens[SHINEPEN]);
- SetDrMd(rp,JAM1);
- Move(rp,g->LeftEdge, g->TopEdge);
- Draw(rp,g->LeftEdge, g->TopEdge + g->Height - 1);
- Move(rp,g->LeftEdge + 1, g->TopEdge);
- Draw(rp,g->LeftEdge + 1, g->TopEdge + g->Height - 2);
- Move(rp,g->LeftEdge, g->TopEdge);
- Draw(rp,g->LeftEdge + g->Width - 2, g->TopEdge);
- Move(rp,g->LeftEdge + g->Width - 4, g->TopEdge + 2);
- Draw(rp,g->LeftEdge + g->Width - 4, g->TopEdge + g->Height - 2);
- Move(rp,g->LeftEdge + g->Width - 3, g->TopEdge + 1);
- Draw(rp,g->LeftEdge + g->Width - 3, g->TopEdge + g->Height - 2);
- Move(rp,g->LeftEdge + 3, g->TopEdge + g->Height - 2);
- Draw(rp,g->LeftEdge + g->Width - 3, g->TopEdge + g->Height - 2);
- SetAPen(rp,pens[SHADOWPEN]);
- Move(rp,g->LeftEdge + 2, g->TopEdge + 1);
- Draw(rp,g->LeftEdge + 2, g->TopEdge + g->Height - 2);
- Move(rp,g->LeftEdge + 3, g->TopEdge + 1);
- Draw(rp,g->LeftEdge + 3, g->TopEdge + g->Height - 3);
- Move(rp,g->LeftEdge + 2, g->TopEdge + 1);
- Draw(rp,g->LeftEdge + g->Width - 4, g->TopEdge + 1);
- Move(rp,g->LeftEdge + g->Width - 2, g->TopEdge + 1);
- Draw(rp,g->LeftEdge + g->Width - 2, g->TopEdge + g->Height - 1);
- Move(rp,g->LeftEdge + g->Width - 1, g->TopEdge);
- Draw(rp,g->LeftEdge + g->Width - 1, g->TopEdge + g->Height - 1);
- Move(rp,g->LeftEdge + 1, g->TopEdge + g->Height - 1);
- Draw(rp,g->LeftEdge + g->Width - 1, g->TopEdge + g->Height - 1);
- };
- if (data->font && g->GadgetText)
- {
- PrintLText(rp,data->label,
- g->LeftEdge - data->leftborder, g->TopEdge,
- data->leftborder, g->Height,
- STADJUST_Left);
- };
- if (data->string)
- {
- DoMethodA(data->string,(Msg) msg);
- };
- if (msg->MethodID != GM_RENDER)
- ReleaseGIRPort(rp);
- return TRUE;
- };
- return FALSE;
- }
-
- VOID StringClass::calcBorders(Class *cl, struct Gadget *g,
- struct InstanceData *data)
- {
- data->leftborder = 0;
- data->rightborder = 0;
- data->topborder = 0;
- data->bottomborder = 0;
- if (data->tattr && g->GadgetText)
- {
- data->leftborder = MeasureLText(data->label) + 4;
- };
- }
-
- WORD StringClass::calcWidth(Class *cl, struct Gadget *g,
- struct InstanceData *data)
- {
- if (data->tattr && data->string)
- {
- if (data->columns != 0)
- return MeasureTextLength("0",data->tattr)*data->columns + 12;
- WORD maxChars = (((struct StringInfo *) ((struct Gadget *) data->string)->SpecialInfo)->MaxChars);
- if (maxChars > 25)
- maxChars = 25;
- if (maxChars == 0)
- maxChars = 12;
- return MeasureTextLength("0",data->tattr)*maxChars + 12;
- };
- return 100;
- }
-
- WORD StringClass::calcHeight(Class *cl, struct Gadget *g,
- struct InstanceData *data)
- {
- if (data->tattr)
- {
- return data->tattr->ta_YSize + 6;
- };
- return 14;
- }
-
- // *************************************************************
-
- StringClass BStringC::lc;
-
- // *************************************************************
-
- BIntegerC::BIntegerC(GadgetEventC *ev, WindowC &w, Tag tag1type, ...)
- : BGadgetC(ev,lc.boopsiclass(),NULL,w,(struct TagItem *) &tag1type)
- {
- set(get());
- };
-
- BIntegerC::BIntegerC(GadgetEventC *ev, WindowC &w, struct TagItem *tags)
- : BGadgetC(ev,lc.boopsiclass(),NULL,w,tags)
- {
- set(get());
- };
-
- StringClass BIntegerC::lc;
-