ExpandEnvName() must allocate one more byte,
[tangerine.git] / workbench / system / Wanderer / wanderer.c
blob8366c007a2515f153a54aefaffa4afa61a15a491
1 /*
2 Copyright 2004-2006, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define MUIMASTER_YES_INLINE_STDARG
8 #define DEBUG 0
9 #include <aros/debug.h>
11 #define WANDERER_DEFAULT_BACKDROP
12 //#define WANDERER_DEFAULT_SHOWALL
13 //#define WANDERER_DEFAULT_SHOWHIDDEN
15 #include <exec/types.h>
16 #include <libraries/gadtools.h>
17 #include <libraries/mui.h>
18 #include <zune/customclasses.h>
19 #include <dos/notify.h>
20 #include <workbench/handler.h>
21 #include <proto/graphics.h>
22 #include <proto/utility.h>
23 #include <proto/intuition.h>
24 #include <proto/muimaster.h>
25 #include <proto/dos.h>
26 #include <proto/workbench.h>
27 #include <proto/layers.h>
28 #include <proto/alib.h>
30 #include <string.h>
31 #include <stdio.h>
32 #include <time.h>
34 #include <aros/detach.h>
35 #include <prefs/wanderer.h>
37 #include "iconwindow.h"
38 #include "iconwindow_attributes.h"
39 #include "iconwindowcontents.h"
40 #include "wandererprefs.h"
41 #include "wandererprefsintern.h"
42 #include "filesystems.h"
43 #include "wanderer.h"
44 #include "../../libs/muimaster/classes/iconlist.h"
45 #include "../../libs/muimaster/classes/iconlist_attributes.h"
46 #include "locale.h"
48 #define VERSION "$VER: Wanderer 0.65 (16.04.2007) The AROS Dev Team"
50 #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, End
52 extern IPTR InitWandererPrefs(void);
53 VOID DoAllMenuNotifies(Object *strip, STRPTR path);
54 Object *FindMenuitem(Object* strip, int id);
55 Object *__CreateWandererIntuitionMenu__(BOOL isRoot, BOOL useBackdrop);
56 void wanderer_menufunc_window_update(void);
57 void execute_open_with_command(BPTR cd, STRPTR contents);
58 void DisposeCopyDisplay(struct MUIDisplayObjects *d);
59 BOOL CreateCopyDisplay(UWORD flags, struct MUIDisplayObjects *d);
61 /* Stored in the main wanderer executable */
62 extern Object *_WandererIntern_AppObj;
63 extern Class *_WandererIntern_CLASS;
64 /* Internal Hooks */
65 struct Hook _WandererIntern_hook_standard;
66 struct Hook _WandererIntern_hook_action;
67 struct Hook _WandererIntern_hook_backdrop;
69 static unsigned char strtochar(STRPTR st)
71 return *st++;
74 /*** Instance Data **********************************************************/
75 struct Wanderer_DATA
77 struct Screen *wd_Screen;
79 Object *wd_Prefs,
80 *wd_ActiveWindow,
81 *wd_WorkbenchWindow;
83 struct MUI_InputHandlerNode wd_TimerIHN;
84 struct MsgPort *wd_CommandPort;
85 struct MUI_InputHandlerNode wd_CommandIHN;
86 struct MsgPort *wd_NotifyPort;
87 struct MUI_InputHandlerNode wd_NotifyIHN;
88 struct NotifyRequest pnr;
90 IPTR wd_PrefsIntern;
91 BOOL wd_Option_BackDropMode;
94 /*** Macros *****************************************************************/
95 #define SETUP_WANDERER_INST_DATA struct Wanderer_DATA *data = INST_DATA(CLASS, self)
97 /**************************************************************************
98 * HOOK FUNCS *
99 **************************************************************************/
101 AROS_UFH3
103 BOOL, Wanderer__HookFunc_DisplayCopyFunc,
104 AROS_UFHA(struct Hook *, h, A0),
105 AROS_UFHA(struct dCopyStruct *, obj, A2),
106 AROS_UFHA(APTR, unused_param, A1)
109 AROS_USERFUNC_INIT
111 char *c = NULL;
112 unsigned int difftime;
114 struct MUIDisplayObjects *d = (struct MUIDisplayObjects *) obj->userdata;
117 if ((obj->flags & ACTION_UPDATE) == 0)
119 d->updateme = TRUE;
121 if (obj->filelen < 8192)
123 d->smallobjects++;
124 if (d->smallobjects >= 20) d->smallobjects = 0;
126 else
128 d->smallobjects = 0;
130 if (d->smallobjects > 0) d->updateme = FALSE;
131 if (d->updateme)
133 SET(d->fileObject, MUIA_Text_Contents, obj->file);
134 SET(d->sourceObject, MUIA_Text_Contents, obj->spath);
137 if (d->action != ACTION_DELETE)
140 d->bytes += obj->actlen;
141 if ((obj->flags & ACTION_UPDATE) == 0)
143 if (d->updateme)
145 SET(d->gauge, MUIA_Gauge_Current, 0);
146 SET(d->destObject, MUIA_Text_Contents, obj->dpath);
148 d->numfiles++;
150 else
152 if (d->updateme &&(obj->totallen <= obj->filelen))
154 sprintf(d->SpeedBuffer, "Speed: %.2f kBytes/s", (double) (((double) obj->totallen) / (((double) obj->difftime) / ((double) CLOCKS_PER_SEC))) / 1024.0);
155 SetAttrs(d->gauge, MUIA_Gauge_Current, (ULONG) (32768.0 * (double) obj->totallen / (double) obj->filelen), MUIA_Gauge_InfoText, d->SpeedBuffer, TAG_DONE);
160 if (d->updateme)
162 sprintf(
163 d->Buffer, "# of files: %ld Actual: %.2f kBytes Total: %.2f kBytes",
164 d->numfiles, (double) obj->filelen / 1024.0, (double) d->bytes / 1024.0
166 SET(d->performanceObject, MUIA_Text_Contents, d->Buffer);
170 DoMethod(d->copyApp, MUIM_Application_InputBuffered);
172 /* read the stopflag and return TRUE if the user wanted to stop actionDir() */
174 if (d->stopflag == 1) return TRUE; else return FALSE;
176 AROS_USERFUNC_EXIT
179 AROS_UFH3
181 ULONG, Wanderer__HookFunc_AskDeleteFunc,
182 AROS_UFHA(struct Hook *, h, A0),
183 AROS_UFHA(struct dCopyStruct *, obj, A2),
184 AROS_UFHA(APTR, unused_param, A1)
187 AROS_USERFUNC_INIT
189 ULONG back = DELMODE_NONE;
191 UWORD ret = 0;
192 char *string = NULL;
194 if (obj->file)
196 if (obj->type == 0)
198 string = CombineString("Really delete file\n\033b%s\033n\nlocated in\n\033b%s\033n ?",
199 obj->file, obj->spath);
201 else if (obj->type == 1)
203 string = CombineString("Do you wish to unprotect file\n\033b%s\033n\nlocated in\n\033b%s\033n ?",
204 obj->file, obj->spath);
206 else if (obj->type == 2)
208 string = CombineString("Really overwrite file\n\033b%s\033n\nlocated in\n\033b%s\033n ?",
209 obj->file, obj->spath);
211 else
213 string = CombineString("Can't access file\n\033b%s\033n\nlocated in\n\033b%s\033n ?",
214 obj->file, obj->spath);
217 else
219 if (obj->type == 0) string = CombineString("Really delete drawer\n\033b%s\033n ?", obj->spath);
220 else if (obj->type == 1) string = CombineString("Do you wish to unprotect drawer\n\033b%s\033n ?", obj->spath);
221 else if (obj->type == 3) string = CombineString("Can't access drawer\n\033b%s", obj->spath);
224 if (string)
226 if (obj->type == 0) ret = AskChoiceCentered("Delete Requester:", string, "_Yes|Yes to _All|_No|No _to ALL", 0);
227 else if (obj->type == 1) ret = AskChoiceCentered("Protection Requester:", string, "_Unprotect|Unprotect _All|_No|No _to ALL", 0);
228 else if (obj->type == 2) ret = AskChoiceCentered("Overwrite Requester:", string, "_Overwrite|Overwrite _All|_No|No _to ALL", 0);
229 else ret = AskChoiceCentered("Overwrite Requester:", string, "_Skip|_Abort", 0);
230 freeString(NULL, string);
233 if (ret == 0) back = DELMODE_NONE;
234 else if (ret == 1) back = DELMODE_DELETE;
235 else if (ret == 2) back = DELMODE_ALL;
236 else if (ret == 3) back = DELMODE_NO;
238 return back;
240 AROS_USERFUNC_EXIT
243 AROS_UFH3
245 void, Wanderer__HookFunc_ActionFunc,
246 AROS_UFHA(struct Hook *, h, A0),
247 AROS_UFHA(Object *, obj, A2),
248 AROS_UFHA(struct IconWindow_ActionMsg *, msg, A1)
251 AROS_USERFUNC_INIT
253 if (msg->type == ICONWINDOW_ACTION_OPEN)
255 static unsigned char buf[1024];
257 struct IconList_Entry *ent = (void*)MUIV_IconList_NextSelected_Start;
259 DoMethod(msg->iconlist, MUIM_IconList_NextSelected, (IPTR) &ent);
260 if ((int)ent == MUIV_IconList_NextSelected_End) return;
262 IPTR offset = strlen(ent->filename) - 5;
264 if ((msg->isroot) && (!Stricmp(ent->filename + offset, ":Disk")))
266 strcpy(buf,ent->label);
267 strcat(buf,":");
269 else
271 strcpy(buf,ent->filename);
274 D(bug("[WANDERER] Wanderer__HookFunc_ActionFunc: ICONWINDOW_ACTION_OPEN - offset = %d, buf = %s\n", offset, buf);)
276 if ( (ent->type == ST_ROOT) || (ent->type == ST_USERDIR) )
278 Object *cstate = (Object*)(((struct List*)XGET(_app(obj), MUIA_Application_WindowList))->lh_Head);
279 Object *prefs = (Object*) XGET(_app(obj), MUIA_Wanderer_Prefs);
280 Object *child;
282 /* open new window if root or classic navigation set */
283 if ( (msg->isroot) || (XGET(prefs, MUIA_IconWindowExt_Toolbar_NavigationMethod) == WPD_NAVIGATION_CLASSIC) )
285 while ((child = NextObject(&cstate)))
287 if (XGET(child, MUIA_UserData))
289 STRPTR child_drawer = (STRPTR)XGET(child, MUIA_IconWindow_Location);
290 if (child_drawer && !Stricmp(buf,child_drawer))
292 int is_open = XGET(child, MUIA_Window_Open);
294 if (!is_open)
296 DoMethod(child, MUIM_IconWindow_Open);
298 else
300 DoMethod(child, MUIM_Window_ToFront);
301 SET(child, MUIA_Window_Activate, TRUE);
304 return;
309 /* Check if the window for this drawer is already opened */
310 DoMethod(_WandererIntern_AppObj, MUIM_Wanderer_CreateDrawerWindow, (IPTR) buf);
311 // FIXME: error handling
313 else
315 /* open drawer in same window */
316 SET(obj, MUIA_IconWindow_Location, (IPTR) buf);
320 else if (ent->type == ST_FILE)
322 BPTR newwd, oldwd, file;
324 /* Set the CurrentDir to the path of the executable to be started */
325 file = Lock(ent->filename, SHARED_LOCK);
326 if(file)
328 newwd = ParentDir(file);
329 oldwd = CurrentDir(newwd);
331 if (!OpenWorkbenchObject(ent->filename, TAG_DONE))
333 execute_open_with_command(newwd, FilePart(ent->filename));
336 CurrentDir(oldwd);
337 UnLock(newwd);
338 UnLock(file);
342 else if (msg->type == ICONWINDOW_ACTION_DIRUP)
345 STRPTR actual_drawer = (STRPTR)XGET(obj, MUIA_IconWindow_Location);
346 STRPTR parent_drawer = strrchr(actual_drawer,'/');
347 STRPTR root_drawer = strrchr(actual_drawer,':');
349 /* check if dir is not drive root dir */
350 if ( strlen(root_drawer) > 1 )
352 /* check if second or third level directory*/
353 if (!parent_drawer)
355 (*(root_drawer+1)) = 0;
356 SET(obj, MUIA_IconWindow_Location, actual_drawer);
359 else
361 (*parent_drawer) = 0;
362 SET(obj, MUIA_IconWindow_Location, actual_drawer);
367 else if (msg->type == ICONWINDOW_ACTION_CLICK)
369 if (!msg->click->shift)
371 Object *cstate = (Object*)(((struct List*)XGET(_WandererIntern_AppObj, MUIA_Application_WindowList))->lh_Head);
372 Object *child;
374 while ((child = NextObject(&cstate)))
376 if (XGET(child, MUIA_UserData))
378 if (child != obj) DoMethod(child, MUIM_IconWindow_UnselectAll);
383 else if (msg->type == ICONWINDOW_ACTION_ICONDROP)
385 IPTR destination_path;
387 struct IconList_Drop *drop = (struct IconList_Drop *)msg->drop;
389 if (drop)
391 /* get path of DESTINATION iconlist*/
392 destination_path = drop->destination_string;
394 if ( !destination_path ) return;
396 /* get SOURCE entries */
398 struct MUIDisplayObjects dobjects;
399 struct Hook displayCopyHook;
400 struct Hook displayDelHook;
402 displayCopyHook.h_Entry = (HOOKFUNC) Wanderer__HookFunc_DisplayCopyFunc;
403 displayDelHook.h_Entry = (HOOKFUNC) Wanderer__HookFunc_AskDeleteFunc;
406 if (CreateCopyDisplay(ACTION_COPY, &dobjects))
408 struct IconList_Entry *ent = (void*)MUIV_IconList_NextSelected_Start;
410 /* process all selected entries */
413 DoMethod(drop->source_iconlistobj, MUIM_IconList_NextSelected, (IPTR) &ent);
415 /* if not end of selection, process */
416 if ( (int)ent != MUIV_IconList_NextSelected_End )
418 D(bug("[WANDERER] drop entry: %s dropped in %s\n", ent->filename, destination_path));
420 /* copy via filesystems.c */
421 D(bug("[WANDERER] CopyContent \"%s\" to \"%s\"\n", ent->filename, destination_path ));
422 CopyContent(NULL, ent->filename, destination_path, TRUE, ACTION_COPY, &displayCopyHook, &displayDelHook, (APTR) &dobjects);
425 while ( (int)ent != MUIV_IconList_NextSelected_End );
426 DisposeCopyDisplay(&dobjects);
428 /* update list contents */
429 DoMethod(drop->destination_iconlistobj,MUIM_IconList_Update);
432 else if (msg->type == ICONWINDOW_ACTION_APPWINDOWDROP)
434 struct Screen *wscreen = NULL;
435 struct Layer *layer;
437 /* get wanderers screen struct and the layer located at cursor position afterwards */
438 get( obj, MUIA_Window_Screen, &wscreen);
439 layer = WhichLayer(&wscreen->LayerInfo,wscreen->MouseX,wscreen->MouseY);
441 if (layer)
443 struct Window *win = (struct Window *) layer->Window;
444 if (win)
446 struct List AppList;
447 ULONG files = 0;
448 BOOL fail = FALSE;
449 NewList(&AppList);
451 struct IconList_Entry *ent = (void*)MUIV_IconList_NextSelected_Start;
452 /* process all selected entries */
455 DoMethod(msg->iconlist, MUIM_IconList_NextSelected, (IPTR) &ent);
456 /* if not end of selection, process */
457 if ( (int)ent != MUIV_IconList_NextSelected_End )
459 struct AppW *a = AllocVec(sizeof(struct AppW), MEMF_CLEAR);
460 if (a)
462 a->name = AllocVec(strlen(ent->filename)+1, MEMF_CLEAR);
463 if (a->name)
465 files++;
466 strcpy(a->name, ent->filename);
467 AddTail(&AppList, (struct Node *) a);
469 else
471 FreeVec(a);
472 fail = TRUE;
475 else fail = TRUE;
478 while ( ((int)ent != MUIV_IconList_NextSelected_End ) && !fail);
480 if (!fail && (files > 0))
482 STRPTR *filelist = AllocVec(sizeof(STRPTR) * files, MEMF_CLEAR);
483 if (filelist != NULL)
485 STRPTR *flist = filelist;
486 if (!IsListEmpty(&AppList))
488 struct Node *succ;
489 struct Node *s = AppList.lh_Head;
490 while (((succ = ((struct Node*) s)->ln_Succ) != NULL) && !fail)
492 *flist ++ = ((struct AppW *) s)->name;
493 s = succ;
496 D(bug("[WANDERER] AppWindowMsg: win:%s files:%s mx:%d my:%d\n",win->Title, filelist, wscreen->MouseX, wscreen->MouseY);)
497 /* send appwindow msg struct containing selected files to destination */
498 SendAppWindowMessage(win, files, filelist, 0, wscreen->MouseX, wscreen->MouseY, 0, 0);
501 FreeVec(filelist);
504 if (!IsListEmpty(&AppList))
506 struct Node *succ;
507 struct Node *s = AppList.lh_Head;
508 while (((succ = ((struct Node*) s)->ln_Succ) != NULL))
510 if ( ((struct AppW *) s)->name != NULL )
511 FreeVec(((struct AppW *) s)->name);
512 if ( s != NULL )
513 FreeVec(s);
514 s = succ;
524 AROS_USERFUNC_EXIT
527 AROS_UFH3
529 void, Wanderer__HookFunc_StandardFunc,
530 AROS_UFHA(struct Hook *, h, A0),
531 AROS_UFHA(void *, dummy, A2),
532 AROS_UFHA(void **, funcptr, A1)
535 AROS_USERFUNC_INIT
537 void (*func) (ULONG *) = (void (*)(ULONG *)) (*funcptr);
538 if (func) func((ULONG *)(funcptr + 1));
540 AROS_USERFUNC_EXIT
543 AROS_UFH3
545 void, Wanderer__HookFunc_BackdropFunc,
546 AROS_UFHA(struct Hook *, h, A0),
547 AROS_UFHA(void *, dummy, A2),
548 AROS_UFHA(void **, funcptr, A1)
551 AROS_USERFUNC_INIT
553 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc()\n"));
554 struct Wanderer_DATA *data = INST_DATA(_WandererIntern_CLASS, _WandererIntern_AppObj);
556 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Private data @ %x\n", data));
558 if (!data->wd_WorkbenchWindow)
560 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: No Workbench Window\n"));
561 return;
564 BOOL wb_iscurrentlybd = (BOOL)XGET(data->wd_WorkbenchWindow, MUIA_IconWindow_IsBackdrop);
566 if (wb_iscurrentlybd != data->wd_Option_BackDropMode)
568 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Backdrop mode change requested!\n"));
570 BOOL isOpen = (BOOL)XGET(data->wd_WorkbenchWindow, MUIA_Window_Open);
571 Object *win_Active = NULL;
573 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Disposing of existing Workbench window Obj ..\n"));
574 if (isOpen)
575 SET(data->wd_WorkbenchWindow, MUIA_Window_Open, FALSE);
577 if (data->wd_WorkbenchWindow == data->wd_ActiveWindow)
579 data->wd_ActiveWindow = NULL;
581 else
583 win_Active = data->wd_ActiveWindow;
586 /* Kill our close request notification .. */
587 DoMethod
589 data->wd_WorkbenchWindow, MUIM_KillNotify, MUIA_Window_CloseRequest
592 /* .. And dispose of the window */
593 DoMethod(_WandererIntern_AppObj, OM_REMMEMBER, data->wd_WorkbenchWindow);
594 MUI_DisposeObject(data->wd_WorkbenchWindow);
595 data->wd_WorkbenchWindow = NULL;
597 #if defined(DEBUG)
598 if (data->wd_Option_BackDropMode)
600 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Creating new Workbench window Obj (BACKDROP MODE)..\n"));
602 else
604 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Creating new Workbench window Obj (NORMAL MODE)..\n"));
606 #endif
608 data->wd_WorkbenchWindow = (Object *) DoMethod
610 _WandererIntern_AppObj, MUIM_Wanderer_CreateDrawerWindow, (IPTR) NULL
613 if ((data->wd_WorkbenchWindow) && (isOpen))
615 D(bug("[WANDERER] Wanderer__HookFunc_BackdropFunc: Making Workbench window visable..\n"));
616 DoMethod(data->wd_WorkbenchWindow, MUIM_IconWindow_Open);
617 DoMethod(data->wd_WorkbenchWindow, MUIM_Window_ToBack);
620 if (win_Active)
622 SET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow, win_Active);
624 else if (data->wd_WorkbenchWindow)
626 SET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow, data->wd_WorkbenchWindow);
629 AROS_USERFUNC_EXIT
632 /******** code from workbench/c/Info.c *******************/
633 static void fmtlarge(UBYTE *buf, ULONG num)
635 UQUAD d;
636 UBYTE ch;
637 struct
639 ULONG val;
640 LONG dec;
641 } array =
643 num,
647 if (num >= 1073741824)
649 array.val = num >> 30;
650 d = ((UQUAD)num * 10 + 536870912) / 1073741824;
651 array.dec = d % 10;
652 //ch = 'G';
653 ch = strtochar((STRPTR)_(MSG_MEM_G));
655 else if (num >= 1048576)
657 array.val = num >> 20;
658 d = ((UQUAD)num * 10 + 524288) / 1048576;
659 array.dec = d % 10;
660 //ch = 'M';
661 ch = strtochar((STRPTR)_(MSG_MEM_M));
663 else if (num >= 1024)
665 array.val = num >> 10;
666 d = (num * 10 + 512) / 1024;
667 array.dec = d % 10;
668 //ch = 'K';
669 ch = strtochar((STRPTR)_(MSG_MEM_K));
671 else
673 array.val = num;
674 array.dec = 0;
675 d = 0;
676 //ch = 'B';
677 ch = strtochar((STRPTR)_(MSG_MEM_B));
680 if (!array.dec && (d > array.val * 10))
682 array.val++;
685 RawDoFmt(array.dec ? "%lu.%lu" : "%lu", &array, NULL, buf);
686 while (*buf) { buf++; }
687 *buf++ = ch;
688 *buf = '\0';
691 STRPTR GetScreenTitle(VOID)
693 STATIC TEXT title[256];
694 UBYTE chip[10], fast[10];
695 fmtlarge(chip,AvailMem(MEMF_CHIP));
696 fmtlarge(fast,AvailMem(MEMF_FAST));
697 /* AROS probably don't have graphics mem but without it looks so empty */
698 sprintf(title, _(MSG_SCREENTITLE), chip, fast);
700 return title;
703 /* Expand a passed in env: string to its full location */
704 /* Wanderer doesnt free this mem at the moment but should
705 incase it is every closed */
706 STRPTR ExpandEnvName(STRPTR env_path)
708 BOOL ok = FALSE;
709 char tmp_envbuff[1024];
710 STRPTR fullpath = NULL;
711 BPTR env_lock = NULL;
713 env_lock = Lock("ENV:", SHARED_LOCK);
714 if (env_lock)
716 if (NameFromLock(env_lock, tmp_envbuff, 256)) ok = TRUE;
717 UnLock(env_lock);
720 if (ok)
722 if ((fullpath = AllocVec(strlen(tmp_envbuff) + strlen(env_path) + 1 + 1 - 4, MEMF_CLEAR | MEMF_PUBLIC)) != NULL)
724 strcpy(fullpath, tmp_envbuff);
725 AddPart(fullpath, env_path + 4, 1019);
726 return fullpath;
730 //We couldnt expand it so just use as is ..
731 return env_path;
734 enum
736 MEN_WANDERER = 1,
737 MEN_WANDERER_BACKDROP,
738 MEN_WANDERER_EXECUTE,
739 MEN_WANDERER_SHELL,
740 MEN_WANDERER_GUISETTINGS,
741 MEN_WANDERER_ABOUT,
742 MEN_WANDERER_QUIT,
744 MEN_WINDOW_NEW_DRAWER,
745 MEN_WINDOW_OPEN_PARENT,
746 MEN_WINDOW_CLOSE,
747 MEN_WINDOW_UPDATE,
749 MEN_WINDOW_SELECT,
750 MEN_WINDOW_CLEAR,
752 MEN_WINDOW_SNAP_WIN,
753 MEN_WINDOW_SNAP_ALL,
755 MEN_WINDOW_VIEW_ICON,
756 MEN_WINDOW_VIEW_DETAIL,
757 MEN_WINDOW_VIEW_ALL,
759 MEN_WINDOW_SORT_NOW,
760 MEN_WINDOW_SORT_NAME,
761 MEN_WINDOW_SORT_TYPE,
762 MEN_WINDOW_SORT_DATE,
763 MEN_WINDOW_SORT_SIZE,
764 MEN_WINDOW_SORT_REVERSE,
765 MEN_WINDOW_SORT_TOPDRAWERS,
766 MEN_WINDOW_SORT_GROUP,
768 MEN_ICON_OPEN,
769 MEN_ICON_RENAME,
770 MEN_ICON_INFORMATION,
771 MEN_ICON_DELETE,
776 /**************************************************************************
777 Open the execute window. Similar to below but you can also set the
778 command. Called when item is openend
779 **************************************************************************/
780 void execute_open_with_command(BPTR cd, STRPTR contents)
782 BPTR lock;
784 if (cd != NULL) lock = cd;
785 else lock = Lock("RAM:", ACCESS_READ);
787 OpenWorkbenchObject
789 "WANDERER:Tools/ExecuteCommand",
790 WBOPENA_ArgLock, (IPTR) lock,
791 WBOPENA_ArgName, (IPTR) contents,
792 TAG_DONE
795 if (cd == NULL) UnLock(lock);
798 /**************************************************************************
799 Open the execute window
801 This function will always get the current drawer as argument
802 **************************************************************************/
803 VOID wanderer_menufunc_wanderer_execute(STRPTR *cdptr)
805 //TODO: remove the STRPTR *cdptr from top
806 //TODO:remove this commented out stuff
807 //BPTR lock = NULL;
808 //if (cdptr != NULL) lock = Lock(*cdptr, SHARED_LOCK);
809 Object *win = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
810 STRPTR dr = ( STRPTR )XGET( win, MUIA_IconWindow_Location );
811 BPTR cd = Lock(dr,SHARED_LOCK);
812 execute_open_with_command(cd, NULL);
813 if (cd) UnLock(cd);
816 /*******************************/
818 void wanderer_menufunc_wanderer_shell(STRPTR *cd_ptr)
820 //TODO: remove the STRPTR *cdptr from top
821 //TODO:remove this commented out stuff
822 //BPTR cd = Lock(*cd_ptr,ACCESS_READ);
823 Object *win = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
824 STRPTR dr = ( STRPTR )XGET( win, MUIA_IconWindow_Location );
825 BPTR cd = Lock(dr,ACCESS_READ);
826 if (SystemTags("NewShell", NP_CurrentDir, (IPTR)cd, TAG_DONE) == -1)
828 UnLock(cd);
832 void wanderer_menufunc_wanderer_backdrop(Object **pstrip)
834 struct Wanderer_DATA *data = INST_DATA(_WandererIntern_CLASS, _WandererIntern_AppObj);
835 Object *strip = *pstrip;
836 Object *item = FindMenuitem(strip, MEN_WANDERER_BACKDROP);
838 D(bug("[WANDERER] wanderer_menufunc_wanderer_backdrop()\n"));
840 if (item != NULL)
842 data->wd_Option_BackDropMode = (BOOL)XGET(item, MUIA_Menuitem_Checked);
843 SET(data->wd_WorkbenchWindow, MUIA_IconWindow_IsBackdrop, data->wd_Option_BackDropMode);
847 void wanderer_menufunc_window_newdrawer(STRPTR *cdptr)
849 //TODO: remove the STRPTR *cdptr from top
851 Object *win = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
852 STRPTR dr = ( STRPTR )XGET( win, MUIA_IconWindow_Location );
853 D(bug("[wanderer] wanderer_menufunc_window_newdrawer(%s)\n", dr));
855 Object *actwindow = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
856 Object *wbwindow = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_WorkbenchWindow);
857 if (actwindow == wbwindow)
859 /* This check is necessary because WorkbenchWindow has path RAM: */
860 D(bug("[wanderer] wanderer_menufunc_window_newdrawer: Can't call WBNewDrawer for WorkbenchWindow\n"));
861 return;
863 if ( XGET(actwindow, MUIA_Window_Open) == FALSE )
865 D(bug("[wanderer] wanderer_menufunc_window_newdrawer: Can't call WBNewDrawer: the active window isn't open\n"));
866 return;
869 BPTR lock = Lock(dr, ACCESS_READ);
870 OpenWorkbenchObject
872 "WANDERER:Tools/WBNewDrawer",
873 WBOPENA_ArgLock, (IPTR) lock,
874 WBOPENA_ArgName, 0,
875 TAG_DONE
877 UnLock(lock);
880 void wanderer_menufunc_window_openparent(STRPTR *cdptr)
882 //TODO: Remove the **cdptr stuff from top
883 Object *win = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
884 STRPTR dr = ( STRPTR )XGET( win, MUIA_IconWindow_Location );
886 IPTR path_len=0;
887 STRPTR last_letter=NULL;
888 last_letter = &dr[ strlen(dr) - 1 ];
890 STRPTR thispath = FilePart(dr);
892 if (*last_letter==0x3a) return; /* Top Drawer has no parent to open */
894 last_letter = &thispath[strlen(thispath)-1];
896 if (*last_letter==0x3a)
897 path_len = (IPTR)(thispath-(IPTR)(dr));
898 else
899 path_len = (IPTR)((thispath-(IPTR)(dr))-1);
901 STRPTR buf = AllocVec((path_len+1),MEMF_PUBLIC|MEMF_CLEAR);
902 CopyMem(dr, buf, path_len);
904 Object *cstate = (Object*)(((struct List*)XGET(_WandererIntern_AppObj, MUIA_Application_WindowList))->lh_Head);
905 Object *child;
907 // Make sure we have a correct path
908 BOOL foundSlash = FALSE, foundColon = FALSE;
909 int i = 0; for ( ; i < path_len; i++ )
911 if ( buf[ i ] == '/' ) foundSlash = TRUE;
912 if ( buf[ i ] == ':' ) foundColon = TRUE;
914 if ( !foundColon && !foundSlash )
916 STRPTR newbuf = AllocVec ((path_len + 2), MEMF_PUBLIC|MEMF_CLEAR);
917 sprintf(newbuf,"%s:",buf);
918 FreeVec (buf);
919 buf = newbuf;
921 // Done with path correction check
923 while ((child = NextObject(&cstate)))
925 if (XGET(child, MUIA_UserData))
927 STRPTR child_drawer = (STRPTR)XGET(child, MUIA_IconWindow_Location);
928 if (child_drawer && !Stricmp(buf,child_drawer))
930 int is_open = XGET(child, MUIA_Window_Open);
931 if (!is_open)
932 DoMethod(child, MUIM_IconWindow_Open);
933 else
935 DoMethod(child, MUIM_Window_ToFront);
936 SET(child, MUIA_Window_Activate, TRUE);
938 FreeVec(buf);
939 return;
944 DoMethod(_WandererIntern_AppObj, MUIM_Wanderer_CreateDrawerWindow, (IPTR) buf);
945 FreeVec(buf);
948 void wanderer_menufunc_window_close()
950 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
951 SET(window, MUIA_Window_CloseRequest, TRUE);
954 void wanderer_menufunc_window_update()
956 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
957 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
959 if (iconList != NULL)
961 DoMethod(iconList, MUIM_IconList_Update);
965 void wanderer_menufunc_window_clear()
967 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
968 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
970 if (iconList != NULL)
972 DoMethod(iconList, MUIM_IconList_UnselectAll);
976 void wanderer_menufunc_window_select()
978 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
979 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
981 if (iconList != NULL)
983 DoMethod(iconList, MUIM_IconList_SelectAll);
987 void wanderer_menufunc_window_view_icons(Object **pstrip)
989 Object *strip = *pstrip;
990 Object *item = FindMenuitem(strip, MEN_WINDOW_VIEW_ALL);
991 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
992 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
994 if (item != NULL && iconList != NULL)
996 ULONG display_bits = 0, menu_view_state = 0;
997 GET(iconList, MUIA_IconList_DisplayFlags, &display_bits);
999 GET(item, MUIA_Menuitem_Checked, &menu_view_state);
1001 if (menu_view_state)
1003 display_bits &= ~ICONLIST_DISP_SHOWINFO;
1005 else
1007 display_bits |= ICONLIST_DISP_SHOWINFO;
1010 SET(iconList, MUIA_IconList_DisplayFlags, display_bits);
1011 DoMethod(iconList, MUIM_IconList_Sort);
1015 void wanderer_menufunc_window_sort_name(Object **pstrip)
1017 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1018 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1020 if ( iconList != NULL)
1022 ULONG sort_bits = 0;
1023 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1025 /*name = date and size bit both NOT set*/
1026 if( (sort_bits & ICONLIST_SORT_BY_DATE) || (sort_bits & ICONLIST_SORT_BY_SIZE) )
1028 sort_bits &= ~(ICONLIST_SORT_BY_DATE | ICONLIST_SORT_BY_SIZE);
1031 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1032 DoMethod(iconList, MUIM_IconList_Sort);
1036 void wanderer_menufunc_window_sort_date(Object **pstrip)
1038 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1039 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1041 if ( iconList != NULL)
1043 ULONG sort_bits = 0;
1044 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1046 /*exclude size bit*/
1047 if( sort_bits & ICONLIST_SORT_BY_SIZE )
1049 sort_bits &= ~ICONLIST_SORT_BY_SIZE;
1052 sort_bits |= ICONLIST_SORT_BY_DATE;
1054 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1055 DoMethod(iconList, MUIM_IconList_Sort);
1059 void wanderer_menufunc_window_sort_size(Object **pstrip)
1061 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1062 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1064 if ( iconList != NULL)
1066 ULONG sort_bits = 0;
1067 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1069 /*exclude date bit*/
1070 if( sort_bits & ICONLIST_SORT_BY_DATE )
1072 sort_bits &= ~ICONLIST_SORT_BY_DATE;
1075 sort_bits |= ICONLIST_SORT_BY_SIZE;
1077 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1078 DoMethod(iconList, MUIM_IconList_Sort);
1082 void wanderer_menufunc_window_sort_type(Object **pstrip)
1084 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1085 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1087 if ( iconList != NULL)
1089 ULONG sort_bits = 0;
1090 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1092 /*type = both date and size bits set*/
1093 sort_bits |= (ICONLIST_SORT_BY_DATE | ICONLIST_SORT_BY_SIZE);
1095 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1096 DoMethod(iconList, MUIM_IconList_Sort);
1100 void wanderer_menufunc_window_sort_reverse(Object **pstrip)
1102 Object *strip = *pstrip;
1103 Object *item = FindMenuitem(strip, MEN_WINDOW_SORT_REVERSE);
1104 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1105 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1107 if (item != NULL && iconList != NULL)
1109 ULONG sort_bits = 0;
1110 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1112 if( XGET(item, MUIA_Menuitem_Checked) )
1114 sort_bits |= ICONLIST_SORT_REVERSE;
1116 else
1118 sort_bits &= ~ICONLIST_SORT_REVERSE;
1121 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1122 DoMethod(iconList, MUIM_IconList_Sort);
1126 void wanderer_menufunc_window_sort_topdrawers(Object **pstrip)
1128 Object *strip = *pstrip;
1129 Object *item = FindMenuitem(strip, MEN_WINDOW_SORT_TOPDRAWERS);
1130 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1131 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1133 if (item != NULL && iconList != NULL)
1135 ULONG sort_bits = 0;
1136 GET(iconList, MUIA_IconList_SortFlags, &sort_bits);
1138 if( XGET(item, MUIA_Menuitem_Checked) )
1140 sort_bits &= !ICONLIST_SORT_DRAWERS_MIXED;
1142 else
1144 sort_bits |= ICONLIST_SORT_DRAWERS_MIXED;
1147 SET(iconList, MUIA_IconList_SortFlags, sort_bits);
1148 DoMethod(iconList, MUIM_IconList_Sort);
1152 void wanderer_menufunc_icon_open()
1154 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1155 DoMethod(window, MUIM_IconWindow_DoubleClicked);
1158 void wanderer_menufunc_icon_rename(void)
1160 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1161 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1162 struct IconList_Entry *entry = (APTR) MUIV_IconList_NextSelected_Start;
1166 DoMethod(iconList, MUIM_IconList_NextSelected, (IPTR) &entry);
1168 if ((int)entry != MUIV_IconList_NextSelected_End)
1170 BPTR lock = Lock(entry->filename, ACCESS_READ);
1171 BPTR parent = ParentDir(lock);
1172 UnLock(lock);
1174 D(bug("[wanderer] wanderer_menufunc_icon_rename: selected = '%s'\n", entry->filename));
1176 OpenWorkbenchObject
1178 "WANDERER:Tools/WBRename",
1179 WBOPENA_ArgLock, (IPTR) parent,
1180 WBOPENA_ArgName, (IPTR) FilePart(entry->filename),
1181 TAG_DONE
1184 D(bug("[wanderer] wanderer_menufunc_icon_rename: selected = '%s'\n", entry->filename));
1186 UnLock(parent);
1188 else
1190 break;
1192 } while (TRUE);
1195 void wanderer_menufunc_icon_information()
1197 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1198 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1199 struct IconList_Entry *entry = (APTR) MUIV_IconList_NextSelected_Start;
1203 DoMethod(iconList, MUIM_IconList_NextSelected, (IPTR) &entry);
1205 if ((int)entry != MUIV_IconList_NextSelected_End)
1207 BPTR lock = Lock(entry->filename, ACCESS_READ);
1208 BPTR parent = ParentDir(lock);
1209 UnLock(lock);
1211 D(bug("[wanderer] wanderer_menufunc_icon_information: selected = '%s'\n", entry->filename));
1213 WBInfo(parent, entry->filename, NULL);
1215 UnLock(parent);
1217 else
1219 break;
1221 } while (TRUE);
1224 /* dispose the file copy display */
1226 void DisposeCopyDisplay(struct MUIDisplayObjects *d)
1228 if (d->copyApp)
1230 SET(d->win,MUIA_Window_Open,FALSE);
1231 MUI_DisposeObject(d->copyApp);
1234 /* create the file copy window */
1236 BOOL CreateCopyDisplay(UWORD flags, struct MUIDisplayObjects *d)
1238 BOOL back = FALSE;
1240 Object *group, *fromObject, *toObject, *fileTextObject, *fileLengthObject, *gaugeGroup;
1242 d->stopflag = 0; // will be set to 1 when clicking on stop, than the displayhook can tell actionDir() to stop copy
1243 d->bytes = 0;
1244 d->numfiles = 0;
1245 d->action = flags;
1246 d->smallobjects = 0;
1247 d->copyApp = ApplicationObject,
1248 MUIA_Application_Title, (IPTR)"CopyRequester",
1249 MUIA_Application_Base, (IPTR)"WANDERER_COPY",
1250 SubWindow, (IPTR)(d->win = WindowObject,
1251 MUIA_Window_Title, (IPTR)"Copy Filesystem",
1252 MUIA_Window_Activate, TRUE,
1253 MUIA_Window_DepthGadget, TRUE,
1254 MUIA_Window_DragBar, TRUE,
1255 MUIA_Window_SizeGadget, TRUE,
1256 MUIA_Window_AppWindow, FALSE,
1257 MUIA_Window_CloseGadget, FALSE,
1258 MUIA_Window_Borderless, FALSE,
1259 MUIA_Window_TopEdge, MUIV_Window_TopEdge_Centered,
1260 MUIA_Window_LeftEdge, MUIV_Window_LeftEdge_Centered,
1261 WindowContents, (group = VGroup,
1262 Child, (IPTR)(fromObject = TextObject,
1263 InnerSpacing(8,2),
1264 MUIA_Text_PreParse, (IPTR)"\33c",
1265 End),
1266 Child, (IPTR)(d->sourceObject = TextObject,
1267 TextFrame,
1268 InnerSpacing(8,2),
1269 MUIA_Background, MUII_TextBack,
1270 MUIA_Text_PreParse, (IPTR)"\33c",
1271 MUIA_Text_Contents, (IPTR)"--------------------------------------------------------------------------------------------",
1272 End),
1273 Child, (IPTR)(toObject = TextObject,
1274 InnerSpacing(8,2),
1275 MUIA_Text_PreParse, (IPTR)"\33c",
1276 End),
1277 Child, (IPTR)(d->destObject = TextObject,
1278 TextFrame,
1279 InnerSpacing(8,2),
1280 MUIA_Background, MUII_TextBack,
1281 MUIA_Text_PreParse, (IPTR)"\33c",
1282 MUIA_Text_Contents, (IPTR)"--------------------------------------------------------------------------------------------",
1283 End),
1284 Child, (IPTR)(fileTextObject = TextObject,
1285 InnerSpacing(8,2),
1286 MUIA_Text_PreParse, (IPTR)"\33c",
1287 End),
1288 Child, (IPTR)(d->fileObject = TextObject,
1289 TextFrame,
1290 InnerSpacing(8,2),
1291 MUIA_Background, MUII_TextBack,
1292 MUIA_Text_PreParse, (IPTR)"\33c",
1293 MUIA_Text_Contents, (IPTR)"--------------------------------------------------------------------------------------------",
1294 End),
1295 Child, (IPTR)(fileLengthObject = TextObject,
1296 InnerSpacing(8,2),
1297 MUIA_Text_PreParse, (IPTR)"\33c",
1298 End),
1299 Child, (IPTR)(gaugeGroup = VGroup,
1300 TextFrame,
1301 Child, d->gauge = GaugeObject,
1302 MUIA_Gauge_Horiz, TRUE,
1303 MUIA_Gauge_Max, 32768,
1304 MUIA_Gauge_InfoText, "...........Processing...........",
1305 End,
1306 Child, ScaleObject,
1307 MUIA_Scale_Horiz, TRUE,
1308 End,
1309 End),
1310 Child, (IPTR)( d->performanceObject = TextObject,
1311 TextFrame,
1312 InnerSpacing(8,2),
1313 MUIA_Background, MUII_TextBack,
1314 MUIA_Text_PreParse, (IPTR)"\33c",
1315 MUIA_Text_Contents, (IPTR)"...........0 Bytes...........",
1316 End),
1318 Child, (IPTR)( d->stopObject = SimpleButton("Stop") ),
1319 End),
1320 End),
1321 End;
1324 if (d->copyApp)
1326 if ((flags & (ACTION_COPY|ACTION_DELETE)) == (ACTION_COPY|ACTION_DELETE))
1328 SET(fromObject, MUIA_Text_Contents, (IPTR)"move from");
1329 SET(toObject, MUIA_Text_Contents, (IPTR)"move to");
1330 SET(fileTextObject, MUIA_Text_Contents, (IPTR)"file");
1331 SET(fileLengthObject, MUIA_Text_Contents, (IPTR)"traffic");
1333 else if ((flags & ACTION_COPY) == ACTION_COPY)
1335 SET(fromObject, MUIA_Text_Contents, (IPTR)"copy from");
1336 SET(toObject, MUIA_Text_Contents, (IPTR)"copy to");
1337 SET(fileTextObject, MUIA_Text_Contents, (IPTR)"file");
1338 SET(fileLengthObject, MUIA_Text_Contents, (IPTR)"traffic");
1341 else if ((flags & ACTION_DELETE) == ACTION_DELETE)
1343 SET(fromObject, MUIA_Text_Contents, "delete from");
1344 DoMethod(group, MUIM_Group_InitChange);
1345 DoMethod(group, OM_REMMEMBER, toObject);
1346 DoMethod(group, OM_REMMEMBER, fileLengthObject);
1347 DoMethod(group, OM_REMMEMBER, d->performanceObject);
1348 DoMethod(group, OM_REMMEMBER, d->destObject);
1349 DoMethod(group, OM_REMMEMBER, gaugeGroup);
1350 DoMethod(group, MUIM_Group_ExitChange);
1351 SET(fileTextObject, MUIA_Text_Contents, "file to delete");
1354 SET(d->win,MUIA_Window_Open,TRUE);
1355 DoMethod(d->stopObject,MUIM_Notify, MUIA_Pressed, FALSE, d->stopObject, 3, MUIM_WriteLong, 1 ,&d->stopflag);
1356 back = TRUE;
1358 return back;
1361 void wanderer_menufunc_icon_delete(void)
1363 Object *window = (Object *) XGET(_WandererIntern_AppObj, MUIA_Wanderer_ActiveWindow);
1364 Object *iconList = (Object *) XGET(window, MUIA_IconWindow_IconList);
1365 struct IconList_Entry *entry = ( void*) MUIV_IconList_NextSelected_Start;
1366 DoMethod(iconList, MUIM_IconList_NextSelected, (IPTR) &entry);
1368 struct MUIDisplayObjects dobjects;
1369 struct Hook displayCopyHook;
1370 struct Hook displayDelHook;
1371 displayCopyHook.h_Entry = (HOOKFUNC) Wanderer__HookFunc_DisplayCopyFunc;
1372 displayDelHook.h_Entry = (HOOKFUNC) Wanderer__HookFunc_AskDeleteFunc;
1374 ULONG updatedIcons = 0;
1376 /* Process all selected entries */
1377 if (CreateCopyDisplay(ACTION_DELETE, &dobjects))
1381 if ((int)entry != MUIV_IconList_NextSelected_End)
1383 /* copy via filesystems.c */
1384 D(bug("[WANDERER] Delete \"%s\"\n", entry->filename);)
1385 CopyContent( NULL, entry->filename, NULL, TRUE, ACTION_DELETE, &displayCopyHook, &displayDelHook, (APTR) &dobjects);
1386 updatedIcons++;
1388 DoMethod(iconList, MUIM_IconList_NextSelected, (IPTR) &entry);
1390 while ( (int)entry != MUIV_IconList_NextSelected_End );
1391 DisposeCopyDisplay(&dobjects);
1393 // Only update list if anything happened to the icons!
1394 if ( updatedIcons > 0 )
1396 DoMethod(window, MUIM_IconWindow_UnselectAll);
1397 DoMethod ( iconList, MUIM_IconList_Update );
1401 void wanderer_menufunc_wanderer_guisettings(void)
1403 //DoMethod(_WandererIntern_AppObj, MUIM_Application_OpenConfigWindow);
1404 OpenWorkbenchObject("SYS:Prefs/Zune",
1405 WBOPENA_ArgName, (IPTR) "WANDERER",
1406 TAG_DONE);
1409 void wanderer_menufunc_wanderer_about(void)
1411 OpenWorkbenchObject("SYS:System/About", TAG_DONE);
1414 void wanderer_menufunc_wanderer_quit(void)
1416 //if (MUI_RequestA(_WandererIntern_AppObj, NULL, 0, "Wanderer", _(MSG_YESNO), _(MSG_REALLYQUIT), NULL))
1417 //DoMethod(_WandererIntern_AppObj, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
1418 OpenWorkbenchObject("WANDERER:Tools/Quit", TAG_DONE);
1421 /**************************************************************************
1422 This function returns a Menu Object with the given id
1423 **************************************************************************/
1424 Object *FindMenuitem(Object* strip, int id)
1426 return (Object*)DoMethod(strip, MUIM_FindUData, id);
1429 /**************************************************************************
1430 This connects a notify to the given menu entry id
1431 **************************************************************************/
1432 VOID DoMenuNotify(Object* strip, int id, void *function, void *arg)
1434 Object *entry;
1435 entry = FindMenuitem(strip,id);
1436 if (entry)
1438 DoMethod
1440 entry, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
1441 (IPTR) entry, 4, MUIM_CallHook, (IPTR) &_WandererIntern_hook_standard,
1442 (IPTR) function, (IPTR) arg
1447 VOID DoAllMenuNotifies(Object *strip, STRPTR path)
1449 Object *item;
1451 if (!strip) return;
1453 DoMenuNotify(strip, MEN_WANDERER_EXECUTE, wanderer_menufunc_wanderer_execute, path);
1454 DoMenuNotify(strip, MEN_WANDERER_SHELL, wanderer_menufunc_wanderer_shell, path);
1455 DoMenuNotify(strip, MEN_WANDERER_GUISETTINGS, wanderer_menufunc_wanderer_guisettings, NULL);
1456 DoMenuNotify(strip, MEN_WANDERER_ABOUT, wanderer_menufunc_wanderer_about, NULL);
1457 DoMenuNotify(strip, MEN_WANDERER_QUIT, wanderer_menufunc_wanderer_quit, NULL);
1459 DoMenuNotify(strip, MEN_WINDOW_NEW_DRAWER, wanderer_menufunc_window_newdrawer, path);
1460 DoMenuNotify(strip, MEN_WINDOW_OPEN_PARENT, wanderer_menufunc_window_openparent, path);
1461 DoMenuNotify(strip, MEN_WINDOW_CLOSE, wanderer_menufunc_window_close, NULL);
1462 DoMenuNotify(strip, MEN_WINDOW_UPDATE, wanderer_menufunc_window_update, NULL);
1463 DoMenuNotify(strip, MEN_WINDOW_CLEAR, wanderer_menufunc_window_clear, NULL);
1464 DoMenuNotify(strip, MEN_WINDOW_SELECT, wanderer_menufunc_window_select, NULL);
1465 DoMenuNotify(strip, MEN_WINDOW_VIEW_ALL, wanderer_menufunc_window_view_icons, strip);
1466 DoMenuNotify(strip, MEN_WINDOW_SORT_NAME, wanderer_menufunc_window_sort_name, strip);
1467 DoMenuNotify(strip, MEN_WINDOW_SORT_TYPE, wanderer_menufunc_window_sort_type, strip);
1468 DoMenuNotify(strip, MEN_WINDOW_SORT_DATE, wanderer_menufunc_window_sort_date, strip);
1469 DoMenuNotify(strip, MEN_WINDOW_SORT_SIZE, wanderer_menufunc_window_sort_size, strip);
1470 DoMenuNotify(strip, MEN_WINDOW_SORT_REVERSE, wanderer_menufunc_window_sort_reverse, strip);
1471 DoMenuNotify(strip, MEN_WINDOW_SORT_TOPDRAWERS, wanderer_menufunc_window_sort_topdrawers, strip);
1473 DoMenuNotify(strip, MEN_ICON_OPEN, wanderer_menufunc_icon_open, NULL);
1474 DoMenuNotify(strip, MEN_ICON_RENAME, wanderer_menufunc_icon_rename, NULL);
1475 DoMenuNotify(strip, MEN_ICON_INFORMATION, wanderer_menufunc_icon_information, NULL);
1476 DoMenuNotify(strip, MEN_ICON_DELETE, wanderer_menufunc_icon_delete, NULL);
1478 if ((item = FindMenuitem(strip, MEN_WANDERER_BACKDROP)))
1480 DoMethod
1482 item, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
1483 (IPTR) _WandererIntern_AppObj, 7, MUIM_Application_PushMethod,
1484 (IPTR) _WandererIntern_AppObj, 4, MUIM_CallHook, (IPTR) &_WandererIntern_hook_standard,
1485 (IPTR) wanderer_menufunc_wanderer_backdrop, (IPTR) strip
1490 /*** Methods ****************************************************************/
1491 Object *Wanderer__OM_NEW(Class *CLASS, Object *self, struct opSet *message)
1493 D(bug("[Wanderer] Wanderer__OM_NEW()\n"));
1495 self = (Object *) DoSuperNewTags
1497 CLASS, self, NULL,
1499 MUIA_Application_Title, (IPTR) "Wanderer",
1500 MUIA_Application_Base, (IPTR) "WANDERER",
1501 MUIA_Application_Version, (IPTR) VERSION,
1502 MUIA_Application_Description, (IPTR) _(MSG_DESCRIPTION),
1503 MUIA_Application_SingleTask, TRUE,
1505 TAG_MORE, (IPTR) message->ops_AttrList
1508 if (self != NULL)
1510 SETUP_WANDERER_INST_DATA;
1512 D(bug("[Wanderer] Wanderer__OM_NEW: SELF = %d, Private data @ %x\n", self, data));
1514 data->wd_Screen = LockPubScreen(NULL);
1515 _WandererIntern_CLASS = CLASS;
1517 #if defined(WANDERER_DEFAULT_BACKDROP)
1518 data->wd_Option_BackDropMode = TRUE;
1519 #else
1520 data->wd_Option_BackDropMode = FALSE;
1521 #endif
1523 if(data->wd_Screen == NULL)
1525 D(bug("[Wanderer] Wanderer__OM_NEW: Couldn't lock screen!\n"));
1526 CoerceMethod(CLASS, self, OM_DISPOSE);
1527 return NULL;
1530 D(bug("[Wanderer] Wanderer__OM_NEW: Using Screen @ %x\n", data->wd_Screen));
1532 /*-- Setup hooks structures ----------------------------------------*/
1533 _WandererIntern_hook_standard.h_Entry = (HOOKFUNC) Wanderer__HookFunc_StandardFunc;
1534 _WandererIntern_hook_action.h_Entry = (HOOKFUNC) Wanderer__HookFunc_ActionFunc;
1535 _WandererIntern_hook_backdrop.h_Entry = (HOOKFUNC) Wanderer__HookFunc_BackdropFunc;
1537 // ---
1538 if ((data->wd_CommandPort = CreateMsgPort()) == NULL)
1540 CoerceMethod(CLASS, self, OM_DISPOSE);
1541 return NULL;
1544 if ((data->wd_NotifyPort = CreateMsgPort()) == NULL)
1546 CoerceMethod(CLASS, self, OM_DISPOSE);
1547 return NULL;
1550 RegisterWorkbench(data->wd_CommandPort);
1552 /* Setup command port handler --------------------------------------*/
1553 data->wd_CommandIHN.ihn_Signals = 1UL << data->wd_CommandPort->mp_SigBit;
1554 data->wd_CommandIHN.ihn_Object = self;
1555 data->wd_CommandIHN.ihn_Method = MUIM_Wanderer_HandleCommand;
1557 DoMethod
1559 self, MUIM_Application_AddInputHandler, (IPTR) &data->wd_CommandIHN
1562 /* Setup timer handler ---------------------------------------------*/
1563 data->wd_TimerIHN.ihn_Flags = MUIIHNF_TIMER;
1564 data->wd_TimerIHN.ihn_Millis = 3000;
1565 data->wd_TimerIHN.ihn_Object = self;
1566 data->wd_TimerIHN.ihn_Method = MUIM_Wanderer_HandleTimer;
1568 DoMethod
1570 self, MUIM_Application_AddInputHandler, (IPTR) &data->wd_TimerIHN
1573 /* Setup filesystem notification handler ---------------------------*/
1574 data->wd_NotifyIHN.ihn_Signals = 1UL << data->wd_NotifyPort->mp_SigBit;
1575 data->wd_NotifyIHN.ihn_Object = self;
1576 data->wd_NotifyIHN.ihn_Method = MUIM_Wanderer_HandleNotify;
1578 DoMethod
1580 self, MUIM_Application_AddInputHandler, (IPTR) &data->wd_NotifyIHN
1583 // All the following should be moved to InitWandererPrefs
1585 /* Setup notification on prefs file --------------------------------*/
1586 data->pnr.nr_Name = ExpandEnvName("ENV:SYS/Wanderer.prefs");
1587 data->pnr.nr_Flags = NRF_SEND_MESSAGE;
1588 data->pnr.nr_stuff.nr_Msg.nr_Port = data->wd_NotifyPort;
1590 if (StartNotify(&data->pnr))
1592 D(bug("[Wanderer] Wanderer__OM_NEW: Prefs-notification setup on '%s'\n", data->pnr.nr_Name));
1594 else
1596 D(bug("[Wanderer] Wanderer__OM_NEW: FAILED to setup Prefs-notification!\n"));
1599 data->wd_Prefs = WandererPrefsObject,
1600 End; // FIXME: error handling
1602 if (data->wd_Prefs) data->wd_PrefsIntern = InitWandererPrefs();
1605 return self;
1608 IPTR Wanderer__OM_DISPOSE(Class *CLASS, Object *self, Msg message)
1610 SETUP_WANDERER_INST_DATA;
1612 if (data->wd_CommandPort)
1615 They only have been added if the creation of the msg port was
1616 successful
1618 DoMethod(self, MUIM_Application_RemInputHandler, (IPTR) &data->wd_TimerIHN);
1619 DoMethod(self, MUIM_Application_RemInputHandler, (IPTR) &data->wd_CommandIHN);
1620 DoMethod(self, MUIM_Application_RemInputHandler, (IPTR) &data->wd_NotifyIHN);
1622 UnregisterWorkbench(data->wd_CommandPort);
1624 EndNotify(&data->pnr);
1626 DeleteMsgPort(data->wd_NotifyPort);
1627 data->wd_NotifyPort = NULL;
1629 DeleteMsgPort(data->wd_CommandPort);
1630 data->wd_CommandPort = NULL;
1632 DisposeObject(data->wd_Prefs);
1633 data->wd_Prefs = NULL;
1636 return DoSuperMethodA(CLASS, self, (Msg) message);
1639 IPTR Wanderer__OM_SET(Class *CLASS, Object *self, struct opSet *message)
1641 SETUP_WANDERER_INST_DATA;
1642 struct TagItem *tstate = message->ops_AttrList, *tag;
1644 while ((tag = NextTagItem((const struct TagItem**)&tstate)) != NULL)
1646 switch (tag->ti_Tag)
1648 case MUIA_Wanderer_Screen:
1649 D(bug("[Wanderer] Wanderer__OM_SET: MUIA_Wanderer_Screen = %p\n", tag->ti_Data));
1650 D(bug("[Wanderer] Wanderer__OM_SET: setting MUIA_Wanderer_Screen isnt yet handled!\n"));
1651 break;
1653 case MUIA_Wanderer_ActiveWindow:
1654 data->wd_ActiveWindow = (Object *) tag->ti_Data;
1655 D(bug("[Wanderer] Wanderer__OM_SET: MUIA_Wanderer_ActiveWindow = %p\n", tag->ti_Data));
1656 if (!(XGET(data->wd_ActiveWindow, MUIA_Window_Activate)))
1657 NNSET(data->wd_ActiveWindow, MUIA_Window_Activate, TRUE);
1659 break;
1661 case MUIA_Application_Iconified:
1662 /* Wanderer itself cannot be iconified,
1663 just hide, instead. */
1664 tag->ti_Tag = MUIA_ShowMe;
1665 tag->ti_Data = !tag->ti_Data;
1666 break;
1670 return DoSuperMethodA(CLASS, self, (Msg) message);
1673 IPTR Wanderer__OM_GET(Class *CLASS, Object *self, struct opGet *message)
1675 SETUP_WANDERER_INST_DATA;
1676 IPTR *store = message->opg_Storage;
1677 IPTR rv = TRUE;
1679 switch (message->opg_AttrID)
1681 case MUIA_Wanderer_Screen:
1682 *store = (IPTR) data->wd_Screen;
1683 break;
1685 case MUIA_Wanderer_Prefs:
1686 *store = (IPTR) data->wd_Prefs;
1687 break;
1689 case MUIA_Wanderer_ActiveWindow:
1690 *store = (IPTR) data->wd_ActiveWindow;
1691 break;
1693 case MUIA_Wanderer_WorkbenchWindow:
1694 *store = (IPTR) data->wd_WorkbenchWindow;
1695 break;
1697 default:
1698 rv = DoSuperMethodA(CLASS, self, (Msg) message);
1701 return rv;
1704 /* Main entry point for Wanderer Application Object */
1706 When the executable creates our object it calls zune
1707 to handle basic "control" ... which results in Zune
1708 calling this method ..
1710 IPTR Wanderer__MUIM_Application_Execute
1712 Class *CLASS, Object *self, Msg message
1715 SETUP_WANDERER_INST_DATA;
1717 D(bug("[Wanderer] Wanderer__MUIM_Application_Execute() ##\n[Wanderer] Wanderer__MUIM_Application_Execute: Creating 'Workbench' Window..\n"));
1719 data->wd_WorkbenchWindow = (Object *) DoMethod
1721 self, MUIM_Wanderer_CreateDrawerWindow, (IPTR) NULL
1724 if (data->wd_WorkbenchWindow != NULL)
1726 D(bug("[Wanderer] Wanderer__MUIM_Application_Execute: Workbench Window Obj @ %x\n", data->wd_WorkbenchWindow));
1728 Detach();
1730 D(bug("[Wanderer] Wanderer__MUIM_Application_Execute: Really handing control to Zune ..\n"));
1732 DoSuperMethodA(CLASS, self, message);
1734 return RETURN_OK;
1737 #warning "TODO: Report an error if we fail to create the Workbench's window ..."
1739 return RETURN_ERROR;
1742 IPTR Wanderer__MUIM_Wanderer_HandleTimer
1744 Class *CLASS, Object *self, Msg message
1747 Object *cstate = (Object*)(((struct List*)XGET(self, MUIA_Application_WindowList))->lh_Head);
1748 Object *child = NULL;
1749 STRPTR scr_title = GetScreenTitle();
1751 while ((child = NextObject(&cstate)))
1752 SET(child, MUIA_Window_ScreenTitle, (IPTR) scr_title);
1754 return TRUE;
1757 IPTR Wanderer__MUIM_Wanderer_HandleCommand
1759 Class *CLASS, Object *self, Msg message
1762 SETUP_WANDERER_INST_DATA;
1763 struct WBHandlerMessage *wbhm = NULL;
1765 D(bug("[Wanderer] Recieved signal at notify port\n"));
1767 while ((wbhm = WBHM(GetMsg(data->wd_CommandPort))) != NULL)
1769 D(bug("[Wanderer] Recieved message from handler, type = %ld\n", wbhm->wbhm_Type));
1771 switch (wbhm->wbhm_Type)
1773 case WBHM_TYPE_SHOW:
1774 D(bug("[Wanderer] WBHM_TYPE_SHOW\n"));
1775 SET(self, MUIA_ShowMe, TRUE);
1776 break;
1778 case WBHM_TYPE_HIDE:
1779 D(bug("[Wanderer] WBHM_TYPE_HIDE\n"));
1780 SET(self, MUIA_ShowMe, FALSE);
1781 break;
1783 case WBHM_TYPE_UPDATE:
1784 D(bug("[Wanderer] WBHM_TYPE_UPDATE\n"));
1786 CONST_STRPTR name = wbhm->wbhm_Data.Update.Name;
1787 ULONG length;
1789 switch (wbhm->wbhm_Data.Update.Type)
1791 case WBDISK:
1792 case WBDRAWER:
1793 case WBGARBAGE:
1794 length = strlen(name);
1795 break;
1797 default:
1798 length = PathPart(name) - name;
1799 break;
1802 D(bug("[Wanderer] name = %s, length = %ld\n", name, length));
1805 Object *cstate = (Object*)(((struct List*)XGET(self, MUIA_Application_WindowList))->lh_Head);
1806 Object *child = NULL;
1808 while ((child = NextObject(&cstate)))
1810 if (XGET(child, MUIA_UserData))
1812 STRPTR child_drawer = (STRPTR)XGET(child, MUIA_IconWindow_Location);
1816 child_drawer != NULL
1817 && strncmp(name, child_drawer, length) == 0
1818 && strlen(child_drawer) == length
1821 Object *iconlist = (Object *) XGET(child, MUIA_IconWindow_IconList);
1823 D(bug("[Wanderer] Drawer found: %s!\n", child_drawer));
1825 if (iconlist != NULL)
1827 DoMethod ( iconlist, MUIM_IconList_Update );
1829 break;
1835 break;
1837 case WBHM_TYPE_OPEN:
1838 D(bug("[Wanderer] WBHM_TYPE_OPEN\n"));
1841 Object *cstate = (Object*)(((struct List*)XGET(self, MUIA_Application_WindowList))->lh_Head);
1842 Object *child;
1843 CONST_STRPTR buf = wbhm->wbhm_Data.Open.Name;
1845 while ((child = NextObject(&cstate)))
1847 if (XGET(child, MUIA_UserData))
1849 STRPTR child_drawer = (STRPTR)XGET(child, MUIA_IconWindow_Location);
1850 if (child_drawer && !Stricmp(buf,child_drawer))
1852 int is_open = XGET(child, MUIA_Window_Open);
1853 if (!is_open)
1854 DoMethod(child, MUIM_IconWindow_Open);
1855 else
1857 DoMethod(child, MUIM_Window_ToFront);
1858 SET(child, MUIA_Window_Activate, TRUE);
1860 return 0;
1865 DoMethod
1867 _WandererIntern_AppObj, MUIM_Wanderer_CreateDrawerWindow, (IPTR) buf
1870 break;
1871 } /* switch */
1873 ReplyMsg((struct Message *) wbhm);
1876 return 0;
1880 IPTR Wanderer__MUIM_Wanderer_HandleNotify
1882 Class *CLASS, Object *self, Msg message
1885 SETUP_WANDERER_INST_DATA;
1886 struct Message *notifyMessage = NULL;
1888 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_HandleNotify: got prefs change notification!\n"));
1890 while ((notifyMessage = GetMsg(data->wd_NotifyPort)) != NULL)
1892 ReplyMsg(notifyMessage);
1895 /* reload prefs file */
1896 DoMethod(data->wd_Prefs, MUIM_WandererPrefs_Reload);
1898 return 0;
1901 /* Some differences here between volumes and subwindows */
1902 Object * __CreateWandererIntuitionMenu__ ( BOOL isRoot, BOOL isBackdrop)
1904 Object *_NewWandIntMenu__menustrip = NULL;
1905 IPTR _NewWandIntMenu__OPTION_BACKDROP = CHECKIT|MENUTOGGLE;
1906 IPTR _NewWandIntMenu__OPTION_SHOWALL = CHECKIT|MENUTOGGLE;
1908 if (isBackdrop)
1910 _NewWandIntMenu__OPTION_BACKDROP |= CHECKED;
1913 #if defined(WANDERER_DEFAULT_SHOWALL)
1914 _NewWandIntMenu__OPTION_SHOWALL |= CHECKED;
1915 #endif
1917 if ( isRoot )
1919 struct NewMenu nm[] = {
1920 {NM_TITLE, _(MSG_MEN_WANDERER)},
1921 {NM_ITEM, _(MSG_MEN_BACKDROP),_(MSG_MEN_SC_BACKDROP), _NewWandIntMenu__OPTION_BACKDROP, 0, (APTR) MEN_WANDERER_BACKDROP},
1922 {NM_ITEM, _(MSG_MEN_EXECUTE), _(MSG_MEN_SC_EXECUTE) , 0 , 0, (APTR) MEN_WANDERER_EXECUTE},
1924 {NM_ITEM, _(MSG_MEN_SHELL), _(MSG_MEN_SC_SHELL) , 0 , 0, (APTR) MEN_WANDERER_SHELL},
1925 {NM_ITEM, _(MSG_MEN_GUISET), NULL , 0 , 0, (APTR) MEN_WANDERER_GUISETTINGS},
1926 {NM_ITEM, _(MSG_MEN_ABOUT), _(MSG_MEN_SC_ABOUT) , 0 , 0, (APTR) MEN_WANDERER_ABOUT},
1927 {NM_ITEM, _(MSG_MEN_QUIT) , _(MSG_MEN_SC_QUIT) , 0 , 0, (APTR) MEN_WANDERER_QUIT},
1929 {NM_TITLE, _(MSG_MEN_WINDOW), NULL, NM_MENUDISABLED},
1931 {NM_ITEM, _(MSG_MEN_UPDATE), NULL , 0 , 0, (APTR) MEN_WINDOW_UPDATE},
1932 {NM_ITEM, NM_BARLABEL},
1933 {NM_ITEM, _(MSG_MEN_CONTENTS), _(MSG_MEN_SC_CONTENTS), 0 , 0, (APTR) MEN_WINDOW_SELECT},
1934 {NM_ITEM, _(MSG_MEN_CLRSEL), _(MSG_MEN_SC_CLRSEL) , 0 , 0, (APTR) MEN_WINDOW_CLEAR},
1935 {NM_ITEM, NM_BARLABEL},
1936 {NM_ITEM, _(MSG_MEN_SNAPSHT) },
1937 {NM_SUB, _(MSG_MEN_WINDOW), NULL , 0 , 0, (APTR) MEN_WINDOW_SNAP_WIN},
1938 {NM_SUB, _(MSG_MEN_ALL), NULL , 0 , 0, (APTR) MEN_WINDOW_SNAP_ALL},
1939 {NM_ITEM, NM_BARLABEL},
1940 {NM_ITEM, _(MSG_MEN_VIEW)},
1941 {NM_SUB, _(MSG_MEN_ICVIEW), NULL , CHECKIT|CHECKED ,8+16+32, (APTR) MEN_WINDOW_VIEW_ICON},
1942 {NM_SUB, _(MSG_MEN_DCVIEW), NULL , CHECKIT ,4+16+32, (APTR) MEN_WINDOW_VIEW_DETAIL},
1943 {NM_SUB, NM_BARLABEL},
1944 {NM_SUB, _(MSG_MEN_ALLFIL), NULL , _NewWandIntMenu__OPTION_SHOWALL, 0, (APTR) MEN_WINDOW_VIEW_ALL},
1945 {NM_ITEM, _(MSG_MEN_SORTIC)},
1946 {NM_SUB, _(MSG_MEN_CLNUP), _(MSG_MEN_SC_CLNUP) , 0 , 0, (APTR) MEN_WINDOW_SORT_NOW},
1947 {NM_SUB, NM_BARLABEL},
1948 {NM_SUB, _(MSG_MEN_BYNAME), NULL , CHECKIT|CHECKED ,8+16+32, (APTR) MEN_WINDOW_SORT_NAME},
1949 {NM_SUB, _(MSG_MEN_BYDATE), NULL , CHECKIT ,4+16+32, (APTR) MEN_WINDOW_SORT_DATE},
1950 {NM_SUB, _(MSG_MEN_BYSIZE), NULL , CHECKIT ,4+8+32, (APTR) MEN_WINDOW_SORT_SIZE},
1951 //{NM_SUB, "..by Type", NULL, CHECKIT,4+8+16, (APTR) MEN_WINDOW_SORT_TYPE},
1952 {NM_SUB, NM_BARLABEL},
1953 {NM_SUB, _(MSG_MEN_REVERSE), NULL , CHECKIT|MENUTOGGLE , 0, (APTR) MEN_WINDOW_SORT_REVERSE},
1954 {NM_SUB, _(MSG_MEN_DRWFRST), NULL , CHECKIT|MENUTOGGLE|CHECKED, 0, (APTR) MEN_WINDOW_SORT_TOPDRAWERS},
1955 //{NM_SUB, "Group Icons", NULL, CHECKIT|MENUTOGGLE|CHECKED, 0, (APTR) MEN_WINDOW_SORT_GROUP},
1957 {NM_TITLE, _(MSG_MEN_ICON), NULL, NM_MENUDISABLED},
1958 {NM_ITEM, _(MSG_MEN_OPEN), _(MSG_MEN_SC_OPEN), 0, 0, (APTR) MEN_ICON_OPEN},
1959 // {NM_ITEM, "Close","C" },
1960 {NM_ITEM, _(MSG_MEN_RENAME), _(MSG_MEN_SC_RENAME), 0, 0, (APTR) MEN_ICON_RENAME},
1961 {NM_ITEM, _(MSG_MEN_INFO), _(MSG_MEN_SC_INFO), 0, 0, (APTR) MEN_ICON_INFORMATION},
1962 // {NM_ITEM, "Snapshot", "S" },
1963 // {NM_ITEM, "Unsnapshot", "U" },
1964 // {NM_ITEM, "Leave Out", "L" },
1965 // {NM_ITEM, "Put Away", "P" },
1966 {NM_ITEM, NM_BARLABEL},
1967 {NM_ITEM, _(MSG_MEN_DELETE), NULL, 0, 0, (APTR) MEN_ICON_DELETE},
1968 // {NM_ITEM, "Format Disk..." },
1969 // {NM_ITEM, "Empty Trash..." },
1971 {NM_TITLE, _(MSG_MEN_TOOLS), NULL, NM_MENUDISABLED},
1972 // {NM_ITEM, "ResetWanderer" },
1973 {NM_END}
1975 _NewWandIntMenu__menustrip = MUI_MakeObject(MUIO_MenustripNM, nm, (IPTR) NULL);
1977 else
1979 struct NewMenu nm[] = {
1980 {NM_TITLE, _(MSG_MEN_WANDERER)},
1981 {NM_ITEM, _(MSG_MEN_BACKDROP),_(MSG_MEN_SC_BACKDROP), _NewWandIntMenu__OPTION_BACKDROP, 0, (APTR) MEN_WANDERER_BACKDROP},
1982 {NM_ITEM, _(MSG_MEN_EXECUTE), _(MSG_MEN_SC_EXECUTE) , 0 , 0, (APTR) MEN_WANDERER_EXECUTE},
1984 {NM_ITEM, _(MSG_MEN_SHELL), _(MSG_MEN_SC_SHELL) , 0 , 0, (APTR) MEN_WANDERER_SHELL},
1985 {NM_ITEM, _(MSG_MEN_GUISET), NULL , 0 , 0, (APTR) MEN_WANDERER_GUISETTINGS},
1986 {NM_ITEM, _(MSG_MEN_ABOUT), _(MSG_MEN_SC_ABOUT) , 0 , 0, (APTR) MEN_WANDERER_ABOUT},
1987 {NM_ITEM, _(MSG_MEN_QUIT) , _(MSG_MEN_SC_QUIT) , 0 , 0, (APTR) MEN_WANDERER_QUIT},
1989 {NM_TITLE, _(MSG_MEN_WINDOW), NULL, NM_MENUDISABLED},
1991 {NM_ITEM, _(MSG_MEN_NEWDRAW), _(MSG_MEN_SC_NEWDRAW) , 0 , 0, (APTR) MEN_WINDOW_NEW_DRAWER},
1992 {NM_ITEM, _(MSG_MEN_OPENPAR), NULL , 0 , 0, (APTR) MEN_WINDOW_OPEN_PARENT},
1993 {NM_ITEM, _(MSG_MEN_CLOSE), _(MSG_MEN_SC_CLOSE) , 0 , 0, (APTR) MEN_WINDOW_CLOSE},
1994 {NM_ITEM, _(MSG_MEN_UPDATE), NULL , 0 , 0, (APTR) MEN_WINDOW_UPDATE},
1995 {NM_ITEM, NM_BARLABEL},
1996 {NM_ITEM, _(MSG_MEN_CONTENTS), _(MSG_MEN_SC_CONTENTS), 0 , 0, (APTR) MEN_WINDOW_SELECT},
1997 {NM_ITEM, _(MSG_MEN_CLRSEL), _(MSG_MEN_SC_CLRSEL) , 0 , 0, (APTR) MEN_WINDOW_CLEAR},
1998 {NM_ITEM, NM_BARLABEL},
1999 {NM_ITEM, _(MSG_MEN_SNAPSHT) },
2000 {NM_SUB, _(MSG_MEN_WINDOW), NULL , 0 , 0, (APTR) MEN_WINDOW_SNAP_WIN},
2001 {NM_SUB, _(MSG_MEN_ALL), NULL , 0 , 0, (APTR) MEN_WINDOW_SNAP_ALL},
2002 {NM_ITEM, NM_BARLABEL},
2003 {NM_ITEM, _(MSG_MEN_VIEW)},
2004 {NM_SUB, _(MSG_MEN_ICVIEW), NULL , CHECKIT|CHECKED ,8+16+32, (APTR) MEN_WINDOW_VIEW_ICON},
2005 {NM_SUB, _(MSG_MEN_DCVIEW), NULL , CHECKIT ,4+16+32, (APTR) MEN_WINDOW_VIEW_DETAIL},
2006 {NM_SUB, NM_BARLABEL},
2007 {NM_SUB, _(MSG_MEN_ALLFIL), NULL , _NewWandIntMenu__OPTION_SHOWALL, 0, (APTR) MEN_WINDOW_VIEW_ALL},
2008 {NM_ITEM, _(MSG_MEN_SORTIC)},
2009 {NM_SUB, _(MSG_MEN_CLNUP), _(MSG_MEN_SC_CLNUP) , 0 , 0, (APTR) MEN_WINDOW_SORT_NOW},
2010 {NM_SUB, NM_BARLABEL},
2011 {NM_SUB, _(MSG_MEN_BYNAME), NULL , CHECKIT|CHECKED ,8+16+32, (APTR) MEN_WINDOW_SORT_NAME},
2012 {NM_SUB, _(MSG_MEN_BYDATE), NULL , CHECKIT ,4+16+32, (APTR) MEN_WINDOW_SORT_DATE},
2013 {NM_SUB, _(MSG_MEN_BYSIZE), NULL , CHECKIT ,4+8+32, (APTR) MEN_WINDOW_SORT_SIZE},
2014 //{NM_SUB, "..by Type", NULL, CHECKIT,4+8+16, (APTR) MEN_WINDOW_SORT_TYPE},
2015 {NM_SUB, NM_BARLABEL},
2016 {NM_SUB, _(MSG_MEN_REVERSE), NULL , CHECKIT|MENUTOGGLE , 0, (APTR) MEN_WINDOW_SORT_REVERSE},
2017 {NM_SUB, _(MSG_MEN_DRWFRST), NULL , CHECKIT|MENUTOGGLE|CHECKED, 0, (APTR) MEN_WINDOW_SORT_TOPDRAWERS},
2018 //{NM_SUB, "Group Icons", NULL, CHECKIT|MENUTOGGLE|CHECKED, 0, (APTR) MEN_WINDOW_SORT_GROUP},
2020 {NM_TITLE, _(MSG_MEN_ICON), NULL, NM_MENUDISABLED},
2021 {NM_ITEM, _(MSG_MEN_OPEN), _(MSG_MEN_SC_OPEN), 0, 0, (APTR) MEN_ICON_OPEN},
2022 // {NM_ITEM, "Close","C" },
2023 {NM_ITEM, _(MSG_MEN_RENAME), _(MSG_MEN_SC_RENAME), 0, 0, (APTR) MEN_ICON_RENAME},
2024 {NM_ITEM, _(MSG_MEN_INFO), _(MSG_MEN_SC_INFO), 0, 0, (APTR) MEN_ICON_INFORMATION},
2025 // {NM_ITEM, "Snapshot", "S" },
2026 // {NM_ITEM, "Unsnapshot", "U" },
2027 // {NM_ITEM, "Leave Out", "L" },
2028 // {NM_ITEM, "Put Away", "P" },
2029 {NM_ITEM, NM_BARLABEL},
2030 {NM_ITEM, _(MSG_MEN_DELETE), NULL, 0, 0, (APTR) MEN_ICON_DELETE},
2031 // {NM_ITEM, "Format Disk..." },
2032 // {NM_ITEM, "Empty Trash..." },
2034 {NM_TITLE, _(MSG_MEN_TOOLS), NULL, NM_MENUDISABLED},
2035 // {NM_ITEM, "ResetWanderer" },
2036 {NM_END}
2038 _NewWandIntMenu__menustrip = MUI_MakeObject(MUIO_MenustripNM, nm, (IPTR) NULL);
2040 return _NewWandIntMenu__menustrip;
2043 Object *Wanderer__MUIM_Wanderer_CreateDrawerWindow
2045 Class *CLASS, Object *self,
2046 struct MUIP_Wanderer_CreateDrawerWindow *message
2049 SETUP_WANDERER_INST_DATA;
2051 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow()\n"));
2053 Object *window = NULL;
2054 BOOL isWorkbenchWindow = FALSE;
2055 BOOL useBackdrop = FALSE;
2057 if (isWorkbenchWindow = (message->drawer == NULL ? TRUE : FALSE))
2059 useBackdrop = data->wd_Option_BackDropMode;
2062 BOOL hasToolbar = XGET(data->wd_Prefs, MUIA_IconWindowExt_Toolbar_Enabled);
2063 IPTR TAG_IconWindow_Drawer = isWorkbenchWindow ? TAG_IGNORE : MUIA_IconWindow_Location;
2065 IPTR useFont = (IPTR)NULL;
2066 if (data->wd_PrefsIntern)
2068 useFont = (IPTR)((struct WandererInternalPrefsData *)data->wd_PrefsIntern)->WIPD_IconFont;
2071 Object *_NewWandDrawerMenu__menustrip = __CreateWandererIntuitionMenu__ (isWorkbenchWindow, useBackdrop);
2073 /* Create a new icon drawer window with the correct drawer being set */
2074 window = IconWindowObject,
2075 MUIA_UserData, 1,
2076 MUIA_Wanderer_Prefs, data->wd_Prefs,
2077 MUIA_Wanderer_Screen, data->wd_Screen,
2078 MUIA_Window_ScreenTitle, (IPTR) GetScreenTitle(),
2079 MUIA_Window_Menustrip, (IPTR) _NewWandDrawerMenu__menustrip,
2080 TAG_IconWindow_Drawer, (IPTR) message->drawer,
2081 MUIA_IconWindow_Font, useFont,
2082 MUIA_IconWindow_ActionHook, (IPTR) &_WandererIntern_hook_action,
2083 MUIA_IconWindow_IsRoot, isWorkbenchWindow ? TRUE : FALSE,
2084 isWorkbenchWindow ? MUIA_IconWindow_IsBackdrop : TAG_IGNORE, useBackdrop,
2085 MUIA_Window_IsSubWindow, isWorkbenchWindow ? FALSE : TRUE,
2086 MUIA_IconWindowExt_Toolbar_Enabled, hasToolbar ? TRUE : FALSE,
2087 End;
2089 if (window != NULL)
2091 /* Get the drawer path back so we can use it also outside this function */
2092 STRPTR drw = NULL;
2093 BOOL freeDrwStr = FALSE;
2095 if (!isWorkbenchWindow) drw = (STRPTR) XGET(window, MUIA_IconWindow_Location);
2096 else
2098 drw = AllocVec ( 5, MEMF_CLEAR );
2099 sprintf ( drw, "RAM:" );
2100 freeDrwStr = TRUE;
2103 if (isWorkbenchWindow)
2105 DoMethod
2107 window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
2108 (IPTR)self, 3, MUIM_CallHook, (IPTR)&_WandererIntern_hook_standard, (IPTR)wanderer_menufunc_wanderer_quit
2111 else
2113 DoMethod
2115 window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
2116 (IPTR)window, 1, MUIM_IconWindow_Remove
2120 #if defined(WANDERER_DEFAULT_SHOWALL) || defined(WANDERER_DEFAULT_SHOWHIDDEN)
2121 Object *window_IconList = NULL;
2122 ULONG current_DispFlags = 0;
2124 GET(window, MUIA_IconWindow_IconList, &window_IconList);
2126 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow: IconWindows IconList @ %x\n", window_IconList));
2128 if (window_IconList != NULL)
2130 GET(window_IconList, MUIA_IconList_DisplayFlags, &current_DispFlags);
2132 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow: Old Flags : %x\n", current_DispFlags));
2134 #if defined(WANDERER_DEFAULT_SHOWALL)
2135 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow: Telling IconList to Show 'ALL' Files\n"));
2136 current_DispFlags &= ~ICONLIST_DISP_SHOWINFO;
2137 #endif
2138 #if defined(WANDERER_DEFAULT_SHOWHIDDEN)
2139 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow: Telling IconList to Show 'Hidden' Files\n"));
2140 current_DispFlags |= ICONLIST_DISP_SHOWHIDDEN;
2141 #endif
2142 D(bug("[Wanderer] Wanderer__MUIM_Wanderer_CreateDrawerWindow: New Flags : %x\n", current_DispFlags));
2143 SET(window_IconList, MUIA_IconList_DisplayFlags, current_DispFlags);
2145 #endif
2147 DoMethod
2149 window, MUIM_Notify, MUIA_Window_Activate, TRUE,
2150 (IPTR)_app(self), 3, MUIM_Set, MUIA_Wanderer_ActiveWindow, (IPTR) window
2153 #if 1
2154 DoMethod
2156 window, MUIM_Notify, MUIA_IconWindow_IsBackdrop, MUIV_EveryTime,
2157 (IPTR)_app(self), 5, MUIM_Application_PushMethod, (IPTR)_app(self), 2, MUIM_CallHook, (IPTR)&_WandererIntern_hook_backdrop
2159 #else
2160 DoMethod
2162 window, MUIM_Notify, MUIA_IconWindow_IsBackdrop, MUIV_EveryTime,
2163 (IPTR)_app(self), 2, MUIM_CallHook, (IPTR) &_WandererIntern_hook_backdrop
2165 #endif
2167 /* If "Execute Command" entry is clicked open the execute window */
2168 DoAllMenuNotifies(_NewWandDrawerMenu__menustrip, drw);
2170 /* Add the window to the application */
2171 DoMethod(_app(self), OM_ADDMEMBER, (IPTR) window);
2173 /* And now open it */
2174 DoMethod(window, MUIM_IconWindow_Open);
2176 /* Clean up ram string */
2177 if ( freeDrwStr && drw ) FreeVec ( drw );
2180 return window;
2183 /*** Setup ******************************************************************/
2184 ZUNE_CUSTOMCLASS_9
2186 Wanderer, NULL, MUIC_Application, NULL,
2187 OM_NEW, struct opSet *,
2188 OM_DISPOSE, Msg,
2189 OM_SET, struct opSet *,
2190 OM_GET, struct opGet *,
2191 MUIM_Application_Execute, Msg,
2192 MUIM_Wanderer_HandleTimer, Msg,
2193 MUIM_Wanderer_HandleCommand, Msg,
2194 MUIM_Wanderer_HandleNotify, Msg,
2195 MUIM_Wanderer_CreateDrawerWindow, struct MUIP_Wanderer_CreateDrawerWindow *