/vendor/jvcl/examples/JvItemViewer/MainFrm.pas

http://my-chuanqi.googlecode.com/ · Pascal · 522 lines · 426 code · 49 blank · 47 comment · 32 complexity · 7c8efbe77e5bd3924aed78853cacd862 MD5 · raw file

  1. {******************************************************************
  2. JEDI-VCL Demo
  3. Copyright (C) 2002 Project JEDI
  4. Original author:
  5. Contributor(s):
  6. You may retrieve the latest version of this file at the JEDI-JVCL
  7. home page, located at http://jvcl.sourceforge.net
  8. The contents of this file are used with permission, subject to
  9. the Mozilla Public License Version 1.1 (the "License"); you may
  10. not use this file except in compliance with the License. You may
  11. obtain a copy of the License at
  12. http://www.mozilla.org/MPL/MPL-1_1Final.html
  13. Software distributed under the License is distributed on an
  14. "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  15. implied. See the License for the specific language governing
  16. rights and limitations under the License.
  17. ******************************************************************}
  18. unit MainFrm;
  19. {$I jvcl.inc}
  20. interface
  21. uses
  22. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  23. Dialogs, StdCtrls, Mask, ExtCtrls, ImgList, ComCtrls, Menus,
  24. JvToolEdit,
  25. jpeg, JvPCX, JvGIF, JvAni, JvCursor,
  26. // if you have units that supports other image formats, add them here *before* including JvItemViewer
  27. // GraphicEx, // http://www.delphi-gems.com/Graphics.php#GraphicEx
  28. JvCustomItemViewer, JvImagesViewer, JvImageListViewer, JvOwnerDrawViewer, JvComponent,
  29. JvInspector, JvExMask;
  30. type
  31. TfrmMain = class(TForm)
  32. pnlSettings: TPanel;
  33. edDirectory: TJvDirectoryEdit;
  34. lblFolder: TLabel;
  35. lblFilemask: TLabel;
  36. edFileMask: TEdit;
  37. StatusBar1: TStatusBar;
  38. ImageList1: TImageList;
  39. pgViewers: TPageControl;
  40. tabIFViewer: TTabSheet;
  41. tabILViewer: TTabSheet;
  42. tabODViewer: TTabSheet;
  43. PopupMenu1: TPopupMenu;
  44. Reload1: TMenuItem;
  45. Viewfromfile1: TMenuItem;
  46. Viewfrompicture1: TMenuItem;
  47. N1: TMenuItem;
  48. Splitter1: TSplitter;
  49. btnUpdate: TButton;
  50. Rename1: TMenuItem;
  51. Delete1: TMenuItem;
  52. N2: TMenuItem;
  53. chkDisconnect: TCheckBox;
  54. SelectAll1: TMenuItem;
  55. procedure btnUpdateClick(Sender: TObject);
  56. procedure FormCreate(Sender: TObject);
  57. procedure Reload1Click(Sender: TObject);
  58. procedure Viewfromfile1Click(Sender: TObject);
  59. procedure Viewfrompicture1Click(Sender: TObject);
  60. procedure pgViewersChange(Sender: TObject);
  61. procedure edDirectoryChange(Sender: TObject);
  62. procedure Rename1Click(Sender: TObject);
  63. procedure Delete1Click(Sender: TObject);
  64. procedure chkDisconnectClick(Sender: TObject);
  65. procedure SelectAll1Click(Sender: TObject);
  66. private
  67. FDragIndex: Integer;
  68. procedure BuildColorList;
  69. procedure SetDisplayDragImage(AControl: TControl);
  70. procedure DoITV2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
  71. procedure DoITV2DragDrop(Sender, Source: TObject; X, Y: Integer);
  72. procedure DoITV2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  73. procedure DoITV2GetCaption(Sender: TObject; ImageIndex: Integer; var ACaption: WideString);
  74. procedure DoITV3ItemHint(Sender: TObject; Index: Integer;
  75. var HintInfo: THintInfo; var Handled: Boolean);
  76. procedure DoITVClick(Sender: TObject);
  77. procedure DoITVDblClick(Sender: TObject);
  78. procedure DITVLoadBegin(Sender: TObject);
  79. procedure DoITVLoadEnd(Sender: TObject);
  80. procedure DoITVLoadProgress(Sender: TObject; Item: TJvPictureItem; Stage: TProgressStage;
  81. PercentDone: Byte; RedrawNow: Boolean; const R: TRect; const Msg: string);
  82. procedure DoITV3DrawItem(Sender: TObject; AIndex: Integer; AState: TCustomDrawState; ACanvas: TCanvas; ItemRect,
  83. TextRect: TRect);
  84. procedure DoITV3Click(Sender: TObject);
  85. procedure ViewItem(Item: TJvPictureItem; LoadFromFile: Boolean);
  86. public
  87. ITV: TJvImagesViewer;
  88. ITV2: TJvImageListViewer;
  89. ITV3: TJvOwnerDrawViewer;
  90. AInspector: TJvInspector;
  91. APainter: TJvInspectorBorlandPainter;
  92. end;
  93. var
  94. frmMain: TfrmMain;
  95. implementation
  96. uses
  97. JvConsts, // for clMoneyGreen
  98. CommCtrl, Consts,
  99. {$IFNDEF COMPILER6_UP}
  100. FileCtrl,
  101. {$ENDIF}
  102. JclRegistry,
  103. ViewerFrm;
  104. {$R *.dfm}
  105. //=== TfrmMain ===============================================================
  106. procedure TfrmMain.DoITV3DrawItem(Sender: TObject; AIndex: Integer; AState: TCustomDrawState; ACanvas:
  107. TCanvas; ItemRect, TextRect: TRect);
  108. var
  109. AColor: TColor;
  110. begin
  111. AColor := TColor(ITV3.Items[AIndex].Data);
  112. ACanvas.Brush.Color := AColor;
  113. ACanvas.FillRect(ItemRect);
  114. ACanvas.Pen.Style := psSolid;
  115. if [cdsSelected, cdsHot] * AState <> [] then
  116. begin
  117. ACanvas.Pen.Color := clHighlight;
  118. ACanvas.Pen.Width := 2;
  119. Inc(ItemRect.Left);
  120. Inc(ItemRect.Top);
  121. ACanvas.Rectangle(ItemRect);
  122. Dec(ItemRect.Left);
  123. Dec(ItemRect.Top);
  124. end
  125. else
  126. begin
  127. ACanvas.Pen.Style := psSolid;
  128. ACanvas.Pen.Color := clBlack;
  129. ACanvas.Pen.Width := 1;
  130. ACanvas.Rectangle(ItemRect);
  131. end;
  132. end;
  133. procedure TfrmMain.btnUpdateClick(Sender: TObject);
  134. begin
  135. Screen.Cursor := crHourGlass;
  136. try
  137. ITV.Directory := edDirectory.Text;
  138. ITV.FileMask := edFileMask.Text;
  139. AInspector.InspectObject := nil;
  140. AInspector.BeginUpdate;
  141. ITV.LoadImages;
  142. AInspector.InspectObject := ITV;
  143. AInspector.EndUpdate;
  144. StatusBar1.Panels[0].Text := Format(' %d images found and loaded', [ITV.Count]);
  145. finally
  146. Screen.Cursor := crDefault;
  147. end;
  148. end;
  149. procedure TfrmMain.FormCreate(Sender: TObject);
  150. begin
  151. Randomize;
  152. SetDisplayDragImage(Self);
  153. APainter := TJvInspectorBorlandPainter.Create(Self);
  154. AInspector := TJvInspector.Create(Self);
  155. AInspector.Parent := Self;
  156. AInspector.Left := -100;
  157. AInspector.Width := StatusBar1.Panels[0].Width - 2;
  158. AInspector.Parent := Self;
  159. AInspector.Align := alLeft;
  160. AInspector.Painter := APainter;
  161. ITV := TJvImagesViewer.Create(Self);
  162. ITV.Align := alClient;
  163. ITV.PopupMenu := PopupMenu1;
  164. // ITV.Cursor := crHandPoint;
  165. ITV.Options.RightClickSelect := True;
  166. ITV.Options.ImagePadding := 8;
  167. ITV.Options.MultiSelect := True;
  168. ITV.Options.HotTrack := True;
  169. // ITV.Options.Smooth := True; // don't use smooth with images - looks ugly when scrolling
  170. ITV.OnDblClick := DoITVDblClick;
  171. ITV.OnClick := DoITVClick;
  172. ITV.OnLoadBegin := DITVLoadBegin;
  173. ITV.OnLoadEnd := DoITVLoadEnd;
  174. ITV.OnLoadProgress := DoITVLoadProgress;
  175. ITV.Parent := tabIFViewer;
  176. ITV.Color := clWindow;
  177. if edFileMask.Text = '' then
  178. edFileMask.Text := ITV.Filemask;
  179. ITV2 := TJvImageListViewer.Create(Self);
  180. ITV2.Align := alClient;
  181. ITV2.Options.Width := ImageList1.Width * 2;
  182. ITV2.Options.Height := ImageList1.Height * 2;
  183. ITV2.Options.FillCaption := False;
  184. ITV2.Options.BrushPattern.Active := False;
  185. // ITV2.Options.BrushPattern.OddColor := clHighlight;
  186. ITV2.Images := ImageList1;
  187. ITV2.Parent := tabILViewer;
  188. // ITV2.Options.BrushPattern.OddColor := clHighlight;
  189. // ITV2.Options.BrushPattern.Active := False;
  190. ITV2.OnMouseDown := DoITV2MouseDown;
  191. ITV2.OnDragOver := DoITV2DragOver;
  192. ITV2.OnDragDrop := DoITV2DragDrop;
  193. ITV2.OnGetCaption := DoITV2GetCaption;
  194. ITV2.Color := clWindow;
  195. ITV2.Options.ShowCaptions := True;
  196. ITV3 := TJvOwnerDrawViewer.Create(Self);
  197. ITV3.Options.Smooth := True; // Smooth looks OK here, because these items renders faster
  198. ITV3.Options.HotTrack := False;
  199. ITV3.Options.Width := 18;
  200. ITV3.Options.Height := 18;
  201. ITV3.Options.VertSpacing := 2;
  202. ITV3.Options.HorzSpacing := 2;
  203. ITV3.Align := alClient;
  204. ITV3.OnDrawItem := DoITV3DrawItem;
  205. ITV3.OnClick := DoITV3Click;
  206. ITV3.OnItemHint := DoITV3ItemHint;
  207. ITV3.ShowHint := true;
  208. // ITV3.Count := tbThumbSize.Position;
  209. ITV3.Parent := tabODViewer;
  210. ITV3.Color := clWindow;
  211. // add colors to TJvOwnerDrawViewer
  212. BuildColorList;
  213. if edDirectory.Text = '' then
  214. begin
  215. // this triggers the OnChange event
  216. edDirectory.Text := RegReadString(HKEY_CURRENT_USER,
  217. 'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'My Pictures');
  218. if edDirectory.Text = '' then
  219. edDirectory.Text := GetCurrentDir;
  220. end;
  221. pgViewersChange(nil);
  222. end;
  223. procedure TfrmMain.DoITVClick(Sender: TObject);
  224. begin
  225. if ITV.SelectedIndex > -1 then
  226. StatusBar1.Panels[1].Text := ' ' + ITV.Items[ITV.SelectedIndex].FileName
  227. else
  228. StatusBar1.Panels[1].Text := '';
  229. end;
  230. procedure TfrmMain.DITVLoadBegin(Sender: TObject);
  231. begin
  232. Screen.Cursor := crHourGlass;
  233. end;
  234. procedure TfrmMain.BuildColorList;
  235. var
  236. I, J: Cardinal;
  237. begin
  238. // example of storing stuff in item's Data property
  239. ITV3.Count := $3FFF;
  240. Randomize;
  241. for I := 0 to $3FFE do
  242. begin
  243. J := ($3FFE - I) + 500;
  244. ITV3.Items[I].Data := Pointer(RGB(Random(J) mod 256, Random(J) mod 256, Random(J) mod 256));
  245. end;
  246. end;
  247. procedure TfrmMain.DoITV2MouseDown(Sender: TObject; Button: TMouseButton;
  248. Shift: TShiftState; X, Y: Integer);
  249. begin
  250. if Button = mbLeft then
  251. begin
  252. FDragIndex := ITV2.ItemAtPos(X, Y, True);
  253. if FDragIndex > -1 then
  254. ITV2.BeginDrag(False, 10);
  255. end;
  256. // ITV2.Invalidate;
  257. end;
  258. procedure TfrmMain.DoITV2DragOver(Sender, Source: TObject; X, Y: Integer;
  259. State: TDragState; var Accept: Boolean);
  260. //var
  261. // I: Integer;
  262. begin
  263. Accept := Source = ITV2;
  264. // I := ITV2.ItemAtPos(X, Y);
  265. // if I > -1 then
  266. // ITV2.SelectedIndex := I;
  267. end;
  268. procedure TfrmMain.DoITV2DragDrop(Sender, Source: TObject; X, Y: Integer);
  269. var
  270. I: Integer;
  271. begin
  272. I := ITV2.ItemAtPos(X, Y, False);
  273. if I >= ITV2.Images.Count then
  274. I := ITV2.Images.Count - 1;
  275. if (I > -1) and (I <> FDragIndex) then
  276. ITV2.Images.Move(FDragIndex, I);
  277. ITV2.SelectedIndex := I;
  278. end;
  279. procedure TfrmMain.Reload1Click(Sender: TObject);
  280. begin
  281. if ITV.SelectedIndex >= 0 then
  282. begin
  283. ITV.Items[ITV.SelectedIndex].Picture := nil;
  284. ITV.Invalidate;
  285. end;
  286. end;
  287. procedure TfrmMain.DoITVDblClick(Sender: TObject);
  288. begin
  289. Viewfrompicture1Click(Sender);
  290. end;
  291. procedure TfrmMain.ViewItem(Item: TJvPictureItem; LoadFromFile: Boolean);
  292. begin
  293. if LoadFromFile and FileExists(Item.FileName) then
  294. TfrmImageViewer.View(Item.FileName, ITV.Options.Transparent, ITV.Color)
  295. else
  296. TfrmImageViewer.View(Item.Picture, ITV.Options.Transparent, ITV.Color);
  297. end;
  298. procedure TfrmMain.Viewfromfile1Click(Sender: TObject);
  299. var
  300. Item: TJvPictureItem;
  301. begin
  302. if ITV.Focused and (ITV.SelectedIndex >= 0) then
  303. begin
  304. Item := ITV.Items[ITV.SelectedIndex];
  305. ViewItem(Item, True);
  306. end;
  307. end;
  308. procedure TfrmMain.Viewfrompicture1Click(Sender: TObject);
  309. var
  310. Item: TJvPictureItem;
  311. begin
  312. if ITV.Focused and (ITV.SelectedIndex >= 0) then
  313. begin
  314. Item := ITV.Items[ITV.SelectedIndex];
  315. ViewItem(Item, False);
  316. end;
  317. end;
  318. procedure TfrmMain.DoITVLoadProgress(Sender: TObject; Item: TJvPictureItem;
  319. Stage: TProgressStage; PercentDone: Byte; RedrawNow: Boolean;
  320. const R: TRect; const Msg: string);
  321. begin
  322. if PercentDone >= 100 then
  323. StatusBar1.Panels[1].Text := ''
  324. else
  325. StatusBar1.Panels[1].Text := Format(' Loading "%s", %d%% done...', [Item.FileName, PercentDone]);
  326. StatusBar1.Update;
  327. end;
  328. procedure TfrmMain.DoITVLoadEnd(Sender: TObject);
  329. var
  330. I: Integer;
  331. begin
  332. Screen.Cursor := crDefault;
  333. pgViewersChange(Sender);
  334. for I := 0 to ITV.Count - 1 do
  335. if Assigned(ITV.Items[I].Picture) and Assigned(ITV.Items[I].Picture.Graphic) and
  336. (ITV.Items[I].Picture.Graphic is TJvAni) then
  337. TJvAni(ITV.Items[I].Picture.Graphic).Animated := True;
  338. end;
  339. procedure EnableControls(AControl: TControl; Enable: Boolean);
  340. var
  341. I: Integer;
  342. begin
  343. AControl.Enabled := Enable;
  344. if AControl is TWinControl then
  345. for I := 0 to TWinControl(AControl).ControlCount - 1 do
  346. EnableControls(TWinControl(AControl).Controls[I], Enable);
  347. end;
  348. procedure TfrmMain.pgViewersChange(Sender: TObject);
  349. begin
  350. case pgViewers.ActivePageIndex of
  351. 0:
  352. begin
  353. EnableControls(pnlSettings, True);
  354. Statusbar1.Panels[1].Text := ' Double-click to view full size, right-click for popup menu';
  355. AInspector.InspectObject := ITV;
  356. end;
  357. 1:
  358. begin
  359. EnableControls(pnlSettings, False);
  360. Statusbar1.Panels[1].Text := ' Drag and drop images to rearrange';
  361. AInspector.InspectObject := ITV2;
  362. end;
  363. 2:
  364. begin
  365. EnableControls(pnlSettings, False);
  366. Statusbar1.Panels[1].Text := ' Click color square to see its color value in status bar';
  367. AInspector.InspectObject := ITV3;
  368. end;
  369. end;
  370. end;
  371. procedure TfrmMain.DoITV3Click(Sender: TObject);
  372. begin
  373. if (ITV3.SelectedIndex >= 0) and (ITV3.SelectedIndex < ITV3.Count) then
  374. StatusBar1.Panels[0].Text := ColorToString(TColor(ITV3.Items[ITV3.SelectedIndex].Data));
  375. end;
  376. procedure TfrmMain.DoITV2GetCaption(Sender: TObject; ImageIndex: Integer;
  377. var ACaption: WideString);
  378. begin
  379. if ITV2.Options.ShowCaptions then
  380. begin
  381. if Odd(ImageIndex) then
  382. ACaption := Format('#%d', [ImageIndex])
  383. else
  384. ACaption := Format('$%x', [ImageIndex])
  385. end;
  386. end;
  387. procedure TfrmMain.edDirectoryChange(Sender: TObject);
  388. begin
  389. if DirectoryExists(edDirectory.Text) then
  390. btnUpdate.Click;
  391. end;
  392. procedure TfrmMain.Rename1Click(Sender: TObject);
  393. var
  394. S: string;
  395. AItem: TJvPictureItem;
  396. begin
  397. if ITV.SelectedIndex < 0 then
  398. Exit;
  399. AItem := ITV.Items[ITV.SelectedIndex];
  400. S := AItem.FileName;
  401. if InputQuery('Rename', 'New name', S) and not AnsiSameText(AItem.FileName, S) then
  402. begin
  403. S := ExpandUNCFileName(S);
  404. if RenameFile(ITV.ITems[ITV.SelectedIndex].FileName, S) then
  405. begin
  406. AItem.FileName := S;
  407. AItem.Caption := ExtractFileName(S);
  408. end
  409. else
  410. ShowMessage('Could not rename file!');
  411. end;
  412. end;
  413. procedure TfrmMain.Delete1Click(Sender: TObject);
  414. var
  415. AItem: TJvPictureItem;
  416. begin
  417. if ITV.SelectedIndex < 0 then
  418. Exit;
  419. if MessageDlg('Are you sure you want to delete the selected file?',
  420. mtConfirmation, [mbYes, mbNo], 0) = mrYEs then
  421. begin
  422. AItem := ITV.Items[ITV.SelectedIndex];
  423. if not DeleteFile(AItem.FileName) then
  424. ShowMessage('Could not delete the file!')
  425. else
  426. AItem.Delete;
  427. end;
  428. end;
  429. procedure TfrmMain.chkDisconnectClick(Sender: TObject);
  430. begin
  431. if chkDisconnect.Checked then
  432. begin
  433. AInspector.InspectObject := nil;
  434. AInspector.Visible := False;
  435. end
  436. else
  437. begin
  438. AInspector.Visible := True;
  439. pgViewersChange(Sender);
  440. end;
  441. end;
  442. procedure TfrmMain.SetDisplayDragImage(AControl: TControl);
  443. var
  444. I: Integer;
  445. begin
  446. AControl.ControlStyle := AControl.ControlStyle + [csDisplayDragImage];
  447. if AControl is TWinControl then
  448. for I := 0 to TWinControl(AControl).ControlCOunt - 1 do
  449. SetDisplayDragImage(TWinControl(AControl).Controls[I]);
  450. end;
  451. procedure TfrmMain.SelectAll1Click(Sender: TObject);
  452. begin
  453. ITV.SelectAll;
  454. end;
  455. procedure TfrmMain.DoITV3ItemHint(Sender: TObject; Index: Integer;
  456. var HintInfo: THintInfo; var Handled: Boolean);
  457. var
  458. AColor: TColor;
  459. begin
  460. AColor := TColor(ITV3.Items[Index].Data);
  461. HintInfo.HintColor := AColor;
  462. HintInfo.HintStr := ColorToString(AColor);
  463. Handled := true;
  464. end;
  465. end.