Subversion Repositories decoder

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 daniel-mar 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.