home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1996 November / macformat-043.iso / mac / Shareware Plus / Developers / Sprite Animation Toolkit 2.3.8 / Add-ons / Storage / Settings.p < prev    next >
Encoding:
Text File  |  1995-09-12  |  5.0 KB  |  195 lines  |  [TEXT/PJMM]

  1. unit Settings;
  2.  
  3. interface
  4.     uses
  5. {$IFC UNDEFINED THINK_PASCAL}
  6.         Types, QuickDraw, Fonts, Events, Packages, Menus, Dialogs, Windows,{}
  7.         OSUtils, ToolUtils, Resources, 
  8. {$ELSEC}
  9.         InterfacesUI, 
  10. {$ENDC}
  11.         SAT, SettingsStubs;
  12.  
  13.     var
  14.         settings: SettingsHnd;
  15.  
  16.     procedure InitSettings (prefFile: Integer);
  17.     procedure SaveSettings;
  18.     procedure DoKeySettingsDialog;
  19.  
  20. implementation
  21.  
  22.     var
  23.         keycode: array[1..kNumKeys] of integer;
  24.         gPrefFile: Integer;    {prefFile for internal use}
  25.  
  26.     function StdFilter (theDialog: DialogPtr; var theEvent: EventRecord; var itemHit: integer): boolean;
  27.         var
  28.             theChar: Char;
  29.             kind: integer;
  30.             item: Handle;
  31.             box: Rect;
  32.     begin
  33.  
  34.         if theEvent.what = updateEvt then
  35.             begin
  36.                 BeginUpdate(theDialog);
  37.                 SetPort(theDialog);
  38.  
  39.                 DrawDialog(theDialog);
  40.  
  41. {Frame button}
  42.                 GetDialogItem(theDialog, ok, kind, item, box);
  43.                 InsetRect(box, -4, -4);
  44.                 PenSize(3, 3);
  45.                 FrameRoundRect(box, 15, 15);
  46.  
  47.                 StdFilter := false;
  48.  
  49.                 EndUpdate(theDialog);
  50.             end;
  51.  
  52.         if theEvent.what = keyDown then
  53.             begin
  54.                 theChar := Char(BitAnd(theEvent.message, charCodeMask));
  55.                 if ((BitAnd(theEvent.modifiers, cmdkey) <> 0) and (theChar = '.')) or (theChar = char(27)) then {cmd-. eller ESC}
  56. {if TestDItemEnable(theDialog, cancel) then}
  57.                     begin
  58.                         itemHit := cancel;
  59. {MÃ¥ste jag highlighta till keyup?}
  60.  
  61.                         GetDialogItem(theDialog, cancel, kind, item, box);
  62.                         HiliteControl(ControlHandle(item), 1);
  63.  
  64.                         StdFilter := true;
  65.                         exit(StdFilter);
  66.                     end;
  67.                 if (theChar = char(13)) or (theChar = char(3)) then
  68. {if TestDItemEnable(theDialog, ok) then}
  69.                     begin
  70.                         itemHit := ok;
  71.                         GetDialogItem(theDialog, ok, kind, item, box);
  72.                         HiliteControl(ControlHandle(item), 1);
  73.                         StdFilter := true;
  74.                         exit(StdFilter);
  75.                     end;
  76.             end;
  77.         StdFilter := false;
  78.     end; {StdFilter}
  79.  
  80.     function KeysFilter (theDialog: DialogPtr; var theEvent: EventRecord; var itemHit: integer): boolean;
  81.         var
  82.             item: Integer;
  83.             theKeyNumber: Integer;
  84.     begin
  85.         if BitAnd(theEvent.modifiers, cmdkey) <> 0 then
  86.             KeysFilter := StdFilter(theDialog, theEvent, itemHit)
  87.         else if theEvent.what <> keyDown then
  88.             KeysFilter := StdFilter(theDialog, theEvent, itemHit)
  89.         else if BitAnd(theEvent.message, charCodeMask) = 3 then {Enter}
  90.             KeysFilter := StdFilter(theDialog, theEvent, itemHit)
  91.         else if BitAnd(theEvent.message, charCodeMask) = 13 then {Return}
  92.             KeysFilter := StdFilter(theDialog, theEvent, itemHit)
  93.         else if BitAnd(theEvent.message, charCodeMask) = 9 then {TAB}
  94.             KeysFilter := StdFilter(theDialog, theEvent, itemHit)
  95.         else if BitAnd(theEvent.message, charCodeMask) = 27 then {ESC}
  96.             KeysFilter := StdFilter(theDialog, theEvent, itemHit)
  97.         else
  98.             begin
  99.                 theKeyNumber := BSR(BitAnd(theEvent.message, keyCodeMask), 8);
  100.                 if IsDialogEvent(theEvent) then
  101.                     if DialogSelect(theEvent, theDialog, item) then
  102.                         begin
  103.                             itemHit := item;
  104.                             KeysFilter := true;
  105.                             keycode[itemHit + 1 - kFirstKeyItem] := theKeyNumber;
  106.                             SelectDialogItemText(theDialog, itemHit, 0, 32767);
  107.                         end;
  108.             end;
  109.     end;
  110.  
  111.     procedure DoKeySettingsDialog;
  112.         var
  113.             dialog: DialogPtr;
  114.             oldPort: SATPort;
  115.             itemHit: integer;
  116.             km: KeyMap;
  117.             i: integer;
  118.             found: Boolean;
  119.             kind: integer;
  120.             item: Handle;
  121.             box: Rect;
  122.             tmpStr: Str255;
  123.     begin
  124.         SATGetPort(oldPort);
  125.         SATSetPortScreen;
  126.         dialog := GetNewDialog(kKeysDlogRes, nil, WindowPtr(-1));
  127.  
  128.         for i := 1 to kNumKeys do
  129.             begin
  130.                 GetDialogItem(dialog, i - 1 + kFirstKeyItem, kind, item, box);
  131.                 SetDialogItemText(item, StringOf(settings^^.key[i]));
  132.                 keycode[i] := settings^^.keyCode[i];
  133.             end;
  134.  
  135.         SelectDialogItemText(dialog, kFirstKeyItem, 0, 32767);
  136.  
  137.         ShowWindow(dialog);
  138.         SelectWindow(dialog);
  139.         if gSAT.colorFlag then
  140.             SetGDevice(GetMainDevice);
  141.         SetPort(dialog);
  142.  
  143.         repeat { 1=ok, 2=cancel }
  144.             ModalDialog(@KeysFilter, itemHit);
  145.             if itemHit > cancel then
  146.                 SelectDialogItemText(dialog, itemHit, 0, 32767);
  147.         until (itemHit = ok) or (itemHit = cancel);
  148.  
  149.         if itemHit = ok then
  150.             begin
  151.                 for i := 1 to kNumKeys do
  152.                     begin
  153.                         settings^^.keyCode[i] := keycode[i];
  154.                         GetDialogItem(dialog, i - 1 + kFirstKeyItem, kind, item, box);
  155.                         GetDialogItemText(item, tmpStr);
  156.                         settings^^.key[i] := tmpStr[1];
  157.                     end;
  158.                 ChangedResource(Handle(settings));
  159.             end;
  160.  
  161.         DisposeDialog(dialog);
  162.         SATSetPort(oldPort);
  163.     end; {DoKeySettingsDialog}
  164.  
  165.  
  166.  
  167.     procedure InitSettings (prefFile: Integer);
  168.         var
  169.             i, j: integer;
  170.             saveResFile: Integer;
  171.     begin
  172.         saveResFile := CurResFile;
  173.         UseResFile(prefFile);
  174.         gPrefFile := prefFile; {save the refnum internally}
  175.  
  176.         settings := SettingsHnd(Get1Resource('Sett', 1));
  177.         if settings = nil then
  178.             begin
  179.                 settings := SettingsHnd(NewHandle(sizeof(SettingsRec)));
  180. {Init fields here}
  181.                 AddResource(Handle(settings), 'Sett', 1, 'Inställningar');
  182.             end
  183.         else if GetHandleSize(Handle(settings)) < SizeOf(SettingsRec) then
  184.             SetHandleSize(Handle(settings), SizeOf(SettingsRec));
  185.  
  186.         UseResFile(saveResFile);
  187.     end; {InitSettings}
  188.  
  189.     procedure SaveSettings;
  190.     begin
  191.         ChangedResource(Handle(settings));
  192.         UpdateResFile(gPrefFile);
  193.     end; {SaveSettings}
  194.  
  195. end.