home *** CD-ROM | disk | FTP | other *** search
- #include <classes/BOOPSI/gadgets.h>
-
- #pragma -
- #include <pragma/utility_lib.h>
- #include <clib/alib_protos.h>
- #include <pragma/intuition_lib.h>
- #include <pragma/graphics_lib.h>
- #include <pragma/layers_lib.h>
- #pragma +
-
- static WORD Level2Gfx(UWORD lv, WORD l, WORD w)
- {
- return ((((ULONG) w) * lv) / 65536) + l;
- }
-
- static UWORD Gfx2Level(WORD g, WORD l, WORD w)
- {
- if (w)
- return (((ULONG) (g - l)) * 65536) / w;
- return 0;
- }
-
- struct InstanceData {
- UWORD level;
- BOOL horiz;
- WORD gfxlevel;
- WORD dist;
- BOOL autoredraw;
- WORD leftMargin;
- WORD rightMargin;
- };
-
- SplitviewClass::SplitviewClass()
- : BoopsiClass(sizeof(struct InstanceData),(ULONG (*)()) &dispatcher,GADGETCLASS,NULL)
- {
- }
-
- ULONG SplitviewClass::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->level = 32768;
- data->horiz = FALSE;
- data->autoredraw = FALSE;
- data->leftMargin = 0;
- data->rightMargin = 1;
- TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
- while (!tic.isDone()) {
- /* register */ ULONG ticData = tic.itemData();
- switch (tic.itemTag())
- {
- case SVA_Level:
- data->level = (UWORD) ticData;
- break;
- case SVA_Horiz:
- data->horiz = (BOOL) ticData;
- break;
- case SVA_AutoRedraw:
- data->autoredraw = (BOOL) ticData;
- break;
- case SVA_LUMargin:
- data->leftMargin = (WORD) ticData;
- break;
- case SVA_RBMargin:
- data->rightMargin = (WORD) ticData;
- break;
- default:
- break;
- };
- tic.next();
- };
- retval = (ULONG) object;
- };
- break;
- };
- case OM_DISPOSE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- 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 SVA_Level:
- *(((struct opGet *) msg)->opg_Storage) = data->level;
- retval = TRUE;
- break;
- case SVA_LUSize:
- if (data->horiz)
- *(((struct opGet *) msg)->opg_Storage) = Level2Gfx(data->level, 0, ((struct Gadget *) o)->Height) - 1
- else
- *(((struct opGet *) msg)->opg_Storage) = Level2Gfx(data->level, 0, ((struct Gadget *) o)->Width) - 1;
- retval = TRUE;
- break;
- case SVA_RBSize:
- if (data->horiz)
- *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->Height - Level2Gfx(data->level, 0, ((struct Gadget *) o)->Height) - 2
- else
- *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->Width - Level2Gfx(data->level, 0, ((struct Gadget *) o)->Width) - 2;
- retval = TRUE;
- break;
- case SVA_RBPosition:
- if (data->horiz)
- *(((struct opGet *) msg)->opg_Storage) = Level2Gfx(data->level, 0, ((struct Gadget *) o)->Height) + 2
- else
- *(((struct opGet *) msg)->opg_Storage) = Level2Gfx(data->level, 0, ((struct Gadget *) o)->Width) + 2;
- retval = TRUE;
- break;
- case SVA_LUMargin:
- *(((struct opGet *) msg)->opg_Storage) = data->leftMargin;
- retval = TRUE;
- break;
- case SVA_RBMargin:
- *(((struct opGet *) msg)->opg_Storage) = data->rightMargin;
- 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);
- while (!tic.isDone()) {
- /* register */ ULONG ticData = tic.itemData();
- switch (tic.itemTag())
- {
- case SVA_Level:
- data->level = (UWORD) ticData;
- break;
- case SVA_LUMargin:
- data->leftMargin = (WORD) ticData;
- break;
- case SVA_RBMargin:
- data->rightMargin = (WORD) ticData;
- break;
- default:
- break;
- };
- tic.next();
- };
- retval = DoSuperMethodA(cl,o,msg);
- 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:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- struct Gadget *g = (struct Gadget *) o;
- struct gpHitTest *m = (struct gpHitTest *) msg;
- if (data->horiz)
- {
- WORD gfxlevel = Level2Gfx(data->level, 0, g->Height);
- if (m->gpht_Mouse.Y >= gfxlevel &&
- m->gpht_Mouse.Y <= gfxlevel+1)
- retval = GMR_GADGETHIT
- else
- retval = 0;
- }
- else {
- WORD gfxlevel = Level2Gfx(data->level, 0, g->Width);
- if (m->gpht_Mouse.X >= gfxlevel &&
- m->gpht_Mouse.X <= gfxlevel+1)
- {
- retval = GMR_GADGETHIT;
- }
- else
- retval = 0;
- };
- break;
- };
- case GM_GOACTIVE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- if (((struct gpInput *) msg)->gpi_IEvent)
- {
- ((struct Gadget *) msg)->Flags |= GFLG_SELECTED;
- if (data->horiz)
- {
- data->gfxlevel = Level2Gfx(data->level,
- 0, ((struct Gadget *) o)->Height);
- data->dist = data->gfxlevel - ((struct gpInput *) msg)->gpi_Mouse.Y;
- }
- else {
- data->gfxlevel = Level2Gfx(data->level,
- 0, ((struct Gadget *) o)->Width);
- data->dist = data->gfxlevel - ((struct gpInput *) msg)->gpi_Mouse.X;
- };
- render(cl,(struct Gadget *) o,
- (struct gpRender *) msg,data,TRUE);
- struct GadgetInfo *ginfo = ((struct gpInput *) msg)->gpi_GInfo;
- LockLayers(&ginfo->gi_Screen->LayerInfo);
- LockLayerInfo(&ginfo->gi_Screen->LayerInfo);
- renderXor(cl,(struct Gadget *) o,
- (struct gpRender *) msg,data);
- retval = GMR_MEACTIVE;
- }
- else
- retval = GMR_NOREUSE;
- break;
- };
- case GM_GOINACTIVE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- renderXor(cl,(struct Gadget *) o,
- (struct gpRender *) msg,data);
- UnlockLayerInfo(&((struct gpGoInactive *) msg)->
- gpgi_GInfo->gi_Screen->LayerInfo);
- UnlockLayers(&((struct gpGoInactive *) msg)->
- gpgi_GInfo->gi_Screen->LayerInfo);
- ((struct Gadget *) o)->Flags &= ~GFLG_SELECTED;
- clear(cl,(struct Gadget *) o,
- (struct gpRender *) msg,data);
- if (data->horiz)
- {
- data->level = Gfx2Level(data->gfxlevel,
- 0, ((struct Gadget *) o)->Height);
- }
- else {
- data->level = Gfx2Level(data->gfxlevel,
- 0, ((struct Gadget *) o)->Width);
- };
- if (data->autoredraw)
- render(cl,(struct Gadget *) o,
- (struct gpRender *) msg,data);
- break;
- };
- case GM_HANDLEINPUT:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- struct gpInput *gpi = (struct gpInput *) msg;
- struct InputEvent *ie = gpi->gpi_IEvent;
- BOOL mouseOverGadget = ((gpi->gpi_Mouse.X >= 0) &&
- (gpi->gpi_Mouse.X < ((struct Gadget *) o)->Width) &&
- (gpi->gpi_Mouse.Y >= 0) &&
- (gpi->gpi_Mouse.Y < ((struct Gadget *) o)->Height));
- switch (ie->ie_Class)
- {
- case IECLASS_RAWMOUSE:
- {
- WORD nlevel;
- if (data->horiz)
- {
- WORD y;
- if (gpi->gpi_Mouse.Y < data->leftMargin)
- y = data->leftMargin
- else if (gpi->gpi_Mouse.Y >= ((struct Gadget *) o)->Height - data->rightMargin)
- y = ((struct Gadget *) o)->Height - data->rightMargin
- else
- y = gpi->gpi_Mouse.Y;
- nlevel = y + data->dist;
- }
- else {
- WORD x;
- if (gpi->gpi_Mouse.X < data->leftMargin)
- x = data->leftMargin
- else if (gpi->gpi_Mouse.X >= ((struct Gadget *) o)->Width - data->rightMargin)
- x = ((struct Gadget *) o)->Width - data->rightMargin
- else
- x = gpi->gpi_Mouse.X;
- nlevel = x + data->dist;
- };
- if (data->gfxlevel != nlevel)
- {
- renderXor(cl,(struct Gadget *) o,
- (struct gpRender *) msg,data);
- data->gfxlevel = nlevel;
- renderXor(cl,(struct Gadget *) o,
- (struct gpRender *) msg,data);
- };
- switch (ie->ie_Code)
- {
- case SELECTUP:
- if (mouseOverGadget)
- {
- retval = GMR_NOREUSE | GMR_VERIFY;
- }
- else {
- retval = GMR_NOREUSE;
- };
- break;
- case MENUDOWN:
- retval = GMR_REUSE;
- break;
- default:
- retval = GMR_MEACTIVE;
- break;
- };
- break;
- };
- default:
- retval = GMR_MEACTIVE;
- break;
- };
- break;
- };
- default:
- {
- retval = DoSuperMethodA(cl,o,msg);
- break;
- };
- };
- return retval;
- }
-
- ULONG SplitviewClass::render(Class *cl, struct Gadget *g,
- struct gpRender *msg, struct InstanceData *data, BOOL selected)
- {
- 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 FALSE;
- UWORD *pens = ginfo->gi_DrInfo->dri_Pens;
- if (msg->MethodID == GM_RENDER)
- rp = msg->gpr_RPort
- else
- rp = ObtainGIRPort(ginfo);
- if (rp)
- {
- LONG shine = pens[SHINEPEN];
- LONG shadow = pens[SHADOWPEN];
- if (selected)
- {
- LONG j = shine;
- shine = shadow;
- shadow = j;
- };
- if (data->horiz)
- {
- WORD y = Level2Gfx(data->level,g->TopEdge,g->Height);
- if (y >= g->TopEdge + g->Height - 1)
- y = g->TopEdge + g->Height - 2;
- SetDrMd(rp,JAM1);
- SetAPen(rp,shine);
- Move(rp,g->LeftEdge + g->Width - 2, y);
- Draw(rp,g->LeftEdge, y);
- Draw(rp,g->LeftEdge, y + 1);
- SetAPen(rp,shadow);
- Move(rp,g->LeftEdge + 1, y + 1);
- Draw(rp,g->LeftEdge + g->Width - 1, y + 1);
- Draw(rp,g->LeftEdge + g->Width - 1, y);
- }
- else {
- WORD x = Level2Gfx(data->level,g->LeftEdge,g->Width);
- if (x >= g->LeftEdge + g->Width - 1)
- x = g->LeftEdge + g->Width - 2;
- SetDrMd(rp,JAM1);
- SetAPen(rp,shine);
- Move(rp,x,g->TopEdge + g->Height - 2);
- Draw(rp,x,g->TopEdge);
- Draw(rp,x + 1,g->TopEdge);
- SetAPen(rp,shadow);
- Move(rp,x + 1,g->TopEdge + 1);
- Draw(rp,x + 1,g->TopEdge + g->Height - 1);
- Draw(rp,x,g->TopEdge + g->Height - 1);
- };
- if (msg->MethodID != GM_RENDER)
- ReleaseGIRPort(rp);
- return TRUE;
- };
- return FALSE;
- }
-
- ULONG SplitviewClass::renderXor(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 FALSE;
- UWORD *pens = ginfo->gi_DrInfo->dri_Pens;
- if (msg->MethodID == GM_RENDER)
- rp = msg->gpr_RPort
- else
- rp = ObtainGIRPort(ginfo);
- if (rp)
- {
- if (data->horiz)
- {
- WORD y = data->gfxlevel;
- if (y >= g->Height - 1)
- y = g->Height - 2;
- SetDrMd(rp,COMPLEMENT);
- RectFill(rp,g->LeftEdge,g->TopEdge + y,
- g->LeftEdge + g->Width - 1, g->TopEdge + y + 1);
- }
- else {
- WORD x = data->gfxlevel;
- if (x >= g->Width - 1)
- x = g->Width - 2;
- SetDrMd(rp,COMPLEMENT);
- RectFill(rp,g->LeftEdge + x,g->TopEdge,
- g->LeftEdge + x + 1, g->TopEdge + g->Height - 1);
- };
- if (msg->MethodID != GM_RENDER)
- ReleaseGIRPort(rp);
- return TRUE;
- };
- return FALSE;
- }
-
- ULONG SplitviewClass::clear(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 FALSE;
- UWORD *pens = ginfo->gi_DrInfo->dri_Pens;
- if (msg->MethodID == GM_RENDER)
- rp = msg->gpr_RPort
- else
- rp = ObtainGIRPort(ginfo);
- if (rp)
- {
- if (data->horiz)
- {
- WORD y = Level2Gfx(data->level,0,g->Height);
- if (y >= g->Height - 1)
- y = g->Height - 2;
- EraseRect(rp,g->LeftEdge,g->TopEdge + y,
- g->LeftEdge + g->Width - 1, g->TopEdge + y + 1);
- }
- else {
- WORD x = Level2Gfx(data->level,0,g->Width);
- if (x >= g->Width - 1)
- x = g->Width - 2;
- EraseRect(rp,g->LeftEdge + x,g->TopEdge,
- g->LeftEdge + x + 1, g->TopEdge + g->Height - 1);
- };
- if (msg->MethodID != GM_RENDER)
- ReleaseGIRPort(rp);
- return TRUE;
- };
- return FALSE;
- }
-
- // *************************************************************
-
- SplitviewClass BSplitviewC::svc;
-
- // *************************************************************
-
-