2 Copyright © 2002-2003, The AROS Development Team. All rights reserved.
6 #include <graphics/gfx.h>
7 #include <graphics/view.h>
8 #include <clib/alib_protos.h>
9 #include <proto/exec.h>
10 #include <proto/graphics.h>
11 #include <proto/utility.h>
12 #include <proto/intuition.h>
13 #include <proto/muimaster.h>
16 #include "muimaster_intern.h"
20 extern struct Library
*MUIMasterBase
;
24 struct MUI_EventHandlerNode ehn
;
28 struct Hook
*strobj_hook
;
29 struct Hook
*objstr_hook
;
30 struct Hook
*window_hook
;
31 struct Hook open_hook
;
32 struct Hook close_hook
;
37 AROS_UFH3(ULONG
, Popobject_Open_Function
,
38 AROS_UFHA(struct Hook
*, hook
, A0
),
39 AROS_UFHA(Object
*, obj
, A2
),
40 AROS_UFHA(void **, msg
, A1
))
44 struct Popobject_DATA
*data
= (struct Popobject_DATA
*)hook
->h_Data
;
45 Object
*string
= (Object
*) msg
[0];
49 static struct TagItem light_tags
[] =
51 {MUIA_Window_Borderless
, TRUE
},
52 {MUIA_Window_CloseGadget
, FALSE
},
53 {MUIA_Window_SizeGadget
, FALSE
},
54 {MUIA_Window_DepthGadget
, FALSE
},
55 {MUIA_Window_DragBar
, FALSE
},
59 data
->wnd
= WindowObject
,
60 WindowContents
, data
->object
,
61 data
->light
? TAG_MORE
: TAG_IGNORE
, (IPTR
) light_tags
, End
;
66 DoMethod(_app(obj
), OM_ADDMEMBER
, (IPTR
) data
->wnd
);
68 DoMethod(data
->wnd
, MUIM_Notify
, MUIA_Window_CloseRequest
, TRUE
,
69 (IPTR
) obj
, 2, MUIM_Popstring_Close
, FALSE
);
72 if (data
->strobj_hook
)
74 if (!(CallHookPkt(data
->strobj_hook
, data
->object
, string
)))
78 if (data
->window_hook
)
80 CallHookPkt(data
->window_hook
, data
->object
, data
->wnd
);
84 MUIA_Window_LeftEdge
, _left(obj
) + _window(obj
)->LeftEdge
,
85 MUIA_Window_TopEdge
, _bottom(obj
) + 1 + _window(obj
)->TopEdge
,
86 MUIA_Window_Width
, _width(obj
), MUIA_Window_Open
, TRUE
, TAG_DONE
);
88 if (!(data
->ehn
.ehn_Events
& IDCMP_CHANGEWINDOW
))
90 data
->ehn
.ehn_Events
|= IDCMP_CHANGEWINDOW
;
91 DoMethod(_win(obj
), MUIM_Window_AddEventHandler
,
101 AROS_UFH3(ULONG
, Popobject_Close_Function
,
102 AROS_UFHA(struct Hook
*, hook
, A0
),
103 AROS_UFHA(Object
*, obj
, A2
),
104 AROS_UFHA(void **, msg
, A1
))
108 struct Popobject_DATA
*data
= (struct Popobject_DATA
*)hook
->h_Data
;
109 Object
*string
= (Object
*) msg
[0];
110 SIPTR suc
= (SIPTR
) msg
[1];
114 set(data
->wnd
, MUIA_Window_Open
, FALSE
);
116 if (data
->objstr_hook
&& suc
)
117 CallHookPkt(data
->objstr_hook
, data
->object
, string
);
119 if (data
->ehn
.ehn_Events
& IDCMP_CHANGEWINDOW
)
121 DoMethod(_win(obj
), MUIM_Window_RemEventHandler
,
123 data
->ehn
.ehn_Events
&= ~IDCMP_CHANGEWINDOW
;
132 IPTR
Popobject__OM_NEW(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
134 struct Popobject_DATA
*data
;
135 struct TagItem
*tags
;
138 obj
= (Object
*) DoSuperMethodA(cl
, obj
, (Msg
) msg
);
142 data
= INST_DATA(cl
, obj
);
147 data
->ehn
.ehn_Events
= 0;
148 data
->ehn
.ehn_Priority
= 0;
149 data
->ehn
.ehn_Flags
= 0;
150 data
->ehn
.ehn_Object
= obj
;
151 data
->ehn
.ehn_Class
= cl
;
153 data
->open_hook
.h_Entry
= (HOOKFUNC
) Popobject_Open_Function
;
154 data
->open_hook
.h_Data
= data
;
155 data
->close_hook
.h_Entry
= (HOOKFUNC
) Popobject_Close_Function
;
156 data
->close_hook
.h_Data
= data
;
158 /* parse initial taglist */
160 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
164 case MUIA_Popobject_Follow
:
165 data
->follow
= tag
->ti_Data
;
168 case MUIA_Popobject_Light
:
169 data
->light
= tag
->ti_Data
;
172 case MUIA_Popobject_Object
:
173 data
->object
= (Object
*) tag
->ti_Data
;
176 case MUIA_Popobject_ObjStrHook
:
177 data
->objstr_hook
= (struct Hook
*)tag
->ti_Data
;
180 case MUIA_Popobject_StrObjHook
:
181 data
->strobj_hook
= (struct Hook
*)tag
->ti_Data
;
184 case MUIA_Popobject_Volatile
:
185 data
->vol
= tag
->ti_Data
;
188 case MUIA_Popobject_WindowHook
:
189 data
->window_hook
= (struct Hook
*)tag
->ti_Data
;
195 MUIA_Popstring_OpenHook
, (IPTR
) & data
->open_hook
,
196 MUIA_Popstring_CloseHook
, (IPTR
) & data
->close_hook
,
197 MUIA_Popstring_Toggle
, TRUE
,
203 IPTR
Popobject__OM_DISPOSE(struct IClass
*cl
, Object
*obj
, Msg msg
)
205 struct Popobject_DATA
*data
= INST_DATA(cl
, obj
);
207 if (!data
->wnd
&& data
->object
)
208 MUI_DisposeObject(data
->object
);
210 return DoSuperMethodA(cl
, obj
, msg
);
213 IPTR
Popobject__OM_SET(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
215 struct Popobject_DATA
*data
= INST_DATA(cl
, obj
);
216 struct TagItem
*tags
;
219 /* parse initial taglist */
221 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
225 case MUIA_Popobject_Follow
:
226 data
->follow
= tag
->ti_Data
;
229 case MUIA_Popobject_ObjStrHook
:
230 data
->objstr_hook
= (struct Hook
*)tag
->ti_Data
;
233 case MUIA_Popobject_StrObjHook
:
234 data
->strobj_hook
= (struct Hook
*)tag
->ti_Data
;
237 case MUIA_Popobject_Volatile
:
238 data
->vol
= tag
->ti_Data
;
241 case MUIA_Popobject_WindowHook
:
242 data
->window_hook
= (struct Hook
*)tag
->ti_Data
;
246 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
250 IPTR
Popobject__MUIM_Get(struct IClass
*cl
, Object
*obj
,
253 struct Popobject_DATA
*data
= INST_DATA(cl
, obj
);
255 switch (msg
->opg_AttrID
)
257 case MUIA_Popobject_Follow
:
258 *msg
->opg_Storage
= data
->follow
;
261 case MUIA_Popobject_Light
:
262 *msg
->opg_Storage
= data
->light
;
265 case MUIA_Popobject_Object
:
266 *msg
->opg_Storage
= (IPTR
) data
->object
;
269 case MUIA_Popobject_ObjStrHook
:
270 *msg
->opg_Storage
= (IPTR
) data
->objstr_hook
;
273 case MUIA_Popobject_StrObjHook
:
274 *msg
->opg_Storage
= (IPTR
) data
->strobj_hook
;
277 case MUIA_Popobject_Volatile
:
278 *msg
->opg_Storage
= data
->vol
;
281 case MUIA_Popobject_WindowHook
:
282 *msg
->opg_Storage
= (IPTR
) data
->window_hook
;
286 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
290 IPTR
Popobject__MUIM_Cleanup(struct IClass
*cl
, Object
*obj
,
291 struct MUIP_Cleanup
*msg
)
293 struct Popobject_DATA
*data
= INST_DATA(cl
, obj
);
295 if (data
->ehn
.ehn_Events
& IDCMP_CHANGEWINDOW
)
297 DoMethod(_win(obj
), MUIM_Window_RemEventHandler
,
299 data
->ehn
.ehn_Events
&= ~IDCMP_CHANGEWINDOW
;
302 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
305 IPTR
Popobject__MUIM_Show(struct IClass
*cl
, Object
*obj
,
306 struct MUIP_Show
*msg
)
308 IPTR rc
= DoSuperMethodA(cl
, obj
, (Msg
) msg
);
314 IPTR
Popobject__MUIM_Hide(struct IClass
*cl
, Object
*obj
,
315 struct MUIP_Hide
*msg
)
317 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
320 IPTR
Popobject__MUIM_HandleEvent(struct IClass
*cl
, Object
*obj
,
321 struct MUIP_HandleEvent
*msg
)
323 struct Popobject_DATA
*data
= INST_DATA(cl
, obj
);
325 if (data
->follow
&& msg
->imsg
&& data
->wnd
)
327 if (msg
->imsg
->Class
== IDCMP_CHANGEWINDOW
)
329 struct Window
*popwin
= NULL
;
330 struct Window
*parentwin
= _window(obj
);
332 get(data
->wnd
, MUIA_Window_Window
, &popwin
);
334 if (popwin
&& parentwin
)
336 ChangeWindowBox(popwin
, _left(obj
) + parentwin
->LeftEdge
,
337 _bottom(obj
) + parentwin
->TopEdge
+ 1,
338 popwin
->Width
, popwin
->Height
);
343 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
346 BOOPSI_DISPATCHER(IPTR
, Popobject_Dispatcher
, cl
, obj
, msg
)
348 switch (msg
->MethodID
)
351 return Popobject__OM_NEW(cl
, obj
, (struct opSet
*)msg
);
353 return Popobject__OM_DISPOSE(cl
, obj
, msg
);
355 return Popobject__OM_SET(cl
, obj
, (struct opSet
*)msg
);
357 return Popobject__MUIM_Get(cl
, obj
, (struct opGet
*)msg
);
359 return Popobject__MUIM_Cleanup(cl
, obj
, (struct MUIP_Cleanup
*)msg
);
361 return Popobject__MUIM_Show(cl
, obj
, (struct MUIP_Show
*)msg
);
363 return Popobject__MUIM_Hide(cl
, obj
, (struct MUIP_Hide
*)msg
);
364 case MUIM_HandleEvent
:
365 return Popobject__MUIM_HandleEvent(cl
, obj
,
366 (struct MUIP_HandleEvent
*)msg
);
369 return DoSuperMethodA(cl
, obj
, msg
);
371 BOOPSI_DISPATCHER_END
373 const struct __MUIBuiltinClass _MUI_Popobject_desc
=
377 sizeof(struct Popobject_DATA
),
378 (void *) Popobject_Dispatcher