InternalBrowser.pas 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. unit InternalBrowser;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, JvComponent, JvDockControlForm, ImgList, ComCtrls, ToolWin,
  6. StdCtrls, SHDocVW, ActnList, ExtCtrls, Registry, DateUtils, JvExControls,
  7. JvAnimatedImage, JvGIFCtrl, OleCtrls, ActiveX, JvOutlookBar, Misc;
  8. const
  9. // Mouse click basic events
  10. WM_XBUTTONDOWN = $020B;
  11. WM_XBUTTONUP = $020C;
  12. WM_XBUTTONDBLCLK = $020D;
  13. // Extended mouse buttons
  14. MOUSE_XBUTTONPREV = $10000;
  15. MOUSE_XBUTTONNEXT = $20000;
  16. type
  17. TURLDateTime = class(TObject)
  18. public
  19. Date: TDateTime;
  20. constructor Create(dtDate: TDateTime);
  21. end;
  22. TfrmInternalBrowser = class(TForm)
  23. JvDockClient1: TJvDockClient;
  24. imlBrowser: TImageList;
  25. ActionList1: TActionList;
  26. actBackTo: TAction;
  27. actFowardTo: TAction;
  28. actHome: TAction;
  29. actStop: TAction;
  30. actRefresh: TAction;
  31. actSearch: TAction;
  32. actGo: TAction;
  33. Panel2: TPanel;
  34. tlbInternalBrowser: TToolBar;
  35. ToolButton11: TToolButton;
  36. ToolButton12: TToolButton;
  37. ToolButton20: TToolButton;
  38. ToolButton13: TToolButton;
  39. ToolButton15: TToolButton;
  40. ToolButton16: TToolButton;
  41. ToolButton1: TToolButton;
  42. jvgifBrowser: TJvGIFAnimator;
  43. Panel1: TPanel;
  44. cboURL: TComboBox;
  45. btnGo: TButton;
  46. InternalBrowser: TWebBrowser;
  47. procedure FormCreate(Sender: TObject);
  48. procedure FormDestroy(Sender: TObject);
  49. procedure actBackToExecute(Sender: TObject);
  50. procedure actFowardToExecute(Sender: TObject);
  51. procedure actHomeExecute(Sender: TObject);
  52. procedure actStopExecute(Sender: TObject);
  53. procedure actRefreshExecute(Sender: TObject);
  54. procedure actSearchExecute(Sender: TObject);
  55. procedure actGoExecute(Sender: TObject);
  56. procedure InternalBrowserCommandStateChange(Sender: TObject; Command: Integer; Enable: WordBool);
  57. procedure InternalBrowserBeforeNavigate2(Sender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool);
  58. procedure cboURLKeyPress(Sender: TObject; var Key: Char);
  59. procedure FormShow(Sender: TObject);
  60. procedure InternalBrowserDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  61. private
  62. {Private variables}
  63. IsFirstTime: Boolean;
  64. { Private declarations }
  65. FOleInPlaceActiveObject: IOleInPlaceActiveObject;
  66. procedure MsgHandler(var Msg: TMsg; var Handled: Boolean);
  67. public
  68. { Public declarations }
  69. procedure AddURLToList(URL: String);
  70. procedure btnXHistoryClick(Sender: TObject);
  71. end;
  72. var
  73. frmInternalBrowser: TfrmInternalBrowser;
  74. implementation
  75. uses Rings, Main;
  76. {$R *.dfm}
  77. constructor TURLDateTime.Create(dtDate: TDateTime);
  78. begin
  79. Date := dtDate;
  80. end;
  81. procedure TfrmInternalBrowser.btnXHistoryClick(Sender: TObject);
  82. begin
  83. if not Self.Visible then
  84. frmLuaEditMain.DoShowInternalBrowserExecute;
  85. cboURL.Text := TJvOutlookBarButton(Sender).Caption;
  86. actGo.Execute;
  87. end;
  88. procedure TfrmInternalBrowser.FormCreate(Sender: TObject);
  89. var
  90. pReg: TRegistry;
  91. lstValues: TStringList;
  92. pURLDateTime: TURLDateTime;
  93. pRingButton: TJvOutlookBarButton;
  94. x: Integer;
  95. begin
  96. // Fix some web broser bugs with enter key
  97. Application.OnMessage := MsgHandler;
  98. // Initialize url combobox content
  99. pReg := TRegistry.Create;
  100. lstValues := TStringList.Create;
  101. if pReg.OpenKey('\Software\LuaEdit\InternalBrowser\Recent', False) then
  102. begin
  103. pReg.GetValueNames(lstValues);
  104. for x := 0 to lstValues.Count - 1 do
  105. begin
  106. if StrToDateTime(lstValues.Strings[x]) < IncDay(Now, 0 - HistoryMaxAge) then
  107. begin
  108. pReg.DeleteValue(lstValues.Strings[x]);
  109. end
  110. else
  111. begin
  112. pURLDateTime := TURLDateTime.Create(StrToDateTime(lstValues.Strings[x]));
  113. cboURL.AddItem(pReg.ReadString(lstValues.Strings[x]), pURLDateTime);
  114. pRingButton := frmRings.jvRings.Pages[JVPAGE_RING_BRWHISTORY].Buttons.Add;
  115. pRingButton.Caption := pReg.ReadString(lstValues.Strings[x]);
  116. pRingButton.OnClick := btnXHistoryClick;
  117. end;
  118. end;
  119. end;
  120. lstValues.Free;
  121. pReg.Free;
  122. IsFirstTime := True;
  123. end;
  124. procedure TfrmInternalBrowser.FormDestroy(Sender: TObject);
  125. var
  126. pReg: TRegistry;
  127. pURLDateTime: TURLDateTime;
  128. x: Integer;
  129. begin
  130. // wipe all current values and write new ones...
  131. pReg := TRegistry.Create;
  132. pReg.DeleteKey('\Software\LuaEdit\InternalBrowser\Recent');
  133. if pReg.OpenKey('\Software\LuaEdit\InternalBrowser\Recent', True) then
  134. begin
  135. for x := 0 to cboURL.Items.Count - 1 do
  136. begin
  137. pURLDateTime := TURLDateTime(cboURL.Items.Objects[x]);
  138. pReg.WriteString(DateTimeToStr(pURLDateTime.Date), cboURL.Items.Strings[x]);
  139. pURLDateTime.Free;
  140. end;
  141. end;
  142. FOleInPlaceActiveObject := nil;
  143. pReg.Free;
  144. end;
  145. // Added to fix [Enter] key pressed inside the browser
  146. procedure TfrmInternalBrowser.MsgHandler(var Msg: TMsg; var Handled: Boolean);
  147. const
  148. StdKeys = [VK_BACK, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT];
  149. var
  150. IOIPAO: IOleInPlaceActiveObject;
  151. Dispatch: IDispatch;
  152. begin
  153. if InternalBrowser = nil then
  154. begin
  155. Handled := False;
  156. Exit;
  157. end;
  158. Handled := (IsDialogMessage(InternalBrowser.Handle, Msg) = True);
  159. if (Handled) and (not InternalBrowser.Busy) then
  160. begin
  161. if FOleInPlaceActiveObject = nil then
  162. begin
  163. Dispatch := InternalBrowser.Application;
  164. if Dispatch <> nil then
  165. begin
  166. Dispatch.QueryInterface(IOleInPlaceActiveObject, IOIPAO);
  167. if IOIPAO <> nil then FOleInPlaceActiveObject := IOIPAO;
  168. end;
  169. end;
  170. if FOleInPlaceActiveObject <> nil then
  171. begin
  172. // Next/Previous mouse buttons handling
  173. if Msg.message = WM_XBUTTONUP then
  174. begin
  175. if Msg.wParam = MOUSE_XBUTTONPREV then
  176. actBackTo.Execute
  177. else if Msg.wParam = MOUSE_XBUTTONNEXT then
  178. actFowardTo.Execute;
  179. end;
  180. if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
  181. (Msg.wParam in StdKeys) then
  182. //nothing - do not pass on Backspace, Left, Right, Up, Down arrows
  183. else FOleInPlaceActiveObject.TranslateAccelerator(Msg);
  184. end;
  185. end;
  186. end;
  187. procedure TfrmInternalBrowser.AddURLToList(URL: String);
  188. var
  189. x: Integer;
  190. pURLDateTime: TURLDateTime;
  191. pRingButton: TJvOutlookBarButton;
  192. bFound: Boolean;
  193. begin
  194. // Initialize to false
  195. bFound := False;
  196. // Try to find string in the list
  197. for x := 0 to cboURL.Items.Count - 1 do
  198. begin
  199. // Set found flag to true if got match
  200. if cboURL.Items.Strings[x] = URL then
  201. begin
  202. bFound := True;
  203. break;
  204. end;
  205. end;
  206. // Add url to current list if not found
  207. if not bFound then
  208. begin
  209. pURLDateTime := TURLDateTime.Create(Now);
  210. cboURL.AddItem(URL, pURLDateTime);
  211. pRingButton := frmRings.jvRings.Pages[JVPAGE_RING_BRWHISTORY].Buttons.Add;
  212. pRingButton.Caption := URL;
  213. pRingButton.OnClick := btnXHistoryClick;
  214. end;
  215. end;
  216. procedure TfrmInternalBrowser.actBackToExecute(Sender: TObject);
  217. begin
  218. InternalBrowser.GoBack;
  219. end;
  220. procedure TfrmInternalBrowser.actFowardToExecute(Sender: TObject);
  221. begin
  222. InternalBrowser.GoForward;
  223. end;
  224. procedure TfrmInternalBrowser.actHomeExecute(Sender: TObject);
  225. begin
  226. if HomePage = '' then
  227. InternalBrowser.GoHome
  228. else
  229. InternalBrowser.Navigate(HomePage);
  230. end;
  231. procedure TfrmInternalBrowser.actStopExecute(Sender: TObject);
  232. begin
  233. InternalBrowser.Stop;
  234. end;
  235. procedure TfrmInternalBrowser.actRefreshExecute(Sender: TObject);
  236. begin
  237. InternalBrowser.Refresh2;
  238. end;
  239. procedure TfrmInternalBrowser.actSearchExecute(Sender: TObject);
  240. begin
  241. if SearchPage = '' then
  242. InternalBrowser.GoSearch
  243. else
  244. InternalBrowser.Navigate(SearchPage);
  245. end;
  246. procedure TfrmInternalBrowser.actGoExecute(Sender: TObject);
  247. begin
  248. if cboURL.Text <> '' then
  249. InternalBrowser.Navigate(cboURL.Text);
  250. end;
  251. procedure TfrmInternalBrowser.InternalBrowserCommandStateChange(Sender: TObject; Command: Integer; Enable: WordBool);
  252. begin
  253. case Command of
  254. CSC_NAVIGATEBACK: actBackTo.Enabled := Enable;
  255. CSC_NAVIGATEFORWARD: actFowardTo.Enabled := Enable;
  256. CSC_UPDATECOMMANDS: actStop.Enabled := Enable;
  257. end;
  258. end;
  259. procedure TfrmInternalBrowser.InternalBrowserBeforeNavigate2(Sender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool);
  260. begin
  261. jvgifBrowser.Animate := True;
  262. end;
  263. procedure TfrmInternalBrowser.cboURLKeyPress(Sender: TObject; var Key: Char);
  264. begin
  265. if Ord(Key) = VK_RETURN then
  266. actGo.Execute;
  267. end;
  268. procedure TfrmInternalBrowser.FormShow(Sender: TObject);
  269. begin
  270. if IsFirstTime then
  271. begin
  272. IsFirstTime := False;
  273. actHome.Execute;
  274. end;
  275. end;
  276. procedure TfrmInternalBrowser.InternalBrowserDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  277. begin
  278. if InternalBrowser.ReadyState = READYSTATE_COMPLETE then
  279. begin
  280. jvgifBrowser.Animate := False;
  281. cboURL.Text := URL;
  282. AddURLToList(URL);
  283. end;
  284. end;
  285. initialization
  286. OleInitialize(nil);
  287. finalization
  288. OleUninitialize
  289. end.