Initial commit.
[amiga/xmodule.git] / PattPrefsWin.c
1 /*
2 **      PattPrefsWin.c
3 **
4 **      Copyright (C) 1995,96 Bernardo Innocenti
5 **
6 **      Pattern preferences panel and pattern size panel handling functions.
7 */
8
9 #include <intuition/intuition.h>
10 #include <libraries/gadtools.h>
11 #include <libraries/patteditclass.h>
12 #include <libraries/asl.h>
13
14 #include <proto/exec.h>
15 #include <proto/intuition.h>
16 #include <proto/gadtools.h>
17 #include <proto/utility.h>
18 #include <proto/xmodule.h>
19
20 #include "XModulePriv.h"
21 #include "CustomClasses.h"
22 #include "Gui.h"
23
24
25 static LONG PattPrefsPreOpen            (struct WinUserData *wud);
26 static void PattPrefsPostClose          (void);
27 static void ReopenPatternWindow         (void);
28
29 static void AdvanceTracksClicked        (struct WinUserData *wud);
30 static void AdvanceLinesClicked         (struct WinUserData *wud);
31 static void MaxUndoLevelsClicked        (struct WinUserData *wud);
32 static void MaxUndoMemClicked           (struct WinUserData *wud);
33 static void ClipUnitClicked                     (struct WinUserData *wud);
34 static void VScrollerPlaceClicked       (struct WinUserData *wud);
35 static void HScrollerPlaceClicked       (struct WinUserData *wud);
36 static void WrapVertClicked                     (struct WinUserData *wud);
37 static void WrapHorizClicked            (struct WinUserData *wud);
38 static void HexLineNumbersClicked       (struct WinUserData *wud);
39 static void BlankZeroClicked            (struct WinUserData *wud);
40 static void DoRulerClicked                      (struct WinUserData *wud);
41 static void DoTinyLinesClicked          (struct WinUserData *wud);
42 static void GetEditorFontClicked        (struct WinUserData *wud);
43 static void BGPenClicked                        (struct WinUserData *wud);
44 static void TextPenClicked                      (struct WinUserData *wud);
45 static void LinesPenClicked                     (struct WinUserData *wud);
46 static void TinyLinesPenClicked         (struct WinUserData *wud);
47 static void PattPrefsOkClicked          (struct WinUserData *wud);
48 static void PattPrefsCancelClicked      (struct WinUserData *wud);
49
50 static void PattSizePostClose           (void);
51
52 static void PattSizeLinesClicked        (struct WinUserData *wud);
53 static void PattSizeTracksClicked       (struct WinUserData *wud);
54 static void PattSizeDoubleClicked       (struct WinUserData *wud);
55 static void PattSizeHalveClicked        (struct WinUserData *wud);
56 static void PattSizeOkClicked           (struct WinUserData *wud);
57 static void PattSizeCancelClicked       (struct WinUserData *wud);
58
59
60
61 enum {
62         GD_PattPrefsGroup0,
63                 GD_PattPrefsGroup1,
64                         GD_PattPrefsGroup2,
65                                 GD_AdvanceTracks,
66                                 GD_AdvanceLines,
67                                 GD_MaxUndoLevels,
68                                 GD_MaxUndoMem,
69                                 GD_ClipUnit,
70                                 GD_VertScroller,
71                                 GD_HorizScroller,
72                         GD_PattPrefsGroup3,
73                                 GD_WrapVert,
74                                 GD_WrapHoriz,
75                                 GD_HexLineNumbers,
76                                 GD_BlankZero,
77                                 GD_DoRuler,
78                                 GD_DoTinyLines,
79                                 GD_Backdrop,
80                 GD_PattPrefsGroup4,
81                         GD_PattPrefsGroup5,
82                                 GD_EditorFont,
83                                 GD_GetEditorFont,
84                         GD_PattPrefsGroup6,
85                                 GD_PattPrefsGroup7,
86                                         GD_BGPen,
87                                         GD_TextPen,
88                                 GD_PattPrefsGroup8,
89                                         GD_LinesPen,
90                                         GD_TinyLinesPen,
91                 GD_PattPrefsGroup9,
92                         GD_PattPrefsOk,
93                         GD_PattPrefsCancel,
94
95         PattPrefs_CNT
96 };
97
98
99
100 enum {
101         GD_PattSizeGroup0,
102                 GD_PattSizeGroup1,
103                         GD_PattSizeGroup2,
104                                 GD_PattSizeLines,
105                                 GD_PattSizeTracks,
106                         GD_PattSizeGroup3,
107                                 GD_PattSizeDouble,
108                         GD_PattSizeGroup4,
109                                 GD_PattSizeHalve,
110                 GD_PattSizeGroup5,
111                         GD_PattSizeOk,
112                         GD_PattSizeCancel,
113
114         PattSize_CNT
115 };
116
117
118
119 static struct PattSwitches OldPattSwitches;
120 static struct Pattern   *OldPatt = NULL;
121 static struct SongInfo  *OldSong = NULL;
122 static ULONG OldPattNum = 0;
123 static UBYTE *ColorTable;
124 static LONG BGPenTags[] = {
125         GTPA_Color, 0,
126         GTPA_ColorTable, NULL,
127         GTPA_NumColors, 2,
128         TAG_DONE
129 };
130 static LONG TextPenTags[] = {
131         GTPA_Color, 0,
132         GTPA_NumColors, 2,
133         GTPA_ColorOffset, 1,
134         TAG_DONE };
135
136
137
138 static STRPTR ScrollerPosLabels[] =
139 {
140         (STRPTR)MSG_OFF_GAD,
141         (STRPTR)MSG_RIGHT_GAD,
142         (STRPTR)MSG_LEFT_GAD,
143         (STRPTR)NULL
144 };
145
146
147
148 static LONG PattPrefsArgs[] =
149 {
150         HGROUP_KIND, BBFT_RIDGE,
151                 VGROUP_KIND, 0,
152                         INTEGER_KIND,   (LONG)AdvanceTracksClicked, MSG_ADVANCE_TRACKS_GAD,             3,      TAG_DONE,
153                         INTEGER_KIND,   (LONG)AdvanceLinesClicked,      MSG_ADVANCE_LINES_GAD,          5,      TAG_DONE,
154                         INTEGER_KIND,   (LONG)MaxUndoLevelsClicked,     MSG_MAX_UNDO_LEVELS_GAD,        6,      TAG_DONE,
155                         INTEGER_KIND,   (LONG)MaxUndoMemClicked,        MSG_MAX_UNDO_MEM_GAD,           10,     TAG_DONE,
156                         INTEGER_KIND,   (LONG)ClipUnitClicked,          MSG_CLIPBOARD_UNIT_GAD,         3,      TAG_DONE,
157                         CYCLE_KIND,             (LONG)VScrollerPlaceClicked,MSG_SCROLLER_POS_GAD,       (LONG)ScrollerPosLabels,        TAG_DONE,
158                         CHECKBOX_KIND,  (LONG)HScrollerPlaceClicked,MSG_HORIZ_SCROLLER_GAD,             NULL,   TAG_DONE,
159                         ENDGROUP_KIND,
160                 VGROUP_KIND, 0,
161                         CHECKBOX_KIND,  (LONG)WrapVertClicked,                  MSG_VERT_WRAP_GAD,                      NULL,   TAG_DONE,
162                         CHECKBOX_KIND,  (LONG)WrapHorizClicked,                 MSG_HORIZ_WRAP_GAD,                     NULL,   TAG_DONE,
163                         CHECKBOX_KIND,  (LONG)HexLineNumbersClicked,    MSG_HEX_LINE_NUMBERS_GAD,       NULL,   TAG_DONE,
164                         CHECKBOX_KIND,  (LONG)BlankZeroClicked,                 MSG_BLANK_ZERO_GAD,                     NULL,   TAG_DONE,
165                         CHECKBOX_KIND,  (LONG)DoRulerClicked,                   MSG_DO_RULER_GAD,                       NULL,   TAG_DONE,
166                         CHECKBOX_KIND,  (LONG)DoTinyLinesClicked,               MSG_DO_TINY_LINES_GAD,          NULL,   TAG_DONE,
167                         CHECKBOX_KIND,  NULL,                                                   MSG_BACKDROP_GAD,                       NULL,   TAG_DONE,
168                         ENDGROUP_KIND,
169                 ENDGROUP_KIND,
170         VGROUP_KIND, BBFT_RIDGE,
171                 HGROUP_KIND, 0,
172                         TEXT_KIND,                      MSG_EDITOR_FONT_GAD,                    0,              GTTX_Border,    TRUE,   TAG_DONE,
173                         IMAGEBUTTON_KIND,       (ULONG)GetEditorFontClicked,    IM_PICK,        TAG_DONE,
174                         ENDGROUP_KIND,
175                 HGROUP_KIND, 0,
176                         VGROUP_KIND, 0,
177                                 PALETTE_KIND,   (LONG)BGPenClicked,                     MSG_BACKGROUND_PEN_GAD, TAG_MORE,       (LONG)BGPenTags, TAG_DONE,
178                                 PALETTE_KIND,   (LONG)TextPenClicked,           MSG_TEXT_PEN_GAD,               TAG_MORE,       (LONG)TextPenTags, TAG_DONE,
179                                 ENDGROUP_KIND,
180                         VGROUP_KIND, 0,
181                                 PALETTE_KIND,   (LONG)LinesPenClicked,          MSG_LINES_PEN_GAD,              TAG_MORE,       (LONG)TextPenTags, TAG_DONE,
182                                 PALETTE_KIND,   (LONG)TinyLinesPenClicked,      MSG_TINY_LINES_PEN_GAD, TAG_MORE,       (LONG)TextPenTags, TAG_DONE,
183                                 ENDGROUP_KIND,
184                         ENDGROUP_KIND,
185                 ENDGROUP_KIND,
186         HGROUP_KIND,    0,
187                 BUTTON_KIND,    (LONG)PattPrefsOkClicked,               MSG_UNDERSCORE_OK_GAD,          TAG_DONE,
188                 BUTTON_KIND,    (LONG)PattPrefsCancelClicked,   MSG_UNDERSCORE_CANCEL_GAD,      TAG_DONE,
189                 ENDGROUP_KIND,
190         ENDGROUP_KIND
191 };
192
193
194
195 static LONG PattSizeArgs[] =
196 {
197         HGROUP_KIND, BBFT_RIDGE,
198                 VGROUP_KIND, 0,
199                         INTEGER_KIND,   (LONG)PattSizeLinesClicked,             MSG_LINES_GAD,  5, TAG_DONE,
200                         INTEGER_KIND,   (LONG)PattSizeTracksClicked,    MSG_TRACKS_GAD, 3, TAG_DONE,
201                         ENDGROUP_KIND,
202                 VGROUP_KIND, 0,
203                         BUTTON_KIND,    (LONG)PattSizeDoubleClicked,    MSG_DOUBLE_GAD, TAG_DONE,
204                         ENDGROUP_KIND,
205                 VGROUP_KIND, 0,
206                         BUTTON_KIND,    (LONG)PattSizeHalveClicked,             MSG_HALVE_GAD,  TAG_DONE,
207                         ENDGROUP_KIND,
208                 ENDGROUP_KIND,
209         HGROUP_KIND, 0,
210                 BUTTON_KIND,    (LONG)PattSizeOkClicked,                MSG_UNDERSCORE_OK_GAD,          TAG_DONE,
211                 BUTTON_KIND,    (LONG)PattSizeCancelClicked,    MSG_UNDERSCORE_CANCEL_GAD,      TAG_DONE,
212                 ENDGROUP_KIND,
213         ENDGROUP_KIND
214 };
215
216
217
218 XDEF LONG PattPrefsWinTags[] =
219 {
220         XMWIN_LayoutArgs,       (LONG)PattPrefsArgs,
221         XMWIN_GCount,           PattPrefs_CNT,
222         XMWIN_Title,            MSG_PATTPREFS_TITLE,
223         XMWIN_WindowFlags,      WFLG_CLOSEGADGET,
224         XMWIN_IDCMPFlags,       BUTTONIDCMP|INTEGERIDCMP|PALETTEIDCMP|CHECKBOXIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
225         XMWIN_PreOpenFunc,      (LONG)PattPrefsPreOpen,
226         XMWIN_PostOpenFunc,     (LONG)UpdatePattPrefs,
227         XMWIN_PostCloseFunc,(LONG)PattPrefsPostClose,
228         XMWIN_HelpNode,         (LONG)"PattPrefs",
229         TAG_DONE
230 };
231
232
233
234 XDEF LONG PattSizeWinTags[] =
235 {
236         XMWIN_LayoutArgs,       (LONG)PattSizeArgs,
237         XMWIN_GCount,           PattSize_CNT,
238         XMWIN_Title,            MSG_PATTSIZE_TITLE,
239         XMWIN_WindowFlags,      WFLG_CLOSEGADGET,
240         XMWIN_IDCMPFlags,       BUTTONIDCMP|INTEGERIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
241         XMWIN_PostOpenFunc,     (LONG)UpdatePattSize,
242         XMWIN_PostCloseFunc,(LONG)PattSizePostClose,
243         XMWIN_HelpNode,         (LONG)"PattSize",
244         TAG_DONE
245 };
246
247
248
249 static LONG PattPrefsPreOpen (struct WinUserData *wud)
250 {
251         ULONG i, j, numcols;
252
253         numcols = 1 << Scr->RastPort.BitMap->Depth;
254
255         if (!ColorTable)
256         {
257                 if (!(ColorTable = AllocVecPooled (Pool, numcols)))
258                         return 1;
259
260                 /* Fill ColorTable */
261                 for (i = 0, j = 0; i < numcols; i++)
262                         if (!(i & PattSwitches.TextPen))
263                                 ColorTable[j++] = i;
264
265                 /* Clear remaining colors */
266                 for (i = j ; i < numcols; i++)
267                         ColorTable[i] = 0;
268
269                 BGPenTags[1]    = PattSwitches.LinesPen;
270                 BGPenTags[3]    = (ULONG) ColorTable;
271                 BGPenTags[5]    = j;
272                 TextPenTags[1]  = PattSwitches.TextPen;
273                 TextPenTags[3]  = numcols - 1;
274
275                 memcpy (&OldPattSwitches, &PattSwitches, sizeof (PattSwitches));
276         }
277
278         return RETURN_OK;
279 }
280
281
282
283 static void PattPrefsPostClose (void)
284 {
285         FreeVecPooled (Pool, ColorTable); ColorTable = NULL;
286 }
287
288
289 static void ReopenPatternWindow (void)
290
291 /* Closes all editor windows and reopens one */
292 {
293         if (WDescr[WID_PATTERN].Wud)
294         {
295                 if (WDescr[WID_PATTERN].Wud->Win)
296                 {
297                         /* Close all pattern editors... */
298                         while (WDescr[WID_PATTERN].UseCnt > 1)
299                                 MyCloseWindow (WDescr[WID_PATTERN].Wud);
300
301                         /* And close last window too... */
302                         MyCloseWindow (WDescr[WID_PATTERN].Wud);
303
304                         /* Now ensure the LayoutInfo for this window gets flushed... */
305                         DeleteLayoutInfo (WDescr[WID_PATTERN].Wud);
306
307                         /* And reopen one pattern editor to show changes! */
308                         NewWindow (WID_PATTERN);
309                 }
310                 else DeleteLayoutInfo (WDescr[WID_PATTERN].Wud);
311         }
312 }
313
314
315
316 void UpdatePattPrefs (void)
317 {
318         /* This variable is declared static because gadtools text
319          * gadgets do not buffer their texts and require them to be
320          * accessible whenever a refresh is needed :-(.
321          */
322         static UBYTE editorfont[40];
323
324         struct WinUserData *wud = WDescr[WID_PATTPREFS].Wud;
325
326         if (wud && wud->Win)
327         {
328                 SPrintf (editorfont, "%s/%ld", EditorAttr.ta_Name, EditorAttr.ta_YSize);
329
330                 SetGadgets (wud,
331                         GD_AdvanceTracks,       PattSwitches.AdvanceTracks,
332                         GD_AdvanceLines,        PattSwitches.AdvanceLines,
333                         GD_MaxUndoLevels,       PattSwitches.MaxUndoLevels,
334                         GD_MaxUndoMem,          PattSwitches.MaxUndoMem,
335                         GD_VertScroller,        PattSwitches.VScrollerPlace,
336                         GD_HorizScroller,       PattSwitches.HScrollerPlace,
337                         GD_WrapHoriz,           PattSwitches.Flags & PEF_HWRAP,
338                         GD_WrapVert,            PattSwitches.Flags & PEF_VWRAP,
339                         GD_HexLineNumbers,      PattSwitches.Flags & PEF_HEXMODE,
340                         GD_BlankZero,           PattSwitches.Flags & PEF_BLANKZERO,
341                         GD_DoRuler,                     PattSwitches.Flags & PEF_DOCURSORRULER,
342                         GD_DoTinyLines,         PattSwitches.Flags & PEF_DOTINYLINES,
343                         GD_EditorFont,          editorfont,
344                         GD_BGPen,                       PattSwitches.BGPen,
345                         GD_TextPen,                     PattSwitches.TextPen,
346                         GD_LinesPen,            PattSwitches.LinesPen,
347                         GD_TinyLinesPen,        PattSwitches.TinyLinesPen,
348                         -1);
349         }
350 }
351
352
353
354 static void PattSizePostClose (void)
355 {
356         xmRemPattern (OldSong, -1, (ULONG)OldPatt);
357         OldPatt = NULL;
358 }
359
360
361
362 GLOBALCALL void UpdatePattSize (void)
363 {
364         struct WinUserData *wud = WDescr[WID_PATTSIZE].Wud;
365
366         if (wud && wud->Win)
367         {
368                 struct SongInfo *si;
369                 struct Pattern *patt;
370
371                 if (si = xmLockActiveSong (SM_SHARED))
372                 {
373                         patt = si->Patt[si->CurrentPatt];
374
375                         /* Free previous backup copy, if any */
376
377                         if (OldPatt) xmRemPattern (OldSong, -1, (ULONG)OldPatt);
378
379                         /* Make a local backup copy of the current pattern (it may fail) */
380
381                         OldSong         = si;
382                         OldPattNum      = si->CurrentPatt;
383                         OldPatt         = CopyPattern (si, si->Patt[si->CurrentPatt], -1);
384
385                         /* Update gadgets */
386                         SetGadgets (wud,
387                                 GD_PattSizeLines, patt->Lines,
388                                 GD_PattSizeTracks, patt->Tracks,
389                                 -1);
390
391                         ReleaseSemaphore (&si->Lock);
392                 }
393         }
394 }
395
396
397
398 static void AdvanceTracksClicked (struct WinUserData *wud)
399 {
400         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
401         PattSwitches.AdvanceTracks = (WORD) GetNumber (wud->Gadgets[GD_AdvanceTracks]);
402
403         if (patternwud  && patternwud->Win)
404                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
405                         PEA_AdvanceCurs,        (PattSwitches.AdvanceTracks << 16) |
406                                                                 ((UWORD)PattSwitches.AdvanceLines),
407                         TAG_DONE);
408 }
409
410
411
412 static void AdvanceLinesClicked (struct WinUserData *wud)
413 {
414         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
415
416         PattSwitches.AdvanceLines = (WORD) GetNumber(wud->Gadgets[GD_AdvanceLines]);
417
418         if (patternwud && patternwud->Win)
419                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
420                         PEA_AdvanceCurs,        (PattSwitches.AdvanceTracks << 16) |
421                                                                 ((UWORD)PattSwitches.AdvanceLines),
422                         TAG_DONE);
423 }
424
425
426
427 static void MaxUndoLevelsClicked (struct WinUserData *wud)
428 {
429         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
430
431         PattSwitches.MaxUndoLevels = (WORD) GetNumber (wud->Gadgets[GD_MaxUndoLevels]);
432
433         if (patternwud && patternwud->Win)
434                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
435                         PEA_MaxUndoLevels,      PattSwitches.MaxUndoLevels,
436                         TAG_DONE);
437 }
438
439
440
441 static void MaxUndoMemClicked (struct WinUserData *wud)
442 {
443         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
444
445         PattSwitches.MaxUndoMem = (WORD) GetNumber (wud->Gadgets[GD_MaxUndoMem]);
446
447         if (patternwud && patternwud->Win)
448                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
449                         PEA_MaxUndoMem, PattSwitches.MaxUndoMem,
450                         TAG_DONE);
451 }
452
453
454
455 static void VScrollerPlaceClicked (struct WinUserData *wud)
456 {
457         PattSwitches.VScrollerPlace = IntuiMsg.Code;
458         ReopenPatternWindow ();
459 }
460
461
462 static void HScrollerPlaceClicked (struct WinUserData *wud)
463 {
464         PattSwitches.HScrollerPlace ^= SCROLLERPLACE_BOTTOM;
465         ReopenPatternWindow ();
466 }
467
468
469 static void WrapVertClicked (struct WinUserData *wud)
470 {
471         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
472
473         PattSwitches.Flags ^= PEF_VWRAP;
474
475         if (patternwud && patternwud->Win)
476                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
477                         PEA_Flags,      PattSwitches.Flags,
478                         TAG_DONE);
479 }
480
481
482
483 static void WrapHorizClicked (struct WinUserData *wud)
484 {
485         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
486
487         PattSwitches.Flags ^= PEF_HWRAP;
488
489         if (patternwud && patternwud->Win)
490                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
491                         PEA_Flags,      PattSwitches.Flags,
492                         TAG_DONE);
493 }
494
495
496
497 static void HexLineNumbersClicked (struct WinUserData *wud)
498 {
499         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
500
501         PattSwitches.Flags ^= PEF_HEXMODE;
502
503         if (patternwud && patternwud->Win)
504                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
505                         PEA_Flags,      PattSwitches.Flags,
506                         TAG_DONE);
507 }
508
509
510
511 static void BlankZeroClicked (struct WinUserData *wud)
512 {
513         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
514
515         PattSwitches.Flags ^= PEF_BLANKZERO;
516
517         if (patternwud && patternwud->Win)
518                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
519                         PEA_Flags,      PattSwitches.Flags,
520                         TAG_DONE);
521 }
522
523
524 static void DoRulerClicked (struct WinUserData *wud)
525 {
526         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
527
528         PattSwitches.Flags ^= PEF_DOCURSORRULER;
529
530         if (patternwud && patternwud->Win)
531                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
532                         PEA_Flags,      PattSwitches.Flags,
533                         TAG_DONE);
534 }
535
536
537
538 static void DoTinyLinesClicked (struct WinUserData *wud)
539 {
540         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
541
542         PattSwitches.Flags ^= PEF_DOTINYLINES;
543
544         if (patternwud && patternwud->Win)
545                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
546                         PEA_Flags,      PattSwitches.Flags,
547                         TAG_DONE);
548 }
549
550
551
552 static void ClipUnitClicked (struct WinUserData *wud)
553 {
554         PattSwitches.ClipboardUnit = (UBYTE) GetNumber (wud->Gadgets[GD_ClipUnit]);
555 }
556
557
558
559 static void GetEditorFontClicked (struct WinUserData *wud)
560 {
561         FontRequest (&EditorAttr, FOF_FIXEDWIDTHONLY);
562         ReopenPatternWindow ();
563         UpdatePattPrefs();
564 }
565
566
567
568 static void BGPenClicked (struct WinUserData *wud)
569 {
570         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
571
572         PattSwitches.BGPen = (UWORD) IntuiMsg.Code;
573
574         if (patternwud && patternwud->Win)
575                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
576                         PEA_BGPen,      PattSwitches.BGPen,
577                         TAG_DONE);
578 }
579
580
581
582 static void TextPenClicked (struct WinUserData *wud)
583 {
584         ULONG i, j, numcols = 1 << Scr->RastPort.BitMap->Depth;
585         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
586
587         PattSwitches.TextPen = (UWORD) IntuiMsg.Code;
588
589         /* Recalculate Lines colors */
590         for (i = 0, j = 0; i < numcols; i++)
591                 if (!(i & PattSwitches.TextPen))
592                         ColorTable[j++] = i;
593
594         /* Clear remaining colors */
595         for (i = j ; i < numcols; i++)
596                 ColorTable[i] = 0;
597
598         if (PattSwitches.LinesPen & PattSwitches.TextPen)
599                 PattSwitches.LinesPen = ColorTable[(j > 1) ? 1 : 0];
600
601         if (PattSwitches.TinyLinesPen & PattSwitches.TextPen)
602                 PattSwitches.TinyLinesPen = ColorTable[(j > 1) ? 1 : 0];
603
604         GT_SetGadgetAttrs (wud->Gadgets[GD_LinesPen], wud->Win, NULL,
605                 GTPA_Color,                     PattSwitches.LinesPen,
606                 GTPA_ColorTable,        ColorTable,
607                 GTPA_NumColors,         j,
608                 TAG_DONE);
609
610         GT_SetGadgetAttrs (wud->Gadgets[GD_TinyLinesPen], wud->Win, NULL,
611                 GTPA_Color,                     PattSwitches.TinyLinesPen,
612                 GTPA_ColorTable,        ColorTable,
613                 GTPA_NumColors,         j,
614                 TAG_DONE);
615
616         if (patternwud && patternwud->Win)
617                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
618                         PEA_TextPen,            PattSwitches.TextPen,
619                         PEA_LinesPen,           PattSwitches.LinesPen,
620                         PEA_TinyLinesPen,       PattSwitches.TinyLinesPen,
621                         TAG_DONE);
622 }
623
624
625
626 static void LinesPenClicked (struct WinUserData *wud)
627 {
628         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
629
630         PattSwitches.LinesPen = (UWORD) IntuiMsg.Code;
631
632         if (patternwud && patternwud->Win)
633                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
634                         PEA_LinesPen,   PattSwitches.LinesPen,
635                         TAG_DONE);
636 }
637
638
639
640 static void TinyLinesPenClicked (struct WinUserData *wud)
641 {
642         struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
643
644         PattSwitches.TinyLinesPen = (UWORD) IntuiMsg.Code;
645
646         if (patternwud && patternwud->Win)
647                 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
648                         PEA_TinyLinesPen,       PattSwitches.TinyLinesPen,
649                         TAG_DONE);
650 }
651
652
653
654 static void PattPrefsOkClicked (struct WinUserData *wud)
655 {
656         MyCloseWindow (wud);
657 }
658
659
660
661 static void PattPrefsCancelClicked (struct WinUserData *wud)
662 {
663         MyCloseWindow (wud);
664 }
665
666
667
668 static void PattSizeLinesClicked (struct WinUserData *wud)
669 {
670 }
671
672
673
674 static void PattSizeTracksClicked (struct WinUserData *wud)
675 {
676 }
677
678
679
680 static void PattSizeDoubleClicked (struct WinUserData *wud)
681 {
682         struct SongInfo *si;
683
684         if (si = xmLockActiveSong (SM_EXCLUSIVE))
685         {
686                 struct Pattern *patt = si->Patt[si->CurrentPatt];
687                 struct Pattern *newpatt;
688                 UWORD i, j;
689
690                 if (patt->Lines > MAXPATTLINES/2)
691                         ShowMessage (MSG_PATT_TOO_LONG);
692
693                 if (newpatt = xmAddPattern (si,
694                         PATTA_Lines,    patt->Lines << 1,
695                         PATTA_Tracks,   patt->Tracks,
696                         PATTA_Name,             patt->Name,
697                         PATTA_Num,              -1,
698                         TAG_DONE))
699                 {
700                         for (i = 0; i < patt->Tracks; i++)
701                                 for (j = 0; j < patt->Lines; j++)
702                                         memcpy (&newpatt->Notes[i][j*2], &patt->Notes[i][j], sizeof (struct Note));
703
704                         xmAddPattern (si,
705                                 PATTA_Num,              si->CurrentPatt,
706                                 PATTA_Pattern,  newpatt,
707                                 PATTA_Replace,  TRUE,
708                                 TAG_DONE);
709
710                         UpdatePattern();
711                 }
712                 else LastErr = ERROR_NO_FREE_STORE;
713
714                 ReleaseSemaphore (&si->Lock);
715         }
716 }
717
718
719
720 static void PattSizeHalveClicked (struct WinUserData *wud)
721 {
722         struct SongInfo *si;
723
724         if (si = xmLockActiveSong (SM_EXCLUSIVE))
725         {
726                 struct Pattern *patt = si->Patt[si->CurrentPatt];
727                 struct Pattern *newpatt;
728                 UWORD i, j;
729
730
731                 if (newpatt = xmAddPattern (si,
732                         PATTA_Lines,    patt->Lines >> 1,
733                         PATTA_Tracks,   patt->Tracks,
734                         PATTA_Name,             patt->Name,
735                         PATTA_Num,              -1,
736                         TAG_DONE))
737                 {
738                         for (i = 0; i < newpatt->Tracks; i++)
739                                 for (j = 0; j < newpatt->Lines; j++)
740                                         memcpy (&newpatt->Notes[i][j], &patt->Notes[i][j*2], sizeof (struct Note));
741
742                         xmAddPattern (si,
743                                 PATTA_Num,              si->CurrentPatt,
744                                 PATTA_Pattern,  newpatt,
745                                 PATTA_Replace,  TRUE,
746                                 TAG_DONE);
747
748                         UpdatePattern();
749                 }
750                 else LastErr = ERROR_NO_FREE_STORE;
751
752                 ReleaseSemaphore (&si->Lock);
753         }
754 }
755
756
757
758 static void PattSizeOkClicked (struct WinUserData *wud)
759 {
760         MyCloseWindow (wud);
761 }
762
763
764
765 static void PattSizeCancelClicked (struct WinUserData *wud)
766 {
767         if (OldPatt)
768         {
769                 struct SongInfo *si;
770
771                 if (si = xmLockActiveSong (SM_EXCLUSIVE))
772                 {
773                         if (OldSong == si)
774                         {
775                                 /* Restore original pattern */
776                                 CopyPattern (si, OldPatt, OldPattNum);
777
778                                 /* Free backup copy */
779                                 xmRemPattern (OldSong, -1, (ULONG)OldPatt);
780                                 OldPatt = NULL;
781                         }
782                 }
783
784                 ReleaseSemaphore (&si->Lock);
785         }
786
787         UpdatePattern();
788
789         MyCloseWindow (wud);
790 }