home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyDrag.p < prev    next >
Encoding:
Text File  |  1996-10-10  |  5.7 KB  |  198 lines  |  [TEXT/CWIE]

  1. unit MyDrag;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types, Drag, Files, Events, TextEdit;
  7.  
  8.     function GetDropLocationDirectory( dragref: DragReference; var dropFS: FSSpec ): OSErr;
  9.     function DragText( const er: EventRecord; localwhere: Point; te: TEHandle; handletrash: Boolean; var wasdragged, wastrashed: Boolean): OSErr;
  10.     function DragTargetWasTrash( dragref: DragReference ): Boolean;
  11.     function IsDragTypeAvailable ( dragref: DragReference; thetype: FlavorType ): boolean;
  12.     function GetFlavorDataHandle ( dragref: DragReference; theitem: ItemReference; thetype: FlavorType; var data: Handle ): OSErr;
  13.     function GetTextDragData( dragref: DragReference; data: Handle ): OSErr;
  14.  
  15. implementation
  16.  
  17.     uses
  18.         Aliases, Folders, AppleEvents, Errors, Quickdraw, Memory, 
  19.         MyTypes, MyAEUtils, MyTextEdit, MyUtils, MyFileSystemUtils, MyRegions, MyMemory, MyLowLevel;
  20.         
  21.     function GetDropLocationDirectory( dragref: DragReference; var dropFS: FSSpec ): OSErr;
  22.         var
  23.             err: OSErr;
  24.             dropLocation: AEDesc;
  25.             isfolder, wasalias: Boolean;
  26.             pb: CInfoPBRec;
  27.     begin
  28.         AECreate(dropLocation);
  29.         err := GetDropLocation(dragref, dropLocation);
  30.         if (err = noErr) or (err=userCanceledErr) then begin { userCanceledErr hack to deal with aliases in the finder }
  31.             err := GetFSSpecFromAEDesc(dropLocation, dropFS);
  32.         end;
  33.         AEDestroy(dropLocation);
  34.         if (err = noErr) & (dropFS.name <> '') then begin
  35.             err := ResolveAliasFile(dropFS, true, isfolder, wasalias);
  36.             err := FSpGetCatInfo(dropFS, pb);
  37.             dropFS.vRefNum := pb.ioVRefNum;
  38.             dropFS.parID := pb.ioDirID;
  39.             dropFS.name := '';
  40.             if (err = noErr) & (BAND(pb.ioFlAttrib, $10) = 0) then begin
  41.                 err := fnfErr;
  42.             end;
  43.         end;
  44.         GetDropLocationDirectory := err;
  45.     end;
  46.     
  47.     function DragTargetWasTrash( dragref: DragReference ): Boolean;
  48.         var
  49.             err: OSErr;
  50.             dropFS: FSSpec;
  51.             junk_vrn: integer;
  52.             trashDirID: longint;
  53.     begin
  54.         DragTargetWasTrash := false;
  55.         err := GetDropLocationDirectory( dragref, dropFS );
  56.         if err = noErr then begin
  57.             err := FindFolder( dropFS.vRefNum, kTrashFolderType, false, junk_vrn, trashDirID );
  58.         end;
  59.         if (err = noErr) & (dropFS.parID = trashDirID) then begin
  60.             DragTargetWasTrash := true;
  61.         end;
  62.     end;
  63.  
  64.     function DragText( const er: EventRecord; localwhere: Point; te: TEHandle; handletrash: Boolean; var wasdragged, wastrashed: Boolean): OSErr;
  65.         var
  66.             err, junk: OSErr;
  67.             dragref: DragReference;
  68.             dragrgn: RgnHandle;
  69.             state: SignedByte;
  70.     begin
  71.         err := noErr;
  72.         wasdragged := false;
  73.         wastrashed := false;
  74.         if PtInTEHiliteRgn( localwhere, te ) & WaitMouseMoved( er.where ) then begin
  75.             wasdragged := true;
  76.             
  77.             err := NewDrag( dragref );
  78.             if err = noErr then begin
  79.                 dragrgn := NewRgn;
  80.                 state := HGetState( te^^.hText );
  81.                 HLock( te^^.hText );
  82.                 err := AddDragItemFlavor( dragref, 1, 'TEXT', AddPtrLong( te^^.hText^, te^^.selStart ), te^^.selEnd - te^^.selStart, 0 );
  83.                 HSetState( te^^.hText, state );
  84.                 if err = noErr then begin
  85.                     err := TEGetHiliteRgn( dragrgn, te );
  86.                 end;
  87.                 if err = noErr then begin
  88.                     LocalToGlobalRegion( dragrgn );
  89.                     OutlineRegion( dragrgn );
  90.                     err := TrackDrag( dragref, er, dragrgn );
  91.                     if err = userCanceledErr then begin
  92.                         err := noErr;
  93.                     end;
  94.                 end;
  95.                 if err = noErr then begin
  96.                     wastrashed := DragTargetWasTrash( dragref );
  97.                     if handletrash & wastrashed then begin
  98.                         TEDelete( te );
  99.                     end;
  100.                 end;
  101.                 DisposeRgn( dragrgn );
  102.                 junk := DisposeDrag( dragref );
  103.             end;
  104.         end;
  105.         DragText := err;
  106.     end;
  107.  
  108.     function IsDragTypeAvailable ( dragref: DragReference; thetype: FlavorType ): boolean;
  109.         var
  110.             items, index: integer;
  111.             flags: FlavorFlags;
  112.             theitem: ItemReference;
  113.             err: OSErr;
  114.     begin
  115.         err := CountDragItems( dragref, items );
  116.         if err = noErr then begin
  117.             err := errAENoUserSelection;
  118.             for index := 1 to items do begin
  119.                 err := GetDragItemReferenceNumber( dragref, index, theitem );
  120.                 if err = noErr then begin
  121.                     err := GetFlavorFlags( dragref, theitem, thetype, flags );
  122.                 end;
  123.                 if err <> noErr then begin
  124.                     leave;
  125.                 end;
  126.             end;
  127.         end;
  128.         IsDragTypeAvailable := err = noErr;
  129.     end;
  130.  
  131.  
  132.     function GetFlavorDataHandle ( dragref: DragReference; theitem: ItemReference; thetype: FlavorType; var data: Handle ): OSErr;
  133.         var
  134.             err: OSErr;
  135.             len: Size;
  136.     begin
  137.         data := nil;
  138.         err := GetFlavorDataSize( dragref, theitem, thetype, len );
  139.         if err = noErr then begin
  140.             err := MNewHandle( data, len );
  141.         end;
  142.         if err = noErr then begin
  143.             HLock( data );
  144.             err := GetFlavorData( dragref, theitem, thetype, data^, len, 0 );
  145.             HUnlock( data );
  146.         end;
  147.         if err <> noErr then begin
  148.             MDisposeHandle( data );
  149.         end;
  150.         GetFlavorDataHandle := err;
  151.     end;
  152.     
  153.     function MergeTextHandles( data1, data2: Handle ): OSErr;
  154.         var
  155.             err: OSErr;
  156.             len1, len2: longint;
  157.     begin
  158.         len1 := GetHandleSize( data1 );
  159.         if len1 = 0 then begin
  160.             err := HandAndHand( data2, data1 );
  161.         end else begin
  162.             len2 := GetHandleSize( data2 );
  163.             err := MSetHandleSize( data1, len1 + 1 + len2 );
  164.             if err = noErr then begin
  165.                 AddPtrLong( data1^, len1 )^ := ord(spc);
  166.                 BlockMoveData( data2^, AddPtrLong( data1^, len1 + 1 ), len2 );
  167.             end;
  168.         end;
  169.         MergeTextHandles := err;
  170.     end;
  171.  
  172.     function GetTextDragData( dragref: DragReference; data: Handle ): OSErr;
  173.         var
  174.             err: OSErr;
  175.             i, items: integer;
  176.             theitem: ItemReference;
  177.             thedata: Handle;
  178.     begin
  179.         SetHandleSize( data, 0 );
  180.         err := CountDragItems( dragref, items );
  181.         if err = noErr then begin
  182.             for i := 1 to items do begin
  183.                 thedata := nil;
  184.                 err := GetDragItemReferenceNumber( dragref, i, theitem );
  185.                 if err = noErr then begin
  186.                     err := GetFlavorDataHandle( dragref, theitem, 'TEXT', thedata );
  187.                 end;
  188.                 if err = noErr then begin
  189.                     err := MergeTextHandles( data, thedata );
  190.                 end;
  191.                 MDisposeHandle( thedata );
  192.             end;
  193.         end;
  194.         GetTextDragData := err;
  195.     end;
  196.  
  197. end.
  198.