using kprintf to output debug, which may be redirected to serial, is not a good idea...
[AROS-Contrib.git] / scalos / main / ButtonGadgetClass.c
blob8ef6d27e36e8ef042778862fd28363e533877811
1 // ButtonGadgetClass.c
2 // $Date$
3 // $Revision$
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>
19 #define __USE_SYSBASE
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>
28 #include "debug.h"
29 #include <proto/scalos.h>
31 #include <clib/alib_protos.h>
33 #include <assert.h>
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <ctype.h>
38 #include <limits.h>
39 #include <stddef.h>
40 #include <stdarg.h>
42 #include <defs.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),
79 NULL);
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)
99 IPTR Result;
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)
105 case OM_NEW:
106 Result = ButtonGadgetNew(cl, o, msg);
107 break;
108 case OM_SET:
109 Result = ButtonGadget_Set(cl, o, msg);
110 break;
111 case OM_GET:
112 Result = ButtonGadget_Get(cl, o, msg);
113 break;
114 case GM_RENDER:
115 Result = ButtonGadget_Render(cl, o, msg);
116 break;
117 default:
118 Result = DoSuperMethodA(cl, o, msg);
119 break;
122 return Result;
125 //----------------------------------------------------------------------------
127 static IPTR ButtonGadgetNew(Class *cl, Object *o, Msg msg)
129 BOOL Success = FALSE;
131 do {
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));
137 if (NULL == o)
138 break;
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);
146 Success = TRUE;
147 } while (0);
149 if (o && !Success)
151 DoMethod(o, OM_DISPOSE);
152 o = NULL;
155 return (IPTR) o;
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)
168 return 0;
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;
176 break;
177 case GA_Top: // required since gadgetclass attribute is [IS] - no support for [G]
178 *(opg->opg_Storage) = (IPTR) gg->TopEdge;
179 break;
180 case GA_Width: // required since gadgetclass attribute is [IS] - no support for [G]
181 *(opg->opg_Storage) = (IPTR) gg->Width;
182 break;
183 case GA_Height: // required since gadgetclass attribute is [IS] - no support for [G]
184 *(opg->opg_Storage) = (IPTR) gg->Height;
185 break;
186 case GBDTA_Hidden:
187 *(opg->opg_Storage) = (IPTR) inst->bgi_Hidden;
188 break;
189 default:
190 Success = DoSuperMethodA(cl, o, msg);
191 break;
194 return Success;
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;
204 struct TagItem *tag;
205 struct Gadget *gg = (struct Gadget *) o;
206 BOOL NeedRerender = FALSE;
207 ULONG Result;
209 while ((tag = NextTagItem(&TagList)))
211 switch (tag->ti_Tag)
213 case GA_Disabled:
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));
218 NeedRerender = TRUE;
220 break;
221 case GBDTA_Hidden:
222 inst->bgi_Hidden = tag->ti_Data;
223 break;
224 default:
225 break;
229 Result = DoSuperMethodA(cl, o, msg);
231 if (NeedRerender && !inst->bgi_Hidden)
233 struct RastPort *rp;
235 rp = ObtainGIRPort(ops->ops_GInfo);
236 d1(KPrintF("%s/%s/%ld: o=%08lx rp=%08lx\n", __FILE__, __FUNC__, __LINE__, o, rp));
237 if (rp)
239 DoMethod(o,
240 GM_RENDER,
241 ops->ops_GInfo,
243 GREDRAW_UPDATE);
244 ReleaseGIRPort(rp);
248 return Result;
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;
257 ULONG Result;
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));
272 if (Image)
274 IPTR SupportsDisable = FALSE;
276 Result = 0;
278 GetAttr(IA_SupportsDisable, Image, &SupportsDisable);
279 d1(KPrintF("%s/%s/%ld: SupportsDisable=%ld\n", __FILE__, __FUNC__, __LINE__, SupportsDisable));
280 if (SupportsDisable)
282 DrawImageState(gpr->gpr_RPort,
283 (struct Image *) Image,
284 gg->LeftEdge,
285 gg->TopEdge,
286 IDS_DISABLED,
287 gpr->gpr_GInfo->gi_DrInfo);
289 else
291 static UWORD Pattern[] =
292 { 0x8888, 0x2222 };
294 DrawImageState(gpr->gpr_RPort,
295 (struct Image *) Image,
296 gg->LeftEdge,
297 gg->TopEdge,
298 IDS_NORMAL,
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,
308 gg->LeftEdge,
309 gg->TopEdge,
310 gg->LeftEdge + gg->Width - 1,
311 gg->TopEdge + gg->Height - 1);
314 else
315 Result = DoSuperMethodA(cl, o, msg);
317 else
319 Result = DoSuperMethodA(cl, o, msg);
322 return Result;
325 //----------------------------------------------------------------------------