forwarding build fix when MUIA_Scrollgroup_AutoBars is defined (NicJA).
[AROS-Contrib.git] / scalos / main / GadgetBarImageClass.c
blobf4d07762980f40e4ccd0e6fb15dbd5ecf7468b5d
1 // GadgetBarImageClass.c
2 // $Date$
3 // $Revision$
6 #include <exec/types.h>
7 #include <graphics/gels.h>
8 #include <graphics/rastport.h>
9 #include <intuition/classes.h>
10 #include <intuition/classusr.h>
11 #include <intuition/gadgetclass.h>
12 #include <intuition/newmouse.h>
13 #include <intuition/cghooks.h>
14 #include <utility/hooks.h>
15 #include <libraries/gadtools.h>
16 #include <datatypes/pictureclass.h>
17 #include <datatypes/animationclass.h>
18 #include <datatypes/animationclassext.h>
19 #include <workbench/workbench.h>
20 #include <workbench/startup.h>
21 #include <cybergraphx/cybergraphics.h>
22 #include <dos/dostags.h>
23 #include <dos/datetime.h>
25 #define __USE_SYSBASE
27 #include <proto/dos.h>
28 #include <proto/exec.h>
29 #include <proto/layers.h>
30 #include <proto/intuition.h>
31 #include <proto/graphics.h>
32 #include <proto/utility.h>
33 #include <proto/locale.h>
34 #include <proto/iconobject.h>
35 #include <proto/cybergraphics.h>
36 #include <proto/gadtools.h>
37 #include <proto/datatypes.h>
38 #include "debug.h"
39 #include <proto/scalos.h>
41 #include <clib/alib_protos.h>
43 #include <defs.h>
44 #include <datatypes/iconobject.h>
45 #include <scalos/scalos.h>
46 #include <scalos/GadgetBar.h>
48 #include <stdlib.h>
49 #include <stdio.h>
50 #include <string.h>
52 #include "scalos_structures.h"
53 #include "functions.h"
54 #include "Variables.h"
56 //----------------------------------------------------------------------------
58 // local data definitions
60 struct GadgetBarImageClassInst
62 struct internalScaWindowTask *gbicl_iwt;
63 struct DatatypesImage *gbicl_DtImage; // Picture DataTypes object
64 Object *gbicl_AnimDTObject; // Animation DataTypes object
65 BOOL gbicl_LayoutOk;
66 struct Window *gbicl_Window;
69 //----------------------------------------------------------------------------
71 // local functions
73 static SAVEDS(IPTR) INTERRUPT GadgetBarImageClassDispatcher(Class *cl, Object *o, Msg msg);
74 static IPTR GadgetBarImage_New(Class *cl, Object *o, Msg msg);
75 static ULONG GadgetBarImage_Dispose(Class *cl, Object *o, Msg msg);
76 static ULONG GadgetBarImage_Set(Class *cl, Object *o, Msg msg);
77 static ULONG GadgetBarImage_Get(Class *cl, Object *o, Msg msg);
78 static ULONG GadgetBarImage_Update(Class *cl, Object *o, Msg msg);
79 static ULONG GadgetBarImage_Layout(Class *cl, Object *o, Msg msg);
80 static ULONG GadgetBarImage_Render(Class *cl, Object *o, Msg msg);
81 static ULONG GadgetBarImage_Remove(Class *cl, Object *o, Msg msg);
82 static ULONG GadgetBarImage_HelpTest(Class *cl, Object *o, Msg msg);
83 static BOOL GadgetBarImage_PointInGadget(Object *o, WORD x, WORD y);
85 //----------------------------------------------------------------------------
87 // public data items :
89 //----------------------------------------------------------------------------
91 struct ScalosClass *initGadgetBarImageClass(const struct PluginClass *plug)
93 struct ScalosClass *GadgetBarImageClass;
95 GadgetBarImageClass = SCA_MakeScalosClass(plug->plug_classname,
96 plug->plug_superclassname,
97 sizeof(struct GadgetBarImageClassInst),
98 NULL);
100 if (GadgetBarImageClass)
102 // initialize the cl_Dispatcher Hook
103 SETHOOKFUNC(GadgetBarImageClass->sccl_class->cl_Dispatcher, GadgetBarImageClassDispatcher);
106 return GadgetBarImageClass;
109 //----------------------------------------------------------------------------
111 static SAVEDS(IPTR) INTERRUPT GadgetBarImageClassDispatcher(Class *cl, Object *o, Msg msg)
113 IPTR Result;
115 d1(kprintf("%s/%s/%ld: MethodID=%08lx\n", __FILE__, __FUNC__, __LINE__, msg->MethodID));
117 switch (msg->MethodID)
119 case OM_NEW:
120 Result = GadgetBarImage_New(cl, o, msg);
121 break;
122 case OM_DISPOSE:
123 Result = GadgetBarImage_Dispose(cl, o, msg);
124 break;
125 case OM_SET:
126 Result = GadgetBarImage_Set(cl, o, msg);
127 break;
128 case OM_GET:
129 Result = GadgetBarImage_Get(cl, o, msg);
130 break;
131 case OM_UPDATE:
132 Result = GadgetBarImage_Update(cl, o, msg);
133 break;
134 case GM_LAYOUT:
135 Result = GadgetBarImage_Layout(cl, o, msg);
136 break;
137 case GM_RENDER:
138 Result = GadgetBarImage_Render(cl, o, msg);
139 break;
140 case DTM_REMOVEDTOBJECT:
141 Result = GadgetBarImage_Remove(cl, o, msg);
142 break;
143 case GM_HELPTEST:
144 Result = GadgetBarImage_HelpTest(cl, o, msg);
145 break;
146 case GM_HITTEST:
147 return 0;
148 break;
150 default:
151 Result = DoSuperMethodA(cl, o, msg);
152 break;
155 return Result;
158 //----------------------------------------------------------------------------
160 static IPTR GadgetBarImage_New(Class *cl, Object *o, Msg msg)
162 struct opSet *ops = (struct opSet *) msg;
163 struct GadgetBarImageClassInst *inst;
164 struct ExtGadget *gg;
166 o = (Object *) DoSuperMethodA(cl, o, msg);
167 if (NULL == o)
168 return 0;
170 inst = INST_DATA(cl, o);
172 memset(inst, 0, sizeof(struct GadgetBarImageClassInst));
174 inst->gbicl_LayoutOk = FALSE;
176 inst->gbicl_iwt = (struct internalScaWindowTask *) GetTagData(GBIDTA_WindowTask, (IPTR)NULL, ops->ops_AttrList);
178 inst->gbicl_DtImage = CreateDatatypesImage((STRPTR) GetTagData(DTA_Name, (IPTR)NULL, ops->ops_AttrList), 0);
180 d1(KPrintF("%s/%s/%ld: gbicl_DtImage=%08lx\n", __FILE__, __FUNC__, __LINE__, inst->gbicl_DtImage));
182 #if 0
183 // animations are not supported ATM
184 if (NULL == inst->gbicl_DtImage)
186 inst->gbicl_AnimDTObject = NewDTObject((STRPTR) GetTagData(DTA_Name, NULL, ops->ops_AttrList),
187 DTA_SourceType, DTST_FILE,
188 DTA_GroupID, GID_ANIMATION,
189 ADTA_Remap, TRUE,
190 ADTA_Screen, iInfos.xii_iinfos.ii_Screen,
191 DTA_Immediate, TRUE,
192 DTA_Repeat, TRUE,
193 DTA_ControlPanel, FALSE,
194 ADTA_OvertakeScreen, FALSE,
195 OBP_Precision, PRECISION_GUI,
196 TAG_END);
198 d1(kprintf("%s/%s/%ld: Animation DTObject=%08lx\n", __FILE__, __FUNC__, __LINE__, inst->gbicl_AnimDTObject));
200 #endif
202 if (NULL == inst->gbicl_DtImage && NULL == inst->gbicl_AnimDTObject)
204 CoerceMethod(cl, o, OM_DISPOSE);
205 return 0;
208 gg = (struct ExtGadget *) o;
210 if (inst->gbicl_DtImage)
212 gg->Width = gg->BoundsWidth = inst->gbicl_DtImage->dti_BitMapHeader->bmh_Width;
213 gg->Height = gg->BoundsHeight = inst->gbicl_DtImage->dti_BitMapHeader->bmh_Height;
215 if (inst->gbicl_AnimDTObject)
217 IPTR Width = 0, Height = 0;
219 DoDTMethod(inst->gbicl_AnimDTObject, NULL, NULL, DTM_PROCLAYOUT, NULL, TRUE);
221 GetDTAttrs(inst->gbicl_AnimDTObject,
222 ADTA_Width, (IPTR) &Width,
223 ADTA_Height, (IPTR) &Height,
224 TAG_END);
226 gg->Width = gg->BoundsWidth = Width;
227 gg->Height = gg->BoundsHeight = Height;
230 d1(kprintf("%s/%s/%ld: Width=%ld Height=%ld\n", __FILE__, __FUNC__, __LINE__, gg->Width, gg->Height));
232 return (IPTR) o;
235 //----------------------------------------------------------------------------
237 static ULONG GadgetBarImage_Dispose(Class *cl, Object *o, Msg msg)
239 struct GadgetBarImageClassInst *inst = INST_DATA(cl, o);
241 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
242 d1(kprintf("%s/%s/%ld: Task=<%s>\n", __FILE__, __FUNC__, __LINE__, FindTask(NULL)->tc_Node.ln_Name));
243 #if 1
244 if (inst->gbicl_DtImage)
246 DisposeDatatypesImage(&inst->gbicl_DtImage);
247 inst->gbicl_DtImage = NULL;
249 #endif
250 if (inst->gbicl_AnimDTObject)
252 DisposeDTObject(inst->gbicl_AnimDTObject);
253 inst->gbicl_AnimDTObject = NULL;
256 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
258 return DoSuperMethodA(cl, o, msg);
261 //----------------------------------------------------------------------------
263 static ULONG GadgetBarImage_Set(Class *cl, Object *o, Msg msg)
265 struct GadgetBarImageClassInst *inst = INST_DATA(cl, o);
266 struct opSet *ops = (struct opSet *) msg;
267 struct ExtGadget *gg = (struct ExtGadget *) o;
269 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
271 inst->gbicl_LayoutOk = FALSE;
273 if (inst->gbicl_AnimDTObject)
275 DoMethodA(inst->gbicl_AnimDTObject, msg);
278 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
280 gg->BoundsLeftEdge = GetTagData(GA_Left, gg->BoundsLeftEdge, ops->ops_AttrList);
281 gg->BoundsTopEdge = GetTagData(GA_Top, gg->BoundsTopEdge, ops->ops_AttrList);
282 gg->BoundsWidth = GetTagData(GA_Width, gg->BoundsWidth, ops->ops_AttrList);
283 gg->BoundsHeight = GetTagData(GA_Height, gg->BoundsHeight, ops->ops_AttrList);
285 return DoSuperMethodA(cl, o, msg);
288 //----------------------------------------------------------------------------
290 static ULONG GadgetBarImage_Update(Class *cl, Object *o, Msg msg)
292 struct GadgetBarImageClassInst *inst = INST_DATA(cl, o);
294 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
296 if (inst->gbicl_AnimDTObject)
298 DoMethodA(inst->gbicl_AnimDTObject, msg);
301 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
303 return DoSuperMethodA(cl, o, msg);
306 //----------------------------------------------------------------------------
308 static ULONG GadgetBarImage_Get(Class *cl, Object *o, Msg msg)
310 struct opGet *opg = (struct opGet *) msg;
311 struct Gadget *gg = (struct Gadget *) o;
312 ULONG Success = TRUE;
314 if (NULL == opg->opg_Storage)
315 return 0;
317 *(opg->opg_Storage) = 0;
319 switch (opg->opg_AttrID)
321 case GA_Left: // required since gadgetclass attribute is [IS] - no support for [G]
322 *(opg->opg_Storage) = (ULONG) gg->LeftEdge;
323 break;
324 case GA_Top: // required since gadgetclass attribute is [IS] - no support for [G]
325 *(opg->opg_Storage) = (ULONG) gg->TopEdge;
326 break;
327 case GA_Width: // required since gadgetclass attribute is [IS] - no support for [G]
328 *(opg->opg_Storage) = (ULONG) gg->Width;
329 break;
330 case GA_Height: // required since gadgetclass attribute is [IS] - no support for [G]
331 *(opg->opg_Storage) = (ULONG) gg->Height;
332 break;
333 default:
334 Success = DoSuperMethodA(cl, o, msg);
335 break;
338 return Success;
341 //----------------------------------------------------------------------------
343 static ULONG GadgetBarImage_Layout(Class *cl, Object *o, Msg msg)
345 struct GadgetBarImageClassInst *inst = INST_DATA(cl, o);
346 d1(struct Gadget *gg = (struct Gadget *) o);
347 struct gpLayout *gpl = (struct gpLayout *) msg;
349 inst->gbicl_Window = gpl->gpl_GInfo->gi_Window;
351 if (inst->gbicl_AnimDTObject)
353 // SetDTAttrsA()
354 DoMethodA(inst->gbicl_AnimDTObject, msg);
356 d1(kprintf("%s/%s/%ld: Left=%ld Top=%ld\n", __FILE__, __FUNC__, __LINE__, gg->LeftEdge, gg->TopEdge));
357 d1(kprintf("%s/%s/%ld: Width=%ld Height=%ld\n", __FILE__, __FUNC__, __LINE__, gg->Width, gg->Height));
360 return DoSuperMethodA(cl, o, msg);
363 //----------------------------------------------------------------------------
365 static ULONG GadgetBarImage_Render(Class *cl, Object *o, Msg msg)
367 struct gpRender *gpr = (struct gpRender *) msg;
368 struct GadgetBarImageClassInst *inst = INST_DATA(cl, o);
369 struct Gadget *gg = (struct Gadget *) o;
371 d1(kprintf("%s/%s/%ld: Left=%ld Top=%ld\n", __FILE__, __FUNC__, __LINE__, gg->LeftEdge, gg->TopEdge));
373 if (inst->gbicl_DtImage)
375 DtImageDraw(inst->gbicl_DtImage,
376 gpr->gpr_RPort,
377 gg->LeftEdge,
378 gg->TopEdge,
379 gg->Width, gg->Height
382 if (inst->gbicl_AnimDTObject)
384 if (!inst->gbicl_LayoutOk)
386 DoDTMethod(inst->gbicl_AnimDTObject, gpr->gpr_GInfo->gi_Window, NULL,
387 GM_LAYOUT,
388 (IPTR) gpr->gpr_GInfo,
389 FALSE);
390 inst->gbicl_LayoutOk = TRUE;
393 d1(kprintf("%s/%s/%ld: Left=%ld Top=%ld\n", __FILE__, __FUNC__, __LINE__, \
394 ((struct Gadget *) inst->gbicl_AnimDTObject)->LeftEdge, ((struct Gadget *) inst->gbicl_AnimDTObject)->TopEdge));
396 DoDTMethodA(inst->gbicl_AnimDTObject, gpr->gpr_GInfo->gi_Window, NULL, msg);
398 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
401 return 1;
404 //----------------------------------------------------------------------------
406 static ULONG GadgetBarImage_Remove(Class *cl, Object *o, Msg msg)
408 struct GadgetBarImageClassInst *inst = INST_DATA(cl, o);
410 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
412 d1(kprintf("%s/%s/%ld: Task=<%s>\n", __FILE__, __FUNC__, __LINE__, FindTask(NULL)->tc_Node.ln_Name));
414 if (inst->gbicl_AnimDTObject)
416 DoDTMethod(inst->gbicl_AnimDTObject, inst->gbicl_Window, NULL,
417 ADTM_STOP, 0,
418 TAG_END);
420 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
422 // DoMethodA(inst->gbicl_AnimDTObject, msg);
424 RemoveDTObject(inst->gbicl_Window, inst->gbicl_AnimDTObject);
427 d1(kprintf("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
429 return DoSuperMethodA(cl, o, msg);
432 //----------------------------------------------------------------------------
434 static ULONG GadgetBarImage_HelpTest(Class *cl, Object *o, Msg msg)
436 struct gpHitTest *gpht = (struct gpHitTest *) msg;
438 d1(KPrintF("%s/%s/%ld: Object=%08lx x=%ld y=%ld\n", \
439 __FILE__, __FUNC__, __LINE__, o, gpht->gpht_Mouse.X, gpht->gpht_Mouse.Y));
441 if (GadgetBarImage_PointInGadget(o, gpht->gpht_Mouse.X, gpht->gpht_Mouse.Y))
443 d1(KPrintF("%s/%s/%ld: Result=GMR_HELPHIT\n", __FILE__, __FUNC__, __LINE__));
444 return GMR_HELPHIT;
447 d1(KPrintF("%s/%s/%ld: Result=GMR_NOHELPHIT\n", __FILE__, __FUNC__, __LINE__));
449 return GMR_NOHELPHIT;
452 //----------------------------------------------------------------------------
454 static BOOL GadgetBarImage_PointInGadget(Object *o, WORD x, WORD y)
456 IPTR Width, Height;
458 GetAttr(GA_Width, o, &Width);
459 GetAttr(GA_Height, o, &Height);
461 d1(KPrintF("%s/%s/%ld: Width=%ld Height=%ld\n", \
462 __FILE__, __FUNC__, __LINE__, Width, Height));
464 if (x < 0 || x >= Width)
465 return FALSE;
466 if (y < 0 || y >= Height)
467 return FALSE;
469 return TRUE;
472 //----------------------------------------------------------------------------