1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
|
unit HtmFileExp2;
{$mode objfpc}{$H+}
{.$define UsePreview}
{$IFDEF LCL}
{$DEFINE IP_LAZARUS}
{$ENDIF}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
{$IFDEF IP_LAZARUS}
{$ifdef UsePreview}
OsPrinters,
{$endif}
{$ELSE}
GIFImage,
JPeg,
ImageDLLLoader, PNGLoader, LinarBitmap, //from ImageFileLib of Michael Vinther: http://www.logicnet.dk/lib/
{$ENDIF}
IpHtml, ExtCtrls, StdCtrls, FileUtil;
type
TSimpleIpHtml = class(TIpHtml)
public
property OnGetImageX;
end;
TPst = class(TObject)
Position: Integer;
end;
TIpHtmlPanelH = class(TIpHtmlPanel)
private
SL: TStringList;
CurrPos: Integer;
CurrFile: string;
Path: string;
PathChanged: Boolean;
FC_GoForward: TControl;
FC_GoBackward: TControl;
procedure GoBackFor (GotoBack: Boolean);
procedure HTMLGetImageX(Sender: TIpHtmlNode; const URL: string;
var Picture: TPicture);
procedure HotClickH(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure GoBackward;
procedure GoForward;
procedure OpenHTMLFile(const Filename: string;
ToAdd, RelativePath: Boolean);
published
property C_GoBackward: TControl read FC_GoBackward write FC_GoBackward;
property C_GoForward: TControl read FC_GoForward write FC_GoForward;
end;
TFHtmFileExp2 = class(TForm)
B_OpenHTMLFile: TButton;
OpenDialog1: TOpenDialog;
P_Top: TPanel;
SB_GoBackward: TSpeedButton;
SB_GoForward: TSpeedButton;
procedure B_OpenHTMLFileClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SB_GoBackwardClick(Sender: TObject);
procedure SB_GoForwardClick(Sender: TObject);
private
IpHtmlPanel1: TIpHtmlPanelH;
end;
var
FHtmFileExp2: TFHtmFileExp2;
implementation
{$R htmfileexp2.lfm}
{$R defaultimage.res}
uses
IpUtils, LazFileUtils;
{--------------------------------------}
{-PRIVATE----------}
procedure TIpHtmlPanelH.GoBackFor (GotoBack: Boolean);
var
Pst: TPst;
S: string;
SameFile: Boolean;
begin
if GotoBack
then Dec (CurrPos)
else Inc (CurrPos);
if GotoBack then begin
SameFile := SL[CurrPos+1] = SL[CurrPos]
end
else begin
if CurrPos > 0
then SameFile := SL[CurrPos-1] = SL[CurrPos]
else SameFile := False;
end;
if SameFile
then S := ''
else S := SL[CurrPos];
Pst := TPst(SL.Objects[CurrPos]);
OpenHTMLFile (S, False, True);
VScrollPos := Pst.Position;
if Assigned (C_GoBackward)
then C_GoBackward.Enabled := (SL.Count > 1) and (CurrPos > 0);
if Assigned (C_GoForward)
then C_GoForward.Enabled := (SL.Count > 1) and (CurrPos < SL.Count-1);
end {GoBackFor};
procedure TIpHtmlPanelH.HTMLGetImageX(Sender: TIpHtmlNode; const URL: string;
var Picture: TPicture);
var
PicCreated: Boolean;
FN, nURL: string;
{$IFNDEF IP_LAZARUS}
Ext: string;
BitMap: Graphics.TBitMap;
{$ENDIF}
begin
PicCreated := False;
try
if PathChanged
then FN := Path
else FN := ExtractFilePath(SL[CurrPos]);
if Pos ('\',FN) <> 0
then nURL := NetToDOSPath(URL)
else nURL := URL;
FN := Concat (FN, nURL);
if FileExistsUTF8(FN) then begin
if Picture = nil then begin
Picture := TPicture.Create;
PicCreated := True;
end;
{$IFNDEF IP_LAZARUS}
Ext := LowerCase (Copy (ExtractFileExt (FN), 2, MaxInt));
if (Ext = 'bmp') or (Ext = 'emf') or (Ext = 'wmf') or (Ext = 'gif') or (Ext = 'jpg') then begin
{$ENDIF}
Picture.LoadFromFile(FN);
{$IFNDEF IP_LAZARUS}
end
else begin
PicCreated := False;
BitMap := Graphics.TBitMap.Create;
with TLinearBitmap.Create do
try
LoadFromFile (FN);
AssignTo (Bitmap);
Picture.Bitmap.Assign (BitMap);
PicCreated := True;
finally
Bitmap.Free;
Free;
end;
end;
{$ENDIF}
end;
except
if PicCreated then
Picture.Free;
Picture := nil;
end;
end {HTMLGetImageX};
procedure TIpHtmlPanelH.HotClickH(Sender: TObject);
begin
if HotNode is TIpHtmlNodeA then begin
TPst(SL.Objects[CurrPos]).Position := VScrollPos;
OpenHTMLFile (TIpHtmlNodeA(HotNode).HRef, True, True);
end;
end;
{-PUBLIC-----------}
constructor TIpHtmlPanelH.Create(AOwner: TComponent);
begin
inherited;
SL := TStringList.Create;
CurrPos := -1;
OnHotClick := @HotClickH;
end;
destructor TIpHtmlPanelH.Destroy;
var
I: Integer;
begin
for I := SL.Count-1 downto 0 do
TPst(SL.Objects[I]).Free;
SL.Free;
inherited;
end {Destroy};
procedure TIpHtmlPanelH.GoBackward;
begin
TPst(SL.Objects[CurrPos]).Position := VScrollPos;
GoBackFor (True);
end;
procedure TIpHtmlPanelH.GoForward;
begin
GoBackFor (False);
end;
procedure TIpHtmlPanelH.OpenHTMLFile(const Filename: string;
ToAdd, RelativePath: Boolean);
var
FN, Anchor: string;
Pst: TPst;
procedure UpdateSB;
var
I: Integer;
begin
if ToAdd then begin
Pst := TPst.Create;
Pst.Position := VScrollPos;
for I := SL.Count-1 downto CurrPos+1 do begin
TPst(SL.Objects[I]).Free;
SL.Delete(I);
end;
CurrPos := SL.AddObject (FN, Pst);
if Assigned (C_GoBackward)
then C_GoBackward.Enabled := SL.Count > 1;
if Assigned (C_GoForward)
then C_GoForward.Enabled := False;
end;
end {UpdateSB};
var
fs: TFileStream;
NewHTML: TSimpleIpHtml;
P: Integer;
begin
if Filename = '' then begin
if CurrPos > -1
then VScrollPos := 0;
Exit;
end;
P := Pos ('#', Filename);
FN := Filename;
if RelativePath then begin
PathChanged := False;
if P = 0 then begin
Anchor := '';
end
else if P = 1 then begin
FN := Concat (Path, CurrFile);
Anchor := Copy (Filename, 2, MaxInt);
MakeAnchorVisible (Anchor);
UpdateSB;
Exit;
end
else begin
FN := Copy (Filename, 1, P-1);
Anchor := Copy (Filename, P+1, MaxInt);
end;
if ToAdd then begin
FN := Concat (Path, FN);
end;
end
else begin
FN := ExpandFileNameUTF8(FN);
CurrFile := ExtractFileName (FN);
Path := ExtractFilePath (FN);
PathChanged := True;
end;
try
fs := TFileStream.Create (FN, fmOpenRead);
try
NewHTML := TSimpleIpHtml.Create; // Beware: Will be freed automatically by IpHtmlPanel1
NewHTML.OnGetImageX := @HTMLGetImageX;
NewHTML.LoadFromStream(fs);
SetHtml(NewHTML);
if Anchor <> ''
then MakeAnchorVisible (Anchor);
UpdateSB;
finally
fs.Free;
end;
except
on E: Exception do begin
MessageDlg ('Unable to open HTML file'+sLineBreak+
'HTML File: '+Filename+sLineBreak+
'Error: '+E.Message, mtError, [mbCancel], 0);
end;
end;
end {OpenHTMLFile};
{--------------------------------------}
{-EVENTS-----------}
procedure TFHtmFileExp2.FormCreate(Sender: TObject);
begin
IpHtmlPanel1 := TIpHtmlPanelH.Create (Application);
with IpHtmlPanel1 do begin
Name := 'IpHtmlPanel';
Parent := FHtmFileExp2;
Align := alClient;
FactBAParag := 0.5;
C_GoBackward := SB_GoBackward;
C_GoForward := SB_GoForward;
OpenHTMLFile ('index.html', True, False);
end;
end {FormCreate};
procedure TFHtmFileExp2.B_OpenHTMLFileClick(Sender: TObject);
begin
if OpenDialog1.Execute then begin
IpHtmlPanel1.OpenHtmlFile (OpenDialog1.FileName, True, False);
end;
end;
procedure TFHtmFileExp2.SB_GoBackwardClick(Sender: TObject);
begin
IpHtmlPanel1.GoBackward;
end;
procedure TFHtmFileExp2.SB_GoForwardClick(Sender: TObject);
begin
IpHtmlPanel1.GoForward;
end;
end.
|