home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Pascal / Applications / MakeFat 1.0 / PNL Libraries / MyUtils.p < prev    next >
Encoding:
Text File  |  1995-12-01  |  11.1 KB  |  477 lines  |  [TEXT/CWIE]

  1. unit MyUtils;
  2.  
  3. interface
  4.  
  5.     uses
  6.         TextUtils, Events, Windows, MyTypes;
  7.         
  8.     const
  9.         my_font_strh_id = 1900;
  10.     
  11.     type
  12.         SavedWindowInfo = record
  13.                 oldport: GrafPtr;
  14.                 thisport: GrafPtr;
  15.                 font: integer;
  16.                 size: integer;
  17.                 face: Style;
  18.             end;
  19.  
  20.     type
  21.         MyFontType = (
  22.                 MFT_Geneva0, MFT_Geneva9, MFT_Geneva12, 
  23.                 MFT_Courier0, MFT_Courier9, MFT_Courier12,
  24.                 MFT_Chicago0, MFT_Chicago9, MFT_Chicago12,
  25.                 MFT_System0, MFT_System9, MFT_System12,
  26.                 MFT_Monaco0, MFT_Monaco9, MFT_Monaco12
  27.                 );
  28.  
  29.     procedure GetMyFonts(ft:MyFontType; var font, size:integer);
  30.     procedure SetMyFont(ft:MyFontType);
  31.     function MyTrapAvailable (tNumber: INTEGER): BOOLEAN;
  32.     function MyNumToString (n: longint): Str255;
  33.     function NumToK(n:longint; extra:boolean):Str255;
  34.     function NumToStr (n: longint): Str15;
  35.     function NN (n: longint; len: integer): Str15;
  36.     function N2 (n: longint): Str15;
  37.     function HexN (n: longint): Char;
  38.     function HexN2 (n: longint): Str15;
  39.     function HexNN (n: longint; len: integer): Str15;
  40.     function HexToNum (s: Str15): longint;
  41.     function StrToNum (s: Str255): longint;
  42.     procedure DotDotDot (var s: Str255; var width: integer);
  43.     procedure PlotSICN (typ:OSType; id, index, v, h: integer);
  44.     function LookupStrh (id: integer; match: Str255): Str255;
  45.     function LookupStrhNumber (id: integer; n: longint): Str255;
  46.     function DirtyKey (ch: char): boolean;
  47.     function SendCharToIsDialogEvent (var er: EventRecord; cs: charSet): boolean;
  48.     function GetVersionFromResFile: longint;
  49.     procedure MySetTrapAddress (addr: UniversalProcPtr; trapword: integer);
  50.     function MyGetTrapAddress (trapword: integer): UniversalProcPtr;
  51.     procedure SafeDeviceLoop (drawingRgn: RgnHandle; drawingProc: DeviceLoopDrawingProcPtr; userData: univ longint; flags: DeviceLoopFlags);
  52.     procedure SafeDeviceLoopRect (drawingRect: Rect; drawingProc: DeviceLoopDrawingProcPtr; userData: univ longint; flags: DeviceLoopFlags);
  53. { procedure drawingProc (depth: integer; deviceFlags: integer; targetDevice: GDHandle; item: longint); }
  54.     procedure MakeRGBColor (red, green, blue: integer; var col: RGBColor);
  55.     function IsExtensionVar (var name, ext: Str255): boolean;
  56.     function IsExtension (name, ext: Str255): boolean;
  57.     function IsPrefix (name, prefix: Str255): boolean;
  58.     function TPbtst(value:longint; bit:integer):Boolean;
  59.     procedure SetInvertHiliteMode;
  60.     procedure HiliteInvertRect (r: rect);
  61.     procedure HiliteInvertRgn (r: RgnHandle);
  62.     procedure FixScrap;
  63.     procedure HaveResources;
  64.  
  65. implementation
  66.  
  67.     uses
  68.         Scrap, Packages, ToolUtils, Resources, Memory, Processes, Folders, Traps, Fonts,
  69.         MyStrings, MyCallProc;
  70.  
  71.     const
  72.         HiliteMode = $938;
  73.  
  74.     procedure SetInvertHiliteMode;
  75.     begin
  76.         BitClr(POINTER(HiliteMode), pHiliteBit);
  77.     end;
  78.     
  79.     procedure HiliteInvertRect (r: rect);
  80.     begin
  81.         SetInvertHiliteMode;
  82.         InvertRect(r);
  83.     end;
  84.  
  85.     procedure HiliteInvertRgn (r: RgnHandle);
  86.     begin
  87.         SetInvertHiliteMode;
  88.         InvertRgn(r);
  89.     end;
  90.  
  91.     function TPbtst(value:longint; bit:integer):Boolean;
  92.     begin
  93.         TPbtst := btst(value, bit);
  94.     end;
  95.     
  96.     procedure GetMyFonts(ft:MyFontType; var font, size:integer);
  97.         var
  98.             s:Str255;
  99.             n:longint;
  100.     begin
  101.         GetIndString(s,my_font_strh_id,2*ord(ft) + 1);
  102.         GetFNum(s,font);
  103.         GetIndString(s,my_font_strh_id,2*ord(ft) + 2);
  104.         StringToNum(s,n);
  105.         size := n;
  106.     end;
  107.     
  108.     procedure SetMyFont(ft:MyFontType);
  109.         var
  110.             font, size:integer;
  111.     begin
  112.         GetMyFonts(ft, font, size);
  113.         TextFont(font);
  114.         TextSize(size);
  115.     end;
  116.     
  117.     function IsExtensionVar (var name, ext: Str255): boolean;
  118.         var
  119.             pn, pe: integer;
  120.     begin
  121.         if false then begin
  122.             IsExtensionVar := IUEqualString(TPCopy(name, length(name) - length(ext) + 1, 255), ext) = 0;
  123.         end else begin
  124.             IsExtensionVar := false;
  125.             if length(name) >= length(ext) then begin
  126.                 pn := length(name) - length(ext) + 1;
  127.                 pe := 1;
  128.                 while pe <= length(ext) do begin
  129.                     if UpCase(name[pn]) <> UpCase(ext[pe]) then begin
  130.                         leave;
  131.                     end;
  132.                     pn := pn + 1;
  133.                     pe := pe + 1;
  134.                 end;
  135.                 IsExtensionVar := pe > length(ext);
  136.             end;
  137.         end;
  138.     end;
  139.  
  140.     function IsExtension (name, ext: Str255): boolean;
  141.     begin
  142.         IsExtension := IsExtensionVar(name, ext);
  143.     end;
  144.  
  145.     function IsPrefix (name, prefix: Str255): boolean;
  146.     begin
  147.         IsPrefix := IUEqualString(TPCopy(name, 1, length(prefix)), prefix) = 0;
  148.     end;
  149.     
  150.     procedure MakeRGBColor (red, green, blue: integer; var col: RGBColor);
  151.     begin
  152.         col.red := red;
  153.         col.green := green;
  154.         col.blue := blue;
  155.     end;
  156.  
  157.     procedure SafeDeviceLoop (drawingRgn: RgnHandle; drawingProc: DeviceLoopDrawingProcPtr; userData: univ longint; flags: DeviceLoopFlags);
  158.     begin
  159.         if MyTrapAvailable(_DeviceLoop) then begin
  160.             DeviceLoop(drawingRgn, drawingProc, userData, flags);
  161.         end else begin
  162.             CallPascal02244(1, 0, nil, userData, drawingProc);
  163.         end;
  164.     end;
  165.  
  166.     procedure SafeDeviceLoopRect (drawingRect: Rect; drawingProc: DeviceLoopDrawingProcPtr; userData: univ longint; flags: DeviceLoopFlags);
  167.         var
  168.             rgn: RgnHandle;
  169.     begin
  170.         rgn := NewRgn;
  171.         RectRgn(rgn, drawingRect);
  172.         SafeDeviceLoop(rgn, drawingProc, userData, flags);
  173.         DisposeRgn(rgn);
  174.     end;
  175.  
  176.     function GetVersionFromResFile: longint;
  177.         var
  178.             versh: VersRecHndl;
  179.     begin
  180.         GetVersionFromResFile := 0;
  181.         versh := VersRecHndl(Get1Resource('vers', 1));
  182.         if versh <> nil then begin
  183.             GetVersionFromResFile := longint(versh^^.numericVersion);
  184.         end; (* if *)
  185.     end;
  186.  
  187.     function MyTrapAvailable (tNumber: INTEGER): BOOLEAN;
  188. {Check to see if a given trap is implemented. Babble as taken from IM6 }
  189.         const
  190.             TrapMask = $0800;
  191.         var
  192.             tType: TrapType;
  193.             numtraps: integer;
  194.     begin
  195.         tType := TrapType(TPbtst(tNumber, 11));
  196.         if (tType = ToolTrap) then begin
  197.             if NGetTrapAddress($A86E, ToolTrap) = NGetTrapAddress($AA6E, ToolTrap) then begin
  198.                 numtraps := $0200;
  199.             end else begin
  200.                 numtraps := $0400;
  201.             end;
  202.             if BAND(tNumber, $07FF) >= numtraps then begin
  203.                 tNumber := _Unimplemented;
  204.             end;
  205.         end;
  206.         MyTrapAvailable := MyGetTrapAddress(tNumber) <> MyGetTrapAddress(_Unimplemented);
  207.     end;
  208.  
  209.     function MyNumToString (n: longint): Str255;
  210.         var
  211.             s, t: Str255;
  212.     begin
  213.         if abs(n) < 4096 then begin
  214.             NumToString(n, s)
  215.         end else if abs(n) < 4194304 then begin
  216.             NumToString(n div 1024, s);
  217.             GetIndString(t, 935, 2);
  218.             s := Concat(s, t);
  219.         end else begin
  220.             GetIndString(t, 935, 3);
  221.             NumToString(n div 1048576, s);
  222.             s := Concat(s, t);
  223.         end;
  224.         MyNumToString := s;
  225.     end;
  226.  
  227.     function NumToK(n:longint; extra:boolean):Str255;
  228.         const
  229.             K = 1024;
  230.             M = 1048576;
  231.         var
  232.             f:integer;
  233.             s, dot:Str255;
  234.     begin
  235.         if (n < 1048576) & extra then begin
  236.             n := n*1024;
  237.             extra := false;
  238.         end;
  239.         if (n < K) then begin 
  240.             { extra is false }
  241.             NumToString(n,s);
  242.         end else begin
  243.             { n >= K }
  244.             f := ord(extra);
  245.             while n >= M do begin
  246.                 f := f + 1;
  247.                 n := n div K;
  248.             end;
  249.             { K <= n < M } { Display n/1024 GetIndStr(935,f+2) }
  250.             GetIndString(s, 935, f+2);
  251.             GetIndString(dot, 935, 1);
  252.             if n>=1024000 then begin
  253.                 n := n div 1024;
  254.                 s := concat(NumToStr(n),s);
  255.             end else if n>=102400 then begin
  256.                 n:= n*10 div 1024;
  257.                 s := concat(NumToStr(n div 10),dot,NN(n mod 10,1),s);
  258.             end else if n>=10240 then begin
  259.                 n:= n*100 div 1024;
  260.                 s := concat(NumToStr(n div 100),dot,NN(n mod 100,2),s);
  261.             end else begin
  262.                 n := n*1000 div 1024;
  263.                 s := concat(NumToStr(n div 1000),dot,NN(n mod 1000,3),s);
  264.             end;
  265.         end;
  266.         NumToK:=s;
  267.     end;
  268.     
  269.     function NumToStr (n: longint): Str15;
  270.         var
  271.             s: Str255;
  272.     begin
  273.         NumToString(n, s);
  274.         NumToStr := s;
  275.     end;
  276.  
  277.     function NN (n: longint; len: integer): Str15;
  278.         var
  279.             s: Str255;
  280.     begin
  281.         if len > 15 then begin
  282.             len := 15;
  283.         end;
  284.         NumToString(n, s);
  285.         while length(s) < len do begin
  286.             s := concat('0', s);
  287.         end;
  288.         NN := s;
  289.     end;
  290.  
  291.     function N2 (n: longint): Str15;
  292.     begin
  293.         N2 := NN(n, 2);
  294.     end;
  295.  
  296.     function HexN (n: longint): Char;
  297.     begin
  298.         n := BAND(n, $F);
  299.         if n >= 10 then begin
  300.             n := n + 7;
  301.         end;
  302.         n := n + 48;
  303.         HexN := Chr(n);
  304.     end;
  305.  
  306.     function HexN2 (n: longint): Str15;
  307.     begin
  308.         HexN2 := concat(HexN(BSR(n, 4)), HexN(n));
  309.     end;
  310.  
  311.     function HexNN (n: longint; len: integer): Str15;
  312.         var
  313.             s: Str15;
  314.     begin
  315.         if len > 15 then begin
  316.             len := 15;
  317.         end;
  318.         s := HexN(n);
  319.         while length(s) < len do begin
  320.             n := BAND(BSR(n, 4), $0FFFFFFF);
  321.             s :=concat(HexN(n), s);
  322.         end;
  323.         HexNN := s;
  324.     end;
  325.  
  326.     function HexToNum (s: Str15): longint;
  327.         var
  328.             n: longint;
  329.             i, v: integer;
  330.     begin
  331.         i := 1;
  332.         n := 0;
  333.         while (i <= length(s)) & (s[i] in ['A'..'Z', 'a'..'z', '0'..'9']) do begin
  334.             case s[i] of
  335.                 'A'..'Z': 
  336.                     v := ord(s[i]) - 55;
  337.                 'a'..'z': 
  338.                     v := ord(s[i]) - 87;
  339.                 '0'..'9': 
  340.                     v := ord(s[i]) - 48;
  341.             end;
  342.             n := BSL(n, 4) + v;
  343.             i := i + 1;
  344.         end;
  345.         HexToNum := n;
  346.     end;
  347.  
  348.     function StrToNum (s: Str255): longint;
  349.         var
  350.             n: longint;
  351.     begin
  352.         StringToNum(s, n);
  353.         StrToNum := n;
  354.     end;
  355.  
  356.     procedure DotDotDot (var s: Str255; var width: integer);
  357.         var
  358.             maxwidth, len: integer;
  359.     begin
  360.         maxwidth := width;
  361.         width := StringWidth(s);
  362.         if width > maxwidth then begin
  363.             width := width + CharWidth('…');
  364. {$PUSH}
  365. {$R-}
  366.             len := ord(s[0]);
  367.             while (len > 0) and (width > maxwidth) do begin
  368.                 width := width - CharWidth(s[len]);
  369.                 len := len - 1;
  370.             end;
  371.             len := len + 1;
  372.             s[0] := chr(len);
  373.             s[len] := '…';
  374. {$POP}
  375.         end;
  376.     end;
  377.  
  378.     procedure PlotSICN (typ:OSType; id, index, v, h: integer);
  379.         var
  380.             sh: Handle;
  381.             bm: BitMap;
  382.             r: Rect;
  383.             gp: grafptr;
  384.     begin
  385.         sh := GetResource(typ, id);
  386.         HLock(sh);
  387.         bm.baseAddr := Ptr(longint(sh^) + (index - 1) * 32);
  388.         bm.rowBytes := 2;
  389.         SetRect(r, h, v, h + 16, v + 16);
  390.         bm.bounds := r;
  391.         GetPort(gp);
  392.         CopyBits(bm, gp^.portBits, r, r, srcCopy, nil);
  393.         HUnlock(sh);
  394.         HPurge(sh);
  395.     end;
  396.  
  397.     function LookupStrh (id: integer; match: Str255): Str255;
  398.         var
  399.             t, s: Str255;
  400.             i: integer;
  401.     begin
  402.         t := '';
  403.         i := 1;
  404.         repeat
  405.             GetIndString(s, id, i);
  406.             if s = match then begin
  407.                 GetIndString(t, id, i + 1);
  408.                 leave;
  409.             end;
  410.             i := i + 2;
  411.         until s = '';
  412.         LookupStrh := t;
  413.     end;
  414.  
  415.     function LookupStrhNumber (id: integer; n: longint): Str255;
  416.         var
  417.             s, t: Str255;
  418.     begin
  419.         NumToString(n, s);
  420.         t := LookupStrh(id, s);
  421.         if t = '' then begin
  422.             t := s;
  423.         end;
  424.         LookupStrhNumber := t;
  425.     end;
  426.  
  427.     function DirtyKey (ch: char): boolean;
  428.     begin
  429.         DirtyKey := not (ord(ch) in [homeChar, endChar, helpChar, pageUpChar, pageDownChar, leftArrowChar, rightArrowChar, upArrowChar, downArrowChar]);
  430.     end;
  431.  
  432.     function SendCharToIsDialogEvent (var er: EventRecord; cs: charSet): boolean;
  433.         var
  434.             ch: char;
  435.     begin
  436.         SendCharToIsDialogEvent := true;
  437.         if ((er.what = keyDown) | (er.what = autoKey)) & (BAND(er.modifiers, cmdKey) = 0) then begin
  438.             ch := chr(BAND(er.message, $FF));
  439.             if not (ch in (cs + [tab, del, bs])) & DirtyKey(ch) then begin
  440.                 SendCharToIsDialogEvent := false;
  441.             end;
  442.         end;
  443.     end;
  444.  
  445.     function MyGetTrapAddress (trapword: integer): UniversalProcPtr;
  446.     begin
  447.         MyGetTrapAddress := UniversalProcPtr(NGetTrapAddress(trapword, TrapType(TPbtst(trapword, 11))));
  448.     end;
  449.  
  450.     procedure MySetTrapAddress (addr: UniversalProcPtr; trapword: integer);
  451.     begin
  452.         NSetTrapAddress(addr, trapword, TrapType(TPbtst(trapword, 11)));
  453.     end;
  454.  
  455.     procedure FixScrap;
  456.         var
  457.             scrap: ScrapStuffPtr;
  458.             junk, offset: longint;
  459.     begin
  460.         scrap := InfoScrap;
  461.         if scrap^.scrapHandle = nil then begin
  462.             scrap^.scrapState := -1;
  463.         end;
  464.         junk := GetScrap(nil, 'XXXX', offset);
  465.         junk := UnloadScrap;
  466.     end;
  467.  
  468.     procedure HaveResources;
  469.     begin
  470.         if Get1Resource('BNDL', 128) = nil then begin
  471.             SysBeep(1);
  472.             ExitToShell;
  473.         end;
  474.     end;
  475.  
  476. end.
  477.