4 ** Copyright (C) 1995,96 Bernardo Innocenti
6 ** Pattern preferences panel and pattern size panel handling functions.
9 #include <intuition/intuition.h>
10 #include <libraries/gadtools.h>
11 #include <libraries/patteditclass.h>
12 #include <libraries/asl.h>
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>
20 #include "XModulePriv.h"
21 #include "CustomClasses.h"
25 static LONG PattPrefsPreOpen (struct WinUserData *wud);
26 static void PattPrefsPostClose (void);
27 static void ReopenPatternWindow (void);
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);
50 static void PattSizePostClose (void);
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);
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[] = {
126 GTPA_ColorTable, NULL,
130 static LONG TextPenTags[] = {
138 static STRPTR ScrollerPosLabels[] =
141 (STRPTR)MSG_RIGHT_GAD,
142 (STRPTR)MSG_LEFT_GAD,
148 static LONG PattPrefsArgs[] =
150 HGROUP_KIND, BBFT_RIDGE,
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,
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,
170 VGROUP_KIND, BBFT_RIDGE,
172 TEXT_KIND, MSG_EDITOR_FONT_GAD, 0, GTTX_Border, TRUE, TAG_DONE,
173 IMAGEBUTTON_KIND, (ULONG)GetEditorFontClicked, IM_PICK, TAG_DONE,
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,
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,
187 BUTTON_KIND, (LONG)PattPrefsOkClicked, MSG_UNDERSCORE_OK_GAD, TAG_DONE,
188 BUTTON_KIND, (LONG)PattPrefsCancelClicked, MSG_UNDERSCORE_CANCEL_GAD, TAG_DONE,
195 static LONG PattSizeArgs[] =
197 HGROUP_KIND, BBFT_RIDGE,
199 INTEGER_KIND, (LONG)PattSizeLinesClicked, MSG_LINES_GAD, 5, TAG_DONE,
200 INTEGER_KIND, (LONG)PattSizeTracksClicked, MSG_TRACKS_GAD, 3, TAG_DONE,
203 BUTTON_KIND, (LONG)PattSizeDoubleClicked, MSG_DOUBLE_GAD, TAG_DONE,
206 BUTTON_KIND, (LONG)PattSizeHalveClicked, MSG_HALVE_GAD, TAG_DONE,
210 BUTTON_KIND, (LONG)PattSizeOkClicked, MSG_UNDERSCORE_OK_GAD, TAG_DONE,
211 BUTTON_KIND, (LONG)PattSizeCancelClicked, MSG_UNDERSCORE_CANCEL_GAD, TAG_DONE,
218 XDEF LONG PattPrefsWinTags[] =
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",
234 XDEF LONG PattSizeWinTags[] =
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",
249 static LONG PattPrefsPreOpen (struct WinUserData *wud)
253 numcols = 1 << Scr->RastPort.BitMap->Depth;
257 if (!(ColorTable = AllocVecPooled (Pool, numcols)))
260 /* Fill ColorTable */
261 for (i = 0, j = 0; i < numcols; i++)
262 if (!(i & PattSwitches.TextPen))
265 /* Clear remaining colors */
266 for (i = j ; i < numcols; i++)
269 BGPenTags[1] = PattSwitches.LinesPen;
270 BGPenTags[3] = (ULONG) ColorTable;
272 TextPenTags[1] = PattSwitches.TextPen;
273 TextPenTags[3] = numcols - 1;
275 memcpy (&OldPattSwitches, &PattSwitches, sizeof (PattSwitches));
283 static void PattPrefsPostClose (void)
285 FreeVecPooled (Pool, ColorTable); ColorTable = NULL;
289 static void ReopenPatternWindow (void)
291 /* Closes all editor windows and reopens one */
293 if (WDescr[WID_PATTERN].Wud)
295 if (WDescr[WID_PATTERN].Wud->Win)
297 /* Close all pattern editors... */
298 while (WDescr[WID_PATTERN].UseCnt > 1)
299 MyCloseWindow (WDescr[WID_PATTERN].Wud);
301 /* And close last window too... */
302 MyCloseWindow (WDescr[WID_PATTERN].Wud);
304 /* Now ensure the LayoutInfo for this window gets flushed... */
305 DeleteLayoutInfo (WDescr[WID_PATTERN].Wud);
307 /* And reopen one pattern editor to show changes! */
308 NewWindow (WID_PATTERN);
310 else DeleteLayoutInfo (WDescr[WID_PATTERN].Wud);
316 void UpdatePattPrefs (void)
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 :-(.
322 static UBYTE editorfont[40];
324 struct WinUserData *wud = WDescr[WID_PATTPREFS].Wud;
328 SPrintf (editorfont, "%s/%ld", EditorAttr.ta_Name, EditorAttr.ta_YSize);
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,
354 static void PattSizePostClose (void)
356 xmRemPattern (OldSong, -1, (ULONG)OldPatt);
362 GLOBALCALL void UpdatePattSize (void)
364 struct WinUserData *wud = WDescr[WID_PATTSIZE].Wud;
369 struct Pattern *patt;
371 if (si = xmLockActiveSong (SM_SHARED))
373 patt = si->Patt[si->CurrentPatt];
375 /* Free previous backup copy, if any */
377 if (OldPatt) xmRemPattern (OldSong, -1, (ULONG)OldPatt);
379 /* Make a local backup copy of the current pattern (it may fail) */
382 OldPattNum = si->CurrentPatt;
383 OldPatt = CopyPattern (si, si->Patt[si->CurrentPatt], -1);
387 GD_PattSizeLines, patt->Lines,
388 GD_PattSizeTracks, patt->Tracks,
391 ReleaseSemaphore (&si->Lock);
398 static void AdvanceTracksClicked (struct WinUserData *wud)
400 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
401 PattSwitches.AdvanceTracks = (WORD) GetNumber (wud->Gadgets[GD_AdvanceTracks]);
403 if (patternwud && patternwud->Win)
404 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
405 PEA_AdvanceCurs, (PattSwitches.AdvanceTracks << 16) |
406 ((UWORD)PattSwitches.AdvanceLines),
412 static void AdvanceLinesClicked (struct WinUserData *wud)
414 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
416 PattSwitches.AdvanceLines = (WORD) GetNumber(wud->Gadgets[GD_AdvanceLines]);
418 if (patternwud && patternwud->Win)
419 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
420 PEA_AdvanceCurs, (PattSwitches.AdvanceTracks << 16) |
421 ((UWORD)PattSwitches.AdvanceLines),
427 static void MaxUndoLevelsClicked (struct WinUserData *wud)
429 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
431 PattSwitches.MaxUndoLevels = (WORD) GetNumber (wud->Gadgets[GD_MaxUndoLevels]);
433 if (patternwud && patternwud->Win)
434 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
435 PEA_MaxUndoLevels, PattSwitches.MaxUndoLevels,
441 static void MaxUndoMemClicked (struct WinUserData *wud)
443 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
445 PattSwitches.MaxUndoMem = (WORD) GetNumber (wud->Gadgets[GD_MaxUndoMem]);
447 if (patternwud && patternwud->Win)
448 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
449 PEA_MaxUndoMem, PattSwitches.MaxUndoMem,
455 static void VScrollerPlaceClicked (struct WinUserData *wud)
457 PattSwitches.VScrollerPlace = IntuiMsg.Code;
458 ReopenPatternWindow ();
462 static void HScrollerPlaceClicked (struct WinUserData *wud)
464 PattSwitches.HScrollerPlace ^= SCROLLERPLACE_BOTTOM;
465 ReopenPatternWindow ();
469 static void WrapVertClicked (struct WinUserData *wud)
471 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
473 PattSwitches.Flags ^= PEF_VWRAP;
475 if (patternwud && patternwud->Win)
476 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
477 PEA_Flags, PattSwitches.Flags,
483 static void WrapHorizClicked (struct WinUserData *wud)
485 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
487 PattSwitches.Flags ^= PEF_HWRAP;
489 if (patternwud && patternwud->Win)
490 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
491 PEA_Flags, PattSwitches.Flags,
497 static void HexLineNumbersClicked (struct WinUserData *wud)
499 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
501 PattSwitches.Flags ^= PEF_HEXMODE;
503 if (patternwud && patternwud->Win)
504 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
505 PEA_Flags, PattSwitches.Flags,
511 static void BlankZeroClicked (struct WinUserData *wud)
513 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
515 PattSwitches.Flags ^= PEF_BLANKZERO;
517 if (patternwud && patternwud->Win)
518 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
519 PEA_Flags, PattSwitches.Flags,
524 static void DoRulerClicked (struct WinUserData *wud)
526 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
528 PattSwitches.Flags ^= PEF_DOCURSORRULER;
530 if (patternwud && patternwud->Win)
531 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
532 PEA_Flags, PattSwitches.Flags,
538 static void DoTinyLinesClicked (struct WinUserData *wud)
540 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
542 PattSwitches.Flags ^= PEF_DOTINYLINES;
544 if (patternwud && patternwud->Win)
545 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
546 PEA_Flags, PattSwitches.Flags,
552 static void ClipUnitClicked (struct WinUserData *wud)
554 PattSwitches.ClipboardUnit = (UBYTE) GetNumber (wud->Gadgets[GD_ClipUnit]);
559 static void GetEditorFontClicked (struct WinUserData *wud)
561 FontRequest (&EditorAttr, FOF_FIXEDWIDTHONLY);
562 ReopenPatternWindow ();
568 static void BGPenClicked (struct WinUserData *wud)
570 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
572 PattSwitches.BGPen = (UWORD) IntuiMsg.Code;
574 if (patternwud && patternwud->Win)
575 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
576 PEA_BGPen, PattSwitches.BGPen,
582 static void TextPenClicked (struct WinUserData *wud)
584 ULONG i, j, numcols = 1 << Scr->RastPort.BitMap->Depth;
585 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
587 PattSwitches.TextPen = (UWORD) IntuiMsg.Code;
589 /* Recalculate Lines colors */
590 for (i = 0, j = 0; i < numcols; i++)
591 if (!(i & PattSwitches.TextPen))
594 /* Clear remaining colors */
595 for (i = j ; i < numcols; i++)
598 if (PattSwitches.LinesPen & PattSwitches.TextPen)
599 PattSwitches.LinesPen = ColorTable[(j > 1) ? 1 : 0];
601 if (PattSwitches.TinyLinesPen & PattSwitches.TextPen)
602 PattSwitches.TinyLinesPen = ColorTable[(j > 1) ? 1 : 0];
604 GT_SetGadgetAttrs (wud->Gadgets[GD_LinesPen], wud->Win, NULL,
605 GTPA_Color, PattSwitches.LinesPen,
606 GTPA_ColorTable, ColorTable,
610 GT_SetGadgetAttrs (wud->Gadgets[GD_TinyLinesPen], wud->Win, NULL,
611 GTPA_Color, PattSwitches.TinyLinesPen,
612 GTPA_ColorTable, ColorTable,
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,
626 static void LinesPenClicked (struct WinUserData *wud)
628 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
630 PattSwitches.LinesPen = (UWORD) IntuiMsg.Code;
632 if (patternwud && patternwud->Win)
633 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
634 PEA_LinesPen, PattSwitches.LinesPen,
640 static void TinyLinesPenClicked (struct WinUserData *wud)
642 struct WinUserData *patternwud = WDescr[WID_PATTERN].Wud;
644 PattSwitches.TinyLinesPen = (UWORD) IntuiMsg.Code;
646 if (patternwud && patternwud->Win)
647 SetGadgetAttrs (patternwud->Gadgets[0], patternwud->Win, NULL,
648 PEA_TinyLinesPen, PattSwitches.TinyLinesPen,
654 static void PattPrefsOkClicked (struct WinUserData *wud)
661 static void PattPrefsCancelClicked (struct WinUserData *wud)
668 static void PattSizeLinesClicked (struct WinUserData *wud)
674 static void PattSizeTracksClicked (struct WinUserData *wud)
680 static void PattSizeDoubleClicked (struct WinUserData *wud)
684 if (si = xmLockActiveSong (SM_EXCLUSIVE))
686 struct Pattern *patt = si->Patt[si->CurrentPatt];
687 struct Pattern *newpatt;
690 if (patt->Lines > MAXPATTLINES/2)
691 ShowMessage (MSG_PATT_TOO_LONG);
693 if (newpatt = xmAddPattern (si,
694 PATTA_Lines, patt->Lines << 1,
695 PATTA_Tracks, patt->Tracks,
696 PATTA_Name, patt->Name,
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));
705 PATTA_Num, si->CurrentPatt,
706 PATTA_Pattern, newpatt,
712 else LastErr = ERROR_NO_FREE_STORE;
714 ReleaseSemaphore (&si->Lock);
720 static void PattSizeHalveClicked (struct WinUserData *wud)
724 if (si = xmLockActiveSong (SM_EXCLUSIVE))
726 struct Pattern *patt = si->Patt[si->CurrentPatt];
727 struct Pattern *newpatt;
731 if (newpatt = xmAddPattern (si,
732 PATTA_Lines, patt->Lines >> 1,
733 PATTA_Tracks, patt->Tracks,
734 PATTA_Name, patt->Name,
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));
743 PATTA_Num, si->CurrentPatt,
744 PATTA_Pattern, newpatt,
750 else LastErr = ERROR_NO_FREE_STORE;
752 ReleaseSemaphore (&si->Lock);
758 static void PattSizeOkClicked (struct WinUserData *wud)
765 static void PattSizeCancelClicked (struct WinUserData *wud)
771 if (si = xmLockActiveSong (SM_EXCLUSIVE))
775 /* Restore original pattern */
776 CopyPattern (si, OldPatt, OldPattNum);
778 /* Free backup copy */
779 xmRemPattern (OldSong, -1, (ULONG)OldPatt);
784 ReleaseSemaphore (&si->Lock);