Initial import of Scalos. To decrease size I have
[AROS-Contrib.git] / scalos / main / ControlBar.c
blobd877d1e64e7e78cce62c10c4d7c207622c91d46a
1 // ControlBar.c
2 // $Date$
3 // $Revision$
6 #ifdef __amigaos4__
7 #define INTUITION_PRE_V36_NAMES
8 #endif
9 #include <exec/types.h>
10 #include <graphics/gels.h>
11 #include <graphics/rastport.h>
12 #include <intuition/classes.h>
13 #include <intuition/classusr.h>
14 #include <utility/hooks.h>
15 #include <intuition/gadgetclass.h>
16 #include <intuition/icclass.h>
17 #include <workbench/workbench.h>
18 #include <dos/dostags.h>
19 #include <dos/datetime.h>
21 #define __USE_SYSBASE
23 #include <proto/dos.h>
24 #include <proto/exec.h>
25 #include <proto/intuition.h>
26 #include <proto/graphics.h>
27 #include <proto/utility.h>
28 #include <proto/locale.h>
29 #include "debug.h"
30 #include <proto/scalos.h>
32 #include <clib/alib_protos.h>
34 #include <defs.h>
35 #include <scalos/scalos.h>
36 #include <scalos/GadgetBar.h>
38 #include <stdlib.h>
39 #include <stdio.h>
40 #include <string.h>
42 #include "scalos_structures.h"
43 #include "functions.h"
44 #include "locale.h"
45 #include "Variables.h"
46 #include "DtImageClass.h"
47 #include "FrameImageClass.h"
48 #include "CycleGadgetClass.h"
49 #include "HistoryGadgetClass.h"
51 //----------------------------------------------------------------------------
53 struct ControlBarMember; // forward
55 typedef void (*CBM_DISABLEFUNC)(struct internalScaWindowTask *, struct ControlBarMember *);
57 struct ControlBarMember
59 struct Node cbm_Node;
60 struct ControlBarGadgetEntry cbm_Entry;
61 enum SCPGadgetTypes cbm_GadgetType;
62 Object *cbm_Gadget;
63 Object *cbm_NormalImage;
64 Object *cbm_SelectedImage;
65 Object *cbm_FrameImage;
66 const struct ScalosMenuCommand *cbm_smcom; // for action buttons, holds pointer to MenuCommandTable entry
67 CBM_DISABLEFUNC cbm_DisableFunc;
70 //----------------------------------------------------------------------------
72 static ULONG ControlbarCodeFromViewMode(UBYTE ViewByType);
73 static struct ControlBarMember *ControlBarCreateViewByCycle(struct internalScaWindowTask *iwt,
74 const struct ControlBarGadgetEntry *cgy, ULONG GadgetID);
75 static struct ControlBarMember *ControlBarCreateShowModeCycle(struct internalScaWindowTask *iwt,
76 const struct ControlBarGadgetEntry *cgy, ULONG GadgetID);
77 static struct ControlBarMember *ControlBarCreateSeparator(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID);
78 static struct ControlBarMember *ControlBarCreateActionButton(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID);
79 static struct ControlBarMember *ControlBarCreateBackButton(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID);
80 static struct ControlBarMember *ControlBarCreateForwardButton(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID);
81 static struct ControlBarMember *ControlBarCreateParentButton(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID);
82 static struct ControlBarMember *ControlBarCreateBrowseButton(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID);
83 static struct ControlBarMember *ControlBarCreateButton(CONST_STRPTR NormalImgName,
84 CONST_STRPTR SelectedImgName, CONST_STRPTR DisabledImgName,
85 ULONG GadgetID, ULONG FallbackSysImg, CBM_DISABLEFUNC DisableFunc);
86 static struct ControlBarMember *ControlBarCreateHistoryGadget(struct internalScaWindowTask *iwt,
87 const struct ControlBarGadgetEntry *cgy, ULONG GadgetID);
88 static UWORD ControlBarQueryGadgetID(struct ExtGadget *gg);
89 static void FreeControlBarMember(struct ControlBarMember *Member);
90 static struct ControlBarMember *ControlBarFindMember(struct internalScaWindowTask *iwt,
91 ULONG GadgetID);
92 static void ControlBarParentDisable(struct internalScaWindowTask *iwt, struct ControlBarMember *cbm);
93 static void ControlBarBackDisable(struct internalScaWindowTask *iwt, struct ControlBarMember *cbm);
94 static void ControlBarForwardDisable(struct internalScaWindowTask *iwt, struct ControlBarMember *cbm);
95 static void ControlBarHistoryListDisable(struct internalScaWindowTask *iwt, struct ControlBarMember *cbm);
96 static void ControlBarAddGadgets(struct internalScaWindowTask *iwt, const struct List *CbGadgetsList);
98 //----------------------------------------------------------------------------
100 BOOL ControlBarAdd(struct internalScaWindowTask *iwt)
102 ULONG Height = 0;
103 BOOL Success = FALSE;
105 d1(KPrintF("%s/%s/%ld: START iwt=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, iwt, iwt->iwt_WinTitle));
107 do {
108 const struct List *CbGadgetsList;
109 struct Window *win;
111 if (iwt->iwt_ControlBar)
112 break; // ControlBar already present
113 if (iwt->iwt_BackDrop)
114 break; // no ControlBar for backdrop windows
116 if (iwt->iwt_WindowTask.mt_WindowStruct->ws_MoreFlags & WSV_MoreFlagF_NoControlBar)
117 break;
119 if (iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags & WSV_FlagF_BrowserMode)
120 CbGadgetsList = &ControlBarGadgetListBrowser;
121 else
122 CbGadgetsList = &ControlBarGadgetListNormal;
124 if (IsListEmpty((struct List *) CbGadgetsList))
125 break;
127 if (iwt->iwt_WindowTask.mt_WindowStruct->ws_Window)
128 win = iwt->iwt_WindowTask.mt_WindowStruct->ws_Window;
129 else
130 win = iInfos.xii_iinfos.ii_MainWindowStruct->ws_Window;
132 d1(KPrintF("%s/%s/%ld: StatusBar BgPen=%ld\n", __FILE__, __FUNC__, __LINE__, \
133 PalettePrefs.pal_PensList[PENIDX_STATUSBAR_BG]));
135 iwt->iwt_ControlBar = (struct Gadget *) SCA_NewScalosObjectTags("GadgetBar.sca",
136 GBDTA_WindowTask, (ULONG) iwt,
137 GBDTA_Position, GBPOS_Top,
138 GA_RelSpecial, TRUE,
139 GA_GadgetHelp, TRUE,
140 GA_ID, GADGETID_CONTROLBAR,
141 GBDTA_BGPen, PalettePrefs.pal_PensList[PENIDX_STATUSBAR_BG],
142 GBDTA_BackgroundImageName, (ULONG) "THEME:Window/ControlBar/Background",
143 GA_RelVerify, TRUE,
144 GA_GadgetHelp, TRUE,
145 TAG_END);
147 d1(KPrintF("%s/%s/%ld: iwt_ControlBar=%08lx\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_ControlBar));
148 if (NULL == iwt->iwt_ControlBar)
149 break;
151 ControlBarAddGadgets(iwt, CbGadgetsList);
153 d1(KPrintF("%s/%s/%ld: Height=%ld\n", __FILE__, __FUNC__, __LINE__, Height));
155 if (iwt->iwt_WindowTask.wt_Window)
156 AddGList(iwt->iwt_WindowTask.wt_Window, iwt->iwt_ControlBar, ~0, 1, NULL);
158 // Layout Control bar so we can query the required height
159 DoGadgetMethod(iwt->iwt_ControlBar,
160 win, NULL,
161 GM_LAYOUT,
162 NULL, // GadgetInfo is filled in by DoGadgetMethod
163 TRUE);
165 GetAttr(GA_Height, (Object *) iwt->iwt_ControlBar, &Height);
167 d1(KPrintF("%s/%s/%ld: Height=%ld\n", __FILE__, __FUNC__, __LINE__, Height));
168 d1(KPrintF("%s/%s/%ld: iwt_ExtraHeight=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_ExtraHeight));
169 d1(KPrintF("%s/%s/%ld: iwt_InnerTop=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_InnerTop));
171 iwt->iwt_ExtraHeight += Height;
172 iwt->iwt_InnerTop += iwt->iwt_GadgetBarHeightTop;
173 iwt->iwt_InnerHeight -= iwt->iwt_InnerTop;
175 d1(KPrintF("%s/%s/%ld: iwt_GadgetBarHeightTop=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_GadgetBarHeightTop));
176 d1(KPrintF("%s/%s/%ld: iwt_ExtraHeight=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_ExtraHeight));
177 d1(KPrintF("%s/%s/%ld: iwt_InnerTop=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_InnerTop));
179 d1(KPrintF("%s/%s/%ld: iwt_ExtraHeight=%ld iwt_GadgetBarHeightTop=%ld\n", \
180 __FILE__, __FUNC__, __LINE__, iwt->iwt_ExtraHeight, iwt->iwt_GadgetBarHeightTop));
181 d1(KPrintF("%s/%s/%ld: iwt_InnerTop=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_InnerTop));
183 Success = TRUE;
184 } while (0);
186 d1(KPrintF("%s/%s/%ld: Success=%ld\n", __FILE__, __FUNC__, __LINE__, Success));
188 return Success;
191 //----------------------------------------------------------------------------
193 void ControlBarRemove(struct internalScaWindowTask *iwt)
195 struct ControlBarMember *Member;
197 iwt->iwt_HighlightedControlBarGadget = NULL;
199 if (iwt->iwt_ControlBar)
201 d1(kprintf("%s/%s/%ld: iwt_ExtraHeight=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_ExtraHeight));
203 if (iwt->iwt_WindowTask.wt_Window)
204 RemoveGList(iwt->iwt_WindowTask.wt_Window, iwt->iwt_ControlBar, 1);
206 d1(kprintf("%s/%s/%ld: iwt_InnerBottom=%ld iwt_SkipBottom=%ld\n", \
207 __FILE__, __FUNC__, __LINE__, iwt->iwt_InnerBottom, iwt->iwt_SkipBottom));
209 d1(KPrintF("%s/%s/%ld: iwt_GadgetBarHeightTop=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_GadgetBarHeightTop));
210 d1(KPrintF("%s/%s/%ld: iwt_ExtraHeight=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_ExtraHeight));
211 d1(KPrintF("%s/%s/%ld: iwt_InnerTop=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_InnerTop));
213 iwt->iwt_ExtraHeight -= iwt->iwt_GadgetBarHeightTop;
214 iwt->iwt_InnerTop -= iwt->iwt_GadgetBarHeightTop;
215 iwt->iwt_InnerHeight += iwt->iwt_GadgetBarHeightTop;
217 d1(KPrintF("%s/%s/%ld: iwt_ExtraHeight=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_ExtraHeight));
218 d1(KPrintF("%s/%s/%ld: iwt_InnerTop=%ld\n", __FILE__, __FUNC__, __LINE__, iwt->iwt_InnerTop));
220 DisposeObject((Object *) iwt->iwt_ControlBar);
221 iwt->iwt_ControlBar = NULL;
223 d1(kprintf("%s/%s/%ld: iwt_InnerBottom=%ld iwt_SkipBottom=%ld\n", \
224 __FILE__, __FUNC__, __LINE__, iwt->iwt_InnerBottom, iwt->iwt_SkipBottom));
227 while ((Member = (struct ControlBarMember *) RemHead(&iwt->iwt_ControlBarMemberList)))
229 FreeControlBarMember(Member);
233 //----------------------------------------------------------------------------
235 void ControlBarRebuild(struct internalScaWindowTask *iwt)
237 const struct List *CbGadgetsList;
239 d1(KPrintF("%s/%s/%ld: START iwt=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, iwt, iwt->iwt_WinTitle));
241 if (iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags & WSV_FlagF_BrowserMode)
242 CbGadgetsList = &ControlBarGadgetListBrowser;
243 else
244 CbGadgetsList = &ControlBarGadgetListNormal;
246 if (IsListEmpty((struct List *) CbGadgetsList) || (iwt->iwt_WindowTask.mt_WindowStruct->ws_MoreFlags & WSV_MoreFlagF_NoControlBar))
248 // No control bar desired for window - remove it if present
249 ControlBarRemove(iwt);
251 else
253 if (iwt->iwt_ControlBar)
255 // control bar is already present - apply modifications
256 struct ControlBarMember *Member;
257 ULONG OldHeight = 0, NewHeight = 0;
258 ULONG OldHeightTop = iwt->iwt_GadgetBarHeightTop;
259 ULONG OldInnerTop = iwt->iwt_InnerTop;
261 iwt->iwt_HighlightedControlBarGadget = NULL;
263 GetAttr(GA_Height, (Object *) iwt->iwt_ControlBar, &OldHeight);
265 d1(KPrintF("%s/%s/%ld: OldHeight=%ld\n", __FILE__, __FUNC__, __LINE__, OldHeight));
267 while ((Member = (struct ControlBarMember *) RemHead(&iwt->iwt_ControlBarMemberList)))
269 DoMethod(iwt->iwt_WindowTask.mt_MainObject,
270 SCCM_IconWin_RemFromControlBar,
271 Member->cbm_Gadget,
272 TAG_END);
273 FreeControlBarMember(Member);
276 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
278 ControlBarAddGadgets(iwt, CbGadgetsList);
280 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
282 // Layout Control bar so we can query the required height
283 DoGadgetMethod(iwt->iwt_ControlBar,
284 iwt->iwt_WindowTask.wt_Window, NULL,
285 GM_LAYOUT,
286 NULL, // GadgetInfo is filled in by DoGadgetMethod
287 FALSE);
289 d1(KPrintF("%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
291 GetAttr(GA_Height, (Object *) iwt->iwt_ControlBar, &NewHeight);
293 d1(KPrintF("%s/%s/%ld: NewHeight=%ld\n", __FILE__, __FUNC__, __LINE__, NewHeight));
295 if (NewHeight != OldHeight)
297 iwt->iwt_ExtraHeight += NewHeight - OldHeight;
298 iwt->iwt_InnerTop += iwt->iwt_GadgetBarHeightTop - OldHeightTop;
299 iwt->iwt_InnerHeight -= iwt->iwt_InnerTop - OldInnerTop;
302 else
304 // control bar was not present - add it now
305 ControlBarAdd(iwt);
309 DoMethod(iwt->iwt_WindowTask.mt_WindowObject, SCCM_Window_SetInnerSize);
311 d1(KPrintF("%s/%s/%ld: END\n", __FILE__, __FUNC__, __LINE__));
314 //----------------------------------------------------------------------------
316 void ControlBarUpdateViewMode(struct internalScaWindowTask *iwt, UBYTE ViewByType)
318 struct ControlBarMember *Member;
320 for (Member = (struct ControlBarMember *) iwt->iwt_ControlBarMemberList.lh_Head;
321 Member != (struct ControlBarMember *) &iwt->iwt_ControlBarMemberList.lh_Tail;
322 Member = (struct ControlBarMember *) Member->cbm_Node.ln_Succ)
324 if (SCPGadgetType_ViewBy == Member->cbm_GadgetType)
326 SetGadgetAttrs((struct Gadget *) Member->cbm_Gadget,
327 iwt->iwt_WindowTask.wt_Window, NULL,
328 SCACYCLE_Active, ControlbarCodeFromViewMode(ViewByType),
329 TAG_END);
334 //----------------------------------------------------------------------------
336 static ULONG ControlbarCodeFromViewMode(UBYTE ViewByType)
338 ULONG Code;
340 switch (ViewByType)
342 case IDTV_ViewModes_Default:
343 if (IsViewByIcon(ViewByType))
344 Code = 0;
345 else
346 Code = 1;
347 break;
348 case IDTV_ViewModes_Icon:
349 Code = 0;
350 break;
351 case IDTV_ViewModes_Name:
352 Code = 1;
353 break;
354 case IDTV_ViewModes_Size:
355 Code = 2;
356 break;
357 case IDTV_ViewModes_Date:
358 Code = 3;
359 break;
360 case IDTV_ViewModes_Time:
361 Code = 4;
362 break;
363 case IDTV_ViewModes_Comment:
364 Code = 5;
365 break;
366 case IDTV_ViewModes_Protection:
367 Code = 6;
368 break;
369 case IDTV_ViewModes_Type:
370 Code = 7;
371 break;
372 default:
373 Code = 1;
374 break;
377 return Code;
380 //----------------------------------------------------------------------------
382 UBYTE ControlBarViewModeFromCode(ULONG Code)
384 UBYTE ViewMode;
386 switch (Code)
388 case 0:
389 ViewMode = IDTV_ViewModes_Icon;
390 break;
391 case 1:
392 ViewMode = IDTV_ViewModes_Name;
393 break;
394 case 2:
395 ViewMode = IDTV_ViewModes_Size;
396 break;
397 case 3:
398 ViewMode = IDTV_ViewModes_Date;
399 break;
400 case 4:
401 ViewMode = IDTV_ViewModes_Time;
402 break;
403 case 5:
404 ViewMode = IDTV_ViewModes_Comment;
405 break;
406 case 6:
407 ViewMode = IDTV_ViewModes_Protection;
408 break;
409 case 7:
410 ViewMode = IDTV_ViewModes_Type;
411 break;
412 default:
413 ViewMode = IDTV_ViewModes_Default;
414 break;
417 return ViewMode;
420 //----------------------------------------------------------------------------
422 void ControlBarUpdateShowMode(struct internalScaWindowTask *iwt)
424 struct ControlBarMember *Member;
426 for (Member = (struct ControlBarMember *) iwt->iwt_ControlBarMemberList.lh_Head;
427 Member != (struct ControlBarMember *) &iwt->iwt_ControlBarMemberList.lh_Tail;
428 Member = (struct ControlBarMember *) Member->cbm_Node.ln_Succ)
430 if (SCPGadgetType_ShowMode == Member->cbm_GadgetType)
432 SetGadgetAttrs((struct Gadget *) Member->cbm_Gadget,
433 iwt->iwt_WindowTask.wt_Window, NULL,
434 SCACYCLE_Active, IsShowAll(iwt->iwt_WindowTask.mt_WindowStruct) ? 1 : 0,
435 TAG_END);
440 //----------------------------------------------------------------------------
442 void ControlBarUpdateHistory(struct internalScaWindowTask *iwt)
444 struct ControlBarMember *Member;
446 for (Member = (struct ControlBarMember *) iwt->iwt_ControlBarMemberList.lh_Head;
447 Member != (struct ControlBarMember *) &iwt->iwt_ControlBarMemberList.lh_Tail;
448 Member = (struct ControlBarMember *) Member->cbm_Node.ln_Succ)
450 if (SCPGadgetType_History == Member->cbm_GadgetType)
452 SetGadgetAttrs((struct Gadget *) Member->cbm_Gadget,
453 iwt->iwt_WindowTask.wt_Window, NULL,
454 SCAHISTORY_Active, (ULONG) iwt->iwt_CurrentHistoryEntry,
455 TAG_END);
460 //----------------------------------------------------------------------------
462 static struct ControlBarMember *ControlBarCreateViewByCycle(struct internalScaWindowTask *iwt,
463 const struct ControlBarGadgetEntry *cgy, ULONG GadgetID)
465 static const ULONG CycleLabelMsgIds[] =
467 MSGID_CONTROLBAR_VIEWBY_ICON,
468 MSGID_CONTROLBAR_VIEWBY_NAME,
469 MSGID_CONTROLBAR_VIEWBY_SIZE,
470 MSGID_CONTROLBAR_VIEWBY_DATE,
471 MSGID_CONTROLBAR_VIEWBY_TIME,
472 MSGID_CONTROLBAR_VIEWBY_COMMENT,
473 MSGID_CONTROLBAR_VIEWBY_PROTECTION,
474 MSGID_CONTROLBAR_VIEWBY_TYPE,
476 static CONST_STRPTR CycleLabels[1 + Sizeof(CycleLabelMsgIds)];
477 struct ControlBarMember *Member;
478 BOOL Success = FALSE;
480 if (NULL == CycleLabels[0])
482 ULONG n;
484 for (n = 0; n < Sizeof(CycleLabelMsgIds); n++)
485 CycleLabels[n] = GetLocString(CycleLabelMsgIds[n]);
488 do {
489 Member = ScalosAlloc(sizeof(struct ControlBarMember));
490 if (NULL == Member)
491 break;
493 Member->cbm_NormalImage = NULL;
494 Member->cbm_SelectedImage = NULL;
495 Member->cbm_smcom = NULL; // for action buttons, holds pointer to MenuCommandTable entry
496 Member->cbm_DisableFunc = NULL;
498 // Frame image is optional
499 Member->cbm_FrameImage = SCA_NewScalosObjectTags("FrameImage.sca",
500 FRAMEIMG_ImageName, (ULONG) "THEME:Window/ControlBar/ViewByCycleFrame",
501 TAG_END);
502 d1(KPrintF("%s/%s/%ld: FrameImage=%08lx\n", __FILE__, __FUNC__, __LINE__, Frame));
504 Member->cbm_Gadget = SCA_NewScalosObjectTags("CycleGadget.sca",
505 SCACYCLE_Labels, (ULONG) CycleLabels,
506 SCACYCLE_Active, ControlbarCodeFromViewMode(iwt->iwt_WindowTask.mt_WindowStruct->ws_Viewmodes),
507 SCACYCLE_TextFont, (ULONG) iInfos.xii_iinfos.ii_Screen->RastPort.Font,
508 SCACYCLE_PopupTextFont, (ULONG) iInfos.xii_iinfos.ii_Screen->RastPort.Font,
509 SCACYCLE_PopupTTFont, CurrentPrefs.pref_UseScreenTTFont ? (ULONG) &ScreenTTFont : 0,
510 Member->cbm_FrameImage ? SCACYCLE_FrameImage : TAG_IGNORE, (ULONG) Member->cbm_FrameImage,
511 GA_ID, GadgetID,
512 GA_RelVerify, TRUE,
513 GA_GadgetHelp, TRUE,
514 ICA_TARGET, ICTARGET_IDCMP,
515 TAG_END);
516 if (NULL == Member->cbm_Gadget)
517 break;
519 Success = TRUE;
520 } while (0);
522 if (!Success)
524 FreeControlBarMember(Member);
525 Member = NULL;
528 return Member;
531 //----------------------------------------------------------------------------
533 static struct ControlBarMember *ControlBarCreateShowModeCycle(struct internalScaWindowTask *iwt,
534 const struct ControlBarGadgetEntry *cgy, ULONG GadgetID)
536 static const ULONG ShowModeLabelMsgIds[] =
538 MSGID_CONTROLBAR_SHOW_ONLYICONS,
539 MSGID_CONTROLBAR_SHOW_ALLFILES,
541 static CONST_STRPTR ShowModeLabels[1 + Sizeof(ShowModeLabelMsgIds)];
542 struct ControlBarMember *Member;
543 BOOL Success = FALSE;
545 if (NULL == ShowModeLabels[0])
547 ULONG n;
549 for (n = 0; n < Sizeof(ShowModeLabelMsgIds); n++)
550 ShowModeLabels[n] = GetLocString(ShowModeLabelMsgIds[n]);
553 do {
554 Member = ScalosAlloc(sizeof(struct ControlBarMember));
555 if (NULL == Member)
556 break;
558 Member->cbm_NormalImage = NULL;
559 Member->cbm_SelectedImage = NULL;
560 Member->cbm_smcom = NULL; // for action buttons, holds pointer to MenuCommandTable entry
561 Member->cbm_DisableFunc = NULL;
563 // Frame image is optional
564 Member->cbm_FrameImage = SCA_NewScalosObjectTags("FrameImage.sca",
565 FRAMEIMG_ImageName, (ULONG) "THEME:Window/ControlBar/ShowModeCycleFrame",
566 TAG_END);
567 d1(KPrintF("%s/%s/%ld: FrameImage=%08lx\n", __FILE__, __FUNC__, __LINE__, Frame));
569 Member->cbm_Gadget = SCA_NewScalosObjectTags("CycleGadget.sca",
570 SCACYCLE_Labels, (ULONG) ShowModeLabels,
571 SCACYCLE_Active, IsShowAll(iwt->iwt_WindowTask.mt_WindowStruct) ? 1 : 0,
572 SCACYCLE_TextFont, (ULONG) iInfos.xii_iinfos.ii_Screen->RastPort.Font,
573 SCACYCLE_PopupTextFont, (ULONG) iInfos.xii_iinfos.ii_Screen->RastPort.Font,
574 SCACYCLE_PopupTTFont, CurrentPrefs.pref_UseScreenTTFont ? (ULONG) &ScreenTTFont : 0,
575 Member->cbm_FrameImage ? SCACYCLE_FrameImage : TAG_IGNORE, (ULONG) Member->cbm_FrameImage,
576 GA_ID, GadgetID,
577 GA_RelVerify, TRUE,
578 GA_GadgetHelp, TRUE,
579 ICA_TARGET, ICTARGET_IDCMP,
580 TAG_END);
581 if (NULL == Member->cbm_Gadget)
582 break;
584 Success = TRUE;
585 } while (0);
587 if (!Success)
589 FreeControlBarMember(Member);
590 Member = NULL;
593 return Member;
596 //----------------------------------------------------------------------------
598 static struct ControlBarMember *ControlBarCreateSeparator(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID)
600 struct ControlBarMember *Member;
601 BOOL Success = FALSE;
603 do {
604 Member = ScalosAlloc(sizeof(struct ControlBarMember));
605 if (NULL == Member)
606 break;
608 memset(Member, 0, sizeof(struct ControlBarMember));
610 Member->cbm_Gadget = SCA_NewScalosObjectTags("SeparatorGadget.sca",
611 GA_Width, 15,
612 GA_Height, 3,
613 GA_BottomBorder, TRUE,
614 GA_ID, GadgetID,
615 GA_Immediate, FALSE,
616 GA_RelVerify, FALSE,
617 GA_GadgetHelp, TRUE,
618 TAG_END);
619 if (NULL == Member->cbm_Gadget)
620 break;
622 Member->cbm_DisableFunc = NULL;
624 Success = TRUE;
625 } while (0);
627 if (!Success)
629 FreeControlBarMember(Member);
630 Member = NULL;
633 return Member;
636 //----------------------------------------------------------------------------
638 static struct ControlBarMember *ControlBarCreateActionButton(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID)
640 struct ControlBarMember *Member = NULL;
641 BOOL Success = FALSE;
643 d1(KPrintF("%s/%s/%ld: START cgy_Action=<%s>\n", __FILE__, __FUNC__, __LINE__, cgy->cgy_Action));
645 do {
646 ULONG n;
647 const struct ScalosMenuCommand *smcom = NULL;
649 for (n = 0; MenuCommandTable[n].smcom_CommandName; n++)
651 if (0 == stricmp(cgy->cgy_Action, MenuCommandTable[n].smcom_CommandName))
653 smcom = &MenuCommandTable[n];
654 break;
658 d1(KPrintF("%s/%s/%ld: smcom=%08lx\n", __FILE__, __FUNC__, __LINE__, smcom));
659 if (NULL == smcom)
660 break; // unknown command string
662 Member = ScalosAlloc(sizeof(struct ControlBarMember));
663 d1(KPrintF("%s/%s/%ld: Member=%08lx\n", __FILE__, __FUNC__, __LINE__, Member));
664 if (NULL == Member)
665 break;
667 memset(Member, 0, sizeof(struct ControlBarMember));
669 Member->cbm_smcom = smcom;
671 // imgNormal is always required
672 Member->cbm_NormalImage = NewObject(DtImageClass, NULL,
673 DTIMG_ImageName, (ULONG) cgy->cgy_NormalImage,
674 DTIMG_SelImageName, (ULONG) cgy->cgy_SelectedImage,
675 DTIMG_DisabledImageName, (ULONG) cgy->cgy_DisabledImage,
676 TAG_END);
677 d1(KPrintF("%s/%s/%ld: cbm_NormalImage=%08lx\n", __FILE__, __FUNC__, __LINE__, Member->cbm_NormalImage));
678 if (NULL == Member->cbm_NormalImage)
679 break;
681 Member->cbm_Gadget = SCA_NewScalosObjectTags("ButtonGadget.sca",
682 GA_Immediate, TRUE,
683 GA_BottomBorder, TRUE,
684 GA_ID, GadgetID,
685 GA_RelVerify, TRUE,
686 GA_GadgetHelp, TRUE,
687 GA_Image, (ULONG) Member->cbm_NormalImage,
688 TAG_END);
689 d1(KPrintF("%s/%s/%ld: cbm_Gadget=%08lx\n", __FILE__, __FUNC__, __LINE__, Member->cbm_Gadget));
690 if (NULL == Member->cbm_Gadget)
691 break;
693 Member->cbm_DisableFunc = NULL;
695 Success = TRUE;
696 } while (0);
698 if (!Success)
700 FreeControlBarMember(Member);
701 Member = NULL;
704 return Member;
707 //----------------------------------------------------------------------------
709 static struct ControlBarMember *ControlBarCreateBackButton(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID)
711 return ControlBarCreateButton("ButtonBackNormal", "ButtonBackSelected",
712 "ButtonBackDisabled",
713 GadgetID, LEFTIMAGE, ControlBarBackDisable);
716 //----------------------------------------------------------------------------
718 static struct ControlBarMember *ControlBarCreateForwardButton(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID)
720 return ControlBarCreateButton("ButtonForwardNormal", "ButtonForwardSelected",
721 "ButtonForwardDisabled",
722 GadgetID, RIGHTIMAGE, ControlBarForwardDisable);
725 //----------------------------------------------------------------------------
727 static struct ControlBarMember *ControlBarCreateParentButton(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID)
729 return ControlBarCreateButton("ButtonUpNormal", "ButtonUpSelected",
730 "ButtonUpDisabled",
731 GadgetID, UPIMAGE, ControlBarParentDisable);
734 //----------------------------------------------------------------------------
736 static struct ControlBarMember *ControlBarCreateBrowseButton(const struct ControlBarGadgetEntry *cgy, ULONG GadgetID)
738 return ControlBarCreateButton("BrowseNormal", "BrowseSelected",
739 "BrowseDisabled",
740 GadgetID, UPIMAGE, NULL);
743 //----------------------------------------------------------------------------
745 static struct ControlBarMember *ControlBarCreateButton(CONST_STRPTR NormalImgName,
746 CONST_STRPTR SelectedImgName, CONST_STRPTR DisabledImgName,
747 ULONG GadgetID, ULONG FallbackSysImg, CBM_DISABLEFUNC DisableFunc)
749 STRPTR ImageNameNrm;
750 STRPTR ImageNameSel = NULL;
751 STRPTR ImageNameDisabled = NULL;
752 struct ControlBarMember *Member = NULL;
753 BOOL Success = FALSE;
755 do {
756 ImageNameNrm = AllocPathBuffer();
757 if (NULL == ImageNameNrm)
758 break;
760 ImageNameSel= AllocPathBuffer();
761 if (NULL == ImageNameSel)
762 break;
764 ImageNameDisabled = AllocPathBuffer();
765 if (NULL == ImageNameDisabled)
766 break;
768 Member = ScalosAlloc(sizeof(struct ControlBarMember));
769 if (NULL == Member)
770 break;
772 d1(KPrintF("%s/%s/%ld: NormalImgName=<%s>\n", __FILE__, __FUNC__, __LINE__, NormalImgName));
774 memset(Member, 0, sizeof(struct ControlBarMember));
776 stccpy(ImageNameNrm, "THEME:Window/ControlBar", Max_PathLen);
777 AddPart(ImageNameNrm, NormalImgName, Max_PathLen);
779 stccpy(ImageNameSel, "THEME:Window/ControlBar", Max_PathLen);
780 AddPart(ImageNameSel, SelectedImgName, Max_PathLen);
782 stccpy(ImageNameDisabled, "THEME:Window/ControlBar", Max_PathLen);
783 AddPart(ImageNameDisabled, DisabledImgName, Max_PathLen);
785 // imgNormal is always required
786 Member->cbm_NormalImage = NewObject(DtImageClass, NULL,
787 DTIMG_ImageName, (ULONG) ImageNameNrm,
788 DTIMG_SelImageName, (ULONG) ImageNameSel,
789 DTIMG_DisabledImageName, (ULONG) ImageNameDisabled,
790 TAG_END);
791 d1(KPrintF("%s/%s/%ld: cbm_NormalImage=%08lx\n", __FILE__, __FUNC__, __LINE__, Member->cbm_NormalImage));
792 if (NULL == Member->cbm_NormalImage)
794 // no Theme image could be found - fall back to sys image
795 Member->cbm_NormalImage = NewObject(NULL, SYSICLASS,
796 SYSIA_Which, FallbackSysImg,
797 SYSIA_DrawInfo, (ULONG) iInfos.xii_iinfos.ii_DrawInfo,
798 TAG_END);
800 d1(KPrintF("%s/%s/%ld: cbm_NormalImage=%08lx\n", __FILE__, __FUNC__, __LINE__, Member->cbm_NormalImage));
801 if (NULL == Member->cbm_NormalImage)
802 break;
804 Member->cbm_Gadget = SCA_NewScalosObjectTags("ButtonGadget.sca",
805 GA_Immediate, TRUE,
806 GA_BottomBorder, TRUE,
807 GA_ID, GadgetID,
808 GA_RelVerify, TRUE,
809 GA_GadgetHelp, TRUE,
810 GA_Image, (ULONG) Member->cbm_NormalImage,
811 TAG_END);
812 d1(KPrintF("%s/%s/%ld: cbm_Gadget=%08lx\n", __FILE__, __FUNC__, __LINE__, Member->cbm_Gadget));
813 if (NULL == Member->cbm_Gadget)
814 break;
816 Member->cbm_DisableFunc = DisableFunc;
818 Success = TRUE;
819 } while (0);
821 if (ImageNameNrm)
822 FreePathBuffer(ImageNameNrm);
823 if (ImageNameSel)
824 FreePathBuffer(ImageNameSel);
825 if (ImageNameDisabled)
826 FreePathBuffer(ImageNameDisabled);
827 if (!Success)
829 FreeControlBarMember(Member);
830 Member = NULL;
833 return Member;
836 //----------------------------------------------------------------------------
838 static struct ControlBarMember *ControlBarCreateHistoryGadget(struct internalScaWindowTask *iwt,
839 const struct ControlBarGadgetEntry *cgy, ULONG GadgetID)
841 struct ControlBarMember *Member;
842 BOOL Success = FALSE;
844 do {
845 Member = ScalosAlloc(sizeof(struct ControlBarMember));
846 if (NULL == Member)
847 break;
849 memset(Member, 0, sizeof(struct ControlBarMember));
851 // imgNormal is always required
852 Member->cbm_NormalImage = NewObject(DtImageClass, NULL,
853 DTIMG_ImageName, (ULONG) "THEME:Window/ControlBar/HistoryNormal" ,
854 DTIMG_SelImageName, (ULONG) "THEME:Window/ControlBar/HistorySelected" ,
855 DTIMG_DisabledImageName, (ULONG) "THEME:Window/ControlBar/HistoryDisabled" ,
856 TAG_END);
857 if (NULL == Member->cbm_NormalImage)
859 // no Theme image could be found - fall back to sys image
860 Member->cbm_NormalImage = NewObject(NULL, SYSICLASS,
861 SYSIA_Which, MXIMAGE,
862 SYSIA_DrawInfo, (ULONG) iInfos.xii_iinfos.ii_DrawInfo,
863 TAG_END);
865 if (NULL == Member->cbm_NormalImage)
866 break;
868 ScalosObtainSemaphoreShared(&iwt->iwt_WindowHistoryListSemaphore);
870 Member->cbm_Gadget = SCA_NewScalosObjectTags("HistoryGadget.sca",
871 GA_Immediate, TRUE,
872 GA_BottomBorder, TRUE,
873 GA_ID, GadgetID,
874 GA_RelVerify, TRUE,
875 GA_GadgetHelp, TRUE,
876 GA_Image, (ULONG) Member->cbm_NormalImage,
877 SCAHISTORY_Labels, (ULONG) &iwt->iwt_HistoryList,
878 SCAHISTORY_Active, (ULONG) iwt->iwt_CurrentHistoryEntry,
879 TAG_END);
880 if (NULL == Member->cbm_Gadget)
881 break;
883 ScalosReleaseSemaphore(&iwt->iwt_WindowHistoryListSemaphore);
885 Member->cbm_DisableFunc = ControlBarHistoryListDisable;
887 Success = TRUE;
888 } while (0);
890 if (!Success)
892 FreeControlBarMember(Member);
893 Member = NULL;
896 return Member;
899 //----------------------------------------------------------------------------
901 struct ControlBarGadgetEntry *ControlBarFindGadgetByID(struct internalScaWindowTask *iwt, UWORD GadgetID)
903 struct ControlBarMember *Member;
905 for (Member = (struct ControlBarMember *) iwt->iwt_ControlBarMemberList.lh_Head;
906 Member != (struct ControlBarMember *) &iwt->iwt_ControlBarMemberList.lh_Tail;
907 Member = (struct ControlBarMember *) Member->cbm_Node.ln_Succ)
909 struct ExtGadget *gg = (struct ExtGadget *) Member->cbm_Gadget;
911 if (GadgetID == gg->GadgetID)
912 return &Member->cbm_Entry;
915 return NULL;
918 //----------------------------------------------------------------------------
920 static UWORD ControlBarQueryGadgetID(struct ExtGadget *gg)
922 ULONG Code = 0;
924 GetAttr(GBDTA_LastActive, (Object *) gg, &Code);
925 d1(KPrintF("%s/%s/%ld: Code=%04lx\n", __FILE__, __FUNC__, __LINE__, Code));
927 return (UWORD) Code;
929 //----------------------------------------------------------------------------
931 UWORD ControlBarQueryGadgetType(struct internalScaWindowTask *iwt, struct ExtGadget *gg)
933 ULONG GadgetID = ControlBarQueryGadgetID(gg);
934 struct ControlBarGadgetEntry *cgy;
936 d1(KPrintF("%s/%s/%ld: GadgetID=%ld\n", __FILE__, __FUNC__, __LINE__, GadgetID));
938 cgy = ControlBarFindGadgetByID(iwt, GadgetID);
939 d1(KPrintF("%s/%s/%ld: cgy=%08lx\n", __FILE__, __FUNC__, __LINE__, cgy));
940 if (cgy)
941 return (UWORD) cgy->cgy_GadgetType;
943 return (UWORD) ~0;
946 //----------------------------------------------------------------------------
948 static void FreeControlBarMember(struct ControlBarMember *Member)
950 if (Member)
952 // cbm_Gadget is freed by GadgetBar
953 if (Member->cbm_NormalImage)
955 DisposeObject(Member->cbm_NormalImage);
956 Member->cbm_NormalImage = NULL;
958 if (Member->cbm_SelectedImage)
960 DisposeObject(Member->cbm_SelectedImage);
961 Member->cbm_SelectedImage = NULL;
963 if (Member->cbm_FrameImage)
965 SCA_DisposeScalosObject(Member->cbm_FrameImage);
966 Member->cbm_FrameImage = NULL;
969 FreeCopyString(Member->cbm_Entry.cgy_NormalImage);
970 FreeCopyString(Member->cbm_Entry.cgy_SelectedImage);
971 FreeCopyString(Member->cbm_Entry.cgy_DisabledImage);
972 FreeCopyString(Member->cbm_Entry.cgy_HelpText);
974 ScalosFree(Member);
978 //----------------------------------------------------------------------------
980 static struct ControlBarMember *ControlBarFindMember(struct internalScaWindowTask *iwt,
981 ULONG GadgetID)
983 struct ControlBarMember *Member;
985 for (Member = (struct ControlBarMember *) iwt->iwt_ControlBarMemberList.lh_Head;
986 Member != (struct ControlBarMember *) &iwt->iwt_ControlBarMemberList.lh_Tail;
987 Member = (struct ControlBarMember *) Member->cbm_Node.ln_Succ)
989 struct ExtGadget *gg = (struct ExtGadget *) Member->cbm_Gadget;
991 if (gg && gg->GadgetID == GadgetID)
992 return Member;
995 return NULL; // not found
998 //----------------------------------------------------------------------------
1000 // Update disable state of control bar gadgets
1001 void SetControlBarOnOff(struct internalScaWindowTask *iwt)
1003 struct ControlBarMember *Member;
1005 for (Member = (struct ControlBarMember *) iwt->iwt_ControlBarMemberList.lh_Head;
1006 Member != (struct ControlBarMember *) &iwt->iwt_ControlBarMemberList.lh_Tail;
1007 Member = (struct ControlBarMember *) Member->cbm_Node.ln_Succ)
1009 if (Member->cbm_Gadget)
1011 if (Member->cbm_DisableFunc)
1013 Member->cbm_DisableFunc(iwt, Member);
1015 else if (Member->cbm_smcom && Member->cbm_smcom->smcom_Enable)
1017 struct Gadget *gg = (struct Gadget *) Member->cbm_Gadget;
1019 if (Member->cbm_smcom->smcom_Enable(iwt, NULL))
1021 if (gg->Flags & GFLG_DISABLED)
1023 SetGadgetAttrs(gg,
1024 iwt->iwt_WindowTask.wt_Window, NULL,
1025 GA_Disabled, FALSE,
1026 TAG_END);
1029 else
1031 if (!(gg->Flags & GFLG_DISABLED))
1033 SetGadgetAttrs(gg,
1034 iwt->iwt_WindowTask.wt_Window, NULL,
1035 GA_Disabled, TRUE,
1036 TAG_END);
1045 //----------------------------------------------------------------------------
1047 static void ControlBarParentDisable(struct internalScaWindowTask *iwt, struct ControlBarMember *cbm)
1049 SetGadgetAttrs((struct Gadget *) cbm->cbm_Gadget,
1050 iwt->iwt_WindowTask.wt_Window, NULL,
1051 GA_Disabled, (iwt->iwt_WindowTask.mt_WindowStruct->ws_Flags & WSV_FlagF_RootWindow),
1052 TAG_END);
1055 //----------------------------------------------------------------------------
1057 static void ControlBarBackDisable(struct internalScaWindowTask *iwt, struct ControlBarMember *cbm)
1059 BOOL Disable;
1061 ScalosObtainSemaphoreShared(&iwt->iwt_WindowHistoryListSemaphore);
1063 Disable = IsListEmpty(&iwt->iwt_HistoryList) // should not happen
1064 || NULL == iwt->iwt_CurrentHistoryEntry // should not happen
1065 || iwt->iwt_CurrentHistoryEntry == (struct WindowHistoryEntry *) iwt->iwt_HistoryList.lh_Head;
1067 ScalosReleaseSemaphore(&iwt->iwt_WindowHistoryListSemaphore);
1069 d1(KPrintF("%s/%s/%ld: IsListEmpty=%ld iwt_CurrentHistoryEntry=%08lx Disable=%ld\n", \
1070 __FILE__, __FUNC__, __LINE__, IsListEmpty(&iwt->iwt_HistoryList), iwt->iwt_CurrentHistoryEntry, Disable));
1072 SetGadgetAttrs((struct Gadget *) cbm->cbm_Gadget,
1073 iwt->iwt_WindowTask.wt_Window, NULL,
1074 GA_Disabled, Disable,
1075 TAG_END);
1078 //----------------------------------------------------------------------------
1080 static void ControlBarForwardDisable(struct internalScaWindowTask *iwt, struct ControlBarMember *cbm)
1082 BOOL Disable;
1084 ScalosObtainSemaphoreShared(&iwt->iwt_WindowHistoryListSemaphore);
1086 Disable = IsListEmpty(&iwt->iwt_HistoryList) // should not happen
1087 || NULL == iwt->iwt_CurrentHistoryEntry // should not happen
1088 || iwt->iwt_CurrentHistoryEntry == (struct WindowHistoryEntry *) iwt->iwt_HistoryList.lh_TailPred;
1090 ScalosReleaseSemaphore(&iwt->iwt_WindowHistoryListSemaphore);
1092 SetGadgetAttrs((struct Gadget *) cbm->cbm_Gadget,
1093 iwt->iwt_WindowTask.wt_Window, NULL,
1094 GA_Disabled, Disable,
1095 TAG_END);
1098 //----------------------------------------------------------------------------
1100 static void ControlBarHistoryListDisable(struct internalScaWindowTask *iwt, struct ControlBarMember *cbm)
1102 BOOL Disable;
1104 ScalosObtainSemaphoreShared(&iwt->iwt_WindowHistoryListSemaphore);
1106 Disable = IsListEmpty(&iwt->iwt_HistoryList);
1108 ScalosReleaseSemaphore(&iwt->iwt_WindowHistoryListSemaphore);
1110 SetGadgetAttrs((struct Gadget *) cbm->cbm_Gadget,
1111 iwt->iwt_WindowTask.wt_Window, NULL,
1112 GA_Disabled, Disable,
1113 TAG_END);
1116 //----------------------------------------------------------------------------
1118 void ControlBarSwitchHistoryEntry(struct internalScaWindowTask *iwt)
1120 struct ControlBarMember *Member;
1122 for (Member = (struct ControlBarMember *) iwt->iwt_ControlBarMemberList.lh_Head;
1123 Member != (struct ControlBarMember *) &iwt->iwt_ControlBarMemberList.lh_Tail;
1124 Member = (struct ControlBarMember *) Member->cbm_Node.ln_Succ)
1126 if (SCPGadgetType_History == Member->cbm_GadgetType)
1128 struct WindowHistoryEntry *whe = NULL;
1129 struct Node *ln = NULL;
1130 BPTR pLock;
1132 GetAttr(SCAHISTORY_Active, Member->cbm_Gadget, (APTR) &ln);
1134 pLock = Lock(ln->ln_Name, ACCESS_READ);
1135 if (pLock)
1137 whe = WindowFindHistoryEntry(iwt, pLock);
1138 UnLock(pLock);
1140 if (whe)
1142 DoMethod(iwt->iwt_WindowTask.mt_MainObject,
1143 SCCM_IconWin_NewPath,
1144 whe->whe_Node.ln_Name,
1145 SCA_ShowAllMode, whe->whe_ViewAll,
1146 SCA_ViewModes, whe->whe_Viewmodes,
1147 SCA_XOffset, whe->whe_XOffset,
1148 SCA_YOffset, whe->whe_YOffset,
1149 SCA_IconList, (SCANDIR_OK == whe->whe_ScanDirResult) ? whe->whe_IconList : NULL,
1150 TAG_END);
1151 ScalosReleaseSemaphore(&iwt->iwt_WindowHistoryListSemaphore);
1153 else
1155 DoMethod(iwt->iwt_WindowTask.mt_MainObject,
1156 SCCM_IconWin_NewPath,
1157 ln->ln_Name,
1158 TAG_END);
1164 //----------------------------------------------------------------------------
1166 struct ExtGadget *ControlBarFindGadget(struct internalScaWindowTask *iwt,
1167 ULONG GadgetID)
1169 struct ControlBarMember *Member;
1171 Member = ControlBarFindMember(iwt, GadgetID);
1173 return Member ? (struct ExtGadget *) Member->cbm_Gadget : NULL;
1176 //----------------------------------------------------------------------------
1178 void ControlBarActionButton(struct internalScaWindowTask *iwt, struct ExtGadget *gg)
1180 ULONG GadgetID = ControlBarQueryGadgetID(gg);
1181 struct ControlBarGadgetEntry *cgy;
1183 cgy = ControlBarFindGadgetByID(iwt, GadgetID);
1184 if (cgy)
1186 DoMethod(iwt->iwt_WindowTask.mt_MainObject,
1187 SCCM_IconWin_MenuCommand,
1188 cgy->cgy_Action,
1189 NULL,
1194 //----------------------------------------------------------------------------
1196 static void ControlBarAddGadgets(struct internalScaWindowTask *iwt, const struct List *CbGadgetsList)
1198 ULONG GadgetID = CBAR_GadgetID;
1199 struct ControlBarMember *Member;
1200 struct ControlBarGadgetEntry *cgy;
1202 for (cgy = (struct ControlBarGadgetEntry *) CbGadgetsList->lh_Head;
1203 cgy != (struct ControlBarGadgetEntry *) &CbGadgetsList->lh_Tail;
1204 cgy = (struct ControlBarGadgetEntry *) cgy->cgy_Node.ln_Succ)
1206 struct ControlBarMember *cbm;
1207 ULONG CurrentGadgetID = GadgetID++; // create unique ID for each gadget
1209 switch (cgy->cgy_GadgetType)
1211 case SCPGadgetType_BackButton:
1212 FreeCopyString(cgy->cgy_HelpText);
1213 cgy->cgy_HelpText = AllocCopyString(GetLocString(MSGID_TOOLTIP_GADGET_CONTROLBAR_BACK));
1214 cbm = ControlBarCreateBackButton(cgy, CurrentGadgetID);
1215 d1(KPrintF("%s/%s/%ld: SCPGadgetType_BackButton=%08lx\n", __FILE__, __FUNC__, __LINE__, cbm));
1216 break;
1217 case SCPGadgetType_ForwardButton:
1218 FreeCopyString(cgy->cgy_HelpText);
1219 cgy->cgy_HelpText = AllocCopyString(GetLocString(MSGID_TOOLTIP_GADGET_CONTROLBAR_FORWARD));
1220 cbm = ControlBarCreateForwardButton(cgy, CurrentGadgetID);
1221 d1(KPrintF("%s/%s/%ld: SCPGadgetType_ForwardButton=%08lx\n", __FILE__, __FUNC__, __LINE__, cbm));
1222 break;
1223 case SCPGadgetType_UpButton:
1224 FreeCopyString(cgy->cgy_HelpText);
1225 cgy->cgy_HelpText = AllocCopyString(GetLocString(MSGID_TOOLTIP_GADGET_CONTROLBAR_PARENT));
1226 cbm = ControlBarCreateParentButton(cgy, CurrentGadgetID);
1227 d1(KPrintF("%s/%s/%ld: SCPGadgetType_UpButton=%08lx\n", __FILE__, __FUNC__, __LINE__, cbm));
1228 break;
1229 case SCPGadgetType_History:
1230 FreeCopyString(cgy->cgy_HelpText);
1231 cgy->cgy_HelpText = AllocCopyString(GetLocString(MSGID_TOOLTIP_GADGET_CONTROLBAR_HISTORY));
1232 cbm = ControlBarCreateHistoryGadget(iwt, cgy, CurrentGadgetID);
1233 d1(KPrintF("%s/%s/%ld: SCPGadgetType_History=%08lx\n", __FILE__, __FUNC__, __LINE__, cbm));
1234 break;
1235 case SCPGadgetType_BrowseButton:
1236 FreeCopyString(cgy->cgy_HelpText);
1237 cgy->cgy_HelpText = AllocCopyString(GetLocString(MSGID_TOOLTIP_GADGET_CONTROLBAR_BROWSE));
1238 cbm = ControlBarCreateBrowseButton(cgy, CurrentGadgetID);
1239 d1(KPrintF("%s/%s/%ld: SCPGadgetType_BrowseButton=%08lx\n", __FILE__, __FUNC__, __LINE__, cbm));
1240 break;
1241 case SCPGadgetType_ViewBy:
1242 FreeCopyString(cgy->cgy_HelpText);
1243 cgy->cgy_HelpText = AllocCopyString(GetLocString(MSGID_TOOLTIP_GADGET_CONTROLBAR_VIEWBY));
1244 cbm = ControlBarCreateViewByCycle(iwt, cgy, CurrentGadgetID);
1245 d1(KPrintF("%s/%s/%ld: SCPGadgetType_ViewBy=%08lx\n", __FILE__, __FUNC__, __LINE__, cbm));
1246 break;
1247 case SCPGadgetType_ShowMode:
1248 FreeCopyString(cgy->cgy_HelpText);
1249 cgy->cgy_HelpText = AllocCopyString(GetLocString(MSGID_TOOLTIP_GADGET_CONTROLBAR_SHOWMODE));
1250 cbm = ControlBarCreateShowModeCycle(iwt, cgy, CurrentGadgetID);
1251 d1(KPrintF("%s/%s/%ld: SCPGadgetType_ShowMode=%08lx\n", __FILE__, __FUNC__, __LINE__, cbm));
1252 break;
1253 case SCPGadgetType_Separator:
1254 cbm = ControlBarCreateSeparator(cgy, CurrentGadgetID);
1255 d1(KPrintF("%s/%s/%ld: SCPGadgetType_Separator=%08lx\n", __FILE__, __FUNC__, __LINE__, cbm));
1256 break;
1257 case SCPGadgetType_ActionButton:
1258 cbm = ControlBarCreateActionButton(cgy, CurrentGadgetID);
1259 d1(KPrintF("%s/%s/%ld: SCPGadgetType_ActionButton=%08lx\n", __FILE__, __FUNC__, __LINE__, cbm));
1260 break;
1261 default:
1262 cbm = NULL;
1263 break;
1266 if (cbm)
1268 cbm->cbm_GadgetType = cgy->cgy_GadgetType;
1270 // Clone ControlBarGadgetEntry
1271 // done't use a reference or pointer here since
1272 // it would become invalid when preferences are reloaded
1273 cbm->cbm_Entry = *cgy;
1274 cbm->cbm_Entry.cgy_NormalImage = AllocCopyString(cgy->cgy_NormalImage);
1275 cbm->cbm_Entry.cgy_SelectedImage = AllocCopyString(cgy->cgy_SelectedImage);
1276 cbm->cbm_Entry.cgy_DisabledImage = AllocCopyString(cgy->cgy_DisabledImage);
1277 cbm->cbm_Entry.cgy_HelpText = AllocCopyString(cgy->cgy_HelpText);
1279 AddHead(&iwt->iwt_ControlBarMemberList, &cbm->cbm_Node);
1283 for (Member = (struct ControlBarMember *) iwt->iwt_ControlBarMemberList.lh_Head;
1284 Member != (struct ControlBarMember *) &iwt->iwt_ControlBarMemberList.lh_Tail;
1285 Member = (struct ControlBarMember *) Member->cbm_Node.ln_Succ)
1287 DoMethod(iwt->iwt_WindowTask.mt_MainObject,
1288 SCCM_IconWin_AddToControlBar,
1289 Member->cbm_Gadget,
1290 TAG_END);
1295 //----------------------------------------------------------------------------