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>
- #include <graphics/gfxmacros.h>
- #pragma +
-
- #define ACTIVE_None 0
- #define ACTIVE_List 1
- #define ACTIVE_VScroller 2
- #define ACTIVE_HScroller 3
-
- struct InstanceData {
- Object *list;
- Object *vscroller;
- Object *hscroller;
- BOOL vertscroller;
- BOOL horizscroller;
- ULONG activePart;
- Object *frame;
- };
-
- ListviewClass::ListviewClass()
- : BoopsiClass(sizeof(struct InstanceData),(ULONG (*)()) &dispatcher,GADGETCLASS,NULL)
- {
- }
-
- static struct TagItem vert2list[] = {
- { ASCA_Top, LSA_Top },
- { TAG_END}};
- static struct TagItem horiz2list[] = {
- { ASCA_Top, LSA_HorizLeft },
- { TAG_END}};
- static struct TagItem list2vert[] = {
- { LSA_Top, ASCA_Top },
- { LSA_Visible, ASCA_Visible },
- { LSA_Total, ASCA_Total },
- { TAG_END}};
- static struct TagItem list2horiz[] = {
- { LSA_HorizLeft, ASCA_Top },
- { LSA_HorizWidth, ASCA_Visible },
- { LSA_HorizTotal, ASCA_Total },
- { TAG_END}};
-
- ULONG ListviewClass::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->vscroller = NULL;
- data->hscroller = NULL;
- data->vertscroller = TRUE;
- data->horizscroller = TRUE;
- data->activePart = ACTIVE_None;
- data->frame = NULL;
- BOOL privframe = TRUE;
- BOOL readonly = FALSE;
- TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
- while (!tic.isDone()) {
- /* register */ ULONG ticData = tic.itemData();
- switch (tic.itemTag())
- {
- case LVA_VertScroller:
- data->vertscroller = (BOOL) ticData;
- break;
- case LVA_HorizScroller:
- data->horizscroller = (BOOL) ticData;
- break;
- case LSA_Frame:
- privframe = (ticData == NULL);
- break;
- case LSA_ReadOnly:
- readonly = (BOOL) ticData;
- break;
- default:
- break;
- };
- tic.next();
- };
- if (privframe)
- {
- data->frame = (Object *) NewObject(NULL,FRAMEICLASS,
- IA_EdgesOnly,TRUE,
- IA_Recessed,readonly,
- TAG_END);
- };
- WORD right = 0;
- WORD bottom = 0;
- if (data->horizscroller)
- {
- bottom = 10;
- };
- if (data->vertscroller)
- {
- right = 18;
- data->vscroller = (Object *) NewObject(ListviewClass::scrollerclass(),NULL,
- GA_Top,((struct Gadget *) object)->TopEdge,
- GA_Left,((struct Gadget *) object)->LeftEdge +
- ((struct Gadget *) object)->Width - right,
- GA_Width,right,
- GA_Height,((struct Gadget *) object)->Height - bottom,
- ASCA_Arrows,TRUE,
- ASCA_Freedom,FREEVERT,
- ICA_MAP, vert2list,
- TAG_END);
- };
- if (data->horizscroller)
- {
- data->hscroller = (Object *) NewObject(ListviewClass::scrollerclass(),NULL,
- GA_Top,((struct Gadget *) object)->TopEdge +
- ((struct Gadget *) object)->Height - bottom,
- GA_Left,((struct Gadget *) object)->LeftEdge,
- GA_Width,((struct Gadget *) object)->Width - right,
- GA_Height,bottom,
- ASCA_Arrows,TRUE,
- ASCA_Freedom,FREEHORIZ,
- ICA_MAP, horiz2list,
- TAG_END);
- };
- data->list = (Object *) NewObject(ListviewClass::listclass(),NULL,
- LSA_Frame,data->frame,
- TAG_MORE,((struct opSet *) msg)->ops_AttrList);
- if (data->list)
- {
- SetAttrs(data->list,
- GA_Width,((struct Gadget *) object)->Width - right,
- GA_Height,((struct Gadget *) object)->Height - bottom,
- ICA_TARGET, data->vscroller,
- ICA_MAP, list2vert,
- LSA_HorizTarget, data->hscroller,
- LSA_HorizMap, list2horiz,
- TAG_END);
- };
- if (data->vscroller)
- {
- SetAttrs(data->vscroller,
- ICA_TARGET, data->list,
- TAG_END);
- };
- if (data->hscroller)
- {
- SetAttrs(data->hscroller,
- ICA_TARGET, data->list,
- TAG_END);
- };
- retval = (ULONG) object;
- };
- break;
- };
- case OM_DISPOSE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- if (data->list)
- DisposeObject(data->list);
- if (data->vscroller)
- DisposeObject(data->vscroller);
- if (data->hscroller)
- DisposeObject(data->hscroller);
- if (data->frame)
- DisposeObject(data->frame);
- 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 LVA_VertScroller:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->vertscroller;
- retval = TRUE;
- break;
- case LVA_HorizScroller:
- *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->horizscroller;
- retval = TRUE;
- break;
- default:
- if (!(retval = DoSuperMethodA(cl,o,msg)))
- {
- if (data->list)
- retval = DoMethodA(data->list,(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:
- recalcIt = TRUE;
- break;
- case GA_Left:
- recalcIt = TRUE;
- break;
- case GA_Width:
- recalcIt = TRUE;
- break;
- case GA_Height:
- recalcIt = TRUE;
- break;
- case LSA_ReadOnly:
- if (data->frame)
- {
- SetAttrs(data->frame,
- IA_Recessed,ticData,
- TAG_END);
- };
- break;
- default:
- break;
- };
- tic.next();
- };
- retval = DoSuperMethodA(cl,o,msg);
- if (recalcIt)
- {
- WORD right = 0;
- WORD bottom = 0;
- if (data->hscroller)
- {
- bottom = 10;
- };
- if (data->vscroller)
- {
- right = 18;
- SetGInfoAttrs(data->vscroller,((struct opSet *) msg)->ops_GInfo,
- GA_Top,((struct Gadget *) o)->TopEdge,
- GA_Left,((struct Gadget *) o)->LeftEdge +
- ((struct Gadget *) o)->Width - right,
- GA_Width,right,
- GA_Height,((struct Gadget *) o)->Height - bottom,
- TAG_END);
- };
- if (data->hscroller)
- {
- SetGInfoAttrs(data->hscroller,((struct opSet *) msg)->ops_GInfo,
- GA_Top,((struct Gadget *) o)->TopEdge +
- ((struct Gadget *) o)->Height - bottom,
- GA_Left,((struct Gadget *) o)->LeftEdge,
- GA_Width,((struct Gadget *) o)->Width - right,
- GA_Height,bottom,
- TAG_END);
- };
- if (data->list)
- {
- DoMethodA(data->list,(Msg) msg);
- SetGInfoAttrs(data->list,((struct opSet *) msg)->ops_GInfo,
- GA_Top,((struct Gadget *) o)->TopEdge,
- GA_Left,((struct Gadget *) o)->LeftEdge,
- GA_Width,((struct Gadget *) o)->Width - right,
- GA_Height,((struct Gadget *) o)->Height - bottom,
- TAG_END);
- };
- }
- else {
- if (data->list)
- {
- DoMethodA(data->list,(Msg) 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:
- {
- retval = GMR_GADGETHIT;
- break;
- };
- case GM_GOACTIVE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- struct gpInput *gpi = (struct gpInput *) msg;
- if (data->list && gpi->gpi_Mouse.X >= 0 &&
- gpi->gpi_Mouse.X < ((struct Gadget *) data->list)->Width &&
- gpi->gpi_Mouse.Y >= 0 &&
- gpi->gpi_Mouse.Y < ((struct Gadget *) data->list)->Height)
- {
- ((struct Gadget *) o)->Flags |= GFLG_SELECTED;
- data->activePart = ACTIVE_List;
- retval = DoMethodA(data->list,(Msg) msg);
- }
- else if (data->vscroller &&
- gpi->gpi_Mouse.X >= ((struct Gadget *) o)->Width - ((struct Gadget *) data->vscroller)->Width &&
- gpi->gpi_Mouse.X < ((struct Gadget *) o)->Width &&
- gpi->gpi_Mouse.Y >= 0 &&
- gpi->gpi_Mouse.Y < ((struct Gadget *) data->vscroller)->Height)
- {
- ((struct Gadget *) o)->Flags |= GFLG_SELECTED;
- data->activePart = ACTIVE_VScroller;
- gpi->gpi_Mouse.X -= ((struct Gadget *) o)->Width -
- ((struct Gadget *) data->vscroller)->Width;
- retval = DoMethodA(data->vscroller,(Msg) msg);
- }
- else if (data->hscroller && gpi->gpi_Mouse.X >= 0 &&
- gpi->gpi_Mouse.X < ((struct Gadget *) data->hscroller)->Width &&
- gpi->gpi_Mouse.Y >= ((struct Gadget *) o)->Height - ((struct Gadget *) data->hscroller)->Height &&
- gpi->gpi_Mouse.Y < ((struct Gadget *) o)->Height)
- {
- ((struct Gadget *) o)->Flags |= GFLG_SELECTED;
- data->activePart = ACTIVE_HScroller;
- gpi->gpi_Mouse.Y -= ((struct Gadget *) o)->Height -
- ((struct Gadget *) data->hscroller)->Height;
- retval = DoMethodA(data->hscroller,(Msg) msg);
- }
- else
- retval = GMR_NOREUSE;
- break;
- };
- case GM_GOINACTIVE:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- ((struct Gadget *) o)->Flags &= ~GFLG_SELECTED;
- switch (data->activePart)
- {
- case ACTIVE_List:
- retval = DoMethodA(data->list,(Msg) msg);
- break;
- case ACTIVE_VScroller:
- retval = DoMethodA(data->vscroller,(Msg) msg);
- break;
- case ACTIVE_HScroller:
- retval = DoMethodA(data->hscroller,(Msg) msg);
- break;
- };
- data->activePart = ACTIVE_None;
- break;
- };
- case GM_HANDLEINPUT:
- {
- data = (struct InstanceData *) INST_DATA(cl,o);
- struct gpInput *gpi = (struct gpInput *) msg;
- switch (data->activePart)
- {
- case ACTIVE_List:
- retval = DoMethodA(data->list,(Msg) msg);
- break;
- case ACTIVE_VScroller:
- gpi->gpi_Mouse.X -= ((struct Gadget *) o)->Width -
- ((struct Gadget *) data->vscroller)->Width;
- retval = DoMethodA(data->vscroller,(Msg) msg);
- break;
- case ACTIVE_HScroller:
- gpi->gpi_Mouse.Y -= ((struct Gadget *) o)->Height -
- ((struct Gadget *) data->hscroller)->Height;
- retval = DoMethodA(data->hscroller,(Msg) msg);
- break;
- };
- break;
- };
- default:
- {
- retval = DoSuperMethodA(cl,o,msg);
- break;
- };
- };
- return retval;
- }
-
- ULONG ListviewClass::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->activePart == ACTIVE_None || data->activePart == ACTIVE_List)
- {
- if (data->list)
- DoMethodA(data->list,(Msg) msg);
- };
- if (data->activePart == ACTIVE_None || data->activePart == ACTIVE_VScroller)
- {
- if (data->vscroller)
- DoMethodA(data->vscroller,(Msg) msg);
- };
- if (data->activePart == ACTIVE_None || data->activePart == ACTIVE_HScroller)
- {
- if (data->hscroller)
- DoMethodA(data->hscroller,(Msg) msg);
- };
- if (msg->MethodID != GM_RENDER)
- ReleaseGIRPort(rp);
- return TRUE;
- };
- return FALSE;
- }
-
- ListClass ListviewClass::lic;
- ArrowScrollerClass ListviewClass::asc;
-
- // *************************************************************
-
- ListviewClass BListviewC::lc;
-
- // *************************************************************
-
-