2 Copyright © 2012-2015, The AROS Development Team. All rights reserved.
6 #define MUIMASTER_YES_INLINE_STDARG
8 #include <proto/muimaster.h>
9 #include <proto/intuition.h>
10 #include <proto/utility.h>
11 #include <proto/graphics.h>
12 #include <clib/alib_protos.h>
13 #include <mui/NListtree_mcc.h>
14 #include <mui/NList_mcc.h>
18 #include "Listtree_mcc.h"
19 #include "listtree_private.h"
21 #include <aros/debug.h>
23 #define NEWHANDLE(attrname) \
25 bug("[Listtree] OM_NEW:%s - unsupported\n", #attrname); \
28 #define CONV(AATTR, BATTR) \
30 convtags[i].ti_Tag = BATTR; \
31 convtags[i++].ti_Data = tag->ti_Data; \
35 convtags[i].ti_Tag = TAG_DONE; \
36 convtags[i].ti_Data = TAG_DONE;
38 /*** Methods ****************************************************************/
39 Object
*Listtree__OM_NEW(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
41 struct Listtree_DATA
*data
= NULL
;
44 Object
*nlisttree
= NULL
;
45 struct TagItem convtags
[20];
48 /* Convert tags designated for NListtree */
49 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
)); )
53 CONV(MUIA_Frame
, MUIA_Frame
)
54 CONV(MUIA_Listtree_Format
, MUIA_NListtree_Format
)
55 CONV(MUIA_Listtree_Title
, MUIA_NListtree_Title
)
56 CONV(MUIA_Listtree_DragDropSort
, MUIA_NListtree_DragDropSort
)
57 CONV(MUIA_List_Title
, MUIA_NList_Title
)
58 CONV(MUIA_List_DragSortable
, MUIA_NList_DragSortable
)
59 // CONV(MUIA_ContextMenu, MUIA_ContextMenu) FIXME causes a crash when right clicking
60 CONV(MUIA_List_MinLineHeight
, MUIA_NList_MinLineHeight
)
66 * set up a DestructHook which will call proxy MUIS_Listtree_TreeNode destrhook and
69 obj
= (Object
*) DoSuperNewTags(cl
, obj
, 0,
70 Child
, nlisttree
= (Object
*) NListtreeObject
,
71 TAG_MORE
, (IPTR
)convtags
,
75 if (!obj
) return FALSE
;
77 data
= INST_DATA(cl
, obj
);
78 data
->nlisttree
= nlisttree
;
80 data
->pool
= CreatePool(MEMF_ANY
| MEMF_CLEAR
, 16 * 1024, 8 * 1024);
82 /* parse initial taglist */
83 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
)); )
87 case(MUIA_Listtree_ConstructHook
):
88 data
->constrhook
= (struct Hook
*)tag
->ti_Data
;
90 case(MUIA_Listtree_DestructHook
):
91 data
->destrhook
= (struct Hook
*)tag
->ti_Data
;
93 case(MUIA_List_MinLineHeight
):
94 case(MUIA_ContextMenu
):
95 case(MUIA_List_DragSortable
):
96 case(MUIA_List_Title
):
97 case(MUIA_Listtree_DragDropSort
):
98 case(MUIA_Listtree_Format
):
99 case(MUIA_Listtree_Title
):
101 /* Forwarded to NListtree */
103 NEWHANDLE(MUIA_Listtree_DisplayHook
)
104 NEWHANDLE(MUIA_Listtree_SortHook
)
106 bug("[Listtree] OM_NEW: unhandled %x\n", tag
->ti_Tag
);
113 #define SETHANDLE(attrname) \
115 bug("[Listtree] OM_SET:%s - unsupported\n", #attrname); \
118 #define FORWARDSET(AATTR, BATTR) \
120 set(data->nlisttree, BATTR, tag->ti_Data); \
123 #define IGNORESET(AATTR) case(AATTR): break;
125 IPTR
Listtree__OM_SET(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
127 struct Listtree_DATA
*data
= INST_DATA(cl
, obj
);
128 struct TagItem
*tstate
= msg
->ops_AttrList
;
131 if (!data
->nlisttree
)
132 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
134 while ((tag
= NextTagItem(&tstate
)) != NULL
)
138 FORWARDSET(MUIA_Listtree_Quiet
, MUIA_NListtree_Quiet
)
140 IGNORESET(MUIA_Listview_SelectChange
)
142 SETHANDLE(MUIA_Listtree_Active
)
143 SETHANDLE(MUIA_Listtree_DoubleClick
)
144 case MUIB_List
| 0x00000010: break;
145 case MUIA_Prop_First
: break;
146 case MUIA_Prop_DoSmooth
: break;
147 case MUIA_NoNotify
: break;
148 case MUIA_Prop_Entries
: break;
149 case MUIA_Prop_Visible
: break;
150 case MUIA_Prop_DeltaFactor
: break;
152 bug("[Listtree] OM_SET: passing to parent class %x\n", tag
->ti_Tag
);
157 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
160 #define GETHANDLE(attrname) \
162 bug("[Listtree] OM_GET:%s - unsupported\n", #attrname); \
166 #define MUIA_List_Prop_Entries /* PRIV */ \
167 (MUIB_MUI | 0x0042a8f5) /* .sg LONG PRIV */
168 #define MUIA_List_Prop_Visible /* PRIV */ \
169 (MUIB_MUI | 0x004273e9) /* .sg LONG PRIV */
170 #define MUIA_List_Prop_First /* PRIV */ \
171 (MUIB_MUI | 0x00429df3) /* .sg LONG PRIV */
173 #define MUIA_List_VertProp_Entries /* PRIV */ \
174 MUIA_List_Prop_Entries /* PRIV */
175 #define MUIA_List_VertProp_Visible /* PRIV */ \
176 MUIA_List_Prop_Visible /* PRIV */
177 #define MUIA_List_VertProp_First /* PRIV */ \
178 MUIA_List_Prop_First /* PRIV */
180 #define FORWARDGET(AATTR, BATTR) \
182 *(msg->opg_Storage) = XGET(data->nlisttree, BATTR); \
185 IPTR
Listtree__OM_GET(struct IClass
*cl
, Object
*obj
, struct opGet
*msg
)
187 struct Listtree_DATA
*data
= INST_DATA(cl
, obj
);
189 if (!data
->nlisttree
)
192 switch (msg
->opg_AttrID
)
194 FORWARDGET(MUIA_Frame
, MUIA_Frame
)
195 FORWARDGET(MUIA_Listtree_DoubleClick
, MUIA_NListtree_DoubleClick
)
196 FORWARDGET(MUIA_List_Active
, MUIA_NList_Active
)
197 FORWARDGET(MUIA_Listtree_Active
, MUIA_NListtree_Active
)
198 FORWARDGET(MUIA_Listtree_Quiet
, MUIA_NListtree_Quiet
)
199 FORWARDGET(MUIA_List_Visible
, MUIA_NList_Visible
)
201 GETHANDLE(MUIA_List_VertProp_Entries
)
202 GETHANDLE(MUIA_List_VertProp_Visible
)
203 GETHANDLE(MUIA_List_VertProp_First
)
204 case MUIA_Disabled
: break;
205 case MUIA_Parent
: break;
206 case MUIA_Group_ChildList
: break;
207 case MUIA_Prop_First
: break;
208 case MUIA_Prop_DoSmooth
: break;
209 case MUIA_Listview_List
: break;
210 case MUIA_Virtgroup_Left
: break;
211 case MUIA_Virtgroup_Top
: break;
212 case 0x9d510020 /*MUIA_NListview_NList*/: break;
214 bug("[Listtree] OM_GET: passing to parent class %x\n", msg
->opg_AttrID
);
217 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
220 #define METHODSTUB(methodname) \
221 IPTR Listtree__##methodname(struct IClass *cl, Object *obj, Msg msg) \
223 bug("[Listtree] Usupported : %s\n", #methodname); \
224 return (IPTR)FALSE; \
227 METHODSTUB(MUIM_Listtree_Rename
)
228 METHODSTUB(MUIM_Listtree_Open
)
229 METHODSTUB(MUIM_Listtree_Close
)
230 METHODSTUB(MUIM_Listtree_SetDropMark
)
231 METHODSTUB(MUIM_Listtree_FindName
)
232 METHODSTUB(MUIM_Listtree_GetNr
)
234 IPTR
Listtree__MUIM_Listtree_Insert(struct IClass
*cl
, Object
*obj
, struct MUIP_Listtree_Insert
*msg
)
236 struct Listtree_DATA
*data
= INST_DATA(cl
, obj
);
237 struct MUIS_Listtree_TreeNode
* _return
= AllocPooled(data
->pool
, sizeof(struct MUIS_Listtree_TreeNode
));
242 _return
->tn_Flags
= (UWORD
)msg
->Flags
;
245 LONG len
= strlen(msg
->Name
) + 1;
246 _return
->tn_Name
= AllocPooled(data
->pool
, len
);
247 CopyMem(msg
->Name
, _return
->tn_Name
, len
);
250 if (data
->constrhook
)
251 _return
->tn_User
= (APTR
)CallHookPkt(data
->constrhook
, data
->pool
, msg
->User
);
253 _return
->tn_User
= msg
->User
;
256 if (msg
->ListNode
!= (APTR
)MUIV_Listtree_Insert_ListNode_Root
)
257 bug("[Listtree] MUIM_Listtree_Insert - unhandled value of ListNode %x\n", msg
->ListNode
);
259 if ((msg
->PrevNode
!= (APTR
)MUIV_Listtree_Insert_PrevNode_Tail
)
260 && (msg
->PrevNode
!= (APTR
)MUIV_Listtree_Insert_PrevNode_Sorted
))
261 bug("[Listtree] MUIM_Listtree_Insert - unhandled value of PrevNode %x\n", msg
->PrevNode
);
264 * add handling for cases where ListNode and PrevNode actually point to Treenode structure
265 * The internal TreeNode structure needs to have then the poiter to NListTree node to be
266 * able to traslate. The pointer is acquired as return from below DoMethod call
268 * handle remaining enumeration values
271 DoMethod(data
->nlisttree
, MUIM_NListtree_Insert
, _return
->tn_Name
, _return
, msg
->ListNode
,
272 msg
->PrevNode
, _return
->tn_Flags
);
274 return (IPTR
)_return
;
277 IPTR
Listtree__MUIM_Listtree_GetEntry(struct IClass
*cl
, Object
*obj
, struct MUIP_Listtree_GetEntry
*msg
)
279 struct Listtree_DATA
*data
= INST_DATA(cl
, obj
);
282 if ((msg
->Node
!= (APTR
)MUIV_Listtree_GetEntry_ListNode_Root
)
283 && (msg
->Node
!= (APTR
)MUIV_Listtree_GetEntry_ListNode_Active
))
284 bug("[Listtree] MUIM_Listtree_GetEntry - unhandled value of Node %x\n", msg
->Node
);
287 * add handling for cases where Node actually point to Treenode structure
289 * handle remaining enumeration values
292 struct MUI_NListtree_TreeNode
* tn
= (struct MUI_NListtree_TreeNode
*) DoMethod(data
->nlisttree
,
293 MUIM_NListtree_GetEntry
, msg
->Node
, msg
->Position
, msg
->Flags
);
296 return (IPTR
)tn
->tn_User
;
301 IPTR
Listtree__MUIM_Listtree_Remove(struct IClass
*cl
, Object
*obj
, struct MUIP_Listtree_Remove
*msg
)
303 struct Listtree_DATA
*data
= INST_DATA(cl
, obj
);
305 /* TODO: handle remaining enumeration values */
306 if ((msg
->ListNode
== (APTR
)MUIV_Listtree_Remove_ListNode_Root
) &&
307 ((msg
->TreeNode
== (APTR
)MUIV_Listtree_Remove_TreeNode_Active
) ||
308 (msg
->TreeNode
== (APTR
)MUIV_Listtree_Remove_TreeNode_All
)))
310 /* Deallocating of MUIS_Listtree_TreeNode is happening in the DestructHook */
311 return DoMethod(data
->nlisttree
, MUIM_NListtree_Remove
, msg
->ListNode
, msg
->TreeNode
, msg
->Flags
);
315 * add handling for cases where ListNode/TreeNode actually point to Treenode structure
317 bug("[Listtree] MUIM_Listtree_Remove unsupported code path Listnode: %x, Treenode: %x, Flags: %d\n", msg
->ListNode
, msg
->TreeNode
, msg
->Flags
);
322 IPTR
Listtree__MUIM_List_TestPos(struct IClass
*cl
, Object
*obj
, struct MUIP_List_TestPos
*msg
)
324 struct Listtree_DATA
*data
= INST_DATA(cl
, obj
);
326 struct MUI_NList_TestPos_Result res
;
327 if (DoMethod(data
->nlisttree
, MUIM_List_TestPos
, msg
->x
, msg
->y
, &res
))
329 msg
->res
->entry
= res
.entry
;
330 msg
->res
->column
= res
.column
;
331 msg
->res
->flags
= res
.flags
;
332 msg
->res
->xoffset
= res
.xoffset
;
333 msg
->res
->yoffset
= res
.yoffset
;
340 IPTR
Listtree__MUIM_Listtree_TestPos(struct IClass
*cl
, Object
*obj
, struct MUIP_Listtree_TestPos
*msg
)
342 struct Listtree_DATA
*data
= INST_DATA(cl
, obj
);
344 struct MUI_NListtree_TestPos_Result res
;
345 struct MUIS_Listtree_TestPos_Result
* _ret
= (struct MUIS_Listtree_TestPos_Result
*)msg
->Result
;
347 _ret
->tpr_TreeNode
= NULL
;
349 DoMethod(data
->nlisttree
, MUIM_NListtree_TestPos
, msg
->X
, msg
->Y
, &res
);
351 _ret
->tpr_Flags
= res
.tpr_Type
;
352 _ret
->tpr_ListEntry
= res
.tpr_ListEntry
;
353 _ret
->tpr_ListFlags
= res
.tpr_ListFlags
;
355 if (res
.tpr_TreeNode
!= NULL
)
357 _ret
->tpr_TreeNode
= res
.tpr_TreeNode
->tn_User
;