diff --git a/applications/fpbrowser/browserviewer.pas b/applications/fpbrowser/browserviewer.pas new file mode 100644 index 000000000..e60ab01f7 --- /dev/null +++ b/applications/fpbrowser/browserviewer.pas @@ -0,0 +1,119 @@ +unit browserviewer; + +{$mode delphi} + +interface + +uses + Classes, SysUtils, + Controls, Forms, Graphics, + // + pageloader; + +type + + { TBrowserViewer } + + TBrowserViewer = class + public + MyPageLoaderThread: TPageLoaderThread; + MyPageLoader: TPageLoader; + CurrentTab: Integer; + constructor Create; virtual; + destructor Destroy; override; + procedure CreateViewer(AParent, AOwner: TWinControl); virtual; abstract; + procedure LoadFromFile(AFilename: string); virtual; abstract; + procedure LoadFromURL(AURL: string); virtual; + function GetDocumentTitle: string; virtual; abstract; + procedure SetShowImages(AValue: Boolean); virtual; abstract; + procedure HandlePageLoaderTerminated(Sender: TObject); virtual; + end; + + TBrowserViewerClass = class of TBrowserViewer; + +procedure SetBrowserViewerClass(AViewerClass: TBrowserViewerClass); +function GetBrowserViewer(AIndex: Integer): TBrowserViewer; +function GetCurrentBrowserViewer: TBrowserViewer; +procedure SetCurrentBrowserViewer(AIndex: Integer); +function AddBrowserViewer(): TBrowserViewer; +procedure RemoveBrowserViewer(AIndex: Integer); +function GetBrowerViewerCount: Integer; + +implementation + +var + gBrowserViewerClass: TBrowserViewerClass; + gBrowserViewers: TFPList; + gCurrentViewer: Integer; + +procedure SetBrowserViewerClass(AViewerClass: TBrowserViewerClass); +begin + gBrowserViewerClass := AViewerClass; +end; + +function GetBrowserViewer(AIndex: Integer): TBrowserViewer; +begin + Result := gBrowserViewers.Items[AIndex]; +end; + +function GetCurrentBrowserViewer: TBrowserViewer; +begin + Result := GetBrowserViewer(gCurrentViewer); +end; + +procedure SetCurrentBrowserViewer(AIndex: Integer); +begin + gCurrentViewer := AIndex; +end; + +function AddBrowserViewer(): TBrowserViewer; +begin + Result := gBrowserViewerClass.Create(); + gBrowserViewers.Add(Result); +end; + +procedure RemoveBrowserViewer(AIndex: Integer); +begin + +end; + +function GetBrowerViewerCount: Integer; +begin + Result := gBrowserViewers.Count; +end; + +{ TBrowserViewer } + +constructor TBrowserViewer.Create; +begin + inherited Create; + MyPageLoader := TPageLoader.Create; +end; + +destructor TBrowserViewer.Destroy; +begin + MyPageLoader.Free; + inherited Destroy; +end; + +procedure TBrowserViewer.LoadFromURL(AURL: string); +begin + MyPageLoaderThread := TPageLoaderThread.Create(True); + MyPageLoaderThread.URL := AURL; + MyPageLoaderThread.PageLoader := MyPageLoader; +// MyPageLoaderThread.OnPageLoadProgress := @HandlePageLoaderProgress; + MyPageLoaderThread.OnTerminate := HandlePageLoaderTerminated; + MyPageLoaderThread.FreeOnTerminate := True; + MyPageLoaderThread.Resume; +end; + +procedure TBrowserViewer.HandlePageLoaderTerminated(Sender: TObject); +begin +end; + +initialization + gBrowserViewers := TFPList.Create; +finalization + gBrowserViewers.Free; +end. + diff --git a/applications/fpbrowser/fpbrowser.dpr b/applications/fpbrowser/fpbrowser.dpr index 30e6f7ae1..275665c60 100644 --- a/applications/fpbrowser/fpbrowser.dpr +++ b/applications/fpbrowser/fpbrowser.dpr @@ -1,5 +1,8 @@ program fpbrowser; +{$define FPBROWSER_TURBOPOWERIPRO} +{.$define FPBROWSER_THTMLCOMP} + uses {$IFDEF UNIX} cthreads, @@ -15,7 +18,14 @@ uses Gopage in 'Gopage.pas' {GoPageForm}, PrintStatusForm in 'PrintStatusForm.pas' {PrnStatusForm}, *) - ImgForm in 'ImgForm.pas', pageloader, browsermodules {ImageForm}; + ImgForm in 'ImgForm.pas', pageloader, browsermodules, +{$ifdef FPBROWSER_THTMLCOMP} + viewer_thtmlcomp, +{$endif} +{$ifdef FPBROWSER_TURBOPOWERIPRO} + viewer_ipro, +{$endif} + browserviewer; begin Application.Initialize; diff --git a/applications/fpbrowser/fpbrowser.lpi b/applications/fpbrowser/fpbrowser.lpi index 4dab47997..21b614eb8 100644 --- a/applications/fpbrowser/fpbrowser.lpi +++ b/applications/fpbrowser/fpbrowser.lpi @@ -44,7 +44,7 @@ - + @@ -86,6 +86,21 @@ + + + + + + + + + + + + + + + diff --git a/applications/fpbrowser/mainform.lfm b/applications/fpbrowser/mainform.lfm index 3d1820ee5..983287eb4 100644 --- a/applications/fpbrowser/mainform.lfm +++ b/applications/fpbrowser/mainform.lfm @@ -3,7 +3,7 @@ object formBrowser: TformBrowser Height = 439 Top = 186 Width = 621 - ClientHeight = 412 + ClientHeight = 439 ClientWidth = 621 Color = clBtnFace Font.Color = clWindowText @@ -18,7 +18,7 @@ object formBrowser: TformBrowser object panelBottom: TPanel Left = 0 Height = 18 - Top = 394 + Top = 421 Width = 621 Align = alBottom Alignment = taLeftJustify @@ -39,7 +39,7 @@ object formBrowser: TformBrowser Left = 319 Height = 16 Top = 3 - Width = 21 + Width = 22 Caption = 'Idle' ParentColor = False end @@ -96,62 +96,11 @@ object formBrowser: TformBrowser end object pageBrowser: TPageControl Left = 0 - Height = 361 + Height = 388 Top = 33 Width = 621 - ActivePage = tabBrowser Align = alClient - ShowTabs = False - TabIndex = 0 TabOrder = 2 - object tabBrowser: TTabSheet - Caption = 'Browser' - ClientHeight = 359 - ClientWidth = 619 - object panelBrowser: TPanel - Left = 0 - Height = 359 - Top = 0 - Width = 619 - Align = alClient - BevelInner = bvLowered - BevelOuter = bvNone - Caption = 'panelBrowser' - TabOrder = 0 - end - end - object tabDebug: TTabSheet - Caption = 'Debug' - ClientHeight = 359 - ClientWidth = 619 - object memoDebug: TMemo - Left = 0 - Height = 359 - Top = 0 - Width = 619 - Align = alClient - Lines.Strings = ( - 'memoDebug' - ) - TabOrder = 0 - end - end - object tabSource: TTabSheet - Caption = 'Source' - ClientHeight = 359 - ClientWidth = 619 - object memoSource: TMemo - Left = 0 - Height = 359 - Top = 0 - Width = 619 - Align = alClient - Lines.Strings = ( - 'memoSource' - ) - TabOrder = 0 - end - end end object OpenDialog: TOpenDialog DefaultExt = '.htm' diff --git a/applications/fpbrowser/mainform.lrs b/applications/fpbrowser/mainform.lrs index d3f67a802..84eb351f1 100644 --- a/applications/fpbrowser/mainform.lrs +++ b/applications/fpbrowser/mainform.lrs @@ -2,17 +2,17 @@ LazarusResources.Add('TformBrowser','FORMDATA',[ 'TPF0'#12'TformBrowser'#11'formBrowser'#4'Left'#3'G'#1#6'Height'#3#183#1#3'To' - +'p'#3#186#0#5'Width'#3'm'#2#12'ClientHeight'#3#156#1#11'ClientWidth'#3'm'#2#5 + +'p'#3#186#0#5'Width'#3'm'#2#12'ClientHeight'#3#183#1#11'ClientWidth'#3'm'#2#5 +'Color'#7#9'clBtnFace'#10'Font.Color'#7#12'clWindowText'#11'Font.Height'#2 +#243#9'Font.Name'#6#5'Arial'#4'Menu'#7#8'MainMenu'#8'OnCreate'#7#10'FormCrea' +'te'#9'OnDestroy'#7#11'FormDestroy'#6'OnShow'#7#8'FormShow'#8'Position'#7#14 +'poScreenCenter'#10'LCLVersion'#6#6'0.9.31'#0#6'TPanel'#11'panelBottom'#4'Le' - +'ft'#2#0#6'Height'#2#18#3'Top'#3#138#1#5'Width'#3'm'#2#5'Align'#7#8'alBottom' + +'ft'#2#0#6'Height'#2#18#3'Top'#3#165#1#5'Width'#3'm'#2#5'Align'#7#8'alBottom' +#9'Alignment'#7#13'taLeftJustify'#10'BevelInner'#7#9'bvLowered'#10'BevelOute' +'r'#7#6'bvNone'#12'ClientHeight'#2#18#11'ClientWidth'#3'm'#2#8'TabOrder'#2#0 +#0#12'TProgressBar'#11'ProgressBar'#4'Left'#3#214#1#6'Height'#2#16#3'Top'#2#1 +#5'Width'#3#150#0#5'Align'#7#7'alRight'#8'TabOrder'#2#0#0#0#6'TLabel'#13'lab' - +'elProgress'#4'Left'#3'?'#1#6'Height'#2#16#3'Top'#2#3#5'Width'#2#21#7'Captio' + +'elProgress'#4'Left'#3'?'#1#6'Height'#2#16#3'Top'#2#3#5'Width'#2#22#7'Captio' +'n'#6#4'Idle'#11'ParentColor'#8#0#0#0#6'TPanel'#8'panelTop'#4'Left'#2#0#6'He' +'ight'#2'!'#3'Top'#2#0#5'Width'#3'm'#2#5'Align'#7#5'alTop'#10'BevelOuter'#7#6 +'bvNone'#12'ClientHeight'#2'!'#11'ClientWidth'#3'm'#2#8'TabOrder'#2#1#0#5'TE' @@ -25,58 +25,46 @@ LazarusResources.Add('TformBrowser','FORMDATA',[ +'ck'#8'TabOrder'#2#1#0#0#7'TButton'#13'buttonForward'#4'Left'#3#128#0#6'Heig' +'ht'#2#24#3'Top'#2#4#5'Width'#2';'#7'Caption'#6#8'&Forward'#7'Enabled'#8#7'O' +'nClick'#7#12'FwdBackClick'#8'TabOrder'#2#2#0#0#0#12'TPageControl'#11'pageBr' - +'owser'#4'Left'#2#0#6'Height'#3'i'#1#3'Top'#2'!'#5'Width'#3'm'#2#10'ActivePa' - +'ge'#7#10'tabBrowser'#5'Align'#7#8'alClient'#8'ShowTabs'#8#8'TabIndex'#2#0#8 - +'TabOrder'#2#2#0#9'TTabSheet'#10'tabBrowser'#7'Caption'#6#7'Browser'#12'Clie' - +'ntHeight'#3'g'#1#11'ClientWidth'#3'k'#2#0#6'TPanel'#12'panelBrowser'#4'Left' - +#2#0#6'Height'#3'g'#1#3'Top'#2#0#5'Width'#3'k'#2#5'Align'#7#8'alClient'#10'B' - +'evelInner'#7#9'bvLowered'#10'BevelOuter'#7#6'bvNone'#7'Caption'#6#12'panelB' - +'rowser'#8'TabOrder'#2#0#0#0#0#9'TTabSheet'#8'tabDebug'#7'Caption'#6#5'Debug' - +#12'ClientHeight'#3'g'#1#11'ClientWidth'#3'k'#2#0#5'TMemo'#9'memoDebug'#4'Le' - +'ft'#2#0#6'Height'#3'g'#1#3'Top'#2#0#5'Width'#3'k'#2#5'Align'#7#8'alClient' - +#13'Lines.Strings'#1#6#9'memoDebug'#0#8'TabOrder'#2#0#0#0#0#9'TTabSheet'#9't' - +'abSource'#7'Caption'#6#6'Source'#12'ClientHeight'#3'g'#1#11'ClientWidth'#3 - +'k'#2#0#5'TMemo'#10'memoSource'#4'Left'#2#0#6'Height'#3'g'#1#3'Top'#2#0#5'Wi' - +'dth'#3'k'#2#5'Align'#7#8'alClient'#13'Lines.Strings'#1#6#10'memoSource'#0#8 - +'TabOrder'#2#0#0#0#0#0#11'TOpenDialog'#10'OpenDialog'#10'DefaultExt'#6#4'.ht' - +'m'#6'Filter'#6'%html files|*.htm;*.html|all files|*.*'#7'Options'#11#14'ofH' - +'ideReadOnly'#15'ofPathMustExist'#15'ofFileMustExist'#0#4'left'#3'I'#1#3'top' - +#2#2#0#0#9'TMainMenu'#8'MainMenu'#4'left'#3'#'#1#3'top'#2#4#0#9'TMenuItem'#5 - +'File1'#7'Caption'#6#5'&File'#0#9'TMenuItem'#4'Open'#7'Caption'#6#5'&Open'#8 - +'ShortCut'#2'r'#7'OnClick'#7#13'OpenFileClick'#0#0#9'TMenuItem'#12'OpenTextF' - +'ile'#7'Caption'#6#15'Open &Text File'#7'OnClick'#7#17'OpenTextFileClick'#0#0 - +#9'TMenuItem'#13'OpenImageFile'#7'Caption'#6#16'Open &Image File'#7'OnClick' - +#7#18'OpenImageFileClick'#0#0#9'TMenuItem'#13'PrinterSetup1'#7'Caption'#6#16 - +'Printer Setup...'#7'OnClick'#7#18'PrinterSetup1Click'#0#0#9'TMenuItem'#12'P' - +'rintpreview'#7'Caption'#6#14'Print pre&view'#7'Enabled'#8#7'OnClick'#7#17'P' - +'rintpreviewClick'#0#0#9'TMenuItem'#6'Print1'#7'Caption'#6#9'&Print...'#7'En' - +'abled'#8#7'OnClick'#7#11'Print1Click'#0#0#9'TMenuItem'#2'N1'#7'Caption'#6#1 - +'-'#0#0#9'TMenuItem'#5'Exit1'#7'Caption'#6#5'E&xit'#7'OnClick'#7#10'Exit1Cli' - +'ck'#0#0#0#9'TMenuItem'#5'Edit2'#7'Caption'#6#5'&Edit'#7'OnClick'#7#10'Edit2' - +'Click'#0#9'TMenuItem'#5'Find1'#7'Caption'#6#5'&Find'#7'Enabled'#8#7'OnClick' - +#7#10'Find1Click'#0#0#9'TMenuItem'#8'CopyItem'#7'Caption'#6#5'&Copy'#8'Short' - +'Cut'#3'C@'#7'OnClick'#7#13'CopyItemClick'#0#0#9'TMenuItem'#2'N2'#7'Caption' - +#6#1'-'#0#0#9'TMenuItem'#13'SelectAllItem'#7'Caption'#6#11'Select &All'#7'En' - +'abled'#8#7'OnClick'#7#18'SelectAllItemClick'#0#0#0#9'TMenuItem'#8'options1' - +#7'Caption'#6#6'&Tools'#0#9'TMenuItem'#10'ShowImages'#7'Caption'#6#12'&Show ' - +'images'#7'OnClick'#7#15'ShowImagesClick'#0#0#9'TMenuItem'#5'Fonts'#7'Captio' - +'n'#6#23'Default &Font/Colors...'#7'OnClick'#7#15'FontColorsClick'#0#0#9'TMe' - +'nuItem'#13'menuViewDebug'#7'Caption'#6#26'View Source and Debug info'#7'OnC' - +'lick'#7#18'menuViewDebugClick'#0#0#0#9'TMenuItem'#15'HistoryMenuItem'#7'Cap' - +'tion'#6#8'&History'#7'Visible'#8#0#0#9'TMenuItem'#6'About1'#7'Caption'#6#6 - +'&About'#7'OnClick'#7#11'About1Click'#0#0#0#12'TPrintDialog'#11'PrintDialog' - ,#8'FromPage'#2#1#7'MinPage'#2#1#7'MaxPage'#3#15''''#7'Options'#11#10'poPageN' - +'ums'#0#6'ToPage'#2#1#4'left'#3'j'#1#3'top'#2#1#0#0#11'TFindDialog'#10'FindD' - +'ialog'#7'Options'#11#6'frDown'#15'frHideWholeWord'#18'frDisableWholeWord'#0 - +#6'OnFind'#7#14'FindDialogFind'#4'left'#3#248#0#3'top'#2#4#0#0#10'TPopupMenu' - +#9'PopupMenu'#4'left'#3#144#1#3'top'#2#1#0#9'TMenuItem'#9'Viewimage'#7'Capti' - +'on'#6#11'&View image'#7'OnClick'#7#14'ViewimageClick'#0#0#9'TMenuItem'#20'C' - +'opyImageToClipboard'#7'Caption'#6#24'&Copy image to clipboard'#7'OnClick'#7 - +#25'CopyImageToClipboardClick'#0#0#9'TMenuItem'#2'N3'#7'Caption'#6#1'-'#0#0#9 - +'TMenuItem'#15'OpenInNewWindow'#7'Caption'#6#19'&Open in new window'#7'OnCli' - +'ck'#7#20'OpenInNewWindowClick'#0#0#0#6'TTimer'#9'MetaTimer'#7'Enabled'#8#7 - +'OnTimer'#7#14'MetaTimerTimer'#4'left'#3#242#0#3'top'#2'K'#0#0#6'TTimer'#6'T' - +'imer1'#8'Interval'#3#200#0#7'OnTimer'#7#11'Timer1Timer'#4'left'#3'0'#1#3'to' - +'p'#2'G'#0#0#19'TPrinterSetupDialog'#18'PrinterSetupDialog'#4'left'#3#192#1#0 - +#0#0 + +'owser'#4'Left'#2#0#6'Height'#3#132#1#3'Top'#2'!'#5'Width'#3'm'#2#5'Align'#7 + +#8'alClient'#8'TabOrder'#2#2#0#0#11'TOpenDialog'#10'OpenDialog'#10'DefaultEx' + +'t'#6#4'.htm'#6'Filter'#6'%html files|*.htm;*.html|all files|*.*'#7'Options' + +#11#14'ofHideReadOnly'#15'ofPathMustExist'#15'ofFileMustExist'#0#4'left'#3'I' + +#1#3'top'#2#2#0#0#9'TMainMenu'#8'MainMenu'#4'left'#3'#'#1#3'top'#2#4#0#9'TMe' + +'nuItem'#5'File1'#7'Caption'#6#5'&File'#0#9'TMenuItem'#4'Open'#7'Caption'#6#5 + +'&Open'#8'ShortCut'#2'r'#7'OnClick'#7#13'OpenFileClick'#0#0#9'TMenuItem'#12 + +'OpenTextFile'#7'Caption'#6#15'Open &Text File'#7'OnClick'#7#17'OpenTextFile' + +'Click'#0#0#9'TMenuItem'#13'OpenImageFile'#7'Caption'#6#16'Open &Image File' + +#7'OnClick'#7#18'OpenImageFileClick'#0#0#9'TMenuItem'#13'PrinterSetup1'#7'Ca' + +'ption'#6#16'Printer Setup...'#7'OnClick'#7#18'PrinterSetup1Click'#0#0#9'TMe' + +'nuItem'#12'Printpreview'#7'Caption'#6#14'Print pre&view'#7'Enabled'#8#7'OnC' + +'lick'#7#17'PrintpreviewClick'#0#0#9'TMenuItem'#6'Print1'#7'Caption'#6#9'&Pr' + +'int...'#7'Enabled'#8#7'OnClick'#7#11'Print1Click'#0#0#9'TMenuItem'#2'N1'#7 + +'Caption'#6#1'-'#0#0#9'TMenuItem'#5'Exit1'#7'Caption'#6#5'E&xit'#7'OnClick'#7 + +#10'Exit1Click'#0#0#0#9'TMenuItem'#5'Edit2'#7'Caption'#6#5'&Edit'#7'OnClick' + +#7#10'Edit2Click'#0#9'TMenuItem'#5'Find1'#7'Caption'#6#5'&Find'#7'Enabled'#8 + +#7'OnClick'#7#10'Find1Click'#0#0#9'TMenuItem'#8'CopyItem'#7'Caption'#6#5'&Co' + +'py'#8'ShortCut'#3'C@'#7'OnClick'#7#13'CopyItemClick'#0#0#9'TMenuItem'#2'N2' + +#7'Caption'#6#1'-'#0#0#9'TMenuItem'#13'SelectAllItem'#7'Caption'#6#11'Select' + +' &All'#7'Enabled'#8#7'OnClick'#7#18'SelectAllItemClick'#0#0#0#9'TMenuItem'#8 + +'options1'#7'Caption'#6#6'&Tools'#0#9'TMenuItem'#10'ShowImages'#7'Caption'#6 + +#12'&Show images'#7'OnClick'#7#15'ShowImagesClick'#0#0#9'TMenuItem'#5'Fonts' + +#7'Caption'#6#23'Default &Font/Colors...'#7'OnClick'#7#15'FontColorsClick'#0 + +#0#9'TMenuItem'#13'menuViewDebug'#7'Caption'#6#26'View Source and Debug info' + +#7'OnClick'#7#18'menuViewDebugClick'#0#0#0#9'TMenuItem'#15'HistoryMenuItem'#7 + +'Caption'#6#8'&History'#7'Visible'#8#0#0#9'TMenuItem'#6'About1'#7'Caption'#6 + +#6'&About'#7'OnClick'#7#11'About1Click'#0#0#0#12'TPrintDialog'#11'PrintDialo' + +'g'#8'FromPage'#2#1#7'MinPage'#2#1#7'MaxPage'#3#15''''#7'Options'#11#10'poPa' + +'geNums'#0#6'ToPage'#2#1#4'left'#3'j'#1#3'top'#2#1#0#0#11'TFindDialog'#10'Fi' + +'ndDialog'#7'Options'#11#6'frDown'#15'frHideWholeWord'#18'frDisableWholeWord' + +#0#6'OnFind'#7#14'FindDialogFind'#4'left'#3#248#0#3'top'#2#4#0#0#10'TPopupMe' + +'nu'#9'PopupMenu'#4'left'#3#144#1#3'top'#2#1#0#9'TMenuItem'#9'Viewimage'#7'C' + +'aption'#6#11'&View image'#7'OnClick'#7#14'ViewimageClick'#0#0#9'TMenuItem' + +#20'CopyImageToClipboard'#7'Caption'#6#24'&Copy image to clipboard'#7'OnClic' + +'k'#7#25'CopyImageToClipboardClick'#0#0#9'TMenuItem'#2'N3'#7'Caption'#6#1'-' + +#0#0#9'TMenuItem'#15'OpenInNewWindow'#7'Caption'#6#19'&Open in new window'#7 + +'OnClick'#7#20'OpenInNewWindowClick'#0#0#0#6'TTimer'#9'MetaTimer'#7'Enabled' + +#8#7'OnTimer'#7#14'MetaTimerTimer'#4'left'#3#242#0#3'top'#2'K'#0#0#6'TTimer' + +#6'Timer1'#8'Interval'#3#200#0#7'OnTimer'#7#11'Timer1Timer'#4'left'#3'0'#1#3 + ,'top'#2'G'#0#0#19'TPrinterSetupDialog'#18'PrinterSetupDialog'#4'left'#3#192#1 + +#0#0#0 ]); diff --git a/applications/fpbrowser/mainform.pas b/applications/fpbrowser/mainform.pas index 8d632527a..97deaf5cc 100644 --- a/applications/fpbrowser/mainform.pas +++ b/applications/fpbrowser/mainform.pas @@ -1,7 +1,5 @@ unit mainform; -{$define FPBROWSER_TURBOPOWERIPRO} -{.$define FPBROWSER_THTMLCOMP} interface @@ -12,32 +10,16 @@ uses PrintersDlgs, ComCtrls, {$IFDEF MSWINDOWS} ShellAPI, {$ELSE} Unix, {$ENDIF} - {$ifdef FPBROWSER_THTMLCOMP} - HtmlMisc, HTMLsubs, Htmlview, HTMLun2, - {$endif} - {$ifdef FPBROWSER_TURBOPOWERIPRO} - IPHtml, Ipfilebroker, IpMsg, - {$endif} HTMLabt, - pageloader; + pageloader, + browserviewer; type - {$ifdef FPBROWSER_TURBOPOWERIPRO} - { TMyIpHtmlDataProvider } - - TMyIpHtmlDataProvider = class(TIpHtmlDataProvider) - protected - function DoGetStream(const URL: string): TStream; override; - end; - {$endif} - { TformBrowser } TformBrowser = class(TForm) labelProgress: TLabel; - memoSource: TMemo; - memoDebug: TMemo; menuViewDebug: TMenuItem; N1: TMenuItem; OpenDialog: TOpenDialog; @@ -48,7 +30,6 @@ type File1: TMenuItem; Open: TMenuItem; options1: TMenuItem; - panelBrowser: TPanel; ShowImages: TMenuItem; Fonts: TMenuItem; editURL: TEdit; @@ -69,9 +50,6 @@ type OpenImageFile: TMenuItem; PopupMenu: TPopupMenu; CopyImageToClipboard: TMenuItem; - tabBrowser: TTabSheet; - tabDebug: TTabSheet; - tabSource: TTabSheet; Viewimage: TMenuItem; N3: TMenuItem; OpenInNewWindow: TMenuItem; @@ -108,8 +86,6 @@ type procedure OpenImageFileClick(Sender: TObject); procedure CopyImageToClipboardClick(Sender: TObject); procedure ObjectClick(Sender, Obj: TObject; const OnClick: String); - procedure ViewerImageRequest(Sender: TObject; const SRC: string; - var Stream: TMemoryStream); procedure ViewimageClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ViewerInclude(Sender: TObject; const Command: String; @@ -139,47 +115,11 @@ type procedure DropFiles( Sender : TObject; const FileNames: array of string); procedure CloseAll; - {$ifdef FPBROWSER_THTMLCOMP} - 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); - {$endif} - {$ifdef FPBROWSER_TURBOPOWERIPRO} - private - IpHtmlPanel1: TIpHtmlPanel; - DataProvider1: TMyIpHtmlDataProvider; - function DataProvider1CanHandle(Sender: TObject; const URL: string - ): Boolean; - procedure DataProvider1CheckURL(Sender: TObject; const URL: string; - var Available: Boolean; var ContentType: string); - procedure DataProvider1GetHtml(Sender: TObject; const URL: string; - const PostData: TIpFormDataEntity; var Stream: TStream); - procedure DataProvider1GetImage(Sender: TIpHtmlNode; const URL: string; - var Picture: TPicture); - procedure DataProvider1Leave(Sender: TIpHtml); - procedure DataProvider1ReportReference(Sender: TObject; const URL: string); - procedure ShowHTML(Src: string); - {$endif} public { Public declarations } - MyPageLoaderThread: TPageLoaderThread; - MyPageLoader: TPageLoader; + CurrentTab: Integer; procedure LoadURL(AURL: string); + procedure AddBrowserTab(AURL: string; AGoToTab: Boolean); procedure AddURLToHistory(AURL: string); procedure HandlePageLoaderProgress(APercent: Integer); procedure HandlePageLoaderTerminated(Sender: TObject); @@ -193,181 +133,13 @@ implementation uses Submit, ImgForm;//, FontDlg; -{$ifdef FPBROWSER_TURBOPOWERIPRO} -function TMyIpHtmlDataProvider.DoGetStream(const URL: string): TStream; -var - ms: TMemoryStream; -begin - Result:=nil; - WriteLn('TMyIpHtmlDataProvider.DoGetStream '+URL); - - if URL='fpdoc.css' then begin - //debugln(['TMyIpHtmlDataProvider.DoGetStream ',FileExists(URL)]); - ms:=TMemoryStream.Create; - try - ms.LoadFromFile(URL); - ms.Position:=0; - except - ms.Free; - end; - Result:=ms; - end; -end; - -function TformBrowser.DataProvider1CanHandle(Sender: TObject; const URL: string - ): Boolean; -begin - WriteLn('TformBrowser.DataProvider1CanHandle ',URL); - Result:=True; -end; - -procedure TformBrowser.DataProvider1CheckURL(Sender: TObject; const URL: string; - var Available: Boolean; var ContentType: string); -begin - WriteLn('TformBrowser.DataProvider1CheckURL ',URL); - Available:=True; - ContentType:='text/html'; -end; - -procedure TformBrowser.DataProvider1GetHtml(Sender: TObject; const URL: string; - const PostData: TIpFormDataEntity; var Stream: TStream); -var - lStream: TMemoryStream; -begin - WriteLn('TformBrowser.DataProvider1GetHtml ',URL); -{ MyPageLoader.LoadBinaryResource(URL, lStream); - Stream := lStream; - lStream.Position := 0;} - Stream := nil; - LoadURL(URL); -end; - -procedure TformBrowser.DataProvider1GetImage(Sender: TIpHtmlNode; const URL: string; - var Picture: TPicture); -var - lStream: TMemoryStream = nil; - lStr: String; -begin - WriteLn('TformBrowser.DataProvider1GetImage ',URL); - lStr := ExtractFileExt(URL); - if (lStr = '.jpeg') or (lStr = '.jpg') then - begin - try - MyPageLoader.LoadBinaryResource(URL, lStream); - Picture := TPicture.Create; - Picture.Jpeg.LoadFromStream(lStream); - finally - lStream.Free - end; - end - else - begin - WriteLn('TformBrowser.DataProvider1GetImage Unsupported format: ', lStr); - Picture := nil; - Exit; - end; -// and (lStr <> '.bmp') and (lStr <> '.png') -end; - -procedure TformBrowser.DataProvider1Leave(Sender: TIpHtml); -begin - -end; - -procedure TformBrowser.DataProvider1ReportReference(Sender: TObject; const URL: string - ); -begin - //debugln(['TForm1.DataProvider1ReportReference ',URL]); -end; - -procedure TformBrowser.ShowHTML(Src: string); -var - ss: TStringStream; - NewHTML: TIpHtml; -begin - ss := TStringStream.Create(Src); - try - NewHTML := TIpHtml.Create; // Beware: Will be freed automatically by IpHtmlPanel1 - //debugln(['TForm1.ShowHTML BEFORE SETHTML']); - IpHtmlPanel1.SetHtml(NewHTML); - //debugln(['TForm1.ShowHTML BEFORE LOADFROMSTREAM']); - NewHTML.LoadFromStream(ss); - //if Anchor <> '' then IpHtmlPanel1.MakeAnchorVisible(Anchor); - finally - ss.Free; - end; -end; -{$endif} - procedure TformBrowser.FormCreate(Sender: TObject); var I: integer; begin - MyPageLoader := TPageLoader.Create; History := TStringList.Create; - {$ifdef FPBROWSER_TURBOPOWERIPRO} - DataProvider1:=TMyIpHtmlDataProvider.Create(Self); - DataProvider1.Name:='DataProvider1'; - DataProvider1.OnCanHandle:=DataProvider1CanHandle; - DataProvider1.OnGetHtml:=DataProvider1GetHtml; - DataProvider1.OnGetImage:=DataProvider1GetImage; - DataProvider1.OnLeave:=DataProvider1Leave; - DataProvider1.OnCheckURL:=DataProvider1CheckURL; - DataProvider1.OnReportReference:=DataProvider1ReportReference; - - IpHtmlPanel1:=TIpHtmlPanel.Create(Self); - IpHtmlPanel1.Name:='IpHtmlPanel1'; - IpHtmlPanel1.Parent:=panelBrowser; - IpHtmlPanel1.Align:=alClient; - IpHtmlPanel1.DefaultFontSize:=10; - IpHtmlPanel1.DataProvider:=DataProvider1; - {$endif} - - {$ifdef FPBROWSER_THTMLCOMP} - Viewer := THTMLViewer.Create(Self); - 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 := panelBrowser; - - ShowImages.Checked := Viewer.ViewImages; - Viewer.HistoryMaxCount := MaxHistories; {defines size of history list} - {$endif} + AddBrowserTab('', True); Position := poScreenCenter; @@ -422,25 +194,21 @@ begin if (ParamCount >= 1) {$IFDEF DARWIN} and (Copy(ParamStr(1), 1, 4) <> '-psn') {$ENDIF} then begin {Parameter is file to load} S := ParamStr(1); - {$ifdef FPBROWSER_THTMLCOMP} - Viewer.LoadFromFile(HtmlToDos(Trim(S))); - {$endif} + GetCurrentBrowserViewer.LoadFromFile(S); end; end; procedure TformBrowser.OpenFileClick(Sender: TObject); begin - {$ifdef FPBROWSER_THTMLCOMP} - if Viewer.CurrentFile <> '' then - OpenDialog.InitialDir := ExtractFilePath(Viewer.CurrentFile); +// if Viewer.CurrentFile <> '' then +// OpenDialog.InitialDir := ExtractFilePath(Viewer.CurrentFile); OpenDialog.Filter := 'HTML Files (*.htm,*.html)|*.htm;*.html'; //might have changed if OpenDialog.Execute then begin Update; - Viewer.LoadFromFile(OpenDialog.Filename); - Caption := Viewer.DocumentTitle; + GetCurrentBrowserViewer().LoadFromFile(OpenDialog.Filename); + Caption := GetCurrentBrowserViewer().GetDocumentTitle(); end; - {$endif} end; procedure TformBrowser.editURLKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); @@ -457,152 +225,10 @@ begin pageBrowser.ActivePageIndex := 2; end; -{$ifdef FPBROWSER_THTMLCOMP} -procedure TformBrowser.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 TformBrowser.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; -{$endif} - {The Show Images menu item was clicked} procedure TformBrowser.ShowImagesClick(Sender: TObject); begin - {$ifdef FPBROWSER_THTMLCOMP} - Viewer.ViewImages := not Viewer.ViewImages; - (Sender as TMenuItem).Checked := Viewer.ViewImages; - {$endif} + GetCurrentBrowserViewer().SetShowImages((Sender as TMenuItem).Checked); end; procedure TformBrowser.buttonReloadClick(Sender: TObject); @@ -936,24 +562,6 @@ begin {$endif} end; -{ In this event we should provide images for the html component } -procedure TformBrowser.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 TformBrowser.ViewerInclude(Sender: TObject; const Command: String; Params: TStrings; var S: string); {OnInclude handler} @@ -993,7 +601,6 @@ end; procedure TformBrowser.FormDestroy(Sender: TObject); begin HintWindow.Free; - MyPageLoader.Free; History.Free; end; @@ -1148,13 +755,24 @@ end; procedure TformBrowser.LoadURL(AURL: string); begin - MyPageLoaderThread := TPageLoaderThread.Create(True); - MyPageLoaderThread.URL := AURL; - MyPageLoaderThread.PageLoader := MyPageLoader; - MyPageLoaderThread.OnPageLoadProgress := HandlePageLoaderProgress; - MyPageLoaderThread.OnTerminate := HandlePageLoaderTerminated; - MyPageLoaderThread.FreeOnTerminate := True; - MyPageLoaderThread.Resume; + GetCurrentBrowserViewer.LoadFromURL(AURL); +end; + +procedure TformBrowser.AddBrowserTab(AURL: string; AGoToTab: Boolean); +var + lViewer: TBrowserViewer; + lTabSheet: TTabSheet; +begin + lTabSheet := pageBrowser.AddTabSheet(); // This call requires Lazarus 0.9.31+ + + lViewer := AddBrowserViewer(); + lViewer.CreateViewer(lTabSheet, Self); + + if AGoToTab then + begin + CurrentTab := GetBrowerViewerCount() - 1; + SetCurrentBrowserViewer(CurrentTab); + end; end; procedure TformBrowser.AddURLToHistory(AURL: string); @@ -1172,23 +790,15 @@ end; procedure TformBrowser.HandlePageLoaderTerminated(Sender: TObject); begin - labelProgress.Caption := 'Finished Loading'; +{ labelProgress.Caption := 'Finished Loading'; progressBar.Position := 100; - {$ifdef FPBROWSER_THTMLCOMP} - Viewer.LoadFromString(MyPageLoader.Contents); - Caption := Viewer.DocumentTitle; - {$endif} - {$ifdef FPBROWSER_TURBOPOWERIPRO} - ShowHTML(MyPageLoader.Contents); - {$endif} - // Load source and debug info memoSource.Lines.Clear(); memoSource.Lines.AddStrings(MyPageLoader.ContentsList); memoDebug.Lines.Clear(); memoDebug.Lines.AddStrings(MyPageLoader.DebugInfo); - AddURLToHistory(MyPageLoader.LastPageURL); + AddURLToHistory(MyPageLoader.LastPageURL);} end; procedure TformBrowser.Timer1Timer(Sender: TObject); diff --git a/applications/fpbrowser/viewer_ipro.pas b/applications/fpbrowser/viewer_ipro.pas new file mode 100644 index 000000000..db9a486d1 --- /dev/null +++ b/applications/fpbrowser/viewer_ipro.pas @@ -0,0 +1,198 @@ +unit viewer_ipro; + +{$mode delphi} + +interface + +uses + Classes, SysUtils, Graphics, Forms, Controls, + // + browserviewer, + // + IPHtml, Ipfilebroker, IpMsg; + +type + { TMyIpHtmlDataProvider } + + TMyIpHtmlDataProvider = class(TIpHtmlDataProvider) + protected + function DoGetStream(const URL: string): TStream; override; + end; + + { TiProViewer } + + TiProViewer = class(TBrowserViewer) + private + IpHtmlPanel1: TIpHtmlPanel; + DataProvider1: TMyIpHtmlDataProvider; + function DataProvider1CanHandle(Sender: TObject; const URL: string + ): Boolean; + procedure DataProvider1CheckURL(Sender: TObject; const URL: string; + var Available: Boolean; var ContentType: string); + procedure DataProvider1GetHtml(Sender: TObject; const URL: string; + const PostData: TIpFormDataEntity; var Stream: TStream); + procedure DataProvider1GetImage(Sender: TIpHtmlNode; const URL: string; + var Picture: TPicture); + procedure DataProvider1Leave(Sender: TIpHtml); + procedure DataProvider1ReportReference(Sender: TObject; const URL: string); + procedure ShowHTML(Src: string); + 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 + +function TMyIpHtmlDataProvider.DoGetStream(const URL: string): TStream; +var + ms: TMemoryStream; +begin + Result:=nil; + WriteLn('TMyIpHtmlDataProvider.DoGetStream '+URL); + + if URL='fpdoc.css' then begin + //debugln(['TMyIpHtmlDataProvider.DoGetStream ',FileExists(URL)]); + ms:=TMemoryStream.Create; + try + ms.LoadFromFile(URL); + ms.Position:=0; + except + ms.Free; + end; + Result:=ms; + end; +end; + +function TiProViewer.DataProvider1CanHandle(Sender: TObject; const URL: string + ): Boolean; +begin + WriteLn('TformBrowser.DataProvider1CanHandle ',URL); + Result:=True; +end; + +procedure TiProViewer.DataProvider1CheckURL(Sender: TObject; const URL: string; + var Available: Boolean; var ContentType: string); +begin + WriteLn('TformBrowser.DataProvider1CheckURL ',URL); + Available:=True; + ContentType:='text/html'; +end; + +procedure TiProViewer.DataProvider1GetHtml(Sender: TObject; const URL: string; + const PostData: TIpFormDataEntity; var Stream: TStream); +var + lStream: TMemoryStream; +begin + WriteLn('TformBrowser.DataProvider1GetHtml ',URL); +{ MyPageLoader.LoadBinaryResource(URL, lStream); + Stream := lStream; + lStream.Position := 0;} + Stream := nil; + LoadFromURL(URL); +end; + +procedure TiProViewer.DataProvider1GetImage(Sender: TIpHtmlNode; const URL: string; + var Picture: TPicture); +var + lStream: TMemoryStream = nil; + lStr: String; +begin + WriteLn('TformBrowser.DataProvider1GetImage ',URL); + lStr := ExtractFileExt(URL); + if (lStr = '.jpeg') or (lStr = '.jpg') then + begin + try + MyPageLoader.LoadBinaryResource(URL, lStream); + Picture := TPicture.Create; + Picture.Jpeg.LoadFromStream(lStream); + finally + lStream.Free + end; + end + else + begin + WriteLn('TformBrowser.DataProvider1GetImage Unsupported format: ', lStr); + Picture := nil; + Exit; + end; +// and (lStr <> '.bmp') and (lStr <> '.png') +end; + +procedure TiProViewer.DataProvider1Leave(Sender: TIpHtml); +begin + +end; + +procedure TiProViewer.DataProvider1ReportReference(Sender: TObject; const URL: string + ); +begin + //debugln(['TForm1.DataProvider1ReportReference ',URL]); +end; + +procedure TiProViewer.ShowHTML(Src: string); +var + ss: TStringStream; + NewHTML: TIpHtml; +begin + ss := TStringStream.Create(Src); + try + NewHTML := TIpHtml.Create; // Beware: Will be freed automatically by IpHtmlPanel1 + //debugln(['TForm1.ShowHTML BEFORE SETHTML']); + IpHtmlPanel1.SetHtml(NewHTML); + //debugln(['TForm1.ShowHTML BEFORE LOADFROMSTREAM']); + NewHTML.LoadFromStream(ss); + //if Anchor <> '' then IpHtmlPanel1.MakeAnchorVisible(Anchor); + finally + ss.Free; + end; +end; + +procedure TiProViewer.CreateViewer(AParent, AOwner: TWinControl); +begin + DataProvider1:=TMyIpHtmlDataProvider.Create(AOwner); + DataProvider1.Name:='DataProvider1'; + DataProvider1.OnCanHandle:=DataProvider1CanHandle; + DataProvider1.OnGetHtml:=DataProvider1GetHtml; + DataProvider1.OnGetImage:=DataProvider1GetImage; + DataProvider1.OnLeave:=DataProvider1Leave; + DataProvider1.OnCheckURL:=DataProvider1CheckURL; + DataProvider1.OnReportReference:=DataProvider1ReportReference; + + IpHtmlPanel1:=TIpHtmlPanel.Create(AOwner); + IpHtmlPanel1.Name:='IpHtmlPanel1'; + IpHtmlPanel1.Parent:=AParent; + IpHtmlPanel1.Align:=alClient; + IpHtmlPanel1.DefaultFontSize:=10; + IpHtmlPanel1.DataProvider:=DataProvider1; +end; + +procedure TiProViewer.LoadFromFile(AFilename: string); +begin + +end; + +function TiProViewer.GetDocumentTitle: string; +begin + Result:=''; +end; + +procedure TiProViewer.SetShowImages(AValue: Boolean); +begin + +end; + +procedure TiProViewer.HandlePageLoaderTerminated(Sender: TObject); +begin + inherited HandlePageLoaderTerminated(Sender); + + ShowHTML(MyPageLoader.Contents); +end; + +initialization + SetBrowserViewerClass(TiProViewer); +end. + diff --git a/applications/fpbrowser/viewer_thtmlcomp.pas b/applications/fpbrowser/viewer_thtmlcomp.pas new file mode 100644 index 000000000..bc4413b25 --- /dev/null +++ b/applications/fpbrowser/viewer_thtmlcomp.pas @@ -0,0 +1,311 @@ +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. +