2 Copyright 2004-2010, The AROS Development Team. All rights reserved.
5 #define DOPENWINDOW(x) /* Window positioning and size */
9 #include "portable_macros.h"
11 #define MUIMASTER_YES_INLINE_STDARG
14 #define ICONWINDOW_NODETAILVIEWCLASS
15 //#define ICONWINDOW_BUFFERLIST
19 #include <aros/debug.h>
22 #include <exec/types.h>
23 #include <libraries/mui.h>
26 #include <zune/customclasses.h>
28 #include <zune_AROS/customclasses.h>
31 #include <proto/utility.h>
33 #include <proto/graphics.h>
35 #include <proto/exec.h>
36 #include <proto/datatypes.h>
39 #include <proto/dos.h>
41 #include <proto/icon.h>
46 #include <intuition/screens.h>
47 #include <datatypes/pictureclass.h>
48 #include <clib/macros.h>
51 #include <clib/alib_protos.h>
53 #include <prefs/wanderer.h>
55 #include <prefs_AROS/wanderer.h>
58 #if defined(__AMIGA__) && !defined(__PPC__)
59 #define NO_INLINE_STDARG
61 #ifndef _PROTO_INTUITION_H
62 #include <proto/intuition.h>
64 #include <proto/muimaster.h>
66 #include "Classes/iconlist.h"
67 #include "Classes/iconlistview.h"
68 #include "Classes/iconlist_attributes.h"
70 #include "wandererprefs.h"
72 #include "iconwindow.h"
73 #include "iconwindow_attributes.h"
74 #include "iconwindow_iconlist.h"
75 #include "iconwindowbackfill.h"
81 #define D(x) if (DEBUG) x
83 #define bug DebugPrintF
92 #if defined(ICONWINDOW_NODETAILVIEWCLASS)
93 struct MUI_CustomClass
*IconWindowDetailDrawerList_CLASS
;
99 /*** Private Global Data *********************************************************/
101 static struct List iconwindow_BackFillNodes
;
102 struct List iconwindow_Extensions
;
103 struct IconWindow_BackFill_Descriptor
*iconwindow_BackFill_Active
;
105 static const char __intern_wintitle_wanderer
[] = "Wanderer";
107 /*** Hook functions *********************************************************/
109 ///IconWindow__HookFunc_PrefsUpdatedFunc()
112 void, IconWindow__HookFunc_PrefsUpdatedFunc
,
113 AROS_UFHA(struct Hook
*, hook
, A0
),
114 AROS_UFHA(APTR
*, obj
, A2
),
115 AROS_UFHA(APTR
, param
, A1
)
119 HOOKPROTO(IconWindow__HookFunc_PrefsUpdatedFunc
, void, APTR
*obj
, APTR param
)
124 /* Get our private data */
125 Object
*self
= ( Object
*)obj
;
126 Class
*CLASS
= *( Class
**)param
;
129 SETUP_ICONWINDOW_INST_DATA
;
131 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
134 GET(self
, MUIA_IconWindow_Changed
, &changed_state
);
136 if ((changed_state
) && (data
->iwd_IconListObj
))
138 D(bug("[Wanderer:IconWindow] %s: Window contents have changed .. updating display ..\n", __PRETTY_FUNCTION__
));
139 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Update
);
140 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Sort
);
141 SET(self
, MUIA_IconWindow_Changed
, FALSE
);
147 MakeStaticHook(iwd_PrefsUpdated_hook
,IconWindow__HookFunc_PrefsUpdatedFunc
);
151 ///IconWindow__HookFunc_ProcessBackgroundFunc()
154 void, IconWindow__HookFunc_ProcessBackgroundFunc
,
155 AROS_UFHA(struct Hook
*, hook
, A0
),
156 AROS_UFHA(APTR
*, obj
, A2
),
157 AROS_UFHA(APTR
, param
, A1
)
161 HOOKPROTO(IconWindow__HookFunc_ProcessBackgroundFunc
, void, APTR
*obj
, APTR param
)
166 /* Get our private data */
167 Object
*self
= ( Object
*)obj
,
169 Class
*CLASS
= *( Class
**)param
;
171 SETUP_ICONWINDOW_INST_DATA
;
173 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
175 DoMethod(self
, MUIM_IconWindow_BackFill_ProcessBackground
, data
->iwd_BackFillInfo
, data
->iwd_RootViewObj
);
177 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
181 //BOOL options_changed = FALSE;
182 IPTR prefs_Processing
= 0;
184 GET(prefs
, MUIA_WandererPrefs_Processing
, &prefs_Processing
);
185 if (!prefs_Processing
)
187 #warning "TODO: We arent in prefs-processing so cause an update!"
194 MakeStaticHook(iwd_ProcessBackground_hook
,IconWindow__HookFunc_ProcessBackgroundFunc
);
198 ///IconWindow__HookFunc_WandererBackFillFunc()
201 void, IconWindow__HookFunc_WandererBackFillFunc
,
202 AROS_UFHA(struct Hook
*, hook
, A0
),
203 AROS_UFHA(struct RastPort
*, RP
, A2
),
204 AROS_UFHA(struct BackFillMsg
*, BFM
, A1
)
208 HOOKPROTO(IconWindow__HookFunc_WandererBackFillFunc
, void, struct RastPort
*RP
, struct BackFillMsg
*BFM
)
213 struct IconWindow_BackFillHookData
*HookData
= NULL
;
215 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
217 if ((HookData
= hook
->h_Data
) && (iconwindow_BackFill_Active
!= NULL
))
219 Class
*CLASS
= HookData
->bfhd_IWClass
;
220 Object
*self
= HookData
->bfhd_IWObject
;
222 SETUP_ICONWINDOW_INST_DATA
;
224 struct RastPort
*DrawBackGround_RastPort
= NULL
;
225 struct IconWindowBackFillMsg DrawBackGround_BackFillMsg
;
227 GET(data
->iwd_IconListObj
, MUIA_IconList_BufferRastport
, &DrawBackGround_RastPort
);
229 if (DrawBackGround_RastPort
!= NULL
)
231 if ((DrawBackGround_BackFillMsg
.Layer
= DrawBackGround_RastPort
->Layer
) == NULL
)
233 D(bug("[Wanderer:IconWindow] %s: Rastport Layer = NULL!\n", __PRETTY_FUNCTION__
));
236 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferLeft
, &DrawBackGround_BackFillMsg
.AreaBounds
.MinX
);
237 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferTop
, &DrawBackGround_BackFillMsg
.AreaBounds
.MinY
);
238 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferWidth
, &DrawBackGround_BackFillMsg
.AreaBounds
.MaxX
);
239 GET(data
->iwd_IconListObj
,MUIA_IconList_BufferHeight
, &DrawBackGround_BackFillMsg
.AreaBounds
.MaxY
);
241 DrawBackGround_BackFillMsg
.AreaBounds
.MaxX
+= DrawBackGround_BackFillMsg
.AreaBounds
.MinX
- 1;
242 DrawBackGround_BackFillMsg
.AreaBounds
.MaxY
+= DrawBackGround_BackFillMsg
.AreaBounds
.MinY
- 1;
244 DrawBackGround_BackFillMsg
.DrawBounds
.MinX
= BFM
->Bounds
.MinX
;
245 DrawBackGround_BackFillMsg
.DrawBounds
.MinY
= BFM
->Bounds
.MinY
;
246 DrawBackGround_BackFillMsg
.DrawBounds
.MaxX
= BFM
->Bounds
.MaxX
;
247 DrawBackGround_BackFillMsg
.DrawBounds
.MaxY
= BFM
->Bounds
.MaxY
;
249 /* Offset into source image (ala scroll bar position) */
250 DrawBackGround_BackFillMsg
.OffsetX
= BFM
->OffsetX
;
251 DrawBackGround_BackFillMsg
.OffsetY
= BFM
->OffsetY
;
252 DoMethod(self
, MUIM_IconWindow_BackFill_DrawBackground
, data
->iwd_BackFillInfo
, &DrawBackGround_BackFillMsg
, DrawBackGround_RastPort
);
260 MakeStaticHook(Hook_WandererBackFillFunc
,IconWindow__HookFunc_WandererBackFillFunc
);
265 Object
*IconWindow__OM_NEW(Class
*CLASS
, Object
*self
, struct opSet
*message
)
267 struct iconWindow_Extension
*iw_Extension
= NULL
;
269 struct Screen
*_newIconWin__Screen
= NULL
;
270 Object
*_newIconWin__IconListObj
= NULL
,
271 *_newIconWin__RootViewObj
= NULL
,
273 *_newIconWin__TopPanelContainerObj
= NULL
,
274 *_newIconWin__TopPanelRootGroupObj
= NULL
,
275 *_newIconWin__TopPanelSpacerObj
= NULL
,
277 *_newIconWin__LeftPanelContainerObj
= NULL
,
278 *_newIconWin__LeftPanelRootGroupObj
= NULL
,
279 *_newIconWin__LeftPanelSpacerObj
= NULL
,
281 *_newIconWin__BottomPanelContainerObj
= NULL
,
282 *_newIconWin__BottomPanelRootGroupObj
= NULL
,
283 *_newIconWin__BottomPanelSpacerObj
= NULL
,
287 char *_newIconWin__Title
= NULL
;
289 UBYTE _newIconWin__VOLVIEWMODE
= MUIV_IconWindow_VolumeInfoMode_ShowAllIfNoInfo
;
294 struct Hook
*actionHook
= NULL
;
295 struct TextFont
*_newIconWin__WindowFont
= NULL
;
297 struct Hook
*_newIconWin__BackFillHook
= NULL
;
299 IPTR WindowBF_TAG
= (IPTR
)TAG_IGNORE
;
301 IPTR _newIconWin__WindowWidth
= 0;
302 IPTR _newIconWin__WindowHeight
= 0;
303 IPTR _newIconWin__WindowLeft
= 0;
304 IPTR _newIconWin__WindowTop
= 0;
306 IPTR _newIconWin__FSNotifyPort
= (IPTR
)NULL
;
307 struct MUI_CustomClass
*iconviewclass
= NULL
;
308 #if defined(ICONWINDOW_NODETAILVIEWCLASS)
309 IconWindowDetailDrawerList_CLASS
= IconWindowDrawerList_CLASS
;
312 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
314 /* More than one GetTagData is not very efficient, however since this isn't called very often... */
315 isBackdrop
= (BOOL
)GetTagData(MUIA_IconWindow_IsBackdrop
, (IPTR
)FALSE
, message
->ops_AttrList
);
317 isRoot
= (BOOL
)GetTagData(MUIA_IconWindow_IsRoot
, (IPTR
)FALSE
, message
->ops_AttrList
);
319 actionHook
= (struct Hook
*)GetTagData(MUIA_IconWindow_ActionHook
, (IPTR
) NULL
, message
->ops_AttrList
);
320 _newIconWin__WindowFont
= (struct TextFont
*)GetTagData(MUIA_IconWindow_Font
, (IPTR
) NULL
, message
->ops_AttrList
);
321 prefs
= (Object
*)GetTagData(MUIA_Wanderer_Prefs
, (IPTR
) NULL
, message
->ops_AttrList
);
323 _newIconWin__FSNotifyPort
= (IPTR
)GetTagData(MUIA_Wanderer_FileSysNotifyPort
, (IPTR
) NULL
, message
->ops_AttrList
);
325 /* Request the screen we should use .. */
326 if (!(_newIconWin__Screen
= (struct Screen
*)GetTagData(MUIA_Wanderer_Screen
, (IPTR
) NULL
, message
->ops_AttrList
)))
328 D(bug("[Wanderer:IconWindow] %s: NO SCREEN SET!\n", __PRETTY_FUNCTION__
));
331 D(bug("[Wanderer:IconWindow] %s: Screen @ 0x%p\n", __PRETTY_FUNCTION__
, _newIconWin__Screen
));
333 if ((_newIconWin__BackFillHook
= AllocVec(sizeof(struct Hook
), MEMF_CLEAR
|MEMF_PUBLIC
))!=NULL
)
335 D(bug("[Wanderer:IconWindow] %s: Allocated WindowBackFillHook @ 0x%p\n", __PRETTY_FUNCTION__
, _newIconWin__BackFillHook
));
338 _newIconWin__BackFillHook
->h_Entry
= ( HOOKFUNC
)IconWindow__HookFunc_WandererBackFillFunc
;
340 _newIconWin__BackFillHook
= &Hook_WandererBackFillFunc
;
343 //#if defined(__MORPHOS__)
344 // WindowBF_TAG = MUIA_Window_BackFillHook;
346 WindowBF_TAG
= (APTR
)WA_BackFill
;
352 iconviewclass
= IconWindowVolumeList_CLASS
;
353 _newIconWin__IconListObj
= (Object
*)NewObject(iconviewclass
->mcc_Class
, NULL
,
354 MUIA_Font
, (IPTR
)_newIconWin__WindowFont
,
357 _newIconWin__WindowWidth
= _newIconWin__Screen
->Width
;
358 _newIconWin__WindowHeight
= _newIconWin__Screen
->Height
;
359 DOPENWINDOW(bug("[Wanderer:IconWindow] %s: Screen dimensions .. %ld x %ld\n", __PRETTY_FUNCTION__
, _newIconWin__WindowWidth
, _newIconWin__WindowHeight
));
363 DOPENWINDOW(bug("[Wanderer:IconWindow] %s: BACKDROP ROOT Window\n", __PRETTY_FUNCTION__
));
364 _newIconWin__Title
= NULL
;
368 DOPENWINDOW(bug("[Wanderer:IconWindow] %s: Plain ROOT Window\n", __PRETTY_FUNCTION__
));
369 _newIconWin__Title
= __intern_wintitle_wanderer
;
372 _newIconWin__WindowTop
= _newIconWin__Screen
->BarHeight
+ 1;
373 _newIconWin__WindowLeft
= 0;
375 _newIconWin__WindowHeight
-= _newIconWin__WindowTop
;
379 struct DiskObject
*drawericon
= NULL
;
380 IPTR geticon_error
= 0, geticon_isdefault
= 0;
381 IPTR _newIconWin__TitleLen
= 0;
382 IPTR current_DispFlags
= 0, current_SortFlags
= 0;
383 IPTR icon__DispFlags
= 0,icon__DispFlagMask
= ~0;
385 _newIconWin__WindowTop
= MUIV_Window_TopEdge_Centered
;
386 _newIconWin__WindowLeft
= MUIV_Window_LeftEdge_Centered
;
387 _newIconWin__WindowWidth
= 300;
388 _newIconWin__WindowHeight
= 300;
390 _newIconWin__Title
= (STRPTR
) GetTagData(MUIA_IconWindow_Location
, (IPTR
)NULL
, message
->ops_AttrList
);
391 _newIconWin__TitleLen
= strlen(_newIconWin__Title
);
393 if (_newIconWin__Title
[_newIconWin__TitleLen
- 1] == ':')
395 D(bug("[Wanderer:IconWindow] %s: Opening Volume Root Window '%s'\n", __PRETTY_FUNCTION__
, _newIconWin__Title
));
399 D(bug("[Wanderer:IconWindow] %s: Opening Drawer Window '%s'\n", __PRETTY_FUNCTION__
, _newIconWin__Title
));
402 drawericon
= GetIconTags(_newIconWin__Title
,
403 ICONGETA_FailIfUnavailable
, FALSE
,
404 ICONGETA_IsDefaultIcon
, &geticon_isdefault
,
405 ICONA_ErrorCode
, &geticon_error
,
408 if ((drawericon
) && (drawericon
->do_DrawerData
))
410 D(bug("[Wanderer:IconWindow] %s: Directory Icon has DRAWER data!\n", __PRETTY_FUNCTION__
));
411 _newIconWin__WindowTop
= drawericon
->do_DrawerData
->dd_NewWindow
.TopEdge
;
412 _newIconWin__WindowLeft
= drawericon
->do_DrawerData
->dd_NewWindow
.LeftEdge
;
413 _newIconWin__WindowWidth
= drawericon
->do_DrawerData
->dd_NewWindow
.Width
;
414 _newIconWin__WindowHeight
= drawericon
->do_DrawerData
->dd_NewWindow
.Height
;
417 iconviewclass
= IconWindowDrawerList_CLASS
;
418 if ((drawericon
) && (drawericon
->do_Gadget
.UserData
> 0))
420 D(bug("[Wanderer:IconWindow] %s: Directory Icons has OS 2.x/3.x data: FLAGS %x [\n", __PRETTY_FUNCTION__
, drawericon
->do_DrawerData
->dd_Flags
));
421 switch (drawericon
->do_DrawerData
->dd_Flags
)
430 D(bug("Show only icons"));
431 icon__DispFlags
|= ICONLIST_DISP_SHOWINFO
;
436 D(bug("Show all files"));
437 icon__DispFlagMask
&= ~ICONLIST_DISP_SHOWINFO
;
442 D(bug("Show all files"));
443 icon__DispFlags
|= ICONLIST_DISP_SHOWHIDDEN
;
444 icon__DispFlagMask
&= ~ICONLIST_DISP_SHOWINFO
;
453 D(bug("] VIEWMODES %x [", drawericon
->do_DrawerData
->dd_ViewModes
));
455 switch (drawericon
->do_DrawerData
->dd_ViewModes
)
459 D(bug("Default (inherit from parent)"));
464 D(bug("View as icons"));
469 D(bug("View as text, sorted by name"));
470 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
475 D(bug("View as text, sorted by date"));
476 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
481 D(bug("View as text, sorted by size"));
482 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
487 D(bug("View as text, sorted by type"));
488 iconviewclass
= IconWindowDetailDrawerList_CLASS
;
499 if ((_newIconWin__Title
[_newIconWin__TitleLen
- 1] == ':') &&
500 (((geticon_isdefault
) && (_newIconWin__VOLVIEWMODE
== MUIV_IconWindow_VolumeInfoMode_ShowAllIfNoInfo
)) ||
501 (_newIconWin__VOLVIEWMODE
== MUIV_IconWindow_VolumeInfoMode_ShowAll
)))
503 D(bug("[Wanderer:IconWindow] %s: setting 'SHOW ALL FILES'\n", __PRETTY_FUNCTION__
));
504 icon__DispFlagMask
&= ~ICONLIST_DISP_SHOWINFO
;
507 _newIconWin__IconListObj
= (Object
*) NewObject(iconviewclass
->mcc_Class
, NULL
,
508 MUIA_Font
, (IPTR
)_newIconWin__WindowFont
,
509 MUIA_IconDrawerList_Drawer
, (IPTR
) _newIconWin__Title
,
510 MUIA_Wanderer_FileSysNotifyPort
, _newIconWin__FSNotifyPort
,
513 GET(_newIconWin__IconListObj
, MUIA_IconList_DisplayFlags
, ¤t_DispFlags
);
514 SET(_newIconWin__IconListObj
, MUIA_IconList_DisplayFlags
, ((current_DispFlags
& icon__DispFlagMask
)|icon__DispFlags
));
516 _newIconWin__TopPanelRootGroupObj
= MUI_NewObject(MUIC_Group
,
520 MUIA_InnerBottom
,(0),
521 MUIA_Frame
, MUIV_Frame_None
,
522 MUIA_Group_Spacing
, 0,
523 Child
, (_newIconWin__TopPanelSpacerObj
= HSpace(0)),
526 if (_newIconWin__TopPanelRootGroupObj
)
528 _newIconWin__TopPanelContainerObj
= MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
531 MUIA_HorizWeight
, 100,
533 MUIA_Frame
, MUIV_Frame_None
,
534 MUIA_Group_Spacing
, 3,
535 Child
, (IPTR
)_newIconWin__TopPanelRootGroupObj
,
539 _newIconWin__BottomPanelRootGroupObj
= MUI_NewObject(MUIC_Group
,
543 MUIA_InnerBottom
,(0),
544 MUIA_Frame
, MUIV_Frame_None
,
545 MUIA_Group_Spacing
, 0,
546 Child
, (_newIconWin__BottomPanelSpacerObj
= HSpace(0)),
549 if (_newIconWin__BottomPanelRootGroupObj
)
551 _newIconWin__BottomPanelContainerObj
= MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
554 MUIA_HorizWeight
, 100,
556 MUIA_Frame
, MUIV_Frame_None
,
557 MUIA_Group_Spacing
, 3,
558 Child
, (IPTR
)_newIconWin__BottomPanelRootGroupObj
,
562 _newIconWin__LeftPanelRootGroupObj
= MUI_NewObject(MUIC_Group
,
566 MUIA_InnerBottom
,(0),
567 MUIA_Frame
, MUIV_Frame_None
,
568 MUIA_Group_Spacing
, 0,
569 Child
, (_newIconWin__LeftPanelSpacerObj
= HVSpace
),
572 if (_newIconWin__LeftPanelRootGroupObj
)
574 _newIconWin__LeftPanelContainerObj
= MUI_NewObject(MUIC_Group
, MUIA_Group_Horiz
, TRUE
,
578 MUIA_VertWeight
, 100,
579 MUIA_Frame
, MUIV_Frame_None
,
580 MUIA_Group_Spacing
, 3,
581 Child
, (IPTR
)_newIconWin__LeftPanelRootGroupObj
,
587 _newIconWin__RootViewObj
= (Object
*) IconListviewObject
,
589 MUIA_IconListview_UseWinBorder
, TRUE
,
590 MUIA_IconListview_IconList
, (IPTR
) _newIconWin__IconListObj
,
593 _newIconWin__RootViewObj
= (Object
*) NewObject(IconListview_Class
->mcc_Class
, NULL
,
595 MUIA_IconListview_UseWinBorder
, TRUE
,
596 MUIA_IconListview_IconList
, (IPTR
) _newIconWin__IconListObj
,
600 DOPENWINDOW(bug("[Wanderer:IconWindow] %s: Window Co-ords %d,%d [%d x %d]\n", __PRETTY_FUNCTION__
, _newIconWin__WindowLeft
, _newIconWin__WindowTop
, _newIconWin__WindowWidth
, _newIconWin__WindowHeight
));
601 D(bug("[Wanderer:IconWindow] %s: Font @ 0x%p\n", __PRETTY_FUNCTION__
, _newIconWin__WindowFont
));
604 self
= (Object
*) DoSuperNewTags
608 MUIA_Window_Screen
, _newIconWin__Screen
,
609 MUIA_Window_Backdrop
, isBackdrop
? TRUE
: FALSE
,
610 MUIA_Window_Borderless
, isBackdrop
? TRUE
: FALSE
,
611 MUIA_Window_Width
, _newIconWin__WindowWidth
,
612 MUIA_Window_Height
, _newIconWin__WindowHeight
,
613 MUIA_Window_LeftEdge
, _newIconWin__WindowLeft
,
614 MUIA_Window_TopEdge
, _newIconWin__WindowTop
,
615 (!isBackdrop
) ? MUIA_Window_AltWidth
: TAG_IGNORE
, 100,
616 (!isBackdrop
) ? MUIA_Window_AltHeight
: TAG_IGNORE
, 80,
617 MUIA_Window_Title
, (IPTR
)_newIconWin__Title
,
619 MUIA_Window_DragBar
, (!isBackdrop
) ? TRUE
: FALSE
,
620 MUIA_Window_CloseGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
621 MUIA_Window_SizeGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
622 MUIA_Window_DepthGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
623 #if defined(MUIA_Window_ZoomGadget)
624 MUIA_Window_ZoomGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
626 MUIA_Window_UseBottomBorderScroller
, (!isBackdrop
) ? TRUE
: FALSE
,
627 MUIA_Window_UseRightBorderScroller
, (!isBackdrop
) ? TRUE
: FALSE
,
628 MUIA_Window_IsSubWindow
, TRUE
,
630 WindowBF_TAG
, _newIconWin__BackFillHook
,
632 MUIA_Window_ScreenTitle
, (IPTR
) "",
633 MUIA_Font
, (IPTR
) _newIconWin__WindowFont
,
635 WindowContents
, (IPTR
) MUI_NewObject(MUIC_Group
,
636 MUIA_Group_Spacing
, 0,
637 MUIA_Group_SameSize
, FALSE
,
640 ((!isRoot
) && _newIconWin__TopPanelContainerObj
) ? Child
: TAG_IGNORE
, (IPTR
)_newIconWin__TopPanelContainerObj
,
643 ((!isRoot
) && _newIconWin__LeftPanelContainerObj
) ? Child
: TAG_IGNORE
, (IPTR
)_newIconWin__LeftPanelContainerObj
,
644 /* The actual icon list */
645 Child
, (IPTR
) _newIconWin__RootViewObj
,
648 ((!isRoot
) && _newIconWin__BottomPanelContainerObj
) ? Child
: TAG_IGNORE
, (IPTR
)_newIconWin__BottomPanelContainerObj
,
652 TAG_MORE
, (IPTR
) message
->ops_AttrList
655 self
= (Object
*) DoSuperNew(CLASS
, self
,
656 MUIA_Window_Screen
, _newIconWin__Screen
,
657 MUIA_Window_Backdrop
, isBackdrop
? TRUE
: FALSE
,
658 MUIA_Window_Borderless
, isBackdrop
? TRUE
: FALSE
,
659 MUIA_Window_Width
, _newIconWin__WindowWidth
,
660 MUIA_Window_Height
, _newIconWin__WindowHeight
,
661 MUIA_Window_LeftEdge
, _newIconWin__WindowLeft
,
662 MUIA_Window_TopEdge
, _newIconWin__WindowTop
,
663 (!isBackdrop
) ? MUIA_Window_AltWidth
: TAG_IGNORE
, 100,
664 (!isBackdrop
) ? MUIA_Window_AltHeight
: TAG_IGNORE
, 80,
665 MUIA_Window_Title
, (IPTR
)_newIconWin__Title
,
667 MUIA_Window_DragBar
, (!isBackdrop
) ? TRUE
: FALSE
,
668 MUIA_Window_CloseGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
669 MUIA_Window_SizeGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
670 MUIA_Window_DepthGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
671 #if defined(MUIA_Window_ZoomGadget)
672 MUIA_Window_ZoomGadget
, (!isBackdrop
) ? TRUE
: FALSE
,
674 MUIA_Window_UseBottomBorderScroller
, (!isBackdrop
) ? TRUE
: FALSE
,
675 MUIA_Window_UseRightBorderScroller
, (!isBackdrop
) ? TRUE
: FALSE
,
676 MUIA_Window_IsSubWindow
, TRUE
,
678 WindowBF_TAG
, *_newIconWin__BackFillHook
,
680 MUIA_Window_ScreenTitle
, (IPTR
) "",
681 MUIA_Font
, (IPTR
) _newIconWin__WindowFont
,
683 WindowContents
, (IPTR
) MUI_NewObject(MUIC_Group
,
684 MUIA_Group_Spacing
, 0,
685 MUIA_Group_SameSize
, FALSE
,
688 /* "Extension" group */
689 _newIconWin__TopPanelContainerObj
? Child
: TAG_IGNORE
, (IPTR
)_newIconWin__TopPanelContainerObj
,
692 Child
, (IPTR
) _newIconWin__RootViewObj
,
696 TAG_MORE
, (IPTR
) message
->ops_AttrList
702 SETUP_ICONWINDOW_INST_DATA
;
704 D(bug("[Wanderer:IconWindow] %s: SELF = 0x%p\n", __PRETTY_FUNCTION__
, self
));
706 data
->iwd_VolViewMode
= _newIconWin__VOLVIEWMODE
;
708 data
->iwd_Screen
= _newIconWin__Screen
;
709 data
->iwd_Title
= _newIconWin__Title
;
711 data
->iwd_RootViewObj
= _newIconWin__RootViewObj
;
712 data
->iwd_IconListObj
= _newIconWin__IconListObj
;
714 SET(data
->iwd_RootViewObj
, MUIA_IconWindow_Window
, self
);
716 data
->iwd_ActionHook
= actionHook
;
718 data
->iwd_TopPanel
.iwp_PanelGroupObj
= _newIconWin__TopPanelRootGroupObj
;
719 data
->iwd_TopPanel
.iwp_PanelContainerObj
= _newIconWin__TopPanelContainerObj
;
720 data
->iwd_TopPanel
.iwp_PanelGroupSpacerObj
= _newIconWin__TopPanelSpacerObj
;
722 data
->iwd_LeftPanel
.iwp_PanelGroupObj
= _newIconWin__LeftPanelRootGroupObj
;
723 data
->iwd_LeftPanel
.iwp_PanelContainerObj
= _newIconWin__LeftPanelContainerObj
;
724 data
->iwd_LeftPanel
.iwp_PanelGroupSpacerObj
= _newIconWin__LeftPanelSpacerObj
;
726 data
->iwd_BottomPanel
.iwp_PanelGroupObj
= _newIconWin__BottomPanelRootGroupObj
;
727 data
->iwd_BottomPanel
.iwp_PanelContainerObj
= _newIconWin__BottomPanelContainerObj
;
728 data
->iwd_BottomPanel
.iwp_PanelGroupSpacerObj
= _newIconWin__BottomPanelSpacerObj
;
732 data
->iwd_Flags
|= (isRoot
) ? IWDFLAG_ISROOT
: 0;
733 data
->iwd_Flags
|= (isBackdrop
) ? IWDFLAG_ISBACKDROP
: 0;
735 data
->iwd_WindowFont
= _newIconWin__WindowFont
;
737 data
->iwd_ViewSettings_Attrib
= (data
->iwd_Flags
& IWDFLAG_ISROOT
)
741 data
->iwd_FSNotifyPort
= _newIconWin__FSNotifyPort
;
746 data
->iwd_PrefsUpdated_hook
.h_Entry
= ( HOOKFUNC
)IconWindow__HookFunc_PrefsUpdatedFunc
;
748 data
->iwd_PrefsUpdated_hook
= &iwd_PrefsUpdated_hook
;
753 prefs
, MUIM_Notify
, MUIA_WandererPrefs_Processing
, FALSE
,
755 MUIM_CallHook
, &data
->iwd_PrefsUpdated_hook
, (IPTR
)CLASS
758 data
->iwd_ViewSettings_PrefsNotificationObject
= (Object
*) DoMethod(prefs
,
759 MUIM_WandererPrefs_ViewSettings_GetNotifyObject
,
760 data
->iwd_ViewSettings_Attrib
);
764 data
->iwd_ProcessBackground_hook
.h_Entry
= ( HOOKFUNC
)IconWindow__HookFunc_ProcessBackgroundFunc
;
766 data
->iwd_ProcessBackground_hook
= &iwd_ProcessBackground_hook
;
769 if ((data
->iwd_BackFill_hook
= _newIconWin__BackFillHook
))
771 data
->iwd_BackFillHookData
.bfhd_IWClass
= CLASS
;
772 data
->iwd_BackFillHookData
.bfhd_IWObject
= self
;
773 data
->iwd_BackFill_hook
->h_Data
= &data
->iwd_BackFillHookData
;
776 ForeachNode(&iconwindow_Extensions
, iw_Extension
)
778 D(bug("[Wanderer:IconWindow] %s: Setting up '%s' @ %p\n", __PRETTY_FUNCTION__
, iw_Extension
->iwe_Node
.ln_Name
, iw_Extension
));
779 iw_Extension
->iwe_Setup(CLASS
, self
, message
);
782 data
->iwd_Flags
|= IWDFLAG_SETUP
;
784 /* If double clicked then we call our own private methods, that's
785 easier then using Hooks */
788 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_DoubleClick
, TRUE
,
789 (IPTR
) self
, 1, MUIM_IconWindow_DoubleClicked
792 /* notify when icons dropped on another (wanderer) window */
795 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_IconsDropped
, MUIV_EveryTime
,
796 (IPTR
) self
, 1, MUIM_IconWindow_IconsDropped
799 /* notify when icons dropped on custom application */
802 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_AppWindowDrop
, MUIV_EveryTime
,
803 (IPTR
) self
, 1, MUIM_IconWindow_AppWindowDrop
808 _newIconWin__IconListObj
, MUIM_Notify
, MUIA_IconList_Clicked
, MUIV_EveryTime
,
809 (IPTR
) self
, 1, MUIM_IconWindow_Clicked
812 D(bug("[Wanderer:IconWindow] obj = %ld\n", self
));
818 IPTR
IconWindow__OM_DISPOSE(Class
*CLASS
, Object
*self
, Msg message
)
820 SETUP_ICONWINDOW_INST_DATA
;
822 struct iconWindow_Extension
*iw_Extension
= NULL
;
823 Object
*prefs
= NULL
;
825 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
832 MUIM_KillNotifyObj
, MUIA_WandererPrefs_Processing
, (IPTR
) self
835 if (data
->iwd_Flags
& IWDFLAG_SETUP
)
837 ForeachNode(&iconwindow_Extensions
, iw_Extension
)
839 D(bug("[Wanderer:IconWindow] %s: Cleanup '%s'\n", __PRETTY_FUNCTION__
, iw_Extension
->iwe_Node
.ln_Name
));
840 iw_Extension
->iwe_Cleanup(CLASS
, self
, message
);
845 if (data
->iwd_BackFill_hook
)
846 FreeVec(data
->iwd_BackFill_hook
);
848 return DoSuperMethodA(CLASS
, self
, message
);
853 IPTR
IconWindow__OM_SET(Class
*CLASS
, Object
*self
, struct opSet
*message
)
855 SETUP_ICONWINDOW_INST_DATA
;
857 struct iconWindow_Extension
*iw_Extension
= NULL
;
859 struct TagItem
*tstate
= message
->ops_AttrList
, *tag
;
860 BOOL UpdateIconlist
= FALSE
;
861 IPTR focusicon
= (IPTR
) NULL
;
864 while ((tag
= NextTagItem((TAGITEM
)&tstate
)) != NULL
)
868 case MUIA_Window_Screen
:
869 D(bug("[Wanderer:IconWindow] %s: MUIA_Window_Screen [screen @ %p]\n", __PRETTY_FUNCTION__
, tag
->ti_Data
));
870 data
->iwd_Screen
= (struct Screen
*) tag
->ti_Tag
;
874 D(bug("[Wanderer:IconWindow] %s: MUIA_ShowMe [%x]\n", __PRETTY_FUNCTION__
, tag
->ti_Data
));
875 if ((BOOL
)tag
->ti_Data
== TRUE
)
877 struct Screen
*__Wanderer__Screen
= NULL
;
878 GET(_app(self
), MUIA_Wanderer_Screen
, &__Wanderer__Screen
);
879 if (__Wanderer__Screen
!= data
->iwd_Screen
)
881 D(bug("[Wanderer:IconWindow] %s: Screen Changed [old = %p, new = %p]\n", __PRETTY_FUNCTION__
, data
->iwd_Screen
, __Wanderer__Screen
));
882 SET(self
, MUIA_Window_Screen
, __Wanderer__Screen
);
883 if (((data
->iwd_Flags
& IWDFLAG_ISROOT
)) && ((data
->iwd_Flags
& IWDFLAG_ISBACKDROP
)))
885 IPTR _IconWin__NewWindowWidth
= 0;
886 IPTR _IconWin__NewWindowHeight
= 0;
887 IPTR _IconWin__NewWindowLeft
= 0;
888 IPTR _IconWin__NewWindowTop
= 0;
890 D(bug("[Wanderer:IconWindow] %s: Updating Backdrop Window Dimensions\n", __PRETTY_FUNCTION__
));
892 _IconWin__NewWindowWidth
= GetBitMapAttr(__Wanderer__Screen
->RastPort
.BitMap
, BMA_WIDTH
);
893 _IconWin__NewWindowHeight
= GetBitMapAttr(__Wanderer__Screen
->RastPort
.BitMap
, BMA_HEIGHT
);
894 D(bug("[Wanderer:IconWindow] %s: Screen dimensions .. %d x %d\n", __PRETTY_FUNCTION__
, _IconWin__NewWindowWidth
, _IconWin__NewWindowHeight
));
896 _IconWin__NewWindowTop
= __Wanderer__Screen
->BarHeight
+ 1;
897 _IconWin__NewWindowLeft
= 0;
899 _IconWin__NewWindowHeight
-= _IconWin__NewWindowTop
;
901 D(bug("[Wanderer:IconWindow] %s: New Window dimensions .. %d x %d @ %d, %d\n", __PRETTY_FUNCTION__
, _IconWin__NewWindowWidth
, _IconWin__NewWindowHeight
, _IconWin__NewWindowLeft
, _IconWin__NewWindowTop
));
903 SET(self
, MUIA_Window_Width
, _IconWin__NewWindowWidth
);
904 SET(self
, MUIA_Window_Height
, _IconWin__NewWindowHeight
);
910 case MUIA_IconWindow_Changed
:
911 data
->iwd_Flags
|= (tag
->ti_Data
) ? IWDFLAG_NEEDSUPDATE
: 0;
914 case MUIA_Window_Open
:
915 D(bug("[Wanderer:IconWindow] %s: MUIA_Window_Open [%ld]\n", __PRETTY_FUNCTION__
, tag
->ti_Data
));
916 if ((BOOL
)tag
->ti_Data
== TRUE
)
918 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Clear
);
920 rv
= DoSuperMethodA(CLASS
, self
, (Msg
) message
);
921 #if defined(ICONWINDOW_BUFFERLIST)
922 if (!((data
->iwd_Flags
& IWDFLAG_ISROOT
)))
924 IPTR CURDISPFLAGS
= NULL
;
925 GET(data
->iwd_IconListObj
, MUIA_IconList_DisplayFlags
, &CURDISPFLAGS
);
926 CURDISPFLAGS
|= ICONLIST_DISP_BUFFERED
;
927 SET(data
->iwd_IconListObj
, MUIA_IconList_DisplayFlags
, CURDISPFLAGS
);
930 D(bug("[Wanderer:IconWindow] %s: Process the background ..\n", __PRETTY_FUNCTION__
));
931 DoMethod(self
, MUIM_IconWindow_BackFill_ProcessBackground
, data
->iwd_BackFillInfo
, data
->iwd_RootViewObj
);
933 D(bug("[Wanderer:IconWindow] %s: Force an update of the list ..\n", __PRETTY_FUNCTION__
));
934 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Update
);
935 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Sort
);
940 case MUIA_Window_Activate
:
941 if (data
->iwd_IconListObj
)
942 GET(data
->iwd_IconListObj
, MUIA_IconList_FocusIcon
, &focusicon
);
946 case MUIA_IconWindow_Font
:
947 data
->iwd_WindowFont
= (struct TextFont
*)tag
->ti_Data
;
948 D(bug("[Wanderer:IconWindow] %s: MUIA_IconWindow_Font [font @ 0x%p]\n", __PRETTY_FUNCTION__
, data
->iwd_WindowFont
));
950 if (!data
->iwd_WindowFont
)
951 SetFont(_rp(self
), data
->iwd_WindowFont
);
955 case MUIA_IconWindow_Location
:
956 D(bug("[Wanderer:IconWindow] %s: MUIA_IconWindow_Location [drawer '%s']\n", __PRETTY_FUNCTION__
, data
->iwd_DirectoryPath
));
958 if (!(data
->iwd_Flags
& IWDFLAG_ISROOT
))
960 strcpy(data
->iwd_DirectoryPath
, (STRPTR
)tag
->ti_Data
);
961 SET(self
, MUIA_Window_Title
, (IPTR
)data
->iwd_DirectoryPath
);
962 SET(data
->iwd_IconListObj
, MUIA_IconDrawerList_Drawer
, (IPTR
)data
->iwd_DirectoryPath
);
966 case MUIA_IconWindow_BackgroundAttrib
:
967 D(bug("[Wanderer:IconWindow] %s: MUIA_IconWindow_BackgroundAttrib (not implemented)\n", __PRETTY_FUNCTION__
));
973 rv
= DoSuperMethodA(CLASS
, self
, (Msg
) message
);
975 if (data
->iwd_Flags
& IWDFLAG_SETUP
)
977 ForeachNode(&iconwindow_Extensions
, iw_Extension
)
979 D(bug("[Wanderer:IconWindow] %s: Checking '%s'\n", __PRETTY_FUNCTION__
, iw_Extension
->iwe_Node
.ln_Name
));
980 iw_Extension
->iwe_Set(CLASS
, self
, message
);
986 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Update
);
987 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_Sort
);
992 D(bug("[Wanderer:IconWindow] %s: Updating focused icon (@ 0x%p)\n", __PRETTY_FUNCTION__
, focusicon
));
993 //MUI_Redraw(data->iwd_IconListObj, MADF_DRAWOBJECT);
1001 IPTR
IconWindow__OM_GET(Class
*CLASS
, Object
*self
, struct opGet
*message
)
1003 SETUP_ICONWINDOW_INST_DATA
;
1004 struct iconWindow_Extension
*iw_Extension
= NULL
;
1005 IPTR
*store
= message
->opg_Storage
;
1008 switch (message
->opg_AttrID
)
1010 case MUIA_IconWindow_Changed
:
1011 *store
= (IPTR
)(data
->iwd_Flags
& IWDFLAG_NEEDSUPDATE
);
1014 case MUIA_IconWindow_Window
:
1015 *store
= (IPTR
)self
;
1018 case MUIA_IconWindow_Location
:
1019 *store
= !(data
->iwd_Flags
& IWDFLAG_ISROOT
)
1020 ? XGET(data
->iwd_IconListObj
, MUIA_IconDrawerList_Drawer
)
1024 case MUIA_IconWindow_IconList
:
1025 *store
= (IPTR
)data
->iwd_IconListObj
;
1028 case MUIA_IconWindow_IsRoot
:
1029 *store
= (IPTR
)(data
->iwd_Flags
& IWDFLAG_ISROOT
);
1032 case MUIA_IconWindow_IsBackdrop
:
1033 *store
= (IPTR
)(data
->iwd_Flags
& IWDFLAG_ISBACKDROP
);
1036 case MUIA_IconWindow_BackFillData
:
1037 *store
= (IPTR
)data
->iwd_BackFillInfo
;
1040 case MUIA_IconWindow_BackgroundAttrib
:
1041 *store
= (IPTR
)data
->iwd_ViewSettings_Attrib
;
1045 *store
= (IPTR
)WIWVERS
;
1049 *store
= (IPTR
)WIWREV
;
1057 rv
= DoSuperMethodA(CLASS
, self
, (Msg
) message
);
1061 ForeachNode(&iconwindow_Extensions
, iw_Extension
)
1063 D(bug("[Wanderer:IconWindow] %s: Checking '%s'\n", __PRETTY_FUNCTION__
, iw_Extension
->iwe_Node
.ln_Name
));
1064 if ((rv
= iw_Extension
->iwe_Get(CLASS
, self
, message
)) == TRUE
)
1073 ///IconWindow__MUIM_Window_Setup()
1074 IPTR IconWindow__MUIM_Window_Setup
1076 Class
*CLASS
, Object
*self
, Msg message
1079 SETUP_ICONWINDOW_INST_DATA
;
1081 Object
*prefs
= NULL
;
1083 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1085 if (!DoSuperMethodA(CLASS
, self
, message
)) return FALSE
;
1087 if (iconwindow_BackFill_Active
)
1089 data
->iwd_BackFillInfo
=(struct BackFillInfo
*) DoMethod(self
, MUIM_IconWindow_BackFill_Setup
);
1090 D(bug("[Wanderer:IconWindow] %s: Window BackFill_Data @ 0x%p for '%s'\n", __PRETTY_FUNCTION__
, data
->iwd_BackFillInfo
, iconwindow_BackFill_Active
->bfd_BackFillID
));
1093 GET(_app(self
), MUIA_Wanderer_Prefs
, &prefs
);
1095 D(bug("[Wanderer:IconWindow] %s: App PrefsObj @ 0x%p\n", __PRETTY_FUNCTION__
, prefs
));
1097 if ((prefs
) && (data
->iwd_ViewSettings_PrefsNotificationObject
))
1099 D(bug("[Wanderer:IconWindow] %s: Setting up window background change hook\n", __PRETTY_FUNCTION__
));
1101 /* Set-up a hook to call ProcessBackground on prefs notification */
1104 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_Background
, MUIV_EveryTime
,
1106 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1109 if ((data
->iwd_Flags
& IWDFLAG_ISROOT
))
1113 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGRenderMode
, MUIV_EveryTime
,
1115 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1121 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGTileMode
, MUIV_EveryTime
,
1123 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1128 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGXOffset
, MUIV_EveryTime
,
1130 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1135 data
->iwd_ViewSettings_PrefsNotificationObject
, MUIM_Notify
, MUIA_IconWindowExt_ImageBackFill_BGYOffset
, MUIV_EveryTime
,
1137 MUIM_CallHook
, &data
->iwd_ProcessBackground_hook
, (IPTR
)CLASS
1141 D(bug("[Wanderer:IconWindow] %s: Setup complete!\n", __PRETTY_FUNCTION__
));
1147 ///IconWindow__MUIM_Window_Cleanup()
1148 IPTR IconWindow__MUIM_Window_Cleanup
1150 Class
*CLASS
, Object
*self
, Msg message
1153 SETUP_ICONWINDOW_INST_DATA
;
1155 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1157 if (data
->iwd_BackFillInfo
)
1159 DoMethod(self
, MUIM_IconWindow_BackFill_Cleanup
, data
->iwd_BackFillInfo
);
1160 data
->iwd_BackFillInfo
= NULL
;
1163 if (data
->iwd_ViewSettings_PrefsNotificationObject
)
1167 data
->iwd_ViewSettings_PrefsNotificationObject
,
1168 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGYOffset
, (IPTR
) self
1173 data
->iwd_ViewSettings_PrefsNotificationObject
,
1174 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGXOffset
, (IPTR
) self
1179 data
->iwd_ViewSettings_PrefsNotificationObject
,
1180 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGTileMode
, (IPTR
) self
1183 if ((data
->iwd_Flags
& IWDFLAG_ISROOT
))
1187 data
->iwd_ViewSettings_PrefsNotificationObject
,
1188 MUIM_KillNotifyObj
, MUIA_IconWindowExt_ImageBackFill_BGRenderMode
, (IPTR
) self
1194 data
->iwd_ViewSettings_PrefsNotificationObject
,
1195 MUIM_KillNotifyObj
, MUIA_Background
, (IPTR
) self
1198 return DoSuperMethodA(CLASS
, self
, message
);
1202 ///IconWindow__MUIM_IconWindow_DoubleClicked()
1203 IPTR IconWindow__MUIM_IconWindow_DoubleClicked
1205 Class
*CLASS
, Object
*self
, Msg message
1208 SETUP_ICONWINDOW_INST_DATA
;
1210 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1212 if (data
->iwd_ActionHook
)
1214 struct IconWindow_ActionMsg msg
;
1215 msg
.type
= ICONWINDOW_ACTION_OPEN
;
1216 msg
.iconlist
= data
->iwd_IconListObj
;
1217 msg
.isroot
= (data
->iwd_Flags
& IWDFLAG_ISROOT
);
1219 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1226 ///IconWindow__MUIM_IconWindow_Clicked()
1227 IPTR IconWindow__MUIM_IconWindow_Clicked
1229 Class
*CLASS
, Object
*self
, Msg message
1232 SETUP_ICONWINDOW_INST_DATA
;
1234 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1236 if (data
->iwd_ActionHook
)
1238 struct IconWindow_ActionMsg msg
;
1239 msg
.type
= ICONWINDOW_ACTION_CLICK
;
1240 msg
.iconlist
= data
->iwd_IconListObj
;
1241 msg
.isroot
= (data
->iwd_Flags
& IWDFLAG_ISROOT
);
1242 GET(data
->iwd_IconListObj
, MUIA_IconList_Clicked
, &msg
.click
);
1243 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1250 ///IconWindow__MUIM_IconWindow_IconsDropped()
1251 IPTR IconWindow__MUIM_IconWindow_IconsDropped
1253 Class
*CLASS
, Object
*self
, Msg message
1256 SETUP_ICONWINDOW_INST_DATA
;
1258 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1260 if (data
->iwd_ActionHook
)
1262 struct IconWindow_ActionMsg msg
;
1263 msg
.type
= ICONWINDOW_ACTION_ICONDROP
;
1264 msg
.iconlist
= data
->iwd_IconListObj
;
1265 msg
.isroot
= (data
->iwd_Flags
& IWDFLAG_ISROOT
);
1266 GET(data
->iwd_IconListObj
, MUIA_IconList_IconsDropped
, &msg
.drop
);
1269 NNSET(data
->iwd_IconListObj
, MUIA_IconList_IconsDropped
, NULL
);
1270 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1278 ///IconWindow__MUIM_IconWindow_AppWindowDrop()
1279 IPTR IconWindow__MUIM_IconWindow_AppWindowDrop
1281 Class
*CLASS
, Object
*self
, Msg message
1284 SETUP_ICONWINDOW_INST_DATA
;
1286 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1288 if (data
->iwd_ActionHook
)
1290 struct IconWindow_ActionMsg msg
;
1291 msg
.type
= ICONWINDOW_ACTION_APPWINDOWDROP
;
1292 msg
.iconlist
= data
->iwd_IconListObj
;
1293 msg
.isroot
= (data
->iwd_Flags
& IWDFLAG_ISROOT
);
1294 GET(data
->iwd_IconListObj
, MUIA_IconList_IconsDropped
, &msg
.drop
);
1295 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1302 ///IconWindow__MUIM_IconWindow_Open()
1303 IPTR IconWindow__MUIM_IconWindow_Open
1305 Class
*CLASS
, Object
*self
, Msg message
1308 // SETUP_ICONWINDOW_INST_DATA;
1310 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1312 if (!XGET(self
, MUIA_Window_Open
))
1314 SET(self
, MUIA_Window_Open
, TRUE
);
1317 D(bug("[Wanderer:IconWindow] %s: Setting window as active ..\n", __PRETTY_FUNCTION__
));
1318 SET(self
, MUIA_Window_Activate
, TRUE
);
1320 D(bug("[Wanderer:IconWindow] %s: All done\n", __PRETTY_FUNCTION__
));
1326 ///IconWindow__MUIM_IconWindow_DirectoryUp()
1327 IPTR IconWindow__MUIM_IconWindow_DirectoryUp
1329 Class
*CLASS
, Object
*self
, Msg message
1332 SETUP_ICONWINDOW_INST_DATA
;
1334 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1336 if (data
->iwd_ActionHook
)
1338 struct IconWindow_ActionMsg msg
;
1339 msg
.type
= ICONWINDOW_ACTION_DIRUP
;
1340 msg
.iconlist
= data
->iwd_IconListObj
;
1341 msg
.isroot
= (data
->iwd_Flags
& IWDFLAG_ISROOT
);
1343 CallHookPkt(data
->iwd_ActionHook
, self
, &msg
);
1351 ///IconWindow__MUIM_IconWindow_UnselectAll()
1352 IPTR IconWindow__MUIM_IconWindow_UnselectAll
1354 Class
*CLASS
, Object
*self
, Msg message
1357 SETUP_ICONWINDOW_INST_DATA
;
1359 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1361 DoMethod(data
->iwd_IconListObj
, MUIM_IconList_UnselectAll
);
1367 ///IconWindow__MUIM_IconWindow_Remove()
1368 IPTR IconWindow__MUIM_IconWindow_Remove
1370 Class
*CLASS
, Object
*self
, Msg message
1373 // SETUP_ICONWINDOW_INST_DATA;
1375 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1378 SET( self
, MUIA_Window_Open
, FALSE
);
1379 DoMethod ( _app(self
), OM_REMMEMBER
, self
);
1380 DisposeObject(self
);
1386 /*** Stubs for Backfill Hooks ******************************************************************/
1387 ///IconWindow__MUIM_IconWindow_BackFill_Register()
1388 IPTR IconWindow__MUIM_IconWindow_BackFill_Register
1390 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_Register
*message
1393 // SETUP_ICONWINDOW_INST_DATA;
1395 D(bug("[Wanderer:IconWindow]: %s('%s')\n", __PRETTY_FUNCTION__
, message
->register_Node
->bfd_BackFillID
));
1397 AddTail(&iconwindow_BackFillNodes
, (struct Node
*)message
->register_Node
);
1398 if (iconwindow_BackFill_Active
== NULL
) iconwindow_BackFill_Active
= message
->register_Node
;
1404 ///IconWindow__MUIM_IconWindow_BackFill_Setup()
1405 IPTR IconWindow__MUIM_IconWindow_BackFill_Setup
1407 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_Setup
*message
1410 // SETUP_ICONWINDOW_INST_DATA;
1412 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1414 if (iconwindow_BackFill_Active
== NULL
) return FALSE
;
1416 return (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_Setup
)(CLASS
, self
, message
);
1420 ///IconWindow__MUIM_IconWindow_BackFill_Cleanup()
1421 IPTR IconWindow__MUIM_IconWindow_BackFill_Cleanup
1423 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_Cleanup
*message
1426 //SETUP_ICONWINDOW_INST_DATA;
1428 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1430 if (iconwindow_BackFill_Active
== NULL
) return FALSE
;
1432 return (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_Cleanup
)(CLASS
, self
, message
);
1436 ///IconWindow__MUIM_IconWindow_BackFill_ProcessBackground()
1437 IPTR IconWindow__MUIM_IconWindow_BackFill_ProcessBackground
1439 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_ProcessBackground
*message
1442 SETUP_ICONWINDOW_INST_DATA
;
1444 IPTR retVal
= (IPTR
)FALSE
;
1446 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1448 if (iconwindow_BackFill_Active
!= NULL
)
1450 D(bug("[Wanderer:IconWindow] %s: Asking module @ 0x%p to process ..\n", __PRETTY_FUNCTION__
, iconwindow_BackFill_Active
));
1451 retVal
= (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_ProcessBackground
)(CLASS
, self
, message
);
1454 if ((retVal
== (IPTR
)FALSE
) && (data
->iwd_RootViewObj
!= NULL
))
1456 Object
*IconWindowPB_PrefsObj
= NULL
;
1458 D(bug("[Wanderer:IconWindow] %s: No BackFill module/ module cant render mode\n", __PRETTY_FUNCTION__
));
1459 D(bug("[Wanderer:IconWindow] %s: Using default MUI functions ..\n", __PRETTY_FUNCTION__
));
1461 GET(_app(self
), MUIA_Wanderer_Prefs
, &IconWindowPB_PrefsObj
);
1462 if (IconWindowPB_PrefsObj
)
1464 IPTR IconWindowPB_Background
= 0;
1465 IPTR IconWindowPB_BGMode
= 0;
1466 IPTR IconWindowPB_BGTileMode
= 0;
1468 if ((IconWindowPB_Background
= DoMethod(IconWindowPB_PrefsObj
, MUIM_WandererPrefs_ViewSettings_GetAttribute
, data
->iwd_ViewSettings_Attrib
, MUIA_Background
)) != -1)
1470 char *bgmode_string
;
1473 if ((IconWindowPB_BGMode
= DoMethod(IconWindowPB_PrefsObj
, MUIM_WandererPrefs_ViewSettings_GetAttribute
,
1474 data
->iwd_ViewSettings_Attrib
, MUIA_IconWindowExt_ImageBackFill_BGRenderMode
)) == -1)
1475 IconWindowPB_BGMode
= IconWindowExt_ImageBackFill_RenderMode_Tiled
;
1477 if ((IconWindowPB_BGTileMode
= DoMethod(IconWindowPB_PrefsObj
, MUIM_WandererPrefs_ViewSettings_GetAttribute
,
1478 data
->iwd_ViewSettings_Attrib
, MUIA_IconWindowExt_ImageBackFill_BGTileMode
)) == -1)
1479 IconWindowPB_BGTileMode
= IconWindowExt_ImageBackFill_TileMode_Float
;
1481 SET(data
->iwd_RootViewObj
, MUIA_Background
, IconWindowPB_Background
);
1483 bgmode_string
=(STRPTR
) IconWindowPB_Background
;
1484 this_mode
= bgmode_string
[0] - 48;
1486 D(bug("[Wanderer:IconWindow] %s: MUI BG Mode = %d\n", __PRETTY_FUNCTION__
, this_mode
));
1492 if (IconWindowPB_BGMode
== IconWindowExt_ImageBackFill_RenderMode_Scale
)
1494 SET(data
->iwd_RootViewObj
, MUIA_IconListview_ScaledBackground
, TRUE
);
1498 SET(data
->iwd_RootViewObj
, MUIA_IconListview_ScaledBackground
, FALSE
);
1502 if (IconWindowPB_BGTileMode
== IconWindowExt_ImageBackFill_TileMode_Fixed
)
1503 SET(data
->iwd_RootViewObj
, MUIA_IconListview_FixedBackground
, TRUE
);
1505 SET(data
->iwd_RootViewObj
, MUIA_IconListview_FixedBackground
, FALSE
);
1517 ///IconWindow__MUIM_IconWindow_BackFill_DrawBackground()
1518 IPTR IconWindow__MUIM_IconWindow_BackFill_DrawBackground
1520 Class
*CLASS
, Object
*self
, struct MUIP_IconWindow_BackFill_DrawBackground
*message
1523 // SETUP_ICONWINDOW_INST_DATA;
1525 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1527 if (iconwindow_BackFill_Active
== NULL
) return FALSE
;
1529 return (iconwindow_BackFill_Active
->bfd_MUIM_IconWindow_BackFill_DrawBackground
)(CLASS
, self
, message
);
1534 IPTR
IconWindow__SetupClass()
1536 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__
));
1538 NewList(&iconwindow_BackFillNodes
);
1539 D(bug("[Wanderer:IconWindow] %s: iconwindow_BackFillNodes @ %p\n", __PRETTY_FUNCTION__
, &iconwindow_BackFillNodes
));
1540 NewList(&iconwindow_Extensions
);
1541 D(bug("[Wanderer:IconWindow] %s: iconwindow_Extensions @ %p\n", __PRETTY_FUNCTION__
, &iconwindow_Extensions
));
1542 iconwindow_BackFill_Active
= NULL
;
1547 /*** Setup ******************************************************************/
1548 ICONWINDOW_CUSTOMCLASS
1550 IconWindow
, NULL
, MUIC_Window
, NULL
,
1551 OM_NEW
, struct opSet
*,
1553 OM_SET
, struct opSet
*,
1554 OM_GET
, struct opGet
*,
1555 MUIM_Window_Setup
, Msg
,
1556 MUIM_Window_Cleanup
, Msg
,
1557 MUIM_IconWindow_Open
, Msg
,
1558 MUIM_IconWindow_UnselectAll
, Msg
,
1559 MUIM_IconWindow_DoubleClicked
, Msg
,
1560 MUIM_IconWindow_IconsDropped
, Msg
,
1561 MUIM_IconWindow_Clicked
, Msg
,
1562 MUIM_IconWindow_DirectoryUp
, Msg
,
1563 MUIM_IconWindow_AppWindowDrop
, Msg
,
1564 MUIM_IconWindow_Remove
, Msg
,
1565 MUIM_IconWindow_BackFill_Register
, struct MUIP_IconWindow_BackFill_Register
*,
1566 MUIM_IconWindow_BackFill_Setup
, struct MUIP_IconWindow_BackFill_Setup
*,
1567 MUIM_IconWindow_BackFill_Cleanup
, struct MUIP_IconWindow_BackFill_Cleanup
*,
1568 MUIM_IconWindow_BackFill_ProcessBackground
, struct MUIP_IconWindow_BackFill_ProcessBackground
*,
1569 MUIM_IconWindow_BackFill_DrawBackground
, struct MUIP_IconWindow_BackFill_DrawBackground
*
1572 ADD2INIT(IconWindow__SetupClass
, 0);
1575 int initIconWindowClass(void)
1577 IPTR ret1
= IconWindow_Initialize();
1579 IPTR ret2
= IconWindow__SetupClass();
1581 IPTR ret3
= ImageBackFill__SetupClass();
1583 if (ret1
&& ret2
&& ret3
)