Dont use notification when updating menus, and use native format for drag/drop bitmap
[AROS.git] / workbench / system / Wanderer / wanderer.c
blob3f56809a771d960fead1e4d473907cae9c21a0a3
1 /*
2 Copyright 2004-2009, The AROS Development Team. All rights reserved.
3 $Id$
4 */
5 #include "portable_macros.h"
7 #ifdef __AROS__
8 #define MUIMASTER_YES_INLINE_STDARG
10 #define DEBUG 0
11 #include <aros/debug.h>
12 #endif
14 #define WANDERER_DEFAULT_BACKDROP
16 #include <exec/types.h>
17 #include <libraries/gadtools.h>
18 #include <libraries/mui.h>
20 #ifdef __AROS__
21 #include <zune/customclasses.h>
22 #else
23 #include <zune_AROS/customclasses.h>
24 #endif
26 #include <dos/notify.h>
28 #ifdef __AROS__
29 #include <workbench/handler.h>
30 #else
31 #include <workbench_AROS/handler.h>
32 #endif
34 #include <proto/graphics.h>
35 #include <proto/utility.h>
37 #include <proto/dos.h>
39 #include <proto/icon.h>
41 #ifdef __AROS__
42 #include <proto/workbench.h>
43 #endif
45 #include <proto/layers.h>
47 #ifdef __AROS__
48 #include <proto/alib.h>
49 #endif
51 #include <string.h>
52 #include <stdio.h>
53 #include <time.h>
56 #ifdef __AROS__
57 #include <aros/detach.h>
58 #include <prefs/wanderer.h>
59 #else
60 #include <prefs_AROS/wanderer.h>
61 #endif
63 #if defined(__AMIGA__) && !defined(__PPC__)
64 #define NO_INLINE_STDARG
65 #endif
66 #include <proto/intuition.h>
67 #include <proto/muimaster.h>
69 #include <zune/iconimage.h>
71 #include "iconwindow.h"
72 #include "iconwindow_attributes.h"
73 #include "iconwindowcontents.h"
74 #include "wandererprefs.h"
75 #include "wandererprefsintern.h"
76 #include "filesystems.h"
77 #include "wanderer.h"
78 #include "Classes/iconlist.h"
79 #include "Classes/iconlist_attributes.h"
80 #include "locale.h"
82 #include "version.h"
84 #ifndef __AROS__
85 #define DEBUG 1
87 #ifdef DEBUG
88 #define D(x) if (DEBUG) x
89 #ifdef __amigaos4__
90 #define bug DebugPrintF
91 #else
92 #define bug kprintf
93 #endif
94 #else
95 #define D(...)
96 #endif
97 #endif
99 #ifndef NO_ICON_POSITION
100 #define NO_ICON_POSITION (0x8000000) /* belongs to workbench/workbench.h */
101 #endif
103 #warning "TODO: Toolbars Attributes etc should be in an own file"
104 /*** Identifier Base ********************************************************/
105 #define MUIB_IconWindowExt_Toolbar (MUIB_IconWindowExt | 0x200000)
107 #define MUIA_IconWindowExt_Toolbar_NavigationMethod (MUIB_IconWindowExt_Toolbar | 0x00000002) /* ISG */
109 #define KeyButton(name,key) TextObject, ButtonFrame, MUIA_Font, MUIV_Font_Button, MUIA_Text_Contents, (IPTR)(name), MUIA_Text_PreParse, "\33c", MUIA_Text_HiChar, (IPTR)(key), MUIA_ControlChar, key, MUIA_InputMode, MUIV_InputMode_RelVerify, MUIA_Background, MUII_ButtonBack, TAG_DONE)
111 extern IPTR InitWandererPrefs(void);
112 static VOID DoAllMenuNotifies(Object *wanderer, Object *strip, STRPTR path);
113 Object *FindMenuitem(Object* strip, int id);
114 Object *Wanderer__Func_CreateWandererIntuitionMenu(BOOL isRoot, BOOL useBackdrop);
115 void wanderer_menufunc_window_update(void);
116 void execute_open_with_command(BPTR cd, STRPTR contents);
117 void DisposeCopyDisplay(struct MUIDisplayObjects *d);
118 BOOL CreateCopyDisplay(UWORD flags, struct MUIDisplayObjects *d);
120 static struct List _WandererIntern_FSHandlerList;
122 /* Stored in the main wanderer executable */
123 extern Object *_WandererIntern_AppObj;
124 extern Class *_WandererIntern_CLASS;
125 /* Internal Hooks */
126 #ifdef __AROS__
127 struct Hook _WandererIntern_hook_standard;
128 struct Hook _WandererIntern_hook_action;
129 struct Hook _WandererIntern_hook_backdrop;
130 #else
131 struct Hook *_WandererIntern_hook_standard;
132 struct Hook *_WandererIntern_hook_action;
133 struct Hook *_WandererIntern_hook_backdrop;
134 #endif
136 /*** Instance Data **********************************************************/
137 struct Wanderer_DATA
139 struct Screen *wd_Screen;
141 Object *wd_Prefs,
142 *wd_ActiveWindow,
143 *wd_WorkbenchWindow,
144 *wd_AboutWindow;
146 struct MUI_InputHandlerNode wd_TimerIHN;
147 struct MsgPort *wd_CommandPort;
148 struct MUI_InputHandlerNode wd_CommandIHN;
149 struct MsgPort *wd_NotifyPort;
150 struct MUI_InputHandlerNode wd_NotifyIHN;
152 IPTR wd_PrefsIntern;
153 BOOL wd_Option_BackDropMode;
156 const UBYTE wand_titlestr[] = WANDERERSTR;
157 const UBYTE wand_versionstr[] = VERSION;
158 const UBYTE wand_copyrightstr[] = WANDERERCOPY;
159 const UBYTE wand_authorstr[] = "The AROS Dev Team";
160 const char wand_namestr[] = "Wanderer";
162 /*** Macros *****************************************************************/
163 #define SETUP_WANDERER_INST_DATA struct Wanderer_DATA *data = INST_DATA(CLASS, self)
165 /**************************************************************************
166 * HOOK FUNCS *
167 **************************************************************************/
168 ///Wanderer__HookFunc_DisplayCopyFunc()
169 #ifdef __AROS__
170 AROS_UFH3
172 BOOL, Wanderer__HookFunc_DisplayCopyFunc,
173 AROS_UFHA(struct Hook *, hook, A0),
174 AROS_UFHA(struct dCopyStruct *, obj, A2),
175 AROS_UFHA(APTR, unused_param, A1)
178 #else
179 HOOKPROTO(Wanderer__HookFunc_DisplayCopyFunc, BOOL, struct dCopyStruct *obj, APTR unused_param)
181 #endif
182 AROS_USERFUNC_INIT
184 struct MUIDisplayObjects *d = (struct MUIDisplayObjects *) obj->userdata;
186 if ((obj->flags & ACTION_UPDATE) == 0)
188 d->updateme = TRUE;
190 if ((obj->filelen < 8192) && (d->numfiles > 0))
192 d->smallobjects++;
193 if (d->smallobjects >= 20) d->smallobjects = 0;
195 else
197 d->smallobjects = 0;
200 if (d->smallobjects > 0)
201 d->updateme = FALSE;
203 if (d->updateme)
205 SET(d->fileObject, MUIA_Text_Contents, obj->file);
206 SET(d->sourceObject, MUIA_Text_Contents, obj->spath);
209 if (d->action != ACTION_DELETE)
211 d->bytes += obj->actlen;
213 if ((obj->flags & ACTION_UPDATE) == 0)
215 if (d->updateme)
217 SET(d->gauge, MUIA_Gauge_Current, 0);
218 SET(d->destObject, MUIA_Text_Contents, obj->dpath);
220 d->numfiles++;
222 else
224 if (d->updateme &&(obj->totallen <= obj->filelen))
226 double rate = (double) (((double) obj->totallen) / (((double) obj->difftime) / ((double) CLOCKS_PER_SEC))) / 1024.0;
227 if (rate < 1024.0) sprintf(d->SpeedBuffer, "%.2f kBytes/s", rate); else sprintf(d->SpeedBuffer, "%.2f MBytes/s", rate / 1024.0);
228 SetAttrs(d->gauge, MUIA_Gauge_Current, (ULONG) (32768.0 * (double) obj->totallen / (double) obj->filelen), MUIA_Gauge_InfoText, d->SpeedBuffer, TAG_DONE);
232 if (d->updateme)
234 if (d->bytes < 1048576)
236 if (obj->filelen < 1048576)
238 sprintf(
239 d->Buffer, "%s %ld %s %.2f kBytes %s %.2f kBytes",
240 _(MSG_WANDERER_FILEACCESS_NOOFFILES), d->numfiles, _(MSG_WANDERER_FILEACCESS_ACTUAL), (double) obj->filelen / 1024.0, _(MSG_WANDERER_FILEACCESS_TOTAL), (double) d->bytes / 1024.0
243 else
245 sprintf(
246 d->Buffer, "%s %ld %s %.2f MBytes %s %.2f kBytes",
247 _(MSG_WANDERER_FILEACCESS_NOOFFILES), d->numfiles, _(MSG_WANDERER_FILEACCESS_ACTUAL), (double) obj->filelen / 1048576.0, _(MSG_WANDERER_FILEACCESS_TOTAL), (double) d->bytes / 1024.0
251 else
253 if (obj->filelen < 1048576)
255 sprintf(
256 d->Buffer, "%s %ld %s %.2f kBytes %s %.2f MBytes",
257 _(MSG_WANDERER_FILEACCESS_NOOFFILES), d->numfiles, _(MSG_WANDERER_FILEACCESS_ACTUAL), (double) obj->filelen / 1024.0, _(MSG_WANDERER_FILEACCESS_TOTAL), (double) d->bytes / 1048576.0
260 else
262 sprintf(
263 d->Buffer, "%s %ld %s %.2f MBytes %s %.2f MBytes",
264 _(MSG_WANDERER_FILEACCESS_NOOFFILES), d->numfiles, _(MSG_WANDERER_FILEACCESS_ACTUAL), (double) obj->filelen / 1048576.0, _(MSG_WANDERER_FILEACCESS_TOTAL), (double) d->bytes / 1048576.0
268 SET(d->performanceObject, MUIA_Text_Contents, d->Buffer);
272 DoMethod(d->copyApp, MUIM_Application_InputBuffered);
274 /* read the stopflag and return TRUE if the user wanted to stop actionDir() */
275 if (d->stopflag == 1)
276 return TRUE;
277 else
278 return FALSE;
280 AROS_USERFUNC_EXIT
282 #ifndef __AROS__
283 MakeStaticHook(Hook_DisplayCopyFunc,Wanderer__HookFunc_DisplayCopyFunc);
284 #endif
287 ///Wanderer__HookFunc_AskDeleteFunc()
288 #ifdef __AROS__
289 AROS_UFH3
291 ULONG, Wanderer__HookFunc_AskDeleteFunc,
292 AROS_UFHA(struct Hook *, hook, A0),
293 AROS_UFHA(struct dCopyStruct *, obj, A2),
294 AROS_UFHA(APTR, unused_param, A1)
297 #else
298 HOOKPROTO(Wanderer__HookFunc_AskDeleteFunc, ULONG, struct dCopyStruct *obj, APTR unused_param)
300 #endif
301 AROS_USERFUNC_INIT
303 ULONG back = DELMODE_NONE;
305 UWORD ret = 0;
306 char *string = NULL;
308 if (obj->file)
310 if (obj->type == 0)
312 string = CombineString("%s\n\033b%s\033n\n%s\n\033b%s\033n %s",
313 _(MSG_REQU_DELETE_FILE_S), obj->file, _(MSG_REQU_DELETE_FILE_M), obj->spath, _(MSG_REQU_DELETE_FILE_E) );
315 else if (obj->type == 1)
317 string = CombineString("%s\n\033b%s\033n\n%s\n\033b%s\033n %s",
318 _(MSG_REQU_FILEUNPROTECT_S), obj->file, _(MSG_REQU_FILEUNPROTECT_M), obj->spath, _(MSG_REQU_FILEUNPROTECT_E) );
320 else if (obj->type == 2)
322 string = CombineString("%s\n\033b%s\033n\n%s\n\033b%s\033n %s",
323 _(MSG_REQU_OVERWRITE_S), obj->file, _(MSG_REQU_OVERWRITE_M), obj->spath, _(MSG_REQU_OVERWRITE_E) );
325 else
327 string = CombineString("%s\n\033b%s\033n\n%s\n\033b%s\033n%s",
328 _(MSG_NOFILEACCESS_S), obj->file, _(MSG_NOFILEACCESS_M), obj->spath, _(MSG_NOFILEACCESS_E) );
331 else
333 if (obj->type == 0) string = CombineString("%s \033b%s\033n %s", _(MSG_REQU_DELETE_DRAWER_S), obj->spath, _(MSG_REQU_DELETE_DRAWER_E) );
334 else if (obj->type == 1) string = CombineString("%s\n\033b%s\033n %s", _(MSG_REQU_PROTECTION_UNPROTECTDRAWER_S), obj->spath, _(MSG_REQU_PROTECTION_UNPROTECTDRAWER_E) );
335 else if (obj->type == 3) string = CombineString("%s\n\033b%s %s", _(MSG_NODRAWERACCESS_S), obj->spath, _(MSG_NODRAWERACCESS_E) );
338 if (string)
340 if (obj->type == 0) ret = AskChoiceCentered( _(MSG_REQU_DELETE), string, _(MSG_REQU_DELETE_YESNO), 0);
341 else if (obj->type == 1) ret = AskChoiceCentered( _(MSG_REQU_PROTECTION), string, _(MSG_REQU_PROTECTION_UNPROTECT), 0);
342 else if (obj->type == 2) ret = AskChoiceCentered( _(MSG_REQU_OVERWRITE), string, _(MSG_REQU_OVERWRITE_YESNO), 0);
343 else ret = AskChoiceCentered( _(MSG_REQU_OVERWRITE), string, _(MSG_REQU_OVERWRITE_SKIPABORT), 0);
344 freeString(NULL, string);
347 if (ret == 0) back = DELMODE_NONE;
348 else if (ret == 1) back = DELMODE_DELETE;
349 else if (ret == 2) back = DELMODE_ALL;
350 else if (ret == 3) back = DELMODE_NO;
352 return back;
354 AROS_USERFUNC_EXIT
356 #ifndef __AROS__
357 MakeStaticHook(Hook_AskDeleteFunc,Wanderer__HookFunc_AskDeleteFunc);
358 #endif
361 ///Wanderer__Func_CopyDropEntries()
362 AROS_UFH3(void, Wanderer__Func_CopyDropEntries,
363 AROS_UFHA(STRPTR, argPtr, A0),
364 AROS_UFHA(ULONG, argSize, D0),
365 AROS_UFHA(struct ExecBase *, SysBase, A6))
367 AROS_USERFUNC_INIT
369 struct IconList_Drop_Event *copyFunc_DropEvent = FindTask(NULL)->tc_UserData;
371 D(bug("[Wanderer]: %s()\n", __PRETTY_FUNCTION__));
373 if (copyFunc_DropEvent)
375 struct MUIDisplayObjects dobjects;
376 struct IconList_Drop_SourceEntry *currententry;
377 #ifdef __AROS__
378 struct Hook displayCopyHook;
379 struct Hook displayDelHook;
380 displayCopyHook.h_Entry = (HOOKFUNC) Wanderer__HookFunc_DisplayCopyFunc;
381 displayDelHook.h_Entry = (HOOKFUNC) Wanderer__HookFunc_AskDeleteFunc;
382 #else
383 struct Hook *displayCopyHook;
384 struct Hook *displayDelHook;
385 displayCopyHook = &Hook_DisplayCopyFunc;
386 displayDelHook = &Hook_AskDeleteFunc;
387 #endif
389 if (CreateCopyDisplay(ACTION_COPY, &dobjects))
391 while ((currententry = (struct IconList_Drop_SourceEntry *)RemTail(&copyFunc_DropEvent->drop_SourceList)) != NULL)
393 D(bug("[Wanderer] %s: Copying '%s' to '%s'\n", __PRETTY_FUNCTION__, currententry->dropse_Node.ln_Name, copyFunc_DropEvent->drop_TargetPath));
395 CopyContent(NULL,
396 currententry->dropse_Node.ln_Name, copyFunc_DropEvent->drop_TargetPath,
397 TRUE, ACTION_COPY, &displayCopyHook, &displayDelHook, (APTR) &dobjects);
399 FreeVec(currententry->dropse_Node.ln_Name);
400 FreeMem(currententry, sizeof(struct IconList_Drop_SourceEntry));
402 /* delete copy window */
403 DisposeCopyDisplay(&dobjects);
406 if (copyFunc_DropEvent->drop_TargetPath) FreeVec(copyFunc_DropEvent->drop_TargetPath);
407 FreeMem(copyFunc_DropEvent, sizeof(struct IconList_Drop_Event));
409 return;
411 AROS_USERFUNC_EXIT
415 ///Wanderer__HookFunc_ActionFunc()
416 #ifdef __AROS__
417 AROS_UFH3
419 void, Wanderer__HookFunc_ActionFunc,
420 AROS_UFHA(struct Hook *, hook, A0),
421 AROS_UFHA(Object *, obj, A2),
422 AROS_UFHA(struct IconWindow_ActionMsg *, msg, A1)
425 #else
426 HOOKPROTO(Wanderer__HookFunc_ActionFunc, void, Object *obj, struct IconWindow_ActionMsg *msg)
428 #endif
429 AROS_USERFUNC_INIT
431 D(bug("[Wanderer]: %s()\n", __PRETTY_FUNCTION__));
433 if (msg->type == ICONWINDOW_ACTION_OPEN)
435 static unsigned char buf[1024];
436 IPTR offset;
437 struct IconList_Entry *ent = (void*)MUIV_IconList_NextIcon_Start;
439 DoMethod(msg->iconlist, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR)&ent);
440 if ((IPTR)ent == (IPTR)MUIV_IconList_NextIcon_End)
442 D(bug("[Wanderer] %s: ICONWINDOW_ACTION_OPEN: NextIcon returned MUIV_IconList_NextIcon_TAG_DONE)\n", __PRETTY_FUNCTION__));
443 return;
446 offset = strlen(ent->ile_IconEntry->ie_IconNode.ln_Name) - 5;
448 if ((msg->isroot) && (ent->type == ST_ROOT))
450 strcpy((STRPTR)buf, ent->label);
452 else
454 strcpy((STRPTR)buf, ent->ile_IconEntry->ie_IconNode.ln_Name);
457 D(bug("[Wanderer] %s: ICONWINDOW_ACTION_OPEN - offset = %d, buf = %s\n", __PRETTY_FUNCTION__, offset, buf));
459 if ((ent->type == ST_ROOT) || (ent->type == ST_USERDIR) || (ent->type == ST_LINKDIR))
461 Object *cstate = (Object*)(((struct List*)XGET(_app(obj), MUIA_Application_WindowList))->lh_Head);
462 Object *prefs = (Object*) XGET(_app(obj), MUIA_Wanderer_Prefs);
463 Object *child;
465 /* open new window if root or classic navigation set */
466 if ( (msg->isroot) || (XGET(prefs, MUIA_IconWindowExt_Toolbar_NavigationMethod) == WPD_NAVIGATION_CLASSIC) )
468 while ((child = NextObject(&cstate)))
470 if (XGET(child, MUIA_UserData))
472 STRPTR child_drawer = (STRPTR)XGET(child, MUIA_IconWindow_Location);
473 if (child_drawer && !Stricmp(buf,(CONST_STRPTR)child_drawer))
475 BOOL is_open = ( BOOL )XGET(child, MUIA_Window_Open);
477 if (!is_open)
479 DoMethod(child, MUIM_IconWindow_Open);
481 else
483 DoMethod(child, MUIM_Window_ToFront);
484 SET(child, MUIA_Window_Activate, TRUE);
487 return;
492 /* Check if the window for this drawer is already opened */
493 DoMethod(_WandererIntern_AppObj, MUIM_Wanderer_CreateDrawerWindow, (IPTR) buf);
494 // FIXME: error handling
496 else
498 /* open drawer in same window */
499 SET(obj, MUIA_IconWindow_Location, (IPTR) buf);
503 else if ((ent->type == ST_FILE) || (ent->type == ST_LINKFILE))
505 BPTR newwd, oldwd, file;
507 /* Set the CurrentDir to the path of the executable to be started */
508 file = Lock(ent->ile_IconEntry->ie_IconNode.ln_Name, SHARED_LOCK);
509 if(file)
511 newwd = ParentDir(file);
512 oldwd = CurrentDir(newwd);
514 if (!OpenWorkbenchObject(ent->ile_IconEntry->ie_IconNode.ln_Name, TAG_DONE))
516 execute_open_with_command(newwd, FilePart(ent->ile_IconEntry->ie_IconNode.ln_Name));
519 CurrentDir(oldwd);
520 UnLock(newwd);
521 UnLock(file);
525 else if (msg->type == ICONWINDOW_ACTION_DIRUP)
528 STRPTR actual_drawer = (STRPTR)XGET(obj, MUIA_IconWindow_Location);
529 STRPTR parent_drawer = strrchr(actual_drawer,'/');
530 STRPTR root_drawer = strrchr(actual_drawer,':');
532 /* check if dir is not drive root dir */
533 if ( strlen(root_drawer) > 1 )
535 /* check if second or third level directory*/
536 if (!parent_drawer)
538 (*(root_drawer+1)) = 0;
539 SET(obj, MUIA_IconWindow_Location, actual_drawer);
542 else
544 (*parent_drawer) = 0;
545 SET(obj, MUIA_IconWindow_Location, actual_drawer);
550 else if (msg->type == ICONWINDOW_ACTION_CLICK)
552 if (!msg->click->shift)
554 Object *cstate = (Object*)(((struct List*)XGET(_WandererIntern_AppObj, MUIA_Application_WindowList))->lh_Head);
555 Object *child;
557 while ((child = NextObject(&cstate)))
559 if (XGET(child, MUIA_UserData))
561 if (child != obj) DoMethod(child, MUIM_IconWindow_UnselectAll);
566 else if (msg->type == ICONWINDOW_ACTION_ICONDROP)
568 struct Process *wandererCopyProcess;
569 struct IconList_Drop_Event *dropevent = (struct IconList_Drop_Event *)msg->drop;
572 wandererCopyProcess = CreateNewProcTags(
573 NP_Entry, (IPTR)Wanderer__Func_CopyDropEntries,
574 NP_Name, "Wanderer FileCopy Operation",
575 NP_Synchronous, FALSE,
576 NP_UserData, (IPTR)dropevent,
577 NP_StackSize, 40000,
578 TAG_DONE);
581 else if (msg->type == ICONWINDOW_ACTION_APPWINDOWDROP)
583 struct Screen *wscreen = NULL;
584 struct Layer *layer;
586 /* get wanderers screen struct and the layer located at cursor position afterwards */
587 get( obj, MUIA_Window_Screen, &wscreen);
588 layer = WhichLayer(&wscreen->LayerInfo,wscreen->MouseX,wscreen->MouseY);
590 if (layer)
592 struct Window *win = (struct Window *) layer->Window;
593 if (win)
595 struct List AppList;
596 ULONG files = 0;
597 BOOL fail = FALSE;
598 struct IconList_Entry *ent;
600 NewList(&AppList);
602 ent = (void*)MUIV_IconList_NextIcon_Start;
603 /* process all selected entries */
606 DoMethod(msg->iconlist, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR) &ent);
607 /* if not end of selection, process */
608 if ( (int)ent != MUIV_IconList_NextIcon_End )
610 struct AppW *a = AllocVec(sizeof(struct AppW), MEMF_CLEAR);
611 if (a)
613 a->name = AllocVec(strlen(ent->ile_IconEntry->ie_IconNode.ln_Name)+1, MEMF_CLEAR);
614 if (a->name)
616 files++;
617 strcpy(a->name, ent->ile_IconEntry->ie_IconNode.ln_Name);
618 AddTail(&AppList, (struct Node *) a);
620 else
622 FreeVec(a);
623 fail = TRUE;
626 else fail = TRUE;
629 while ( ((int)ent != MUIV_IconList_NextIcon_End) && !fail);
631 if (!fail && (files > 0))
633 STRPTR *filelist = AllocVec(sizeof(STRPTR) * files, MEMF_CLEAR);
634 if (filelist != NULL)
636 STRPTR *flist = filelist;
637 if (!IsListEmpty(&AppList))
639 struct Node *succ;
640 struct Node *s = AppList.lh_Head;
641 while (((succ = ((struct Node*) s)->ln_Succ) != NULL) && !fail)
643 *flist ++ = ((struct AppW *) s)->name;
644 s = succ;
647 D(bug("[WANDERER] AppWindowMsg: win:%s files:%s mx:%d my:%d\n",win->Title, filelist, wscreen->MouseX - win->LeftEdge, wscreen->MouseY - win->TopEdge);)
648 /* send appwindow msg struct containing selected files to destination */
649 SendAppWindowMessage(win, files, (char **)filelist, 0, wscreen->MouseX - win->LeftEdge, wscreen->MouseY - win->TopEdge, 0, 0);
652 FreeVec(filelist);
655 if (!IsListEmpty(&AppList))
657 struct Node *succ;
658 struct Node *s = AppList.lh_Head;
659 while (((succ = ((struct Node*) s)->ln_Succ) != NULL))
661 if ( ((struct AppW *) s)->name != NULL )
662 FreeVec(((struct AppW *) s)->name);
663 if ( s != NULL )
664 FreeVec(s);
665 s = succ;
672 AROS_USERFUNC_EXIT
674 #ifndef __AROS__
675 MakeStaticHook(Hook_ActionFunc,Wanderer__HookFunc_ActionFunc);
676 #endif
679 ///Wanderer__HookFunc_StandardFunc()
680 #ifdef __AROS__
681 AROS_UFH3
683 void, Wanderer__HookFunc_StandardFunc,
684 AROS_UFHA(struct Hook *, hook, A0),
685 AROS_UFHA(void *, dummy, A2),
686 AROS_UFHA(void **, funcptr, A1)
689 #else
690 HOOKPROTO(Wanderer__HookFunc_StandardFunc, void, void *dummy, void **funcptr)
692 #endif
693 AROS_USERFUNC_INIT
695 void (*func) (ULONG *) = (void (*)(ULONG *)) (*funcptr);
696 if (func) func((ULONG *)(funcptr + 1));
698 AROS_USERFUNC_EXIT
700 #ifndef __AROS__
701 MakeStaticHook(Hook_StandardFunc,Wanderer__HookFunc_StandardFunc);
702 #endif
705 ///Wanderer__HookFunc_BackdropFunc()
706 #ifdef __AROS__
707 AROS_UFH3
709 void, Wanderer__HookFunc_BackdropFunc,
710 AROS_UFHA(struct Hook *, hook, A0),
711 AROS_UFHA(void *, dummy, A2),
712 AROS_UFHA(void **, funcptr, A1)
715 #else
716 HOOKPROTO(Wanderer__HookFunc_BackdropFunc, void, void *dummy, void **funcptr)
718 #endif
719 AROS_USERFUNC_INIT
721 struct Wanderer_DATA *data = INST_DATA(_WandererIntern_CLASS, _WandererIntern_AppObj);
722 BOOL wb_iscurrentlybd;
724 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc()\n"));
725 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Private data @ %x\n", data));
727 if (!data->wd_WorkbenchWindow)
729 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: No Workbench Window\n"));
730 return;
733 wb_iscurrentlybd = (BOOL)XGET(data->wd_WorkbenchWindow, MUIA_IconWindow_IsBackdrop);
735 if (wb_iscurrentlybd != data->wd_Option_BackDropMode)
737 BOOL isOpen = (BOOL)XGET(data->wd_WorkbenchWindow, MUIA_Window_Open);
738 Object *win_Active = NULL;
740 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Backdrop mode change requested!\n"));
741 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Disposing of existing Workbench window Obj ..\n"));
742 if (isOpen)
743 SET(data->wd_WorkbenchWindow, MUIA_Window_Open, FALSE);
745 if (data->wd_WorkbenchWindow == data->wd_ActiveWindow)
747 data->wd_ActiveWindow = NULL;
749 else
751 win_Active = data->wd_ActiveWindow;
754 /* Kill our close request notification .. */
755 DoMethod
757 data->wd_WorkbenchWindow, MUIM_KillNotify, MUIA_Window_CloseRequest
760 /* .. And dispose of the window */
761 DoMethod(_WandererIntern_AppObj, OM_REMMEMBER, data->wd_WorkbenchWindow);
762 MUI_DisposeObject(data->wd_WorkbenchWindow);
763 data->wd_WorkbenchWindow = NULL;
765 #if defined(DEBUG)
766 if (data->wd_Option_BackDropMode)
768 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Creating new Workbench window Obj (BACKDROP MODE)..\n"));
770 else
772 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Creating new Workbench window Obj (NORMAL MODE)..\n"));
774 #endif
775 data->wd_WorkbenchWindow = (Object *) DoMethod
777 _WandererIntern_AppObj, MUIM_Wanderer_CreateDrawerWindow, (IPTR) NULL
780 if ((data->wd_WorkbenchWindow) && (isOpen))
782 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Making Workbench window visable..\n"));
783 DoMethod(data->wd_WorkbenchWindow, MUIM_IconWindow_Open);
784 DoMethod(data->wd_WorkbenchWindow, MUIM_Window_ToBack);
787 if (win_Active)
789 SET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow, win_Active);
791 else if (data->wd_WorkbenchWindow)
793 SET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow, data->wd_WorkbenchWindow);
796 AROS_USERFUNC_EXIT
798 #ifndef __AROS__
799 MakeStaticHook(Hook_BackdropFunc,Wanderer__HookFunc_BackdropFunc);
800 #endif
802 /******** code from workbench/c/Info.c *******************/
803 ///fmtlarge()
804 static void fmtlarge(UBYTE *buf, ULONG num)
806 UQUAD d;
807 UBYTE *ch;
808 struct
810 IPTR val;
811 IPTR dec;
812 } array =
814 num,
818 if (num >= 0x40000000)
820 array.val = num >> 30;
821 d = ((UQUAD)num * 10 + 0x20000000) / 0x40000000;
822 array.dec = d % 10;
823 //ch = 'G';
824 ch = _(MSG_MEM_G);
826 else if (num >= 0x100000)
828 array.val = num >> 20;
829 d = ((UQUAD)num * 10 + 0x80000) / 0x100000;
830 array.dec = d % 10;
831 //ch = 'M';
832 ch = _(MSG_MEM_M);
834 else if (num >= 0x400)
836 array.val = num >> 10;
837 d = (num * 10 + 0x200) / 0x400;
838 array.dec = d % 10;
839 //ch = 'K';
840 ch = _(MSG_MEM_K);
842 else
844 array.val = num;
845 array.dec = 0;
846 d = 0;
847 //ch = 'B';
848 ch = _(MSG_MEM_B);
851 if (!array.dec && (d > array.val * 10))
853 array.val++;
856 RawDoFmt(array.dec ? "%lu.%lu" : "%lu", &array, NULL, buf);
857 while (*buf) { buf++; }
858 *buf++ = *ch;
859 *buf = '\0';
863 ///GetScreenTitle()
864 STRPTR GetScreenTitle(VOID)
866 static TEXT title[256];
867 UBYTE chip[10], fast[10];
868 ULONG __availMem;
870 __availMem = AvailMem(MEMF_CHIP);
871 fmtlarge(chip, __availMem);
872 __availMem = AvailMem(MEMF_FAST);
873 fmtlarge(fast, __availMem);
875 sprintf(title, _(MSG_SCREENTITLE), chip, fast);
877 return title;
881 ///GetUserScreenTitle()
882 STRPTR GetUserScreenTitle(Object *self)
884 /*Work in progress :-)
886 char *screentitlestr;
887 int screentitleleng;
889 GET(self, MUIA_IconWindowExt_ScreenTitle_String, &screentitlestr);
891 screentitleleng = strlen(screentitlestr);
893 if (screentitleleng<1)
895 return GetScreenTitle();
897 return screentitlestr;
902 enum
904 MEN_WANDERER = 1,
905 MEN_WANDERER_BACKDROP,
906 MEN_WANDERER_EXECUTE,
907 MEN_WANDERER_SHELL,
908 MEN_WANDERER_AROS_GUISETTINGS,
909 MEN_WANDERER_AROS_ABOUT,
910 MEN_WANDERER_ABOUT,
911 MEN_WANDERER_QUIT,
912 MEN_WANDERER_SHUTDOWN,
914 MEN_WINDOW_NEW_DRAWER,
915 MEN_WINDOW_OPEN_PARENT,
916 MEN_WINDOW_CLOSE,
917 MEN_WINDOW_UPDATE,
919 MEN_WINDOW_SELECT,
920 MEN_WINDOW_CLEAR,
922 MEN_WINDOW_SNAP_WIN,
923 MEN_WINDOW_SNAP_ALL,
925 MEN_WINDOW_VIEW_ICON,
926 MEN_WINDOW_VIEW_DETAIL,
927 MEN_WINDOW_VIEW_ALL,
928 MEN_WINDOW_VIEW_HIDDEN,
930 MEN_WINDOW_SORT_ENABLE,
931 MEN_WINDOW_SORT_NOW,
932 MEN_WINDOW_SORT_NAME,
933 MEN_WINDOW_SORT_TYPE,
934 MEN_WINDOW_SORT_DATE,
935 MEN_WINDOW_SORT_SIZE,
936 MEN_WINDOW_SORT_REVERSE,
937 MEN_WINDOW_SORT_TOPDRAWERS,
938 MEN_WINDOW_SORT_GROUP,
940 MEN_ICON_OPEN,
941 MEN_ICON_RENAME,
942 MEN_ICON_INFORMATION,
943 MEN_ICON_SNAPSHOT,
944 MEN_ICON_UNSNAPSHOT,
945 MEN_ICON_LEAVEOUT,
946 MEN_ICON_PUTAWAY,
947 MEN_ICON_DELETE,
948 MEN_ICON_FORMAT,
949 MEN_ICON_EMPTYTRASH
953 ///execute_open_with_command()
954 /**************************************************************************
955 Open the execute window. Similar to below but you can also set the
956 command. Called when item is openend
957 **************************************************************************/
958 void execute_open_with_command(BPTR cd, STRPTR contents)
960 BPTR lock;
962 if (cd !=(BPTR) NULL) lock = cd;
963 else lock = Lock("RAM:", ACCESS_READ);
965 OpenWorkbenchObject
967 "WANDERER:Tools/ExecuteCommand",
968 WBOPENA_ArgLock, (IPTR) lock,
969 WBOPENA_ArgName, (IPTR) contents,
970 TAG_DONE
973 if (cd ==(BPTR) NULL) UnLock(lock);
977 ///wanderer_menufunc_wanderer_execute()
978 /**************************************************************************
979 Open the execute window
981 This function will always get the current drawer as argument
982 **************************************************************************/
983 VOID wanderer_menufunc_wanderer_execute(STRPTR *cdptr)
985 //TODO: remove the STRPTR *cdptr from top
986 //TODO:remove this commented out stuff
987 //BPTR lock = NULL;
988 //if (cdptr != NULL) lock = Lock(*cdptr, SHARED_LOCK);
989 Object *win = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
990 STRPTR dr = ( STRPTR )XGET( win, MUIA_IconWindow_Location );
991 BPTR cd = Lock(dr,SHARED_LOCK);
992 execute_open_with_command(cd, NULL);
993 if (cd) UnLock(cd);
995 /*******************************/
998 ///wanderer_menufunc_wanderer_shell()
999 void wanderer_menufunc_wanderer_shell(STRPTR *cd_ptr)
1001 //TODO: remove the STRPTR *cdptr from top
1002 //TODO:remove this commented out stuff
1003 //BPTR cd = Lock(*cd_ptr,ACCESS_READ);
1004 Object *win = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1005 STRPTR dr = ( STRPTR )XGET( win, MUIA_IconWindow_Location );
1006 BPTR cd;
1008 if (!dr)
1010 dr = "";
1013 cd = Lock(dr, ACCESS_READ);
1014 if (SystemTags("NewShell", NP_CurrentDir, (IPTR)cd, TAG_DONE) == -1)
1016 UnLock(cd);
1021 ///wanderer_menufunc_wanderer_backdrop()
1022 void wanderer_menufunc_wanderer_backdrop(Object **pstrip)
1024 struct Wanderer_DATA *data = INST_DATA(_WandererIntern_CLASS, _WandererIntern_AppObj);
1025 Object *strip = *pstrip;
1026 Object *item = FindMenuitem(strip, MEN_WANDERER_BACKDROP);
1028 D(bug("[WANDERER] wanderer_menufunc_wanderer_backdrop()\n"));
1030 if (item != NULL)
1032 data->wd_Option_BackDropMode = (BOOL)XGET(item, MUIA_Menuitem_Checked);
1033 SET(data->wd_WorkbenchWindow, MUIA_IconWindow_IsBackdrop, data->wd_Option_BackDropMode);
1038 ///wanderer_menufunc_window_newdrawer()
1039 void wanderer_menufunc_window_newdrawer(STRPTR *cdptr)
1041 //TODO: remove the STRPTR *cdptr from top
1043 Object *win = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1044 STRPTR dr = ( STRPTR )XGET( win, MUIA_IconWindow_Location );
1045 Object *actwindow = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1046 Object *wbwindow = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_WorkbenchWindow);
1047 BPTR lock;
1049 D(bug("[wanderer] wanderer_menufunc_window_newdrawer(%s)\n", dr));
1050 if (actwindow == wbwindow)
1052 /* This check is necessary because WorkbenchWindow has path RAM: */
1053 D(bug("[wanderer] wanderer_menufunc_window_newdrawer: Can't call WBNewDrawer for WorkbenchWindow\n"));
1054 return;
1056 if ( XGET(actwindow, MUIA_Window_Open) == FALSE )
1058 D(bug("[wanderer] wanderer_menufunc_window_newdrawer: Can't call WBNewDrawer: the active window isn't open\n"));
1059 return;
1062 lock = Lock(dr, ACCESS_READ);
1063 OpenWorkbenchObject
1065 "WANDERER:Tools/WBNewDrawer",
1066 WBOPENA_ArgLock, (IPTR) lock,
1067 WBOPENA_ArgName, 0,
1068 TAG_DONE
1070 UnLock(lock);
1074 ///wanderer_menufunc_window_openparent()
1075 void wanderer_menufunc_window_openparent(STRPTR *cdptr)
1077 //TODO: Remove the **cdptr stuff from top
1078 Object *win = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1079 STRPTR dr = ( STRPTR )XGET( win, MUIA_IconWindow_Location );
1081 IPTR path_len=0;
1082 STRPTR last_letter=NULL;
1083 STRPTR thispath;
1084 STRPTR buf;
1085 Object *cstate;
1086 Object *child;
1087 BOOL foundSlash, foundColon;
1088 int i = 0;
1090 last_letter = &dr[ strlen(dr) - 1 ];
1092 thispath = FilePart(dr);
1094 if (*last_letter==0x3a) return; /* Top Drawer has no parent to open */
1096 last_letter = &thispath[strlen(thispath)-1];
1098 if (*last_letter==0x3a)
1099 path_len = (IPTR)(thispath-(IPTR)(dr));
1100 else
1101 path_len = (IPTR)((thispath-(IPTR)(dr))-1);
1103 buf = AllocVec((path_len+1),MEMF_PUBLIC|MEMF_CLEAR);
1104 CopyMem(dr, buf, path_len);
1106 cstate = (Object*)(((struct List*)XGET(_WandererIntern_AppObj, MUIA_Application_WindowList))->lh_Head);
1109 // Make sure we have a correct path
1110 foundSlash = FALSE, foundColon = FALSE;
1111 i = 0; for ( ; i < path_len; i++ )
1113 if ( buf[ i ] == '/' ) foundSlash = TRUE;
1114 if ( buf[ i ] == ':' ) foundColon = TRUE;
1116 if ( !foundColon && !foundSlash )
1118 STRPTR newbuf = AllocVec ((path_len + 2), MEMF_PUBLIC|MEMF_CLEAR);
1119 sprintf(newbuf,"%s:",buf);
1120 FreeVec (buf);
1121 buf = newbuf;
1123 // Done with path correction check
1125 while ((child = NextObject(&cstate)))
1127 if (XGET(child, MUIA_UserData))
1129 STRPTR child_drawer = (STRPTR)XGET(child, MUIA_IconWindow_Location);
1130 if (child_drawer && !Stricmp(buf,child_drawer))
1132 int is_open = XGET(child, MUIA_Window_Open);
1133 if (!is_open)
1134 DoMethod(child, MUIM_IconWindow_Open);
1135 else
1137 DoMethod(child, MUIM_Window_ToFront);
1138 SET(child, MUIA_Window_Activate, TRUE);
1140 FreeVec(buf);
1141 return;
1146 DoMethod(_WandererIntern_AppObj, MUIM_Wanderer_CreateDrawerWindow, (IPTR) buf);
1147 FreeVec(buf);
1151 ///wanderer_menufunc_window_close()
1152 void wanderer_menufunc_window_close()
1154 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1155 SET(window, MUIA_Window_CloseRequest, TRUE);
1159 ///wanderer_menufunc_window_update()
1160 void wanderer_menufunc_window_update()
1162 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1163 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1165 if (iconList != NULL)
1167 DoMethod(iconList, MUIM_IconList_Update);
1172 ///wanderer_menufunc_window_clear()
1173 void wanderer_menufunc_window_clear()
1175 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1176 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1178 if (iconList != NULL)
1180 DoMethod(iconList, MUIM_IconList_UnselectAll);
1185 ///wanderer_menufunc_window_select()
1186 void wanderer_menufunc_window_select()
1188 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1189 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1191 if (iconList != NULL)
1193 DoMethod(iconList, MUIM_IconList_SelectAll);
1198 ///wanderer_menufunc_window_snapshot()
1199 void wanderer_menufunc_window_snapshot(IPTR *flags)
1201 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1202 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1203 char *dir_name = (char *)XGET(window, MUIA_IconWindow_Location);
1204 struct DiskObject *drawericon = NULL;
1205 IPTR geticon_error = 0;
1206 IPTR display_bits = 0, sort_bits = 0;
1207 BOOL snapshot_all = *flags;
1209 D(bug("[wanderer] wanderer_menufunc_window_snapshot()\n"));
1210 D(bug("[wanderer] wanderer_menufunc_window_snapshot: Dir '%s'\n", dir_name));
1212 if (snapshot_all == TRUE)
1214 struct IconList_Entry *icon_entry = (IPTR)MUIV_IconList_NextIcon_Start;
1215 struct IconEntry *node = NULL;
1216 struct TagItem icon_tags[] =
1218 { ICONPUTA_OnlyUpdatePosition, TRUE },
1219 { TAG_DONE, 0 }
1221 D(bug("[wanderer] wanderer_menufunc_window_snapshot: snapshot ALL\n"));
1225 DoMethod(iconList, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Visible, (IPTR)&icon_entry);
1227 if ((IPTR)icon_entry != MUIV_IconList_NextIcon_End)
1229 node = (struct IconEntry *)((IPTR)icon_entry - ((IPTR)&node->ie_IconListEntry - (IPTR)node));
1230 D(bug("[wanderer] wanderer_menufunc_window_snapshot: SNAPSHOT entry = '%s' @ %p, (%p)\n", icon_entry->ile_IconEntry->ie_IconNode.ln_Name, icon_entry, node));
1231 if (node->ie_DiskObj)
1233 node->ie_DiskObj->do_CurrentX = node->ie_IconX;
1234 node->ie_DiskObj->do_CurrentY = node->ie_IconY;
1235 PutIconTagList(icon_entry->ile_IconEntry->ie_IconNode.ln_Name, node->ie_DiskObj, icon_tags);
1237 else
1239 D(bug("[wanderer] wanderer_menufunc_window_snapshot: icon has no diskobj!\n"));
1242 else
1244 break;
1246 } while (TRUE);
1248 else
1250 D(bug("[wanderer] wanderer_menufunc_window_snapshot: snapshot WINDOW\n"));
1253 drawericon = GetIconTags(dir_name,
1254 ICONGETA_FailIfUnavailable, FALSE,
1255 ICONA_ErrorCode, &geticon_error,
1256 TAG_DONE);
1258 if (drawericon != NULL)
1260 if (drawericon->do_DrawerData == NULL)
1262 D(bug("[wanderer] wanderer_menufunc_window_snapshot: Icon for '%s' has no DRAWER data!\n", dir_name));
1263 drawericon->do_DrawerData = AllocMem(sizeof(struct DrawerData), MEMF_CLEAR|MEMF_PUBLIC);
1266 drawericon->do_Gadget.UserData = (APTR)1;
1268 drawericon->do_DrawerData->dd_NewWindow.TopEdge = XGET(window, MUIA_Window_TopEdge);
1269 drawericon->do_DrawerData->dd_NewWindow.LeftEdge = XGET(window, MUIA_Window_LeftEdge);
1270 drawericon->do_DrawerData->dd_NewWindow.Width = XGET(window, MUIA_Window_Width);
1271 drawericon->do_DrawerData->dd_NewWindow.Height = XGET(window, MUIA_Window_Height);
1273 GET(iconList, MUIA_IconList_DisplayFlags, &display_bits);
1274 if (display_bits & ICONLIST_DISP_SHOWINFO)
1276 D(bug("[wanderer] wanderer_menufunc_window_snapshot: ICONLIST_DISP_SHOWINFO\n"));
1277 drawericon->do_DrawerData->dd_Flags = 1;
1279 else
1281 drawericon->do_DrawerData->dd_Flags = 2;
1284 #warning "TODO: Icon sort flags are only really for text list mode ... fix"
1285 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1286 if (sort_bits & ICONLIST_SORT_BY_DATE)
1288 drawericon->do_DrawerData->dd_ViewModes = 3;
1290 else if (sort_bits & ICONLIST_SORT_BY_SIZE)
1292 drawericon->do_DrawerData->dd_ViewModes = 4;
1294 else
1296 drawericon->do_DrawerData->dd_ViewModes = 2;
1298 PutDiskObject(dir_name, drawericon);
1303 ///wanderer_menufunc_window_view_icons(Object **pstrip)
1304 void wanderer_menufunc_window_view_icons(Object **pstrip)
1306 Object *strip = *pstrip;
1307 Object *item = FindMenuitem(strip, MEN_WINDOW_VIEW_ALL);
1308 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1309 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1311 if ((item != NULL) && (iconList != NULL))
1313 IPTR display_bits = 0, menu_view_state = 0;
1314 GET(iconList, MUIA_IconList_DisplayFlags, &display_bits);
1316 GET(item, MUIA_Menuitem_Checked, &menu_view_state);
1318 if (menu_view_state)
1320 display_bits &= ~ICONLIST_DISP_SHOWINFO;
1322 else
1324 display_bits |= ICONLIST_DISP_SHOWINFO;
1327 SET(iconList, MUIA_IconList_DisplayFlags, display_bits);
1328 DoMethod(iconList, MUIM_IconList_Sort);
1333 ///wanderer_menufunc_window_view_hidden(Object **pstrip)
1334 void wanderer_menufunc_window_view_hidden(Object **pstrip)
1336 Object *strip = *pstrip;
1337 Object *item = FindMenuitem(strip, MEN_WINDOW_VIEW_HIDDEN);
1338 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1339 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1341 if ((item != NULL) && (iconList != NULL))
1343 IPTR display_bits = 0, menu_view_state = 0;
1344 GET(iconList, MUIA_IconList_DisplayFlags, &display_bits);
1346 GET(item, MUIA_Menuitem_Checked, &menu_view_state);
1348 if (menu_view_state)
1350 display_bits |= ICONLIST_DISP_SHOWHIDDEN;
1352 else
1354 display_bits &= ~ICONLIST_DISP_SHOWHIDDEN;
1357 SET(iconList, MUIA_IconList_DisplayFlags, display_bits);
1358 DoMethod(iconList, MUIM_IconList_Sort);
1362 ///wanderer_menufunc_window_sort_enable()
1363 void wanderer_menufunc_window_sort_enable(Object **pstrip)
1365 Object *strip = *pstrip;
1366 Object *item = FindMenuitem(strip, MEN_WINDOW_SORT_ENABLE);
1367 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1368 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1370 if (item != NULL)
1372 if (!XGET(item, MUIA_Disabled) && (iconList != NULL))
1374 IPTR sort_bits = 0;
1376 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1378 sort_bits &= ~(ICONLIST_SORT_MASK|ICONLIST_SORT_REVERSE);
1379 sort_bits |= ICONLIST_SORT_DRAWERS_MIXED;
1381 if( XGET(item, MUIA_Menuitem_Checked) )
1383 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_DATE)) != NULL)
1385 SET(item, MUIA_Disabled, FALSE);
1386 if( XGET(item, MUIA_Menuitem_Checked) )
1388 sort_bits |= ICONLIST_SORT_BY_DATE;
1391 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_SIZE)) != NULL)
1393 SET(item, MUIA_Disabled, FALSE);
1394 if( XGET(item, MUIA_Menuitem_Checked) )
1396 sort_bits |= ICONLIST_SORT_BY_SIZE;
1399 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_TYPE)) != NULL)
1401 SET(item, MUIA_Disabled, FALSE);
1402 if( XGET(item, MUIA_Menuitem_Checked) )
1404 sort_bits |= ICONLIST_SORT_MASK;
1407 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_NAME)) != NULL)
1409 SET(item, MUIA_Disabled, FALSE);
1410 if( XGET(item, MUIA_Menuitem_Checked) )
1412 sort_bits |= ICONLIST_SORT_BY_NAME;
1414 else
1415 if ((sort_bits & ICONLIST_SORT_MASK) == 0)
1417 NNSET(item, MUIA_Menuitem_Checked, TRUE);
1418 sort_bits |= ICONLIST_SORT_BY_NAME;
1421 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_REVERSE)) != NULL)
1423 SET(item, MUIA_Disabled, FALSE);
1424 if( XGET(item, MUIA_Menuitem_Checked) )
1426 sort_bits |= ICONLIST_SORT_REVERSE;
1429 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_TOPDRAWERS)) != NULL)
1431 SET(item, MUIA_Disabled, FALSE);
1432 if( XGET(item, MUIA_Menuitem_Checked) )
1434 sort_bits &= ~ICONLIST_SORT_DRAWERS_MIXED;
1437 D(bug("[wanderer] wanderer_menufunc_window_sort_enable: Setting sort flags %08x\n", sort_bits));
1439 else
1441 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_DATE)) != NULL)
1443 SET(item, MUIA_Disabled, TRUE);
1445 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_SIZE)) != NULL)
1447 SET(item, MUIA_Disabled, TRUE);
1449 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_TYPE)) != NULL)
1451 SET(item, MUIA_Disabled, TRUE);
1453 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_NAME)) != NULL)
1455 SET(item, MUIA_Disabled, TRUE);
1457 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_REVERSE)) != NULL)
1459 SET(item, MUIA_Disabled, TRUE);
1461 if ((item = FindMenuitem(strip, MEN_WINDOW_SORT_TOPDRAWERS)) != NULL)
1463 SET(item, MUIA_Disabled, TRUE);
1465 D(bug("[wanderer] wanderer_menufunc_window_sort_disable: Setting sort flags %08x\n", sort_bits));
1468 NNSET(iconList, MUIA_IconList_SortFlags, sort_bits);
1469 DoMethod(iconList, MUIM_IconList_Sort);
1475 ///wanderer_menufunc_window_sort_name()
1476 void wanderer_menufunc_window_sort_name(Object **pstrip)
1478 Object *strip = *pstrip;
1479 Object *item = FindMenuitem(strip, MEN_WINDOW_SORT_NAME);
1480 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1481 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1483 if (item != NULL && iconList != NULL)
1485 IPTR sort_bits = 0;
1486 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1488 /*name = date and size bit both NOT set*/
1489 sort_bits &= ~ICONLIST_SORT_MASK;
1490 if( XGET(item, MUIA_Menuitem_Checked) )
1492 sort_bits |= ICONLIST_SORT_BY_NAME;
1494 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1495 DoMethod(iconList, MUIM_IconList_Sort);
1500 ///wanderer_menufunc_window_sort_date()
1501 void wanderer_menufunc_window_sort_date(Object **pstrip)
1503 Object *strip = *pstrip;
1504 Object *item = FindMenuitem(strip, MEN_WINDOW_SORT_DATE);
1505 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1506 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1508 if (item != NULL && iconList != NULL)
1510 IPTR sort_bits = 0;
1511 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1513 /*exclude size bit*/
1514 sort_bits &= ~ICONLIST_SORT_MASK;
1515 if( XGET(item, MUIA_Menuitem_Checked) )
1517 sort_bits |= ICONLIST_SORT_BY_DATE;
1519 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1520 DoMethod(iconList, MUIM_IconList_Sort);
1525 ///wanderer_menufunc_window_sort_size()
1526 void wanderer_menufunc_window_sort_size(Object **pstrip)
1528 Object *strip = *pstrip;
1529 Object *item = FindMenuitem(strip, MEN_WINDOW_SORT_SIZE);
1530 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1531 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1533 if (item != NULL && iconList != NULL)
1535 IPTR sort_bits = 0;
1536 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1538 /*exclude date bit*/
1539 sort_bits &= ~ICONLIST_SORT_MASK;
1540 if( XGET(item, MUIA_Menuitem_Checked) )
1542 sort_bits |= ICONLIST_SORT_BY_SIZE;
1544 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1545 DoMethod(iconList, MUIM_IconList_Sort);
1550 ///wanderer_menufunc_window_sort_type()
1551 void wanderer_menufunc_window_sort_type(Object **pstrip)
1553 Object *strip = *pstrip;
1554 Object *item = FindMenuitem(strip, MEN_WINDOW_SORT_TYPE);
1555 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1556 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1558 if (item != NULL && iconList != NULL)
1560 IPTR sort_bits = 0;
1561 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1563 /*type = all sort bits set (name+date+size) */
1564 sort_bits &= ~ICONLIST_SORT_MASK;
1565 if( XGET(item, MUIA_Menuitem_Checked) )
1567 sort_bits |= ICONLIST_SORT_MASK;
1569 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1570 DoMethod(iconList, MUIM_IconList_Sort);
1575 ///wanderer_menufunc_window_sort_reverse()
1576 void wanderer_menufunc_window_sort_reverse(Object **pstrip)
1578 Object *strip = *pstrip;
1579 Object *item = FindMenuitem(strip, MEN_WINDOW_SORT_REVERSE);
1580 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1581 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1583 if (item != NULL && iconList != NULL)
1585 IPTR sort_bits = 0;
1586 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1588 if( XGET(item, MUIA_Menuitem_Checked) )
1590 sort_bits |= ICONLIST_SORT_REVERSE;
1592 else
1594 sort_bits &= ~ICONLIST_SORT_REVERSE;
1597 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1598 DoMethod(iconList, MUIM_IconList_Sort);
1603 ///wanderer_menufunc_window_sort_topdrawers()
1604 void wanderer_menufunc_window_sort_topdrawers(Object **pstrip)
1606 Object *strip = *pstrip;
1607 Object *item = FindMenuitem(strip, MEN_WINDOW_SORT_TOPDRAWERS);
1608 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1609 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1611 if (item != NULL && iconList != NULL)
1613 IPTR sort_bits = 0;
1614 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1616 if( XGET(item, MUIA_Menuitem_Checked) )
1618 sort_bits &= ~ICONLIST_SORT_DRAWERS_MIXED;
1620 else
1622 sort_bits |= ICONLIST_SORT_DRAWERS_MIXED;
1625 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1626 DoMethod(iconList, MUIM_IconList_Sort);
1631 ///wanderer_menufunc_icon_open()
1632 void wanderer_menufunc_icon_open()
1634 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1635 DoMethod(window, MUIM_IconWindow_DoubleClicked);
1639 ///wanderer_menufunc_icon_rename()
1640 void wanderer_menufunc_icon_rename(void)
1642 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1643 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1644 struct IconList_Entry *entry = (APTR) MUIV_IconList_NextIcon_Start;
1648 DoMethod(iconList, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR) &entry);
1650 if ((int)entry != MUIV_IconList_NextIcon_End)
1652 BPTR lock = Lock(entry->ile_IconEntry->ie_IconNode.ln_Name, ACCESS_READ);
1653 BPTR parent = ParentDir(lock);
1654 UnLock(lock);
1656 D(bug("[wanderer] wanderer_menufunc_icon_rename: selected = '%s'\n", entry->ile_IconEntry->ie_IconNode.ln_Name));
1658 OpenWorkbenchObject
1660 "WANDERER:Tools/WBRename",
1661 WBOPENA_ArgLock, (IPTR) parent,
1662 WBOPENA_ArgName, (IPTR) FilePart(entry->ile_IconEntry->ie_IconNode.ln_Name),
1663 TAG_DONE
1666 D(bug("[wanderer] wanderer_menufunc_icon_rename: selected = '%s'\n", entry->ile_IconEntry->ie_IconNode.ln_Name));
1668 UnLock(parent);
1670 else
1672 break;
1674 } while (TRUE);
1678 ///wanderer_menufunc_icon_information()
1679 void wanderer_menufunc_icon_information()
1681 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1682 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1683 struct IconList_Entry *entry = (IPTR)MUIV_IconList_NextIcon_Start;
1687 DoMethod(iconList, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR)&entry);
1689 if ((IPTR)entry != MUIV_IconList_NextIcon_End)
1691 BPTR lock, parent;
1692 STRPTR name;
1694 D(bug("[wanderer] wanderer_menufunc_icon_information: selected = '%s'\n", entry->ile_IconEntry->ie_IconNode.ln_Name));
1695 lock = Lock(entry->ile_IconEntry->ie_IconNode.ln_Name, ACCESS_READ);
1696 name = FilePart(entry->ile_IconEntry->ie_IconNode.ln_Name);
1697 if (name[0]) {
1698 parent = ParentDir(lock);
1699 UnLock(lock);
1700 } else
1701 parent = lock;
1703 D(bug("[wanderer] wanderer_menufunc_icon_information: name = '%s' lock = 0x%08lX\n", name, lock));
1704 WBInfo(parent, name, NULL);
1706 UnLock(parent);
1708 else
1710 break;
1712 } while (TRUE);
1716 ///wanderer_menufunc_icon_snapshot()
1717 void wanderer_menufunc_icon_snapshot(IPTR *flags)
1719 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1720 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1721 struct IconList_Entry *entry = (IPTR)MUIV_IconList_NextIcon_Start;
1722 struct IconEntry *node = NULL;
1723 BOOL snapshot = *flags;
1724 struct TagItem icontags[] =
1726 { ICONPUTA_OnlyUpdatePosition, TRUE },
1727 { TAG_DONE, 0 }
1730 D(bug("[wanderer] wanderer_menufunc_icon_snapshot()\n"));
1734 DoMethod(iconList, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR)&entry);
1736 if ((IPTR)entry != MUIV_IconList_NextIcon_End)
1738 node = (struct IconEntry *)((IPTR)entry - ((IPTR)&node->ie_IconListEntry - (IPTR)node));
1739 D(bug("[wanderer] wanderer_menufunc_icon_snapshot: %s entry = '%s' @ %p, (%p)\n", (snapshot) ? "SNAPSHOT" : "UNSNAPSHOT", entry->ile_IconEntry->ie_IconNode.ln_Name, entry, node));
1740 if (node->ie_DiskObj)
1742 if (snapshot)
1744 node->ie_DiskObj->do_CurrentX = node->ie_IconX;
1745 node->ie_DiskObj->do_CurrentY = node->ie_IconY;
1747 else
1749 node->ie_DiskObj->do_CurrentX = NO_ICON_POSITION;
1750 node->ie_DiskObj->do_CurrentY = NO_ICON_POSITION;
1752 PutIconTagList(entry->ile_IconEntry->ie_IconNode.ln_Name, node->ie_DiskObj, icontags);
1753 D(bug("[wanderer] wanderer_menufunc_icon_snapshot: saved ..\n"));
1755 else
1757 D(bug("[wanderer] wanderer_menufunc_icon_snapshot: icon has no diskobj!\n"));
1760 else
1762 break;
1764 } while (TRUE);
1765 D(bug("[wanderer] wanderer_menufunc_icon_snapshot: finished ..\n"));
1768 ///wanderer_menufunc_icon_leaveout()
1769 void wanderer_menufunc_icon_leaveout(void)
1771 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1772 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1773 struct IconList_Entry *entry = (IPTR)MUIV_IconList_NextIcon_Start;
1774 struct IconEntry *node = NULL;
1775 char *leavout_dir = NULL;
1777 D(bug("[wanderer] wanderer_menufunc_icon_leaveout()\n"));
1779 GET(window, MUIA_IconWindow_Location, &leavout_dir);
1781 if (leavout_dir != NULL)
1783 D(bug("[wanderer] wanderer_menufunc_icon_leaveout: dir '%s'\n", leavout_dir));
1786 DoMethod(iconList, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR)&entry);
1788 if (((IPTR)entry != MUIV_IconList_NextIcon_End) && ((entry->type == ST_FILE) || (entry->type == ST_USERDIR)))
1790 node = (struct IconEntry *)((IPTR)entry - ((IPTR)&node->ie_IconListEntry - (IPTR)node));
1791 D(bug("[wanderer] wanderer_menufunc_icon_leaveout: entry = '%s' @ %p, (%p)\n", entry->ile_IconEntry->ie_IconNode.ln_Name, entry, node));
1793 else
1795 break;
1797 } while (TRUE);
1800 D(bug("[wanderer] wanderer_menufunc_icon_leaveout: finished ..\n"));
1803 ///wanderer_menufunc_icon_putaway()
1804 void wanderer_menufunc_icon_putaway(void)
1806 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1807 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1808 struct IconList_Entry *entry = (IPTR)MUIV_IconList_NextIcon_Start;
1809 struct IconEntry *node = NULL;
1810 struct List putawayicons;
1812 D(bug("[wanderer] wanderer_menufunc_icon_putaway()\n"));
1814 NEWLIST(&putawayicons);
1818 DoMethod(iconList, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR)&entry);
1820 if (((IPTR)entry != MUIV_IconList_NextIcon_End) && ((entry->type == ST_LINKFILE) || (entry->type == ST_LINKDIR)))
1822 node = (struct IconEntry *)((IPTR)entry - ((IPTR)&node->ie_IconListEntry - (IPTR)node));
1823 D(bug("[wanderer] wanderer_menufunc_icon_putaway: entry = '%s' @ %p, (%p)\n", entry->ile_IconEntry->ie_IconNode.ln_Name, entry, node));
1824 /* Remove the node from the iconlist .. */
1825 /* Add it to our internal list for cleanup.. */
1826 //AddTail(&putawayicons, node);
1828 else
1830 break;
1832 } while (TRUE);
1833 D(bug("[wanderer] wanderer_menufunc_icon_putaway: finished ..\n"));
1836 ///DisposeCopyDisplay()
1837 /* dispose the file copy display */
1838 void DisposeCopyDisplay(struct MUIDisplayObjects *d)
1840 if (d->copyApp)
1842 //SET(d->win,MUIA_Window_Open,FALSE);
1843 MUI_DisposeObject(d->copyApp);
1848 ///CreateCopyDisplay()
1849 /* create the file copy window */
1850 BOOL CreateCopyDisplay(UWORD flags, struct MUIDisplayObjects *d)
1852 BOOL back = FALSE;
1854 Object *group, *fromObject, *toObject, *fileTextObject, *fileLengthObject, *gaugeGroup;
1856 d->stopflag = 0; // will be set to 1 when clicking on stop, than the displayhook can tell actionDir() to stop copy
1857 d->bytes = 0;
1858 d->numfiles = 0;
1859 d->action = flags;
1860 d->smallobjects = 0;
1861 d->copyApp = MUI_NewObject(MUIC_Application,
1862 MUIA_Application_Title, (IPTR)"CopyRequester",
1863 MUIA_Application_Base, (IPTR)"WANDERER_COPY",
1864 MUIA_Application_Window, (IPTR)(d->win = MUI_NewObject(MUIC_Window,
1865 MUIA_Window_Title, (IPTR)_(MSG_WANDERER_FILEACCESS),
1866 MUIA_Window_Activate, TRUE,
1867 MUIA_Window_DepthGadget, TRUE,
1868 MUIA_Window_DragBar, TRUE,
1869 MUIA_Window_SizeGadget, TRUE,
1870 MUIA_Window_AppWindow, FALSE,
1871 MUIA_Window_CloseGadget, FALSE,
1872 MUIA_Window_Borderless, FALSE,
1873 MUIA_Window_TopEdge, MUIV_Window_TopEdge_Centered,
1874 MUIA_Window_LeftEdge, MUIV_Window_LeftEdge_Centered,
1875 MUIA_Window_Width, MUIV_Window_Width_Visible(60),
1876 WindowContents, (group = MUI_NewObject(MUIC_Group,
1877 Child, (IPTR)(fromObject = MUI_NewObject(MUIC_Text,
1878 MUIA_InnerLeft,(8),
1879 MUIA_InnerRight,(8),
1880 MUIA_InnerTop,(2),
1881 MUIA_InnerBottom,(2),
1882 MUIA_Text_PreParse, (IPTR)"\33c",
1883 TAG_DONE)),
1884 Child, (IPTR)(d->sourceObject = MUI_NewObject(MUIC_Text,
1885 TextFrame,
1886 MUIA_InnerLeft,(8),
1887 MUIA_InnerRight,(8),
1888 MUIA_InnerTop,(2),
1889 MUIA_InnerBottom,(2),
1890 MUIA_Background, MUII_TextBack,
1891 MUIA_Text_PreParse, (IPTR)"\33c",
1892 MUIA_Text_Contents, (IPTR)"---",
1893 TAG_DONE)),
1894 Child, (IPTR)(toObject = MUI_NewObject(MUIC_Text,
1895 MUIA_InnerLeft,(8),
1896 MUIA_InnerRight,(8),
1897 MUIA_InnerTop,(2),
1898 MUIA_InnerBottom,(2),
1899 MUIA_Text_PreParse, (IPTR)"\33c",
1900 TAG_DONE)),
1901 Child, (IPTR)(d->destObject = MUI_NewObject(MUIC_Text,
1902 TextFrame,
1903 MUIA_InnerLeft,(8),
1904 MUIA_InnerRight,(8),
1905 MUIA_InnerTop,(2),
1906 MUIA_InnerBottom,(2),
1907 MUIA_Background, MUII_TextBack,
1908 MUIA_Text_PreParse, (IPTR)"\33c",
1909 MUIA_Text_Contents, (IPTR)"---",
1910 TAG_DONE)),
1911 Child, (IPTR)(fileTextObject = MUI_NewObject(MUIC_Text,
1912 MUIA_InnerLeft,(8),
1913 MUIA_InnerRight,(8),
1914 MUIA_InnerTop,(2),
1915 MUIA_InnerBottom,(2),
1916 MUIA_Text_PreParse, (IPTR)"\33c",
1917 TAG_DONE)),
1918 Child, (IPTR)(d->fileObject = MUI_NewObject(MUIC_Text,
1919 TextFrame,
1920 MUIA_InnerLeft,(8),
1921 MUIA_InnerRight,(8),
1922 MUIA_InnerTop,(2),
1923 MUIA_InnerBottom,(2),
1924 MUIA_Background, MUII_TextBack,
1925 MUIA_Text_PreParse, (IPTR)"\33c",
1926 MUIA_Text_Contents, (IPTR)"---",
1927 TAG_DONE)),
1928 Child, (IPTR)(fileLengthObject = MUI_NewObject(MUIC_Text,
1929 MUIA_InnerLeft,(8),
1930 MUIA_InnerRight,(8),
1931 MUIA_InnerTop,(2),
1932 MUIA_InnerBottom,(2),
1933 MUIA_Text_PreParse, (IPTR)"\33c",
1934 TAG_DONE)),
1935 Child, (IPTR)(gaugeGroup = MUI_NewObject(MUIC_Group,
1936 TextFrame,
1937 Child, d->gauge = MUI_NewObject(MUIC_Gauge,
1938 MUIA_Gauge_Horiz, TRUE,
1939 MUIA_Gauge_Max, 32768,
1940 MUIA_Gauge_InfoText, _(MSG_WANDERER_FILEACCESS_PROCESSING),
1941 TAG_DONE),
1942 Child, MUI_NewObject(MUIC_Scale,
1943 MUIA_Scale_Horiz, TRUE,
1944 TAG_DONE),
1945 TAG_DONE)),
1946 Child, (IPTR)( d->performanceObject = MUI_NewObject(MUIC_Text,
1947 TextFrame,
1948 MUIA_InnerLeft,(8),
1949 MUIA_InnerRight,(8),
1950 MUIA_InnerTop,(2),
1951 MUIA_InnerBottom,(2),
1952 MUIA_Background, MUII_TextBack,
1953 MUIA_Text_PreParse, (IPTR)"\33c",
1954 MUIA_Text_Contents, (IPTR)"...........0 Bytes...........",
1955 TAG_DONE)),
1957 Child, (IPTR)( d->stopObject = SimpleButton( _(MSG_WANDERER_FILEACCESS_STOP) ) ),
1958 TAG_DONE)),
1959 TAG_DONE)),
1960 TAG_DONE);
1963 if (d->copyApp)
1965 if ((flags & (ACTION_COPY|ACTION_DELETE)) == (ACTION_COPY|ACTION_DELETE))
1967 SET(fromObject, MUIA_Text_Contents, (IPTR) _(MSG_WANDERER_FILEACCESS_MOVEFROM) );
1968 SET(toObject, MUIA_Text_Contents, (IPTR) _(MSG_WANDERER_FILEACCESS_MOVETO) );
1969 SET(fileTextObject, MUIA_Text_Contents, (IPTR) _(MSG_WANDERER_FILEACCESS_FILE) );
1970 SET(fileLengthObject, MUIA_Text_Contents, (IPTR) _(MSG_WANDERER_FILEACCESS_TRAFFIC) );
1972 else if ((flags & ACTION_COPY) == ACTION_COPY)
1974 SET(fromObject, MUIA_Text_Contents, (IPTR) _(MSG_WANDERER_FILEACCESS_COPYFROM) );
1975 SET(toObject, MUIA_Text_Contents, (IPTR) _(MSG_WANDERER_FILEACCESS_COPYTO) );
1976 SET(fileTextObject, MUIA_Text_Contents, (IPTR) _(MSG_WANDERER_FILEACCESS_FILE) );
1977 SET(fileLengthObject, MUIA_Text_Contents, (IPTR) _(MSG_WANDERER_FILEACCESS_TRAFFIC) );
1980 else if ((flags & ACTION_DELETE) == ACTION_DELETE)
1982 SET(fromObject, MUIA_Text_Contents, _(MSG_WANDERER_FILEACCESS_DELETEFROM) );
1983 DoMethod(group, MUIM_Group_InitChange);
1984 DoMethod(group, OM_REMMEMBER, toObject);
1985 DoMethod(group, OM_REMMEMBER, fileLengthObject);
1986 DoMethod(group, OM_REMMEMBER, d->performanceObject);
1987 DoMethod(group, OM_REMMEMBER, d->destObject);
1988 DoMethod(group, OM_REMMEMBER, gaugeGroup);
1989 DoMethod(group, MUIM_Group_ExitChange);
1990 SET(fileTextObject, MUIA_Text_Contents, _(MSG_WANDERER_FILEACCESS_FILETODELETE) );
1993 SET(d->win,MUIA_Window_Open,TRUE);
1994 DoMethod(d->stopObject,MUIM_Notify, MUIA_Pressed, FALSE, d->stopObject, 3, MUIM_WriteLong, 1 ,&d->stopflag);
1995 back = TRUE;
1997 return back;
2001 ///wanderer_menufunc_icon_delete()
2002 void wanderer_menufunc_icon_delete(void)
2004 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
2005 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
2006 struct IconList_Entry *entry = ( void*) MUIV_IconList_NextIcon_Start;
2007 struct MUIDisplayObjects dobjects;
2008 struct Hook displayCopyHook;
2009 struct Hook displayDelHook;
2010 ULONG updatedIcons;
2012 DoMethod(iconList, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR) &entry);
2013 displayCopyHook.h_Entry = (HOOKFUNC) Wanderer__HookFunc_DisplayCopyFunc;
2014 displayDelHook.h_Entry = (HOOKFUNC) Wanderer__HookFunc_AskDeleteFunc;
2016 updatedIcons = 0;
2018 /* Process all selected entries */
2019 if (CreateCopyDisplay(ACTION_DELETE, &dobjects))
2023 if ((int)entry != MUIV_IconList_NextIcon_End)
2025 /* copy via filesystems.c */
2026 D(bug("[WANDERER] Delete \"%s\"\n", entry->ile_IconEntry->ie_IconNode.ln_Name);)
2027 CopyContent( NULL, entry->ile_IconEntry->ie_IconNode.ln_Name, NULL, TRUE, ACTION_DELETE, &displayCopyHook, &displayDelHook, (APTR) &dobjects);
2028 updatedIcons++;
2030 DoMethod(iconList, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR) &entry);
2032 while ( (int)entry != MUIV_IconList_NextIcon_End );
2033 DisposeCopyDisplay(&dobjects);
2035 // Only update list if anything happened to the icons!
2036 if ( updatedIcons > 0 )
2038 DoMethod(window, MUIM_IconWindow_UnselectAll);
2039 DoMethod ( iconList, MUIM_IconList_Update );
2044 ///wanderer_menufunc_icon_format()
2045 void wanderer_menufunc_icon_format(void)
2047 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
2048 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
2049 struct IconList_Entry *entry = ( void*) MUIV_IconList_NextIcon_Start;
2051 DoMethod(iconList, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR) &entry);
2053 /* Process only first selected entry */
2054 if ((int)entry != MUIV_IconList_NextIcon_End)
2056 BPTR lock = Lock(entry->ile_IconEntry->ie_IconNode.ln_Name, ACCESS_READ);
2057 D(bug("[WANDERER] Format \"%s\"\n", entry->ile_IconEntry->ie_IconNode.ln_Name);)
2058 /* Usually we pass object name and parent lock. Here we do the same thing.
2059 Just object name is empty string and its parent is device's root. */
2060 OpenWorkbenchObject
2062 "SYS:System/Format",
2063 WBOPENA_ArgLock, (IPTR) lock,
2064 WBOPENA_ArgName, lock ? (IPTR)"" : (IPTR)entry->ile_IconEntry->ie_IconNode.ln_Name,
2065 TAG_DONE
2067 if (lock)
2068 UnLock(lock);
2073 ///wanderer_menufunc_wanderer_AROS_guisettings()
2074 void wanderer_menufunc_wanderer_AROS_guisettings(void)
2076 //DoMethod(_WandererIntern_AppObj, MUIM_Application_OpenConfigWindow);
2077 OpenWorkbenchObject("SYS:Prefs/Zune",
2078 WBOPENA_ArgName, (IPTR) "WANDERER",
2079 TAG_DONE);
2083 ///wanderer_menufunc_wanderer_AROS_about()
2084 void wanderer_menufunc_wanderer_AROS_about(void)
2086 OpenWorkbenchObject("SYS:System/About", TAG_DONE);
2090 ///wanderer_menufunc_wanderer_about()
2091 void wanderer_menufunc_wanderer_about(Object **pwand)
2093 Object *self = *pwand;
2094 Class *CLASS = _WandererIntern_CLASS;
2095 SETUP_WANDERER_INST_DATA;
2097 /* Display Information about this version of wanderer */
2098 if (data->wd_AboutWindow == NULL)
2100 data->wd_AboutWindow = WindowObject,
2101 MUIA_Window_Title, "About Wanderer...",
2102 WindowContents, VGroup,
2103 Child, HGroup,
2104 Child, (IPTR) IconImageObject,
2105 MUIA_InputMode, MUIV_InputMode_Toggle,
2106 MUIA_IconImage_File, (IPTR)"PROGDIR:Wanderer",
2107 End,
2108 Child, VGroup,
2109 Child, TextObject,
2110 MUIA_Text_Contents, (IPTR)wand_titlestr,
2111 End,
2112 Child, TextObject,
2113 MUIA_Text_Contents, (IPTR)wand_copyrightstr,
2114 End,
2115 End,
2116 End,
2117 Child, VGroup,
2118 Child, TextObject,
2119 MUIA_Text_Contents, (IPTR)wand_authorstr,
2120 End,
2121 Child, HVSpace,
2122 End,
2123 End,
2124 End;
2126 #ifdef __AROS__
2127 DoMethod(_app(self), OM_ADDMEMBER, (IPTR) data->wd_AboutWindow);
2128 #else
2129 DoMethod(self, OM_ADDMEMBER, (IPTR) data->wd_AboutWindow);
2130 #endif
2131 DoMethod
2133 data->wd_AboutWindow, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
2134 (IPTR)data->wd_AboutWindow, 3, MUIM_Set, MUIA_Window_Open, FALSE
2138 if (data->wd_AboutWindow)
2140 IPTR isOpen = (IPTR)FALSE;
2141 GET(data->wd_AboutWindow, MUIA_Window_Open, &isOpen);
2142 if (isOpen)
2144 isOpen = FALSE;
2146 else
2148 isOpen = TRUE;
2150 SET(data->wd_AboutWindow, MUIA_Window_Open, isOpen);
2155 ///wanderer_menufunc_wanderer_quit()
2156 void wanderer_menufunc_wanderer_quit(void)
2158 if (OpenWorkbenchObject("WANDERER:Tools/Quit", TAG_DONE))
2160 else
2162 if (MUI_RequestA(_WandererIntern_AppObj, NULL, 0, wand_namestr, _(MSG_YESNO), _(MSG_REALLYQUIT), NULL))
2163 DoMethod(_WandererIntern_AppObj, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
2169 ///wanderer_menufunc_wanderer_shutdown()
2170 void wanderer_menufunc_wanderer_shutdown(void)
2172 LONG action;
2174 action = MUI_RequestA(_WandererIntern_AppObj, NULL, 0, _(MSG_SHUTDOWN_TITLE), _(MSG_SHUTDOWN_BUTTONS), _(MSG_SHUTDOWN_BODY), NULL);
2175 switch (action) {
2176 case 0:
2177 return;
2178 case 1:
2179 ShutdownA(SD_ACTION_POWEROFF);
2180 break;
2181 case 2:
2182 ShutdownA(SD_ACTION_COLDREBOOT);
2183 break;
2184 case 3:
2185 ColdReboot();
2187 MUI_RequestA(_WandererIntern_AppObj, NULL, 0, _(MSG_SHUTDOWN_TITLE), _(MSG_OK), _(MSG_ACTION_NOT_SUPPORTED), NULL);
2192 ///FindMenuitem()
2193 /**************************************************************************
2194 This function returns a Menu Object with the given id
2195 **************************************************************************/
2196 Object *FindMenuitem(Object* strip, int id)
2198 return (Object*)DoMethod(strip, MUIM_FindUData, id);
2202 ///DoMenuNotify()
2203 /**************************************************************************
2204 This connects a notify to the given menu entry id
2205 **************************************************************************/
2206 VOID DoMenuNotify(Object* strip, int id, void *function, void *arg)
2208 Object *entry;
2209 entry = FindMenuitem(strip,id);
2210 if (entry)
2212 DoMethod
2214 entry, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
2215 (IPTR) entry, 4, MUIM_CallHook, (IPTR) &_WandererIntern_hook_standard,
2216 (IPTR) function, (IPTR) arg
2222 ///DoAllMenuNotifies()
2223 VOID DoAllMenuNotifies(Object *wanderer, Object *strip, STRPTR path)
2225 Object *item;
2227 if (!strip) return;
2229 DoMenuNotify(strip, MEN_WANDERER_EXECUTE,
2230 wanderer_menufunc_wanderer_execute, path);
2231 DoMenuNotify(strip, MEN_WANDERER_SHELL,
2232 wanderer_menufunc_wanderer_shell, path);
2233 DoMenuNotify(strip, MEN_WANDERER_AROS_GUISETTINGS,
2234 wanderer_menufunc_wanderer_AROS_guisettings, NULL);
2235 DoMenuNotify(strip, MEN_WANDERER_AROS_ABOUT,
2236 wanderer_menufunc_wanderer_AROS_about, NULL);
2237 DoMenuNotify(strip, MEN_WANDERER_ABOUT,
2238 wanderer_menufunc_wanderer_about, wanderer);
2239 DoMenuNotify(strip, MEN_WANDERER_QUIT,
2240 wanderer_menufunc_wanderer_quit, NULL);
2241 DoMenuNotify(strip, MEN_WANDERER_SHUTDOWN,
2242 wanderer_menufunc_wanderer_shutdown, NULL);
2244 DoMenuNotify(strip, MEN_WINDOW_NEW_DRAWER,
2245 wanderer_menufunc_window_newdrawer, path);
2246 DoMenuNotify(strip, MEN_WINDOW_OPEN_PARENT,
2247 wanderer_menufunc_window_openparent, path);
2248 DoMenuNotify(strip, MEN_WINDOW_CLOSE,
2249 wanderer_menufunc_window_close, NULL);
2250 DoMenuNotify(strip, MEN_WINDOW_UPDATE,
2251 wanderer_menufunc_window_update, NULL);
2252 DoMenuNotify(strip, MEN_WINDOW_CLEAR,
2253 wanderer_menufunc_window_clear, NULL);
2255 DoMenuNotify(strip, MEN_WINDOW_SNAP_WIN,
2256 wanderer_menufunc_window_snapshot, FALSE);
2257 DoMenuNotify(strip, MEN_WINDOW_SNAP_ALL,
2258 wanderer_menufunc_window_snapshot, (APTR)TRUE);
2260 DoMenuNotify(strip, MEN_WINDOW_SELECT,
2261 wanderer_menufunc_window_select, NULL);
2262 DoMenuNotify(strip, MEN_WINDOW_VIEW_ALL,
2263 wanderer_menufunc_window_view_icons, strip);
2264 DoMenuNotify(strip, MEN_WINDOW_VIEW_HIDDEN,
2265 wanderer_menufunc_window_view_hidden, strip);
2266 DoMenuNotify(strip, MEN_WINDOW_SORT_ENABLE,
2267 wanderer_menufunc_window_sort_enable, strip);
2268 DoMenuNotify(strip, MEN_WINDOW_SORT_NAME,
2269 wanderer_menufunc_window_sort_name, strip);
2270 DoMenuNotify(strip, MEN_WINDOW_SORT_TYPE,
2271 wanderer_menufunc_window_sort_type, strip);
2272 DoMenuNotify(strip, MEN_WINDOW_SORT_DATE,
2273 wanderer_menufunc_window_sort_date, strip);
2274 DoMenuNotify(strip, MEN_WINDOW_SORT_SIZE,
2275 wanderer_menufunc_window_sort_size, strip);
2276 DoMenuNotify(strip, MEN_WINDOW_SORT_REVERSE,
2277 wanderer_menufunc_window_sort_reverse, strip);
2278 DoMenuNotify(strip, MEN_WINDOW_SORT_TOPDRAWERS,
2279 wanderer_menufunc_window_sort_topdrawers, strip);
2281 DoMenuNotify(strip, MEN_ICON_OPEN,
2282 wanderer_menufunc_icon_open, NULL);
2283 DoMenuNotify(strip, MEN_ICON_RENAME,
2284 wanderer_menufunc_icon_rename, NULL);
2285 DoMenuNotify(strip, MEN_ICON_INFORMATION,
2286 wanderer_menufunc_icon_information, NULL);
2287 DoMenuNotify(strip, MEN_ICON_SNAPSHOT,
2288 wanderer_menufunc_icon_snapshot, (APTR)TRUE);
2289 DoMenuNotify(strip, MEN_ICON_UNSNAPSHOT,
2290 wanderer_menufunc_icon_snapshot, FALSE);
2291 DoMenuNotify(strip, MEN_ICON_LEAVEOUT,
2292 wanderer_menufunc_icon_leaveout, NULL);
2293 DoMenuNotify(strip, MEN_ICON_PUTAWAY,
2294 wanderer_menufunc_icon_putaway, NULL);
2295 DoMenuNotify(strip, MEN_ICON_DELETE,
2296 wanderer_menufunc_icon_delete, NULL);
2297 DoMenuNotify(strip, MEN_ICON_FORMAT,
2298 wanderer_menufunc_icon_format, NULL);
2300 if ((item = FindMenuitem(strip, MEN_WANDERER_BACKDROP)))
2302 DoMethod
2304 item, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
2305 (IPTR) _WandererIntern_AppObj, 7, MUIM_Application_PushMethod,
2306 (IPTR) _WandererIntern_AppObj, 4, MUIM_CallHook, (IPTR) &_WandererIntern_hook_standard,
2307 (IPTR) wanderer_menufunc_wanderer_backdrop, (IPTR) strip
2313 ///Wanderer__Func_UpdateMenuStates()
2314 VOID Wanderer__Func_UpdateMenuStates(Object *WindowObj, Object *IconlistObj)
2316 IPTR current_DispFlags = 0, current_SortFlags = 0;
2317 Object *current_Menustrip = NULL, *current_MenuItem = NULL;
2318 struct IconList_Entry *icon_entry = (IPTR)MUIV_IconList_NextIcon_Start;
2319 int selected_count = 0;
2321 BOOL icon_men_PutAway = FALSE;
2322 BOOL icon_men_LeaveOut = FALSE;
2323 BOOL icon_men_Format = FALSE;
2324 BOOL icon_men_EmptyTrash = FALSE;
2326 if (IconlistObj == NULL)
2327 return;
2329 D(bug("[Wanderer] Wanderer__Func_UpdateMenuStates(IconList @ %p)\n", IconlistObj));
2331 GET(IconlistObj, MUIA_IconList_SortFlags, &current_SortFlags);
2332 GET(IconlistObj, MUIA_IconList_DisplayFlags, &current_DispFlags);
2333 GET(WindowObj, MUIA_Window_Menustrip, &current_Menustrip);
2335 D(bug("[Wanderer] Wanderer__Func_UpdateMenuStates: Menu @ %p, Display Flags : %x, Sort Flags : %x\n", current_Menustrip, current_DispFlags, current_SortFlags));
2339 DoMethod(IconlistObj, MUIM_IconList_NextIcon, MUIV_IconList_NextIcon_Selected, (IPTR)&icon_entry);
2341 if ((IPTR)icon_entry != MUIV_IconList_NextIcon_End)
2343 if (icon_entry->type == ST_ROOT)
2345 D(bug("[Wanderer] Wanderer__Func_UpdateMenuStates: ST_ROOT\n"));
2346 icon_men_Format = TRUE;
2348 if ((icon_entry->type == ST_LINKDIR) || (icon_entry->type == ST_LINKFILE))
2350 D(bug("[Wanderer] Wanderer__Func_UpdateMenuStates: ST_LINKDIR/ST_LINKFILE\n"));
2351 icon_men_PutAway = TRUE;
2353 if ((icon_entry->type == ST_USERDIR) || (icon_entry->type == ST_FILE))
2355 D(bug("[Wanderer] Wanderer__Func_UpdateMenuStates: ST_USERDIR/ST_FILE\n"));
2356 icon_men_LeaveOut = TRUE;
2358 selected_count++;
2360 else
2362 break;
2364 } while (TRUE);
2366 if (current_Menustrip != NULL)
2368 if (selected_count > 0)
2370 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_OPEN)) != NULL)
2372 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, TRUE);
2374 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_RENAME)) != NULL)
2376 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, TRUE);
2378 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_INFORMATION)) != NULL)
2380 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, TRUE);
2382 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_SNAPSHOT)) != NULL)
2384 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, TRUE);
2386 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_UNSNAPSHOT)) != NULL)
2388 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, TRUE);
2390 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_DELETE)) != NULL)
2392 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, TRUE);
2394 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_FORMAT)) != NULL)
2396 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, icon_men_Format);
2398 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_LEAVEOUT)) != NULL)
2400 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, icon_men_LeaveOut);
2402 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_PUTAWAY)) != NULL)
2404 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, icon_men_PutAway);
2406 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_EMPTYTRASH)) != NULL)
2408 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, icon_men_EmptyTrash);
2410 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_WINDOW_CLEAR)) != NULL)
2412 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, TRUE);
2415 else
2417 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_OPEN)) != NULL)
2419 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2421 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_RENAME)) != NULL)
2423 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2425 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_INFORMATION)) != NULL)
2427 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2429 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_SNAPSHOT)) != NULL)
2431 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2433 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_UNSNAPSHOT)) != NULL)
2435 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2437 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_DELETE)) != NULL)
2439 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2441 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_FORMAT)) != NULL)
2443 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2445 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_LEAVEOUT)) != NULL)
2447 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2449 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_PUTAWAY)) != NULL)
2451 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2453 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_ICON_EMPTYTRASH)) != NULL)
2455 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2457 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_WINDOW_CLEAR)) != NULL)
2459 NNSET(current_MenuItem, MUIA_Menuitem_Enabled, FALSE);
2462 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_WINDOW_VIEW_ALL)) != NULL)
2464 NNSET(current_MenuItem, MUIA_Menuitem_Checked, (BOOL)!(current_DispFlags & ICONLIST_DISP_SHOWINFO));
2466 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_WINDOW_VIEW_HIDDEN)) != NULL)
2468 NNSET(current_MenuItem, MUIA_Menuitem_Checked, (BOOL)(current_DispFlags & ICONLIST_DISP_SHOWHIDDEN));
2470 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_WINDOW_SORT_NAME)) != NULL)
2472 NNSET(current_MenuItem, MUIA_Menuitem_Checked, (BOOL)((current_SortFlags & ICONLIST_SORT_MASK) == ICONLIST_SORT_BY_NAME));
2474 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_WINDOW_SORT_DATE)) != NULL)
2476 NNSET(current_MenuItem, MUIA_Menuitem_Checked, (BOOL)((current_SortFlags & ICONLIST_SORT_MASK) == ICONLIST_SORT_BY_DATE));
2478 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_WINDOW_SORT_SIZE)) != NULL)
2480 NNSET(current_MenuItem, MUIA_Menuitem_Checked, (BOOL)((current_SortFlags & ICONLIST_SORT_MASK) == ICONLIST_SORT_BY_SIZE));
2482 if ((current_MenuItem = FindMenuitem(current_Menustrip, MEN_WINDOW_SORT_TYPE)) != NULL)
2484 NNSET(current_MenuItem, MUIA_Menuitem_Checked, (BOOL)((current_SortFlags & ICONLIST_SORT_MASK) == ICONLIST_SORT_MASK));
2489 ///Wanderer__HookFunc_UpdateMenuStatesFunc()
2490 #ifdef __AROS__
2491 AROS_UFH3
2493 ULONG, Wanderer__HookFunc_UpdateMenuStatesFunc,
2494 AROS_UFHA(struct Hook *, hook, A0),
2495 AROS_UFHA(APTR *, obj, A2),
2496 AROS_UFHA(APTR, param, A1)
2499 #else
2500 HOOKPROTO(Wanderer__HookFunc_UpdateMenuStatesFunc, ULONG, struct dCopyStruct *obj, APTR param)
2502 #endif
2503 AROS_USERFUNC_INIT
2505 Object *self = ( Object *)obj;
2506 Object *window = *( Object **)param;
2507 Object *iconlist = NULL;
2509 D(bug("[Wanderer] Wanderer__HookFunc_UpdateMenuStatesFunc(self @ %p, window @ %p)\n", self, window));
2511 GET(window, MUIA_IconWindow_IconList, &iconlist);
2513 D(bug("[Wanderer] Wanderer__HookFunc_UpdateMenuStatesFunc: iconlist @ %p\n", iconlist));
2515 Wanderer__Func_UpdateMenuStates(window, iconlist);
2517 D(bug("[Wanderer] Wanderer__HookFunc_UpdateMenuStatesFunc: Update Complete.\n"));
2519 return 0;
2521 AROS_USERFUNC_EXIT
2524 /*** Methods ****************************************************************/
2525 ///OM_NEW()
2526 Object *Wanderer__OM_NEW(Class *CLASS, Object *self, struct opSet *message)
2528 D(bug("[Wanderer] Wanderer__OM_NEW()\n"));
2530 self = (Object *) DoSuperNewTags
2532 CLASS, self, NULL,
2534 MUIA_Application_Title, (IPTR) wand_namestr,
2535 MUIA_Application_Base, (IPTR) "WANDERER",
2536 MUIA_Application_Version, (IPTR) VERSION,
2537 MUIA_Application_Description, (IPTR) _(MSG_DESCRIPTION),
2538 MUIA_Application_SingleTask, TRUE,
2540 MUIA_Application_Version, (IPTR) wand_versionstr,
2541 MUIA_Application_Copyright, (IPTR) wand_copyrightstr,
2542 MUIA_Application_Author, (IPTR) wand_authorstr,
2544 TAG_MORE, (IPTR) message->ops_AttrList
2547 if (self != NULL)
2549 SETUP_WANDERER_INST_DATA;
2551 // ULONG updatedIcons;
2552 D(bug("[Wanderer] Wanderer__OM_NEW: SELF = %d, Private data @ %p\n", self, data));
2554 _WandererIntern_CLASS = CLASS;
2556 NewList(&_WandererIntern_FSHandlerList);
2558 D(bug("[Wanderer] Wanderer__OM_NEW: FSHandlerList @ %p\n", &_WandererIntern_FSHandlerList));
2560 #if defined(WANDERER_DEFAULT_BACKDROP)
2561 data->wd_Option_BackDropMode = TRUE;
2562 #else
2563 data->wd_Option_BackDropMode = FALSE;
2564 #endif
2566 /*-- Setup hooks structures ----------------------------------------*/
2567 #ifdef __AROS__
2568 _WandererIntern_hook_standard.h_Entry = (HOOKFUNC) Wanderer__HookFunc_StandardFunc;
2569 _WandererIntern_hook_action.h_Entry = (HOOKFUNC) Wanderer__HookFunc_ActionFunc;
2570 _WandererIntern_hook_backdrop.h_Entry = (HOOKFUNC) Wanderer__HookFunc_BackdropFunc;
2571 #else
2572 _WandererIntern_hook_standard = &Hook_StandardFunc;
2573 _WandererIntern_hook_action = &Hook_ActionFunc;
2574 _WandererIntern_hook_backdrop = &Hook_BackdropFunc;
2575 #endif
2577 // ---
2578 if ((data->wd_CommandPort = CreateMsgPort()) == NULL)
2580 CoerceMethod(CLASS, self, OM_DISPOSE);
2581 return NULL;
2584 if ((data->wd_NotifyPort = CreateMsgPort()) == NULL)
2586 CoerceMethod(CLASS, self, OM_DISPOSE);
2587 return NULL;
2590 RegisterWorkbench(data->wd_CommandPort);
2592 /* Setup command port handler --------------------------------------*/
2593 data->wd_CommandIHN.ihn_Signals = 1UL << data->wd_CommandPort->mp_SigBit;
2594 data->wd_CommandIHN.ihn_Object = self;
2595 data->wd_CommandIHN.ihn_Method = MUIM_Wanderer_HandleCommand;
2597 DoMethod
2599 self, MUIM_Application_AddInputHandler, (IPTR) &data->wd_CommandIHN
2602 /* Setup timer handler ---------------------------------------------*/
2603 data->wd_TimerIHN.ihn_Flags = MUIIHNF_TIMER;
2604 data->wd_TimerIHN.ihn_Millis = 3000;
2605 data->wd_TimerIHN.ihn_Object = self;
2606 data->wd_TimerIHN.ihn_Method = MUIM_Wanderer_HandleTimer;
2608 DoMethod
2610 self, MUIM_Application_AddInputHandler, (IPTR) &data->wd_TimerIHN
2613 /* Setup filesystem notification handler ---------------------------*/
2614 data->wd_NotifyIHN.ihn_Signals = 1UL << data->wd_NotifyPort->mp_SigBit;
2615 data->wd_NotifyIHN.ihn_Object = self;
2616 data->wd_NotifyIHN.ihn_Method = MUIM_Wanderer_HandleNotify;
2618 DoMethod
2620 self, MUIM_Application_AddInputHandler, (IPTR) &data->wd_NotifyIHN
2623 // All the following should be moved to InitWandererPrefs
2625 #ifdef __AROS__
2626 data->wd_Prefs = (Object *)WandererPrefsObject,
2627 MUIA_Wanderer_FileSysNotifyPort, (IPTR)data->wd_NotifyPort,
2628 MUIA_Wanderer_FileSysNotifyList, (IPTR)&_WandererIntern_FSHandlerList,
2629 End; // FIXME: error handling
2630 #else
2631 data->wd_Prefs = NewObject(WandererPrefs_CLASS->mcc_Class, NULL, TAG_DONE); // FIXME: error handling
2632 #endif
2634 if (data->wd_Prefs)
2636 D(bug("[Wanderer] Wanderer__OM_NEW: Prefs-Screentitle = '%s'\n",XGET(data->wd_Prefs, MUIA_IconWindowExt_ScreenTitle_String)));
2637 data->wd_PrefsIntern = InitWandererPrefs();
2640 D(bug("[Wanderer] obj = %ld\n", self));
2641 return self;
2645 ///OM_DISPOSE()
2646 IPTR Wanderer__OM_DISPOSE(Class *CLASS, Object *self, Msg message)
2648 SETUP_WANDERER_INST_DATA;
2650 if (data->wd_CommandPort)
2653 They only have been added if the creation of the msg port was
2654 successful
2656 DoMethod(self, MUIM_Application_RemInputHandler, (IPTR) &data->wd_TimerIHN);
2657 DoMethod(self, MUIM_Application_RemInputHandler, (IPTR) &data->wd_CommandIHN);
2658 DoMethod(self, MUIM_Application_RemInputHandler, (IPTR) &data->wd_NotifyIHN);
2660 UnregisterWorkbench(data->wd_CommandPort);
2662 DeleteMsgPort(data->wd_NotifyPort);
2663 data->wd_NotifyPort = NULL;
2665 DeleteMsgPort(data->wd_CommandPort);
2666 data->wd_CommandPort = NULL;
2668 DisposeObject(data->wd_Prefs);
2669 data->wd_Prefs = NULL;
2672 return DoSuperMethodA(CLASS, self, (Msg) message);
2676 ///OM_SET()
2677 IPTR Wanderer__OM_SET(Class *CLASS, Object *self, struct opSet *message)
2679 SETUP_WANDERER_INST_DATA;
2680 struct TagItem *tstate = message->ops_AttrList, *tag;
2682 while ((tag = NextTagItem((TAGITEM)&tstate)) != NULL)
2684 switch (tag->ti_Tag)
2686 case MUIA_Wanderer_Screen:
2687 D(bug("[Wanderer] Wanderer__OM_SET: MUIA_Wanderer_Screen = %p\n", tag->ti_Data));
2688 D(bug("[Wanderer] Wanderer__OM_SET: setting MUIA_Wanderer_Screen isnt yet handled!\n"));
2689 break;
2691 case MUIA_Wanderer_ActiveWindow:
2692 data->wd_ActiveWindow = (Object *) tag->ti_Data;
2693 D(bug("[Wanderer] Wanderer__OM_SET: MUIA_Wanderer_ActiveWindow = %p\n", tag->ti_Data));
2694 if (!(XGET(data->wd_ActiveWindow, MUIA_Window_Activate)))
2696 NNSET(data->wd_ActiveWindow, MUIA_Window_Activate, TRUE);
2698 Object *activatewin_Iconlist = NULL;
2700 GET(data->wd_ActiveWindow, MUIA_IconWindow_IconList, &activatewin_Iconlist);
2701 Wanderer__Func_UpdateMenuStates(data->wd_ActiveWindow, activatewin_Iconlist);
2702 break;
2704 case MUIA_Application_Iconified:
2705 /* Wanderer itself cannot be iconified,
2706 just hide, instead. */
2707 tag->ti_Tag = MUIA_ShowMe;
2708 tag->ti_Data = !tag->ti_Data;
2709 break;
2713 return DoSuperMethodA(CLASS, self, (Msg) message);
2717 ///OM_GET()
2718 IPTR Wanderer__OM_GET(Class *CLASS, Object *self, struct opGet *message)
2720 SETUP_WANDERER_INST_DATA;
2721 IPTR *store = message->opg_Storage;
2722 IPTR rv = TRUE;
2724 switch (message->opg_AttrID)
2726 case MUIA_Wanderer_Screen:
2727 *store = (IPTR)data->wd_Screen;
2728 break;
2730 case MUIA_Wanderer_Prefs:
2731 *store = (IPTR)data->wd_Prefs;
2732 break;
2734 case MUIA_Wanderer_ActiveWindow:
2735 *store = (IPTR)data->wd_ActiveWindow;
2736 break;
2738 case MUIA_Wanderer_WorkbenchWindow:
2739 *store = (IPTR)data->wd_WorkbenchWindow;
2740 break;
2742 case MUIA_Wanderer_FileSysNotifyPort:
2743 *store = (IPTR)data->wd_NotifyPort;
2744 break;
2746 case MUIA_Wanderer_FileSysNotifyList:
2747 *store = (IPTR)&_WandererIntern_FSHandlerList;
2748 break;
2750 case MUIA_Version:
2751 *store = (IPTR)WANDERERVERS;
2752 break;
2754 case MUIA_Revision:
2755 *store = (IPTR)WANDERERREV;
2756 break;
2758 default:
2759 rv = DoSuperMethodA(CLASS, self, (Msg) message);
2762 return rv;
2766 ///Wanderer__MUIM_Application_Execute()
2767 /* Main entry point for Wanderer Application Object */
2769 When the executable creates our object it calls zune
2770 to handle basic "control" ... which results in Zune
2771 calling this method ..
2773 IPTR Wanderer__MUIM_Application_Execute
2775 Class *CLASS, Object *self, Msg message
2778 SETUP_WANDERER_INST_DATA;
2780 D(bug("[Wanderer] Wanderer__MUIM_Application_Execute() ##\n[Wanderer] Wanderer__MUIM_Application_Execute: Creating 'Workbench' Window..\n"));
2782 data->wd_WorkbenchWindow = (Object *) DoMethod
2784 self, MUIM_Wanderer_CreateDrawerWindow, (IPTR) NULL
2787 if (data->wd_WorkbenchWindow != NULL)
2789 D(bug("[Wanderer] Wanderer__MUIM_Application_Execute: Workbench Window Obj @ %x\n", data->wd_WorkbenchWindow));
2791 Detach();
2793 D(bug("[Wanderer] Wanderer__MUIM_Application_Execute: Really handing control to Zune ..\n"));
2795 #ifdef __AROS__
2796 DoSuperMethodA(CLASS, self, message);
2797 #else
2799 IPTR sigs = 0;
2800 while (DoMethod(self,MUIM_Application_NewInput,&sigs) != MUIV_Application_ReturnID_Quit)
2802 if (sigs)
2804 sigs = Wait(sigs | SIGBREAKF_CTRL_C);
2805 if (sigs & SIGBREAKF_CTRL_C) break;
2809 return 0;
2811 #endif
2813 return RETURN_OK;
2816 #warning "TODO: Report an error if we fail to create the Workbench's window ..."
2818 return RETURN_ERROR;
2822 ///Wanderer__MUIM_Wanderer_HandleTimer()
2823 /*This function uses GetScreenTitle() function...*/
2825 IPTR Wanderer__MUIM_Wanderer_HandleTimer
2827 Class *CLASS, Object *self, Msg message
2830 SETUP_WANDERER_INST_DATA;
2831 Object *cstate = (Object*)(((struct List*)XGET(self, MUIA_Application_WindowList))->lh_Head);
2832 Object *child = NULL;
2834 STRPTR scr_title = GetUserScreenTitle(data->wd_Prefs);
2836 while ((child = NextObject(&cstate)))
2837 SET(child, MUIA_Window_ScreenTitle, (IPTR) scr_title);
2839 return TRUE;
2843 ///Wanderer__MUIM_Wanderer_HandleCommand()
2844 IPTR Wanderer__MUIM_Wanderer_HandleCommand
2846 Class *CLASS, Object *self, Msg message
2849 SETUP_WANDERER_INST_DATA;
2850 struct WBHandlerMessage *wbhm = NULL;
2851 struct List *pub_screen_list;
2852 struct PubScreenNode *pub_screen_node;
2853 WORD visitor_count = 0;
2854 D(bug("[Wanderer] %s()\n", __PRETTY_FUNCTION__));
2855 D(bug("[Wanderer] %s: Recieved signal at notification port\n", __PRETTY_FUNCTION__));
2857 while ((wbhm = WBHM(GetMsg(data->wd_CommandPort))) != NULL)
2859 D(bug("[Wanderer] %s: Recieved message from handler, type = %ld\n", __PRETTY_FUNCTION__, wbhm->wbhm_Type));
2861 switch (wbhm->wbhm_Type)
2863 case WBHM_TYPE_SHOW:
2864 D(bug("[Wanderer] %s: WBHM_TYPE_SHOW\n", __PRETTY_FUNCTION__));
2865 if ((data->wd_Screen = LockPubScreen(NULL)) != NULL)
2867 D(bug("[Wanderer] %s: Unlocking access to screen @ %x\n", __PRETTY_FUNCTION__, data->wd_Screen));
2868 UnlockPubScreen(NULL, data->wd_Screen);
2869 SET(self, MUIA_ShowMe, TRUE);
2871 else
2873 #warning "TODO: We need to handle the possiblity that we fail to lock the pubscreen..."
2874 D(bug("[Wanderer] %s: Couldnt Lock WB Screen!!\n", __PRETTY_FUNCTION__));
2876 break;
2878 case WBHM_TYPE_HIDE:
2879 D(bug("[Wanderer] %s: WBHM_TYPE_HIDE\n", __PRETTY_FUNCTION__));
2880 pub_screen_list = LockPubScreenList();
2882 #ifdef __AROS__
2883 ForeachNode (pub_screen_list, pub_screen_node)
2884 #else
2885 Foreach_Node(pub_screen_list, pub_screen_node);
2886 #endif
2888 if (pub_screen_node->psn_Screen == data->wd_Screen)
2889 visitor_count = pub_screen_node->psn_VisitorCount;
2891 UnlockPubScreenList();
2892 if (visitor_count == 0)
2893 SET(self, MUIA_ShowMe, FALSE);
2894 break;
2896 case WBHM_TYPE_UPDATE:
2897 D(bug("[Wanderer] %s: WBHM_TYPE_UPDATE\n", __PRETTY_FUNCTION__));
2899 CONST_STRPTR name = wbhm->wbhm_Data.Update.Name;
2900 ULONG length;
2902 switch (wbhm->wbhm_Data.Update.Type)
2904 case WBDISK:
2905 case WBDRAWER:
2906 case WBGARBAGE:
2907 length = strlen(name);
2908 break;
2910 default:
2911 length = PathPart(name) - name;
2912 break;
2915 D(bug("[Wanderer] %s: name = %s, length = %ld\n", __PRETTY_FUNCTION__, name, length));
2918 Object *cstate = (Object*)(((struct List*)XGET(self, MUIA_Application_WindowList))->lh_Head);
2919 Object *child = NULL;
2921 while ((child = NextObject(&cstate)))
2923 if (XGET(child, MUIA_UserData))
2925 STRPTR child_drawer = (STRPTR)XGET(child, MUIA_IconWindow_Location);
2929 child_drawer != NULL
2930 && strncmp(name, child_drawer, length) == 0
2931 && strlen(child_drawer) == length
2934 Object *iconlist = (Object *) XGET(child, MUIA_IconWindow_IconList);
2936 D(bug("[Wanderer] %s: Drawer found: %s!\n", __PRETTY_FUNCTION__, child_drawer));
2938 if (iconlist != NULL)
2940 DoMethod ( iconlist, MUIM_IconList_Update );
2942 break;
2948 break;
2950 case WBHM_TYPE_OPEN:
2951 D(bug("[Wanderer] %s: WBHM_TYPE_OPEN\n", __PRETTY_FUNCTION__));
2954 Object *cstate = (Object*)(((struct List*)XGET(self, MUIA_Application_WindowList))->lh_Head);
2955 Object *child;
2956 CONST_STRPTR buf = wbhm->wbhm_Data.Open.Name;
2958 while ((child = NextObject(&cstate)))
2960 if (XGET(child, MUIA_UserData))
2962 STRPTR child_drawer = (STRPTR)XGET(child, MUIA_IconWindow_Location);
2963 if (child_drawer && !Stricmp(buf,child_drawer))
2965 int is_open = XGET(child, MUIA_Window_Open);
2966 if (!is_open)
2967 DoMethod(child, MUIM_IconWindow_Open);
2968 else
2970 DoMethod(child, MUIM_Window_ToFront);
2971 SET(child, MUIA_Window_Activate, TRUE);
2973 return 0;
2978 DoMethod
2980 _WandererIntern_AppObj, MUIM_Wanderer_CreateDrawerWindow, (IPTR) buf
2983 break;
2984 } /* switch */
2986 ReplyMsg((struct Message *) wbhm);
2989 return 0;
2993 ///Wanderer__MUIM_Wanderer_HandleNotify()
2994 IPTR Wanderer__MUIM_Wanderer_HandleNotify
2996 Class *CLASS, Object *self, Msg message
2999 SETUP_WANDERER_INST_DATA;
3000 struct Message *plainMessage = NULL;
3001 struct Wanderer_FSHandler *nodeFSHandler;
3003 while ((plainMessage = GetMsg(data->wd_NotifyPort)) != NULL)
3005 struct NotifyMessage *notifyMessage = (struct NotifyMessage *) plainMessage;
3006 IPTR notifyMessage_UserData = notifyMessage->nm_NReq->nr_UserData;
3007 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_HandleNotify: got FS notification ('%s' @ 0x%p) userdata = 0x%p!\n", notifyMessage->nm_NReq->nr_Name, notifyMessage, notifyMessage_UserData));
3009 if (notifyMessage_UserData != (IPTR) NULL)
3011 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_HandleNotify: Drawer Window contents changed .. Updating\n"));
3012 DoMethod((Object *)notifyMessage_UserData, MUIM_IconList_Update);
3015 ForeachNode(&_WandererIntern_FSHandlerList, nodeFSHandler)
3017 if ((notifyMessage_UserData == (IPTR)NULL) && (strcmp(notifyMessage->nm_NReq->nr_Name, nodeFSHandler->fshn_Node.ln_Name) == 0))
3019 /* reload prefs file */
3020 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_HandleNotify: Wanderer Prefs-File Changed .. Reloading\n"));
3022 nodeFSHandler->HandleFSUpdate();
3025 ReplyMsg((struct Message *)notifyMessage);
3028 return 0;
3032 ///Wanderer__Func_CreateWandererIntuitionMenu()
3033 /* Some differences here between volumes and subwindows */
3034 Object * Wanderer__Func_CreateWandererIntuitionMenu( BOOL isRoot, BOOL isBackdrop)
3036 Object *_NewWandIntMenu__menustrip = NULL;
3037 IPTR _NewWandIntMenu__OPTION_BACKDROP = CHECKIT|MENUTOGGLE;
3038 IPTR _NewWandIntMenu__OPTION_SHOWALL = CHECKIT|MENUTOGGLE;
3040 if (isBackdrop)
3042 _NewWandIntMenu__OPTION_BACKDROP |= CHECKED;
3045 if ( isRoot )
3047 struct NewMenu nm[] = {
3048 {NM_TITLE, _(MSG_MEN_WANDERER)},
3049 {NM_ITEM, _(MSG_MEN_BACKDROP),_(MSG_MEN_SC_BACKDROP), _NewWandIntMenu__OPTION_BACKDROP , 0, (APTR) MEN_WANDERER_BACKDROP},
3050 {NM_ITEM, _(MSG_MEN_EXECUTE), _(MSG_MEN_SC_EXECUTE), 0 , 0, (APTR) MEN_WANDERER_EXECUTE},
3052 {NM_ITEM, _(MSG_MEN_SHELL), _(MSG_MEN_SC_SHELL) , 0 , 0, (APTR) MEN_WANDERER_SHELL},
3053 #if defined(__AROS__)
3054 {NM_ITEM, "AROS"},
3055 {NM_SUB, _(MSG_MEN_ABOUT), NULL , 0 , 0, (APTR) MEN_WANDERER_AROS_ABOUT},
3056 {NM_SUB, _(MSG_MEN_GUISET), NULL , 0 , 0, (APTR) MEN_WANDERER_AROS_GUISETTINGS},
3057 #endif
3058 {NM_ITEM, _(MSG_MEN_ABOUT), NULL , 0 , 0, (APTR) MEN_WANDERER_ABOUT},
3059 {NM_ITEM, _(MSG_MEN_QUIT) , _(MSG_MEN_SC_QUIT) , 0 , 0, (APTR) MEN_WANDERER_QUIT},
3060 {NM_ITEM, _(MSG_MEN_SHUTDOWN), NULL , 0 , 0, (APTR) MEN_WANDERER_SHUTDOWN},
3061 {NM_TITLE, _(MSG_MEN_WINDOW), NULL, 0},
3062 {NM_ITEM, _(MSG_MEN_UPDATE), NULL , 0 , 0, (APTR) MEN_WINDOW_UPDATE},
3063 {NM_ITEM, NM_BARLABEL},
3064 {NM_ITEM, _(MSG_MEN_CONTENTS), _(MSG_MEN_SC_CONTENTS), 0 , 0, (APTR) MEN_WINDOW_SELECT},
3065 {NM_ITEM, _(MSG_MEN_CLRSEL), _(MSG_MEN_SC_CLRSEL) , 0 , 0, (APTR) MEN_WINDOW_CLEAR},
3066 {NM_ITEM, NM_BARLABEL},
3067 {NM_ITEM, _(MSG_MEN_SNAPSHT) },
3068 {NM_SUB, _(MSG_MEN_WINDOW), NULL , 0 , 0, (APTR) MEN_WINDOW_SNAP_WIN},
3069 {NM_SUB, _(MSG_MEN_ALL), NULL , 0 , 0, (APTR) MEN_WINDOW_SNAP_ALL},
3070 {NM_ITEM, NM_BARLABEL},
3071 {NM_ITEM, _(MSG_MEN_VIEW)},
3072 {NM_SUB, _(MSG_MEN_ICVIEW), NULL , CHECKIT|CHECKED , ~1, (APTR) MEN_WINDOW_VIEW_ICON},
3073 {NM_SUB, _(MSG_MEN_DCVIEW), NULL , CHECKIT , ~2, (APTR) MEN_WINDOW_VIEW_DETAIL},
3074 {NM_SUB, NM_BARLABEL},
3075 {NM_SUB, _(MSG_MEN_ALLFIL), NULL , _NewWandIntMenu__OPTION_SHOWALL , 0, (APTR) MEN_WINDOW_VIEW_ALL},
3076 {NM_ITEM, _(MSG_MEN_SORTIC)},
3077 {NM_SUB, _(MSG_MEN_CLNUP), _(MSG_MEN_SC_CLNUP) , 0 , 0, (APTR) MEN_WINDOW_SORT_NOW},
3078 {NM_SUB, "Enable Icon Sorting", NULL , CHECKIT|MENUTOGGLE|CHECKED|ITEMENABLED , 0, (APTR) MEN_WINDOW_SORT_ENABLE},
3079 {NM_SUB, NM_BARLABEL},
3080 {NM_SUB, _(MSG_MEN_BYNAME), NULL , CHECKIT|MENUTOGGLE , ~1, (APTR) MEN_WINDOW_SORT_NAME},
3081 {NM_SUB, _(MSG_MEN_BYDATE), NULL , CHECKIT|MENUTOGGLE , ~2, (APTR) MEN_WINDOW_SORT_DATE},
3082 {NM_SUB, _(MSG_MEN_BYSIZE), NULL , CHECKIT|MENUTOGGLE , ~3, (APTR) MEN_WINDOW_SORT_SIZE},
3083 {NM_SUB, _(MSG_MEN_BYTYPE), NULL , CHECKIT|MENUTOGGLE , ~4, (APTR) MEN_WINDOW_SORT_TYPE},
3084 {NM_SUB, NM_BARLABEL},
3085 {NM_SUB, _(MSG_MEN_REVERSE), NULL , CHECKIT|MENUTOGGLE , 0, (APTR) MEN_WINDOW_SORT_REVERSE},
3086 {NM_SUB, _(MSG_MEN_DRWFRST), NULL , CHECKIT|MENUTOGGLE|ITEMENABLED , 0, (APTR) MEN_WINDOW_SORT_TOPDRAWERS},
3087 //{NM_SUB, "Group Icons", NULL , CHECKIT|MENUTOGGLE|CHECKED, 0, (APTR) MEN_WINDOW_SORT_GROUP},
3088 {NM_TITLE, _(MSG_MEN_ICON), NULL, 0},
3089 {NM_ITEM, _(MSG_MEN_OPEN), _(MSG_MEN_SC_OPEN) , ITEMENABLED, 0, (APTR) MEN_ICON_OPEN},
3090 //{NM_ITEM, "Close","C" },
3091 {NM_ITEM, _(MSG_MEN_RENAME), _(MSG_MEN_SC_RENAME) , ITEMENABLED, 0, (APTR) MEN_ICON_RENAME},
3092 {NM_ITEM, _(MSG_MEN_INFO), _(MSG_MEN_SC_INFO) , ITEMENABLED, 0, (APTR) MEN_ICON_INFORMATION},
3093 {NM_ITEM, _(MSG_SNAPSHOT), "S" , ITEMENABLED, 0, (APTR) MEN_ICON_SNAPSHOT},
3094 {NM_ITEM, _(MSG_UNSNAPSHOT), "U" , ITEMENABLED, 0, (APTR) MEN_ICON_UNSNAPSHOT},
3095 {NM_ITEM, _(MSG_LEAVE_OUT), "L" , ITEMENABLED, 0, (APTR) MEN_ICON_LEAVEOUT},
3096 {NM_ITEM, _(MSG_PUT_AWAY), "P" , ITEMENABLED, 0, (APTR) MEN_ICON_PUTAWAY},
3097 {NM_ITEM, NM_BARLABEL},
3098 {NM_ITEM, _(MSG_MEN_DELETE), NULL , ITEMENABLED, 0, (APTR) MEN_ICON_DELETE},
3099 {NM_ITEM, _(MSG_MEN_FORMAT), NULL , ITEMENABLED, 0, (APTR) MEN_ICON_FORMAT},
3100 {NM_ITEM, _(MSG_EMPTY_TRASH), NULL , ITEMENABLED},
3101 {NM_TITLE, _(MSG_MEN_TOOLS), NULL, 0},
3102 {NM_END}
3104 _NewWandIntMenu__menustrip = MUI_MakeObject(MUIO_MenustripNM, nm, (IPTR) NULL);
3106 else
3108 struct NewMenu nm[] = {
3109 {NM_TITLE, _(MSG_MEN_WANDERER)},
3110 {NM_ITEM, _(MSG_MEN_BACKDROP),_(MSG_MEN_SC_BACKDROP), _NewWandIntMenu__OPTION_BACKDROP, 0, (APTR) MEN_WANDERER_BACKDROP},
3111 {NM_ITEM, _(MSG_MEN_EXECUTE), _(MSG_MEN_SC_EXECUTE) , 0 , 0, (APTR) MEN_WANDERER_EXECUTE},
3113 {NM_ITEM, _(MSG_MEN_SHELL), _(MSG_MEN_SC_SHELL) , 0 , 0, (APTR) MEN_WANDERER_SHELL},
3114 #if defined(__AROS__)
3115 {NM_ITEM, "AROS"},
3116 {NM_SUB, _(MSG_MEN_ABOUT), NULL , 0 , 0, (APTR) MEN_WANDERER_AROS_ABOUT},
3117 {NM_SUB, _(MSG_MEN_GUISET), NULL , 0 , 0, (APTR) MEN_WANDERER_AROS_GUISETTINGS},
3118 #endif
3119 {NM_ITEM, _(MSG_MEN_ABOUT), NULL , 0 , 0, (APTR) MEN_WANDERER_ABOUT},
3120 {NM_ITEM, _(MSG_MEN_QUIT) , _(MSG_MEN_SC_QUIT) , 0 , 0, (APTR) MEN_WANDERER_QUIT},
3121 {NM_ITEM, _(MSG_MEN_SHUTDOWN), NULL , 0 , 0, (APTR) MEN_WANDERER_SHUTDOWN},
3123 {NM_TITLE, _(MSG_MEN_WINDOW), NULL, 0},
3125 {NM_ITEM, _(MSG_MEN_NEWDRAW), _(MSG_MEN_SC_NEWDRAW) , 0 , 0, (APTR) MEN_WINDOW_NEW_DRAWER},
3126 {NM_ITEM, _(MSG_MEN_OPENPAR), NULL , 0 , 0, (APTR) MEN_WINDOW_OPEN_PARENT},
3127 {NM_ITEM, _(MSG_MEN_CLOSE), _(MSG_MEN_SC_CLOSE) , 0 , 0, (APTR) MEN_WINDOW_CLOSE},
3128 {NM_ITEM, _(MSG_MEN_UPDATE), NULL , 0 , 0, (APTR) MEN_WINDOW_UPDATE},
3129 {NM_ITEM, NM_BARLABEL},
3130 {NM_ITEM, _(MSG_MEN_CONTENTS), _(MSG_MEN_SC_CONTENTS), 0 , 0, (APTR) MEN_WINDOW_SELECT},
3131 {NM_ITEM, _(MSG_MEN_CLRSEL), _(MSG_MEN_SC_CLRSEL) , 0 , 0, (APTR) MEN_WINDOW_CLEAR},
3132 {NM_ITEM, NM_BARLABEL},
3133 {NM_ITEM, _(MSG_MEN_SNAPSHT) },
3134 {NM_SUB, _(MSG_MEN_WINDOW), NULL , 0 , 0, (APTR) MEN_WINDOW_SNAP_WIN},
3135 {NM_SUB, _(MSG_MEN_ALL), NULL , 0 , 0, (APTR) MEN_WINDOW_SNAP_ALL},
3136 {NM_ITEM, NM_BARLABEL},
3137 {NM_ITEM, _(MSG_MEN_VIEW)},
3138 {NM_SUB, _(MSG_MEN_ICVIEW), NULL , CHECKIT|CHECKED ,~1, (APTR) MEN_WINDOW_VIEW_ICON},
3139 {NM_SUB, _(MSG_MEN_DCVIEW), NULL , CHECKIT ,~2, (APTR) MEN_WINDOW_VIEW_DETAIL},
3140 {NM_SUB, NM_BARLABEL},
3141 {NM_SUB, _(MSG_MEN_ALLFIL), NULL , _NewWandIntMenu__OPTION_SHOWALL, 0, (APTR) MEN_WINDOW_VIEW_ALL},
3142 {NM_ITEM, _(MSG_MEN_SORTIC)},
3143 {NM_SUB, _(MSG_MEN_CLNUP), _(MSG_MEN_SC_CLNUP) , 0 , 0, (APTR) MEN_WINDOW_SORT_NOW},
3144 {NM_SUB, "Enable Icon Sorting", NULL , CHECKIT|MENUTOGGLE|CHECKED , 0, (APTR) MEN_WINDOW_SORT_ENABLE},
3145 {NM_SUB, NM_BARLABEL},
3146 {NM_SUB, _(MSG_MEN_BYNAME), NULL , CHECKIT|MENUTOGGLE , ~1, (APTR) MEN_WINDOW_SORT_NAME},
3147 {NM_SUB, _(MSG_MEN_BYDATE), NULL , CHECKIT|MENUTOGGLE , ~2, (APTR) MEN_WINDOW_SORT_DATE},
3148 {NM_SUB, _(MSG_MEN_BYSIZE), NULL , CHECKIT|MENUTOGGLE , ~3, (APTR) MEN_WINDOW_SORT_SIZE},
3149 {NM_SUB, _(MSG_MEN_BYTYPE), NULL , CHECKIT|MENUTOGGLE|ITEMENABLED , ~4, (APTR) MEN_WINDOW_SORT_TYPE},
3150 {NM_SUB, NM_BARLABEL},
3151 {NM_SUB, _(MSG_MEN_REVERSE), NULL , CHECKIT|MENUTOGGLE , 0, (APTR) MEN_WINDOW_SORT_REVERSE},
3152 {NM_SUB, _(MSG_MEN_DRWFRST), NULL , CHECKIT|MENUTOGGLE|CHECKED, 0, (APTR) MEN_WINDOW_SORT_TOPDRAWERS},
3153 //{NM_SUB, "Group Icons", NULL, CHECKIT|MENUTOGGLE|CHECKED, 0, (APTR) MEN_WINDOW_SORT_GROUP},
3154 {NM_TITLE, _(MSG_MEN_ICON), NULL, 0},
3155 {NM_ITEM, _(MSG_MEN_OPEN), _(MSG_MEN_SC_OPEN) , ITEMENABLED, 0, (APTR) MEN_ICON_OPEN},
3156 // {NM_ITEM, "Close","C" },
3157 {NM_ITEM, _(MSG_MEN_RENAME), _(MSG_MEN_SC_RENAME) , ITEMENABLED, 0, (APTR) MEN_ICON_RENAME},
3158 {NM_ITEM, _(MSG_MEN_INFO), _(MSG_MEN_SC_INFO) , ITEMENABLED, 0, (APTR) MEN_ICON_INFORMATION},
3159 {NM_ITEM, _(MSG_SNAPSHOT), "S" , ITEMENABLED, 0, (APTR) MEN_ICON_SNAPSHOT},
3160 {NM_ITEM, _(MSG_UNSNAPSHOT), "U" , ITEMENABLED, 0, (APTR) MEN_ICON_UNSNAPSHOT},
3161 {NM_ITEM, _(MSG_LEAVE_OUT), "L" , ITEMENABLED, 0, (APTR) MEN_ICON_LEAVEOUT},
3162 {NM_ITEM, _(MSG_PUT_AWAY), "P" , ITEMENABLED, 0, (APTR) MEN_ICON_PUTAWAY},
3163 {NM_ITEM, NM_BARLABEL},
3164 {NM_ITEM, _(MSG_MEN_DELETE), NULL , ITEMENABLED, 0, (APTR) MEN_ICON_DELETE},
3165 {NM_ITEM, _(MSG_MEN_FORMAT), NULL , ITEMENABLED},
3166 {NM_ITEM, _(MSG_EMPTY_TRASH),NULL , ITEMENABLED},
3168 {NM_TITLE, _(MSG_MEN_TOOLS), NULL, 0},
3169 {NM_END}
3171 _NewWandIntMenu__menustrip = MUI_MakeObject(MUIO_MenustripNM, nm, (IPTR) NULL);
3173 return _NewWandIntMenu__menustrip;
3177 ///Wanderer__MUIM_Wanderer_CreateDrawerWindow()
3178 Object *Wanderer__MUIM_Wanderer_CreateDrawerWindow
3180 Class *CLASS, Object *self,
3181 struct MUIP_Wanderer_CreateDrawerWindow *message
3184 SETUP_WANDERER_INST_DATA;
3186 Object *window = NULL;
3187 BOOL isWorkbenchWindow = FALSE;
3188 BOOL useBackdrop = FALSE;
3189 IPTR TAG_IconWindow_Drawer;
3190 IPTR useFont;
3191 Object *_NewWandDrawerMenu__menustrip;
3193 Object *window_IconList = NULL;
3195 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow()\n"));
3197 if ((isWorkbenchWindow = (message->drawer == NULL ? TRUE : FALSE)))
3199 useBackdrop = data->wd_Option_BackDropMode;
3202 TAG_IconWindow_Drawer = isWorkbenchWindow ? TAG_IGNORE : MUIA_IconWindow_Location;
3204 useFont = (IPTR)NULL;
3206 data->wd_Screen = LockPubScreen(NULL);
3208 if(data->wd_Screen == NULL)
3210 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow: Couldn't lock screen!\n"));
3211 CoerceMethod(CLASS, self, OM_DISPOSE);
3212 return NULL;
3214 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow: Using Screen @ %p\n", data->wd_Screen));
3216 if (data->wd_PrefsIntern)
3218 useFont = (IPTR)((struct WandererInternalPrefsData *)data->wd_PrefsIntern)->WIPD_IconFont;
3221 _NewWandDrawerMenu__menustrip = Wanderer__Func_CreateWandererIntuitionMenu (isWorkbenchWindow, useBackdrop);
3223 //D(bug("1\n\n")); Delay(100);
3224 /* Create a new icon drawer window with the correct drawer being set */
3226 #ifdef __AROS__
3227 window = (Object *)IconWindowObject,
3228 MUIA_UserData, 1,
3229 MUIA_Wanderer_Prefs, (IPTR)data->wd_Prefs,
3230 MUIA_Wanderer_Screen, (IPTR)data->wd_Screen,
3231 MUIA_Window_ScreenTitle, (IPTR)GetUserScreenTitle(data->wd_Prefs),
3232 MUIA_Window_Menustrip, (IPTR) _NewWandDrawerMenu__menustrip,
3233 TAG_IconWindow_Drawer, (IPTR) message->drawer,
3234 MUIA_IconWindow_Font, useFont,
3235 MUIA_IconWindow_ActionHook, (IPTR) &_WandererIntern_hook_action,
3236 MUIA_IconWindow_IsRoot, isWorkbenchWindow ? TRUE : FALSE,
3237 isWorkbenchWindow ? MUIA_IconWindow_IsBackdrop : TAG_IGNORE, useBackdrop,
3238 isWorkbenchWindow ? TAG_IGNORE : MUIA_Wanderer_FileSysNotifyPort, (IPTR)data->wd_NotifyPort,
3239 isWorkbenchWindow ? TAG_IGNORE : MUIA_Wanderer_FileSysNotifyList, (IPTR)&_WandererIntern_FSHandlerList,
3240 MUIA_Window_IsSubWindow, isWorkbenchWindow ? FALSE : TRUE,
3241 End;
3242 #else
3243 window = NewObject(IconWindow_CLASS->mcc_Class, NULL,
3244 MUIA_UserData, 1,
3245 MUIA_Wanderer_Prefs, data->wd_Prefs,
3246 MUIA_Wanderer_Screen, data->wd_Screen,
3247 MUIA_Window_ScreenTitle, GetUserScreenTitle(data->wd_Prefs),
3248 MUIA_Window_Menustrip, (IPTR) _NewWandDrawerMenu__menustrip,
3249 TAG_IconWindow_Drawer, (IPTR) message->drawer,
3250 MUIA_IconWindow_Font, useFont,
3251 MUIA_IconWindow_ActionHook, (IPTR) &_WandererIntern_hook_action,
3252 MUIA_IconWindow_IsRoot, isWorkbenchWindow ? TRUE : FALSE,
3253 isWorkbenchWindow ? MUIA_IconWindow_IsBackdrop : TAG_IGNORE, useBackdrop,
3254 isWorkbenchWindow ? TAG_IGNORE : MUIA_Wanderer_FileSysNotifyPort, data->wd_NotifyPort,
3255 MUIA_Window_IsSubWindow, isWorkbenchWindow ? FALSE : TRUE,
3256 TAG_DONE);
3257 #endif
3258 //D(bug("2\n\n")); Delay(100);
3259 if (data->wd_Screen)
3261 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow: Unlocking access to screen @ %p\n", data->wd_Screen));
3262 UnlockPubScreen(NULL, data->wd_Screen);
3265 if (window != NULL)
3267 D(bug("Wanderer__MUIM_Wanderer_CreateDrawerWindow: window != NULL\n"));
3268 /* Get the drawer path back so we can use it also outside this function */
3269 STRPTR drw = NULL;
3270 BOOL freeDrwStr = FALSE;
3272 if (!isWorkbenchWindow) drw = (STRPTR) XGET(window, MUIA_IconWindow_Location);
3273 else
3275 D(bug("Wanderer__MUIM_Wanderer_CreateDrawerWindow: call AllocVec()\n"));
3276 drw = AllocVec ( 5, MEMF_CLEAR );
3277 sprintf ( drw, "RAM:" );
3278 freeDrwStr = TRUE;
3281 if (isWorkbenchWindow)
3283 D(bug("Wanderer__MUIM_Wanderer_CreateDrawerWindow: isWorkbenchWindow\n"));
3284 DoMethod
3286 window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
3287 (IPTR)self, 3, MUIM_CallHook, (IPTR)&_WandererIntern_hook_standard, (IPTR)wanderer_menufunc_wanderer_quit
3290 else
3292 DoMethod
3294 window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
3295 (IPTR)_app(self), 4, MUIM_Application_PushMethod, (IPTR)window, 1, MUIM_IconWindow_Remove
3299 D(bug("Wanderer__MUIM_Wanderer_CreateDrawerWindow: call get with MUIA_IconWindow_IconList\n"));
3300 GET(window, MUIA_IconWindow_IconList, &window_IconList);
3302 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow: IconWindows IconList @ %p\n", window_IconList));
3304 if (window_IconList != NULL)
3306 struct Hook *_wand_UpdateMenuStates_hook = NULL;
3308 if ((_wand_UpdateMenuStates_hook = AllocMem(sizeof(struct Hook), MEMF_CLEAR|MEMF_PUBLIC)) != NULL)
3310 _wand_UpdateMenuStates_hook->h_Entry = ( HOOKFUNC )Wanderer__HookFunc_UpdateMenuStatesFunc;
3311 DoMethod
3313 window_IconList, MUIM_Notify, MUIA_IconList_SelectionChanged, MUIV_EveryTime,
3314 (IPTR) self, 3,
3315 MUIM_CallHook, _wand_UpdateMenuStates_hook, (IPTR)window
3318 Wanderer__Func_UpdateMenuStates(window, window_IconList);
3320 D(bug("Wanderer__MUIM_Wanderer_CreateDrawerWindow: setup notifications\n"));
3321 DoMethod
3323 window, MUIM_Notify, MUIA_Window_Activate, TRUE,
3324 (IPTR)_app(self), 3, MUIM_Set, MUIA_Wanderer_ActiveWindow, (IPTR) window
3327 #if 1
3328 DoMethod
3330 window, MUIM_Notify, MUIA_IconWindow_IsBackdrop, MUIV_EveryTime,
3331 (IPTR)_app(self), 5, MUIM_Application_PushMethod, (IPTR)_app(self), 2, MUIM_CallHook, (IPTR)&_WandererIntern_hook_backdrop
3333 #else
3334 DoMethod
3336 window, MUIM_Notify, MUIA_IconWindow_IsBackdrop, MUIV_EveryTime,
3337 (IPTR)_app(self), 2, MUIM_CallHook, (IPTR) &_WandererIntern_hook_backdrop
3339 #endif
3340 D(bug("Wanderer__MUIM_Wanderer_CreateDrawerWindow: execute all notifies\n"));
3341 /* If "Execute Command" entry is clicked open the execute window */
3342 DoAllMenuNotifies(self, _NewWandDrawerMenu__menustrip, drw);
3344 D(bug("Wanderer__MUIM_Wanderer_CreateDrawerWindow: add window to app\n"));
3345 /* Add the window to the application */
3346 #ifdef __AROS__
3347 DoMethod(_app(self), OM_ADDMEMBER, (IPTR) window);
3348 #else
3349 DoMethod(self, OM_ADDMEMBER, (IPTR) window);
3350 #endif
3351 D(bug("Wanderer__MUIM_Wanderer_CreateDrawerWindow: open window\n"));
3352 /* And now open it */
3353 DoMethod(window, MUIM_IconWindow_Open);
3354 D(bug("Wanderer__MUIM_Wanderer_CreateDrawerWindow: clean up memory\n"));
3355 /* Clean up ram string */
3356 if ( freeDrwStr && drw ) FreeVec ( drw );
3358 D(bug("Wanderer__MUIM_Wanderer_CreateDrawerWindow: exit\n"));
3359 return window;
3362 /*** Setup ******************************************************************/
3363 ZUNE_CUSTOMCLASS_9
3365 Wanderer, NULL, MUIC_Application, NULL,
3366 OM_NEW, struct opSet *,
3367 OM_DISPOSE, Msg,
3368 OM_SET, struct opSet *,
3369 OM_GET, struct opGet *,
3370 MUIM_Application_Execute, Msg,
3371 MUIM_Wanderer_HandleTimer, Msg,
3372 MUIM_Wanderer_HandleCommand, Msg,
3373 MUIM_Wanderer_HandleNotify, Msg,
3374 MUIM_Wanderer_CreateDrawerWindow, struct MUIP_Wanderer_CreateDrawerWindow *