
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1935 8e941d3f-bd1b-0410-a28a-d453659cc2b4
312 lines
8.4 KiB
ObjectPascal
312 lines
8.4 KiB
ObjectPascal
unit viewer_thtmlcomp;
|
|
|
|
{$mode delphi}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils,
|
|
//
|
|
browserviewer,
|
|
//
|
|
HtmlMisc, HTMLsubs, Htmlview, HTMLun2;
|
|
|
|
type
|
|
|
|
{ THtmlCompViewer }
|
|
|
|
THtmlCompViewer = class(TBrowserViewer)
|
|
private
|
|
Viewer: THTMLViewer;
|
|
FoundObject: TImageObj;
|
|
procedure ViewerMouseMove(Sender: TObject; Shift: TShiftState; X,
|
|
Y: Integer);
|
|
procedure ViewerProgress(Sender: TObject; Stage: TProgressStage;
|
|
PercentDone: Integer);
|
|
procedure ViewerPrintHTMLFooter(Sender: TObject; HFViewer: THTMLViewer;
|
|
NumPage: Integer; LastPage: Boolean; var XL, XR: Integer;
|
|
var StopPrinting: Boolean);
|
|
procedure ViewerPrintHTMLHeader(Sender: TObject; HFViewer: THTMLViewer;
|
|
NumPage: Integer; LastPage: Boolean; var XL, XR: Integer;
|
|
var StopPrinting: Boolean);
|
|
procedure HotSpotChange(Sender: TObject; const URL: string);
|
|
procedure HotSpotClick(Sender: TObject; const URL: string;
|
|
var Handled: boolean);
|
|
procedure RightClick(Sender: TObject;
|
|
Parameters: TRightClickParameters);
|
|
procedure ViewerImageRequest(Sender: TObject; const SRC: string;
|
|
var Stream: TMemoryStream);
|
|
public
|
|
procedure CreateViewer(AParent, AOwner: TWinControl); override;
|
|
procedure LoadFromFile(AFilename: string); override;
|
|
// procedure LoadFromURL(AURL: string); override;
|
|
function GetDocumentTitle: string; override;
|
|
procedure SetShowImages(AValue: Boolean); override;
|
|
procedure HandlePageLoaderTerminated(Sender: TObject); override;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
{ THtmlCompViewer }
|
|
|
|
procedure THtmlCompViewer.ViewerMouseMove(Sender: TObject; Shift: TShiftState;
|
|
X, Y: Integer);
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure THtmlCompViewer.ViewerProgress(Sender: TObject;
|
|
Stage: TProgressStage; PercentDone: Integer);
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure THtmlCompViewer.ViewerPrintHTMLFooter(Sender: TObject;
|
|
HFViewer: THTMLViewer; NumPage: Integer; LastPage: Boolean; var XL,
|
|
XR: Integer; var StopPrinting: Boolean);
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure THtmlCompViewer.ViewerPrintHTMLHeader(Sender: TObject;
|
|
HFViewer: THTMLViewer; NumPage: Integer; LastPage: Boolean; var XL,
|
|
XR: Integer; var StopPrinting: Boolean);
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure THtmlCompViewer.HotSpotChange(Sender: TObject; const URL: string);
|
|
{mouse moved over or away from a hot spot. Change the status line}
|
|
var
|
|
Caption: string;
|
|
begin
|
|
Caption := '';
|
|
if URL <> '' then
|
|
Caption := Caption+'URL: '+URL+' ';
|
|
if Viewer.TitleAttr <> '' then
|
|
Caption := Caption+'Title: '+Viewer.TitleAttr;
|
|
panelBottom.Caption := Caption;
|
|
end;
|
|
|
|
{This routine handles what happens when a hot spot is clicked. The assumption
|
|
is made that DOS filenames are being used. .EXE, .WAV, .MID, and .AVI files are
|
|
handled here, but other file types could be easily added.
|
|
|
|
If the URL is handled here, set Handled to True. If not handled here, set it
|
|
to False and ThtmlViewer will handle it.}
|
|
procedure THtmlCompViewer.HotSpotClick(Sender: TObject; const URL: string;
|
|
var Handled: boolean);
|
|
const
|
|
snd_Async = $0001; { play asynchronously }
|
|
var
|
|
PC: array[0..255] of char;
|
|
{$IFDEF LCL}
|
|
PC2: array[0..255] of char;
|
|
{$ENDIF}
|
|
S, Params: string[255];
|
|
Ext: string[5];
|
|
ID: string;
|
|
AbsURL: string;
|
|
I, J, K: integer;
|
|
begin
|
|
Handled := False;
|
|
|
|
{The following looks for a link of the form, "IDExpand_XXX". This is interpreted
|
|
as meaning a block with an ID="XXXPlus" or ID="XXXMinus" attribute should
|
|
have its Display property toggled.
|
|
}
|
|
I := Pos('IDEXPAND_', Uppercase(URL));
|
|
if I=1 then
|
|
begin
|
|
ID := Copy(URL, 10, Length(URL)-9);
|
|
Viewer.IDDisplay[ID+'Plus'] := not Viewer.IDDisplay[ID+'Plus'];
|
|
Viewer.IDDisplay[ID+'Minus'] := not Viewer.IDDisplay[ID+'Minus'];
|
|
Viewer.Reformat;
|
|
Handled := True;
|
|
Exit;
|
|
end;
|
|
|
|
AbsURL := MyPageLoader.URLToAbsoluteURL(URL);
|
|
J := Pos('HTTP:', UpperCase(AbsURL));
|
|
if (J > 0) then
|
|
begin
|
|
LoadURL(AbsURL);
|
|
Handled := True;
|
|
Exit;
|
|
end;
|
|
|
|
I := Pos(':', URL);
|
|
J := Pos('FILE:', UpperCase(URL));
|
|
if (I <= 2) or (J > 0) then
|
|
begin {apparently the URL is a filename}
|
|
S := URL;
|
|
K := Pos(' ', S); {look for parameters}
|
|
if K = 0 then K := Pos('?', S); {could be '?x,y' , etc}
|
|
if K > 0 then
|
|
begin
|
|
Params := Copy(S, K+1, 255); {save any parameters}
|
|
S[0] := chr(K-1); {truncate S}
|
|
end
|
|
else Params := '';
|
|
S := Viewer.HTMLExpandFileName(S);
|
|
Ext := Uppercase(ExtractFileExt(S));
|
|
if Ext = '.WAV' then
|
|
begin
|
|
Handled := True;
|
|
{$IFNDEF LCL}
|
|
sndPlaySound(StrPCopy(PC, S), snd_ASync);
|
|
{$ENDIF}
|
|
end
|
|
else if Ext = '.EXE' then
|
|
begin
|
|
Handled := True;
|
|
{$IFNDEF LCL}
|
|
WinExec(StrPCopy(PC, S+' '+Params), sw_Show);
|
|
{$ELSE}
|
|
{$IFDEF MSWINDOWS}
|
|
ShellExecute(Handle, nil, StrPCopy(PC, S), StrPCopy(PC2, Params),
|
|
nil, SW_SHOWNORMAL);
|
|
{$ELSE} //Not sure if this makes any sense since executable won't have .exe.
|
|
{$IFDEF DARWIN}
|
|
Shell('open -n "' + S + '" --args "' + Params + '"');
|
|
{$ELSE}
|
|
Shell('"' + S + '" "' + Params + '"');
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
end
|
|
else if (Ext = '.MID') or (Ext = '.AVI') then
|
|
begin
|
|
Handled := True;
|
|
{$IFNDEF LCL}
|
|
WinExec(StrPCopy(PC, 'MPlayer.exe /play /close '+S), sw_Show);
|
|
{$ELSE}
|
|
{$IFDEF MSWINDOWS}
|
|
ShellExecute(Handle, nil, 'MPlayer.exe', '/play /close',
|
|
nil, SW_SHOWNORMAL);
|
|
{$ELSE} //No equivalent to MPlayer?
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
end;
|
|
{else ignore other extensions}
|
|
editURL.Text := URL;
|
|
Exit;
|
|
end;
|
|
|
|
I := Pos('MAILTO:', UpperCase(URL));
|
|
if (I > 0) then
|
|
begin
|
|
{$IFDEF MSWINDOWS}
|
|
ShellExecute(0, nil, pchar(URL), nil, nil, SW_SHOWNORMAL);
|
|
{$ELSE}
|
|
{$IFDEF DARWIN}
|
|
Shell('open "' + URL + '"');
|
|
{$ELSE}
|
|
Shell('"' + URL + '"'); //use LCL's OpenURL?
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
Handled := True;
|
|
Exit;
|
|
end;
|
|
|
|
editURL.Text := URL; {other protocall}
|
|
end;
|
|
|
|
procedure THtmlCompViewer.RightClick(Sender: TObject;
|
|
Parameters: TRightClickParameters);
|
|
begin
|
|
|
|
end;
|
|
|
|
{ In this event we should provide images for the html component }
|
|
procedure THtmlCompViewer.ViewerImageRequest(Sender: TObject;
|
|
const SRC: string; var Stream: TMemoryStream);
|
|
var
|
|
J: Integer;
|
|
URL: string;
|
|
begin
|
|
URL := MyPageLoader.URLToAbsoluteURL(SRC);
|
|
|
|
J := Pos('http:', LowerCase(URL));
|
|
if (J > 0) then
|
|
begin
|
|
MyPageLoader.LoadBinaryResource(URL, Stream);
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
procedure THtmlCompViewer.CreateViewer(AParent, AOwner: TWinControl);
|
|
begin
|
|
Viewer := THTMLViewer.Create(AOwner);
|
|
Viewer.Left := 1;
|
|
Viewer.Height := 358;
|
|
Viewer.Top := 1;
|
|
Viewer.Width := 611;
|
|
Viewer.OnHotSpotCovered := HotSpotChange;
|
|
Viewer.OnHotSpotClick := HotSpotClick;
|
|
Viewer.OnImageRequest := ViewerImageRequest;
|
|
Viewer.OnFormSubmit := SubmitEvent;
|
|
Viewer.OnHistoryChange := HistoryChange;
|
|
Viewer.OnProgress := ViewerProgress;
|
|
Viewer.TabStop := True;
|
|
Viewer.TabOrder := 0;
|
|
Viewer.Align := alClient;
|
|
Viewer.DefBackground := clWindow;
|
|
Viewer.BorderStyle := htFocused;
|
|
Viewer.HistoryMaxCount := 6;
|
|
Viewer.DefFontName := 'Times New Roman';
|
|
Viewer.DefPreFontName := 'Courier New';
|
|
Viewer.DefFontColor := clWindowText;
|
|
Viewer.DefOverLinkColor := clFuchsia;
|
|
Viewer.ImageCacheCount := 6;
|
|
Viewer.NoSelect := False;
|
|
Viewer.CharSet := DEFAULT_CHARSET;
|
|
Viewer.PrintMarginLeft := 2;
|
|
Viewer.PrintMarginRight := 2;
|
|
Viewer.PrintMarginTop := 2;
|
|
Viewer.PrintMarginBottom := 2;
|
|
Viewer.PrintScale := 1;
|
|
Viewer.OnMouseMove := ViewerMouseMove;
|
|
Viewer.OnProcessing := ProcessingHandler;
|
|
Viewer.OnPrintHTMLHeader := ViewerPrintHTMLHeader;
|
|
Viewer.OnPrintHTMLFooter := ViewerPrintHTMLFooter;
|
|
Viewer.OnInclude := ViewerInclude;
|
|
//Viewer.OnSoundRequest := SoundRequest;
|
|
Viewer.OnMetaRefresh := MetaRefreshEvent;
|
|
Viewer.OnObjectClick := ObjectClick;
|
|
Viewer.OnRightClick := RightClick;
|
|
Viewer.Parent := AParent;
|
|
|
|
// ShowImages.Checked := Viewer.ViewImages;
|
|
Viewer.HistoryMaxCount := MaxHistories; {defines size of history list}
|
|
end;
|
|
|
|
procedure THtmlCompViewer.LoadFromFile(AFilename: string);
|
|
begin
|
|
Viewer.LoadFromFile(HtmlToDos(Trim(AFilename)));
|
|
end;
|
|
|
|
function THtmlCompViewer.GetDocumentTitle: string;
|
|
begin
|
|
Result := Viewer.DocumentTitle;
|
|
end;
|
|
|
|
procedure THtmlCompViewer.SetShowImages(AValue: Boolean);
|
|
begin
|
|
Viewer.ViewImages := AValue;
|
|
end;
|
|
|
|
procedure THtmlCompViewer.HandlePageLoaderTerminated(Sender: TObject);
|
|
begin
|
|
inherited HandlePageLoaderTerminated(Sender);
|
|
|
|
Viewer.LoadFromString(MyPageLoader.Contents);
|
|
Caption := Viewer.DocumentTitle;
|
|
end;
|
|
|
|
initialization
|
|
SetBrowserViewerClass(THtmlCompViewer);
|
|
end.
|
|
|