home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 December / Chip_2001-12_cd1.bin / zkuste / delphi / kolekce / d3456 / ALEXSOFT.ZIP / IMGEDT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-09-29  |  11.4 KB  |  377 lines

  1. (*////////////////////////////////////////////////////////////////////////////
  2. //   Part of AlexSoft VCL/DLL Library.                                      //
  3. //   All rights reserved. (c) Copyright 1998.                               //
  4. //   Created by: Alex Rabichooc                                             //
  5. //**************************************************************************//
  6. //  Users of this unit must accept this disclaimer of warranty:             //
  7. //    "This unit is supplied as is. The author disclaims all warranties,    //
  8. //    expressed or implied, including, without limitation, the warranties   //
  9. //    of merchantability and of fitness for any purpose.                    //
  10. //    The author assumes no liability for damages, direct or                //
  11. //    consequential, which may result from the use of this unit."           //
  12. //                                                                          //
  13. //  This Unit is donated to the public as public domain.                    //
  14. //                                                                          //
  15. //  This Unit can be freely used and distributed in commercial and          //
  16. //  private environments provided this notice is not modified in any way.   //
  17. //                                                                          //
  18. //  If you do find this Unit handy and you feel guilty for using such a     //
  19. //  great product without paying someone - sorry :-)                        //
  20. //                                                                          //
  21. //  Please forward any comments or suggestions to Alex Rabichooc at:        //
  22. //                                                                          //
  23. //  a_rabichooc@yahoo.com or alex@carmez.mldnet.com                         //
  24. /////////////////////////////////////////////////////////////////////////////*)
  25.  
  26. unit ImgEdt;
  27.  
  28. interface
  29.  
  30. uses
  31.   SysUtils, Windows, Messages, Classes, Graphics, Controls,
  32.   Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Menus, ComCtrls, ClipBrd,
  33.   ToolWin, Db, DBTables, DBCtrls, RichEdit, DBxNav{$IFNDEF VER100}, ImgList{$ENDIF};
  34.  
  35. type
  36.   TImageEditor = class(TForm)
  37.     MainMenu: TMainMenu;
  38.     FileOpenItem: TMenuItem;
  39.     FileSaveItem: TMenuItem;
  40.     FileExitItem: TMenuItem;
  41.     EditUndoItem: TMenuItem;
  42.     EditCutItem: TMenuItem;
  43.     EditCopyItem: TMenuItem;
  44.     EditPasteItem: TMenuItem;
  45.     OpenDialog: TOpenDialog;
  46.     SaveDialog: TSaveDialog;
  47.     StatusBar: TStatusBar;
  48.     ToolBar: TToolBar;
  49.     OpenButton: TToolButton;
  50.     SaveButton: TToolButton;
  51.     ToolButton5: TToolButton;
  52.     UndoButton: TToolButton;
  53.     CutButton: TToolButton;
  54.     CopyButton: TToolButton;
  55.     PasteButton: TToolButton;
  56.     ToolbarImages: TImageList;
  57.     DataSource: TDataSource;
  58.     Editor: TDBImage;
  59.     N3: TMenuItem;
  60.     EmptyButton: TToolButton;
  61.     procedure FormCreate(Sender: TObject);
  62.     procedure ShowHint(Sender: TObject);
  63.     procedure FileOpen(Sender: TObject);
  64.     procedure FileSave(Sender: TObject);
  65.     procedure FileSaveAs(Sender: TObject);
  66.     procedure FileExit(Sender: TObject);
  67.     procedure EditUndo(Sender: TObject);
  68.     procedure EditCut(Sender: TObject);
  69.     procedure EditCopy(Sender: TObject);
  70.     procedure EditPaste(Sender: TObject);
  71.     procedure HelpContents(Sender: TObject);
  72.     procedure HelpSearch(Sender: TObject);
  73.     procedure HelpHowToUse(Sender: TObject);
  74.     procedure FormShow(Sender: TObject);
  75.     procedure FormDestroy(Sender: TObject);
  76.     procedure DataSourceDataChange(Sender: TObject; Field: TField);
  77.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  78.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  79.     procedure EmptyButtonClick(Sender: TObject);
  80.   private
  81.     FFieldName: string;
  82.     FClipboardOwner: HWnd;
  83.     FOnIdle: TIdleEvent;
  84.     FOnHint: TNotifyEvent;
  85.     procedure OnIdle(Sender: TObject; var Done: Boolean);
  86.     procedure ClipboardChanged;
  87.     procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  88.     procedure WMChangeCBChain(var Msg: TWMChangeCBChain); message WM_CHANGECBCHAIN;
  89.     procedure WMDrawClipboard(var Msg: TWMDrawClipboard); message WM_DRAWCLIPBOARD;
  90.     procedure PerformFileOpen(const AFileName: string);
  91.     procedure SetModified(Value: Boolean);
  92.     procedure ReadStatusKeys;
  93.   public
  94.     constructor CreateWithField(AOwner: TComponent; AField: TField); virtual;
  95.   end;
  96.  
  97. var
  98.   ImageEditor: TImageEditor;
  99.  
  100. implementation
  101.  
  102. uses ShellAPI, Printers, DbXCnsts
  103.      {$IFDEF VER140}
  104.       , Variants
  105.      {$ENDIF};
  106.  
  107. {$R *.DFM}
  108.  
  109. constructor TImageEditor.CreateWithField(AOwner: TComponent; AField: TField);
  110. begin
  111.    Create(AOwner);
  112.    with Editor do
  113.    if AField <> nil then
  114.    begin
  115.       DataSource.DataSet := AField.DataSet;
  116.       DataField := AField.FieldName;
  117.    end;
  118. end;
  119.  
  120. procedure TImageEditor.OnIdle(Sender: TObject; var Done: Boolean);
  121. begin
  122.    if Assigned(FOnIdle) then
  123.       FOnIdle(Sender, Done);
  124.    ReadStatusKeys;
  125. end;
  126.  
  127. procedure TImageEditor.ReadStatusKeys;
  128. var PanelID : Byte;
  129.     Text    : String;
  130.     Key: Word;
  131. begin
  132.   Key := 0;
  133.   for PanelID := 0 to 2 do
  134.   begin
  135.      case PanelID of
  136.        0: begin
  137.              Text := 'NUM';
  138.              Key := vk_NumLock;
  139.           end;
  140.        1: begin
  141.              Text := 'CAPS';
  142.              Key := vk_Capital;
  143.           end;
  144.        2: begin
  145.              Text := 'SCR';
  146.              Key := vk_Scroll;
  147.           end;
  148.      end;
  149.      if GetKeyState(Key) MOD 2 = 0 then
  150.             Text := '';
  151.      StatusBar.Panels.Items[PanelID].Text:=Text;
  152.   end;
  153. end;
  154.  
  155. { Event Handlers }
  156.  
  157. procedure TImageEditor.FormCreate(Sender: TObject);
  158. var ParentForm: TCustomForm;
  159. begin
  160.   if (Owner is TWinControl) then
  161.   begin
  162.      ParentForm := GetParentForm(Owner as TWinControl);
  163.      if ParentForm <> nil then
  164.        Font := ParentForm.Font;
  165.   end;
  166.   FOnHint := Application.OnHint;
  167.   FOnIdle := Application.OnIdle;
  168.   Application.OnHint := ShowHint;
  169.   Application.OnIdle := OnIdle;
  170.   OpenDialog.InitialDir := ExtractFilePath(ParamStr(0));
  171.   SaveDialog.InitialDir := OpenDialog.InitialDir;
  172.   FClipboardOwner := SetClipboardViewer(Handle);
  173.   DataSourceDataChange(Self, Editor.Field);
  174. end;
  175.  
  176. procedure TImageEditor.ShowHint(Sender: TObject);
  177. begin
  178.   if Length(Application.Hint) > 0 then
  179.   begin
  180.     StatusBar.SimplePanel := True;
  181.     StatusBar.SimpleText := Application.Hint;
  182.   end
  183.   else StatusBar.SimplePanel := False;
  184. end;
  185.  
  186. procedure TImageEditor.PerformFileOpen(const AFileName: string);
  187. begin
  188.   if (Editor.Field <> nil) and Editor.Field.DataSet.CanModify then
  189.      Editor.Field.DataSet.Edit
  190.     else
  191.      exit;
  192.   Editor.Picture.LoadFromFile(AFileName);
  193. end;
  194.  
  195. procedure TImageEditor.FileOpen(Sender: TObject);
  196. begin
  197.   if (Editor.Field = nil) or not Editor.Field.DataSet.CanModify then
  198.      exit;
  199.   if OpenDialog.Execute then
  200.   begin
  201.     PerformFileOpen(OpenDialog.FileName);
  202.     Editor.ReadOnly := (ofReadOnly in OpenDialog.Options) or
  203.                                 Editor.Field.ReadOnly;
  204.   end;
  205. end;
  206.  
  207. procedure TImageEditor.FileSave(Sender: TObject);
  208. begin
  209.   if SaveDialog.Execute then
  210.   begin
  211.      if FileExists(SaveDialog.FileName) then
  212.        if MessageDlg(Format(SOverWriteConfirm,
  213.           [SaveDialog.FileName]), mtConfirmation, mbYesNoCancel, 0) <> idYes then
  214.        Exit;
  215.      Editor.Picture.SaveToFile(SaveDialog.FileName);
  216.   end;
  217. end;
  218.  
  219. procedure TImageEditor.FileSaveAs(Sender: TObject);
  220. begin
  221.   FileSave(Sender);
  222. end;
  223.  
  224. procedure TImageEditor.FileExit(Sender: TObject);
  225. begin
  226.   Close;
  227. end;
  228.  
  229. procedure TImageEditor.EditUndo(Sender: TObject);
  230. begin
  231.   if Editor.Field <> nil then
  232.       Editor.Field.DataSet.Cancel;
  233. end;
  234.  
  235. procedure TImageEditor.EditCut(Sender: TObject);
  236. begin
  237.   Editor.CutToClipboard;
  238. end;
  239.  
  240. procedure TImageEditor.EditCopy(Sender: TObject);
  241. begin
  242.   Editor.CopyToClipboard;
  243. end;
  244.  
  245. procedure TImageEditor.EditPaste(Sender: TObject);
  246. begin
  247.   if (Editor.Field <> nil) and Editor.Field.DataSet.CanModify then
  248.      Editor.Field.DataSet.Edit
  249.     else
  250.      exit;
  251.   Editor.PasteFromClipboard;
  252. end;
  253.  
  254. procedure TImageEditor.HelpContents(Sender: TObject);
  255. begin
  256.   Application.HelpCommand(HELP_CONTENTS, 0);
  257. end;
  258.  
  259. procedure TImageEditor.HelpSearch(Sender: TObject);
  260. const
  261.   EmptyString: PChar = '';
  262. begin
  263.   Application.HelpCommand(HELP_PARTIALKEY, Longint(EmptyString));
  264. end;
  265.  
  266. procedure TImageEditor.HelpHowToUse(Sender: TObject);
  267. begin
  268.   Application.HelpCommand(HELP_HELPONHELP, 0);
  269. end;
  270.  
  271. { Ruler Indent Dragging }
  272. procedure TImageEditor.FormShow(Sender: TObject);
  273. begin
  274.   DragAcceptFiles(Handle, True);
  275.   SetModified(False);
  276.   ClipboardChanged;
  277.  
  278.   // check if we should load a file from the command line
  279.   if (ParamCount > 0) and FileExists(ParamStr(1)) then
  280.     PerformFileOpen(ParamStr(1));
  281.   FFieldName := '';
  282.   if Editor.Field <> nil then
  283.     FFieldName := Editor.Field.DisplayLabel;
  284.    if Length(FFieldName) > 0 then
  285.      Caption := Format('%s - %s', [FFieldName, Application.Title]);
  286. end;
  287.  
  288. procedure TImageEditor.WMDropFiles(var Msg: TWMDropFiles);
  289. var
  290.   CFileName: array[0..MAX_PATH] of Char;
  291. begin
  292.   try
  293.     if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then
  294.     begin
  295.       PerformFileOpen(CFileName);
  296.       Msg.Result := 0;
  297.     end;
  298.   finally
  299.     DragFinish(Msg.Drop);
  300.   end;
  301. end;
  302.  
  303. procedure TImageEditor.SetModified(Value: Boolean);
  304. begin
  305.   if Value then StatusBar.Panels[3].Text := SChanged
  306.   else StatusBar.Panels[3].Text := '';
  307. end;
  308.  
  309. procedure TImageEditor.WMChangeCBChain(var Msg: TWMChangeCBChain);
  310. begin
  311.   if Msg.Remove = FClipboardOwner then FClipboardOwner := Msg.Next
  312.   else SendMessage(FClipboardOwner, WM_CHANGECBCHAIN, Msg.Remove, Msg.Next);
  313.   Msg.Result := 0;
  314. end;
  315.  
  316. procedure TImageEditor.ClipboardChanged;
  317. begin
  318.   PasteButton.Enabled := OpenButton.Enabled;
  319.   EditPasteItem.Enabled := PasteButton.Enabled;
  320. end;
  321.  
  322. procedure TImageEditor.WMDrawClipboard(var Msg: TWMDrawClipboard);
  323. begin
  324.   SendMessage(FClipboardOwner, WM_DRAWCLIPBOARD, 0, 0);
  325.   Msg.Result := 0;
  326.   ClipboardChanged;
  327. end;
  328.  
  329. procedure TImageEditor.FormDestroy(Sender: TObject);
  330. begin
  331.   // remove ourselves from the viewer chain
  332.   ChangeClipboardChain(Handle, FClipboardOwner);
  333.   Application.OnIdle := FOnIdle;
  334.   Application.OnHint := FOnHint;
  335. end;
  336.  
  337. procedure TImageEditor.DataSourceDataChange(Sender: TObject; Field: TField);
  338. begin
  339.    UndoButton.Enabled := (DataSource.DataSet <> nil) and
  340.                                      (DataSource.DataSet.State <> dsBrowse);
  341.    EditUndoItem.Enabled := UndoButton.Enabled;
  342.    SetModified(EditUndoItem.Enabled);
  343.    OpenButton.Enabled := (DataSource.DataSet <> nil) and
  344.                           DataSource.DataSet.CanModify and not Editor.ReadOnly;
  345.    FileOpenItem.Enabled := OpenButton.Enabled;
  346.    CutButton.Enabled := OpenButton.Enabled;
  347.    EditCutItem.Enabled := OpenButton.Enabled;
  348.    EmptyButton.Enabled := OpenButton.Enabled;
  349. end;
  350.  
  351. procedure TImageEditor.FormKeyPress(Sender: TObject; var Key: Char);
  352. begin
  353.    if Key = Char(VK_ESCAPE) then
  354.    begin
  355.       if UndoButton.Enabled then
  356.          UndoButton.Click;
  357.       Key := #0;
  358.    end;
  359. end;
  360.  
  361. procedure TImageEditor.FormClose(Sender: TObject;
  362.   var Action: TCloseAction);
  363. begin
  364.    if UndoButton.Enabled then DataSource.DataSet.Post;
  365. end;
  366.  
  367. procedure TImageEditor.EmptyButtonClick(Sender: TObject);
  368. begin
  369.   if (Editor.Field <> nil) and Editor.Field.DataSet.CanModify then
  370.      Editor.Field.DataSet.Edit
  371.     else
  372.      exit;
  373.   Editor.Field.Value := NULL;
  374. end;
  375.  
  376. end.
  377.