Import of "OpenUrl"
[cake.git] / workbench / libs / openurl / prefs / applist.c
blob1054bae39a320704ce3214b84ab963bcfe36452a
1 /*
2 ** OpenURL - MUI preferences for openurl.library
3 **
4 ** Written by Troels Walsted Hansen <troels@thule.no>
5 ** Placed in the public domain.
6 **
7 ** Developed by:
8 ** - Alfonso Ranieri <alforan@tin.it>
9 ** - Stefan Kost <ensonic@sonicpulse.de>
11 ** Ported to OS4 by Alexandre Balaban <alexandre@balaban.name>
13 ** A clients page
16 #include "OpenURL.h"
17 #define CATCOMP_NUMBERS
18 #include "loc.h"
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
29 struct lampData
31 struct MUI_PenSpec **specs; /* We don't need to save them, because of Pens window is always valid */
33 LONG enabled;
34 LONG disabled;
35 LONG detail;
36 WORD delta;
38 ULONG flags;
41 enum
43 FLG_LampSetup = 1<<0,
44 FLG_LampDisabled = 1<<1,
47 /***********************************************************************/
49 static ULONG
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 /**************************************************************************/
59 static ULONG
60 mLampSets(struct IClass *cl,Object *obj,struct opSet *msg)
62 struct lampData *data = INST_DATA(cl,obj);
63 struct TagItem *tag;
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;
77 data->specs = specs;
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 /***********************************************************************/
98 static ULONG
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;
109 return TRUE;
112 /***********************************************************************/
114 static ULONG
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 /***********************************************************************/
133 static ULONG
134 mLampAskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg)
136 struct lampData *data = INST_DATA(cl,obj);
137 struct RastPort rp;
138 struct TextExtent te;
139 UWORD w, h, d;
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);
150 w = te.te_Width;
151 h = te.te_Height;
153 if (w>=h) d = w;
154 else d = h;
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;
165 return 0;
168 /***********************************************************************/
170 static ULONG
171 mLampDraw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg)
173 struct lampData *data = INST_DATA(cl,obj);
174 ULONG res;
176 res = DoSuperMethodA(cl,obj,(APTR)msg);
178 if (msg->flags & (MADF_DRAWOBJECT|MADF_DRAWUPDATE))
180 WORD l, t, r, b;
182 /* Don't ask or modify ! */
184 l = _mleft(obj);
185 r = _mright(obj);
186 t = _mtop(obj)+(_mheight(obj)+data->delta)/2-1;
187 b = t-data->delta;
189 if (r-l>2)
191 l += 1;
192 r -= 1;
195 if (b-t>2)
197 t += 1;
198 b -= 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));
205 Move(_rp(obj),l,t);
206 Draw(_rp(obj),r,t);
207 Draw(_rp(obj),r,b);
208 Draw(_rp(obj),l,b);
209 Draw(_rp(obj),l,t);
212 return res;
215 /***********************************************************************/
217 M_DISP(lampDispatcher)
219 M_DISPSTART
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 /***********************************************************************/
239 static ULONG
240 initLampClass(void)
242 return (ULONG)(lampClass = MUI_CreateCustomClass(NULL,MUIC_Rectangle,NULL,sizeof(struct lampData),DISP(lampDispatcher)));
245 /**************************************************************************/
247 static void
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
261 struct listData
263 Object *olamp;
264 APTR lamp;
265 TEXT col0buf[NAME_LEN+16];
267 ULONG nameOfs;
268 ULONG pathOfs;
269 ULONG nodeSize;
271 TEXT format[64];
273 ULONG flags;
276 enum
278 FLG_ListSetup = 1<<0,
281 /* Used for Import/Export */
282 struct listIO
284 ULONG len;
285 TEXT format[64];
288 /**************************************************************************/
290 #ifdef __MORPHOS__
291 static struct URL_Node *
292 conFun(void)
294 struct Hook *hook = (struct Hook *)REG_a0;
295 APTR pool = (APTR)REG_A2;
296 struct URL_Node *node = (struct URL_Node *)REG_A1;
297 #else
298 static struct URL_Node * SAVEDS ASM
299 conFun(REG(a0,struct Hook *hook),REG(a2,APTR pool),REG(a1,struct URL_Node *node))
301 #endif
302 struct listData *data = hook->h_Data;
303 struct URL_Node *new;
305 if (node->Flags & UNF_NTALLOC)
307 new = node;
308 node->Flags &= ~UNF_NTALLOC;
310 else if (new = AllocPooled(pool,data->nodeSize)) CopyMem(node,new,data->nodeSize);
312 return new;
315 #ifdef __MORPHOS__
316 static struct EmulLibEntry conTrap = {TRAP_LIB,0,(void (*)(void))conFun};
317 static struct Hook conHook = {0,0,(HOOKFUNC)&conTrap};
318 #else
319 static struct Hook conHook = {0,0,(HOOKFUNC)conFun};
320 #endif
322 /**************************************************************************/
324 #ifdef __MORPHOS__
325 static void
326 destFun(void)
328 struct Hook *hook = (struct Hook *)REG_a0;
329 APTR pool = (APTR)REG_A2;
330 struct URL_Node *node = (struct URL_Node *)REG_A1;
331 #else
332 static void SAVEDS ASM
333 destFun(REG(a0,struct Hook *hook),REG(a2,APTR pool),REG(a1,struct URL_Node *node))
335 #endif
336 struct listData *data = hook->h_Data;
338 FreePooled(pool,node,data->nodeSize);
341 #ifdef __MORPHOS__
342 static struct EmulLibEntry destTrap = {TRAP_LIBNR,0,(void (*)(void))destFun};
343 static struct Hook destHook = {0,0,(HOOKFUNC)&destTrap};
344 #else
345 static struct Hook destHook = {0,0,(HOOKFUNC)destFun};
346 #endif
348 /**************************************************************************/
350 #ifdef __MORPHOS__
351 static void
352 dispFun(void)
354 struct Hook *hook = (struct Hook *)REG_a0;
355 STRPTR *array = (STRPTR *)REG_A2;
356 struct URL_Node *node = (struct URL_Node *)REG_A1;
357 #else
358 static void SAVEDS ASM
359 dispFun(REG(a0,struct Hook *hook),REG(a2,STRPTR *array),REG(a1,struct URL_Node *node))
361 #endif
362 struct listData *data = hook->h_Data;
364 if (node)
366 if (data->lamp)
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;
373 else *array++ = "+";
374 //msprintf(data->col0buf,"%s %s",(ULONG)((node->Flags & UNF_DISABLED) ? " " : ">"),(ULONG)
376 *array++ = (STRPTR)node+data->nameOfs;
377 *array = (STRPTR)node+data->pathOfs;
379 else
381 *array++ = " ";
382 *array++ = getString(MSG_Edit_ListName);
383 *array = getString(MSG_Edit_ListPath);
387 #ifdef __MORPHOS__
388 static struct EmulLibEntry dispTrap = {TRAP_LIBNR,0,(void (*)(void))dispFun};
389 static struct Hook dispHook = {0,0,(HOOKFUNC)&dispTrap};
390 #else
391 static struct Hook dispHook = {0,0,(HOOKFUNC)dispFun};
392 #endif
394 /**************************************************************************/
396 static ULONG
397 mListNew(struct IClass *cl,Object *obj,struct opSet *msg)
399 if (obj = (Object *)DoSuperNew(cl,obj,
400 InputListFrame,
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;
428 return (ULONG)obj;
431 /**************************************************************************/
433 static ULONG
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 /**************************************************************************/
445 static ULONG
446 mListSets(struct IClass *cl,Object *obj,struct opSet *msg)
448 struct TagItem *tag;
450 if (tag = FindTagItem(MUIA_App_Pens,msg->ops_AttrList))
452 struct listData *data = INST_DATA(cl,obj);
453 if (data->olamp)
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 /***********************************************************************/
470 static ULONG
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;
483 return TRUE;
486 /***********************************************************************/
488 static ULONG
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)
495 if (data->lamp)
497 DoSuperMethod(cl,obj,MUIM_List_DeleteImage,(ULONG)data->lamp);
498 data->lamp = NULL;
501 data->flags &= ~FLG_ListSetup;
504 return DoSuperMethodA(cl,obj,(APTR)msg);
507 /***********************************************************************/
509 ** Import format
512 static ULONG
513 mListImport(struct IClass *cl,Object *obj,struct MUIP_Import *msg)
515 register ULONG id;
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);
530 return 0;
533 /***********************************************************************/
535 ** Export format
538 static ULONG
539 mListExport(struct IClass *cl,Object *obj,struct MUIP_Import *msg)
541 register ULONG id;
543 if (id = (muiNotifyData(obj)->mnd_ObjectID))
545 struct listIO io;
546 STRPTR f;
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);
555 return 0;
558 /**************************************************************************/
560 ** Check if format changed
563 static ULONG
564 mListCheckSave(struct IClass *cl,Object *obj,Msg msg)
566 struct listData *data = INST_DATA(cl,obj);
567 UBYTE *f;
569 get(obj,MUIA_List_Format,&f);
571 return (ULONG)strcmp((STRPTR)f,(STRPTR)&data->format);
574 /**************************************************************************/
576 M_DISP(listDispatcher)
578 M_DISPSTART
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 /**************************************************************************/
601 static ULONG
602 initListClass(void)
604 return (ULONG)(listClass = MUI_CreateCustomClass(NULL,MUIC_List,NULL,sizeof(struct listData),DISP(listDispatcher)));
607 /**************************************************************************/
609 static void
610 disposeListClass(void)
612 if (listClass) MUI_DeleteCustomClass(listClass);
615 /**************************************************************************/
617 struct data
619 Object *appList;
620 Object *add;
621 Object *edit;
622 Object *clone;
623 Object *delete;
624 Object *disable;
625 Object *up;
626 Object *down;
628 ULONG nameOfs;
629 ULONG pathOfs;
630 ULONG nodeSize;
631 struct IClass *editClass;
632 ULONG editAttr;
633 ULONG listAttr;
635 STRPTR newNodeName;
638 /**************************************************************************/
640 static ULONG
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;
648 /* What we are */
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');
662 break;
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');
675 break;
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);
685 helpNode = "FTPS";
686 help = MSG_FTP_List_Help;
687 id = MAKE_ID('F','L','S','T');
688 break;
690 default:
691 return 0;
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,
705 MUIA_ObjectID, id,
706 MUIA_AppList_NodeNameOffset, nameOfs,
707 MUIA_AppList_NodePathOffset, pathOfs,
708 MUIA_AppList_NodeSize, nodeSize,
709 End,
710 End,
712 Child, VGroup,
713 VirtualFrame,
714 MUIA_Background, MUII_GroupBack,
715 MUIA_Weight, 10,
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),
720 Child, HGroup,
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),
725 End,
726 Child, VSpace(0),
727 Child, deleteb = obutton(MSG_AppList_Delete,MSG_AppList_Delete_Help),
728 End,
730 TAG_MORE, msg->ops_AttrList))
732 struct data *data = INST_DATA(cl,obj);
734 /* init instance data */
735 data->appList = appl;
736 data->add = addb;
737 data->edit = editb;
738 data->clone = cloneb;
739 data->delete = deleteb;
740 data->disable = disableb;
741 data->up = upb;
742 data->down = downb;
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;
753 /* listview */
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);
757 /* buttons */
758 DoMethod(obj,MUIM_MultiSet,MUIA_Disabled,TRUE,
759 (ULONG)editb,
760 (ULONG)cloneb,
761 (ULONG)deleteb,
762 (ULONG)disableb,
763 (ULONG)upb,
764 (ULONG)downb,
765 NULL);
767 /* list buttons */
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);
777 return (ULONG)obj;
780 /**************************************************************************/
782 ** I hate this: it will be removed asap!
785 static ULONG
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 /**************************************************************************/
799 static ULONG
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);
818 return TRUE;
821 /**************************************************************************/
823 static ULONG
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);
830 if (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);
845 return TRUE;
848 /**************************************************************************/
850 static ULONG
851 mClone(struct IClass *cl,Object *obj,Msg msg)
853 struct data *data = INST_DATA(cl,obj);
854 struct URL_Node *node;
855 ULONG active;
857 get(data->appList,MUIA_List_Active,&active);
858 DoMethod(data->appList,MUIM_List_GetEntry,active,(ULONG)&node);
859 if (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);
873 return TRUE;
876 /**************************************************************************/
878 static ULONG
879 mDelete(struct IClass *cl,Object *obj,Msg msg)
881 struct data *data = INST_DATA(cl,obj);
882 UBYTE *node;
883 ULONG active;
885 get(data->appList,MUIA_List_Active,&active);
886 DoMethod(data->appList,MUIM_List_GetEntry,active,(ULONG)&node);
887 if (node)
889 DoMethod(_app(obj),MUIM_App_CloseWin,data->editAttr,(ULONG)node);
890 DoMethod(data->appList,MUIM_List_Remove,active);
893 return TRUE;
896 /**************************************************************************/
898 static ULONG
899 mActiveChanged(struct IClass *cl,Object *obj,Msg msg)
901 struct data *data = INST_DATA(cl,obj);
902 LONG a;
904 a = (LONG)xget(data->appList,MUIA_List_Active);
905 if (a>=0)
907 struct URL_Node *node;
908 ULONG n;
910 DoMethod(obj,MUIM_MultiSet,MUIA_Disabled,FALSE,
911 (ULONG)data->edit,
912 (ULONG)data->clone,
913 (ULONG)data->delete,
914 (ULONG)data->disable,
915 NULL);
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);
927 else
929 set(data->disable,MUIA_Selected,FALSE);
931 DoMethod(obj,MUIM_MultiSet,MUIA_Disabled,TRUE,
932 (ULONG)data->edit,
933 (ULONG)data->clone,
934 (ULONG)data->delete,
935 (ULONG)data->disable,
936 (ULONG)data->up,
937 (ULONG)data->down,
938 NULL);
941 return TRUE;
944 /**************************************************************************/
946 static ULONG
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);
953 if (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));
964 return TRUE;
967 /**************************************************************************/
969 static ULONG
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);
977 return 0;
980 /**************************************************************************/
982 ** Forward to the list
985 static ULONG
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 /**************************************************************************/
995 M_DISP(dispatcher)
997 M_DISPSTART
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 /**************************************************************************/
1021 ULONG
1022 initAppListClass(void)
1024 if (initListClass())
1026 if (g_appListClass = MUI_CreateCustomClass(NULL,MUIC_Group,NULL,sizeof(struct data),DISP(dispatcher)))
1028 initLampClass();
1030 return TRUE;
1033 disposeListClass();
1036 return FALSE;
1039 /**************************************************************************/
1041 void
1042 disposeAppListClass(void)
1044 disposeLampClass();
1045 disposeListClass();
1046 if (g_appListClass) MUI_DeleteCustomClass(g_appListClass);
1049 /**************************************************************************/