home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / PNL Libraries / MyUtils.p < prev    next >
Encoding:
Text File  |  1995-10-22  |  11.7 KB  |  514 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
  124.         else begin
  125.             IsExtensionVar := false;
  126.             if length(name) >= length(ext) then begin
  127.                 pn := length(name) - length(ext) + 1;
  128.                 pe := 1;
  129.                 while pe <= length(ext) do begin
  130.                     if UpCase(name[pn]) <> UpCase(ext[pe]) then begin
  131.                         leave;
  132.                     end;
  133.                     pn := pn + 1;
  134.                     pe := pe + 1;
  135.                 end;
  136.                 IsExtensionVar := pe > length(ext);
  137.             end;
  138.         end;
  139.     end;
  140.  
  141.     function IsPrefix (name, prefix: Str255): boolean;
  142.     begin
  143.         IsPrefix := IUEqualString(TPCopy(name, 1, length(prefix)), prefix) = 0;
  144.     end;
  145.     
  146.     function IsExtension (name, ext: Str255): boolean;
  147.     begin
  148.         IsExtension := IsExtensionVar(name, ext);
  149.     end;
  150.  
  151.     procedure MakeRGBColor (red, green, blue: integer; var col: RGBColor);
  152.     begin
  153.         col.red := red;
  154.         col.green := green;
  155.         col.blue := blue;
  156.     end;
  157.  
  158.     procedure SafeDeviceLoop (drawingRgn: RgnHandle; drawingProc: DeviceLoopDrawingProcPtr; userData: univ longint; flags: DeviceLoopFlags);
  159.     begin
  160.         if MyTrapAvailable(_DeviceLoop) then begin
  161.             DeviceLoop(drawingRgn, drawingProc, userData, flags);
  162.         end
  163.         else begin
  164.             CallPascal02244(1, 0, nil, userData, drawingProc);
  165.         end;
  166.     end;
  167.  
  168.     procedure SafeDeviceLoopRect (drawingRect: Rect; drawingProc: DeviceLoopDrawingProcPtr; userData: univ longint; flags: DeviceLoopFlags);
  169.         var
  170.             rgn: RgnHandle;
  171.     begin
  172.         rgn := NewRgn;
  173.         RectRgn(rgn, drawingRect);
  174.         SafeDeviceLoop(rgn, drawingProc, userData, flags);
  175.         DisposeRgn(rgn);
  176.     end;
  177.  
  178.     function GetVersionFromResFile: longint;
  179.         var
  180.             versh: VersRecHndl;
  181.     begin
  182.         GetVersionFromResFile := 0;
  183.         versh := VersRecHndl(Get1Resource('vers', 1));
  184.         if versh <> nil then begin
  185.             GetVersionFromResFile := longint(versh^^.numericVersion);
  186.         end; (* if *)
  187.     end;
  188.  
  189.     function MyTrapAvailable (tNumber: INTEGER): BOOLEAN;
  190. {Check to see if a given trap is implemented. Babble as taken from IM6 }
  191.         const
  192.             TrapMask = $0800;
  193.         var
  194.             tType: TrapType;
  195.             numtraps: integer;
  196.     begin
  197.         tType := TrapType(TPbtst(tNumber, 11));
  198.         if (tType = ToolTrap) then begin
  199.             if NGetTrapAddress($A86E, ToolTrap) = NGetTrapAddress($AA6E, ToolTrap) then begin
  200.                 numtraps := $0200;
  201.             end
  202.             else begin
  203.                 numtraps := $0400;
  204.             end;
  205.             if BAND(tNumber, $07FF) >= numtraps then begin
  206.                 tNumber := _Unimplemented;
  207.             end;
  208.         end;
  209.         MyTrapAvailable := MyGetTrapAddress(tNumber) <> MyGetTrapAddress(_Unimplemented);
  210.     end;
  211.  
  212.     function MyNumToString (n: longint): Str255;
  213.         var
  214.             s, t: Str255;
  215.     begin
  216.         if abs(n) < 4096 then begin
  217.             NumToString(n, s)
  218.         end else if abs(n) < 4194304 then begin
  219.             NumToString(n div 1024, s);
  220.             GetIndString(t, 935, 2);
  221.             s := Concat(s, t);
  222.         end
  223.         else begin
  224.             GetIndString(t, 935, 3);
  225.             NumToString(n div 1048576, s);
  226.             s := Concat(s, t);
  227.         end;
  228.         MyNumToString := s;
  229.     end;
  230.  
  231.     function NumToK(n:longint; extra:boolean):Str255;
  232.         const
  233.             K = 1024;
  234.             M = 1048576;
  235.         var
  236.             f:integer;
  237.             s, dot:Str255;
  238.     begin
  239.         if (n < 1048576) & extra then begin
  240.             n := n*1024;
  241.             extra := false;
  242.         end;
  243.         if (n < K) then begin 
  244.             { extra is false }
  245.             NumToString(n,s);
  246.         end else begin
  247.             { n >= K }
  248.             f := ord(extra);
  249.             while n >= M do begin
  250.                 f := f + 1;
  251.                 n := n div K;
  252.             end;
  253.             { K <= n < M } { Display n/1024 GetIndStr(935,f+2) }
  254.             GetIndString(s, 935, f+2);
  255.             GetIndString(dot, 935, 1);
  256.             if n>=1024000 then begin
  257.                 n := n div 1024;
  258.                 s := concat(NumToStr(n),s);
  259.             end else if n>=102400 then begin
  260.                 n:= n*10 div 1024;
  261.                 s := concat(NumToStr(n div 10),dot,NN(n mod 10,1),s);
  262.             end else if n>=10240 then begin
  263.                 n:= n*100 div 1024;
  264.                 s := concat(NumToStr(n div 100),dot,NN(n mod 100,2),s);
  265.             end else begin
  266.                 n := n*1000 div 1024;
  267.                 s := concat(NumToStr(n div 1000),dot,NN(n mod 1000,3),s);
  268.             end;
  269.         end;
  270.         NumToK:=s;
  271.     end;
  272.     
  273.     function NumToStr (n: longint): Str15;
  274.         var
  275.             s: Str255;
  276.     begin
  277.         NumToString(n, s);
  278.         NumToStr := s;
  279.     end;
  280.  
  281.     function NN (n: longint; len: integer): Str15;
  282.         var
  283.             s: Str255;
  284.     begin
  285.         if len > 15 then begin
  286.             len := 15;
  287.         end;
  288.         NumToString(n, s);
  289.         while length(s) < len do begin
  290.             s := concat('0', s);
  291.         end;
  292.         NN := s;
  293.     end;
  294.  
  295.     function N2 (n: longint): Str15;
  296.     begin
  297.         N2 := NN(n, 2);
  298.     end;
  299.  
  300.     function HexN (n: longint): Char;
  301.     begin
  302.         n := BAND(n, $F);
  303.         if n >= 10 then begin
  304.             n := n + 7;
  305.         end;
  306.         n := n + 48;
  307.         HexN := Chr(n);
  308.     end;
  309.  
  310.     function HexN2 (n: longint): Str15;
  311.     begin
  312.         HexN2 := concat(HexN(BSR(n, 4)), HexN(n));
  313.     end;
  314.  
  315.     function HexNN (n: longint; len: integer): Str15;
  316.         var
  317.             s: Str15;
  318.     begin
  319.         if len > 15 then begin
  320.             len := 15;
  321.         end;
  322.         s := HexN(n);
  323.         while length(s) < len do begin
  324.             n := BAND(BSR(n, 4), $0FFFFFFF);
  325.             s :=concat(HexN(n), s);
  326.         end;
  327.         HexNN := s;
  328.     end;
  329.  
  330.     function HexToNum (s: Str15): longint;
  331.         var
  332.             n: longint;
  333.             i, v: integer;
  334.     begin
  335.         i := 1;
  336.         n := 0;
  337.         while (i <= length(s)) & (s[i] in ['A'..'Z', 'a'..'z', '0'..'9']) do begin
  338.             case s[i] of
  339.                 'A'..'Z': 
  340.                     v := ord(s[i]) - 55;
  341.                 'a'..'z': 
  342.                     v := ord(s[i]) - 87;
  343.                 '0'..'9': 
  344.                     v := ord(s[i]) - 48;
  345.             end;
  346.             n := BSL(n, 4) + v;
  347.             i := i + 1;
  348.         end;
  349.         HexToNum := n;
  350.     end;
  351.  
  352.     function StrToNum (s: Str255): longint;
  353.         var
  354.             n: longint;
  355.     begin
  356.         StringToNum(s, n);
  357.         StrToNum := n;
  358.     end;
  359.  
  360.     procedure DotDotDot (var s: Str255; var width: integer);
  361.         var
  362.             maxwidth, len: integer;
  363.     begin
  364.         maxwidth := width;
  365.         width := StringWidth(s);
  366.         if width > maxwidth then begin
  367.             width := width + CharWidth('…');
  368. {$PUSH}
  369. {$R-}
  370.             len := ord(s[0]);
  371.             while (len > 0) and (width > maxwidth) do begin
  372.                 width := width - CharWidth(s[len]);
  373.                 len := len - 1;
  374.             end;
  375.             len := len + 1;
  376.             s[0] := chr(len);
  377.             s[len] := '…';
  378. {$POP}
  379.         end;
  380.     end;
  381.  
  382.     procedure PlotSICN (typ:OSType; id, index, v, h: integer);
  383.         var
  384.             sh: Handle;
  385.             bm: BitMap;
  386.             r: Rect;
  387.             gp: grafptr;
  388.     begin
  389.         sh := GetResource(typ, id);
  390.         HLock(sh);
  391.         bm.baseAddr := Ptr(longint(sh^) + (index - 1) * 32);
  392.         bm.rowBytes := 2;
  393.         SetRect(r, h, v, h + 16, v + 16);
  394.         bm.bounds := r;
  395.         GetPort(gp);
  396.         CopyBits(bm, gp^.portBits, r, r, srcCopy, nil);
  397.         HUnlock(sh);
  398.         HPurge(sh);
  399.     end;
  400.  
  401.     function LookupStrh (id: integer; match: Str255): Str255;
  402.         var
  403.             t, s: Str255;
  404.             i: integer;
  405.     begin
  406.         t := '';
  407.         i := 1;
  408.         repeat
  409.             GetIndString(s, id, i);
  410.             if s = match then begin
  411.                 GetIndString(t, id, i + 1);
  412.                 leave;
  413.             end;
  414.             i := i + 2;
  415.         until s = '';
  416.         LookupStrh := t;
  417.     end;
  418.  
  419.     function LookupStrhNumber (id: integer; n: longint): Str255;
  420.         var
  421.             s, t: Str255;
  422.     begin
  423.         NumToString(n, s);
  424.         t := LookupStrh(id, s);
  425.         if t = '' then begin
  426.             t := s;
  427.         end;
  428.         LookupStrhNumber := t;
  429.     end;
  430.  
  431.     function DirtyKey (ch: char): boolean;
  432.     begin
  433.         DirtyKey := not (ord(ch) in [homeChar, endChar, helpChar, pageUpChar, pageDownChar, leftArrowChar, rightArrowChar, upArrowChar, downArrowChar]);
  434.     end;
  435.  
  436.     function SendCharToIsDialogEvent (var er: EventRecord; cs: charSet): boolean;
  437.         var
  438.             ch: char;
  439.     begin
  440.         SendCharToIsDialogEvent := true;
  441.         if ((er.what = keyDown) | (er.what = autoKey)) & (BAND(er.modifiers, cmdKey) = 0) then begin
  442.             ch := chr(BAND(er.message, $FF));
  443.             if not (ch in (cs + [tab, del, bs])) & DirtyKey(ch) then begin
  444.                 SendCharToIsDialogEvent := false;
  445.             end;
  446.         end;
  447.     end;
  448.  
  449.     function MyGetTrapAddress (trapword: integer): UniversalProcPtr;
  450.     begin
  451.         MyGetTrapAddress := UniversalProcPtr(NGetTrapAddress(trapword, TrapType(TPbtst(trapword, 11))));
  452.     end;
  453.  
  454.     procedure MySetTrapAddress (addr: UniversalProcPtr; trapword: integer);
  455.     begin
  456.         NSetTrapAddress(addr, trapword, TrapType(TPbtst(trapword, 11)));
  457.     end;
  458.  
  459.     procedure FixScrap;
  460.         var
  461.             scrap: ScrapStuffPtr;
  462.             junk, offset: longint;
  463.     begin
  464.         scrap := InfoScrap;
  465.         if scrap^.scrapHandle = nil then begin
  466.             scrap^.scrapState := -1;
  467.         end;
  468.         junk := GetScrap(nil, 'XXXX', offset);
  469.         junk := UnloadScrap;
  470.     end;
  471.  
  472.     procedure HaveResources;
  473.     begin
  474.         if Get1Resource('BNDL', 128) = nil then begin
  475.             SysBeep(1);
  476.             ExitToShell;
  477.         end;
  478.     end;
  479.  
  480. end.
  481.  
  482.     function MyFrontWindow: boolean;
  483.         var
  484.             wp: windowPtr;
  485.     begin
  486.         wp := FrontWindow;
  487.         if wp = nil then begin
  488.             MyFrontWindow := false;
  489.         end else begin
  490.             MyFrontWindow := windowPeek(wp)^.windowKind >= userKind;
  491.         end;
  492.     end;
  493.  
  494.     function DAFrontWindow: boolean;
  495.         var
  496.             wp: windowPtr;
  497.     begin
  498.         wp := FrontWindow;
  499.         if wp = nil then begin
  500.             DAFrontWindow := false;
  501.         end else begin
  502.             DAFrontWindow := windowPeek(wp)^.windowKind < 0;
  503.         end;
  504.     end;
  505.  
  506.     function GetIndStrSize (size, id, index: integer): Str255;
  507.         var
  508.             s: Str255;
  509.     begin
  510.         GetIndString(s, id, index);
  511.         GetIndStrSize := TPcopy(s, 1, size - 1);
  512.     end;
  513.  
  514.