Initial commit.
[amiga/xmodule.git] / ToolBoxWin.c
1 /*
2 **      ToolBoxWin.c
3 **
4 **      Copyright (C) 1993,94,95,96,97 Bernardo Innocenti
5 **
6 **      Handle ToolBox panel
7 */
8
9 #include <exec/memory.h>
10 #include <intuition/intuition.h>
11 #include <intuition/gadgetclass.h>
12 #include <libraries/gadtools.h>
13 #include <libraries/locale.h>
14 #include <workbench/workbench.h>
15
16 #include <proto/exec.h>
17 #include <proto/dos.h>
18 #include <proto/intuition.h>
19 #include <proto/wb.h>
20 #include <proto/asl.h>
21 #include <proto/icon.h>
22 #include <proto/xmodule.h>
23
24 #include "XModulePriv.h"
25 #include "Gui.h"
26
27
28
29 /* Gadgets IDs */
30
31 enum
32 {
33         GD_ToolBoxGroup0,
34                 GD_ToolBoxGroup1,
35                         GD_ToolBoxGroup2,
36                                 GD_Play,
37                                 GD_EditSongs,
38                         GD_ToolBoxGroup3,
39                                 GD_EditPatterns,
40                                 GD_EditInstruments,
41                         GD_ToolBoxGroup4,
42                                 GD_EditSequence,
43                                 GD_Optimization,
44         ToolBox_CNT
45 };
46
47
48
49 /*****************************/
50 /* Local function prototypes */
51 /*****************************/
52
53 static void EditInstrumentsClicked      (void);
54 static void EditSequenceClicked         (void);
55 static void EditPatternsClicked         (void);
56 static void OptimizationClicked         (void);
57 static void PlayClicked                         (void);
58 static void EditSongsClicked            (void);
59
60 static void ToolBoxMiNew                        (void);
61 static void ToolBoxMiOpen                       (void);
62 static void ToolBoxMiOpenNew            (void);
63 static void ToolBoxMiSave                       (void);
64 static void ToolBoxMiSaveAs                     (void);
65 static void ToolBoxMiSaveFormat         (void);
66 static void ToolBoxMiClearMod           (void);
67 static void ToolBoxMiAbout                      (void);
68 static void ToolBoxMiHelp                       (void);
69 static void ToolBoxMiIconify            (void);
70 static void ToolBoxMiQuit                       (void);
71 static void ToolBoxMiUserInterface      (void);
72 static void ToolBoxMiSaveIcons          (void);
73 static void ToolBoxMiOverwrite          (void);
74 static void ToolBoxMiAskExit            (void);
75 static void ToolBoxMiOpenSettings       (void);
76 static void ToolBoxMiSaveSettings       (void);
77 static void ToolBoxMiSaveSettingsAs     (void);
78
79
80
81 static struct NewMenu ToolBoxNewMenu[] = {
82         NM_TITLE, (STRPTR)MSG_PROJECT_MEN, NULL, 0, NULL, NULL,
83         NM_ITEM, (STRPTR)MSG_NEW_MEN, (STRPTR)"N", 0, 0L, (APTR)ToolBoxMiNew,
84         NM_ITEM, (STRPTR)MSG_OPEN_MEN, (STRPTR)"O", 0, 0L, (APTR)ToolBoxMiOpen,
85         NM_ITEM, (STRPTR)MSG_OPEN_NEW_MEN, (STRPTR)"Y", 0, 0L, (APTR)ToolBoxMiOpenNew,
86         NM_ITEM, (STRPTR)MSG_SAVE_MEN, (STRPTR)"S", 0, 0L, (APTR)ToolBoxMiSave,
87         NM_ITEM, (STRPTR)MSG_SAVE_AS_MEN, (STRPTR)"A", 0, 0L, (APTR)ToolBoxMiSaveAs,
88         NM_ITEM, (STRPTR)MSG_SAVE_FORMAT_MEN, (STRPTR)"F", 0, 0L, (APTR)ToolBoxMiSaveFormat,
89         NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
90         NM_ITEM, (STRPTR)MSG_CLEAR_MEN, (STRPTR)"K", 0, 0L, (APTR)ToolBoxMiClearMod,
91         NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
92         NM_ITEM, (STRPTR)MSG_ABOUT_MEN, (STRPTR)"?", 0, 0L, (APTR)ToolBoxMiAbout,
93         NM_ITEM, (STRPTR)MSG_HELP_MEN, NULL, 0, 0L, (APTR)ToolBoxMiHelp,
94         NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
95         NM_ITEM, (STRPTR)MSG_ICONIFY_MEN, (STRPTR)"I", 0, 0L, (APTR)ToolBoxMiIconify,
96         NM_ITEM, (STRPTR)MSG_QUIT_MEN, (STRPTR)"Q", 0, 0L, (APTR)ToolBoxMiQuit,
97         NM_TITLE, (STRPTR)MSG_SETTINGS_MEN, NULL, 0, NULL, NULL,
98         NM_ITEM, (STRPTR)MSG_USER_INTERFACE_MEN, NULL, 0, 0L, (APTR)ToolBoxMiUserInterface,
99         NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
100         NM_ITEM, (STRPTR)MSG_SAVE_ICONS_MEN, NULL, CHECKIT|MENUTOGGLE, 0L, (APTR)ToolBoxMiSaveIcons,
101         NM_ITEM, (STRPTR)MSG_CONFIRM_OVERWRITE_MEN, NULL, CHECKIT|MENUTOGGLE, 0L, (APTR)ToolBoxMiOverwrite,
102         NM_ITEM, (STRPTR)MSG_CONFIRM_EXIT_MEN, NULL, CHECKIT|MENUTOGGLE, 0L, (APTR)ToolBoxMiAskExit,
103         NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
104         NM_ITEM, (STRPTR)MSG_OPEN_SETTINGS_MEN, NULL, 0, 0L, (APTR)ToolBoxMiOpenSettings,
105         NM_ITEM, (STRPTR)MSG_SAVE_SETTINGS_MEN, NULL, 0, 0L, (APTR)ToolBoxMiSaveSettings,
106         NM_ITEM, (STRPTR)MSG_SAVE_SETTINGS_AS_MEN, NULL, 0, 0L, (APTR)ToolBoxMiSaveSettingsAs,
107         NM_END, NULL, NULL, 0, 0L, NULL
108 };
109
110
111
112 static ULONG ToolBoxArgs[] =
113 {
114         HGROUP_KIND, 0,
115                 VGROUP_KIND, 0,
116                         BUTTON_KIND, (ULONG)PlayClicked,                        MSG_PLAY_GAD,                   TAG_DONE,
117                         BUTTON_KIND, (ULONG)EditSongsClicked,           MSG_SONGS_GAD,                  TAG_DONE,
118                         ENDGROUP_KIND,
119                 VGROUP_KIND, 0,
120                         BUTTON_KIND, (ULONG)EditPatternsClicked,        MSG_PATTERNS_DOTS_GAD,  TAG_DONE,
121                         BUTTON_KIND, (ULONG)EditInstrumentsClicked,     MSG_INSTRUMENTS_GAD,    TAG_DONE,
122                         ENDGROUP_KIND,
123                 VGROUP_KIND, 0,
124                         BUTTON_KIND, (ULONG)EditSequenceClicked,        MSG_SEQUENCE_DOTS_GAD,  TAG_DONE,
125                         BUTTON_KIND, (ULONG)OptimizationClicked,        MSG_OPTIMIZATION_GAD,   TAG_DONE,
126                         ENDGROUP_KIND,
127                 ENDGROUP_KIND,
128         ENDGROUP_KIND
129 };
130
131
132
133 XDEF LONG ToolBoxWinTags[] =
134 {
135         XMWIN_NewMenu,          (LONG)ToolBoxNewMenu,
136         XMWIN_LayoutArgs,       (LONG)ToolBoxArgs,
137         XMWIN_GCount,           ToolBox_CNT,
138         XMWIN_Title,            MSG_TOOLBOX_TITLE,
139         XMWIN_WindowFlags,      WFLG_CLOSEGADGET | WFLG_ACTIVATE,
140         XMWIN_IDCMPFlags,       BUTTONIDCMP|IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
141         XMWIN_PostOpenFunc,     (LONG)UpdateGuiSwitches,
142         XMWIN_HelpNode,         (LONG)"ToolBox",
143         TAG_DONE
144 };
145
146
147
148
149 /*********************/
150 /* ToolBox Functions */
151 /*********************/
152
153
154
155 GLOBALCALL void ToolBoxDropIcon (struct AppMessage *msg)
156 {
157         struct WBArg    *wba = msg->am_ArgList;
158         BPTR olddir;
159         ULONG i;
160         struct SongInfo *si;
161
162         LockWindows();
163
164         ObtainSemaphore (&XModuleBase->xm_BaseLock);
165
166         olddir = CurrentDir (wba->wa_Lock);
167
168         for (i = 0; i < msg->am_NumArgs; i++)
169         {
170                 CurrentDir (wba->wa_Lock);
171
172                 if (si = xmLoadModule (wba->wa_Name,
173                         XMSNG_OldSong,          i ? NULL : XModuleBase->xm_CurrentSong,
174                         XMSNG_AddToList,        -1,
175                         XMSNG_Active,           i == (msg->am_NumArgs - 1),
176                         TAG_DONE))
177                         ReleaseSemaphore (&si->Lock);   /* For XMSNG_AddToList */
178
179                 wba++;
180         }
181
182         ReleaseSemaphore (&XModuleBase->xm_BaseLock);
183
184         CurrentDir (olddir);
185         UnlockWindows();
186 }
187
188
189
190 GLOBALCALL void ToolBoxOpenModule (CONST_STRPTR file, ULONG num, ULONG count)
191
192 /* Handle FileRequester Open Module message */
193 {
194         struct SongInfo *si;
195
196         LockWindows();
197
198         ObtainSemaphore (&XModuleBase->xm_BaseLock);
199
200         DB(kprintf ("opening song %ld of %ld\n", num, count));
201
202         if (si = xmLoadModule (file,
203                 XMSNG_AddToList,        num ? (ULONG)XModuleBase->xm_CurrentSong : (ULONG)~0,
204                 XMSNG_Active,           num == (count - 1),
205                 XMSNG_OldSong,          num ? (ULONG)NULL : (ULONG)XModuleBase->xm_CurrentSong,
206                 TAG_DONE))
207                 ReleaseSemaphore (&si->Lock);   /* This is for XMSNG_AddToList */
208
209         ReleaseSemaphore (&XModuleBase->xm_BaseLock);
210
211         UnlockWindows();
212 }
213
214
215 GLOBALCALL void UpdateGuiSwitches ()
216 {
217         struct MenuItem *item;
218         struct WinUserData *wud = WDescr[WID_TOOLBOX].Wud;
219
220         if (wud && wud->MenuStrip)
221         {
222                 if (wud->Win) ClearMenuStrip (wud->Win);
223
224                 item = ItemAddress (wud->MenuStrip, SHIFTMENU(1) | SHIFTITEM(2) );
225
226                 /* Save Icons? */
227                 if (GuiSwitches.SaveIcons)
228                         item->Flags |= CHECKED;
229                 else
230                         item->Flags &= ~CHECKED;
231
232                 /* Confirm Overwrite? */
233                 item = item->NextItem;
234                 if (GuiSwitches.AskOverwrite)
235                         item->Flags |= CHECKED;
236                 else
237                         item->Flags &= ~CHECKED;
238
239                 /* Confirm Exit? */
240                 item = item->NextItem;
241                 if (GuiSwitches.AskExit)
242                         item->Flags |= CHECKED;
243                 else
244                         item->Flags &= ~CHECKED;
245
246                 if (wud->Win) ResetMenuStrip (wud->Win, wud->MenuStrip);
247         }
248 }
249
250
251
252 /*******************/
253 /* ToolBox Gadgets */
254 /*******************/
255
256 static void EditInstrumentsClicked (void)
257 {
258         NewWindow (WID_INSTRUMENTS);
259 }
260
261 static void EditSequenceClicked (void)
262 {
263         NewWindow (WID_SEQUENCE);
264 }
265
266 static void OptimizationClicked (void)
267 {
268         NewWindow (WID_OPTIMIZATION);
269 }
270
271 static void PlayClicked (void)
272 {
273         NewWindow (WID_PLAY);
274 }
275
276 static void EditSongsClicked (void)
277 {
278         NewWindow (WID_SONGINFO);
279 }
280
281 static void EditPatternsClicked (void)
282 {
283         NewWindow (WID_PATTERN);
284 }
285
286
287
288 /**************/
289 /* Menu Items */
290 /**************/
291
292 static void ToolBoxMiNew (void)
293 {
294         struct SongInfo *si;
295
296         if (si = xmCreateSong (
297                 SNGA_ReadyToUse,        TRUE,
298                 XMSNG_AddToList,        -1,
299                 XMSNG_Active,           TRUE,
300                 TAG_DONE))
301                 ReleaseSemaphore (&si->Lock);   /* This is for XMSNG_AddToList */
302         else
303                 DisplayBeep (NULL);
304 }
305
306
307
308 static void ToolBoxMiOpen (void)
309 {
310         StartFileRequest (FREQ_LOADMOD, ToolBoxOpenModule);
311 }
312
313
314
315 static void ToolBoxMiOpenNew (void)
316 {
317         ToolBoxMiNew();
318         ToolBoxMiOpen();
319 }
320
321
322
323 static void ToolBoxMiSave (void)
324 {
325         struct SongInfo *si;
326
327         LockWindows();
328
329         ObtainSemaphoreShared (&XModuleBase->xm_BaseLock);
330
331         if (si = XModuleBase->xm_CurrentSong)
332         {
333                 ObtainSemaphoreShared (&si->Lock);
334
335                 if (!(LastErr = xmSaveModuleA (si, si->Path, NULL, NULL)))
336                         si->Changes = 0;
337
338                 ReleaseSemaphore (&si->Lock);
339         }
340
341         ReleaseSemaphore (&XModuleBase->xm_BaseLock);
342
343         UnlockWindows();
344 }
345
346
347
348 static void ToolBoxMiSaveAs (void)
349 {
350         struct SongInfo *si;
351         UBYTE pathname[PATHNAME_MAX];
352
353         LockWindows();
354
355         ObtainSemaphoreShared (&XModuleBase->xm_BaseLock);
356
357         if (si = XModuleBase->xm_CurrentSong)
358         {
359                 ObtainSemaphoreShared (&si->Lock);
360
361                 if (si->Path)
362                 {
363                         strncpy (pathname, si->Path, PATHNAME_MAX - 1);
364                         pathname[PATHNAME_MAX - 1] = '\0';
365                 }
366                 else pathname[0] = '\0';
367
368                 if (FileRequest (FREQ_SAVEMOD, pathname))
369                 {
370                         SetAttrs (si,
371                                 SNGA_Path, pathname,
372                                 TAG_DONE);
373
374                         ToolBoxMiSave();
375                 }
376
377                 ReleaseSemaphore (&si->Lock);
378         }
379
380         ReleaseSemaphore (&XModuleBase->xm_BaseLock);
381
382         UnlockWindows();
383 }
384
385
386
387 static void ToolBoxMiClearMod (void)
388 {
389         NewWindow (WID_CLEAR);
390 }
391
392
393
394 static void ToolBoxMiAbout (void)
395 {
396         ShowRequest (MSG_ABOUT_TEXT, MSG_CONTINUE,
397                 XMODULEVER " " XMODULEDATE " " BUILDMODE,
398                 XMODULECOPY,
399                 AvailMem (MEMF_CHIP) >> 10,
400                 AvailMem (MEMF_FAST) >> 10,
401                 ScrInfo.PubScreenName[0] ? ScrInfo.PubScreenName : STR(MSG_DEFAULT),
402                 PubPort ? PubPortName : STR(MSG_DISABLED),
403                 CxPort ? CxPopKey : STR(MSG_DISABLED),
404                 Catalog ? Catalog->cat_Language : (UBYTE *)"English");
405 }
406
407
408
409 static void ToolBoxMiHelp (void)
410 {
411         HandleHelp (NULL);
412 }
413
414 static void ToolBoxMiIconify (void)
415 {
416         Iconify();
417         DoNextSelect = FALSE;
418 }
419
420
421
422 static void ToolBoxMiQuit (void)
423 {
424         DoNextSelect = 0;
425         Quit = 1;
426 }
427
428
429
430 static void ToolBoxMiSaveFormat (void)
431 {
432         NewWindow (WID_SAVERS);
433 }
434
435 static void ToolBoxMiUserInterface (void)
436 {
437         NewWindow (WID_PREFS);
438 }
439
440
441
442 static void ToolBoxMiSaveIcons (void)
443 {
444         GuiSwitches.SaveIcons ^= 1;
445 }
446
447
448
449 static void ToolBoxMiOverwrite (void)
450 {
451         GuiSwitches.AskOverwrite ^= 1;
452 }
453
454
455
456 static void ToolBoxMiAskExit (void)
457 {
458         GuiSwitches.AskExit ^= 1;
459 }
460
461
462
463 static void ToolBoxMiOpenSettings (void)
464 {
465         UBYTE filename[PATHNAME_MAX];
466
467         strcpy (filename, "XModule.prefs");
468
469         if (FileRequest (FREQ_LOADMISC, filename))
470                 LastErr = LoadPrefs (filename);
471 }
472
473
474
475 static void ToolBoxMiSaveSettings (void)
476 {
477         LastErr = SavePrefs ("PROGDIR:XModule.prefs");
478 }
479
480
481
482 static void ToolBoxMiSaveSettingsAs (void)
483 {
484         UBYTE filename[PATHNAME_MAX];
485
486         strcpy (filename, "PROGDIR:XModule.prefs");
487
488         if (FileRequest (FREQ_SAVEMISC, filename))
489                 LastErr = SavePrefs (filename);
490 }