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"
18 extern struct Library
* AslBase
;
21 /// Class definitions.
23 * Object instance data.
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 */
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
),
54 * Create a shiny new object.
56 METHOD(AslReqClassNew
, struct opSet
*, ops
)
62 * First we let the superclass
65 if ((rc
= AsmDoSuperMethodA(cl
, obj
, (Msg
)ops
)))
68 * Get us the instance data.
70 ad
= INST_DATA(cl
, rc
);
79 ad
->ad_ASLTags
= CloneTagItems(NULL
);
82 * Setup user attributes.
84 if (AsmCoerceMethod(cl
, (Object
*)rc
, OM_SET
, ops
, NULL
) != ASLREQ_OK
)
89 AsmCoerceMethod(cl
, (Object
*)rc
, OM_DISPOSE
);
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
);
113 FreeTagItems(ad
->ad_ASLTags
);
116 * The superclass does the rest.
118 return AsmDoSuperMethodA(cl
, obj
, msg
);
122 /// OM_SET, OM_UPDATE
124 * Change one or more of the object
127 METHOD(AslReqClassSetUpdate
, struct opSet
*, ops
)
129 AD
*ad
= INST_DATA(cl
, obj
);
132 struct TagItem
*tstate
;
133 struct TagItem
*tags
, *tag
;
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
)))
148 if ((attr
>= ASL_TB
) && (attr
< ASL_TB
+ 0x10000))
157 *((struct IBox
*)&ad
->ad_Left
) = *((struct IBox
*)data
);
159 case ASLREQ_Requester
:
160 ad
->ad_Requester
= (APTR
)data
;
166 BGUI_PackStructureTag((UBYTE
*)ad
, AslPackTable
, attr
, data
);
172 tag
->ti_Tag
= TAG_IGNORE
;
177 * Merge the old with the new.
181 tag
= BGUI_MergeTagItems(ad
->ad_ASLTags
, tags
);
182 FreeTagItems(ad
->ad_ASLTags
);
183 ad
->ad_ASLTags
= BGUI_CleanTagItems(tag
, 1);
194 * Give one of the attributes.
196 METHOD(AslReqClassGet
, struct opGet
*, opg
)
198 AD
*ad
= INST_DATA(cl
, obj
);
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
;
209 else if (attr
== ASLREQ_Requester
)
211 *store
= (IPTR
)ad
->ad_Requester
;
216 rc
= BGUI_UnpackStructureTag((UBYTE
*)ad
, AslPackTable
, attr
, store
);
217 if (!rc
) rc
= AsmDoSuperMethodA(cl
, obj
, (Msg
)opg
);
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
,
236 return (IPTR
)ad
->ad_Requester
;
244 METHOD(AslReqClassRequest
, Msg
, msg
)
246 AD
*ad
= INST_DATA(cl
, obj
);
249 if (ad
->ad_Requester
)
251 rc
= AslRequest(ad
->ad_Requester
, ad
->ad_ASLTags
);
261 METHOD(AslReqClassFreeRequest
, Msg
, msg
)
263 AD
*ad
= INST_DATA(cl
, obj
);
265 FreeAslRequest(ad
->ad_Requester
);
266 ad
->ad_Requester
= NULL
;
273 /// Class initialization.
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
, },
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
,