Re-introduced the fix which should make it possible to
[AROS-Contrib.git] / ScalosV2 / PanelViewClass.c
blob98f4896ad5e1b36b7851cd1ab5d5e2669f28f3e9
1 /*
2 ** Amiga Workbench® Replacement
3 **
4 ** (C) Copyright 1999,2000 Aliendesign
5 ** Stefan Sommerfeld, Jörg Rebenstorf
6 **
7 ** Redistribution and use in source and binary forms are permitted provided that
8 ** the above copyright notice and this paragraph are duplicated in all such
9 ** forms and that any documentation, advertising materials, and other
10 ** materials related to such distribution and use acknowledge that the
11 ** software was developed by Aliendesign.
12 ** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
13 ** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
14 ** MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17 #include <proto/alib.h>
18 #include <proto/utility.h>
19 #include <proto/intuition.h>
20 #include <proto/graphics.h>
21 #include <intuition/classusr.h>
22 #include <intuition/gadgetclass.h>
23 #include <graphics/gfx.h>
25 #include "Scalos.h"
26 #include "PanelViewClass.h"
27 #include "SubRoutines.h"
28 #include "WindowClass.h"
30 #include "scalos_protos.h"
31 #include "Debug.h"
33 /****** PanelView.scalos/--background ***************************************
35 * PanelView class is the group class for panel objects.
36 * It handles the input events from intuition and calls the apropriate
37 * methods of the assigned panel object.
39 *****************************************************************************
41 // /
43 /** Init
45 static ULONG PanelView_Init(struct SC_Class *cl, Object *obj, struct opSet *msg, struct PanelViewInst *inst)
47 if (SC_DoSuperMethodA(cl,obj,(Msg) msg))
49 if (!(inst->panel = (Object *) GetTagData(SCCA_PanelView_Panel,0,msg->ops_AttrList)))
51 SC_DoClassMethod(cl,NULL,(ULONG) obj,SCCM_Exit);
52 return(FALSE);
54 SC_DoSuperMethod(cl,obj,OM_ADDMEMBER,inst->panel);
56 SC_DoMethod(inst->panel,SCCM_Notify,SCCA_Panel_MinX,SCCV_EveryTime,obj,
57 3,SCCM_Set,SCCA_PanelView_MinX,SCCV_TriggerValue);
58 SC_DoMethod(inst->panel,SCCM_Notify,SCCA_Panel_MinY,SCCV_EveryTime,obj,
59 3,SCCM_Set,SCCA_PanelView_MinY,SCCV_TriggerValue);
60 SC_DoMethod(inst->panel,SCCM_Notify,SCCA_Panel_MaxX,SCCV_EveryTime,obj,
61 3,SCCM_Set,SCCA_PanelView_MaxX,SCCV_TriggerValue);
62 SC_DoMethod(inst->panel,SCCM_Notify,SCCA_Panel_MaxY,SCCV_EveryTime,obj,
63 3,SCCM_Set,SCCA_PanelView_MaxY,SCCV_TriggerValue);
65 SC_DoMethod(inst->panel,SCCM_Notify,SCCA_Panel_Left,SCCV_EveryTime,obj,
66 3,SCCM_Set,SCCA_PanelView_Left,SCCV_TriggerValue);
67 SC_DoMethod(inst->panel,SCCM_Notify,SCCA_Panel_Top,SCCV_EveryTime,obj,
68 3,SCCM_Set,SCCA_PanelView_Top,SCCV_TriggerValue);
69 return(TRUE);
71 return(FALSE);
73 // /
75 /** Setup
77 static ULONG PanelView_Setup(struct SC_Class *cl, Object *obj, struct SCCP_Area_Setup *msg, struct PanelViewInst *inst)
79 if (SC_DoSuperMethodA(cl,obj,(Msg) msg))
81 SC_SetAttrs(_scwinobj(obj),SCCA_Window_SliderRight,TRUE,SCCA_Window_SliderBottom,TRUE,TAG_DONE);
82 inst->idcmp = IDCMP_GADGETUP | IDCMP_GADGETDOWN;
83 SC_DoMethod(obj,SCCM_Area_SetIDCMP,0);
84 SC_DoMethod(_scwinobj(obj),SCCM_Window_DelayedShowObject,obj);
85 return(TRUE);
87 return(FALSE);
89 // /
91 /** Show
93 static void PanelView_Show(struct SC_Class *cl, Object *obj, struct SCCP_Area_Show *msg, struct PanelViewInst *inst)
95 SC_DoSuperMethodA(cl,obj,(Msg) msg);
96 inst->sliderright = (struct Gadget *) get(_scwinobj(obj),SCCA_Window_SliderRight);
97 inst->sliderbottom = (struct Gadget *) get(_scwinobj(obj),SCCA_Window_SliderBottom);
99 // /
101 /** DelayedShow
103 static void PanelView_DelayedShow(struct SC_Class *cl, Object *obj, Msg msg, struct PanelViewInst *inst)
105 SC_DoSuperMethodA(cl,obj,(Msg) msg);
106 SetGadgetAttrs(inst->sliderbottom,_scwindow(obj),NULL,PGA_Total,inst->maxx - inst->minx + 1,
107 PGA_Visible,get(inst->panel,SCCA_Area_InnerWidth),PGA_Top,inst->left - inst->minx,
108 TAG_DONE);
109 SetGadgetAttrs(inst->sliderright,_scwindow(obj),NULL,PGA_Total,inst->maxy - inst->miny + 1,
110 PGA_Visible,get(inst->panel,SCCA_Area_InnerHeight),PGA_Top,inst->top - inst->miny,
111 TAG_DONE);
113 // /
115 /** Hide
117 static void PanelView_Hide(struct SC_Class *cl, Object *obj, struct SCCP_Area_Hide *msg, struct PanelViewInst *inst)
119 SC_DoSuperMethodA(cl, obj, (Msg) msg);
121 // /
123 /** Set
125 static void PanelView_Set(struct SC_Class *cl, Object *obj, struct opSet *msg, struct PanelViewInst *inst)
127 struct TagItem *taglist = msg->ops_AttrList;
128 struct TagItem **tags = &taglist;
129 struct TagItem *tag;
130 BOOL newx = FALSE;
131 BOOL newy = FALSE;
133 while ((tag = NextTagItem(tags)))
135 switch (tag->ti_Tag)
137 case SCCA_PanelView_MinX :
138 inst->minx = tag->ti_Data;
139 newx = TRUE;
140 break;
141 case SCCA_PanelView_MaxX :
142 inst->maxx = tag->ti_Data;
143 DEBUG1("New MaxX: %ld\n",inst->maxx);
144 newx = TRUE;
145 break;
146 case SCCA_PanelView_Left :
147 inst->left = tag->ti_Data;
148 newx = TRUE;
149 break;
151 case SCCA_PanelView_MinY :
152 inst->miny = tag->ti_Data;
153 newy = TRUE;
154 break;
155 case SCCA_PanelView_MaxY :
156 inst->maxy = tag->ti_Data;
157 newy = TRUE;
158 break;
159 case SCCA_PanelView_Top :
160 inst->left = tag->ti_Data;
161 newy = TRUE;
162 break;
166 if (inst->minx > inst->left)
168 inst->left = inst->minx;
169 SC_SetAttrs(inst->panel,SCCA_Panel_Left,inst->left,TAG_DONE);
171 if (inst->miny > inst->top)
173 inst->top = inst->miny;
174 SC_SetAttrs(inst->panel,SCCA_Panel_Top,inst->top,TAG_DONE);
178 if (newx && inst->sliderbottom)
179 SetGadgetAttrs(inst->sliderbottom,_scwindow(obj),NULL,PGA_Total,inst->maxx - inst->minx + 1,
180 PGA_Visible,get(inst->panel,SCCA_Area_InnerWidth),PGA_Top,inst->left - inst->minx,
181 TAG_DONE);
182 if (newy && inst->sliderright)
183 SetGadgetAttrs(inst->sliderright,_scwindow(obj),NULL,PGA_Total,inst->maxy - inst->miny + 1,
184 PGA_Visible,get(inst->panel,SCCA_Area_InnerHeight),PGA_Top,inst->top - inst->miny,
185 TAG_DONE);
187 SC_DoSuperMethodA(cl, obj, (Msg) msg);
189 // /
191 /** SetIDCMP
193 static void PanelView_SetIDCMP(struct SC_Class *cl, Object *obj, struct SCCP_Area_SetIDCMP *msg, struct PanelViewInst *inst)
195 msg->IDCMP |= inst->idcmp;
196 SC_DoSuperMethodA(cl,obj,(Msg) msg);
198 // /
200 /** Get
202 static ULONG PanelView_Get(struct SC_Class *cl, Object *obj, struct opGet *msg, struct PanelViewInst *inst)
204 if (msg->opg_AttrID == SCCA_PanelView_Left)
206 *(msg->opg_Storage) = (ULONG) inst->left;
207 return( TRUE );
209 if (msg->opg_AttrID == SCCA_PanelView_Top)
211 *(msg->opg_Storage) = (ULONG) inst->top;
212 return( TRUE );
214 return(SC_DoSuperMethodA(cl,obj,(Msg) msg));
216 // /
218 /** HandleInput
220 static void PanelView_HandleInput(struct SC_Class *cl, Object *obj, struct SCCP_Area_HandleInput *msg, struct PanelViewInst *inst)
222 ULONG gadid = ((struct Gadget *) msg->imsg->IAddress)->GadgetID;
224 SC_DoSuperMethodA(cl,obj,(Msg) msg);
226 switch (msg->imsg->Class)
228 case IDCMP_MOUSEMOVE :
229 switch (inst->movegadid)
231 case SLIDERGADID_BOTTOM :
232 inst->left = get((Object *) inst->sliderbottom,PGA_Top) + inst->minx;
233 SC_SetAttrs(inst->panel,SCCA_Panel_Left,inst->left,TAG_DONE);
234 break;
235 case SLIDERGADID_RIGHT :
236 inst->top = get((Object *) inst->sliderright,PGA_Top) + inst->miny;
237 SC_SetAttrs(inst->panel,SCCA_Panel_Top,inst->top,TAG_DONE);
238 break;
241 case IDCMP_GADGETDOWN :
242 if ((gadid == SLIDERGADID_BOTTOM) || (gadid == SLIDERGADID_RIGHT))
244 inst->movegadid = gadid;
245 inst->idcmp |= IDCMP_MOUSEMOVE;
246 SC_DoMethod(obj,SCCM_Area_SetIDCMP,0);
248 break;
250 case IDCMP_GADGETUP :
251 if ((gadid == SLIDERGADID_BOTTOM) || (gadid == SLIDERGADID_RIGHT))
253 switch (inst->movegadid)
255 case SLIDERGADID_BOTTOM :
256 inst->left = get((Object *) inst->sliderbottom,PGA_Top) + inst->minx;
257 SC_SetAttrs(inst->panel,SCCA_Panel_Left,inst->left,TAG_DONE);
258 break;
259 case SLIDERGADID_RIGHT :
260 inst->top = get((Object *) inst->sliderright,PGA_Top) + inst->miny;
261 SC_SetAttrs(inst->panel,SCCA_Panel_Top,inst->top,TAG_DONE);
262 break;
264 inst->movegadid = 0;
265 inst->idcmp &= ~IDCMP_MOUSEMOVE;
266 SC_DoMethod(obj,SCCM_Area_SetIDCMP,0);
268 break;
272 // /
274 /*-------------------------- MethodList --------------------------------*/
276 struct SC_MethodData PanelViewMethods[] =
278 { SCCM_Init,(ULONG) PanelView_Init, 0, 0, NULL },
279 { SCCM_Area_Setup,(ULONG) PanelView_Setup, 0, 0, NULL },
280 { SCCM_Area_Show,(ULONG) PanelView_Show, 0, 0, NULL },
281 { SCCM_Area_Hide, (ULONG) PanelView_Hide, 0, 0, NULL },
282 { OM_SET, (ULONG) PanelView_Set, 0, 0, NULL },
283 { OM_GET, (ULONG) PanelView_Get, 0, 0, NULL },
284 { SCCM_Area_SetIDCMP,(ULONG) PanelView_SetIDCMP, 0, 0, NULL },
285 { SCCM_Area_HandleInput,(ULONG) PanelView_HandleInput, 0, 0, NULL },
286 { SCCM_Area_DelayedShow,(ULONG) PanelView_DelayedShow, 0, 0, NULL },
287 { SCMETHOD_DONE, NULL, 0, 0, NULL }