Icons for Radium and Shellplayer.
[AROS-Contrib.git] / bgui / aslreqclass.c
blob368bbfc07e37d7509a8af4c390200093e4d35ae2
1 /*
2 * @(#) $Header$
4 * BGUI library
5 * aslreqclass.c
7 * (C) Copyright 1998 Manuel Lemos.
8 * (C) Copyright 1996-1997 Ian J. Einman.
9 * (C) Copyright 1993-1996 Jaba Development.
10 * (C) Copyright 1993-1996 Jan van den Baard.
11 * All Rights Reserved.
15 #include "include/classdefs.h"
17 #ifdef __AROS__
18 extern struct Library * AslBase;
19 #endif
21 /// Class definitions.
23 * Object instance data.
25 typedef struct ad_ {
26 APTR ad_Requester; /* Requester */
27 ULONG ad_Type; /* Requester type */
28 WORD ad_Left; /* Requester left */
29 WORD ad_Top; /* Requester top */
30 UWORD ad_Width; /* Requester width */
31 UWORD ad_Height; /* Requester height */
32 struct TagItem *ad_ASLTags; /* Copy of ASL tags */
33 } AD;
35 #define AD_ENTRY(tag, offset, flags) PACK_ENTRY(ASLREQ_TAGSTART, tag, ad_, offset, flags)
36 #define AD_FLAG(tag, flag) PACK_LONGBIT(ASLREQ_TAGSTART, tag, ad_, ad_Flags, PKCTRL_BIT, flag)
38 static ULONG AslPackTable[] =
40 PACK_STARTTABLE(ASLREQ_TAGSTART),
42 AD_ENTRY(ASLREQ_Type, ad_Type, PKCTRL_ULONG),
43 AD_ENTRY(ASLREQ_Left, ad_Left, PKCTRL_WORD),
44 AD_ENTRY(ASLREQ_Top, ad_Top, PKCTRL_WORD),
45 AD_ENTRY(ASLREQ_Width, ad_Width, PKCTRL_UWORD),
46 AD_ENTRY(ASLREQ_Height, ad_Height, PKCTRL_UWORD),
48 PACK_ENDTABLE
50 ///
52 /// OM_NEW
54 * Create a shiny new object.
56 METHOD(AslReqClassNew, struct opSet *, ops)
58 AD *ad;
59 IPTR rc;
62 * First we let the superclass
63 * create the object.
65 if ((rc = AsmDoSuperMethodA(cl, obj, (Msg)ops)))
68 * Get us the instance data.
70 ad = INST_DATA(cl, rc);
73 * Setup the defaults.
75 ad->ad_Left = 30;
76 ad->ad_Top = 20;
77 ad->ad_Width = 320;
78 ad->ad_Height = 180;
79 ad->ad_ASLTags = CloneTagItems(NULL);
82 * Setup user attributes.
84 if (AsmCoerceMethod(cl, (Object *)rc, OM_SET, ops, NULL) != ASLREQ_OK)
87 * Failure.
89 AsmCoerceMethod(cl, (Object *)rc, OM_DISPOSE);
90 rc = 0;
93 return rc;
95 METHOD_END
96 ///
97 /// OM_DISPOSE
99 * They want us gone.
101 METHOD(AslReqClassDispose, Msg, msg)
103 AD *ad = INST_DATA(cl, obj);
106 * Free requester, if it still exists somehow.
108 FreeAslRequest(ad->ad_Requester);
111 * Free tag copy.
113 FreeTagItems(ad->ad_ASLTags);
116 * The superclass does the rest.
118 return AsmDoSuperMethodA(cl, obj, msg);
120 METHOD_END
122 /// OM_SET, OM_UPDATE
124 * Change one or more of the object
125 * it's attributes.
127 METHOD(AslReqClassSetUpdate, struct opSet *, ops)
129 AD *ad = INST_DATA(cl, obj);
130 Tag attr;
131 IPTR data;
132 struct TagItem *tstate;
133 struct TagItem *tags, *tag;
134 BOOL asl = FALSE;
137 * Filter out values in old taglist that will be replaced,
138 * and values in new taglist that are not ASL tags.
139 * Process the non-ASL tags before disposal.
141 tstate = tags = CloneTagItems(ops->ops_AttrList);
143 while ((tag = NextTagItem(&tstate)))
145 attr = tag->ti_Tag;
146 data = tag->ti_Data;
148 if ((attr >= ASL_TB) && (attr < ASL_TB + 0x10000))
150 asl = TRUE;
152 else
154 switch (attr)
156 case ASLREQ_Bounds:
157 *((struct IBox *)&ad->ad_Left) = *((struct IBox *)data);
158 break;
159 case ASLREQ_Requester:
160 ad->ad_Requester = (APTR)data;
161 break;
162 default:
164 * Try to process it.
166 BGUI_PackStructureTag((UBYTE *)ad, AslPackTable, attr, data);
167 break;
170 * Kill it.
172 tag->ti_Tag = TAG_IGNORE;
177 * Merge the old with the new.
179 if (asl)
181 tag = BGUI_MergeTagItems(ad->ad_ASLTags, tags);
182 FreeTagItems(ad->ad_ASLTags);
183 ad->ad_ASLTags = BGUI_CleanTagItems(tag, 1);
186 FreeTagItems(tags);
188 return ASLREQ_OK;
190 METHOD_END
192 /// OM_GET
194 * Give one of the attributes.
196 METHOD(AslReqClassGet, struct opGet *, opg)
198 AD *ad = INST_DATA(cl, obj);
199 struct TagItem *tag;
200 ULONG rc;
201 Tag attr = opg->opg_AttrID;
202 IPTR *store = opg->opg_Storage;
204 if ((tag = FindTagItem(attr, ad->ad_ASLTags)))
206 *store = tag->ti_Data;
207 rc = 1;
209 else if (attr == ASLREQ_Requester)
211 *store = (IPTR)ad->ad_Requester;
212 rc = 1;
214 else
216 rc = BGUI_UnpackStructureTag((UBYTE *)ad, AslPackTable, attr, store);
217 if (!rc) rc = AsmDoSuperMethodA(cl, obj, (Msg)opg);
219 return rc;
221 METHOD_END
223 /// ASLM_ALLOCREQUEST
225 * Allocate requester.
227 METHOD(AslReqClassAllocRequest, Msg, msg)
229 AD *ad = INST_DATA(cl, obj);
231 ad->ad_Requester = AllocAslRequestTags(ad->ad_Type,
232 ASL_LeftEdge, ad->ad_Left, ASL_TopEdge, ad->ad_Top,
233 ASL_Width, ad->ad_Width, ASL_Height, ad->ad_Height,
234 TAG_DONE);
236 return (IPTR)ad->ad_Requester;
238 METHOD_END
240 /// ASLM_REQUEST
242 * Show requester.
244 METHOD(AslReqClassRequest, Msg, msg)
246 AD *ad = INST_DATA(cl, obj);
247 ULONG rc = 0;
249 if (ad->ad_Requester)
251 rc = AslRequest(ad->ad_Requester, ad->ad_ASLTags);
253 return rc;
255 METHOD_END
257 /// ASLM_FREEREQUEST
259 * Free requester.
261 METHOD(AslReqClassFreeRequest, Msg, msg)
263 AD *ad = INST_DATA(cl, obj);
265 FreeAslRequest(ad->ad_Requester);
266 ad->ad_Requester = NULL;
268 return 1;
270 METHOD_END
273 /// Class initialization.
275 * Function table.
277 STATIC DPFUNC ClassFunc[] = {
278 { OM_NEW, AslReqClassNew, },
279 { OM_SET, AslReqClassSetUpdate, },
280 { OM_UPDATE, AslReqClassSetUpdate, },
281 { OM_GET, AslReqClassGet, },
282 { OM_DISPOSE, AslReqClassDispose, },
283 { ASLM_ALLOCREQUEST, AslReqClassAllocRequest, },
284 { ASLM_REQUEST, AslReqClassRequest, },
285 { ASLM_FREEREQUEST, AslReqClassFreeRequest, },
286 { DF_END, NULL },
290 * Simple class initialization.
292 makeproto Class *InitAslReqClass(void)
294 return BGUI_MakeClass(CLASS_SuperClassBGUI, BGUI_ROOT_OBJECT,
295 CLASS_ObjectSize, sizeof(AD),
296 CLASS_DFTable, ClassFunc,
297 TAG_DONE);