home *** CD-ROM | disk | FTP | other *** search
/ Carousel Volume 2 #1 / carousel.iso / mactosh / da / clipmagi.sit / testmagic.p < prev   
Text File  |  1989-06-01  |  8KB  |  368 lines

  1. program main;
  2.     uses
  3.         UConvertor;
  4.     type
  5.         PLongint = ^Longint;
  6.         PResType = ^ResType;
  7.         EightChar = packed array[1..8] of char;
  8.     var
  9.         myList: ListHandle;
  10.         aString: str255;
  11.         i: integer;
  12.         appleMenu, fileMenu, editMenu: menuHandle;
  13.         quit: boolean;
  14.         theWindow: windowPtr;
  15.  
  16.     function GoExec (rInfoPtr: routineInfoPtr; pInfoPtr: parmInfoPtr; excAddr: Ptr): OSErr;
  17.     inline
  18.         $205F, $4e90;{ move.l (A7)+, A0;  jsr (A0)}
  19.  
  20.     procedure NumToHex (aLong: longint; var aEightChar: EightChar);
  21.         var
  22.             i, digit: integer;
  23.     begin
  24.         for i := 8 downto 3 do
  25.             begin
  26.                 digit := BAnd(aLong, 15);
  27.                 if digit < 10 then
  28.                     aEightChar[i] := chr(ord('0') + digit)
  29.                 else
  30.                     aEightChar[i] := chr(ord('A') + digit - 10);
  31.                 aLong := BSR(aLong, 4);
  32.             end;
  33.         aEightChar[1] := ' ';
  34.         aEightChar[2] := ' ';
  35.     end;
  36.  
  37.     procedure GetSelected (var theType: ResType; var theHandle: Handle);
  38.         var
  39.             curCell: point;
  40.             tempBuf: packed array[1..12] of char;
  41.             v, i: integer;
  42.             theValue: longint;
  43.             dataLen: integer;
  44.             aChar: char;
  45.     begin
  46.         theValue := 0;
  47.         setPt(curCell, 0, 0);
  48.         if LGetSelect(TRUE, curCell, myList) then
  49.             begin
  50.                 dataLen := 4;
  51.                 LGetCell(@theType, dataLen, curCell, myList);
  52.                 dataLen := 12;
  53.                 LGetCell(@tempBuf, dataLen, curCell, myList);
  54.                 for i := 1 to 6 do
  55.                     begin
  56.                         aChar := tempBuf[i + 6];
  57.                         if aChar > '9' then
  58.                             v := ord(aChar) - ord('A') + 10
  59.                         else
  60.                             v := ord(aChar) - ord('0');
  61.                         theValue := theValue * 16 + v;
  62.                     end;
  63.             end;
  64.         theHandle := Handle(theValue);
  65.     end;
  66.  
  67.     procedure CopySelected;
  68.         var
  69.             ahandle: Handle;
  70.             aType: ResType;
  71.             dummy: integer;
  72.     begin
  73.         GetSelected(aType, aHandle);
  74.         if aHandle <> nil then
  75.             begin
  76.                 dummy := ZeroScrap;
  77.                 HLock(aHandle);
  78.                 dummy := PutScrap(GetHandleSize(aHandle), aType, aHandle^);
  79.                 HUnLock(aHandle);
  80.             end;
  81.     end;
  82.  
  83.     procedure CutSelected;
  84.         var
  85.             curCell: point;
  86.             aHandle: Handle;
  87.             aType: ResType;
  88.     begin
  89.         setPt(curCell, 0, 0);
  90.         if LGetSelect(TRUE, curCell, myList) then
  91.             begin
  92.                 GetSelected(aType, aHandle);
  93.                 if aHandle <> nil then
  94.                     begin
  95.                         CopySelected;
  96.                         DisposHandle(aHandle);
  97.                     end;
  98.                 LDelRow(1, curCell.v, myList);
  99.             end;
  100.     end;
  101.  
  102.     procedure AddToList (theType: ResType; theHandle: Handle);
  103.         var
  104.             aEightChar: EightChar;
  105.             theCell: point;
  106.             theRow: integer;
  107.     begin
  108.         NumToHex(ord(theHandle), aEightChar);
  109.         theRow := LAddRow(1, myList^^.dataBounds.bottom, myList);
  110.         SetPt(theCell, 0, theRow);
  111.         LSetCell(@theType, 4, theCell, myList);
  112.         LAddToCell(@aEightChar, 8, theCell, myList);
  113.     end;
  114.  
  115.     procedure PasteScrap;
  116.         var
  117.             disp: longint;
  118.             theSize: longint;
  119.             dummy: longint;
  120.             theType: ResType;
  121.             scrapPtr: PScrapStuff;
  122.             err: OSErr;
  123.             aHandle: Handle;
  124.     begin
  125.         scrapPtr := InfoScrap;
  126.         with scrapPtr^ do
  127.             begin
  128.                 dummy := LoadScrap;
  129.                 disp := 0;
  130.                 while disp < scrapSize do
  131.                     begin
  132.                         theType := PResType(ord(scrapHandle^) + disp)^;
  133.                         disp := disp + 4;
  134.                         theSize := PLongint(ord(scrapHandle^) + disp)^;
  135.                         disp := disp + 4;
  136.                         HLock(scrapHandle);
  137.                         if PtrToHand(Ptr(ord(scrapHandle^) + disp), aHandle, theSize) = NoErr then
  138.                             AddToList(theType, aHandle);
  139.                         HUnLock(scrapHandle);
  140.                         disp := disp + theSize;
  141.                         if odd(disp) then
  142.                             disp := disp + 1;
  143.                     end;
  144.             end;
  145.     end;
  146.  
  147.     function CallByName (rtnRsrc: ResType; rtnName: str255; theParCount: integer; usingDefault: boolean; aParmPtr: parmInfoPtr): OSErr;
  148.         var
  149.             flag: SignedByte;
  150.             rtnInfo: routineInfo;
  151.             resHandle: handle;
  152.     begin
  153.         resHandle := Get1NamedResource(rtnRsrc, rtnName);
  154.         if resHandle <> nil then
  155.             begin
  156.                 if rtnRsrc = 'CNVT' then
  157.                     aParmPtr^.dstHandle := nil;
  158.                 GetResInfo(resHandle, rtnInfo.resID, rtnRsrc, rtnName);
  159.                 with rtnInfo do
  160.                     begin
  161.                         entryPoint := @CallByName;
  162.                         parmCount := theParCount;
  163.                         useDefault := usingDefault;
  164.                     end;
  165.                 MoveHHi(resHandle);
  166.                 flag := HGetState(resHandle);
  167.                 HLock(resHandle);
  168.                 CallByName := GoExec(@rtnInfo, aParmPtr, resHandle^);
  169.                 HSetState(resHandle, flag);
  170.             end
  171.         else
  172.             CallByName := ResError;
  173.     end;
  174.  
  175.     procedure DoSelected;
  176.         var
  177.             aRoutineInfo: routineInfo;
  178.             aParmInfo: parmInfo;
  179.             aType: ResType;
  180.             aHandle: Handle;
  181.             aPtr: Ptr;
  182.             dataLen: longint;
  183.             dataEnd: longint;
  184.     begin
  185.         GetSelected(aType, aHandle);
  186.         if (testType = '****') or (testType = '____') or (testType = aType) then
  187.             if (aHandle <> nil) or (testType = '____') then
  188.                 begin
  189.                     with aRoutineInfo do
  190.                         begin
  191.                             entryPoint := @CallByName;
  192.                             resID := testID;
  193.                             parmCount := 4;
  194.                             useDefault := true;
  195.                         end;
  196.                     with aParmInfo do
  197.                         begin
  198.                             srcType := aType;
  199.                             srcHandle := aHandle;
  200.                             dstHandle := nil;
  201.                         end;
  202.                     if xMain(@aRoutineInfo, @aParmInfo) = NoErr then
  203.                         if aParmInfo.dstHandle <> nil then
  204.                             with aParmInfo do
  205.                                 begin
  206.                                     if dstType <> 'scrp' then
  207.                                         AddToList(dstType, dstHandle)
  208.                                     else
  209.                                         begin
  210.                                             HLock(dstHandle);
  211.                                             aPtr := dstHandle^;
  212.                                             dataEnd := ord(aPtr) + GetHandleSize(dstHandle);
  213.                                             while ord(aPtr) < dataEnd do
  214.                                                 begin
  215.                                                     aType := PResType(aPtr)^;
  216.                                                     aPtr := Ptr(ord(aPtr) + 4);
  217.                                                     dataLen := PLongint(aPtr)^;
  218.                                                     aPtr := Ptr(ord(aPtr) + 4);
  219.                                                     if PtrToHand(aPtr, aHandle, dataLen) = NoErr then
  220.                                                         AddToList(aType, aHandle);
  221.                                                     if odd(dataLen) then
  222.                                                         dataLen := dataLen + 1;
  223.                                                     aPtr := Ptr(ord(aPtr) + dataLen);
  224.                                                 end;
  225.                                             HUnLock(dstHandle);
  226.                                             DisposHandle(dstHandle);
  227.                                         end;
  228.                                 end;
  229.                 end;
  230.     end;
  231.  
  232.     procedure Initalize;
  233.         var
  234.             aString: str255;
  235.             r, bounds: rect;
  236.             cSize: point;
  237.     begin
  238.         aString := ' ';
  239.         aString[1] := chr(appleMark);
  240.         appleMenu := NewMenu(1, aString);
  241.         AddResMenu(appleMenu, 'DRVR');
  242.         aString := 'File';
  243.         fileMenu := NewMenu(2, aString);
  244.         AppendMenu(fileMenu, 'Test/T;-;Quit/Q');
  245.         aString := 'Edit';
  246.         editMenu := NewMenu(3, aString);
  247.         AppendMenu(editMenu, 'Cut/X;Copy/C;Paste/V');
  248.         InsertMenu(appleMenu, 0);
  249.         InsertMenu(fileMenu, 0);
  250.         InsertMenu(editMenu, 0);
  251.         DrawMenuBar;
  252.         quit := false;
  253.         InitCursor;
  254.         SetRect(r, 20, 50, 140, 180);
  255.         theWindow := NewWindow(nil, r, '', true, 2, Pointer(-1), false, 0);
  256.         SetPort(theWindow);
  257.         OffsetRect(r, -20, -50);
  258.         InsetRect(r, 1, 1);
  259.         r.right := r.right - 15;
  260.         SetRect(bounds, 0, 0, 1, 0);
  261.         SetPt(cSize, r.right - r.left, 16);
  262.         myList := LNew(r, bounds, cSize, 0, theWindow, true, false, false, true);
  263.         with myList^^ do
  264.             begin
  265.                 selFlags := lOnlyOne;
  266.                 listFlags := lDoVAutoScroll;
  267.             end;
  268.         PasteScrap;
  269.     end;
  270.  
  271.     procedure DoMenu (result: longint);
  272.         var
  273.             menu, item: integer;
  274.     begin
  275.         menu := HiWord(result);
  276.         item := LoWord(result);
  277.         case menu of
  278.             1: 
  279.                 begin
  280.                     GetItem(appleMenu, item, aString);
  281.                     i := OpenDeskAcc(aString);
  282.                 end;
  283.             2: 
  284.                 begin
  285.                     case item of
  286.                         1: 
  287.                             DoSelected;
  288.                         3: 
  289.                             quit := true;
  290.                     end;
  291.                 end;
  292.             3: 
  293.                 begin
  294.                     case item of
  295.                         1: 
  296.                             CutSelected;
  297.                         2: 
  298.                             CopySelected;
  299.                         3: 
  300.                             PasteScrap;
  301.                     end
  302.                 end;
  303.         end;
  304.         HiliteMenu(0);
  305.     end;
  306.  
  307.     procedure MainEventLoop;
  308.         var
  309.             event: EventRecord;
  310.             aWindow: windowPtr;
  311.             locPt: point;
  312.             part: integer;
  313.             i: integer;
  314.     begin
  315.         SystemTask;
  316.         if GetNextEvent(everyEvent, event) then
  317.             ;
  318.         case event.what of
  319.             activateEvt: 
  320.                 if WindowPtr(event.message) = theWindow then
  321.                     begin
  322.                         LActivate(odd(event.modifiers), myList);
  323.                     end;
  324.  
  325.             mouseDown: 
  326.                 begin
  327.                     part := FindWindow(event.where, aWIndow);
  328.                     case part of
  329.                         inDesk: 
  330.                             ;
  331.                         inSysWindow: 
  332.                             SystemClick(event, aWindow);
  333.                         inMenuBar: 
  334.                             begin
  335.                                 DoMenu(MenuSelect(event.where));
  336.                             end;
  337.                         inContent: 
  338.                             if FrontWindow <> theWindow then
  339.                                 SelectWindow(theWindow)
  340.                             else
  341.                                 begin
  342.                                     locPt := event.where;
  343.                                     GlobalToLocal(locPt);
  344.                                     if LClick(locPt, event.modifiers, myList) then
  345.                                         DoSelected;
  346.                                 end;
  347.                     end;
  348.                 end;
  349.  
  350.             keyDown: 
  351.                 if BitAnd(event.modifiers, CmdKey) <> 0 then
  352.                     DoMenu(MenuKey(Chr(BitAnd(event.message, CharCodeMask))));
  353.  
  354.             updateEvt: 
  355.                 begin
  356.                     BeginUpdate(theWindow);
  357.                     LUpdate(theWindow^.VisRgn, myList);
  358.                     EndUpdate(theWindow);
  359.                 end;
  360.         end;
  361.     end;
  362. begin
  363.     Initalize;
  364.     repeat
  365.         MainEventLoop;
  366.     until quit;
  367.     LDispose(myList);
  368. end.