2 Copyright © 2004-2012, The AROS Development Team. All rights reserved.
7 #define DOPENWINDOW(x) /* Window positioning and size */
11 #include "portable_macros.h"
13 #define MUIMASTER_YES_INLINE_STDARG
16 #define ICONWINDOW_NODETAILVIEWCLASS
17 //#define ICONWINDOW_BUFFERLIST
19 #include <exec/types.h>
20 #include <libraries/mui.h>
22 #include <proto/utility.h>
24 #include <proto/graphics.h>
26 #include <proto/exec.h>
27 #include <proto/datatypes.h>
30 #include <proto/dos.h>
32 #include <proto/icon.h>
37 #include <intuition/screens.h>
38 #include <datatypes/pictureclass.h>
39 #include <clib/macros.h>
42 #include <aros/debug.h>
43 #include <clib/alib_protos.h>
44 #include <prefs/wanderer.h>
45 #include <zune/customclasses.h>
47 #include <prefs_AROS/wanderer.h>
48 #include <zune_AROS/customclasses.h>
51 #if defined(__AMIGA__) && !defined(__PPC__)
52 #define NO_INLINE_STDARG
54 #include <proto/intuition.h>
55 #include <proto/muimaster.h>
57 #include "Classes/iconlist.h"
58 #include "Classes/iconlistview.h"
59 #include "Classes/iconlist_attributes.h"
60 #include "Classes/icon_attributes.h"
62 #include "wandererprefs.h"
64 #include "iconwindow.h"
65 #include "iconwindow_attributes.h"
66 #include "iconwindow_iconlist.h"
67 #include "iconwindowbackfill.h"
74 #define D(x) if (DEBUG) x
76 #define bug DebugPrintF
85 #if defined(ICONWINDOW_NODETAILVIEWCLASS)
86 struct MUI_CustomClass
*IconWindowDetailDrawerList_CLASS
;
93 #define DoSuperNew(cl, obj, ...) DoSuperNewTags(cl, obj, NULL, __VA_ARGS__)
95 #define IconListviewObject NewObject(IconListview_Class->mcc_Class
98 /*** Private Global Data *********************************************************/
100 static struct List iconwindow_BackFillNodes
;
101 struct List iconwindow_Extensions
;
102 struct IconWindow_BackFill_Descriptor
*iconwindow_BackFill_Active
;
104 static char __intern_wintitle_wanderer
[] = WANDERERNAME
;
106 #define TT_WNDRRSRT "WNDRRSRT"
109 /*** Helper functions ***********************************************************/
110 STATIC VOID
IconWindow_RestoreSettings(struct DiskObject
* dskobj
, Object
* iconwindowiconlist
, BOOL forceshowall
)
112 ULONG displayFlags
= (ICONLIST_DISP_SHOWINFO
| ICONLIST_DISP_MODEDEFAULT
);
113 BOOL displayFlagsRestored
= FALSE
;
115 if (dskobj
->do_ToolTypes
)
117 STRPTR hexFlags
= FindToolType(dskobj
->do_ToolTypes
, TT_WNDRRSRT
);
118 if (hexFlags
!= NULL
)
120 ULONG sortFlags
= strtol(hexFlags
, NULL
, 16);
121 SET(iconwindowiconlist
, MUIA_IconWindowIconList_RestoredSortFlags
, (ULONG
)sortFlags
);
125 if (dskobj
->do_Gadget
.UserData
)
128 * Note: it is actually possible when reading icons not snapshoted by Wanderer to end up in situation where
129 * only one of the dd_Flafs/dd_ViewModes has supported values. In that case however still the complete
130 * displayFlags are marked as restored. That is why the displayFlags have default value, so not to end
131 * up with invalid window settings.
133 D(bug("[Wanderer:IconWindow] %s: Drawer Icon has OS 2.x/3.x data: FLAGS %x\n", __PRETTY_FUNCTION__
, dskobj
->do_DrawerData
->dd_Flags
));
135 if (dskobj
->do_DrawerData
->dd_Flags
== DDFLAGS_SHOWICONS
)
137 displayFlags
|= ICONLIST_DISP_SHOWINFO
;
138 displayFlagsRestored
= TRUE
;
140 if (dskobj
->do_DrawerData
->dd_Flags
== DDFLAGS_SHOWALL
)
142 displayFlags
&= ~ICONLIST_DISP_SHOWINFO
;
143 displayFlagsRestored
= TRUE
;
145 if (dskobj
->do_DrawerData
->dd_ViewModes
== DDVM_BYICON
)
147 displayFlags
&= ~ICONLIST_DISP_MODE_MASK
;
148 displayFlags
|= ICONLIST_DISP_MODEDEFAULT
;
149 displayFlagsRestored
= TRUE
;
151 if (dskobj
->do_DrawerData
->dd_ViewModes
== DDVM_BYNAME
)
153 displayFlags
&= ~ICONLIST_DISP_MODE_MASK
;
154 displayFlags
|= ICONLIST_DISP_MODELIST
;
155 displayFlagsRestored
= TRUE
;
161 displayFlags
&= ~ICONLIST_DISP_SHOWINFO
;
162 displayFlagsRestored
= TRUE
;
165 if (displayFlagsRestored
)
166 SET(iconwindowiconlist
, MUIA_IconWindowIconList_RestoredDisplayFlags
, displayFlags
);
169 STATIC VOID
IconWindow_StoreSettings(Object
* iconwindow
)
171 Object
*iconList
= (Object
*) XGET(iconwindow
, MUIA_IconWindow_IconList
);
172 STRPTR dir_name
= (char *)XGET(iconwindow
, MUIA_IconWindow_Location
);
173 struct DiskObject
*drawericon
= NULL
;
174 IPTR geticon_error
= 0;
175 IPTR display_bits
= 0, sort_bits
= 0;
177 drawericon
= GetIconTags(dir_name
,
178 ICONGETA_FailIfUnavailable
, FALSE
,
179 ICONA_ErrorCode
, &geticon_error
,
182 if (drawericon
!= NULL
)
184 if (drawericon
->do_DrawerData
== NULL
)
186 D(bug("[Wanderer:IconWindow] %s: Icon for '%s' has no DRAWER data!\n", __PRETTY_FUNCTION__
, dir_name
));
187 drawericon
->do_DrawerData
= AllocMem(sizeof(struct DrawerData
), MEMF_CLEAR
|MEMF_PUBLIC
);
190 drawericon
->do_Gadget
.UserData
= (APTR
)1;
192 drawericon
->do_DrawerData
->dd_NewWindow
.TopEdge
= XGET(iconwindow
, MUIA_Window_TopEdge
);
193 drawericon
->do_DrawerData
->dd_NewWindow
.LeftEdge
= XGET(iconwindow
, MUIA_Window_LeftEdge
);
194 drawericon
->do_DrawerData
->dd_NewWindow
.Width
= XGET(iconwindow
, MUIA_Window_Width
);
195 drawericon
->do_DrawerData
->dd_NewWindow
.Height
= XGET(iconwindow
, MUIA_Window_Height
);
197 GET(iconList
, MUIA_IconList_DisplayFlags
, &display_bits
);
198 if (display_bits
& ICONLIST_DISP_SHOWINFO
)
200 D(bug("[Wanderer:IconWindow] %s: ICONLIST_DISP_SHOWINFO\n", __PRETTY_FUNCTION__
));
201 drawericon
->do_DrawerData
->dd_Flags
= DDFLAGS_SHOWICONS
;
205 drawericon
->do_DrawerData
->dd_Flags
= DDFLAGS_SHOWALL
;
208 if (display_bits
& ICONLIST_DISP_MODEDEFAULT
)
210 drawericon
->do_DrawerData
->dd_ViewModes
= DDVM_BYICON
;
212 if (display_bits
& ICONLIST_DISP_MODELIST
)
215 * ByName mode is used to encode list-view display mode. Note that actual sorting
216 * is stored in tool type, so the list-view window stores as DDVM_BYNAME does not
217 * have to be sorted by name.
219 drawericon
->do_DrawerData
->dd_ViewModes
= DDVM_BYNAME
;
222 /* Save settings into Tool Types */
224 LONG i
= 0, inew
= 0, tocopy
= 0;
225 TEXT buffer
[128] = {0};
226 UBYTE
** oldtooltypes
= drawericon
->do_ToolTypes
;
227 UBYTE
** newtooltypes
= NULL
;
229 /* Find how many need to be copied */
230 if (oldtooltypes
!= NULL
)
232 for (i
= 0; oldtooltypes
[i
]; i
++)
234 if (Strnicmp(oldtooltypes
[i
], TT_WNDRRSRT
, strlen(TT_WNDRRSRT
)) == 0)
240 /* Create new pointer array */
241 newtooltypes
= AllocVec(sizeof(STRPTR
) * (tocopy
+ TT_COUNT
+ 1), MEMF_CLEAR
);
243 /* Copy, inew will have last index value */
244 if (oldtooltypes
!= NULL
)
246 for (i
= 0, inew
= 0; oldtooltypes
[i
]; i
++)
248 if (Strnicmp(oldtooltypes
[i
], TT_WNDRRSRT
, strlen(TT_WNDRRSRT
)) == 0)
250 newtooltypes
[inew
++] = StrDup(oldtooltypes
[i
]);
254 /* Add TT_WNDRRSRT value */
255 GET(iconList
, MUIA_IconList_SortFlags
, &sort_bits
);
256 __sprintf(buffer
, TT_WNDRRSRT
"=0x%lx", sort_bits
);
257 newtooltypes
[inew
++] = StrDup(buffer
);
259 drawericon
->do_ToolTypes
= newtooltypes
;
261 PutDiskObject(dir_name
, drawericon
);
263 drawericon
->do_ToolTypes
= oldtooltypes
;
266 for (i
= 0; i
< inew
; i
++)
267 FreeVec(newtooltypes
[i
]);
268 FreeVec(newtooltypes
);
274 /*** Hook functions *********************************************************/
276 ///IconWindow__HookFunc_PrefsUpdatedFunc()
279 void, IconWindow__HookFunc_PrefsUpdatedFunc
,
280 AROS_UFHA(struct Hook
*, hook
, A0
),
281 AROS_UFHA(APTR
*, obj
, A2
),
282 AROS_UFHA(APTR
, param
, A1
)
286 HOOKPROTO(IconWindow__HookFunc_PrefsUpdatedFunc
, void, APTR
*obj
, APTR param
)
291 /* Get our private data */
292 Object
*self
= ( Object
*)obj
;
293 Class
*CLASS
= *( Class
**)param
;
296 SETUP_ICONWINDOW_INST_DATA
;
298 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
301 GET(self
, MUIA_IconWindow_Changed
, &changed_state
);
303 if ((changed_state
) && (data
->iwd_IconListObj
))
305 D(bug("[Wanderer:IconWindow] %s: Window contents have changed .. updating display ..\n", __PRETTY_FUNCTION__
));
306 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Update
);
307 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Sort
);
308 SET(self
, MUIA_IconWindow_Changed
, FALSE
);
314 MakeStaticHook(iwd_PrefsUpdated_hook
,IconWindow__HookFunc_PrefsUpdatedFunc
);
318 ///IconWindow__HookFunc_ProcessBackgroundFunc()
321 void, IconWindow__HookFunc_ProcessBackgroundFunc
,
322 AROS_UFHA(struct Hook
*, hook
, A0
),
323 AROS_UFHA(APTR
*, obj
, A2
),
324 AROS_UFHA(APTR
, param
, A1
)
328 HOOKPROTO(IconWindow__HookFunc_ProcessBackgroundFunc
, void, APTR
*obj
, APTR param
)
333 /* Get our private data */
334 Object
*self
= ( Object
*)obj
,
336 Class
*CLASS
= *( Class
**)param
;
338 SETUP_ICONWINDOW_INST_DATA
;
340 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
342 DoMethod(self
, MUIM_IconWindow_BackFill_ProcessBackground
, data
->iwd_BackFillInfo
, data
->iwd_RootViewObj
);
344 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
348 //BOOL options_changed = FALSE;
349 IPTR prefs_Processing
= 0;
351 GET(prefs
, MUIA_WandererPrefs_Processing
, &prefs_Processing
);
352 if (!prefs_Processing
)
354 /* TODO: We arent in prefs-processing so cause an update! */
361 MakeStaticHook(iwd_ProcessBackground_hook
,IconWindow__HookFunc_ProcessBackgroundFunc
);
365 ///IconWindow__HookFunc_WandererBackFillFunc()
368 void, IconWindow__HookFunc_WandererBackFillFunc
,
369 AROS_UFHA(struct Hook
*, hook
, A0
),
370 AROS_UFHA(struct RastPort
*, RP
, A2
),
371 AROS_UFHA(struct BackFillMsg
*, BFM
, A1
)
375 HOOKPROTO(IconWindow__HookFunc_WandererBackFillFunc
, void, struct RastPort
*RP
, struct BackFillMsg
*BFM
)
380 struct IconWindow_BackFillHookData
*HookData
= NULL
;
382 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
384 if ((HookData
= hook
->h_Data
) && (iconwindow_BackFill_Active
!= NULL
))
386 Class
*CLASS
= HookData
->bfhd_IWClass
;
387 Object
*self
= HookData
->bfhd_IWObject
;
389 SETUP_ICONWINDOW_INST_DATA
;
391 struct RastPort
*DrawBackGround_RastPort
= NULL
;
392 struct IconWindowBackFillMsg DrawBackGround_BackFillMsg
;
394 GET(data
->iwd_IconListObj
, MUIA_IconList_BufferRastport
, &DrawBackGround_RastPort
);
396 if (DrawBackGround_RastPort
!= NULL
)
398 if ((DrawBackGround_BackFillMsg
.Layer
= DrawBackGround_RastPort
->Layer
) == NULL
)
400 D(bug("[Wanderer:IconWindow] %s: Rastport Layer = NULL!\n", __PRETTY_FUNCTION__
));
403 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferLeft
, &DrawBackGround_BackFillMsg
.AreaBounds
.MinX
);
404 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferTop
, &DrawBackGround_BackFillMsg
.AreaBounds
.MinY
);
405 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferWidth
, &DrawBackGround_BackFillMsg
.AreaBounds
.MaxX
);
406 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferHeight
, &DrawBackGround_BackFillMsg
.AreaBounds
.MaxY
);
408 DrawBackGround_BackFillMsg
.AreaBounds
.MaxX
+= DrawBackGround_BackFillMsg
.AreaBounds
.MinX
- 1;
409 DrawBackGround_BackFillMsg
.AreaBounds
.MaxY
+= DrawBackGround_BackFillMsg
.AreaBounds
.MinY
- 1;
411 DrawBackGround_BackFillMsg
.DrawBounds
.MinX
= BFM
->Bounds
.MinX
;
412 DrawBackGround_BackFillMsg
.DrawBounds
.MinY
= BFM
->Bounds
.MinY
;
413 DrawBackGround_BackFillMsg
.DrawBounds
.MaxX
= BFM
->Bounds
.MaxX
;
414 DrawBackGround_BackFillMsg
.DrawBounds
.MaxY
= BFM
->Bounds
.MaxY
;
416 /* Offset into source image (ala scroll bar position) */
417 DrawBackGround_BackFillMsg
.OffsetX
= BFM
->OffsetX
;
418 DrawBackGround_BackFillMsg
.OffsetY
= BFM
->OffsetY
;
419 DoMethod(self
, MUIM_IconWindow_BackFill_DrawBackground
, data
->iwd_BackFillInfo
, &DrawBackGround_BackFillMsg
, DrawBackGround_RastPort
);
427 MakeStaticHook(Hook_WandererBackFillFunc
,IconWindow__HookFunc_WandererBackFillFunc
);
432 Object
*IconWindow__OM_NEW(Class
*CLASS
, Object
*self
, struct opSet
*message
)
434 struct iconWindow_Extension
*iw_Extension
= NULL
;
436 struct Screen
*_newIconWin__Screen
= NULL
;
437 Object
*_newIconWin__IconListObj
= NULL
,
438 *_newIconWin__RootViewObj
= NULL
,
440 *_newIconWin__TopPanelContainerObj
= NULL
,
441 *_newIconWin__TopPanelRootGroupObj
= NULL
,
442 *_newIconWin__TopPanelSpacerObj
= NULL
,
444 *_newIconWin__LeftPanelContainerObj
= NULL
,
445 *_newIconWin__LeftPanelRootGroupObj
= NULL
,
446 *_newIconWin__LeftPanelSpacerObj
= NULL
,
448 *_newIconWin__BottomPanelContainerObj
= NULL
,
449 *_newIconWin__BottomPanelRootGroupObj
= NULL
,
450 *_newIconWin__BottomPanelSpacerObj
= NULL
,
454 char *_newIconWin__Title
= NULL
;
456 UBYTE _newIconWin__VOLVIEWMODE
= MUIV_IconWindow_VolumeInfoMode_ShowAllIfNoInfo
;
461 struct Hook
*actionHook
= NULL
;
463 struct Hook
*_newIconWin__BackFillHook
= NULL
;
465 IPTR WindowBF_TAG
= (IPTR
)TAG_IGNORE
;
467 IPTR _newIconWin__WindowWidth
= 0;
468 IPTR _newIconWin__WindowHeight
= 0;
469 IPTR _newIconWin__WindowLeft
= 0;
470 IPTR _newIconWin__WindowTop
= 0;
472 IPTR _newIconWin__FSNotifyPort
= (IPTR
)NULL
;
473 struct MUI_CustomClass
*iconviewclass
= NULL
;
474 #if defined(ICONWINDOW_NODETAILVIEWCLASS)
475 IconWindowDetailDrawerList_CLASS
= IconWindowDrawerList_CLASS
;
478 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
480 /* More than one GetTagData is not very efficient, however since this isn't called very often... */
481 isBackdrop
= (BOOL
)GetTagData(MUIA_IconWindow_IsBackdrop
, (IPTR
)FALSE
, message
->ops_AttrList
);
483 isRoot
= (BOOL
)GetTagData(MUIA_IconWindow_IsRoot
, (IPTR
)FALSE
, message
->ops_AttrList
);
485 actionHook
= (struct Hook
*)GetTagData(MUIA_IconWindow_ActionHook
, (IPTR
) NULL
, message
->ops_AttrList
);
486 prefs
= (Object
*)GetTagData(MUIA_Wanderer_Prefs
, (IPTR
) NULL
, message
->ops_AttrList
);
488 _newIconWin__FSNotifyPort
= (IPTR
)GetTagData(MUIA_Wanderer_FileSysNotifyPort
, (IPTR
) NULL
, message
->ops_AttrList
);
490 /* Request the screen we should use .. */
491 if (!(_newIconWin__Screen
= (struct Screen
*)GetTagData(MUIA_Wanderer_Screen
, (IPTR
) NULL
, message
->ops_AttrList
)))
493 D(bug("[Wanderer:IconWindow] %s: NO SCREEN SET!\n", __PRETTY_FUNCTION__
));
496 D(bug("[Wanderer:IconWindow] %s: Screen @ 0x%p\n", __PRETTY_FUNCTION__
, _newIconWin__Screen
));
498 if ((_newIconWin__BackFillHook
= AllocVec(sizeof(struct Hook
), MEMF_CLEAR
|MEMF_PUBLIC
))!=NULL
)
500 D(bug("[Wanderer:IconWindow] %s: Allocated WindowBackFillHook @ 0x%p\n", __PRETTY_FUNCTION__
, _newIconWin__BackFillHook
));
503 _newIconWin__BackFillHook
->h_Entry
= ( HOOKFUNC
)IconWindow__HookFunc_WandererBackFillFunc
;
505 _newIconWin__BackFillHook
= &Hook_WandererBackFillFunc
;
508 //#if defined(__MORPHOS__)
509 // WindowBF_TAG = MUIA_Window_BackFillHook;
511 WindowBF_TAG
= WA_BackFill
;
517 iconviewclass
= IconWindowVolumeList_CLASS
;
518 _newIconWin__IconListObj
= (Object
*)NewObject(iconviewclass
->mcc_Class
, NULL
,
519 MUIA_Wanderer_FileSysNotifyPort
, _newIconWin__FSNotifyPort
,
523 * Use MUI built-in support to keep window aligned to size of screen
524 * Remember: sizes of screen can change without window being recreated
526 _newIconWin__WindowWidth
= MUIV_Window_Width_Screen(100);
527 _newIconWin__WindowHeight
= MUIV_Window_Height_Screen(100);
528 _newIconWin__WindowTop
= MUIV_Window_TopEdge_Delta(0);
529 _newIconWin__WindowLeft
= 0;
531 DOPENWINDOW(bug("[Wanderer:IconWindow] %s: Screen dimensions .. %ld x %ld\n", __PRETTY_FUNCTION__
, _newIconWin__WindowWidth
, _newIconWin__WindowHeight
));
535 DOPENWINDOW(bug("[Wanderer:IconWindow] %s: BACKDROP ROOT Window\n", __PRETTY_FUNCTION__
));
536 _newIconWin__Title
= NULL
;
540 DOPENWINDOW(bug("[Wanderer:IconWindow] %s: Plain ROOT Window\n", __PRETTY_FUNCTION__
));
541 _newIconWin__Title
= __intern_wintitle_wanderer
;
546 struct DiskObject
*drawericon
= NULL
;
547 IPTR geticon_error
= 0, geticon_isdefault
= 0;
548 IPTR _newIconWin__TitleLen
= 0;
549 BOOL forceshowall
= FALSE
;
552 _newIconWin__WindowTop
= MUIV_Window_TopEdge_Centered
;
553 _newIconWin__WindowLeft
= MUIV_Window_LeftEdge_Centered
;
554 _newIconWin__WindowWidth
= 300;
555 _newIconWin__WindowHeight
= 300;
557 _newIconWin__Title
= (STRPTR
) GetTagData(MUIA_IconWindow_Location
, (IPTR
)NULL
, message
->ops_AttrList
);
558 _newIconWin__TitleLen
= strlen(_newIconWin__Title
);
559 isVolume
= (_newIconWin__Title
[_newIconWin__TitleLen
- 1] == ':');
561 D(bug("[Wanderer:IconWindow] %s: Opening %s Window '%s'\n", __PRETTY_FUNCTION__
, isVolume
? "Volume Root" : "Drawer", _newIconWin__Title
));
563 drawericon
= GetIconTags(_newIconWin__Title
,
564 ICONGETA_Screen
, _newIconWin__Screen
,
565 ICONGETA_FailIfUnavailable
, FALSE
,
566 ICONGETA_IsDefaultIcon
, &geticon_isdefault
,
567 ICONA_ErrorCode
, &geticon_error
,
570 if ((drawericon
) && (drawericon
->do_DrawerData
))
572 D(bug("[Wanderer:IconWindow] %s: Directory Icon has DRAWER data!\n", __PRETTY_FUNCTION__
));
573 _newIconWin__WindowTop
= drawericon
->do_DrawerData
->dd_NewWindow
.TopEdge
;
574 _newIconWin__WindowLeft
= drawericon
->do_DrawerData
->dd_NewWindow
.LeftEdge
;
575 _newIconWin__WindowWidth
= drawericon
->do_DrawerData
->dd_NewWindow
.Width
;
576 _newIconWin__WindowHeight
= drawericon
->do_DrawerData
->dd_NewWindow
.Height
;
579 iconviewclass
= IconWindowDrawerList_CLASS
;
580 if ((drawericon
) && (drawericon
->do_Gadget
.UserData
> 0))
582 D(bug("[Wanderer:IconWindow] %s: Directory Icons has OS 2.x/3.x data: FLAGS %x [\n", __PRETTY_FUNCTION__
, drawericon
->do_DrawerData
->dd_Flags
));
583 D(bug("] VIEWMODES %x [", drawericon
->do_DrawerData
->dd_ViewModes
));
585 switch (drawericon
->do_DrawerData
->dd_ViewModes
)
589 D(bug("Default (inherit from parent)"));
594 D(bug("View as icons"));
599 D(bug("View as text, sorted by name"));
600 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
605 D(bug("View as text, sorted by date"));
606 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
611 D(bug("View as text, sorted by size"));
612 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
617 D(bug("View as text, sorted by type"));
618 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
630 (((geticon_isdefault
) && (_newIconWin__VOLVIEWMODE
== MUIV_IconWindow_VolumeInfoMode_ShowAllIfNoInfo
)) ||
631 (_newIconWin__VOLVIEWMODE
== MUIV_IconWindow_VolumeInfoMode_ShowAll
)))
633 D(bug("[Wanderer:IconWindow] %s: setting 'SHOW ALL FILES'\n", __PRETTY_FUNCTION__
));
637 _newIconWin__IconListObj
= (Object
*) NewObject(iconviewclass
->mcc_Class
, NULL
,
638 MUIA_IconDrawerList_Drawer
, (IPTR
) _newIconWin__Title
,
639 MUIA_Wanderer_FileSysNotifyPort
, _newIconWin__FSNotifyPort
,
643 IconWindow_RestoreSettings(drawericon
, _newIconWin__IconListObj
, forceshowall
);
645 _newIconWin__TopPanelRootGroupObj
= MUI_NewObject(MUIC_Group
,
649 MUIA_InnerBottom
,(0),
650 MUIA_Frame
, MUIV_Frame_None
,
651 MUIA_Group_Spacing
, 0,
652 Child
, (_newIconWin__TopPanelSpacerObj
= HSpace(0)),
655 if (_newIconWin__TopPanelRootGroupObj
)
657 _newIconWin__TopPanelContainerObj
= MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
660 MUIA_HorizWeight
, 100,
662 MUIA_Frame
, MUIV_Frame_None
,
663 MUIA_Group_Spacing
, 3,
664 Child
, (IPTR
)_newIconWin__TopPanelRootGroupObj
,
668 _newIconWin__BottomPanelRootGroupObj
= MUI_NewObject(MUIC_Group
,
672 MUIA_InnerBottom
,(0),
673 MUIA_Frame
, MUIV_Frame_None
,
674 MUIA_Group_Spacing
, 0,
675 Child
, (_newIconWin__BottomPanelSpacerObj
= HSpace(0)),
678 if (_newIconWin__BottomPanelRootGroupObj
)
680 _newIconWin__BottomPanelContainerObj
= MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
683 MUIA_HorizWeight
, 100,
685 MUIA_Frame
, MUIV_Frame_None
,
686 MUIA_Group_Spacing
, 3,
687 Child
, (IPTR
)_newIconWin__BottomPanelRootGroupObj
,
691 _newIconWin__LeftPanelRootGroupObj
= MUI_NewObject(MUIC_Group
,
695 MUIA_InnerBottom
,(0),
696 MUIA_Frame
, MUIV_Frame_None
,
697 MUIA_Group_Spacing
, 0,
698 Child
, (_newIconWin__LeftPanelSpacerObj
= HVSpace
),
701 if (_newIconWin__LeftPanelRootGroupObj
)
703 _newIconWin__LeftPanelContainerObj
= MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
707 MUIA_VertWeight
, 100,
708 MUIA_Frame
, MUIV_Frame_None
,
709 MUIA_Group_Spacing
, 3,
710 Child
, (IPTR
)_newIconWin__LeftPanelRootGroupObj
,
715 _newIconWin__RootViewObj
= (Object
*) IconListviewObject
,
717 MUIA_IconListview_UseWinBorder
, TRUE
,
718 MUIA_IconListview_IconList
, (IPTR
) _newIconWin__IconListObj
,
721 DOPENWINDOW(bug("[Wanderer:IconWindow] %s: Window Co-ords %d,%d [%d x %d]\n", __PRETTY_FUNCTION__
, _newIconWin__WindowLeft
, _newIconWin__WindowTop
, _newIconWin__WindowWidth
, _newIconWin__WindowHeight
));
722 D(bug("[Wanderer:IconWindow] %s: Font @ 0x%p\n", __PRETTY_FUNCTION__
, _newIconWin__WindowFont
));
723 D(bug("[Wanderer:IconWindow] %s: TopPanelContainerObj 0x%p RootViewObj 0x%p\n", __PRETTY_FUNCTION__
, _newIconWin__TopPanelContainerObj
, _newIconWin__RootViewObj
));
725 self
= (Object
*) DoSuperNew(CLASS
, self
,
726 MUIA_Window_Screen
, _newIconWin__Screen
,
727 MUIA_Window_Backdrop
, isBackdrop
? TRUE
: FALSE
,
728 MUIA_Window_Borderless
, isBackdrop
? TRUE
: FALSE
,
729 MUIA_Window_Width
, _newIconWin__WindowWidth
,
730 MUIA_Window_Height
, _newIconWin__WindowHeight
,
731 MUIA_Window_LeftEdge
, _newIconWin__WindowLeft
,
732 MUIA_Window_TopEdge
, _newIconWin__WindowTop
,
733 (!isBackdrop
) ? MUIA_Window_AltWidth
: TAG_IGNORE
, 100,
734 (!isBackdrop
) ? MUIA_Window_AltHeight
: TAG_IGNORE
, 80,
735 MUIA_Window_Title
, (IPTR
)_newIconWin__Title
,
737 MUIA_Window_DragBar
, (!isBackdrop
) ? TRUE
: FALSE
,
738 MUIA_Window_CloseGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
739 MUIA_Window_SizeGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
740 MUIA_Window_DepthGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
741 #if defined(MUIA_Window_ZoomGadget)
742 MUIA_Window_ZoomGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
744 MUIA_Window_UseBottomBorderScroller
, (!isBackdrop
) ? TRUE
: FALSE
,
745 MUIA_Window_UseRightBorderScroller
, (!isBackdrop
) ? TRUE
: FALSE
,
746 MUIA_Window_IsSubWindow
, TRUE
,
748 WindowBF_TAG
, _newIconWin__BackFillHook
,
750 MUIA_Window_ScreenTitle
, (IPTR
) "",
752 WindowContents
, (IPTR
) MUI_NewObject(MUIC_Group
,
753 MUIA_Group_Spacing
, 0,
754 MUIA_Group_SameSize
, FALSE
,
757 /* "Extension" group */
758 _newIconWin__TopPanelContainerObj
? Child
: TAG_IGNORE
, (IPTR
)_newIconWin__TopPanelContainerObj
,
761 _newIconWin__LeftPanelContainerObj
? Child
: TAG_IGNORE
, (IPTR
)_newIconWin__LeftPanelContainerObj
,
763 Child
, (IPTR
) _newIconWin__RootViewObj
,
766 _newIconWin__BottomPanelContainerObj
? Child
: TAG_IGNORE
, (IPTR
)_newIconWin__BottomPanelContainerObj
,
770 TAG_MORE
, (IPTR
) message
->ops_AttrList
775 SETUP_ICONWINDOW_INST_DATA
;
777 D(bug("[Wanderer:IconWindow] %s: SELF = 0x%p\n", __PRETTY_FUNCTION__
, self
));
779 data
->iwd_VolViewMode
= _newIconWin__VOLVIEWMODE
;
781 data
->iwd_Screen
= _newIconWin__Screen
;
782 data
->iwd_Title
= _newIconWin__Title
;
784 data
->iwd_RootViewObj
= _newIconWin__RootViewObj
;
785 data
->iwd_IconListObj
= _newIconWin__IconListObj
;
787 SET(data
->iwd_RootViewObj
, MUIA_IconWindow_Window
, self
);
789 data
->iwd_ActionHook
= actionHook
;
791 data
->iwd_TopPanel
.iwp_PanelGroupObj
= _newIconWin__TopPanelRootGroupObj
;
792 data
->iwd_TopPanel
.iwp_PanelContainerObj
= _newIconWin__TopPanelContainerObj
;
793 data
->iwd_TopPanel
.iwp_PanelGroupSpacerObj
= _newIconWin__TopPanelSpacerObj
;
795 data
->iwd_LeftPanel
.iwp_PanelGroupObj
= _newIconWin__LeftPanelRootGroupObj
;
796 data
->iwd_LeftPanel
.iwp_PanelContainerObj
= _newIconWin__LeftPanelContainerObj
;
797 data
->iwd_LeftPanel
.iwp_PanelGroupSpacerObj
= _newIconWin__LeftPanelSpacerObj
;
799 data
->iwd_BottomPanel
.iwp_PanelGroupObj
= _newIconWin__BottomPanelRootGroupObj
;
800 data
->iwd_BottomPanel
.iwp_PanelContainerObj
= _newIconWin__BottomPanelContainerObj
;
801 data
->iwd_BottomPanel
.iwp_PanelGroupSpacerObj
= _newIconWin__BottomPanelSpacerObj
;
805 data
->iwd_Flags
|= (isRoot
) ? IWDFLAG_ISROOT
: 0;
806 data
->iwd_Flags
|= (isBackdrop
) ? IWDFLAG_ISBACKDROP
: 0;
808 data
->iwd_ViewSettings_Attrib
= (data
->iwd_Flags
& IWDFLAG_ISROOT
)
812 data
->iwd_FSNotifyPort
= _newIconWin__FSNotifyPort
;
817 data
->iwd_PrefsUpdated_hook
.h_Entry
= ( HOOKFUNC
)IconWindow__HookFunc_PrefsUpdatedFunc
;
819 data
->iwd_PrefsUpdated_hook
= &iwd_PrefsUpdated_hook
;
824 prefs
, MUIM_Notify
, MUIA_WandererPrefs_Processing
, FALSE
,
826 MUIM_CallHook
, &data
->iwd_PrefsUpdated_hook
, (IPTR
)CLASS
829 data
->iwd_ViewSettings_PrefsNotificationObject
= (Object
*) DoMethod(prefs
,
830 MUIM_WandererPrefs_ViewSettings_GetNotifyObject
,
831 data
->iwd_ViewSettings_Attrib
);
832 data
->iwd_WindowFont
= (struct TextFont
*)DoMethod(prefs
, MUIM_WandererPrefs_ViewSettings_GetAttribute
,
833 data
->iwd_ViewSettings_Attrib
, MUIA_IconWindow_Font
);
834 SET(data
->iwd_IconListObj
, MUIA_Font
, data
->iwd_WindowFont
);
838 data
->iwd_ProcessBackground_hook
.h_Entry
= ( HOOKFUNC
)IconWindow__HookFunc_ProcessBackgroundFunc
;
840 data
->iwd_ProcessBackground_hook
= &iwd_ProcessBackground_hook
;
843 if ((data
->iwd_BackFill_hook
= _newIconWin__BackFillHook
))
845 data
->iwd_BackFillHookData
.bfhd_IWClass
= CLASS
;
846 data
->iwd_BackFillHookData
.bfhd_IWObject
= self
;
847 data
->iwd_BackFill_hook
->h_Data
= &data
->iwd_BackFillHookData
;
850 ForeachNode(&iconwindow_Extensions
, iw_Extension
)
852 D(bug("[Wanderer:IconWindow] %s: Setting up '%s' @ %p\n", __PRETTY_FUNCTION__
, iw_Extension
->iwe_Node
.ln_Name
, iw_Extension
));
853 iw_Extension
->iwe_Setup(CLASS
, self
, message
);
856 data
->iwd_Flags
|= IWDFLAG_SETUP
;
858 /* If double clicked then we call our own private methods, that's
859 easier then using Hooks */
862 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_DoubleClick
, TRUE
,
863 (IPTR
) self
, 1, MUIM_IconWindow_DoubleClicked
866 /* notify when icons dropped on another (wanderer) window */
869 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_IconsDropped
, MUIV_EveryTime
,
870 (IPTR
) self
, 1, MUIM_IconWindow_IconsDropped
873 /* notify when icons dropped on custom application */
876 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_AppWindowDrop
, MUIV_EveryTime
,
877 (IPTR
) self
, 1, MUIM_IconWindow_AppWindowDrop
882 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_Clicked
, MUIV_EveryTime
,
883 (IPTR
) self
, 1, MUIM_IconWindow_Clicked
886 D(bug("[Wanderer:IconWindow] obj = %ld\n", self
));
892 IPTR
IconWindow__OM_DISPOSE(Class
*CLASS
, Object
*self
, Msg message
)
894 SETUP_ICONWINDOW_INST_DATA
;
896 struct iconWindow_Extension
*iw_Extension
= NULL
;
897 Object
*prefs
= NULL
;
899 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
906 MUIM_KillNotifyObj
, MUIA_WandererPrefs_Processing
, (IPTR
) self
909 if (data
->iwd_Flags
& IWDFLAG_SETUP
)
911 ForeachNode(&iconwindow_Extensions
, iw_Extension
)
913 D(bug("[Wanderer:IconWindow] %s: Cleanup '%s'\n", __PRETTY_FUNCTION__
, iw_Extension
->iwe_Node
.ln_Name
));
914 iw_Extension
->iwe_Cleanup(CLASS
, self
, message
);
919 if (data
->iwd_BackFill_hook
)
920 FreeVec(data
->iwd_BackFill_hook
);
922 return DoSuperMethodA(CLASS
, self
, message
);
927 IPTR
IconWindow__OM_SET(Class
*CLASS
, Object
*self
, struct opSet
*message
)
929 SETUP_ICONWINDOW_INST_DATA
;
931 struct iconWindow_Extension
*iw_Extension
= NULL
;
933 struct TagItem
*tstate
= message
->ops_AttrList
, *tag
;
934 BOOL UpdateIconlist
= FALSE
;
935 IPTR focusicon
= (IPTR
) NULL
;
938 while ((tag
= NextTagItem((TAGITEM
)&tstate
)) != NULL
)
942 case MUIA_Window_Screen
:
943 D(bug("[Wanderer:IconWindow] %s: MUIA_Window_Screen [screen @ %p]\n", __PRETTY_FUNCTION__
, tag
->ti_Data
));
944 data
->iwd_Screen
= (struct Screen
*) tag
->ti_Tag
;
948 D(bug("[Wanderer:IconWindow] %s: MUIA_ShowMe [%x]\n", __PRETTY_FUNCTION__
, tag
->ti_Data
));
951 struct Screen
*__Wanderer__Screen
= NULL
;
952 GET(_app(self
), MUIA_Wanderer_Screen
, &__Wanderer__Screen
);
953 if (__Wanderer__Screen
!= data
->iwd_Screen
)
955 D(bug("[Wanderer:IconWindow] %s: Screen Changed [old = %p, new = %p]\n", __PRETTY_FUNCTION__
, data
->iwd_Screen
, __Wanderer__Screen
));
956 SET(self
, MUIA_Window_Screen
, __Wanderer__Screen
);
957 if (((data
->iwd_Flags
& IWDFLAG_ISROOT
)) && ((data
->iwd_Flags
& IWDFLAG_ISBACKDROP
)))
959 IPTR _IconWin__NewWindowWidth
= 0;
960 IPTR _IconWin__NewWindowHeight
= 0;
962 IPTR _IconWin__NewWindowLeft
= 0;
964 IPTR _IconWin__NewWindowTop
= 0;
966 D(bug("[Wanderer:IconWindow] %s: Updating Backdrop Window Dimensions\n", __PRETTY_FUNCTION__
));
968 _IconWin__NewWindowWidth
= GetBitMapAttr(__Wanderer__Screen
->RastPort
.BitMap
, BMA_WIDTH
);
969 _IconWin__NewWindowHeight
= GetBitMapAttr(__Wanderer__Screen
->RastPort
.BitMap
, BMA_HEIGHT
);
970 D(bug("[Wanderer:IconWindow] %s: Screen dimensions .. %d x %d\n", __PRETTY_FUNCTION__
, _IconWin__NewWindowWidth
, _IconWin__NewWindowHeight
));
972 _IconWin__NewWindowTop
= __Wanderer__Screen
->BarHeight
+ 1;
974 _IconWin__NewWindowLeft
= 0;
977 _IconWin__NewWindowHeight
-= _IconWin__NewWindowTop
;
979 D(bug("[Wanderer:IconWindow] %s: New Window dimensions .. %d x %d @ %d, %d\n", __PRETTY_FUNCTION__
, _IconWin__NewWindowWidth
, _IconWin__NewWindowHeight
, 0, _IconWin__NewWindowTop
));
981 SET(self
, MUIA_Window_Width
, _IconWin__NewWindowWidth
);
982 SET(self
, MUIA_Window_Height
, _IconWin__NewWindowHeight
);
988 case MUIA_IconWindow_Changed
:
989 data
->iwd_Flags
|= (tag
->ti_Data
) ? IWDFLAG_NEEDSUPDATE
: 0;
992 case MUIA_Window_Open
:
993 D(bug("[Wanderer:IconWindow] %s: MUIA_Window_Open [%ld]\n", __PRETTY_FUNCTION__
, tag
->ti_Data
));
996 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Clear
);
998 rv
= DoSuperMethodA(CLASS
, self
, (Msg
) message
);
999 #if defined(ICONWINDOW_BUFFERLIST)
1000 if (!((data
->iwd_Flags
& IWDFLAG_ISROOT
)))
1002 IPTR CURDISPFLAGS
= NULL
;
1003 GET(data
->iwd_IconListObj
, MUIA_IconList_DisplayFlags
, &CURDISPFLAGS
);
1004 CURDISPFLAGS
|= ICONLIST_DISP_BUFFERED
;
1005 SET(data
->iwd_IconListObj
, MUIA_IconList_DisplayFlags
, CURDISPFLAGS
);
1008 D(bug("[Wanderer:IconWindow] %s: Process the background ..\n", __PRETTY_FUNCTION__
));
1009 DoMethod(self
, MUIM_IconWindow_BackFill_ProcessBackground
, data
->iwd_BackFillInfo
, data
->iwd_RootViewObj
);
1011 D(bug("[Wanderer:IconWindow] %s: Force an update of the list ..\n", __PRETTY_FUNCTION__
));
1012 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Update
);
1013 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Sort
);
1018 case MUIA_Window_Activate
:
1019 if (data
->iwd_IconListObj
)
1020 GET(data
->iwd_IconListObj
, MUIA_IconList_FocusIcon
, &focusicon
);
1024 case MUIA_IconWindow_Font
:
1025 data
->iwd_WindowFont
= (struct TextFont
*)tag
->ti_Data
;
1026 D(bug("[Wanderer:IconWindow] %s: MUIA_IconWindow_Font [font @ 0x%p]\n", __PRETTY_FUNCTION__
, data
->iwd_WindowFont
));
1028 if (!data
->iwd_WindowFont
)
1029 SetFont(_rp(self
), data
->iwd_WindowFont
);
1031 if (data
->iwd_IconListObj
)
1032 SET(data
->iwd_IconListObj
, MUIA_Font
, data
->iwd_WindowFont
);
1036 case MUIA_IconWindow_Location
:
1037 D(bug("[Wanderer:IconWindow] %s: MUIA_IconWindow_Location [drawer '%s']\n", __PRETTY_FUNCTION__
, data
->iwd_DirectoryPath
));
1039 if (!(data
->iwd_Flags
& IWDFLAG_ISROOT
))
1041 strcpy(data
->iwd_DirectoryPath
, (STRPTR
)tag
->ti_Data
);
1042 SET(self
, MUIA_Window_Title
, (IPTR
)data
->iwd_DirectoryPath
);
1043 SET(data
->iwd_IconListObj
, MUIA_IconDrawerList_Drawer
, (IPTR
)data
->iwd_DirectoryPath
);
1047 case MUIA_IconWindow_BackgroundAttrib
:
1048 D(bug("[Wanderer:IconWindow] %s: MUIA_IconWindow_BackgroundAttrib (not implemented)\n", __PRETTY_FUNCTION__
));
1054 rv
= DoSuperMethodA(CLASS
, self
, (Msg
) message
);
1056 if (data
->iwd_Flags
& IWDFLAG_SETUP
)
1058 ForeachNode(&iconwindow_Extensions
, iw_Extension
)
1060 D(bug("[Wanderer:IconWindow] %s: Checking '%s'\n", __PRETTY_FUNCTION__
, iw_Extension
->iwe_Node
.ln_Name
));
1061 iw_Extension
->iwe_Set(CLASS
, self
, message
);
1067 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Update
);
1068 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Sort
);
1073 D(bug("[Wanderer:IconWindow] %s: Updating focused icon (@ 0x%p)\n", __PRETTY_FUNCTION__
, focusicon
));
1074 //MUI_Redraw(data->iwd_IconListObj, MADF_DRAWOBJECT);
1082 IPTR
IconWindow__OM_GET(Class
*CLASS
, Object
*self
, struct opGet
*message
)
1084 SETUP_ICONWINDOW_INST_DATA
;
1085 struct iconWindow_Extension
*iw_Extension
= NULL
;
1086 IPTR
*store
= message
->opg_Storage
;
1089 switch (message
->opg_AttrID
)
1091 case MUIA_IconWindow_Changed
:
1092 *store
= (IPTR
)(data
->iwd_Flags
& IWDFLAG_NEEDSUPDATE
);
1095 case MUIA_IconWindow_Window
:
1096 *store
= (IPTR
)self
;
1099 case MUIA_IconWindow_Location
:
1100 *store
= !(data
->iwd_Flags
& IWDFLAG_ISROOT
)
1101 ? XGET(data
->iwd_IconListObj
, MUIA_IconDrawerList_Drawer
)
1105 case MUIA_IconWindow_IconList
:
1106 *store
= (IPTR
)data
->iwd_IconListObj
;
1109 case MUIA_IconWindow_IsRoot
:
1110 *store
= (IPTR
)(data
->iwd_Flags
& IWDFLAG_ISROOT
);
1113 case MUIA_IconWindow_IsBackdrop
:
1114 *store
= (IPTR
)(data
->iwd_Flags
& IWDFLAG_ISBACKDROP
);
1117 case MUIA_IconWindow_BackFillData
:
1118 *store
= (IPTR
)data
->iwd_BackFillInfo
;
1121 case MUIA_IconWindow_BackgroundAttrib
:
1122 *store
= (IPTR
)data
->iwd_ViewSettings_Attrib
;
1126 *store
= (IPTR
)WIWVERS
;
1130 *store
= (IPTR
)WIWREV
;
1138 rv
= DoSuperMethodA(CLASS
, self
, (Msg
) message
);
1142 ForeachNode(&iconwindow_Extensions
, iw_Extension
)
1144 D(bug("[Wanderer:IconWindow] %s: Checking '%s'\n", __PRETTY_FUNCTION__
, iw_Extension
->iwe_Node
.ln_Name
));
1145 if ((rv
= iw_Extension
->iwe_Get(CLASS
, self
, message
)))
1154 ///IconWindow__MUIM_Window_Setup()
1155 IPTR IconWindow__MUIM_Window_Setup
1157 Class
*CLASS
, Object
*self
, Msg message
1160 SETUP_ICONWINDOW_INST_DATA
;
1162 Object
*prefs
= NULL
;
1164 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1166 if (!DoSuperMethodA(CLASS
, self
, message
)) return FALSE
;
1168 if (iconwindow_BackFill_Active
)
1170 data
->iwd_BackFillInfo
=(struct BackFillInfo
*) DoMethod(self
, MUIM_IconWindow_BackFill_Setup
);
1171 D(bug("[Wanderer:IconWindow] %s: Window BackFill_Data @ 0x%p for '%s'\n", __PRETTY_FUNCTION__
, data
->iwd_BackFillInfo
, iconwindow_BackFill_Active
->bfd_BackFillID
));
1174 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
1176 D(bug("[Wanderer:IconWindow] %s: App PrefsObj @ 0x%p\n", __PRETTY_FUNCTION__
, prefs
));
1178 if ((prefs
) && (data
->iwd_ViewSettings_PrefsNotificationObject
))
1180 D(bug("[Wanderer:IconWindow] %s: Setting up window prefs change hooks\n", __PRETTY_FUNCTION__
));
1182 /* Set-up a hook to call ProcessBackground on prefs notification */
1185 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_Background
, MUIV_EveryTime
,
1187 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1190 if ((data
->iwd_Flags
& IWDFLAG_ISROOT
))
1194 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGRenderMode
, MUIV_EveryTime
,
1196 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1202 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGTileMode
, MUIV_EveryTime
,
1204 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1209 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGXOffset
, MUIV_EveryTime
,
1211 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1216 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGYOffset
, MUIV_EveryTime
,
1218 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1221 /* React to notification on font change */
1224 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindow_Font
, MUIV_EveryTime
,
1226 MUIM_Set
, MUIA_IconWindow_Font
, MUIV_TriggerValue
1231 D(bug("[Wanderer:IconWindow] %s: Setup complete!\n", __PRETTY_FUNCTION__
));
1237 ///IconWindow__MUIM_Window_Cleanup()
1238 IPTR IconWindow__MUIM_Window_Cleanup
1240 Class
*CLASS
, Object
*self
, Msg message
1243 SETUP_ICONWINDOW_INST_DATA
;
1245 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1247 if (data
->iwd_BackFillInfo
)
1249 DoMethod(self
, MUIM_IconWindow_BackFill_Cleanup
, data
->iwd_BackFillInfo
);
1250 data
->iwd_BackFillInfo
= NULL
;
1253 if (data
->iwd_ViewSettings_PrefsNotificationObject
)
1257 data
->iwd_ViewSettings_PrefsNotificationObject
,
1258 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGYOffset
, (IPTR
) self
1263 data
->iwd_ViewSettings_PrefsNotificationObject
,
1264 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGXOffset
, (IPTR
) self
1269 data
->iwd_ViewSettings_PrefsNotificationObject
,
1270 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGTileMode
, (IPTR
) self
1273 if ((data
->iwd_Flags
& IWDFLAG_ISROOT
))
1277 data
->iwd_ViewSettings_PrefsNotificationObject
,
1278 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGRenderMode
, (IPTR
) self
1284 data
->iwd_ViewSettings_PrefsNotificationObject
,
1285 MUIM_KillNotifyObj
, MUIA_Background
, (IPTR
) self
1290 data
->iwd_ViewSettings_PrefsNotificationObject
,
1291 MUIM_KillNotifyObj
, MUIA_IconWindow_Font
, (IPTR
) self
1294 return DoSuperMethodA(CLASS
, self
, message
);
1298 ///IconWindow__MUIM_IconWindow_DoubleClicked()
1299 IPTR IconWindow__MUIM_IconWindow_DoubleClicked
1301 Class
*CLASS
, Object
*self
, Msg message
1304 SETUP_ICONWINDOW_INST_DATA
;
1306 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1308 if (data
->iwd_ActionHook
)
1310 struct IconWindow_ActionMsg msg
;
1311 msg
.type
= ICONWINDOW_ACTION_OPEN
;
1312 msg
.iconlist
= data
->iwd_IconListObj
;
1313 msg
.isroot
= (data
->iwd_Flags
& IWDFLAG_ISROOT
);
1315 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1322 ///IconWindow__MUIM_IconWindow_Clicked()
1323 IPTR IconWindow__MUIM_IconWindow_Clicked
1325 Class
*CLASS
, Object
*self
, Msg message
1328 SETUP_ICONWINDOW_INST_DATA
;
1330 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1332 if (data
->iwd_ActionHook
)
1334 struct IconWindow_ActionMsg msg
;
1335 msg
.type
= ICONWINDOW_ACTION_CLICK
;
1336 msg
.iconlist
= data
->iwd_IconListObj
;
1337 msg
.isroot
= (data
->iwd_Flags
& IWDFLAG_ISROOT
);
1338 GET(data
->iwd_IconListObj
, MUIA_IconList_Clicked
, &msg
.click
);
1339 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1346 ///IconWindow__MUIM_IconWindow_IconsDropped()
1347 IPTR IconWindow__MUIM_IconWindow_IconsDropped
1349 Class
*CLASS
, Object
*self
, Msg message
1352 SETUP_ICONWINDOW_INST_DATA
;
1354 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1356 if (data
->iwd_ActionHook
)
1358 struct IconWindow_ActionMsg msg
;
1359 msg
.type
= ICONWINDOW_ACTION_ICONDROP
;
1360 msg
.iconlist
= data
->iwd_IconListObj
;
1361 msg
.isroot
= (data
->iwd_Flags
& IWDFLAG_ISROOT
);
1362 GET(data
->iwd_IconListObj
, MUIA_IconList_IconsDropped
, &msg
.drop
);
1365 NNSET(data
->iwd_IconListObj
, MUIA_IconList_IconsDropped
, NULL
);
1366 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1374 ///IconWindow__MUIM_IconWindow_AppWindowDrop()
1375 IPTR IconWindow__MUIM_IconWindow_AppWindowDrop
1377 Class
*CLASS
, Object
*self
, Msg message
1380 SETUP_ICONWINDOW_INST_DATA
;
1382 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1384 if (data
->iwd_ActionHook
)
1386 struct IconWindow_ActionMsg msg
;
1387 msg
.type
= ICONWINDOW_ACTION_APPWINDOWDROP
;
1388 msg
.iconlist
= data
->iwd_IconListObj
;
1389 msg
.isroot
= (data
->iwd_Flags
& IWDFLAG_ISROOT
);
1390 GET(data
->iwd_IconListObj
, MUIA_IconList_IconsDropped
, &msg
.drop
);
1391 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1398 ///IconWindow__MUIM_IconWindow_Open()
1399 IPTR IconWindow__MUIM_IconWindow_Open
1401 Class
*CLASS
, Object
*self
, Msg message
1404 // SETUP_ICONWINDOW_INST_DATA;
1406 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1408 if (!XGET(self
, MUIA_Window_Open
))
1410 SET(self
, MUIA_Window_Open
, TRUE
);
1413 D(bug("[Wanderer:IconWindow] %s: Setting window as active ..\n", __PRETTY_FUNCTION__
));
1414 SET(self
, MUIA_Window_Activate
, TRUE
);
1416 D(bug("[Wanderer:IconWindow] %s: All done\n", __PRETTY_FUNCTION__
));
1422 ///IconWindow__MUIM_IconWindow_DirectoryUp()
1423 IPTR IconWindow__MUIM_IconWindow_DirectoryUp
1425 Class
*CLASS
, Object
*self
, Msg message
1428 SETUP_ICONWINDOW_INST_DATA
;
1430 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1432 if (data
->iwd_ActionHook
)
1434 struct IconWindow_ActionMsg msg
;
1435 msg
.type
= ICONWINDOW_ACTION_DIRUP
;
1436 msg
.iconlist
= data
->iwd_IconListObj
;
1437 msg
.isroot
= (data
->iwd_Flags
& IWDFLAG_ISROOT
);
1439 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1447 ///IconWindow__MUIM_IconWindow_UnselectAll()
1448 IPTR IconWindow__MUIM_IconWindow_UnselectAll
1450 Class
*CLASS
, Object
*self
, Msg message
1453 SETUP_ICONWINDOW_INST_DATA
;
1455 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1457 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_UnselectAll
);
1463 ///IconWindow__MUIM_IconWindow_Remove()
1464 IPTR IconWindow__MUIM_IconWindow_Remove
1466 Class
*CLASS
, Object
*self
, Msg message
1469 // SETUP_ICONWINDOW_INST_DATA;
1471 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1474 SET( self
, MUIA_Window_Open
, FALSE
);
1475 DoMethod ( _app(self
), OM_REMMEMBER
, self
);
1476 DisposeObject(self
);
1482 /*** Stubs for Backfill Hooks ******************************************************************/
1483 ///IconWindow__MUIM_IconWindow_BackFill_Register()
1484 IPTR IconWindow__MUIM_IconWindow_BackFill_Register
1486 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_Register
*message
1489 // SETUP_ICONWINDOW_INST_DATA;
1491 D(bug("[Wanderer:IconWindow]: %s('%s')\n", __PRETTY_FUNCTION__
, message
->register_Node
->bfd_BackFillID
));
1493 AddTail(&iconwindow_BackFillNodes
, (struct Node
*)message
->register_Node
);
1494 if (iconwindow_BackFill_Active
== NULL
) iconwindow_BackFill_Active
= message
->register_Node
;
1500 ///IconWindow__MUIM_IconWindow_BackFill_Setup()
1501 IPTR IconWindow__MUIM_IconWindow_BackFill_Setup
1503 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_Setup
*message
1506 // SETUP_ICONWINDOW_INST_DATA;
1508 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1510 if (iconwindow_BackFill_Active
== NULL
) return FALSE
;
1512 return (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_Setup
)(CLASS
, self
, message
);
1516 ///IconWindow__MUIM_IconWindow_BackFill_Cleanup()
1517 IPTR IconWindow__MUIM_IconWindow_BackFill_Cleanup
1519 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_Cleanup
*message
1522 //SETUP_ICONWINDOW_INST_DATA;
1524 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1526 if (iconwindow_BackFill_Active
== NULL
) return FALSE
;
1528 return (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_Cleanup
)(CLASS
, self
, message
);
1532 ///IconWindow__MUIM_IconWindow_BackFill_ProcessBackground()
1533 IPTR IconWindow__MUIM_IconWindow_BackFill_ProcessBackground
1535 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_ProcessBackground
*message
1538 SETUP_ICONWINDOW_INST_DATA
;
1540 IPTR retVal
= (IPTR
)FALSE
;
1542 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1544 if (iconwindow_BackFill_Active
!= NULL
)
1546 D(bug("[Wanderer:IconWindow] %s: Asking module @ 0x%p to process ..\n", __PRETTY_FUNCTION__
, iconwindow_BackFill_Active
));
1547 retVal
= (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_ProcessBackground
)(CLASS
, self
, message
);
1550 if (!retVal
&& (data
->iwd_RootViewObj
!= NULL
))
1552 Object
*IconWindowPB_PrefsObj
= NULL
;
1554 D(bug("[Wanderer:IconWindow] %s: No BackFill module/ module cant render mode\n", __PRETTY_FUNCTION__
));
1555 D(bug("[Wanderer:IconWindow] %s: Using default MUI functions ..\n", __PRETTY_FUNCTION__
));
1557 GET(_app(self
), MUIA_Wanderer_Prefs
, &IconWindowPB_PrefsObj
);
1558 if (IconWindowPB_PrefsObj
)
1560 IPTR IconWindowPB_Background
= 0;
1561 IPTR IconWindowPB_BGMode
= 0;
1562 IPTR IconWindowPB_BGTileMode
= 0;
1564 if ((IconWindowPB_Background
= DoMethod(IconWindowPB_PrefsObj
, MUIM_WandererPrefs_ViewSettings_GetAttribute
, data
->iwd_ViewSettings_Attrib
, MUIA_Background
)) != -1)
1566 char *bgmode_string
;
1569 if ((IconWindowPB_BGMode
= DoMethod(IconWindowPB_PrefsObj
, MUIM_WandererPrefs_ViewSettings_GetAttribute
,
1570 data
->iwd_ViewSettings_Attrib
, MUIA_IconWindowExt_ImageBackFill_BGRenderMode
)) == -1)
1571 IconWindowPB_BGMode
= IconWindowExt_ImageBackFill_RenderMode_Tiled
;
1573 if ((IconWindowPB_BGTileMode
= DoMethod(IconWindowPB_PrefsObj
, MUIM_WandererPrefs_ViewSettings_GetAttribute
,
1574 data
->iwd_ViewSettings_Attrib
, MUIA_IconWindowExt_ImageBackFill_BGTileMode
)) == -1)
1575 IconWindowPB_BGTileMode
= IconWindowExt_ImageBackFill_TileMode_Float
;
1577 SET(data
->iwd_RootViewObj
, MUIA_Background
, IconWindowPB_Background
);
1579 bgmode_string
=(STRPTR
) IconWindowPB_Background
;
1580 this_mode
= bgmode_string
[0] - 48;
1582 D(bug("[Wanderer:IconWindow] %s: MUI BG Mode = %d\n", __PRETTY_FUNCTION__
, this_mode
));
1588 if (IconWindowPB_BGMode
== IconWindowExt_ImageBackFill_RenderMode_Scale
)
1590 SET(data
->iwd_RootViewObj
, MUIA_IconListview_ScaledBackground
, TRUE
);
1594 SET(data
->iwd_RootViewObj
, MUIA_IconListview_ScaledBackground
, FALSE
);
1598 if (IconWindowPB_BGTileMode
== IconWindowExt_ImageBackFill_TileMode_Fixed
)
1599 SET(data
->iwd_RootViewObj
, MUIA_IconListview_FixedBackground
, TRUE
);
1601 SET(data
->iwd_RootViewObj
, MUIA_IconListview_FixedBackground
, FALSE
);
1613 ///IconWindow__MUIM_IconWindow_BackFill_DrawBackground()
1614 IPTR IconWindow__MUIM_IconWindow_BackFill_DrawBackground
1616 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_DrawBackground
*message
1619 // SETUP_ICONWINDOW_INST_DATA;
1621 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1623 if (iconwindow_BackFill_Active
== NULL
) return FALSE
;
1625 return (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_DrawBackground
)(CLASS
, self
, message
);
1629 ///IconWindow__MUIM_IconWindow_RateLimitRefresh()
1630 IPTR IconWindow__MUIM_IconWindow_RateLimitRefresh
1632 Class
*CLASS
, Object
*self
, Msg message
1635 Object
* iconList
= NULL
;
1637 GET(self
, MUIA_IconWindow_IconList
, &iconList
);
1639 if (iconList
!= NULL
)
1640 return DoMethod(iconList
, MUIM_IconWindowIconList_RateLimitRefresh
);
1646 ///IconWindow__MUIM_IconWindow_Snapshot()
1647 IPTR IconWindow__MUIM_IconWindow_Snapshot
1649 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_Snapshot
* message
1652 Object
*iconList
= (Object
*) XGET(self
, MUIA_IconWindow_IconList
);
1654 D(bug("[Wanderer:IconWindow]: %s('%s')\n", __PRETTY_FUNCTION__
, dir_name
));
1656 if (message
->snapshotall
== TRUE
)
1658 struct IconList_Entry
*icon_entry
= (IPTR
)MUIV_IconList_NextIcon_Start
;
1659 struct IconEntry
*node
= NULL
;
1660 struct TagItem icon_tags
[] =
1662 { ICONPUTA_OnlyUpdatePosition
, TRUE
},
1665 D(bug("[Wanderer:IconWindow] %s: snapshot ALL\n", __PRETTY_FUNCTION__
));
1669 DoMethod(iconList
, MUIM_IconList_NextIcon
, MUIV_IconList_NextIcon_Visible
, (IPTR
)&icon_entry
);
1671 if ((IPTR
)icon_entry
!= MUIV_IconList_NextIcon_End
)
1673 node
= (struct IconEntry
*)((IPTR
)icon_entry
- ((IPTR
)&node
->ie_IconListEntry
- (IPTR
)node
));
1674 if (node
->ie_Flags
& ICONENTRY_FLAG_HASICON
)
1676 /* Snapshot-all should only save positions of objects that already have icons.
1677 * This is by design and how 3.1 Workbench works. In order to snapshot all objects in window
1678 * regardless if they have icons or not: 1) make all objects visible, 2) select all objects,
1679 * 3) select icon->snapshot */
1680 D(bug("[Wanderer:IconWindow] %s: SNAPSHOT entry = '%s' @ %p, (%p)\n", __PRETTY_FUNCTION__
,
1681 icon_entry
->ile_IconEntry
->ie_IconNode
.ln_Name
, icon_entry
, node
));
1682 if (node
->ie_DiskObj
)
1684 node
->ie_DiskObj
->do_CurrentX
= node
->ie_IconX
;
1685 node
->ie_DiskObj
->do_CurrentY
= node
->ie_IconY
;
1686 PutIconTagList(icon_entry
->ile_IconEntry
->ie_IconNode
.ln_Name
, node
->ie_DiskObj
, icon_tags
);
1690 D(bug("[[Wanderer:IconWindow] %s: icon has no diskobj!\n", __PRETTY_FUNCTION__
));
1702 D(bug("[Wanderer:IconWindow] %s: snapshot WINDOW\n", __PRETTY_FUNCTION__
));
1705 IconWindow_StoreSettings(self
);
1712 IPTR
IconWindow__SetupClass()
1714 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1716 NewList(&iconwindow_BackFillNodes
);
1717 D(bug("[Wanderer:IconWindow] %s: iconwindow_BackFillNodes @ %p\n", __PRETTY_FUNCTION__
, &iconwindow_BackFillNodes
));
1718 NewList(&iconwindow_Extensions
);
1719 D(bug("[Wanderer:IconWindow] %s: iconwindow_Extensions @ %p\n", __PRETTY_FUNCTION__
, &iconwindow_Extensions
));
1720 iconwindow_BackFill_Active
= NULL
;
1725 /*** Setup ******************************************************************/
1726 ICONWINDOW_CUSTOMCLASS
1728 IconWindow
, NULL
, MUIC_Window
, NULL
,
1729 OM_NEW
, struct opSet
*,
1731 OM_SET
, struct opSet
*,
1732 OM_GET
, struct opGet
*,
1733 MUIM_Window_Setup
, Msg
,
1734 MUIM_Window_Cleanup
, Msg
,
1735 MUIM_IconWindow_Open
, Msg
,
1736 MUIM_IconWindow_UnselectAll
, Msg
,
1737 MUIM_IconWindow_DoubleClicked
, Msg
,
1738 MUIM_IconWindow_IconsDropped
, Msg
,
1739 MUIM_IconWindow_Clicked
, Msg
,
1740 MUIM_IconWindow_DirectoryUp
, Msg
,
1741 MUIM_IconWindow_AppWindowDrop
, Msg
,
1742 MUIM_IconWindow_Remove
, Msg
,
1743 MUIM_IconWindow_RateLimitRefresh
, Msg
,
1744 MUIM_IconWindow_Snapshot
, struct MUIP_IconWindow_Snapshot
*,
1745 MUIM_IconWindow_BackFill_Register
, struct MUIP_IconWindow_BackFill_Register
*,
1746 MUIM_IconWindow_BackFill_Setup
, struct MUIP_IconWindow_BackFill_Setup
*,
1747 MUIM_IconWindow_BackFill_Cleanup
, struct MUIP_IconWindow_BackFill_Cleanup
*,
1748 MUIM_IconWindow_BackFill_ProcessBackground
, struct MUIP_IconWindow_BackFill_ProcessBackground
*,
1749 MUIM_IconWindow_BackFill_DrawBackground
, struct MUIP_IconWindow_BackFill_DrawBackground
*
1752 ADD2INIT(IconWindow__SetupClass
, 0);
1755 int initIconWindowClass(void)
1757 IPTR ret1
= IconWindow_Initialize();
1759 IPTR ret2
= IconWindow__SetupClass();
1761 IPTR ret3
= ImageBackFill__SetupClass();
1763 if (ret1
&& ret2
&& ret3
)