25
Classes, SysUtils, LCLProc, Graphics, Controls, Dialogs,
26
IpHtml, IDEHelpIntf, LazHelpIntf;
25
Classes, SysUtils, LCLProc, Forms, Graphics, Controls, Dialogs, ExtCtrls, Menus,
26
IpMsg, Ipfilebroker, IpHtml, IDEHelpIntf, LazHelpIntf, LazIDEIntf;
29
TSimpleIpHtml = class(TIpHtml)
29
TLazIPHtmlControl = class;
31
{ TLazIpHtmlDataProvider }
33
TLazIpHtmlDataProvider = class(TIpHtmlDataProvider)
35
FControl: TLazIPHtmlControl;
37
function DoGetStream(const URL: string): TStream; override;
39
property Control: TLazIPHtmlControl read FControl;
36
TIPLazHtmlControl = class(TIpHtmlPanel,TIDEHTMLControlIntf)
44
TLazIPHtmlControl = class(TCustomPanel,TIDEHTMLControlIntf)
45
function DataProviderCanHandle(Sender: TObject; const {%H-}URL: string): Boolean;
46
procedure DataProviderCheckURL(Sender: TObject; const {%H-}URL: string;
47
var Available: Boolean; var ContentType: string);
48
procedure DataProviderGetHtml(Sender: TObject; const {%H-}URL: string;
49
const {%H-}aPostData: TIpFormDataEntity; var Stream: TStream);
50
procedure DataProviderGetImage(Sender: TIpHtmlNode; const URL: string;
51
var Picture: TPicture);
52
procedure DataProviderLeave(Sender: TIpHtml);
53
procedure DataProviderReportReference(Sender: TObject; const {%H-}URL: string);
54
procedure IPHTMLPanelHotClick(Sender: TObject);
38
FProvider: TAbstractIDEHTMLProvider;
56
FIDEProvider: TAbstractIDEHTMLProvider;
57
FIPHTMLPanel: TIpHtmlPanel;
40
procedure SetProvider(const AValue: TAbstractIDEHTMLProvider);
41
procedure HTMLGetImageX(Sender: TIpHtmlNode; const URL: string;
42
var Picture: TPicture);
59
procedure SetIDEProvider(const AValue: TAbstractIDEHTMLProvider);
61
procedure Notification(AComponent: TComponent; Operation: TOperation);
44
64
constructor Create(AOwner: TComponent); override;
65
destructor Destroy; override;
45
66
function GetURL: string;
46
67
procedure SetURL(const AValue: string);
47
property Provider: TAbstractIDEHTMLProvider read FProvider write SetProvider;
48
procedure SetHTMLContent(Stream: TStream);
68
property IDEProvider: TAbstractIDEHTMLProvider read FIDEProvider write SetIDEProvider;
69
procedure SetHTMLContent(Stream: TStream; const NewURL: string);
49
70
procedure GetPreferredControlSize(out AWidth, AHeight: integer);
71
property IPHTMLPanel: TIpHtmlPanel read FIPHTMLPanel;
74
{ TLazIPHtmlControlClipboardPopup }
76
TLazIPHtmlControlClipboardPopup = class(TPopupMenu)
78
FCopy, FSelectAll: TMenuItem;
79
FPanel: TLazIPHtmlControl;
80
procedure DoCopy(Sender: TObject);
81
procedure DoSelectAll(Sender: TObject);
83
procedure DoPopup(Sender: TObject); override;
85
constructor Create(AOwner: TComponent; APanel: TLazIPHtmlControl); reintroduce;
52
88
function IPCreateLazIDEHTMLControl(Owner: TComponent;
53
var Provider: TAbstractIDEHTMLProvider): TControl;
89
var Provider: TAbstractIDEHTMLProvider;
90
{%H-}Flags: TIDEHTMLControlFlags = []): TControl;
55
92
procedure Register;
98
ipdSelectAll = 'Select &all';
59
100
procedure Register;
61
102
CreateIDEHTMLControl:=@IPCreateLazIDEHTMLControl;
64
105
function IPCreateLazIDEHTMLControl(Owner: TComponent;
65
var Provider: TAbstractIDEHTMLProvider): TControl;
106
var Provider: TAbstractIDEHTMLProvider;
107
Flags: TIDEHTMLControlFlags = []): TControl;
67
HTMLControl: TIPLazHtmlControl;
109
HTMLControl: TLazIPHtmlControl;
69
HTMLControl:=TIPLazHtmlControl.Create(Owner);
111
//debugln(['IPCreateLazIDEHTMLControl ']);
112
HTMLControl:=TLazIPHtmlControl.Create(Owner);
70
113
Result:=HTMLControl;
71
114
if Provider=nil then
72
115
Provider:=CreateIDEHTMLProvider(HTMLControl);
73
Provider.ControlIntf:=HTMLControl;
74
HTMLControl.Provider:=Provider;
79
procedure TIPLazHtmlControl.SetProvider(const AValue: TAbstractIDEHTMLProvider
82
if FProvider=AValue then exit;
86
procedure TIPLazHtmlControl.HTMLGetImageX(Sender: TIpHtmlNode;
116
//debugln(['IPCreateLazIDEHTMLControl Provider=',DbgSName(Provider)]);
117
HTMLControl.IDEProvider:=Provider;
119
if ihcWithClipboardMenu in Flags then
120
TLazIPHtmlControlClipboardPopup.Create(Owner, HTMLControl);
123
{ TLazIPHtmlControlClipboardPopup }
125
procedure TLazIPHtmlControlClipboardPopup.DoCopy(Sender: TObject);
127
if FPanel.IPHTMLPanel <> nil then
128
FPanel.IPHTMLPanel.CopyToClipboard;
131
procedure TLazIPHtmlControlClipboardPopup.DoSelectAll(Sender: TObject);
133
if FPanel.IPHTMLPanel <> nil then
134
FPanel.IPHTMLPanel.SelectAll;
137
procedure TLazIPHtmlControlClipboardPopup.DoPopup(Sender: TObject);
139
if FPanel.IPHTMLPanel <> nil then
140
FCopy.Enabled := FPanel.IPHTMLPanel.HaveSelection;
141
inherited DoPopup(Sender);
144
constructor TLazIPHtmlControlClipboardPopup.Create(AOwner: TComponent;
145
APanel: TLazIPHtmlControl);
147
inherited Create(AOwner);
151
FCopy := TMenuItem.Create(Owner);
152
FCopy.Caption := ipdCopy;
153
FCopy.ShortCut := ShortCut(ord('C'), [ssCtrl]);
154
FCopy.OnClick := @DoCopy;
157
FSelectAll := TMenuItem.Create(Owner);
158
FSelectAll.Caption := ipdSelectAll;
159
FSelectAll.ShortCut := ShortCut(ord('A'), [ssCtrl]);
160
FSelectAll.OnClick := @DoSelectAll;
161
Items.Add(FSelectAll);
163
TControl(Owner).PopupMenu := Self;
166
{ TLazIpHtmlDataProvider }
168
function TLazIpHtmlDataProvider.DoGetStream(const URL: string): TStream;
170
//debugln(['TLazIpHtmlDataProvider.DoGetStream ',URL,' ',DbgSName(Control.IDEProvider)]);
171
Result:=Control.IDEProvider.GetStream(URL,false);
174
{ TLazIPHtmlControl }
176
function TLazIPHtmlControl.DataProviderCanHandle(Sender: TObject;
177
const URL: string): Boolean;
179
//debugln(['TLazIPHtmlControl.DataProviderCanHandle URL=',URL]);
183
procedure TLazIPHtmlControl.DataProviderCheckURL(Sender: TObject;
184
const URL: string; var Available: Boolean; var ContentType: string);
186
//debugln(['TLazIPHtmlControl.DataProviderCheckURL URL=',URL]);
191
procedure TLazIPHtmlControl.DataProviderGetHtml(Sender: TObject;
192
const URL: string; const aPostData: TIpFormDataEntity; var Stream: TStream);
194
//debugln(['TLazIPHtmlControl.DataProviderGetHtml URL=',URL]);
198
procedure TLazIPHtmlControl.DataProviderGetImage(Sender: TIpHtmlNode;
87
199
const URL: string; var Picture: TPicture);
131
constructor TIPLazHtmlControl.Create(AOwner: TComponent);
243
procedure TLazIPHtmlControl.DataProviderLeave(Sender: TIpHtml);
245
//debugln(['TLazIPHtmlControl.DataProviderLeave ']);
248
procedure TLazIPHtmlControl.DataProviderReportReference(Sender: TObject;
251
//debugln(['TLazIPHtmlControl.DataProviderReportReference URL=',URL]);
254
procedure TLazIPHtmlControl.IPHTMLPanelHotClick(Sender: TObject);
256
HotNode: TIpHtmlNode;
260
HotNode:=FIPHTMLPanel.HotNode;
261
if HotNode is TIpHtmlNodeA then begin
262
HRef := TIpHtmlNodeA(HotNode).HRef;
263
//Target := TIpHtmlNodeA(HotNode).Target;
265
HRef := TIpHtmlNodeAREA(HotNode).HRef;
266
//Target := TIpHtmlNodeAREA(HotNode).Target;
268
//debugln(['TLazIPHtmlControl.IPHTMLPanelHotClick HRef="',HRef,'" Target="',Target,'"']);
269
IDEProvider.OpenURLAsync(HRef);
272
procedure TLazIPHtmlControl.SetIDEProvider(
273
const AValue: TAbstractIDEHTMLProvider);
275
if FIDEProvider=AValue then exit;
276
//debugln(['TLazIPHtmlControl.SetIDEProvider Old=',DbgSName(FIDEProvider),' New=',DbgSName(FIDEProvider)]);
277
if FIDEProvider<>nil then begin
278
IDEProvider.ControlIntf:=nil;
280
FIDEProvider:=AValue;
281
if FIDEProvider<>nil then begin
282
FreeNotification(FIDEProvider);
283
IDEProvider.ControlIntf:=Self;
287
procedure TLazIPHtmlControl.Notification(AComponent: TComponent;
288
Operation: TOperation);
290
inherited Notification(AComponent, Operation);
291
if Operation=opRemove then begin
292
if IDEProvider=AComponent then begin
293
if IDEProvider.ControlIntf=TIDEHTMLControlIntf(Self) then
294
IDEProvider.ControlIntf:=nil;
300
constructor TLazIPHtmlControl.Create(AOwner: TComponent);
133
302
inherited Create(AOwner);
134
DefaultFontSize := 8;
139
function TIPLazHtmlControl.GetURL: string;
303
FIPHTMLPanel:=TIpHtmlPanel.Create(Self);
304
with FIPHTMLPanel do begin
305
Name:='TLazIPHtmlControl_IPHTMLPanel';
312
OnHotClick:=@IPHTMLPanelHotClick;
314
FIPHTMLPanel.DataProvider:=TLazIpHtmlDataProvider.Create(FIPHTMLPanel);
315
with TLazIpHtmlDataProvider(FIPHTMLPanel.DataProvider) do begin
317
Name:='TLazIPHtmlControl_DataProvider';
318
OnCanHandle:=@DataProviderCanHandle;
319
OnGetHtml:=@DataProviderGetHtml;
320
OnGetImage:=@DataProviderGetImage;
321
OnLeave:=@DataProviderLeave;
322
OnCheckURL:=@DataProviderCheckURL;
323
OnReportReference:=@DataProviderReportReference;
326
BevelInner:=bvLowered;
329
destructor TLazIPHtmlControl.Destroy;
331
//debugln(['TLazIPHtmlControl.Destroy ',DbgSName(Self),' ',dbgs(Pointer(Self))]);
332
FreeAndNil(FIDEProvider);
336
function TLazIPHtmlControl.GetURL: string;
144
procedure TIPLazHtmlControl.SetURL(const AValue: string);
341
procedure TLazIPHtmlControl.SetURL(const AValue: string);
147
NewHTML: TSimpleIpHtml;
151
if Provider=nil then raise Exception.Create('TIPLazHtmlControl.SetURL missing Provider');
347
if IDEProvider=nil then raise Exception.Create('TIPLazHtmlControl.SetURL missing Provider');
152
348
if FURL=AValue then exit;
153
NewURL:=Provider.BuildURL(Provider.BaseURL,AValue);
349
NewURL:=IDEProvider.MakeURLAbsolute(IDEProvider.BaseURL,AValue);
154
350
if FURL=NewURL then exit;
157
Stream:=Provider.GetStream(FURL);
353
Stream:=IDEProvider.GetStream(FURL,true);
161
NewHTML:=TSimpleIpHtml.Create; // Beware: Will be freed automatically TIpHtmlPanel
162
NewHTML.OnGetImageX:=@HTMLGetImageX;
355
NewHTML:=TIpHtml.Create; // Beware: Will be freed automatically TIpHtmlPanel
356
FIPHTMLPanel.SetHtml(NewHTML);
163
357
NewHTML.LoadFromStream(Stream);
166
if not ok then NewHTML.Free;
167
Provider.ReleaseStream(FURL);
359
IDEProvider.ReleaseStream(FURL);
171
362
on E: Exception do begin
172
363
MessageDlg('Unable to open HTML file',
173
'HTML File: '+FURL+#13
174
365
+'Error: '+E.Message,mtError,[mbCancel],0);
179
procedure TIPLazHtmlControl.SetHTMLContent(Stream: TStream);
370
procedure TLazIPHtmlControl.SetHTMLContent(Stream: TStream; const NewURL: string
182
NewHTML: TSimpleIpHtml;
187
NewHTML:=TSimpleIpHtml.Create; // Beware: Will be freed automatically by TIpHtmlPanel
188
NewHTML.OnGetImageX:=@HTMLGetImageX;
377
NewHTML:=TIpHtml.Create; // Beware: Will be freed automatically TIpHtmlPanel
378
FIPHTMLPanel.SetHtml(NewHTML);
189
379
NewHTML.LoadFromStream(Stream);
192
if not ok then NewHTML.Free;
381
on E: Exception do begin
382
MessageDlg('Unable to load HTML stream',
384
+'Error: '+E.Message,mtError,[mbCancel],0);
197
procedure TIPLazHtmlControl.GetPreferredControlSize(out AWidth, AHeight: integer);
389
procedure TLazIPHtmlControl.GetPreferredControlSize(out AWidth, AHeight: integer);
199
with GetContentSize do
393
inherited GetPreferredSize(AWidth, AHeight);