1 // GadgetBarImageClass.c
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>
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>
39 #include <proto/scalos.h>
41 #include <clib/alib_protos.h>
44 #include <datatypes/iconobject.h>
45 #include <scalos/scalos.h>
46 #include <scalos/GadgetBar.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
66 struct Window
*gbicl_Window
;
69 //----------------------------------------------------------------------------
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
),
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
)
115 d1(kprintf("%s/%s/%ld: MethodID=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, msg
->MethodID
));
117 switch (msg
->MethodID
)
120 Result
= GadgetBarImage_New(cl
, o
, msg
);
123 Result
= GadgetBarImage_Dispose(cl
, o
, msg
);
126 Result
= GadgetBarImage_Set(cl
, o
, msg
);
129 Result
= GadgetBarImage_Get(cl
, o
, msg
);
132 Result
= GadgetBarImage_Update(cl
, o
, msg
);
135 Result
= GadgetBarImage_Layout(cl
, o
, msg
);
138 Result
= GadgetBarImage_Render(cl
, o
, msg
);
140 case DTM_REMOVEDTOBJECT
:
141 Result
= GadgetBarImage_Remove(cl
, o
, msg
);
144 Result
= GadgetBarImage_HelpTest(cl
, o
, msg
);
151 Result
= DoSuperMethodA(cl
, o
, msg
);
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
);
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
));
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
,
190 ADTA_Screen
, iInfos
.xii_iinfos
.ii_Screen
,
193 DTA_ControlPanel
, FALSE
,
194 ADTA_OvertakeScreen
, FALSE
,
195 OBP_Precision
, PRECISION_GUI
,
198 d1(kprintf("%s/%s/%ld: Animation DTObject=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, inst
->gbicl_AnimDTObject
));
202 if (NULL
== inst
->gbicl_DtImage
&& NULL
== inst
->gbicl_AnimDTObject
)
204 CoerceMethod(cl
, o
, OM_DISPOSE
);
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
,
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
));
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
));
244 if (inst
->gbicl_DtImage
)
246 DisposeDatatypesImage(&inst
->gbicl_DtImage
);
247 inst
->gbicl_DtImage
= NULL
;
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
)
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
;
324 case GA_Top
: // required since gadgetclass attribute is [IS] - no support for [G]
325 *(opg
->opg_Storage
) = (ULONG
) gg
->TopEdge
;
327 case GA_Width
: // required since gadgetclass attribute is [IS] - no support for [G]
328 *(opg
->opg_Storage
) = (ULONG
) gg
->Width
;
330 case GA_Height
: // required since gadgetclass attribute is [IS] - no support for [G]
331 *(opg
->opg_Storage
) = (ULONG
) gg
->Height
;
334 Success
= DoSuperMethodA(cl
, o
, msg
);
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
)
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
,
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
,
388 (IPTR
) gpr
->gpr_GInfo
,
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__
));
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
,
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__
));
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
)
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
)
466 if (y
< 0 || y
>= Height
)
472 //----------------------------------------------------------------------------