2 Copyright © 2002-2015, The AROS Development Team. All rights reserved.
6 #include <aros/debug.h>
8 #include <clib/alib_protos.h>
9 #include <proto/utility.h>
10 #include <proto/intuition.h>
11 #include <proto/muimaster.h>
15 extern struct Library
*MUIMasterBase
;
17 struct MUI_ListviewData
21 struct Hook selfnotify_hook
;
25 #define PROP_VERT_FIRST 1
27 //ULONG Listview_Function(struct Hook *hook, APTR dummyobj, void **msg)
29 // struct MUI_ListviewData *data = (struct MUI_ListviewData *)hook->h_Data;
30 // SIPTR type = (SIPTR) msg[0];
31 // SIPTR val = (SIPTR) msg[1];
33 // D(bug("[ListView] List 0x%p, Event %d, value %ld\n", data->list, type,
38 // case PROP_VERT_FIRST:
39 // get(data->vert, MUIA_Prop_First, &val);
40 // nnset(data->list, MUIA_List_VertProp_First, val);
46 ULONG
SelfNotify_Function(struct Hook
*hook
, APTR obj
, void **msg
)
48 struct MUI_ListviewData
*data
= (struct MUI_ListviewData
*)hook
->h_Data
;
49 SIPTR attribute
= (SIPTR
) msg
[0];
50 SIPTR value
= (SIPTR
) msg
[1];
52 /* This allows avoiding notify loops */
53 data
->noforward
= TRUE
;
54 SetAttrs(obj
, MUIA_Group_Forward
, FALSE
, attribute
, value
, TAG_DONE
);
55 data
->noforward
= FALSE
;
60 /**************************************************************************
62 **************************************************************************/
63 IPTR
Listview__OM_NEW(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
65 struct MUI_ListviewData
*data
;
66 struct TagItem
*tag
, *tags
;
68 (Object
*) GetTagData(MUIA_Listview_List
, (IPTR
) NULL
,
74 obj
= (Object
*) DoSuperNewTags(cl
, obj
, NULL
,
75 MUIA_Group_Horiz
, TRUE
,
78 MUIA_Group_Spacing
, 0,
80 TAG_MORE
, msg
->ops_AttrList
);
85 data
= INST_DATA(cl
, obj
);
88 // data->hook.h_Entry = HookEntry;
89 // data->hook.h_SubEntry = (HOOKFUNC) Listview_Function;
90 // data->hook.h_Data = data;
92 data
->selfnotify_hook
.h_Entry
= HookEntry
;
93 data
->selfnotify_hook
.h_SubEntry
= (HOOKFUNC
) SelfNotify_Function
;
94 data
->selfnotify_hook
.h_Data
= data
;
95 data
->noforward
= FALSE
;
97 /* parse initial taglist, forward to list */
98 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
102 case MUIA_Listview_DoubleClick
:
103 case MUIA_Listview_Input
:
104 case MUIA_Listview_MultiSelect
:
105 case MUIA_Listview_ScrollerPos
:
106 set(list
, tag
->ti_Tag
, tag
->ti_Data
);
111 // DoMethod(vert, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime, (IPTR) obj,
112 // 4, MUIM_CallHook, (IPTR) &data->hook, PROP_VERT_FIRST,
113 // MUIV_TriggerValue); FIXME
115 DoMethod(list
, MUIM_Notify
, MUIA_List_Active
, MUIV_EveryTime
,
116 (IPTR
) obj
, 4, MUIM_CallHook
, (IPTR
) &data
->selfnotify_hook
,
117 MUIA_List_Active
, MUIV_TriggerValue
);
118 DoMethod(list
, MUIM_Notify
, MUIA_Listview_DoubleClick
, MUIV_EveryTime
,
119 (IPTR
) obj
, 4, MUIM_CallHook
, (IPTR
) &data
->selfnotify_hook
,
120 MUIA_Listview_DoubleClick
, MUIV_TriggerValue
);
121 DoMethod(list
, MUIM_Notify
, MUIA_Listview_SelectChange
, MUIV_EveryTime
,
122 (IPTR
) obj
, 4, MUIM_CallHook
, (IPTR
) &data
->selfnotify_hook
,
123 MUIA_Listview_SelectChange
, MUIV_TriggerValue
);
128 /**************************************************************************
130 **************************************************************************/
131 IPTR
Listview__OM_SET(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
133 struct TagItem
*tag
, *tags
;
134 IPTR no_notify
= GetTagData(MUIA_NoNotify
, FALSE
, msg
->ops_AttrList
);
135 struct MUI_ListviewData
*data
= INST_DATA(cl
, obj
);
139 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
142 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
146 case MUIA_List_CompareHook
:
147 case MUIA_List_ConstructHook
:
148 case MUIA_List_DestructHook
:
149 case MUIA_List_DisplayHook
:
150 case MUIA_List_VertProp_First
:
151 case MUIA_List_Format
:
152 case MUIA_List_VertProp_Entries
:
153 case MUIA_List_VertProp_Visible
:
154 case MUIA_List_Active
:
155 case MUIA_List_First
:
156 case MUIA_List_Visible
:
157 case MUIA_List_Entries
:
158 case MUIA_List_Quiet
:
159 SetAttrs(data
->list
, MUIA_NoNotify
, no_notify
, tag
->ti_Tag
,
160 tag
->ti_Data
, TAG_DONE
);
165 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
168 /**************************************************************************
170 **************************************************************************/
171 IPTR
Listview__OM_GET(struct IClass
*cl
, Object
*obj
, struct opGet
*msg
)
173 /* small macro to simplify return value storage */
174 #define STORE *(msg->opg_Storage)
175 struct MUI_ListviewData
*data
= INST_DATA(cl
, obj
);
177 switch (msg
->opg_AttrID
)
179 case MUIA_List_CompareHook
:
180 case MUIA_List_ConstructHook
:
181 case MUIA_List_DestructHook
:
182 case MUIA_List_DisplayHook
:
183 case MUIA_List_VertProp_First
:
184 case MUIA_List_Format
:
185 case MUIA_List_VertProp_Entries
:
186 case MUIA_List_VertProp_Visible
:
187 case MUIA_List_Active
:
188 case MUIA_List_First
:
189 case MUIA_List_Visible
:
190 case MUIA_List_Entries
:
191 case MUIA_List_Quiet
:
192 case MUIA_Listview_ClickColumn
:
193 case MUIA_Listview_DoubleClick
:
194 case MUIA_Listview_SelectChange
:
195 return GetAttr(msg
->opg_AttrID
, data
->list
, msg
->opg_Storage
);
197 case MUIA_Listview_List
:
198 STORE
= (IPTR
) data
->list
;
202 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
206 BOOPSI_DISPATCHER(IPTR
, Listview_Dispatcher
, cl
, obj
, msg
)
208 switch (msg
->MethodID
)
211 return Listview__OM_SET(cl
, obj
, (struct opSet
*)msg
);
213 return Listview__OM_GET(cl
, obj
, (struct opGet
*)msg
);
215 return Listview__OM_NEW(cl
, obj
, (struct opSet
*)msg
);
216 case MUIM_List_Clear
:
217 case MUIM_List_CreateImage
:
218 case MUIM_List_DeleteImage
:
219 case MUIM_List_Exchange
:
220 case MUIM_List_GetEntry
:
221 case MUIM_List_Insert
:
222 case MUIM_List_InsertSingle
:
224 case MUIM_List_NextSelected
:
225 case MUIM_List_Redraw
:
226 case MUIM_List_Remove
:
227 case MUIM_List_Select
:
229 case MUIM_List_TestPos
:
231 struct MUI_ListviewData
*data
= INST_DATA(cl
, obj
);
233 return DoMethodA(data
->list
, msg
);
238 return DoSuperMethodA(cl
, obj
, msg
);
240 BOOPSI_DISPATCHER_END
245 const struct __MUIBuiltinClass _MUI_Listview_desc
=
249 sizeof(struct MUI_ListviewData
),
250 (void *) Listview_Dispatcher