home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 December / Chip_2001-12_cd1.bin / zkuste / delphi / kolekce / d3456 / ALEXSOFT.ZIP / RUSSIAN / IMGEDT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-09-04  |  11.4 KB  |  374 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.  
  104. {$R *.DFM}
  105.  
  106. constructor TImageEditor.CreateWithField(AOwner: TComponent; AField: TField);
  107. begin
  108.    Create(AOwner);
  109.    with Editor do
  110.    if AField <> nil then
  111.    begin
  112.       DataSource.DataSet := AField.DataSet;
  113.       DataField := AField.FieldName;
  114.    end;
  115. end;
  116.  
  117. procedure TImageEditor.OnIdle(Sender: TObject; var Done: Boolean);
  118. begin
  119.    if Assigned(FOnIdle) then
  120.       FOnIdle(Sender, Done);
  121.    ReadStatusKeys;
  122. end;
  123.  
  124. procedure TImageEditor.ReadStatusKeys;
  125. var PanelID : Byte;
  126.     Text    : String;
  127.     Key: Word;
  128. begin
  129.   Key := 0;
  130.   for PanelID := 0 to 2 do
  131.   begin
  132.      case PanelID of
  133.        0: begin
  134.              Text := 'NUM';
  135.              Key := vk_NumLock;
  136.           end;
  137.        1: begin
  138.              Text := 'CAPS';
  139.              Key := vk_Capital;
  140.           end;
  141.        2: begin
  142.              Text := 'SCR';
  143.              Key := vk_Scroll;
  144.           end;
  145.      end;
  146.      if GetKeyState(Key) MOD 2 = 0 then
  147.             Text := '';
  148.      StatusBar.Panels.Items[PanelID].Text:=Text;
  149.   end;
  150. end;
  151.  
  152. { Event Handlers }
  153.  
  154. procedure TImageEditor.FormCreate(Sender: TObject);
  155. var ParentForm: TCustomForm;
  156. begin
  157.   if (Owner is TWinControl) then
  158.   begin
  159.      ParentForm := GetParentForm(Owner as TWinControl);
  160.      if ParentForm <> nil then
  161.        Font := ParentForm.Font;
  162.   end;
  163.   FOnHint := Application.OnHint;
  164.   FOnIdle := Application.OnIdle;
  165.   Application.OnHint := ShowHint;
  166.   Application.OnIdle := OnIdle;
  167.   OpenDialog.InitialDir := ExtractFilePath(ParamStr(0));
  168.   SaveDialog.InitialDir := OpenDialog.InitialDir;
  169.   FClipboardOwner := SetClipboardViewer(Handle);
  170.   DataSourceDataChange(Self, Editor.Field);
  171. end;
  172.  
  173. procedure TImageEditor.ShowHint(Sender: TObject);
  174. begin
  175.   if Length(Application.Hint) > 0 then
  176.   begin
  177.     StatusBar.SimplePanel := True;
  178.     StatusBar.SimpleText := Application.Hint;
  179.   end
  180.   else StatusBar.SimplePanel := False;
  181. end;
  182.  
  183. procedure TImageEditor.PerformFileOpen(const AFileName: string);
  184. begin
  185.   if (Editor.Field <> nil) and Editor.Field.DataSet.CanModify then
  186.      Editor.Field.DataSet.Edit
  187.     else
  188.      exit;
  189.   Editor.Picture.LoadFromFile(AFileName);
  190. end;
  191.  
  192. procedure TImageEditor.FileOpen(Sender: TObject);
  193. begin
  194.   if (Editor.Field = nil) or not Editor.Field.DataSet.CanModify then
  195.      exit;
  196.   if OpenDialog.Execute then
  197.   begin
  198.     PerformFileOpen(OpenDialog.FileName);
  199.     Editor.ReadOnly := (ofReadOnly in OpenDialog.Options) or
  200.                                 Editor.Field.ReadOnly;
  201.   end;
  202. end;
  203.  
  204. procedure TImageEditor.FileSave(Sender: TObject);
  205. begin
  206.   if SaveDialog.Execute then
  207.   begin
  208.      if FileExists(SaveDialog.FileName) then
  209.        if MessageDlg(Format(SOverWriteConfirm,
  210.           [SaveDialog.FileName]), mtConfirmation, mbYesNoCancel, 0) <> idYes then
  211.        Exit;
  212.      Editor.Picture.SaveToFile(SaveDialog.FileName);
  213.   end;
  214. end;
  215.  
  216. procedure TImageEditor.FileSaveAs(Sender: TObject);
  217. begin
  218.   FileSave(Sender);
  219. end;
  220.  
  221. procedure TImageEditor.FileExit(Sender: TObject);
  222. begin
  223.   Close;
  224. end;
  225.  
  226. procedure TImageEditor.EditUndo(Sender: TObject);
  227. begin
  228.   if Editor.Field <> nil then
  229.       Editor.Field.DataSet.Cancel;
  230. end;
  231.  
  232. procedure TImageEditor.EditCut(Sender: TObject);
  233. begin
  234.   Editor.CutToClipboard;
  235. end;
  236.  
  237. procedure TImageEditor.EditCopy(Sender: TObject);
  238. begin
  239.   Editor.CopyToClipboard;
  240. end;
  241.  
  242. procedure TImageEditor.EditPaste(Sender: TObject);
  243. begin
  244.   if (Editor.Field <> nil) and Editor.Field.DataSet.CanModify then
  245.      Editor.Field.DataSet.Edit
  246.     else
  247.      exit;
  248.   Editor.PasteFromClipboard;
  249. end;
  250.  
  251. procedure TImageEditor.HelpContents(Sender: TObject);
  252. begin
  253.   Application.HelpCommand(HELP_CONTENTS, 0);
  254. end;
  255.  
  256. procedure TImageEditor.HelpSearch(Sender: TObject);
  257. const
  258.   EmptyString: PChar = '';
  259. begin
  260.   Application.HelpCommand(HELP_PARTIALKEY, Longint(EmptyString));
  261. end;
  262.  
  263. procedure TImageEditor.HelpHowToUse(Sender: TObject);
  264. begin
  265.   Application.HelpCommand(HELP_HELPONHELP, 0);
  266. end;
  267.  
  268. { Ruler Indent Dragging }
  269. procedure TImageEditor.FormShow(Sender: TObject);
  270. begin
  271.   DragAcceptFiles(Handle, True);
  272.   SetModified(False);
  273.   ClipboardChanged;
  274.  
  275.   // check if we should load a file from the command line
  276.   if (ParamCount > 0) and FileExists(ParamStr(1)) then
  277.     PerformFileOpen(ParamStr(1));
  278.   FFieldName := '';
  279.   if Editor.Field <> nil then
  280.     FFieldName := Editor.Field.DisplayLabel;
  281.    if Length(FFieldName) > 0 then
  282.      Caption := Format('%s - %s', [FFieldName, Application.Title]);
  283. end;
  284.  
  285. procedure TImageEditor.WMDropFiles(var Msg: TWMDropFiles);
  286. var
  287.   CFileName: array[0..MAX_PATH] of Char;
  288. begin
  289.   try
  290.     if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then
  291.     begin
  292.       PerformFileOpen(CFileName);
  293.       Msg.Result := 0;
  294.     end;
  295.   finally
  296.     DragFinish(Msg.Drop);
  297.   end;
  298. end;
  299.  
  300. procedure TImageEditor.SetModified(Value: Boolean);
  301. begin
  302.   if Value then StatusBar.Panels[3].Text := SChanged
  303.   else StatusBar.Panels[3].Text := '';
  304. end;
  305.  
  306. procedure TImageEditor.WMChangeCBChain(var Msg: TWMChangeCBChain);
  307. begin
  308.   if Msg.Remove = FClipboardOwner then FClipboardOwner := Msg.Next
  309.   else SendMessage(FClipboardOwner, WM_CHANGECBCHAIN, Msg.Remove, Msg.Next);
  310.   Msg.Result := 0;
  311. end;
  312.  
  313. procedure TImageEditor.ClipboardChanged;
  314. begin
  315.   PasteButton.Enabled := OpenButton.Enabled;
  316.   EditPasteItem.Enabled := PasteButton.Enabled;
  317. end;
  318.  
  319. procedure TImageEditor.WMDrawClipboard(var Msg: TWMDrawClipboard);
  320. begin
  321.   SendMessage(FClipboardOwner, WM_DRAWCLIPBOARD, 0, 0);
  322.   Msg.Result := 0;
  323.   ClipboardChanged;
  324. end;
  325.  
  326. procedure TImageEditor.FormDestroy(Sender: TObject);
  327. begin
  328.   // remove ourselves from the viewer chain
  329.   ChangeClipboardChain(Handle, FClipboardOwner);
  330.   Application.OnIdle := FOnIdle;
  331.   Application.OnHint := FOnHint;
  332. end;
  333.  
  334. procedure TImageEditor.DataSourceDataChange(Sender: TObject; Field: TField);
  335. begin
  336.    UndoButton.Enabled := (DataSource.DataSet <> nil) and
  337.                                      (DataSource.DataSet.State <> dsBrowse);
  338.    EditUndoItem.Enabled := UndoButton.Enabled;
  339.    SetModified(EditUndoItem.Enabled);
  340.    OpenButton.Enabled := (DataSource.DataSet <> nil) and
  341.                           DataSource.DataSet.CanModify and not Editor.ReadOnly;
  342.    FileOpenItem.Enabled := OpenButton.Enabled;
  343.    CutButton.Enabled := OpenButton.Enabled;
  344.    EditCutItem.Enabled := OpenButton.Enabled;
  345.    EmptyButton.Enabled := OpenButton.Enabled;
  346. end;
  347.  
  348. procedure TImageEditor.FormKeyPress(Sender: TObject; var Key: Char);
  349. begin
  350.    if Key = Char(VK_ESCAPE) then
  351.    begin
  352.       if UndoButton.Enabled then
  353.          UndoButton.Click;
  354.       Key := #0;
  355.    end;
  356. end;
  357.  
  358. procedure TImageEditor.FormClose(Sender: TObject;
  359.   var Action: TCloseAction);
  360. begin
  361.    if UndoButton.Enabled then DataSource.DataSet.Post;
  362. end;
  363.  
  364. procedure TImageEditor.EmptyButtonClick(Sender: TObject);
  365. begin
  366.   if (Editor.Field <> nil) and Editor.Field.DataSet.CanModify then
  367.      Editor.Field.DataSet.Edit
  368.     else
  369.      exit;
  370.   Editor.Field.Value := NULL;
  371. end;
  372.  
  373. end.
  374.