Subversion Repositories decoder

Rev

Blame | Last modification | View Log | RSS feed

  1. unit DropURLTarget;
  2.  
  3. // -----------------------------------------------------------------------------
  4. // Project:         Drag and Drop Component Suite
  5. // Component Names: TDropURLTarget
  6. // Module:          DropURLTarget
  7. // Description:     Implements Dragging & Dropping of URLs
  8. //                  TO your application from another.
  9. // Version:         3.7
  10. // Date:            22-APR-1999
  11. // Target:          Win32, Delphi 3 - Delphi 5, C++ Builder 3, C++ Builder 4
  12. // Authors:         Angus Johnson,   ajohnson@rpi.net.au
  13. //                  Anders Melander, anders@melander.dk
  14. //                                   http://www.melander.dk
  15. // Copyright        © 1997-99 Angus Johnson & Anders Melander
  16. // -----------------------------------------------------------------------------
  17.  
  18. interface
  19.  
  20. uses
  21.   DropSource, DropTarget,
  22.   Classes, ActiveX;
  23.  
  24. {$include DragDrop.inc}
  25.  
  26. type
  27.   TDropURLTarget = class(TDropTarget)
  28.   private
  29.     URLFormatEtc,
  30.     FileContentsFormatEtc,
  31.     FGDFormatEtc: TFormatEtc;
  32.     fURL: String;
  33.     fTitle: String;
  34.   protected
  35.     procedure ClearData; override;
  36.     function DoGetData: boolean; override;
  37.     function HasValidFormats: boolean; override;
  38.   public
  39.     constructor Create(AOwner: TComponent); override;
  40.     property URL: String Read fURL Write fURL;
  41.     property Title: String Read fTitle Write fTitle;
  42.   end;
  43.  
  44. procedure Register;
  45.  
  46. implementation
  47.  
  48. uses
  49.   Windows,
  50.   SysUtils,
  51.   ShlObj;
  52.  
  53. procedure Register;
  54. begin
  55.   RegisterComponents('DragDrop', [TDropURLTarget]);
  56. end;
  57. // -----------------------------------------------------------------------------
  58.  
  59. function GetURLFromFile(const Filename: string; var URL: string): boolean;
  60. var
  61.   URLfile               : TStringList;
  62.   i                     : integer;
  63.   s                     : string;
  64.   p                     : PChar;
  65. begin
  66.   Result := False;
  67.   URLfile := TStringList.Create;
  68.   try
  69.     URLFile.LoadFromFile(Filename);
  70.     i := 0;
  71.     while (i < URLFile.Count-1) do
  72.     begin
  73.       if (CompareText(URLFile[i], '[InternetShortcut]') = 0) then
  74.       begin
  75.         inc(i);
  76.         while (i < URLFile.Count) do
  77.         begin
  78.           s := URLFile[i];
  79.           p := PChar(s);
  80.           if (StrLIComp(p, 'URL=', length('URL=')) = 0) then
  81.           begin
  82.             inc(p, length('URL='));
  83.             URL := p;
  84.             Result := True;
  85.             exit;
  86.           end else
  87.             if (p^ = '[') then
  88.               exit;
  89.           inc(i);
  90.         end;
  91.       end;
  92.       inc(i);
  93.     end;
  94.   finally
  95.     URLFile.Free;
  96.   end;
  97. end;
  98.  
  99. // -----------------------------------------------------------------------------
  100. //                      TDropURLTarget
  101. // -----------------------------------------------------------------------------
  102.  
  103. constructor TDropURLTarget.Create(AOwner: TComponent);
  104. begin
  105.   inherited Create(AOwner);
  106.   DragTypes := [dtLink]; //Only allow links.
  107.   GetDataOnEnter := true;
  108.   with URLFormatEtc do
  109.   begin
  110.     cfFormat := CF_URL;
  111.     ptd := nil;
  112.     dwAspect := DVASPECT_CONTENT;
  113.     lindex := -1;
  114.     tymed := TYMED_HGLOBAL;
  115.   end;
  116.   with FileContentsFormatEtc do
  117.   begin
  118.     cfFormat := CF_FILECONTENTS;
  119.     ptd := nil;
  120.     dwAspect := DVASPECT_CONTENT;
  121.     lindex := 0;
  122.     tymed := TYMED_HGLOBAL;
  123.   end;
  124.   with FGDFormatEtc do
  125.   begin
  126.     cfFormat := CF_FILEGROUPDESCRIPTOR;
  127.     ptd := nil;
  128.     dwAspect := DVASPECT_CONTENT;
  129.     lindex := -1;
  130.     tymed := TYMED_HGLOBAL;
  131.   end;
  132. end;
  133. // -----------------------------------------------------------------------------
  134.  
  135. //This demonstrates how to enumerate all DataObject formats.
  136. function TDropURLTarget.HasValidFormats: boolean;
  137. var
  138.   GetNum, GotNum: longint;
  139.   FormatEnumerator: IEnumFormatEtc;
  140.   tmpFormatEtc: TformatEtc;
  141. begin
  142.   result := false;
  143.   //Enumerate available DataObject formats
  144.   //to see if any one of the wanted formats is available...
  145.   if (DataObject.EnumFormatEtc(DATADIR_GET,FormatEnumerator) <> S_OK) or
  146.      (FormatEnumerator.Reset <> S_OK) then
  147.     exit;
  148.   GetNum := 1; //get one at a time...
  149.   while (FormatEnumerator.Next(GetNum, tmpFormatEtc, @GotNum) = S_OK) and
  150.         (GetNum = GotNum) do
  151.     with tmpFormatEtc do
  152.       if (ptd = nil) and (dwAspect = DVASPECT_CONTENT) and
  153.          {(lindex <> -1) or} (tymed and TYMED_HGLOBAL <> 0) and
  154.          ((cfFormat = CF_URL) or (cfFormat = CF_FILECONTENTS) or
  155.          (cfFormat = CF_HDROP) or (cfFormat = CF_TEXT)) then
  156.       begin
  157.         result := true;
  158.         break;
  159.       end;
  160. end;
  161. // -----------------------------------------------------------------------------
  162.  
  163. procedure TDropURLTarget.ClearData;
  164. begin
  165.   fURL := '';
  166. end;
  167. // -----------------------------------------------------------------------------
  168.  
  169. function TDropURLTarget.DoGetData: boolean;
  170. var
  171.   medium: TStgMedium;
  172.   cText: pchar;
  173.   tmpFiles: TStringList;
  174.   pFGD: PFileGroupDescriptor;
  175. begin
  176.   fURL := '';
  177.   fTitle := '';
  178.   result := false;
  179.   //--------------------------------------------------------------------------
  180.   if (DataObject.GetData(URLFormatEtc, medium) = S_OK) then
  181.   begin
  182.     try
  183.       if (medium.tymed <> TYMED_HGLOBAL) then
  184.         exit;
  185.       cText := PChar(GlobalLock(medium.HGlobal));
  186.       fURL := cText;
  187.       GlobalUnlock(medium.HGlobal);
  188.       result := true;
  189.     finally
  190.       ReleaseStgMedium(medium);
  191.     end;
  192.   end
  193.   //--------------------------------------------------------------------------
  194.   else if (DataObject.GetData(TextFormatEtc, medium) = S_OK) then
  195.   begin
  196.     try
  197.       if (medium.tymed <> TYMED_HGLOBAL) then
  198.         exit;
  199.       cText := PChar(GlobalLock(medium.HGlobal));
  200.       fURL := cText;
  201.       GlobalUnlock(medium.HGlobal);
  202.       result := true;
  203.     finally
  204.       ReleaseStgMedium(medium);
  205.     end;
  206.   end
  207.   //--------------------------------------------------------------------------
  208.   else if (DataObject.GetData(FileContentsFormatEtc, medium) = S_OK) then
  209.   begin
  210.     try
  211.       if (medium.tymed <> TYMED_HGLOBAL) then
  212.         exit;
  213.       cText := PChar(GlobalLock(medium.HGlobal));
  214.       fURL := cText;
  215.       fURL := copy(fURL,24,250);
  216.       GlobalUnlock(medium.HGlobal);
  217.       result := true;
  218.     finally
  219.       ReleaseStgMedium(medium);
  220.     end;
  221.   end
  222.   //--------------------------------------------------------------------------
  223.   else if (DataObject.GetData(HDropFormatEtc, medium) = S_OK) then
  224.   begin
  225.     try
  226.       if (medium.tymed <> TYMED_HGLOBAL) then exit;
  227.       tmpFiles := TStringList.create;
  228.       try
  229.         if GetFilesFromHGlobal(medium.HGlobal,TStrings(tmpFiles)) and
  230.           (lowercase(ExtractFileExt(tmpFiles[0])) = '.url') and
  231.              GetURLFromFile(tmpFiles[0], fURL) then
  232.         begin
  233.             fTitle := extractfilename(tmpFiles[0]);
  234.             delete(fTitle,length(fTitle)-3,4); //deletes '.url' extension
  235.             result := true;
  236.         end;
  237.       finally
  238.         tmpFiles.free;
  239.       end;
  240.     finally
  241.       ReleaseStgMedium(medium);
  242.     end;
  243.   end;
  244.  
  245.   if (DataObject.GetData(FGDFormatEtc, medium) = S_OK) then
  246.   begin
  247.     try
  248.       if (medium.tymed <> TYMED_HGLOBAL) then exit;
  249.       pFGD := pointer(GlobalLock(medium.HGlobal));
  250.       fTitle := pFGD^.fgd[0].cFileName;
  251.       GlobalUnlock(medium.HGlobal);
  252.       delete(fTitle,length(fTitle)-3,4); //deletes '.url' extension
  253.     finally
  254.       ReleaseStgMedium(medium);
  255.     end;
  256.   end
  257.   else if fTitle = '' then fTitle := fURL;
  258. end;
  259. // -----------------------------------------------------------------------------
  260. // -----------------------------------------------------------------------------
  261.  
  262. end.
  263.