2 Copyright 2004-2009, The AROS Development Team. All rights reserved.
6 #include "portable_macros.h"
8 #define MUIMASTER_YES_INLINE_STDARG
11 #define ICONWINDOW_OPTION_NOSEARCHBUTTON
12 #define ICONWINDOW_NODETAILVIEWCLASS
13 //#define ICONWINDOW_BUFFERLIST
17 #include <aros/debug.h>
20 #include <exec/types.h>
21 #include <libraries/mui.h>
24 #include <zune/customclasses.h>
26 #include <zune_AROS/customclasses.h>
29 #include <proto/utility.h>
31 #include <proto/graphics.h>
33 #include <proto/exec.h>
34 #include <proto/datatypes.h>
37 #include <proto/dos.h>
39 #include <proto/icon.h>
44 #include <intuition/screens.h>
45 #include <datatypes/pictureclass.h>
46 #include <clib/macros.h>
49 #include <clib/alib_protos.h>
51 #include <prefs/wanderer.h>
53 #include <prefs_AROS/wanderer.h>
56 #if defined(__AMIGA__) && !defined(__PPC__)
57 #define NO_INLINE_STDARG
59 #ifndef _PROTO_INTUITION_H
60 #include <proto/intuition.h>
62 #include <proto/muimaster.h>
64 #include "Classes/iconlist.h"
65 #include "Classes/iconlistview.h"
66 #include "Classes/iconlist_attributes.h"
68 #include "wandererprefs.h"
70 #include "iconwindow.h"
71 #include "iconwindow_attributes.h"
72 #include "iconwindowcontents.h"
73 #include "iconwindowbackfill.h"
79 #define D(x) if (DEBUG) x
81 #define bug DebugPrintF
90 #if defined(ICONWINDOW_NODETAILVIEWCLASS)
91 struct MUI_CustomClass
*IconWindowDetailDrawerList_CLASS
;
94 static char __intern_wintitle_wanderer
[] = "Wanderer";
96 /*** Private Global Data *********************************************************/
98 static struct List iconwindow_BackFillNodes
;
99 struct IconWindow_BackFill_Descriptor
*iconwindow_BackFill_Active
= NULL
;
101 /*** Hook functions *********************************************************/
103 ///IconWindow__HookFunc_ToolbarLocationStringFunc()
106 void, IconWindow__HookFunc_ToolbarLocationStringFunc
,
107 AROS_UFHA(struct Hook
*, hook
, A0
),
108 AROS_UFHA(APTR
*, obj
, A2
),
109 AROS_UFHA(APTR
, param
, A1
)
113 HOOKPROTO(IconWindow__HookFunc_ToolbarLocationStringFunc
, void, APTR
*obj
, APTR param
)
119 Object
*self
= ( Object
*)obj
;
120 Class
*CLASS
= *( Class
**)param
;
122 BPTR fp
= (BPTR
) NULL
;
123 struct FileInfoBlock
*fib
;
125 #warning "stegerg: doesn't allocate fib with AllocDOSObject"
127 SETUP_ICONWINDOW_INST_DATA
;
129 /* Only change dir if it is a valid directory/volume */
130 GET(data
->iwd_Toolbar_LocationStringObj
, MUIA_String_Contents
, &str
);
132 #warning "TODO: Signal that it is a wrong path"
133 /* so that the user understands (here where we abort with return) */
135 fib
= AllocDosObject(DOS_FIB
, NULL
);
139 if (!(fp
= Lock(str
, ACCESS_READ
)))
141 FreeDosObject(DOS_FIB
, fib
);
145 if (!(Examine(fp
, fib
)))
148 FreeDosObject(DOS_FIB
, fib
);
152 /* Change directory! */
153 if (fib
->fib_DirEntryType
>= 0)
154 SET(self
, MUIA_IconWindow_Location
, (IPTR
)str
);
158 FreeDosObject(DOS_FIB
, fib
);
163 MakeStaticHook(iwd_pathStrHook
,IconWindow__HookFunc_ToolbarLocationStringFunc
);
168 ///IconWindow__HookFunc_PrefsUpdatedFunc()
171 void, IconWindow__HookFunc_PrefsUpdatedFunc
,
172 AROS_UFHA(struct Hook
*, hook
, A0
),
173 AROS_UFHA(APTR
*, obj
, A2
),
174 AROS_UFHA(APTR
, param
, A1
)
178 HOOKPROTO(IconWindow__HookFunc_PrefsUpdatedFunc
, void, APTR
*obj
, APTR param
)
183 /* Get our private data */
184 Object
*self
= ( Object
*)obj
;
185 Class
*CLASS
= *( Class
**)param
;
188 SETUP_ICONWINDOW_INST_DATA
;
190 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
193 GET(self
, MUIA_IconWindow_Changed
, &changed_state
);
195 if ((changed_state
) && (data
->iwd_IconListObj
))
197 D(bug("[IconWindow] %s: Window contents have changed .. updating display ..\n", __PRETTY_FUNCTION__
));
198 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Update
);
199 SET(self
, MUIA_IconWindow_Changed
, FALSE
);
205 MakeStaticHook(iwd_PrefsUpdated_hook
,IconWindow__HookFunc_PrefsUpdatedFunc
);
209 ///IconWindow__HookFunc_ProcessBackgroundFunc()
212 void, IconWindow__HookFunc_ProcessBackgroundFunc
,
213 AROS_UFHA(struct Hook
*, hook
, A0
),
214 AROS_UFHA(APTR
*, obj
, A2
),
215 AROS_UFHA(APTR
, param
, A1
)
219 HOOKPROTO(IconWindow__HookFunc_ProcessBackgroundFunc
, void, APTR
*obj
, APTR param
)
224 /* Get our private data */
225 Object
*self
= ( Object
*)obj
,
227 Class
*CLASS
= *( Class
**)param
;
229 SETUP_ICONWINDOW_INST_DATA
;
231 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
233 DoMethod(self
, MUIM_IconWindow_BackFill_ProcessBackground
, data
->iwd_BackFillInfo
, data
->iwd_RootViewObj
);
235 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
239 // BOOL options_changed = FALSE;
240 IPTR prefs_Processing
= 0;
242 GET(prefs
, MUIA_WandererPrefs_Processing
, &prefs_Processing
);
243 if (!prefs_Processing
)
245 #warning "TODO: We arent in prefs-processing so cause an update!"
252 MakeStaticHook(iwd_ProcessBackground_hook
,IconWindow__HookFunc_ProcessBackgroundFunc
);
256 ///IconWindow__HookFunc_WandererBackFillFunc()
259 void, IconWindow__HookFunc_WandererBackFillFunc
,
260 AROS_UFHA(struct Hook
*, hook
, A0
),
261 AROS_UFHA(struct RastPort
*, RP
, A2
),
262 AROS_UFHA(struct BackFillMsg
*, BFM
, A1
)
266 HOOKPROTO(IconWindow__HookFunc_WandererBackFillFunc
, void, struct RastPort
*RP
, struct BackFillMsg
*BFM
)
271 struct IconWindow_BackFillHookData
*HookData
= NULL
;
273 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
275 if ((HookData
= hook
->h_Data
) && (iconwindow_BackFill_Active
!= NULL
))
277 Class
*CLASS
= HookData
->bfhd_IWClass
;
278 Object
*self
= HookData
->bfhd_IWObject
;
280 SETUP_ICONWINDOW_INST_DATA
;
282 struct RastPort
*DrawBackGround_RastPort
= NULL
;
283 struct IconWindowBackFillMsg DrawBackGround_BackFillMsg
;
285 GET(data
->iwd_IconListObj
, MUIA_IconList_BufferRastport
, &DrawBackGround_RastPort
);
287 if (DrawBackGround_RastPort
!= NULL
)
289 if ((DrawBackGround_BackFillMsg
.Layer
= DrawBackGround_RastPort
->Layer
) == NULL
)
291 D(bug("[IconWindow] %s: Rastport Layer = NULL!\n", __PRETTY_FUNCTION__
));
294 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferLeft
, &DrawBackGround_BackFillMsg
.AreaBounds
.MinX
);
295 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferTop
, &DrawBackGround_BackFillMsg
.AreaBounds
.MinY
);
296 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferWidth
, &DrawBackGround_BackFillMsg
.AreaBounds
.MaxX
);
297 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferHeight
, &DrawBackGround_BackFillMsg
.AreaBounds
.MaxY
);
299 DrawBackGround_BackFillMsg
.AreaBounds
.MaxX
+= DrawBackGround_BackFillMsg
.AreaBounds
.MinX
- 1;
300 DrawBackGround_BackFillMsg
.AreaBounds
.MaxY
+= DrawBackGround_BackFillMsg
.AreaBounds
.MinY
- 1;
302 DrawBackGround_BackFillMsg
.DrawBounds
.MinX
= BFM
->Bounds
.MinX
;
303 DrawBackGround_BackFillMsg
.DrawBounds
.MinY
= BFM
->Bounds
.MinY
;
304 DrawBackGround_BackFillMsg
.DrawBounds
.MaxX
= BFM
->Bounds
.MaxX
;
305 DrawBackGround_BackFillMsg
.DrawBounds
.MaxY
= BFM
->Bounds
.MaxY
;
307 /* Offset into source image (ala scroll bar position) */
308 DrawBackGround_BackFillMsg
.OffsetX
= BFM
->OffsetX
;
309 DrawBackGround_BackFillMsg
.OffsetY
= BFM
->OffsetY
;
310 DoMethod(self
, MUIM_IconWindow_BackFill_DrawBackground
, data
->iwd_BackFillInfo
, &DrawBackGround_BackFillMsg
, DrawBackGround_RastPort
);
318 MakeStaticHook(Hook_WandererBackFillFunc
,IconWindow__HookFunc_WandererBackFillFunc
);
322 /*** Methods ****************************************************************/
323 ///IconWindow__SetupToolbar()
324 void IconWindow__SetupToolbar(Class
*CLASS
, Object
*self
, Object
*prefs
)
326 SETUP_ICONWINDOW_INST_DATA
;
328 Object
*strObj
= NULL
,
330 Object
*toolbarPanel
;
331 Object
*bt_search
= NULL
;
332 #if !defined(ICONWINDOW_OPTION_NOSEARCHBUTTON)
333 Object
*bt_search
= ImageButton("", "THEME:Images/Gadgets/Prefs/Test");
337 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
338 D(bug("[IconWindow] %s: App PrefsObj @ 0x%p\n", __PRETTY_FUNCTION__
, prefs
));
342 data
->iwd_Toolbar_PrefsNotificationObject
=(Object
*) DoMethod(prefs
,
343 MUIM_WandererPrefs_ViewSettings_GetNotifyObject
,
345 //Set up our prefs notification handlers ..
349 /* Create the "ToolBar" panel object .. */
350 toolbarPanel
= MUI_NewObject(MUIC_Group
,
354 MUIA_InnerBottom
,(0),
355 MUIA_Frame
, MUIV_Frame_None
,
356 Child
, (IPTR
)MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
360 MUIA_InnerBottom
,(4),
361 MUIA_Frame
, MUIV_Frame_None
,
363 Child
, (IPTR
)MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
367 MUIA_InnerBottom
,(0),
369 Child
, (IPTR
)( strObj
= MUI_NewObject(MUIC_String
,
370 MUIA_String_Contents
, (IPTR
)"",
372 MUIA_Frame
, MUIV_Frame_String
,
375 Child
, (IPTR
)MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
379 MUIA_InnerBottom
,(0),
381 MUIA_VertWeight
, 100,
382 Child
, (IPTR
) (bt_dirup
= ImageButton("", "THEME:Images/Gadgets/Prefs/Revert")),
383 (bt_search
? Child
: TAG_IGNORE
), (IPTR
) (bt_search
),
386 Child
, (IPTR
)MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
390 MUIA_InnerBottom
,(0),
391 MUIA_Group_Spacing
, 0,
393 MUIA_Frame
, MUIV_Frame_None
,
394 MUIA_Background
, MUII_SHADOW
,
395 Child
, (IPTR
)MUI_NewObject(MUIC_Rectangle
,
396 MUIA_Frame
, MUIV_Frame_None
,
401 /* Got a toolbarpanel? setup notifies and other values are
402 copied to the data of the object */
403 if ( toolbarPanel
!= NULL
)
405 SET(bt_dirup
, MUIA_Background
, XGET( toolbarPanel
, MUIA_Background
) );
406 SET(bt_dirup
, MUIA_CycleChain
, 1);
407 SET(bt_dirup
, MUIA_Frame
, MUIV_Frame_None
);
408 #if !defined(ICONWINDOW_OPTION_NOSEARCHBUTTON)
409 SET(bt_search
, MUIA_Background
, XGET( toolbarPanel
, MUIA_Background
) );
410 SET(bt_search
, MUIA_CycleChain
, 1);
411 SET(bt_search
, MUIA_Frame
, MUIV_Frame_None
);
414 if (DoMethod( data
->iwd_ExtensionGroupObj
, MUIM_Group_InitChange
))
416 DoMethod(data
->iwd_ExtensionGroupObj
, OM_ADDMEMBER
, (IPTR
)toolbarPanel
);
417 if (data
->iwd_ExtensionGroupSpacerObj
)
419 DoMethod(data
->iwd_ExtensionGroupObj
, OM_REMMEMBER
, (IPTR
)data
->iwd_ExtensionGroupSpacerObj
);
420 data
->iwd_ExtensionGroupSpacerObj
= NULL
;
423 DoMethod(data
->iwd_ExtensionGroupObj
, MUIM_Group_ExitChange
);
424 data
->iwd_Toolbar_PanelObj
= toolbarPanel
;
427 if (data
->iwd_Toolbar_PanelObj
)
430 bt_dirup
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
431 (IPTR
)self
, 1, MUIM_IconWindow_DirectoryUp
434 data
->iwd_Toolbar_LocationStringObj
= strObj
;
436 data
->iwd_pathStrHook
.h_Entry
= ( HOOKFUNC
)IconWindow__HookFunc_ToolbarLocationStringFunc
;
438 data
->iwd_pathStrHook
= &iwd_pathStrHook
;
442 data
->iwd_Toolbar_LocationStringObj
, MUIA_String_Contents
,
443 XGET(data
->iwd_IconListObj
, MUIA_IconDrawerList_Drawer
)
446 /* Make changes to string contents change dir on enter */
448 strObj
, MUIM_Notify
, MUIA_String_Acknowledge
, MUIV_EveryTime
,
449 (IPTR
)self
, 3, MUIM_CallHook
, &data
->iwd_pathStrHook
, (IPTR
)CLASS
455 data
->iwd_Toolbar_PanelObj
= NULL
;
461 Object
*IconWindow__OM_NEW(Class
*CLASS
, Object
*self
, struct opSet
*message
)
463 struct Screen
*_newIconWin__Screen
= NULL
;
464 Object
*_newIconWin__IconListObj
= NULL
,
465 *_newIconWin__RootViewObj
= NULL
,
466 *_newIconWin__ExtensionContainerObj
= NULL
, // around extension group
467 *_newIconWin__ExtensionGroupObj
= NULL
, // extension group top
468 *_newIconWin__ExtensionGroupSpacerObj
= NULL
, // extension group top
471 char *_newIconWin__Title
= NULL
;
473 UBYTE _newIconWin__VOLVIEWMODE
= MUIV_IconWindow_VolumeInfoMode_ShowAllIfNoInfo
;
479 struct Hook
*actionHook
= NULL
;
480 struct TextFont
*_newIconWin__WindowFont
= NULL
;
482 struct Hook
*_newIconWin__BackFillHook
= NULL
;
484 APTR WindowBF_TAG
=(APTR
) TAG_IGNORE
;
486 IPTR _newIconWin__WindowWidth
= 0;
487 IPTR _newIconWin__WindowHeight
= 0;
488 IPTR _newIconWin__WindowLeft
= 0;
489 IPTR _newIconWin__WindowTop
= 0;
491 IPTR _newIconWin__FSNotifyPort
=(IPTR
) NULL
;
492 struct MUI_CustomClass
*iconviewclass
= NULL
;
493 #if defined(ICONWINDOW_NODETAILVIEWCLASS)
494 IconWindowDetailDrawerList_CLASS
= IconWindowIconDrawerList_CLASS
;
497 D(bug("[iconwindow]: %s()\n", __PRETTY_FUNCTION__
));
499 /* More than one GetTagData is not very efficient, however since this isn't called very often... */
500 isBackdrop
= (BOOL
)GetTagData(MUIA_IconWindow_IsBackdrop
, (IPTR
)FALSE
, message
->ops_AttrList
);
502 if (!(isRoot
= (BOOL
)GetTagData(MUIA_IconWindow_IsRoot
, (IPTR
)FALSE
, message
->ops_AttrList
)))
503 hasToolbar
= (BOOL
)GetTagData(MUIA_IconWindowExt_Toolbar_Enabled
, (IPTR
)FALSE
, message
->ops_AttrList
);
505 actionHook
= (struct Hook
*)GetTagData(MUIA_IconWindow_ActionHook
, (IPTR
) NULL
, message
->ops_AttrList
);
506 _newIconWin__WindowFont
= (struct TextFont
*)GetTagData(MUIA_IconWindow_Font
, (IPTR
) NULL
, message
->ops_AttrList
);
507 prefs
= (Object
*)GetTagData(MUIA_Wanderer_Prefs
, (IPTR
) NULL
, message
->ops_AttrList
);
509 _newIconWin__FSNotifyPort
= (IPTR
)GetTagData(MUIA_Wanderer_FileSysNotifyPort
, (IPTR
) NULL
, message
->ops_AttrList
);
511 /* Request the screen we should use .. */
512 if (!(_newIconWin__Screen
= (struct Screen
*)GetTagData(MUIA_Wanderer_Screen
, (IPTR
) NULL
, message
->ops_AttrList
)))
514 D(bug("[IconWindow] %s: NO SCREEN SET!\n", __PRETTY_FUNCTION__
));
517 D(bug("[iconwindow] %s: Screen @ 0x%x\n", __PRETTY_FUNCTION__
, _newIconWin__Screen
));
519 if ((_newIconWin__BackFillHook
= AllocVec(sizeof(struct Hook
), MEMF_CLEAR
|MEMF_PUBLIC
))!=NULL
)
521 D(bug("[IconWindow] %s: Allocated WindowBackFillHook @ 0x%p\n", __PRETTY_FUNCTION__
, _newIconWin__BackFillHook
));
524 _newIconWin__BackFillHook
->h_Entry
= ( HOOKFUNC
)IconWindow__HookFunc_WandererBackFillFunc
;
526 _newIconWin__BackFillHook
= &Hook_WandererBackFillFunc
;
529 //#if defined(__MORPHOS__)
530 // WindowBF_TAG = MUIA_Window_BackFillHook;
532 WindowBF_TAG
=(APTR
) WA_BackFill
;
538 iconviewclass
= IconWindowIconVolumeList_CLASS
;
539 _newIconWin__IconListObj
= (Object
*)NewObject(iconviewclass
->mcc_Class
, NULL
,
540 MUIA_Font
, (IPTR
)_newIconWin__WindowFont
,
543 _newIconWin__WindowWidth
= GetBitMapAttr(_newIconWin__Screen
->RastPort
.BitMap
, BMA_WIDTH
);
544 _newIconWin__WindowHeight
= GetBitMapAttr(_newIconWin__Screen
->RastPort
.BitMap
, BMA_HEIGHT
);
545 D(bug("[iconwindow] %s: Screen dimensions .. %ld x %ld\n", __PRETTY_FUNCTION__
, _newIconWin__WindowWidth
, _newIconWin__WindowHeight
));
549 D(bug("[iconwindow] %s: BACKDROP ROOT Window\n", __PRETTY_FUNCTION__
));
550 _newIconWin__Title
= NULL
;
554 D(bug("[iconwindow] %s: Plain ROOT Window\n", __PRETTY_FUNCTION__
));
555 _newIconWin__Title
= __intern_wintitle_wanderer
;
558 _newIconWin__WindowTop
= _newIconWin__Screen
->BarHeight
+ 1;
559 _newIconWin__WindowLeft
= 0;
561 _newIconWin__WindowHeight
-= _newIconWin__WindowTop
;
565 struct DiskObject
*drawericon
= NULL
;
566 IPTR geticon_error
= 0, geticon_isdefault
= 0;
567 IPTR _newIconWin__TitleLen
= 0;
568 IPTR current_DispFlags
= 0;
569 IPTR icon__DispFlags
= 0,icon__DispFlagMask
= ~0;
571 _newIconWin__WindowTop
= MUIV_Window_TopEdge_Centered
;
572 _newIconWin__WindowLeft
= MUIV_Window_LeftEdge_Centered
;
573 _newIconWin__WindowWidth
= 300;
574 _newIconWin__WindowHeight
= 300;
576 _newIconWin__Title
= (STRPTR
) GetTagData(MUIA_IconWindow_Location
, (IPTR
)NULL
, message
->ops_AttrList
);
577 _newIconWin__TitleLen
= strlen(_newIconWin__Title
);
579 if (_newIconWin__Title
[_newIconWin__TitleLen
- 1] == ':')
581 D(bug("[iconwindow] %s: Opening Volume Root Window '%s'\n", __PRETTY_FUNCTION__
, _newIconWin__Title
));
585 D(bug("[iconwindow] %s: Opening Drawer Window '%s'\n", __PRETTY_FUNCTION__
, _newIconWin__Title
));
588 drawericon
= GetIconTags(_newIconWin__Title
,
589 ICONGETA_FailIfUnavailable
, FALSE
,
590 ICONGETA_IsDefaultIcon
, &geticon_isdefault
,
591 ICONA_ErrorCode
, &geticon_error
,
594 if ((drawericon
) && (drawericon
->do_DrawerData
))
596 D(bug("[iconwindow] %s: Directory Icon has DRAWER data!\n", __PRETTY_FUNCTION__
));
597 _newIconWin__WindowTop
= drawericon
->do_DrawerData
->dd_NewWindow
.TopEdge
;
598 _newIconWin__WindowLeft
= drawericon
->do_DrawerData
->dd_NewWindow
.LeftEdge
;
599 _newIconWin__WindowWidth
= drawericon
->do_DrawerData
->dd_NewWindow
.Width
;
600 _newIconWin__WindowHeight
= drawericon
->do_DrawerData
->dd_NewWindow
.Height
;
603 iconviewclass
= IconWindowIconDrawerList_CLASS
;
604 if ((drawericon
) && (drawericon
->do_Gadget
.UserData
> 0))
606 D(bug("[iconwindow] %s: Directory Icons has OS 2.x/3.x data: FLAGS %x [\n", __PRETTY_FUNCTION__
, drawericon
->do_DrawerData
->dd_Flags
));
607 switch (drawericon
->do_DrawerData
->dd_Flags
)
616 D(bug("Show only icons"));
617 icon__DispFlags
|= ICONLIST_DISP_SHOWINFO
;
622 D(bug("Show all files"));
623 icon__DispFlagMask
&= ~ICONLIST_DISP_SHOWINFO
;
628 D(bug("Show all files"));
629 icon__DispFlags
|= ICONLIST_DISP_SHOWHIDDEN
;
630 icon__DispFlagMask
&= ~ICONLIST_DISP_SHOWINFO
;
639 D(bug("] VIEWMODES %x [", drawericon
->do_DrawerData
->dd_ViewModes
));
641 switch (drawericon
->do_DrawerData
->dd_ViewModes
)
645 D(bug("Default (inherit from parent)"));
650 D(bug("View as icons"));
655 D(bug("View as text, sorted by name"));
656 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
661 D(bug("View as text, sorted by date"));
662 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
667 D(bug("View as text, sorted by size"));
668 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
673 D(bug("View as text, sorted by type"));
674 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
685 if ((_newIconWin__Title
[_newIconWin__TitleLen
- 1] == ':') &&
686 (((geticon_isdefault
) && (_newIconWin__VOLVIEWMODE
== MUIV_IconWindow_VolumeInfoMode_ShowAllIfNoInfo
)) ||
687 (_newIconWin__VOLVIEWMODE
== MUIV_IconWindow_VolumeInfoMode_ShowAll
)))
689 D(bug("[iconwindow] %s: setting 'SHOW ALL FILES'\n", __PRETTY_FUNCTION__
));
690 icon__DispFlagMask
&= ~ICONLIST_DISP_SHOWINFO
;
693 _newIconWin__IconListObj
= (Object
*) NewObject(iconviewclass
->mcc_Class
, NULL
,
694 MUIA_Font
, (IPTR
)_newIconWin__WindowFont
,
695 MUIA_IconDrawerList_Drawer
, (IPTR
) _newIconWin__Title
,
696 MUIA_Wanderer_FileSysNotifyPort
, _newIconWin__FSNotifyPort
,
699 GET(_newIconWin__IconListObj
, MUIA_IconList_DisplayFlags
, ¤t_DispFlags
);
700 SET(_newIconWin__IconListObj
, MUIA_IconList_DisplayFlags
, ((current_DispFlags
& icon__DispFlagMask
)|icon__DispFlags
));
702 D(bug("[iconwindow] %s: Window Co-ords %d,%d [%d x %d]\n", __PRETTY_FUNCTION__
, _newIconWin__WindowLeft
, _newIconWin__WindowTop
, _newIconWin__WindowWidth
, _newIconWin__WindowHeight
));
704 _newIconWin__ExtensionGroupObj
= MUI_NewObject(MUIC_Group
,
708 MUIA_InnerBottom
,(0),
709 MUIA_Frame
, MUIV_Frame_None
,
710 MUIA_Group_Spacing
, 0,
711 Child
, (_newIconWin__ExtensionGroupSpacerObj
= HSpace(0)),
714 if (_newIconWin__ExtensionGroupObj
)
716 _newIconWin__ExtensionContainerObj
= MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
718 MUIA_HorizWeight
, 100,
720 MUIA_Frame
, MUIV_Frame_None
,
721 MUIA_Group_Spacing
, 3,
722 /* extension on top of the list */
723 Child
, (IPTR
)_newIconWin__ExtensionGroupObj
,
729 _newIconWin__RootViewObj
= (Object
*) IconListviewObject
,
731 MUIA_IconListview_UseWinBorder
, TRUE
,
732 MUIA_IconListview_IconList
, (IPTR
) _newIconWin__IconListObj
,
735 _newIconWin__RootViewObj
= (Object
*) NewObject(IconListview_Class
->mcc_Class
, NULL
,
737 MUIA_IconListview_UseWinBorder
, TRUE
,
738 MUIA_IconListview_IconList
, (IPTR
) _newIconWin__IconListObj
,
743 D(bug("[iconwindow] %s: Font @ 0x%p\n", __PRETTY_FUNCTION__
, _newIconWin__WindowFont
));
746 self
= (Object
*) DoSuperNewTags
750 MUIA_Window_Screen
, _newIconWin__Screen
,
751 MUIA_Window_Backdrop
, isBackdrop
? TRUE
: FALSE
,
752 MUIA_Window_Borderless
, isBackdrop
? TRUE
: FALSE
,
753 MUIA_Window_Width
, _newIconWin__WindowWidth
,
754 MUIA_Window_Height
, _newIconWin__WindowHeight
,
755 MUIA_Window_LeftEdge
, _newIconWin__WindowLeft
,
756 MUIA_Window_TopEdge
, _newIconWin__WindowTop
,
757 (!isBackdrop
) ? MUIA_Window_AltWidth
: TAG_IGNORE
, 100,
758 (!isBackdrop
) ? MUIA_Window_AltHeight
: TAG_IGNORE
, 80,
759 MUIA_Window_Title
, (IPTR
)_newIconWin__Title
,
761 MUIA_Window_DragBar
, (!isBackdrop
) ? TRUE
: FALSE
,
762 MUIA_Window_CloseGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
763 MUIA_Window_SizeGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
764 MUIA_Window_DepthGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
765 #if defined(MUIA_Window_ZoomGadget)
766 MUIA_Window_ZoomGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
768 MUIA_Window_UseBottomBorderScroller
, (!isBackdrop
) ? TRUE
: FALSE
,
769 MUIA_Window_UseRightBorderScroller
, (!isBackdrop
) ? TRUE
: FALSE
,
770 MUIA_Window_IsSubWindow
, TRUE
,
772 WindowBF_TAG
, _newIconWin__BackFillHook
,
774 WindowBF_TAG
, *_newIconWin__BackFillHook
,
776 MUIA_Window_ScreenTitle
, (IPTR
) "",
777 MUIA_Font
, (IPTR
) _newIconWin__WindowFont
,
779 WindowContents
, (IPTR
) MUI_NewObject(MUIC_Group
,
780 MUIA_Group_Spacing
, 0,
781 MUIA_Group_SameSize
, FALSE
,
784 /* "Extension" group */
785 _newIconWin__ExtensionContainerObj
? Child
: TAG_IGNORE
, (IPTR
)_newIconWin__ExtensionContainerObj
,
788 Child
, (IPTR
) _newIconWin__RootViewObj
,
792 TAG_MORE
, (IPTR
) message
->ops_AttrList
795 self
= (Object
*) DoSuperNew(CLASS
, self
,
796 MUIA_Window_Screen
, _newIconWin__Screen
,
797 MUIA_Window_Backdrop
, isBackdrop
? TRUE
: FALSE
,
798 MUIA_Window_Borderless
, isBackdrop
? TRUE
: FALSE
,
799 MUIA_Window_Width
, _newIconWin__WindowWidth
,
800 MUIA_Window_Height
, _newIconWin__WindowHeight
,
801 MUIA_Window_LeftEdge
, _newIconWin__WindowLeft
,
802 MUIA_Window_TopEdge
, _newIconWin__WindowTop
,
803 (!isBackdrop
) ? MUIA_Window_AltWidth
: TAG_IGNORE
, 100,
804 (!isBackdrop
) ? MUIA_Window_AltHeight
: TAG_IGNORE
, 80,
805 MUIA_Window_Title
, (IPTR
)_newIconWin__Title
,
807 MUIA_Window_DragBar
, (!isBackdrop
) ? TRUE
: FALSE
,
808 MUIA_Window_CloseGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
809 MUIA_Window_SizeGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
810 MUIA_Window_DepthGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
811 #if defined(MUIA_Window_ZoomGadget)
812 MUIA_Window_ZoomGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
814 MUIA_Window_UseBottomBorderScroller
, (!isBackdrop
) ? TRUE
: FALSE
,
815 MUIA_Window_UseRightBorderScroller
, (!isBackdrop
) ? TRUE
: FALSE
,
816 MUIA_Window_IsSubWindow
, TRUE
,
818 WindowBF_TAG
, _newIconWin__BackFillHook
,
820 WindowBF_TAG
, *_newIconWin__BackFillHook
,
822 MUIA_Window_ScreenTitle
, (IPTR
) "",
823 MUIA_Font
, (IPTR
) _newIconWin__WindowFont
,
825 WindowContents
, (IPTR
) MUI_NewObject(MUIC_Group
,
826 MUIA_Group_Spacing
, 0,
827 MUIA_Group_SameSize
, FALSE
,
830 /* "Extension" group */
831 _newIconWin__ExtensionContainerObj
? Child
: TAG_IGNORE
, (IPTR
)_newIconWin__ExtensionContainerObj
,
834 Child
, (IPTR
) _newIconWin__RootViewObj
,
838 TAG_MORE
, (IPTR
) message
->ops_AttrList
);
845 SETUP_ICONWINDOW_INST_DATA
;
847 D(bug("[iconwindow] %s: SELF = 0x%p\n", __PRETTY_FUNCTION__
, self
));
849 data
->iwd_Flag_VOLVIEWMODE
= _newIconWin__VOLVIEWMODE
;
851 data
->iwd_Screen
= _newIconWin__Screen
;
853 data
->iwd_Title
= _newIconWin__Title
;
855 data
->iwd_RootViewObj
= _newIconWin__RootViewObj
;
857 data
->iwd_IconListObj
= _newIconWin__IconListObj
;
859 SET(data
->iwd_RootViewObj
, MUIA_IconWindow_Window
, self
);
861 data
->iwd_ActionHook
= actionHook
;
863 data
->iwd_ExtensionGroupObj
= _newIconWin__ExtensionGroupObj
;
864 data
->iwd_ExtensionContainerObj
= _newIconWin__ExtensionContainerObj
;
865 data
->iwd_ExtensionGroupSpacerObj
= _newIconWin__ExtensionGroupSpacerObj
;
867 data
->iwd_Toolbar_PanelObj
= NULL
;
869 data
->iwd_Flag_ISROOT
= isRoot
;
870 data
->iwd_Flag_ISBACKDROP
= isBackdrop
;
872 data
->iwd_WindowFont
= _newIconWin__WindowFont
;
874 data
->iwd_ViewSettings_Attrib
= data
->iwd_Flag_ISROOT
881 data
->iwd_PrefsUpdated_hook
.h_Entry
= ( HOOKFUNC
)IconWindow__HookFunc_PrefsUpdatedFunc
;
883 data
->iwd_PrefsUpdated_hook
= &iwd_PrefsUpdated_hook
;
888 prefs
, MUIM_Notify
, MUIA_WandererPrefs_Processing
, FALSE
,
890 MUIM_CallHook
, &data
->iwd_PrefsUpdated_hook
, (IPTR
)CLASS
893 data
->iwd_ViewSettings_PrefsNotificationObject
= (Object
*) DoMethod(prefs
,
894 MUIM_WandererPrefs_ViewSettings_GetNotifyObject
,
895 data
->iwd_ViewSettings_Attrib
);
897 if (data
->iwd_ExtensionContainerObj
)
901 prefs
, MUIM_Notify
, MUIA_IconWindowExt_Toolbar_Enabled
, MUIV_EveryTime
,
902 (IPTR
)self
, 3, MUIM_Set
, MUIA_IconWindowExt_Toolbar_Enabled
, MUIV_TriggerValue
908 data
->iwd_ProcessBackground_hook
.h_Entry
= ( HOOKFUNC
)IconWindow__HookFunc_ProcessBackgroundFunc
;
910 data
->iwd_ProcessBackground_hook
= &iwd_ProcessBackground_hook
;
913 if ((data
->iwd_BackFill_hook
= _newIconWin__BackFillHook
))
915 data
->iwd_BackFillHookData
.bfhd_IWClass
= CLASS
;
916 data
->iwd_BackFillHookData
.bfhd_IWObject
= self
;
917 data
->iwd_BackFill_hook
->h_Data
= &data
->iwd_BackFillHookData
;
920 /* no tool bar when root */
921 if (!isRoot
&& hasToolbar
&& data
->iwd_ExtensionContainerObj
)
922 IconWindow__SetupToolbar(CLASS
, self
, prefs
);
924 /* If double clicked then we call our own private methods, that's
925 easier then using Hooks */
928 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_DoubleClick
, TRUE
,
929 (IPTR
) self
, 1, MUIM_IconWindow_DoubleClicked
932 /* notify when icons dropped on another (wanderer) window */
935 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_IconsDropped
, MUIV_EveryTime
,
936 (IPTR
) self
, 1, MUIM_IconWindow_IconsDropped
939 /* notify when icons dropped on custom application */
942 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_AppWindowDrop
, MUIV_EveryTime
,
943 (IPTR
) self
, 1, MUIM_IconWindow_AppWindowDrop
948 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_Clicked
, MUIV_EveryTime
,
949 (IPTR
) self
, 1, MUIM_IconWindow_Clicked
952 D(bug("[IconWindow] obj = %ld\n", self
));
958 IPTR
IconWindow__OM_DISPOSE(Class
*CLASS
, Object
*self
, Msg message
)
960 SETUP_ICONWINDOW_INST_DATA
;
962 Object
*prefs
= NULL
;
964 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
971 MUIM_KillNotifyObj
, MUIA_WandererPrefs_Processing
, (IPTR
) self
977 MUIM_KillNotifyObj
, MUIA_IconWindowExt_Toolbar_Enabled
, (IPTR
) self
981 if (data
->iwd_BackFill_hook
)
982 FreeVec(data
->iwd_BackFill_hook
);
984 return DoSuperMethodA(CLASS
, self
, message
);
989 IPTR
IconWindow__OM_SET(Class
*CLASS
, Object
*self
, struct opSet
*message
)
991 SETUP_ICONWINDOW_INST_DATA
;
993 struct TagItem
*tstate
= message
->ops_AttrList
, *tag
;
994 BOOL UpdateIconlist
= FALSE
;
995 IPTR focusicon
= (IPTR
) NULL
;
998 while ((tag
= NextTagItem((TAGITEM
)&tstate
)) != NULL
)
1000 switch (tag
->ti_Tag
)
1002 case MUIA_Window_Screen
:
1003 D(bug("[iconwindow] %s: MUIA_Window_Screen [screen @ %p]\n", __PRETTY_FUNCTION__
, tag
->ti_Data
));
1004 data
->iwd_Screen
= (struct Screen
*) tag
->ti_Tag
;
1008 D(bug("[iconwindow] %s: MUIA_ShowMe [%x]\n", __PRETTY_FUNCTION__
, tag
->ti_Data
));
1009 if ((BOOL
)tag
->ti_Data
== TRUE
)
1011 struct Screen
*__Wanderer__Screen
= NULL
;
1012 GET(_app(self
), MUIA_Wanderer_Screen
, &__Wanderer__Screen
);
1013 if (__Wanderer__Screen
!= data
->iwd_Screen
)
1015 D(bug("[iconwindow] %s: Screen Changed [old = %p, new = %p]\n", __PRETTY_FUNCTION__
, data
->iwd_Screen
, __Wanderer__Screen
));
1016 SET(self
, MUIA_Window_Screen
, __Wanderer__Screen
);
1017 if ((data
->iwd_Flag_ISROOT
) && (data
->iwd_Flag_ISBACKDROP
))
1019 IPTR _IconWin__NewWindowWidth
= 0;
1020 IPTR _IconWin__NewWindowHeight
= 0;
1021 IPTR _IconWin__NewWindowLeft
= 0;
1022 IPTR _IconWin__NewWindowTop
= 0;
1024 D(bug("[iconwindow] %s: Updating Backdrop Window Dimensions\n", __PRETTY_FUNCTION__
));
1026 _IconWin__NewWindowWidth
= GetBitMapAttr(__Wanderer__Screen
->RastPort
.BitMap
, BMA_WIDTH
);
1027 _IconWin__NewWindowHeight
= GetBitMapAttr(__Wanderer__Screen
->RastPort
.BitMap
, BMA_HEIGHT
);
1028 D(bug("[iconwindow] %s: Screen dimensions .. %d x %d\n", __PRETTY_FUNCTION__
, _IconWin__NewWindowWidth
, _IconWin__NewWindowHeight
));
1030 _IconWin__NewWindowTop
= __Wanderer__Screen
->BarHeight
+ 1;
1031 _IconWin__NewWindowLeft
= 0;
1033 _IconWin__NewWindowHeight
-= _IconWin__NewWindowTop
;
1035 D(bug("[iconwindow] %s: New Window dimensions .. %d x %d @ %d, %d\n", __PRETTY_FUNCTION__
, _IconWin__NewWindowWidth
, _IconWin__NewWindowHeight
, _IconWin__NewWindowLeft
, _IconWin__NewWindowTop
));
1037 SET(self
, MUIA_Window_Width
, _IconWin__NewWindowWidth
);
1038 SET(self
, MUIA_Window_Height
, _IconWin__NewWindowHeight
);
1044 case MUIA_IconWindow_Changed
:
1045 data
->iwd_Flag_NEEDSUPDATE
= (BOOL
)tag
->ti_Data
;
1048 case MUIA_Window_Open
:
1049 D(bug("[iconwindow] %s: MUIA_Window_Open [%ld]\n", __PRETTY_FUNCTION__
, tag
->ti_Data
));
1050 if ((BOOL
)tag
->ti_Data
== TRUE
)
1052 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Clear
);
1054 rv
= DoSuperMethodA(CLASS
, self
, (Msg
) message
);
1055 #if defined(ICONWINDOW_BUFFERLIST)
1056 if (!(data
->iwd_Flag_ISROOT
))
1058 IPTR CURDISPFLAGS
= NULL
;
1059 GET(data
->iwd_IconListObj
, MUIA_IconList_DisplayFlags
, &CURDISPFLAGS
);
1060 CURDISPFLAGS
|= ICONLIST_DISP_BUFFERED
;
1061 SET(data
->iwd_IconListObj
, MUIA_IconList_DisplayFlags
, CURDISPFLAGS
);
1064 D(bug("[IconWindow] %s: Process the background ..\n", __PRETTY_FUNCTION__
));
1065 DoMethod(self
, MUIM_IconWindow_BackFill_ProcessBackground
, data
->iwd_BackFillInfo
, data
->iwd_RootViewObj
);
1067 D(bug("[IconWindow] %s: Force an update of the list ..\n", __PRETTY_FUNCTION__
));
1068 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Update
);
1073 case MUIA_Window_Activate
:
1074 if (data
->iwd_IconListObj
)
1075 GET(data
->iwd_IconListObj
, MUIA_IconList_FocusIcon
, &focusicon
);
1079 case MUIA_IconWindow_Font
:
1080 data
->iwd_WindowFont
= (struct TextFont
*)tag
->ti_Data
;
1081 D(bug("[iconwindow] %s: MUIA_IconWindow_Font [font @ 0x%p]\n", __PRETTY_FUNCTION__
, data
->iwd_WindowFont
));
1083 if (!data
->iwd_WindowFont
)
1084 SetFont(_rp(self
), data
->iwd_WindowFont
);
1088 case MUIA_IconWindow_Location
:
1089 D(bug("[iconwindow] %s: MUIA_IconWindow_Location [drawer '%s']\n", __PRETTY_FUNCTION__
, data
->iwd_DirectoryPath
));
1091 if (!data
->iwd_Flag_ISROOT
)
1093 strcpy(data
->iwd_DirectoryPath
, (STRPTR
)tag
->ti_Data
);
1094 SET(self
, MUIA_Window_Title
, (IPTR
)data
->iwd_DirectoryPath
);
1095 SET(data
->iwd_Toolbar_LocationStringObj
, MUIA_String_Contents
, (IPTR
)data
->iwd_DirectoryPath
);
1096 SET(data
->iwd_IconListObj
, MUIA_IconDrawerList_Drawer
, (IPTR
)data
->iwd_DirectoryPath
);
1100 case MUIA_IconWindow_BackgroundAttrib
:
1101 D(bug("[iconwindow] %s: MUIA_IconWindow_BackgroundAttrib (not implemented)\n", __PRETTY_FUNCTION__
));
1104 case MUIA_IconWindowExt_Toolbar_Enabled
:
1105 if ((!(data
->iwd_Flag_ISROOT
)) && (data
->iwd_ExtensionContainerObj
))
1108 if (!(( BOOL
)tag
->ti_Data
))
1110 //Force classic navigation when the toolbar is disabled ..
1111 Object
*prefs
= NULL
;
1113 if (data
->iwd_Toolbar_PanelObj
!= NULL
)
1115 data
->iwd_ExtensionGroupSpacerObj
= HSpace(0);
1117 SET(data
->iwd_ExtensionContainerObj
, MUIA_Frame
, MUIV_Frame_None
);
1118 SET(data
->iwd_ExtensionContainerObj
, MUIA_Group_Spacing
, 0);
1120 if ((data
->iwd_ExtensionGroupSpacerObj
) && (DoMethod(data
->iwd_ExtensionGroupObj
, MUIM_Group_InitChange
)))
1122 DoMethod(data
->iwd_ExtensionGroupObj
, OM_REMMEMBER
, (IPTR
)data
->iwd_Toolbar_PanelObj
);
1123 DoMethod(data
->iwd_ExtensionGroupObj
, OM_ADDMEMBER
, (IPTR
)data
->iwd_ExtensionGroupSpacerObj
);
1124 DoMethod(data
->iwd_ExtensionGroupObj
, MUIM_Group_ExitChange
);
1125 data
->iwd_Toolbar_PanelObj
= NULL
;
1130 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
1132 SET(prefs
, MUIA_IconWindowExt_Toolbar_NavigationMethod
, WPD_NAVIGATION_CLASSIC
);
1137 if (data
->iwd_Toolbar_PanelObj
== NULL
)
1139 Object
*prefs
= NULL
;
1140 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
1141 IconWindow__SetupToolbar(CLASS
, self
, prefs
);
1144 data
->iwd_Flag_EXT_TOOLBARENABLED
= (IPTR
)tag
->ti_Data
;
1151 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Update
);
1153 rv
= DoSuperMethodA(CLASS
, self
, (Msg
) message
);
1157 D(bug("[iconwindow] %s: Updating focused icon (@ 0x%p)\n", __PRETTY_FUNCTION__
, focusicon
));
1158 // MUI_Redraw(data->iwd_IconListObj, MADF_DRAWOBJECT);
1166 IPTR
IconWindow__OM_GET(Class
*CLASS
, Object
*self
, struct opGet
*message
)
1168 SETUP_ICONWINDOW_INST_DATA
;
1170 IPTR
*store
= message
->opg_Storage
;
1173 switch (message
->opg_AttrID
)
1175 case MUIA_IconWindow_Changed
:
1176 *store
= (IPTR
)data
->iwd_Flag_NEEDSUPDATE
;
1179 case MUIA_IconWindow_Window
:
1180 *store
= (IPTR
)self
;
1183 case MUIA_IconWindow_Location
:
1184 *store
= !data
->iwd_Flag_ISROOT
1185 ? XGET(data
->iwd_IconListObj
, MUIA_IconDrawerList_Drawer
)
1189 case MUIA_IconWindow_IconList
:
1190 *store
= (IPTR
)data
->iwd_IconListObj
;
1193 case MUIA_IconWindowExt_Toolbar_Enabled
:
1194 *store
= (IPTR
)data
->iwd_Flag_EXT_TOOLBARENABLED
;
1197 case MUIA_IconWindow_IsRoot
:
1198 *store
= (IPTR
)data
->iwd_Flag_ISROOT
;
1201 case MUIA_IconWindow_IsBackdrop
:
1202 *store
= (IPTR
)data
->iwd_Flag_ISBACKDROP
;
1205 case MUIA_IconWindow_BackFillData
:
1206 *store
= (IPTR
)data
->iwd_BackFillInfo
;
1209 case MUIA_IconWindow_BackgroundAttrib
:
1210 *store
= (IPTR
)data
->iwd_ViewSettings_Attrib
;
1214 rv
= DoSuperMethodA(CLASS
, self
, (Msg
) message
);
1221 ///IconWindow__MUIM_Window_Setup()
1222 IPTR IconWindow__MUIM_Window_Setup
1224 Class
*CLASS
, Object
*self
, Msg message
1227 SETUP_ICONWINDOW_INST_DATA
;
1229 Object
*prefs
= NULL
;
1231 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1233 if (!DoSuperMethodA(CLASS
, self
, message
)) return FALSE
;
1235 if (iconwindow_BackFill_Active
)
1237 data
->iwd_BackFillInfo
=(struct BackFillInfo
*) DoMethod(self
, MUIM_IconWindow_BackFill_Setup
);
1238 D(bug("[iconwindow] %s: Window BackFill_Data @ 0x%p for '%s'\n", __PRETTY_FUNCTION__
, data
->iwd_BackFillInfo
, iconwindow_BackFill_Active
->bfd_BackFillID
));
1241 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
1243 D(bug("[IconWindow] %s: App PrefsObj @ 0x%p\n", __PRETTY_FUNCTION__
, prefs
));
1245 if ((prefs
) && (data
->iwd_ViewSettings_PrefsNotificationObject
))
1247 D(bug("[IconWindow] %s: Setting up window background change hook\n", __PRETTY_FUNCTION__
));
1249 /* Set-up a hook to call ProcessBackground on prefs notification */
1252 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_Background
, MUIV_EveryTime
,
1254 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1257 if (data
->iwd_Flag_ISROOT
)
1261 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGRenderMode
, MUIV_EveryTime
,
1263 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1269 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGTileMode
, MUIV_EveryTime
,
1271 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1276 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGXOffset
, MUIV_EveryTime
,
1278 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1283 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGYOffset
, MUIV_EveryTime
,
1285 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1289 D(bug("[iconwindow] %s: Setup complete!\n", __PRETTY_FUNCTION__
));
1295 ///IconWindow__MUIM_Window_Cleanup()
1296 IPTR IconWindow__MUIM_Window_Cleanup
1298 Class
*CLASS
, Object
*self
, Msg message
1301 SETUP_ICONWINDOW_INST_DATA
;
1303 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1305 if (data
->iwd_BackFillInfo
)
1307 DoMethod(self
, MUIM_IconWindow_BackFill_Cleanup
, data
->iwd_BackFillInfo
);
1308 data
->iwd_BackFillInfo
= NULL
;
1311 if (data
->iwd_ViewSettings_PrefsNotificationObject
)
1315 data
->iwd_ViewSettings_PrefsNotificationObject
,
1316 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGYOffset
, (IPTR
) self
1321 data
->iwd_ViewSettings_PrefsNotificationObject
,
1322 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGXOffset
, (IPTR
) self
1327 data
->iwd_ViewSettings_PrefsNotificationObject
,
1328 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGTileMode
, (IPTR
) self
1331 if (data
->iwd_Flag_ISROOT
)
1335 data
->iwd_ViewSettings_PrefsNotificationObject
,
1336 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGRenderMode
, (IPTR
) self
1342 data
->iwd_ViewSettings_PrefsNotificationObject
,
1343 MUIM_KillNotifyObj
, MUIA_Background
, (IPTR
) self
1346 return DoSuperMethodA(CLASS
, self
, message
);
1350 ///IconWindow__MUIM_IconWindow_DoubleClicked()
1351 IPTR IconWindow__MUIM_IconWindow_DoubleClicked
1353 Class
*CLASS
, Object
*self
, Msg message
1356 SETUP_ICONWINDOW_INST_DATA
;
1358 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1360 if (data
->iwd_ActionHook
)
1362 struct IconWindow_ActionMsg msg
;
1363 msg
.type
= ICONWINDOW_ACTION_OPEN
;
1364 msg
.iconlist
= data
->iwd_IconListObj
;
1365 msg
.isroot
= data
->iwd_Flag_ISROOT
;
1367 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1374 ///IconWindow__MUIM_IconWindow_Clicked()
1375 IPTR IconWindow__MUIM_IconWindow_Clicked
1377 Class
*CLASS
, Object
*self
, Msg message
1380 SETUP_ICONWINDOW_INST_DATA
;
1382 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1384 if (data
->iwd_ActionHook
)
1386 struct IconWindow_ActionMsg msg
;
1387 msg
.type
= ICONWINDOW_ACTION_CLICK
;
1388 msg
.iconlist
= data
->iwd_IconListObj
;
1389 msg
.isroot
= data
->iwd_Flag_ISROOT
;
1390 GET(data
->iwd_IconListObj
, MUIA_IconList_Clicked
, &msg
.click
);
1391 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1398 ///IconWindow__MUIM_IconWindow_IconsDropped()
1399 IPTR IconWindow__MUIM_IconWindow_IconsDropped
1401 Class
*CLASS
, Object
*self
, Msg message
1404 SETUP_ICONWINDOW_INST_DATA
;
1406 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1408 if (data
->iwd_ActionHook
)
1410 struct IconWindow_ActionMsg msg
;
1411 msg
.type
= ICONWINDOW_ACTION_ICONDROP
;
1412 msg
.iconlist
= data
->iwd_IconListObj
;
1413 msg
.isroot
= data
->iwd_Flag_ISROOT
;
1414 GET(data
->iwd_IconListObj
, MUIA_IconList_IconsDropped
, &msg
.drop
);
1415 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1422 ///IconWindow__MUIM_IconWindow_AppWindowDrop()
1423 IPTR IconWindow__MUIM_IconWindow_AppWindowDrop
1425 Class
*CLASS
, Object
*self
, Msg message
1428 SETUP_ICONWINDOW_INST_DATA
;
1430 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1432 if (data
->iwd_ActionHook
)
1434 struct IconWindow_ActionMsg msg
;
1435 msg
.type
= ICONWINDOW_ACTION_APPWINDOWDROP
;
1436 msg
.iconlist
= data
->iwd_IconListObj
;
1437 msg
.isroot
= data
->iwd_Flag_ISROOT
;
1438 GET(data
->iwd_IconListObj
, MUIA_IconList_IconsDropped
, &msg
.drop
);
1439 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1446 ///IconWindow__MUIM_IconWindow_Open()
1447 IPTR IconWindow__MUIM_IconWindow_Open
1449 Class
*CLASS
, Object
*self
, Msg message
1452 // SETUP_ICONWINDOW_INST_DATA;
1454 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1456 if (!XGET(self
, MUIA_Window_Open
))
1458 SET(self
, MUIA_Window_Open
, TRUE
);
1461 D(bug("[IconWindow] %s: Setting window as active ..\n", __PRETTY_FUNCTION__
));
1462 SET(self
, MUIA_Window_Activate
, TRUE
);
1464 D(bug("[IconWindow] %s: All done\n", __PRETTY_FUNCTION__
));
1470 ///IconWindow__MUIM_IconWindow_DirectoryUp()
1471 IPTR IconWindow__MUIM_IconWindow_DirectoryUp
1473 Class
*CLASS
, Object
*self
, Msg message
1476 SETUP_ICONWINDOW_INST_DATA
;
1478 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1480 if (data
->iwd_ActionHook
)
1482 struct IconWindow_ActionMsg msg
;
1483 msg
.type
= ICONWINDOW_ACTION_DIRUP
;
1484 msg
.iconlist
= data
->iwd_IconListObj
;
1485 msg
.isroot
= data
->iwd_Flag_ISROOT
;
1487 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1495 ///IconWindow__MUIM_IconWindow_UnselectAll()
1496 IPTR IconWindow__MUIM_IconWindow_UnselectAll
1498 Class
*CLASS
, Object
*self
, Msg message
1501 SETUP_ICONWINDOW_INST_DATA
;
1503 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1505 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_UnselectAll
);
1511 ///IconWindow__MUIM_IconWindow_Remove()
1512 IPTR IconWindow__MUIM_IconWindow_Remove
1514 Class
*CLASS
, Object
*self
, Msg message
1517 // SETUP_ICONWINDOW_INST_DATA;
1519 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1522 SET( self
, MUIA_Window_Open
, FALSE
);
1523 DoMethod ( _app(self
), OM_REMMEMBER
, self
);
1524 DisposeObject(self
);
1530 /*** Stubs for Backfill Hooks ******************************************************************/
1531 ///IconWindow__MUIM_IconWindow_BackFill_Register()
1532 IPTR IconWindow__MUIM_IconWindow_BackFill_Register
1534 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_Register
*message
1537 // SETUP_ICONWINDOW_INST_DATA;
1539 D(bug("[IconWindow]: %s('%s')\n", __PRETTY_FUNCTION__
, message
->register_Node
->bfd_BackFillID
));
1541 AddTail(&iconwindow_BackFillNodes
, (struct Node
*)message
->register_Node
);
1542 if (iconwindow_BackFill_Active
== NULL
) iconwindow_BackFill_Active
= message
->register_Node
;
1548 ///IconWindow__MUIM_IconWindow_BackFill_Setup()
1549 IPTR IconWindow__MUIM_IconWindow_BackFill_Setup
1551 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_Setup
*message
1554 // SETUP_ICONWINDOW_INST_DATA;
1556 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1558 if (iconwindow_BackFill_Active
== NULL
) return FALSE
;
1560 return (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_Setup
)(CLASS
, self
, message
);
1564 ///IconWindow__MUIM_IconWindow_BackFill_Cleanup()
1565 IPTR IconWindow__MUIM_IconWindow_BackFill_Cleanup
1567 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_Cleanup
*message
1570 //SETUP_ICONWINDOW_INST_DATA;
1572 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1574 if (iconwindow_BackFill_Active
== NULL
) return FALSE
;
1576 return (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_Cleanup
)(CLASS
, self
, message
);
1580 ///IconWindow__MUIM_IconWindow_BackFill_ProcessBackground()
1581 IPTR IconWindow__MUIM_IconWindow_BackFill_ProcessBackground
1583 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_ProcessBackground
*message
1586 SETUP_ICONWINDOW_INST_DATA
;
1588 IPTR retVal
= (IPTR
)FALSE
;
1590 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1592 if (iconwindow_BackFill_Active
!= NULL
)
1594 D(bug("[IconWindow] %s: Asking module @ 0x%p to process ..\n", __PRETTY_FUNCTION__
, iconwindow_BackFill_Active
));
1595 retVal
= (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_ProcessBackground
)(CLASS
, self
, message
);
1598 if ((retVal
== (IPTR
)FALSE
) && (data
->iwd_RootViewObj
!= NULL
))
1600 Object
*IconWindowPB_PrefsObj
= NULL
;
1602 D(bug("[IconWindow] %s: No BackFill module/ module cant render mode\n", __PRETTY_FUNCTION__
));
1603 D(bug("[IconWindow] %s: Using default MUI functions ..\n", __PRETTY_FUNCTION__
));
1605 GET(_app(self
), MUIA_Wanderer_Prefs
, &IconWindowPB_PrefsObj
);
1606 if (IconWindowPB_PrefsObj
)
1608 IPTR IconWindowPB_Background
= 0;
1609 IPTR IconWindowPB_BGMode
= 0;
1610 IPTR IconWindowPB_BGTileMode
= 0;
1612 if ((IconWindowPB_Background
= DoMethod(IconWindowPB_PrefsObj
, MUIM_WandererPrefs_ViewSettings_GetAttribute
, data
->iwd_ViewSettings_Attrib
, MUIA_Background
)) != -1)
1614 char *bgmode_string
;
1617 if ((IconWindowPB_BGMode
= DoMethod(IconWindowPB_PrefsObj
, MUIM_WandererPrefs_ViewSettings_GetAttribute
,
1618 data
->iwd_ViewSettings_Attrib
, MUIA_IconWindowExt_ImageBackFill_BGRenderMode
)) == -1)
1619 IconWindowPB_BGMode
= IconWindowExt_ImageBackFill_RenderMode_Tiled
;
1621 if ((IconWindowPB_BGTileMode
= DoMethod(IconWindowPB_PrefsObj
, MUIM_WandererPrefs_ViewSettings_GetAttribute
,
1622 data
->iwd_ViewSettings_Attrib
, MUIA_IconWindowExt_ImageBackFill_BGTileMode
)) == -1)
1623 IconWindowPB_BGTileMode
= IconWindowExt_ImageBackFill_TileMode_Float
;
1625 SET(data
->iwd_RootViewObj
, MUIA_Background
, IconWindowPB_Background
);
1627 bgmode_string
=(STRPTR
) IconWindowPB_Background
;
1628 this_mode
= bgmode_string
[0] - 48;
1630 D(bug("[IconWindow] %s: MUI BG Mode = %d\n", __PRETTY_FUNCTION__
, this_mode
));
1636 if (IconWindowPB_BGMode
== IconWindowExt_ImageBackFill_RenderMode_Scale
)
1638 SET(data
->iwd_RootViewObj
, MUIA_IconListview_ScaledBackground
, TRUE
);
1642 SET(data
->iwd_RootViewObj
, MUIA_IconListview_ScaledBackground
, FALSE
);
1646 if (IconWindowPB_BGTileMode
== IconWindowExt_ImageBackFill_TileMode_Fixed
)
1647 SET(data
->iwd_RootViewObj
, MUIA_IconListview_FixedBackground
, TRUE
);
1649 SET(data
->iwd_RootViewObj
, MUIA_IconListview_FixedBackground
, FALSE
);
1661 ///IconWindow__MUIM_IconWindow_BackFill_DrawBackground()
1662 IPTR IconWindow__MUIM_IconWindow_BackFill_DrawBackground
1664 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_DrawBackground
*message
1667 // SETUP_ICONWINDOW_INST_DATA;
1669 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1671 if (iconwindow_BackFill_Active
== NULL
) return FALSE
;
1673 return (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_DrawBackground
)(CLASS
, self
, message
);
1678 IPTR
IconWindow__SetupClass()
1680 D(bug("[IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1682 NewList(&iconwindow_BackFillNodes
);
1683 iconwindow_BackFill_Active
= NULL
;
1688 /*** Setup ******************************************************************/
1689 ICONWINDOW_CUSTOMCLASS
1691 IconWindow
, NULL
, MUIC_Window
, NULL
,
1692 OM_NEW
, struct opSet
*,
1694 OM_SET
, struct opSet
*,
1695 OM_GET
, struct opGet
*,
1696 MUIM_Window_Setup
, Msg
,
1697 MUIM_Window_Cleanup
, Msg
,
1698 MUIM_IconWindow_Open
, Msg
,
1699 MUIM_IconWindow_UnselectAll
, Msg
,
1700 MUIM_IconWindow_DoubleClicked
, Msg
,
1701 MUIM_IconWindow_IconsDropped
, Msg
,
1702 MUIM_IconWindow_Clicked
, Msg
,
1703 MUIM_IconWindow_DirectoryUp
, Msg
,
1704 MUIM_IconWindow_AppWindowDrop
, Msg
,
1705 MUIM_IconWindow_Remove
, Msg
,
1706 MUIM_IconWindow_BackFill_Register
, struct MUIP_IconWindow_BackFill_Register
*,
1707 MUIM_IconWindow_BackFill_Setup
, struct MUIP_IconWindow_BackFill_Setup
*,
1708 MUIM_IconWindow_BackFill_Cleanup
, struct MUIP_IconWindow_BackFill_Cleanup
*,
1709 MUIM_IconWindow_BackFill_ProcessBackground
, struct MUIP_IconWindow_BackFill_ProcessBackground
*,
1710 MUIM_IconWindow_BackFill_DrawBackground
, struct MUIP_IconWindow_BackFill_DrawBackground
*
1713 ADD2INIT(IconWindow__SetupClass
, 0);
1716 int initIconWindowClass(void)
1718 IPTR ret1
= IconWindow_Initialize();
1720 IPTR ret2
= IconWindow__SetupClass();
1722 IPTR ret3
= ImageBackFill__SetupClass();
1724 if (ret1
&& ret2
&& ret3
)