Initial commit.
[amiga/xmodule.git] / SaversWin.c
1 /*
2 **      SaversWin.c
3 **
4 **      Copyright (C) 1994,95,96 Bernardo Innocenti
5 **
6 **      Savers panel handling functions.
7 */
8
9
10 #include <intuition/intuition.h>
11 #include <intuition/gadgetclass.h>
12 #include <libraries/gadtools.h>
13
14 #include <proto/exec.h>
15 #include <proto/intuition.h>
16 #include <proto/gadtools.h>
17 #include <proto/xmodule.h>
18
19 #include "XModulePriv.h"
20 #include "Gui.h"
21
22
23
24 /*!*/
25 /* Replaced by format properties stored inside hooks
26 UBYTE FormatProperties[] =
27 {
28         XMSF_NO_INSTRUMENTS|XMSF_NO_NAMES,                      // MED
29         XMSF_NO_INSTRUMENTS|XMSF_NO_NAMES,                      // OctaMED
30         ALLOWS_NO_INST|ALLOWS_NO_NAMES                          // MIDI File
31 };
32
33         "MED",
34         "OctaMED",
35         "ScreamTracker",
36         "MIDI File",
37 */
38
39
40
41
42 /* Gadgets IDs */
43 enum {
44         GD_SaversGroup0,
45                 GD_SaversGroup1,
46                         GD_SaversList,
47 //                      GD_SaversGroup2,
48                                 GD_SaversGroup3,
49                                         GD_SaveSequence,
50                                         GD_SaveInstruments,
51                                         GD_SavePatterns,
52                                         GD_SaveNames,
53                                         GD_SaveIcons,
54 //                              GD_SaversGroup4,
55 //                                      GD_PackMode,
56 //                                      GD_PackOptions,
57                 GD_SaversGroup5,
58                         GD_FormatDescription,
59                         GD_FormatAuthor,
60                         GD_SaversGroup6,
61                                 GD_SaversGroup7,
62                                         GD_MaxLength,
63                                         GD_MaxTracks,
64                                         GD_MaxInstruments,
65                                 GD_SaversGroup8,
66                                         GD_MaxPatterns,
67                                         GD_MaxPattLen,
68                                         GD_MaxSampleLen,
69                 GD_SaversGroup9,
70                         GD_FormatUse,
71                         GD_FormatCancel,
72         Savers_CNT
73 };
74
75
76
77
78 /*****************************/
79 /* Local function prototypes */
80 /*****************************/
81
82 static void SaversPostOpen      (void);
83 static void UpdateSaverInfo             (void);
84
85 static void SaversListClicked   (struct WinUserData *wud);
86 /* static void PackModeClicked          (struct WinUserData *wud);
87 static void PackOptionsClicked  (struct WinUserData *wud); */
88 static void FormatUseClicked    (struct WinUserData *wud);
89 static void FormatCancelClicked (struct WinUserData *wud);
90
91
92
93 XDEF struct SaveSwitches SaveSwitches = {1, 1, 1, 0, 1};
94 XDEF struct SaveSwitches SaveSwitchesBackup;
95
96
97
98 /*
99 static STRPTR PackModeLabels[] =
100 {
101         (STRPTR)MSG_NONE_GAD,
102         (STRPTR)MSG_XPK_GAD,
103         (STRPTR)MSG_LHA_GAD,
104         (STRPTR)0
105 };
106 */
107
108
109 static ULONG SaversArgs[] =
110 {
111         HGROUP_KIND, 0,
112                 LISTVIEW_KIND,  (ULONG)SaversListClicked, 0, NULL, TAG_DONE,
113 //              VGROUP_KIND, 0,
114                         VGROUP_KIND, BBFT_RIDGE,
115                                 CHECKBOX_KIND,  NULL, MSG_SF_SEQUENCE_GAD,              (ULONG)&SaveSwitches.SaveSeq,   TAG_DONE,
116                                 CHECKBOX_KIND,  NULL, MSG_SF_INSTRUMENTS_GAD,   (ULONG)&SaveSwitches.SaveInstr, TAG_DONE,
117                                 CHECKBOX_KIND,  NULL, MSG_SF_PATTERNS_GAD,              (ULONG)&SaveSwitches.SavePatt,  TAG_DONE,
118                                 CHECKBOX_KIND,  NULL, MSG_SF_NAMES_GAD,                 (ULONG)&SaveSwitches.SaveNames, TAG_DONE,
119                                 CHECKBOX_KIND,  NULL, MSG_ADD_ICON_GAD,                 (ULONG)&SaveSwitches.SaveIcons, TAG_DONE,
120                                 ENDGROUP_KIND,
121 //                      VGROUP_KIND, BBFT_RIDGE,
122 //                              CYCLE_KIND,             (ULONG)PackModeClicked,         MSG_MODE_GAD,                   (ULONG)PackModeLabels,  TAG_DONE,
123 //                              BUTTON_KIND,    (ULONG)PackOptionsClicked,      MSG_OPTIONS_DOTS_GAD,                                                   TAG_DONE,
124 //                              ENDGROUP_KIND,
125 //                      ENDGROUP_KIND,
126                 ENDGROUP_KIND,
127         VGROUP_KIND, BBFT_RIDGE,
128                 TEXT_KIND,              MSG_DESCRIPTION,        25,             GTTX_Border, TRUE, TAG_DONE,
129                 TEXT_KIND,              MSG_AUTHOR,                     15,             GTTX_Border, TRUE, TAG_DONE,
130                 HGROUP_KIND,    0,
131                         VGROUP_KIND,    0,
132                                 NUMBER_KIND,    MSG_MAXLENGTH,          3,      TAG_DONE,
133                                 NUMBER_KIND,    MSG_MAXTRACKS,          3,      TAG_DONE,
134                                 NUMBER_KIND,    MSG_MAXINSTRUMENTS,     3,      TAG_DONE,
135                                 ENDGROUP_KIND,
136                         VGROUP_KIND,    0,
137                                 NUMBER_KIND,    MSG_MAXPATTERNS,        5,      TAG_DONE,
138                                 NUMBER_KIND,    MSG_MAXPATTLEN,         5,      TAG_DONE,
139                                 NUMBER_KIND,    MSG_MAXSAMPLELEN,       9,      TAG_DONE,
140                                 ENDGROUP_KIND,
141                         ENDGROUP_KIND,
142                 ENDGROUP_KIND,
143         HGROUP_KIND, 0,
144                 BUTTON_KIND,    (ULONG)FormatUseClicked,        MSG_UNDERSCORE_USE_GAD,         TAG_DONE,
145                 BUTTON_KIND,    (ULONG)FormatCancelClicked,     MSG_UNDERSCORE_CANCEL_GAD,      TAG_DONE,
146                 ENDGROUP_KIND,
147         ENDGROUP_KIND
148 };
149
150
151
152 XDEF LONG SaversWinTags[] =
153 {
154         XMWIN_LayoutArgs,       (LONG)SaversArgs,
155         XMWIN_GCount,           Savers_CNT,
156         XMWIN_Title,            MSG_SAVERS_TITLE,
157         XMWIN_WindowFlags,      WFLG_CLOSEGADGET,
158         XMWIN_IDCMPFlags,       CHECKBOXIDCMP|LISTVIEWIDCMP|BUTTONIDCMP|CYCLEIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
159         XMWIN_PostOpenFunc,     (LONG)SaversPostOpen,
160         XMWIN_HelpNode,         (LONG)"Savers",
161         TAG_DONE
162 };
163
164
165
166 static void SaversPostOpen (void)
167 {
168         UpdateSaveSwitches();
169
170         /* Backup SaveSwitches for "Cancel" option */
171         memcpy (&SaveSwitchesBackup, &SaveSwitches, sizeof (SaveSwitchesBackup));
172 }
173
174
175
176 GLOBALCALL void UpdateSaveSwitches (void)
177 {
178         struct WinUserData *wud = WDescr[WID_SAVERS].Wud;
179         struct XMHook *saver;
180
181         if (wud && wud->Win)
182         {
183                 LONG savernum;
184
185 #ifdef OS30_ONLY
186                 ObtainSemaphoreShared (&XModuleBase->xm_BaseLock);
187 #else
188                 /* Workaround for Pre-V39 ObtainSemaphoreShared() bug (see autodoc) */
189
190                 /* Try to get the shared semaphore */
191                 if (!AttemptSemaphoreShared (&XModuleBase->xm_BaseLock))
192                         /* Check if we can get the exclusive version */
193                         if (!AttemptSemaphore (&XModuleBase->xm_BaseLock))
194                                 /* Oh well, wait for the shared lock */
195                                 ObtainSemaphoreShared (&XModuleBase->xm_BaseLock);
196 #endif
197
198                 if (saver = XModuleBase->xm_DefaultSaver)
199                 {
200                         struct XMHook *tmp = (struct XMHook *)XModuleBase->xm_Savers.mlh_Head;
201                         savernum = 0;
202
203                         while (tmp != saver)
204                         {
205                                 tmp = (struct XMHook *)tmp->xmh_Link.ln_Succ;
206                                 savernum++;
207                         }
208                 }
209                 else savernum = ~0;
210
211                 GT_SetGadgetAttrs (wud->Gadgets[GD_SaversList], wud->Win, NULL,
212                         GTLV_Labels,            &XModuleBase->xm_Savers,
213                         GTLV_Selected,          savernum,
214                         GTLV_MakeVisible,       savernum,
215                         TAG_DONE);
216
217                 UpdateSaverInfo ();
218
219                 ReleaseSemaphore (&XModuleBase->xm_BaseLock);
220         }
221 }
222
223
224
225 static void UpdateSaverInfo (void)
226 {
227         struct XMHook *saver = XModuleBase->xm_DefaultSaver;
228         struct WinUserData *wud = WDescr[WID_SAVERS].Wud;
229
230         if (wud && wud->Win)
231         {
232                 SetGadgets (wud,
233                         GD_SaveSequence,                SaveSwitches.SaveSeq,
234                         GD_SaveInstruments,             SaveSwitches.SaveInstr,
235                         GD_SavePatterns,                SaveSwitches.SavePatt,
236                         GD_SaveIcons,                   SaveSwitches.SaveIcons,
237                         GD_SaveNames,                   SaveSwitches.SaveNames,
238                         GD_FormatDescription,   saver ? saver->xmh_Descr : NULL,
239                         GD_FormatAuthor,                saver ? saver->xmh_Author : NULL,
240                         GD_MaxLength,                   saver ? saver->xmh_MaxLength : 0,
241                         GD_MaxTracks,                   saver ? saver->xmh_MaxTracks : 0,
242                         GD_MaxInstruments,              saver ? saver->xmh_MaxInstruments : 0,
243                         GD_MaxPatterns,                 saver ? saver->xmh_MaxPatterns : 0,
244                         GD_MaxPattLen,                  saver ? saver->xmh_MaxPattLen : 0,
245                         GD_MaxSampleLen,                saver ? saver->xmh_MaxSampleLen : 0,
246                         -1);
247
248                 if (saver)
249                 {
250                         GT_SetGadgetAttrs (wud->Gadgets[GD_SaveSequence], wud->Win, NULL,
251                                 GA_Disabled, !(saver->xmh_Flags & XMHF_EXCLUDE_SEQUENCE),
252                                 TAG_DONE);
253
254                         GT_SetGadgetAttrs (wud->Gadgets[GD_SavePatterns], wud->Win, NULL,
255                                 GA_Disabled, !(saver->xmh_Flags & XMHF_EXCLUDE_PATTERNS),
256                                 TAG_DONE);
257
258                         GT_SetGadgetAttrs (wud->Gadgets[GD_SaveInstruments], wud->Win, NULL,
259                                 GA_Disabled, !(saver->xmh_Flags & XMHF_EXCLUDE_INSTRUMENTS),
260                                 TAG_DONE);
261
262                         GT_SetGadgetAttrs (wud->Gadgets[GD_SaveNames], wud->Win, NULL,
263                                 GA_Disabled, !(saver->xmh_Flags & XMHF_EXCLUDE_NAMES),
264                                 TAG_DONE);
265                 }
266         }
267 }
268
269
270
271 /******************/
272 /* Savers Gadgets */
273 /******************/
274
275 static void SaversListClicked (struct WinUserData *wud)
276 {
277         WORD i;
278         struct XMHook *tmp;
279
280         ObtainSemaphoreShared (&XModuleBase->xm_BaseLock);
281
282         tmp = (struct XMHook *)XModuleBase->xm_Savers.mlh_Head;
283
284         for (i = IntuiMsg.Code; (i > 0) && tmp ; i--)
285                 tmp = (struct XMHook *)tmp->xmh_Link.ln_Succ;
286
287         if (tmp) XModuleBase->xm_DefaultSaver = tmp;
288
289         UpdateSaverInfo();
290
291         ReleaseSemaphore (&XModuleBase->xm_BaseLock);
292 }
293
294
295
296 /*
297 static void PackModeClicked (struct WinUserData *wud)
298 {
299
300 }
301
302
303
304 static void PackOptionsClicked (struct WinUserData *wud)
305 {
306
307 }
308 */
309
310
311
312 static void FormatUseClicked (struct WinUserData *wud)
313 {
314         MyCloseWindow (wud);
315 }
316
317
318
319 static void FormatCancelClicked (struct WinUserData *wud)
320 {
321         /* Restore old SaveSwitches */
322         memcpy (&SaveSwitches, &SaveSwitchesBackup, sizeof (SaveSwitchesBackup));
323
324         MyCloseWindow (wud);
325 }