2 ** OpenURL - MUI preferences for openurl.library
4 ** Written by Troels Walsted Hansen <troels@thule.no>
5 ** Placed in the public domain.
8 ** - Alfonso Ranieri <alforan@tin.it>
9 ** - Stefan Kost <ensonic@sonicpulse.de>
11 ** Ported to OS4 by Alexandre Balaban <alexandre@balaban.name>
17 #define CATCOMP_NUMBERS
19 #include "libraries/openurl.h"
21 /**************************************************************************/
23 ** Little lamp class for enabled/disabled
26 static struct MUI_CustomClass
*lampClass
= NULL
;
27 #define lampObject NewObject(lampClass->mcc_Class,NULL
31 struct MUI_PenSpec
**specs
; /* We don't need to save them, because of Pens window is always valid */
44 FLG_LampDisabled
= 1<<1,
47 /***********************************************************************/
50 mLampNew(struct IClass
*cl
,Object
*obj
,struct opSet
*msg
)
52 return (ULONG
)DoSuperNew(cl
,obj
,
53 MUIA_Font
, MUIV_Font_List
,
54 TAG_MORE
, msg
->ops_AttrList
);
57 /**************************************************************************/
60 mLampSets(struct IClass
*cl
,Object
*obj
,struct opSet
*msg
)
62 struct lampData
*data
= INST_DATA(cl
,obj
);
65 if (tag
= FindTagItem(MUIA_Lamp_Disabled
,msg
->ops_AttrList
))
67 if (tag
->ti_Data
) data
->flags
|= FLG_LampDisabled
;
68 else data
->flags
&= ~FLG_LampDisabled
;
70 /* Of course, we don't redraw here */
73 if (tag
= FindTagItem(MUIA_App_Pens
,msg
->ops_AttrList
))
75 struct MUI_PenSpec
**specs
= (struct MUI_PenSpec
**)tag
->ti_Data
;
79 if (data
->flags
& FLG_LampSetup
)
81 MUI_ReleasePen(muiRenderInfo(obj
),data
->enabled
);
82 MUI_ReleasePen(muiRenderInfo(obj
),data
->disabled
);
83 MUI_ReleasePen(muiRenderInfo(obj
),data
->detail
);
84 data
->enabled
= MUI_ObtainPen(muiRenderInfo(obj
),specs
[0],0);
85 data
->disabled
= MUI_ObtainPen(muiRenderInfo(obj
),specs
[1],0);
86 data
->detail
= MUI_ObtainPen(muiRenderInfo(obj
),specs
[2],0);
88 /* Of course, we don't redraw here */
89 data
->flags
|= FLG_LampSetup
;
93 return DoSuperMethodA(cl
,obj
,(Msg
)msg
);
96 /***********************************************************************/
99 mLampSetup(struct IClass
*cl
,Object
*obj
,struct MUIP_Setup
*msg
)
101 struct lampData
*data
= INST_DATA(cl
,obj
);
102 if (!DoSuperMethodA(cl
,obj
,(APTR
)msg
)) return FALSE
;
103 data
->enabled
= MUI_ObtainPen(muiRenderInfo(obj
),data
->specs
[0],0);
104 data
->disabled
= MUI_ObtainPen(muiRenderInfo(obj
),data
->specs
[1],0);
105 data
->detail
= MUI_ObtainPen(muiRenderInfo(obj
),data
->specs
[2],0);
107 data
->flags
|= FLG_LampSetup
;
112 /***********************************************************************/
115 mLampCleanup(struct IClass
*cl
,Object
*obj
,struct MUIP_Setup
*msg
)
117 struct lampData
*data
= INST_DATA(cl
,obj
);
119 if (data
->flags
& FLG_LampSetup
)
121 MUI_ReleasePen(muiRenderInfo(obj
),data
->enabled
);
122 MUI_ReleasePen(muiRenderInfo(obj
),data
->disabled
);
123 MUI_ReleasePen(muiRenderInfo(obj
),data
->detail
);
125 data
->flags
&= ~FLG_LampSetup
;
128 return DoSuperMethodA(cl
,obj
,(APTR
)msg
);
131 /***********************************************************************/
134 mLampAskMinMax(struct IClass
*cl
,Object
*obj
,struct MUIP_AskMinMax
*msg
)
136 struct lampData
*data
= INST_DATA(cl
,obj
);
138 struct TextExtent te
;
141 DoSuperMethodA(cl
,obj
,(APTR
)msg
);
143 CopyMem(&_screen(obj
)->RastPort
,&rp
,sizeof(rp
));
145 /* Don't ask or modify ! */
147 SetFont(&rp
,_font(obj
));
148 TextExtent(&rp
," ",2,&te
);
156 data
->delta
= te
.te_Extent
.MinY
;
158 msg
->MinMaxInfo
->MinWidth
+= d
;
159 msg
->MinMaxInfo
->MinHeight
+= h
;
160 msg
->MinMaxInfo
->DefWidth
+= d
;
161 msg
->MinMaxInfo
->DefHeight
+= h
;
162 msg
->MinMaxInfo
->MaxWidth
+= d
;
163 msg
->MinMaxInfo
->MaxHeight
+= h
;
168 /***********************************************************************/
171 mLampDraw(struct IClass
*cl
,Object
*obj
,struct MUIP_Draw
*msg
)
173 struct lampData
*data
= INST_DATA(cl
,obj
);
176 res
= DoSuperMethodA(cl
,obj
,(APTR
)msg
);
178 if (msg
->flags
& (MADF_DRAWOBJECT
|MADF_DRAWUPDATE
))
182 /* Don't ask or modify ! */
186 t
= _mtop(obj
)+(_mheight(obj
)+data
->delta
)/2-1;
201 SetAPen(_rp(obj
),MUIPEN((data
->flags
& FLG_LampDisabled
) ? data
->disabled
: data
->enabled
));
202 RectFill(_rp(obj
),l
,t
,r
,b
);
204 SetAPen(_rp(obj
),MUIPEN(data
->detail
));
215 /***********************************************************************/
217 M_DISP(lampDispatcher
)
221 switch(msg
->MethodID
)
223 case OM_NEW
: return mLampNew(cl
,obj
,(APTR
)msg
);
224 case OM_SET
: return mLampSets(cl
,obj
,(APTR
)msg
);
226 case MUIM_Setup
: return mLampSetup(cl
,obj
,(APTR
)msg
);
227 case MUIM_Cleanup
: return mLampCleanup(cl
,obj
,(APTR
)msg
);
228 case MUIM_AskMinMax
: return mLampAskMinMax(cl
,obj
,(APTR
)msg
);
229 case MUIM_Draw
: return mLampDraw(cl
,obj
,(APTR
)msg
);
231 default: return DoSuperMethodA(cl
,obj
,msg
);
235 M_DISPEND(lampDispatcher
)
237 /***********************************************************************/
242 return (ULONG
)(lampClass
= MUI_CreateCustomClass(NULL
,MUIC_Rectangle
,NULL
,sizeof(struct lampData
),DISP(lampDispatcher
)));
245 /**************************************************************************/
248 disposeLampClass(void)
250 if (lampClass
) MUI_DeleteCustomClass(lampClass
);
253 /**************************************************************************/
255 ** List of clients with lamps
258 static struct MUI_CustomClass
*listClass
= NULL
;
259 #define listObject NewObject(listClass->mcc_Class,NULL
265 TEXT col0buf
[NAME_LEN
+16];
278 FLG_ListSetup
= 1<<0,
281 /* Used for Import/Export */
288 /**************************************************************************/
291 static struct URL_Node
*
294 struct Hook
*hook
= (struct Hook
*)REG_a0
;
295 APTR pool
= (APTR
)REG_A2
;
296 struct URL_Node
*node
= (struct URL_Node
*)REG_A1
;
298 static struct URL_Node
* SAVEDS ASM
299 conFun(REG(a0
,struct Hook
*hook
),REG(a2
,APTR pool
),REG(a1
,struct URL_Node
*node
))
302 struct listData
*data
= hook
->h_Data
;
303 struct URL_Node
*new;
305 if (node
->Flags
& UNF_NTALLOC
)
308 node
->Flags
&= ~UNF_NTALLOC
;
310 else if (new = AllocPooled(pool
,data
->nodeSize
)) CopyMem(node
,new,data
->nodeSize
);
316 static struct EmulLibEntry conTrap
= {TRAP_LIB
,0,(void (*)(void))conFun
};
317 static struct Hook conHook
= {0,0,(HOOKFUNC
)&conTrap
};
319 static struct Hook conHook
= {0,0,(HOOKFUNC
)conFun
};
322 /**************************************************************************/
328 struct Hook
*hook
= (struct Hook
*)REG_a0
;
329 APTR pool
= (APTR
)REG_A2
;
330 struct URL_Node
*node
= (struct URL_Node
*)REG_A1
;
332 static void SAVEDS ASM
333 destFun(REG(a0
,struct Hook
*hook
),REG(a2
,APTR pool
),REG(a1
,struct URL_Node
*node
))
336 struct listData
*data
= hook
->h_Data
;
338 FreePooled(pool
,node
,data
->nodeSize
);
342 static struct EmulLibEntry destTrap
= {TRAP_LIBNR
,0,(void (*)(void))destFun
};
343 static struct Hook destHook
= {0,0,(HOOKFUNC
)&destTrap
};
345 static struct Hook destHook
= {0,0,(HOOKFUNC
)destFun
};
348 /**************************************************************************/
354 struct Hook
*hook
= (struct Hook
*)REG_a0
;
355 STRPTR
*array
= (STRPTR
*)REG_A2
;
356 struct URL_Node
*node
= (struct URL_Node
*)REG_A1
;
358 static void SAVEDS ASM
359 dispFun(REG(a0
,struct Hook
*hook
),REG(a2
,STRPTR
*array
),REG(a1
,struct URL_Node
*node
))
362 struct listData
*data
= hook
->h_Data
;
368 set(data
->lamp
,MUIA_Lamp_Disabled
,node
->Flags
& UNF_DISABLED
);
369 //msprintf(data->col0buf,"\33O[%08lx] %s",(ULONG)data->lamp,(ULONG)((UBYTE *)node+data->nameOfs));
370 msprintf(data
->col0buf
,"\33O[%08lx]",(ULONG
)data
->lamp
);
371 *array
++ = data
->col0buf
;
374 //msprintf(data->col0buf,"%s %s",(ULONG)((node->Flags & UNF_DISABLED) ? " " : ">"),(ULONG)
376 *array
++ = (STRPTR
)node
+data
->nameOfs
;
377 *array
= (STRPTR
)node
+data
->pathOfs
;
382 *array
++ = getString(MSG_Edit_ListName
);
383 *array
= getString(MSG_Edit_ListPath
);
388 static struct EmulLibEntry dispTrap
= {TRAP_LIBNR
,0,(void (*)(void))dispFun
};
389 static struct Hook dispHook
= {0,0,(HOOKFUNC
)&dispTrap
};
391 static struct Hook dispHook
= {0,0,(HOOKFUNC
)dispFun
};
394 /**************************************************************************/
397 mListNew(struct IClass
*cl
,Object
*obj
,struct opSet
*msg
)
399 if (obj
= (Object
*)DoSuperNew(cl
,obj
,
401 MUIA_List_Title
, TRUE
,
402 MUIA_List_Format
, "C=0,C=1,C=2",
403 MUIA_List_DragSortable
, TRUE
,
404 MUIA_List_Pool
, g_pool
,
405 MUIA_List_ConstructHook
, &conHook
,
406 MUIA_List_DestructHook
, &destHook
,
407 MUIA_List_DisplayHook
, &dispHook
,
408 MUIA_List_DragSortable
, TRUE
,
409 MUIA_List_ShowDropMarks
, TRUE
,
410 0x8042bc08, 1, /* MUI4 Auto Line Height: put the real name if you know it :P */
411 TAG_MORE
, msg
->ops_AttrList
))
413 struct listData
*data
= INST_DATA(cl
,obj
);
415 data
->nameOfs
= GetTagData(MUIA_AppList_NodeNameOffset
,0,msg
->ops_AttrList
);
416 data
->pathOfs
= GetTagData(MUIA_AppList_NodePathOffset
,0,msg
->ops_AttrList
);
417 data
->nodeSize
= GetTagData(MUIA_AppList_NodeSize
,0,msg
->ops_AttrList
);
419 strcpy(data
->format
,"C=0,C=1,C=2");
421 if (lampClass
) data
->olamp
= lampObject
, End
;
423 conHook
.h_Data
= data
;
424 destHook
.h_Data
= data
;
425 dispHook
.h_Data
= data
;
431 /**************************************************************************/
434 mListDispose(struct IClass
*cl
,Object
*obj
,Msg msg
)
436 struct listData
*data
= INST_DATA(cl
,obj
);
438 if (data
->olamp
) MUI_DisposeObject(data
->olamp
);
440 return DoSuperMethodA(cl
,obj
,msg
);
443 /**************************************************************************/
446 mListSets(struct IClass
*cl
,Object
*obj
,struct opSet
*msg
)
450 if (tag
= FindTagItem(MUIA_App_Pens
,msg
->ops_AttrList
))
452 struct listData
*data
= INST_DATA(cl
,obj
);
455 struct MUI_PenSpec
**specs
= (struct MUI_PenSpec
**)tag
->ti_Data
;
456 set(data
->olamp
,MUIA_App_Pens
,specs
);
457 tag
->ti_Tag
= TAG_IGNORE
;
459 /* Don't want even know why a push is needed here! */
460 if (data
->flags
& FLG_ListSetup
)
461 DoMethod(_app(obj
),MUIM_Application_PushMethod
,(ULONG
)obj
,2,MUIM_List_Redraw
,MUIV_List_Redraw_All
);
465 return DoSuperMethodA(cl
,obj
,(Msg
)msg
);
468 /***********************************************************************/
471 mListSetup(struct IClass
*cl
,Object
*obj
,struct MUIP_Setup
*msg
)
473 struct listData
*data
= INST_DATA(cl
,obj
);
475 if (!DoSuperMethodA(cl
,obj
,(APTR
)msg
)) return FALSE
;
477 /* After thinking about that hard, I decided to use the lamp in >=8 color screen */
478 if (data
->olamp
&& (GetBitMapAttr(_screen(obj
)->RastPort
.BitMap
,BMA_DEPTH
)>3))
479 data
->lamp
= (APTR
)DoSuperMethod(cl
,obj
,MUIM_List_CreateImage
,(ULONG
)data
->olamp
,0);
481 data
->flags
|= FLG_ListSetup
;
486 /***********************************************************************/
489 mListCleanup(struct IClass
*cl
,Object
*obj
,struct MUIP_Setup
*msg
)
491 struct listData
*data
= INST_DATA(cl
,obj
);
493 if (data
->flags
& FLG_ListSetup
)
497 DoSuperMethod(cl
,obj
,MUIM_List_DeleteImage
,(ULONG
)data
->lamp
);
501 data
->flags
&= ~FLG_ListSetup
;
504 return DoSuperMethodA(cl
,obj
,(APTR
)msg
);
507 /***********************************************************************/
513 mListImport(struct IClass
*cl
,Object
*obj
,struct MUIP_Import
*msg
)
517 if (id
= (muiNotifyData(obj
)->mnd_ObjectID
))
519 register struct listIO
*io
;
521 if (io
= (struct listIO
*)DoMethod(msg
->dataspace
,MUIM_Dataspace_Find
,id
))
523 struct listData
*data
= INST_DATA(cl
,obj
);
525 stccpy(data
->format
,io
->format
,sizeof(data
->format
));
526 set(obj
,MUIA_List_Format
,data
->format
);
533 /***********************************************************************/
539 mListExport(struct IClass
*cl
,Object
*obj
,struct MUIP_Import
*msg
)
543 if (id
= (muiNotifyData(obj
)->mnd_ObjectID
))
548 get(obj
,MUIA_List_Format
,&f
);
549 io
.len
= strlen(f
)+1;
550 stccpy(io
.format
,f
,sizeof(io
.format
));
552 DoMethod(msg
->dataspace
,MUIM_Dataspace_Add
,(ULONG
)&io
,sizeof(ULONG
)+io
.len
,id
);
558 /**************************************************************************/
560 ** Check if format changed
564 mListCheckSave(struct IClass
*cl
,Object
*obj
,Msg msg
)
566 struct listData
*data
= INST_DATA(cl
,obj
);
569 get(obj
,MUIA_List_Format
,&f
);
571 return (ULONG
)strcmp((STRPTR
)f
,(STRPTR
)&data
->format
);
574 /**************************************************************************/
576 M_DISP(listDispatcher
)
580 switch (msg
->MethodID
)
582 case OM_NEW
: return mListNew(cl
,obj
,(APTR
)msg
);
583 case OM_DISPOSE
: return mListDispose(cl
,obj
,(APTR
)msg
);
584 case OM_SET
: return mListSets(cl
,obj
,(APTR
)msg
);
586 case MUIM_Setup
: return mListSetup(cl
,obj
,(APTR
)msg
);
587 case MUIM_Cleanup
: return mListCleanup(cl
,obj
,(APTR
)msg
);
588 case MUIM_Import
: return mListImport(cl
,obj
,(APTR
)msg
);
589 case MUIM_Export
: return mListExport(cl
,obj
,(APTR
)msg
);
591 case MUIM_App_CheckSave
: return mListCheckSave(cl
,obj
,(APTR
)msg
);
593 default: return DoSuperMethodA(cl
,obj
,msg
);
597 M_DISPEND(listDispatcher
)
599 /**************************************************************************/
604 return (ULONG
)(listClass
= MUI_CreateCustomClass(NULL
,MUIC_List
,NULL
,sizeof(struct listData
),DISP(listDispatcher
)));
607 /**************************************************************************/
610 disposeListClass(void)
612 if (listClass
) MUI_DeleteCustomClass(listClass
);
615 /**************************************************************************/
631 struct IClass
*editClass
;
638 /**************************************************************************/
641 mNew(struct IClass
*cl
,Object
*obj
,struct opSet
*msg
)
643 Object
*appl
, *addb
, *editb
, *cloneb
, *deleteb
, *disableb
, *upb
, *downb
;
644 struct IClass
*editWinClass
;
645 STRPTR nodeName
, helpNode
;
646 ULONG nameOfs
, pathOfs
, nodeSize
, editWinAttr
, listAttr
, help
, id
;
649 switch (GetTagData(MUIA_AppList_Type
,0,msg
->ops_AttrList
))
651 case MUIV_AppList_Type_Browser
:
652 nameOfs
= sizeof(struct MinNode
) + sizeof(ULONG
);
653 pathOfs
= sizeof(struct MinNode
) + sizeof(ULONG
) + NAME_LEN
;
654 nodeSize
= sizeof(struct URL_BrowserNode
);
655 editWinClass
= g_browserEditWinClass
->mcc_Class
;
656 editWinAttr
= MUIA_BrowserEditWin_Browser
;
657 listAttr
= MUIA_BrowserEditWin_ListObj
;
658 nodeName
= getString(MSG_Browser_NewBrowser
);
659 helpNode
= "BROWSER";
660 help
= MSG_Browser_List_Help
;
661 id
= MAKE_ID('B','L','S','T');
664 case MUIV_AppList_Type_Mailer
:
665 nameOfs
= sizeof(struct MinNode
) + sizeof(ULONG
);
666 pathOfs
= sizeof(struct MinNode
) + sizeof(ULONG
) + NAME_LEN
;
667 nodeSize
= sizeof(struct URL_MailerNode
);
668 editWinClass
= g_mailerEditWinClass
->mcc_Class
;
669 editWinAttr
= MUIA_MailerEditWin_Mailer
;
670 listAttr
= MUIA_MailerEditWin_ListObj
;
671 nodeName
= getString(MSG_Mailer_NewMailer
);
672 helpNode
= "MAILERS";
673 help
= MSG_Mailer_List_Help
;
674 id
= MAKE_ID('M','L','S','T');
677 case MUIV_AppList_Type_FTP
:
678 nameOfs
= sizeof(struct MinNode
) + sizeof(ULONG
);
679 pathOfs
= sizeof(struct MinNode
) + sizeof(ULONG
) + NAME_LEN
;
680 nodeSize
= sizeof(struct URL_FTPNode
);
681 editWinClass
= g_FTPEditWinClass
->mcc_Class
;
682 editWinAttr
= MUIA_FTPEditWin_FTP
;
683 listAttr
= MUIA_FTPEditWin_ListObj
;
684 nodeName
= getString(MSG_FTP_NewFTP
);
686 help
= MSG_FTP_List_Help
;
687 id
= MAKE_ID('F','L','S','T');
694 if (obj
= (Object
*)DoSuperNew(cl
,obj
,
695 MUIA_HelpNode
, helpNode
,
696 MUIA_ShortHelp
, getString(help
),
697 MUIA_Group_Horiz
, TRUE
,
698 MUIA_Group_HorizSpacing
, 2,
700 Child
, ListviewObject
,
701 MUIA_CycleChain
, TRUE
,
702 MUIA_Listview_DefClickColumn
, 1,
703 MUIA_Listview_DragType
, MUIV_Listview_DragType_Immediate
,
704 MUIA_Listview_List
, appl
= listObject
,
706 MUIA_AppList_NodeNameOffset
, nameOfs
,
707 MUIA_AppList_NodePathOffset
, pathOfs
,
708 MUIA_AppList_NodeSize
, nodeSize
,
714 MUIA_Background
, MUII_GroupBack
,
717 Child
, addb
= obutton(MSG_AppList_Add
,MSG_AppList_Add_Help
),
718 Child
, editb
= obutton(MSG_AppList_Edit
,MSG_AppList_Edit_Help
),
719 Child
, cloneb
= obutton(MSG_AppList_Clone
,MSG_AppList_Clone_Help
),
721 MUIA_Group_HorizSpacing
, 1,
722 Child
, upb
= oibutton(IBT_Up
,MSG_AppList_MoveUp_Help
),
723 Child
, downb
= oibutton(IBT_Down
,MSG_AppList_MoveDown_Help
),
724 Child
, disableb
= otbutton(MSG_AppList_Disable
,MSG_AppList_Disable_Help
),
727 Child
, deleteb
= obutton(MSG_AppList_Delete
,MSG_AppList_Delete_Help
),
730 TAG_MORE
, msg
->ops_AttrList
))
732 struct data
*data
= INST_DATA(cl
,obj
);
734 /* init instance data */
735 data
->appList
= appl
;
738 data
->clone
= cloneb
;
739 data
->delete = deleteb
;
740 data
->disable
= disableb
;
744 data
->nameOfs
= nameOfs
;
745 data
->pathOfs
= pathOfs
;
746 data
->nodeSize
= nodeSize
;
748 data
->editClass
= editWinClass
;
749 data
->editAttr
= editWinAttr
;
750 data
->listAttr
= listAttr
;
751 data
->newNodeName
= nodeName
;
754 DoMethod(appl
,MUIM_Notify
,MUIA_List_Active
,MUIV_EveryTime
,(ULONG
)obj
,1,MUIM_AppList_ActiveChanged
);
755 DoMethod(appl
,MUIM_Notify
,MUIA_Listview_DoubleClick
,MUIV_EveryTime
,(ULONG
)obj
,2,MUIM_AppList_Edit
,TRUE
);
758 DoMethod(obj
,MUIM_MultiSet
,MUIA_Disabled
,TRUE
,
768 DoMethod(addb
,MUIM_Notify
,MUIA_Pressed
,FALSE
,(ULONG
)obj
,1,MUIM_AppList_Add
);
769 DoMethod(editb
,MUIM_Notify
,MUIA_Pressed
,FALSE
,(ULONG
)obj
,1,MUIM_AppList_Edit
,FALSE
);
770 DoMethod(cloneb
,MUIM_Notify
,MUIA_Pressed
,FALSE
,(ULONG
)obj
,1,MUIM_AppList_Clone
);
771 DoMethod(deleteb
,MUIM_Notify
,MUIA_Pressed
,FALSE
,(ULONG
)obj
,1,MUIM_AppList_Delete
);
772 DoMethod(disableb
,MUIM_Notify
,MUIA_Selected
,MUIV_EveryTime
,(ULONG
)obj
,2,MUIM_AppList_Disable
,MUIV_TriggerValue
);
773 DoMethod(upb
,MUIM_Notify
,MUIA_Timer
,MUIV_EveryTime
,(ULONG
)obj
,2,MUIM_AppList_Move
,TRUE
);
774 DoMethod(downb
,MUIM_Notify
,MUIA_Timer
,MUIV_EveryTime
,(ULONG
)obj
,2,MUIM_AppList_Move
,FALSE
);
780 /**************************************************************************/
782 ** I hate this: it will be removed asap!
786 mGet(struct IClass
*cl
,Object
*obj
,struct opGet
*msg
)
788 struct data
*data
= INST_DATA(cl
,obj
);
790 switch (msg
->opg_AttrID
)
792 case MUIA_AppList_ListObj
: *msg
->opg_Storage
= (ULONG
)data
->appList
; return TRUE
;
793 default: return DoSuperMethodA(cl
,obj
,(Msg
)msg
);
797 /**************************************************************************/
800 mAdd(struct IClass
*cl
,Object
*obj
,Msg msg
)
802 struct data
*data
= INST_DATA(cl
,obj
);
803 struct URL_Node
*node
;
805 if (!(node
= AllocPooled(g_pool
,data
->nodeSize
))) return FALSE
;
807 memset(node
,0,data
->nodeSize
);
808 strcpy((STRPTR
)node
+data
->nameOfs
,data
->newNodeName
);
810 node
->Flags
= UNF_NEW
|UNF_NTALLOC
;
812 DoMethod(data
->appList
,MUIM_List_InsertSingle
,(ULONG
)node
,MUIV_List_Insert_Bottom
);
814 set(data
->appList
,MUIA_List_Active
,xget(data
->appList
,MUIA_List_InsertPosition
));
816 DoMethod(obj
,MUIM_AppList_Edit
,FALSE
);
821 /**************************************************************************/
824 mEdit(struct IClass
*cl
,Object
*obj
,struct MUIP_AppList_Edit
*msg
)
826 struct data
*data
= INST_DATA(cl
,obj
);
827 struct URL_Node
*node
;
829 DoMethod(data
->appList
,MUIM_List_GetEntry
,MUIV_List_GetEntry_Active
,(ULONG
)&node
);
832 if (msg
->check
&& (xget(data
->appList
,MUIA_Listview_ClickColumn
)==0))
834 set(data
->appList
,MUIA_Listview_ClickColumn
,1);
836 if (node
->Flags
& UNF_DISABLED
) node
->Flags
&= ~UNF_DISABLED
;
837 else node
->Flags
|= UNF_DISABLED
;
839 DoMethod(data
->appList
,MUIM_List_Redraw
,xget(data
->appList
,MUIA_List_Active
));
840 set(data
->disable
,MUIA_Selected
,node
->Flags
& UNF_DISABLED
);
842 else DoMethod(_app(obj
),MUIM_App_OpenWin
,(ULONG
)data
->editClass
,data
->editAttr
,(ULONG
)node
,data
->listAttr
,(ULONG
)data
->appList
,TAG_END
);
848 /**************************************************************************/
851 mClone(struct IClass
*cl
,Object
*obj
,Msg msg
)
853 struct data
*data
= INST_DATA(cl
,obj
);
854 struct URL_Node
*node
;
857 get(data
->appList
,MUIA_List_Active
,&active
);
858 DoMethod(data
->appList
,MUIM_List_GetEntry
,active
,(ULONG
)&node
);
861 struct URL_Node
*new;
863 if (!(new = AllocPooled(g_pool
,data
->nodeSize
))) return FALSE
;
864 CopyMem(node
,new,data
->nodeSize
);
865 new->Flags
|= UNF_NEW
|UNF_NTALLOC
;
867 DoMethod(data
->appList
,MUIM_List_InsertSingle
,(ULONG
)new,MUIV_List_Insert_Bottom
);
868 set(data
->appList
,MUIA_List_Active
,MUIV_List_Active_Bottom
);
870 DoMethod(obj
,MUIM_AppList_Edit
,FALSE
);
876 /**************************************************************************/
879 mDelete(struct IClass
*cl
,Object
*obj
,Msg msg
)
881 struct data
*data
= INST_DATA(cl
,obj
);
885 get(data
->appList
,MUIA_List_Active
,&active
);
886 DoMethod(data
->appList
,MUIM_List_GetEntry
,active
,(ULONG
)&node
);
889 DoMethod(_app(obj
),MUIM_App_CloseWin
,data
->editAttr
,(ULONG
)node
);
890 DoMethod(data
->appList
,MUIM_List_Remove
,active
);
896 /**************************************************************************/
899 mActiveChanged(struct IClass
*cl
,Object
*obj
,Msg msg
)
901 struct data
*data
= INST_DATA(cl
,obj
);
904 a
= (LONG
)xget(data
->appList
,MUIA_List_Active
);
907 struct URL_Node
*node
;
910 DoMethod(obj
,MUIM_MultiSet
,MUIA_Disabled
,FALSE
,
914 (ULONG
)data
->disable
,
917 DoMethod(data
->appList
,MUIM_List_GetEntry
,a
,(ULONG
)&node
);
918 set(data
->disable
,MUIA_Selected
,node
->Flags
& UNF_DISABLED
);
920 if (a
==0) SetAttrs(data
->up
,MUIA_Selected
,FALSE
,MUIA_Disabled
,TRUE
,TAG_DONE
);
921 else set(data
->up
,MUIA_Disabled
,FALSE
);
923 n
= xget(data
->appList
,MUIA_List_Entries
);
924 if (n
-1<=a
) SetAttrs(data
->down
,MUIA_Selected
,FALSE
,MUIA_Disabled
,TRUE
,TAG_DONE
);
925 else set(data
->down
,MUIA_Disabled
,FALSE
);
929 set(data
->disable
,MUIA_Selected
,FALSE
);
931 DoMethod(obj
,MUIM_MultiSet
,MUIA_Disabled
,TRUE
,
935 (ULONG
)data
->disable
,
944 /**************************************************************************/
947 mDisable(struct IClass
*cl
,Object
*obj
,struct MUIP_AppList_Disable
*msg
)
949 struct data
*data
= INST_DATA(cl
,obj
);
950 struct URL_Node
*node
;
952 DoMethod(data
->appList
,MUIM_List_GetEntry
,MUIV_List_GetEntry_Active
,(ULONG
)&node
);
955 if (!BOOLSAME(msg
->disable
,node
->Flags
& UNF_DISABLED
))
957 if (msg
->disable
) node
->Flags
|= UNF_DISABLED
;
958 else node
->Flags
&= ~UNF_DISABLED
;
960 DoMethod(data
->appList
,MUIM_List_Redraw
,xget(data
->appList
,MUIA_List_Active
));
967 /**************************************************************************/
970 mMove(struct IClass
*cl
,Object
*obj
,struct MUIP_AppList_Move
*msg
)
972 struct data
*data
= INST_DATA(cl
,obj
);
974 DoMethod(data
->appList
,MUIM_List_Exchange
,MUIV_List_Exchange_Active
,msg
->up
? MUIV_List_Exchange_Previous
: MUIV_List_Exchange_Next
);
975 set(data
->appList
,MUIA_List_Active
,msg
->up
? MUIV_List_Active_Up
: MUIV_List_Active_Down
);
980 /**************************************************************************/
982 ** Forward to the list
986 mCheckSave(struct IClass
*cl
,Object
*obj
,Msg msg
)
988 struct data
*data
= INST_DATA(cl
,obj
);
990 return DoMethod(data
->appList
,MUIM_App_CheckSave
);
993 /**************************************************************************/
999 switch (msg
->MethodID
)
1001 case OM_NEW
: return mNew(cl
,obj
,(APTR
)msg
);
1002 case OM_GET
: return mGet(cl
,obj
,(APTR
)msg
);
1004 case MUIM_AppList_Add
: return mAdd(cl
,obj
,(APTR
)msg
);
1005 case MUIM_AppList_Edit
: return mEdit(cl
,obj
,(APTR
)msg
);
1006 case MUIM_AppList_Clone
: return mClone(cl
,obj
,(APTR
)msg
);
1007 case MUIM_AppList_Delete
: return mDelete(cl
,obj
,(APTR
)msg
);
1008 case MUIM_AppList_ActiveChanged
: return mActiveChanged(cl
,obj
,(APTR
)msg
);
1009 case MUIM_AppList_Disable
: return mDisable(cl
,obj
,(APTR
)msg
);
1010 case MUIM_AppList_Move
: return mMove(cl
,obj
,(APTR
)msg
);
1011 case MUIM_App_CheckSave
: return mCheckSave(cl
,obj
,(APTR
)msg
);
1013 default: return DoSuperMethodA(cl
,obj
,msg
);
1017 M_DISPEND(dispatcher
)
1019 /**************************************************************************/
1022 initAppListClass(void)
1024 if (initListClass())
1026 if (g_appListClass
= MUI_CreateCustomClass(NULL
,MUIC_Group
,NULL
,sizeof(struct data
),DISP(dispatcher
)))
1039 /**************************************************************************/
1042 disposeAppListClass(void)
1046 if (g_appListClass
) MUI_DeleteCustomClass(g_appListClass
);
1049 /**************************************************************************/