6 #include <exec/types.h>
7 #include <graphics/gfxmacros.h>
8 #include <graphics/gfxbase.h>
9 #include <graphics/text.h>
10 #include <graphics/rpattr.h>
11 #include <libraries/dos.h>
12 #include <workbench/startup.h>
13 #include <intuition/intuition.h>
14 #include <intuition/intuitionbase.h>
15 #include <intuition/gadgetclass.h>
16 #include <intuition/screens.h>
17 #include <intuition/cghooks.h>
21 #include <proto/dos.h>
22 #include <proto/exec.h>
23 #include <proto/layers.h>
24 #include <proto/intuition.h>
25 #include <proto/graphics.h>
26 #include <proto/utility.h>
27 #include <proto/iconobject.h>
29 #include <proto/scalos.h>
31 #include <clib/alib_protos.h>
43 #include <scalos/GadgetBar.h>
45 #include "scalos_structures.h"
46 #include "functions.h"
47 #include "Variables.h"
49 //----------------------------------------------------------------------------
51 // ButtonGadgetClass instance data
52 struct ButtonGadgetInstance
54 ULONG bgi_Hidden
; // Flag: this gadget is hidden
57 //----------------------------------------------------------------------------
59 // The functions in this module
61 static SAVEDS(IPTR
) INTERRUPT
dispatchButtonGadgetClass(Class
*cl
, Object
*o
, Msg msg
);
62 static IPTR
ButtonGadgetNew(Class
*cl
, Object
*o
, Msg msg
);
63 static ULONG
ButtonGadget_Set(Class
*cl
, Object
*o
, Msg msg
);
64 static ULONG
ButtonGadget_Get(Class
*cl
, Object
*o
, Msg msg
);
65 static ULONG
ButtonGadget_Render(Class
*cl
, Object
*o
, Msg msg
);
67 //----------------------------------------------------------------------------
69 /***********************************************************/
70 /** Make the class and set up the dispatcher's hook **/
71 /***********************************************************/
72 struct ScalosClass
*initButtonGadgetClass(const struct PluginClass
*plug
)
74 struct ScalosClass
*ButtonGadgetClass
;
76 ButtonGadgetClass
= SCA_MakeScalosClass(plug
->plug_classname
,
77 plug
->plug_superclassname
,
78 sizeof(struct ButtonGadgetInstance
),
80 d1(KPrintF("%s/%s/%ld ButtonGadgetClass=%08lx plug_classname=<%s> plug_superclassname=<%s>\n",
81 __FILE__
, __FUNC__
, __LINE__
, ButtonGadgetClass
, plug
->plug_classname
, plug
->plug_superclassname
));
83 if (ButtonGadgetClass
)
85 // initialize the cl_Dispatcher Hook
86 SETHOOKFUNC(ButtonGadgetClass
->sccl_class
->cl_Dispatcher
, dispatchButtonGadgetClass
);
89 return ButtonGadgetClass
;
92 //----------------------------------------------------------------------------
94 /**************************************************************************/
95 /********** The ButtonGadgetCLASS class dispatcher *********/
96 /**************************************************************************/
97 static SAVEDS(IPTR
) INTERRUPT
dispatchButtonGadgetClass(Class
*cl
, Object
*o
, Msg msg
)
101 d1(KPrintF("%s/%s/%ld Class=%l08x SuperClass=%08lx Method=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, cl
, cl
->cl_Super
, msg
->MethodID
));
103 switch (msg
->MethodID
)
106 Result
= ButtonGadgetNew(cl
, o
, msg
);
109 Result
= ButtonGadget_Set(cl
, o
, msg
);
112 Result
= ButtonGadget_Get(cl
, o
, msg
);
115 Result
= ButtonGadget_Render(cl
, o
, msg
);
118 Result
= DoSuperMethodA(cl
, o
, msg
);
125 //----------------------------------------------------------------------------
127 static IPTR
ButtonGadgetNew(Class
*cl
, Object
*o
, Msg msg
)
129 BOOL Success
= FALSE
;
132 struct opSet
*ops
= ((struct opSet
*) msg
);
133 struct ButtonGadgetInstance
*inst
;
135 o
= (Object
*) DoSuperMethodA(cl
, o
, msg
);
136 d1(KPrintF("%s/%s/%ld: o=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, o
));
140 /* Initial local instance data */
141 inst
= INST_DATA(cl
, o
);
142 memset(inst
, 0, sizeof(struct ButtonGadgetInstance
));
144 inst
->bgi_Hidden
= GetTagData(GBDTA_Hidden
, FALSE
, ops
->ops_AttrList
);
151 DoMethod(o
, OM_DISPOSE
);
158 //----------------------------------------------------------------------------
160 static ULONG
ButtonGadget_Get(Class
*cl
, Object
*o
, Msg msg
)
162 struct ButtonGadgetInstance
*inst
= INST_DATA(cl
, o
);
163 struct opGet
*opg
= (struct opGet
*) msg
;
164 struct Gadget
*gg
= (struct Gadget
*) o
;
165 ULONG Success
= TRUE
;
167 if (NULL
== opg
->opg_Storage
)
170 *(opg
->opg_Storage
) = 0;
172 switch (opg
->opg_AttrID
)
174 case GA_Left
: // required since gadgetclass attribute is [IS] - no support for [G]
175 *(opg
->opg_Storage
) = (IPTR
) gg
->LeftEdge
;
177 case GA_Top
: // required since gadgetclass attribute is [IS] - no support for [G]
178 *(opg
->opg_Storage
) = (IPTR
) gg
->TopEdge
;
180 case GA_Width
: // required since gadgetclass attribute is [IS] - no support for [G]
181 *(opg
->opg_Storage
) = (IPTR
) gg
->Width
;
183 case GA_Height
: // required since gadgetclass attribute is [IS] - no support for [G]
184 *(opg
->opg_Storage
) = (IPTR
) gg
->Height
;
187 *(opg
->opg_Storage
) = (IPTR
) inst
->bgi_Hidden
;
190 Success
= DoSuperMethodA(cl
, o
, msg
);
197 //----------------------------------------------------------------------------
199 static ULONG
ButtonGadget_Set(Class
*cl
, Object
*o
, Msg msg
)
201 struct ButtonGadgetInstance
*inst
= INST_DATA(cl
, o
);
202 struct opSet
*ops
= (struct opSet
*) msg
;
203 struct TagItem
*TagList
= ops
->ops_AttrList
;
205 struct Gadget
*gg
= (struct Gadget
*) o
;
206 BOOL NeedRerender
= FALSE
;
209 while ((tag
= NextTagItem(&TagList
)))
214 if ((tag
->ti_Data
&& !(gg
->Flags
& GFLG_DISABLED
)) ||
215 (!tag
->ti_Data
&& (gg
->Flags
& GFLG_DISABLED
)))
217 d1(KPrintF("%s/%s/%ld o=%l08x Flags=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, o
, gg
->Flags
));
222 inst
->bgi_Hidden
= tag
->ti_Data
;
229 Result
= DoSuperMethodA(cl
, o
, msg
);
231 if (NeedRerender
&& !inst
->bgi_Hidden
)
235 rp
= ObtainGIRPort(ops
->ops_GInfo
);
236 d1(KPrintF("%s/%s/%ld: o=%08lx rp=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, o
, rp
));
251 //----------------------------------------------------------------------------
253 static ULONG
ButtonGadget_Render(Class
*cl
, Object
*o
, Msg msg
)
255 struct gpRender
*gpr
= (struct gpRender
*) msg
;
256 struct Gadget
*gg
= (struct Gadget
*) o
;
259 d1(KPrintF("%s/%s/%ld o=%l08x Flags=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, o
, gg
->Flags
));
261 if (gg
->Flags
& GFLG_DISABLED
)
263 Object
*Image
= NULL
;
265 GetAttr(GA_Image
, o
, (APTR
) &Image
);
267 if (NULL
== Image
&& (gg
->Flags
& GFLG_GADGIMAGE
))
268 Image
= (Object
*) gg
->GadgetRender
;
270 d1(KPrintF("%s/%s/%ld: Image=%l08x\n", __FILE__
, __FUNC__
, __LINE__
, Image
));
274 IPTR SupportsDisable
= FALSE
;
278 GetAttr(IA_SupportsDisable
, Image
, &SupportsDisable
);
279 d1(KPrintF("%s/%s/%ld: SupportsDisable=%ld\n", __FILE__
, __FUNC__
, __LINE__
, SupportsDisable
));
282 DrawImageState(gpr
->gpr_RPort
,
283 (struct Image
*) Image
,
287 gpr
->gpr_GInfo
->gi_DrInfo
);
291 static UWORD Pattern
[] =
294 DrawImageState(gpr
->gpr_RPort
,
295 (struct Image
*) Image
,
299 gpr
->gpr_GInfo
->gi_DrInfo
);
302 d1(kprintf("%s/%s/%ld: DrawGhosted\n", __FILE__
, __FUNC__
, __LINE__
));
304 SetABPenDrMd(gpr
->gpr_RPort
,
305 gpr
->gpr_GInfo
->gi_DrInfo
->dri_Pens
[SHADOWPEN
], 0, JAM1
);
306 SetAfPt(gpr
->gpr_RPort
, Pattern
, 1);
307 RectFill(gpr
->gpr_RPort
,
310 gg
->LeftEdge
+ gg
->Width
- 1,
311 gg
->TopEdge
+ gg
->Height
- 1);
315 Result
= DoSuperMethodA(cl
, o
, msg
);
319 Result
= DoSuperMethodA(cl
, o
, msg
);
325 //----------------------------------------------------------------------------