Implement Icon->LeaveOut and Icon->PutAway (fixed some issues encountered while imple...
[AROS.git] / workbench / system / Wanderer / iconwindow.c
blob5e615bcdbc8286c1ab760fd978ca9518474ca62d
1 /*
2 Copyright 2004-2010, The AROS Development Team. All rights reserved.
3 $Id$
4 */
5 #define DOPENWINDOW(x) /* Window positioning and size */
7 #define ZCC_QUIET
9 #include "portable_macros.h"
10 #ifdef __AROS__
11 #define MUIMASTER_YES_INLINE_STDARG
12 #endif
14 #define ICONWINDOW_NODETAILVIEWCLASS
15 //#define ICONWINDOW_BUFFERLIST
17 #ifdef __AROS__
18 #define DEBUG 0
19 #include <aros/debug.h>
20 #endif
22 #include <exec/types.h>
23 #include <libraries/mui.h>
25 #ifdef __AROS__
26 #include <zune/customclasses.h>
27 #else
28 #include <zune_AROS/customclasses.h>
29 #endif
31 #include <proto/utility.h>
33 #include <proto/graphics.h>
35 #include <proto/exec.h>
36 #include <proto/datatypes.h>
38 #include <dos/dos.h>
39 #include <proto/dos.h>
41 #include <proto/icon.h>
43 #include <stdio.h>
44 #include <string.h>
46 #include <intuition/screens.h>
47 #include <datatypes/pictureclass.h>
48 #include <clib/macros.h>
50 #ifdef __AROS__
51 #include <clib/alib_protos.h>
53 #include <prefs/wanderer.h>
54 #else
55 #include <prefs_AROS/wanderer.h>
56 #endif
58 #if defined(__AMIGA__) && !defined(__PPC__)
59 #define NO_INLINE_STDARG
60 #endif
61 #ifndef _PROTO_INTUITION_H
62 #include <proto/intuition.h>
63 #endif
64 #include <proto/muimaster.h>
66 #include "Classes/iconlist.h"
67 #include "Classes/iconlistview.h"
68 #include "Classes/iconlist_attributes.h"
69 #include "wanderer.h"
70 #include "wandererprefs.h"
72 #include "iconwindow.h"
73 #include "iconwindow_attributes.h"
74 #include "iconwindow_iconlist.h"
75 #include "iconwindowbackfill.h"
77 #ifndef __AROS__
78 #define DEBUG 1
80 #ifdef DEBUG
81 #define D(x) if (DEBUG) x
82 #ifdef __amigaos4__
83 #define bug DebugPrintF
84 #else
85 #define bug kprintf
86 #endif
87 #else
88 #define D(...)
89 #endif
90 #endif
92 #if defined(ICONWINDOW_NODETAILVIEWCLASS)
93 struct MUI_CustomClass *IconWindowDetailDrawerList_CLASS;
94 #endif
96 #define WIWVERS 1
97 #define WIWREV 0
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()
110 #ifdef __AROS__
111 AROS_UFH3(
112 void, IconWindow__HookFunc_PrefsUpdatedFunc,
113 AROS_UFHA(struct Hook *, hook, A0),
114 AROS_UFHA(APTR *, obj, A2),
115 AROS_UFHA(APTR, param, A1)
118 #else
119 HOOKPROTO(IconWindow__HookFunc_PrefsUpdatedFunc, void, APTR *obj, APTR param)
121 #endif
122 AROS_USERFUNC_INIT
124 /* Get our private data */
125 Object *self = ( Object *)obj;
126 Class *CLASS = *( Class **)param;
127 IPTR changed_state;
129 SETUP_ICONWINDOW_INST_DATA;
131 D(bug("[Wanderer:IconWindow]: %s()\n", __PRETTY_FUNCTION__));
133 changed_state = 0;
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);
144 AROS_USERFUNC_EXIT
146 #ifndef __AROS__
147 MakeStaticHook(iwd_PrefsUpdated_hook,IconWindow__HookFunc_PrefsUpdatedFunc);
148 #endif
151 ///IconWindow__HookFunc_ProcessBackgroundFunc()
152 #ifdef __AROS__
153 AROS_UFH3(
154 void, IconWindow__HookFunc_ProcessBackgroundFunc,
155 AROS_UFHA(struct Hook *, hook, A0),
156 AROS_UFHA(APTR *, obj, A2),
157 AROS_UFHA(APTR, param, A1)
160 #else
161 HOOKPROTO(IconWindow__HookFunc_ProcessBackgroundFunc, void, APTR *obj, APTR param)
163 #endif
164 AROS_USERFUNC_INIT
166 /* Get our private data */
167 Object *self = ( Object *)obj,
168 *prefs = NULL;
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);
179 if (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!"
191 AROS_USERFUNC_EXIT
193 #ifndef __AROS__
194 MakeStaticHook(iwd_ProcessBackground_hook,IconWindow__HookFunc_ProcessBackgroundFunc);
195 #endif
198 ///IconWindow__HookFunc_WandererBackFillFunc()
199 #ifdef __AROS__
200 AROS_UFH3(
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)
207 #else
208 HOOKPROTO(IconWindow__HookFunc_WandererBackFillFunc, void, struct RastPort *RP, struct BackFillMsg *BFM)
210 #endif
211 AROS_USERFUNC_INIT
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);
257 AROS_USERFUNC_EXIT
259 #ifndef __AROS__
260 MakeStaticHook(Hook_WandererBackFillFunc,IconWindow__HookFunc_WandererBackFillFunc);
261 #endif
264 ///OM_NEW()
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,
285 *prefs = NULL;
287 char *_newIconWin__Title = NULL;
289 UBYTE _newIconWin__VOLVIEWMODE = MUIV_IconWindow_VolumeInfoMode_ShowAllIfNoInfo;
291 BOOL isRoot = FALSE,
292 isBackdrop = FALSE;
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;
310 #endif
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__));
329 return NULL;
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));
337 #ifdef __AROS__
338 _newIconWin__BackFillHook->h_Entry = ( HOOKFUNC )IconWindow__HookFunc_WandererBackFillFunc;
339 #else
340 _newIconWin__BackFillHook = &Hook_WandererBackFillFunc;
341 #endif
343 //#if defined(__MORPHOS__)
344 // WindowBF_TAG = MUIA_Window_BackFillHook;
345 //#else
346 WindowBF_TAG = (APTR)WA_BackFill;
347 //#endif
350 if (isRoot)
352 iconviewclass = IconWindowVolumeList_CLASS;
353 _newIconWin__IconListObj = (Object *)NewObject(iconviewclass->mcc_Class, NULL,
354 MUIA_Font, (IPTR)_newIconWin__WindowFont,
355 TAG_DONE);
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));
361 if (isBackdrop)
363 DOPENWINDOW(bug("[Wanderer:IconWindow] %s: BACKDROP ROOT Window\n", __PRETTY_FUNCTION__));
364 _newIconWin__Title = NULL;
366 else
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;
377 else
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));
397 else
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,
406 TAG_DONE);
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)
423 case 0:
425 D(bug("Default"));
426 break;
428 case 1:
430 D(bug("Show only icons"));
431 icon__DispFlags |= ICONLIST_DISP_SHOWINFO;
432 break;
434 case 2:
436 D(bug("Show all files"));
437 icon__DispFlagMask &= ~ICONLIST_DISP_SHOWINFO;
438 break;
440 case 3:
442 D(bug("Show all files"));
443 icon__DispFlags |= ICONLIST_DISP_SHOWHIDDEN;
444 icon__DispFlagMask &= ~ICONLIST_DISP_SHOWINFO;
445 break;
447 default:
449 D(bug("INVALID"));
453 D(bug("] VIEWMODES %x [", drawericon->do_DrawerData->dd_ViewModes));
455 switch (drawericon->do_DrawerData->dd_ViewModes)
457 case 0:
459 D(bug("Default (inherit from parent)"));
460 break;
462 case 1:
464 D(bug("View as icons"));
465 break;
467 case 2:
469 D(bug("View as text, sorted by name"));
470 iconviewclass = IconWindowDetailDrawerList_CLASS;
471 break;
473 case 3:
475 D(bug("View as text, sorted by date"));
476 iconviewclass = IconWindowDetailDrawerList_CLASS;
477 break;
479 case 4:
481 D(bug("View as text, sorted by size"));
482 iconviewclass = IconWindowDetailDrawerList_CLASS;
483 break;
485 case 5:
487 D(bug("View as text, sorted by type"));
488 iconviewclass = IconWindowDetailDrawerList_CLASS;
489 break;
491 default:
493 D(bug("INVALID"));
496 D(bug("]\n"));
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,
511 TAG_DONE);
513 GET(_newIconWin__IconListObj, MUIA_IconList_DisplayFlags, &current_DispFlags);
514 SET(_newIconWin__IconListObj, MUIA_IconList_DisplayFlags, ((current_DispFlags & icon__DispFlagMask)|icon__DispFlags));
516 _newIconWin__TopPanelRootGroupObj = MUI_NewObject(MUIC_Group,
517 MUIA_InnerLeft,(0),
518 MUIA_InnerRight,(0),
519 MUIA_InnerTop,(0),
520 MUIA_InnerBottom,(0),
521 MUIA_Frame, MUIV_Frame_None,
522 MUIA_Group_Spacing, 0,
523 Child, (_newIconWin__TopPanelSpacerObj = HSpace(0)),
524 TAG_DONE);
526 if (_newIconWin__TopPanelRootGroupObj)
528 _newIconWin__TopPanelContainerObj = MUI_NewObject(MUIC_Group, MUIA_Group_Horiz, TRUE,
529 MUIA_ShowMe, FALSE,
530 InnerSpacing(0,0),
531 MUIA_HorizWeight, 100,
532 MUIA_VertWeight, 0,
533 MUIA_Frame, MUIV_Frame_None,
534 MUIA_Group_Spacing, 3,
535 Child, (IPTR)_newIconWin__TopPanelRootGroupObj,
536 TAG_DONE);
539 _newIconWin__BottomPanelRootGroupObj = MUI_NewObject(MUIC_Group,
540 MUIA_InnerLeft,(0),
541 MUIA_InnerRight,(0),
542 MUIA_InnerTop,(0),
543 MUIA_InnerBottom,(0),
544 MUIA_Frame, MUIV_Frame_None,
545 MUIA_Group_Spacing, 0,
546 Child, (_newIconWin__BottomPanelSpacerObj = HSpace(0)),
547 TAG_DONE);
549 if (_newIconWin__BottomPanelRootGroupObj)
551 _newIconWin__BottomPanelContainerObj = MUI_NewObject(MUIC_Group, MUIA_Group_Horiz, TRUE,
552 MUIA_ShowMe, FALSE,
553 InnerSpacing(0,0),
554 MUIA_HorizWeight, 100,
555 MUIA_VertWeight, 0,
556 MUIA_Frame, MUIV_Frame_None,
557 MUIA_Group_Spacing, 3,
558 Child, (IPTR)_newIconWin__BottomPanelRootGroupObj,
559 TAG_DONE);
562 _newIconWin__LeftPanelRootGroupObj = MUI_NewObject(MUIC_Group,
563 MUIA_InnerLeft,(0),
564 MUIA_InnerRight,(0),
565 MUIA_InnerTop,(0),
566 MUIA_InnerBottom,(0),
567 MUIA_Frame, MUIV_Frame_None,
568 MUIA_Group_Spacing, 0,
569 Child, (_newIconWin__LeftPanelSpacerObj = HVSpace),
570 TAG_DONE);
572 if (_newIconWin__LeftPanelRootGroupObj)
574 _newIconWin__LeftPanelContainerObj = MUI_NewObject(MUIC_Group, MUIA_Group_Horiz, TRUE,
575 MUIA_ShowMe, FALSE,
576 InnerSpacing(0,0),
577 MUIA_HorizWeight, 0,
578 MUIA_VertWeight, 100,
579 MUIA_Frame, MUIV_Frame_None,
580 MUIA_Group_Spacing, 3,
581 Child, (IPTR)_newIconWin__LeftPanelRootGroupObj,
582 TAG_DONE);
586 #ifdef __AROS__
587 _newIconWin__RootViewObj = (Object *) IconListviewObject,
588 MUIA_Weight, 100,
589 MUIA_IconListview_UseWinBorder, TRUE,
590 MUIA_IconListview_IconList, (IPTR) _newIconWin__IconListObj,
591 End;
592 #else
593 _newIconWin__RootViewObj = (Object *) NewObject(IconListview_Class->mcc_Class, NULL,
594 MUIA_Weight, 100,
595 MUIA_IconListview_UseWinBorder, TRUE,
596 MUIA_IconListview_IconList, (IPTR) _newIconWin__IconListObj,
597 TAG_DONE);
598 #endif
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));
603 #ifdef __AROS__
604 self = (Object *) DoSuperNewTags
606 CLASS, self, NULL,
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,
625 #endif
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,
638 InnerSpacing(0,0),
640 ((!isRoot) && _newIconWin__TopPanelContainerObj) ? Child : TAG_IGNORE, (IPTR)_newIconWin__TopPanelContainerObj,
642 Child, HGroup,
643 ((!isRoot) && _newIconWin__LeftPanelContainerObj) ? Child : TAG_IGNORE, (IPTR)_newIconWin__LeftPanelContainerObj,
644 /* The actual icon list */
645 Child, (IPTR) _newIconWin__RootViewObj,
646 End,
648 ((!isRoot) && _newIconWin__BottomPanelContainerObj) ? Child : TAG_IGNORE, (IPTR)_newIconWin__BottomPanelContainerObj,
650 TAG_DONE),
652 TAG_MORE, (IPTR) message->ops_AttrList
654 #else
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,
673 #endif
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,
686 InnerSpacing(0,0),
688 /* "Extension" group */
689 _newIconWin__TopPanelContainerObj ? Child : TAG_IGNORE, (IPTR)_newIconWin__TopPanelContainerObj,
691 /* icon list */
692 Child, (IPTR) _newIconWin__RootViewObj,
694 TAG_DONE),
696 TAG_MORE, (IPTR) message->ops_AttrList
698 #endif
700 if (self != NULL)
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;
730 data->iwd_Flags = 0;
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)
738 ? "Workbench"
739 : "Drawer";
741 data->iwd_FSNotifyPort = _newIconWin__FSNotifyPort;
743 if (prefs)
745 #ifdef __AROS__
746 data->iwd_PrefsUpdated_hook.h_Entry = ( HOOKFUNC )IconWindow__HookFunc_PrefsUpdatedFunc;
747 #else
748 data->iwd_PrefsUpdated_hook = &iwd_PrefsUpdated_hook;
749 #endif
751 DoMethod
753 prefs, MUIM_Notify, MUIA_WandererPrefs_Processing, FALSE,
754 (IPTR) self, 3,
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);
763 #ifdef __AROS__
764 data->iwd_ProcessBackground_hook.h_Entry = ( HOOKFUNC )IconWindow__HookFunc_ProcessBackgroundFunc;
765 #else
766 data->iwd_ProcessBackground_hook = &iwd_ProcessBackground_hook;
767 #endif
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 */
786 DoMethod
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 */
793 DoMethod
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 */
800 DoMethod
802 _newIconWin__IconListObj, MUIM_Notify, MUIA_IconList_AppWindowDrop, MUIV_EveryTime,
803 (IPTR) self, 1, MUIM_IconWindow_AppWindowDrop
806 DoMethod
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));
813 return self;
817 ///OM_DISPOSE()
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);
827 if (prefs)
829 DoMethod
831 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);
852 ///OM_SET()
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;
862 IPTR rv = TRUE;
864 while ((tag = NextTagItem((TAGITEM)&tstate)) != NULL)
866 switch (tag->ti_Tag)
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;
871 break;
873 case MUIA_ShowMe:
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);
908 break;
910 case MUIA_IconWindow_Changed:
911 data->iwd_Flags |= (tag->ti_Data) ? IWDFLAG_NEEDSUPDATE : 0;
912 break;
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);
929 #endif
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);
936 return rv;
938 break;
940 case MUIA_Window_Activate:
941 if (data->iwd_IconListObj)
942 GET(data->iwd_IconListObj, MUIA_IconList_FocusIcon, &focusicon);
944 break;
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);
953 break;
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);
964 break;
966 case MUIA_IconWindow_BackgroundAttrib:
967 D(bug("[Wanderer:IconWindow] %s: MUIA_IconWindow_BackgroundAttrib (not implemented)\n", __PRETTY_FUNCTION__));
968 break;
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);
984 if (UpdateIconlist)
986 DoMethod(data->iwd_IconListObj, MUIM_IconList_Update);
987 DoMethod(data->iwd_IconListObj, MUIM_IconList_Sort);
990 if (focusicon)
992 D(bug("[Wanderer:IconWindow] %s: Updating focused icon (@ 0x%p)\n", __PRETTY_FUNCTION__, focusicon));
993 //MUI_Redraw(data->iwd_IconListObj, MADF_DRAWOBJECT);
996 return rv;
1000 ///OM_GET()
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;
1006 IPTR rv = TRUE;
1008 switch (message->opg_AttrID)
1010 case MUIA_IconWindow_Changed:
1011 *store = (IPTR)(data->iwd_Flags & IWDFLAG_NEEDSUPDATE);
1012 break;
1014 case MUIA_IconWindow_Window:
1015 *store = (IPTR)self;
1016 break;
1018 case MUIA_IconWindow_Location:
1019 *store = !(data->iwd_Flags & IWDFLAG_ISROOT)
1020 ? XGET(data->iwd_IconListObj, MUIA_IconDrawerList_Drawer)
1021 : (IPTR)NULL;
1022 break;
1024 case MUIA_IconWindow_IconList:
1025 *store = (IPTR)data->iwd_IconListObj;
1026 break;
1028 case MUIA_IconWindow_IsRoot:
1029 *store = (IPTR)(data->iwd_Flags & IWDFLAG_ISROOT);
1030 break;
1032 case MUIA_IconWindow_IsBackdrop:
1033 *store = (IPTR)(data->iwd_Flags & IWDFLAG_ISBACKDROP);
1034 break;
1036 case MUIA_IconWindow_BackFillData:
1037 *store = (IPTR)data->iwd_BackFillInfo;
1038 break;
1040 case MUIA_IconWindow_BackgroundAttrib:
1041 *store = (IPTR)data->iwd_ViewSettings_Attrib;
1042 break;
1044 case MUIA_Version:
1045 *store = (IPTR)WIWVERS;
1046 break;
1048 case MUIA_Revision:
1049 *store = (IPTR)WIWREV;
1050 break;
1052 default:
1053 rv = FALSE;
1056 if (!rv)
1057 rv = DoSuperMethodA(CLASS, self, (Msg) message);
1059 if (!rv)
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)
1065 break;
1069 return rv;
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 */
1102 DoMethod
1104 data->iwd_ViewSettings_PrefsNotificationObject, MUIM_Notify, MUIA_Background, MUIV_EveryTime,
1105 (IPTR) self, 3,
1106 MUIM_CallHook, &data->iwd_ProcessBackground_hook, (IPTR)CLASS
1109 if ((data->iwd_Flags & IWDFLAG_ISROOT))
1111 DoMethod
1113 data->iwd_ViewSettings_PrefsNotificationObject, MUIM_Notify, MUIA_IconWindowExt_ImageBackFill_BGRenderMode, MUIV_EveryTime,
1114 (IPTR) self, 3,
1115 MUIM_CallHook, &data->iwd_ProcessBackground_hook, (IPTR)CLASS
1119 DoMethod
1121 data->iwd_ViewSettings_PrefsNotificationObject, MUIM_Notify, MUIA_IconWindowExt_ImageBackFill_BGTileMode, MUIV_EveryTime,
1122 (IPTR) self, 3,
1123 MUIM_CallHook, &data->iwd_ProcessBackground_hook, (IPTR)CLASS
1126 DoMethod
1128 data->iwd_ViewSettings_PrefsNotificationObject, MUIM_Notify, MUIA_IconWindowExt_ImageBackFill_BGXOffset, MUIV_EveryTime,
1129 (IPTR) self, 3,
1130 MUIM_CallHook, &data->iwd_ProcessBackground_hook, (IPTR)CLASS
1133 DoMethod
1135 data->iwd_ViewSettings_PrefsNotificationObject, MUIM_Notify, MUIA_IconWindowExt_ImageBackFill_BGYOffset, MUIV_EveryTime,
1136 (IPTR) self, 3,
1137 MUIM_CallHook, &data->iwd_ProcessBackground_hook, (IPTR)CLASS
1141 D(bug("[Wanderer:IconWindow] %s: Setup complete!\n", __PRETTY_FUNCTION__));
1143 return TRUE;
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)
1165 DoMethod
1167 data->iwd_ViewSettings_PrefsNotificationObject,
1168 MUIM_KillNotifyObj, MUIA_IconWindowExt_ImageBackFill_BGYOffset, (IPTR) self
1171 DoMethod
1173 data->iwd_ViewSettings_PrefsNotificationObject,
1174 MUIM_KillNotifyObj, MUIA_IconWindowExt_ImageBackFill_BGXOffset, (IPTR) self
1177 DoMethod
1179 data->iwd_ViewSettings_PrefsNotificationObject,
1180 MUIM_KillNotifyObj, MUIA_IconWindowExt_ImageBackFill_BGTileMode, (IPTR) self
1183 if ((data->iwd_Flags & IWDFLAG_ISROOT))
1185 DoMethod
1187 data->iwd_ViewSettings_PrefsNotificationObject,
1188 MUIM_KillNotifyObj, MUIA_IconWindowExt_ImageBackFill_BGRenderMode, (IPTR) self
1192 DoMethod
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);
1218 msg.click = NULL;
1219 CallHookPkt(data->iwd_ActionHook, self, &msg);
1222 return TRUE;
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);
1246 return TRUE;
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);
1267 if (msg.drop)
1269 NNSET(data->iwd_IconListObj, MUIA_IconList_IconsDropped, NULL);
1270 CallHookPkt(data->iwd_ActionHook, self, &msg);
1274 return TRUE;
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);
1298 return TRUE;
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__));
1322 return TRUE;
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);
1342 msg.click = NULL;
1343 CallHookPkt(data->iwd_ActionHook, self, &msg);
1347 return TRUE;
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);
1363 return TRUE;
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__));
1377 // Remove window
1378 SET( self, MUIA_Window_Open, FALSE );
1379 DoMethod ( _app(self), OM_REMMEMBER, self );
1380 DisposeObject(self);
1382 return TRUE;
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;
1400 return TRUE;
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;
1471 BYTE this_mode;
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));
1488 switch (this_mode)
1490 case 5:
1491 //Image =D
1492 if (IconWindowPB_BGMode == IconWindowExt_ImageBackFill_RenderMode_Scale)
1494 SET(data->iwd_RootViewObj, MUIA_IconListview_ScaledBackground, TRUE);
1495 break;
1497 else
1498 SET(data->iwd_RootViewObj, MUIA_IconListview_ScaledBackground, FALSE);
1500 case 0:
1501 //MUI Pattern
1502 if (IconWindowPB_BGTileMode == IconWindowExt_ImageBackFill_TileMode_Fixed)
1503 SET(data->iwd_RootViewObj, MUIA_IconListview_FixedBackground, TRUE);
1504 else
1505 SET(data->iwd_RootViewObj, MUIA_IconListview_FixedBackground, FALSE);
1506 break;
1510 retVal = FALSE;
1513 return retVal;
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;
1544 return TRUE;
1547 /*** Setup ******************************************************************/
1548 ICONWINDOW_CUSTOMCLASS
1550 IconWindow, NULL, MUIC_Window, NULL,
1551 OM_NEW, struct opSet *,
1552 OM_DISPOSE, Msg,
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);
1574 #ifndef __AROS__
1575 int initIconWindowClass(void)
1577 IPTR ret1 = IconWindow_Initialize();
1579 IPTR ret2 = IconWindow__SetupClass();
1581 IPTR ret3 = ImageBackFill__SetupClass();
1583 if (ret1 && ret2 && ret3)
1584 return TRUE;
1585 else
1586 return FALSE;
1589 #endif