mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 09:39:43 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			228 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{
 | 
						|
 *****************************************************************************
 | 
						|
  See the file COPYING.modifiedLGPL.txt, included in this distribution,
 | 
						|
  for details about the license.
 | 
						|
 *****************************************************************************
 | 
						|
 | 
						|
  Author: Tomas Gregorovic
 | 
						|
 | 
						|
  Abstract:
 | 
						|
    This units defines the Load Image Dialog (TGraphicPropertyEditorForm)
 | 
						|
    for graphic or picture property editor.
 | 
						|
}
 | 
						|
unit GraphicPropEdit;
 | 
						|
 | 
						|
{$mode objfpc}{$H+}
 | 
						|
 | 
						|
interface
 | 
						|
 | 
						|
uses
 | 
						|
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
 | 
						|
  ExtCtrls, Buttons, ButtonPanel, ExtDlgs, ActnList, StdActns, Clipbrd,
 | 
						|
  IDEDialogs, ObjInspStrConsts;
 | 
						|
 | 
						|
type
 | 
						|
 | 
						|
  { TGraphicPropertyEditorForm }
 | 
						|
 | 
						|
  TGraphicPropertyEditorForm = class(TForm)
 | 
						|
    FileOpenAction: TAction;
 | 
						|
    FileSaveAction: TAction;
 | 
						|
    ClearAction: TEditDelete;
 | 
						|
    ActionList: TActionList;
 | 
						|
    CopyButton: TButton;
 | 
						|
    PasteButton: TButton;
 | 
						|
    CopyAction: TEditCopy;
 | 
						|
    PasteAction: TEditPaste;
 | 
						|
    OkCancelButtonPanel: TButtonPanel;
 | 
						|
    ImagePreview: TImage;
 | 
						|
    LoadButton: TButton;
 | 
						|
    LoadSaveBtnPanel: TPanel;
 | 
						|
    OpenDialog: TOpenPictureDialog;
 | 
						|
    SaveButton: TButton;
 | 
						|
    ClearButton: TButton;
 | 
						|
    GroupBox1: TGroupBox;
 | 
						|
    SaveDialog: TSavePictureDialog;
 | 
						|
    ScrollBox: TScrollBox;
 | 
						|
    procedure CopyActionExecute(Sender: TObject);
 | 
						|
    procedure CopyActionUpdate(Sender: TObject);
 | 
						|
    procedure ImagePreviewPaintBackground(ASender: TObject; ACanvas: TCanvas;
 | 
						|
      ARect: TRect);
 | 
						|
    procedure PasteActionExecute(Sender: TObject);
 | 
						|
    procedure PasteActionUpdate(Sender: TObject);
 | 
						|
    procedure ClearActionExecute(Sender: TObject);
 | 
						|
    procedure FormCreate(Sender: TObject);
 | 
						|
    procedure FileOpenActionExecute(Sender: TObject);
 | 
						|
    procedure FileSaveActionExecute(Sender: TObject);
 | 
						|
    procedure FileSaveActionUpdate(Sender: TObject);
 | 
						|
    procedure PictureChanged(Sender: TObject);
 | 
						|
    procedure ScrollBoxResize(Sender: TObject);
 | 
						|
  private
 | 
						|
    FFileName: String;
 | 
						|
    FModified: Boolean;
 | 
						|
    function GetGraphic: TGraphic;
 | 
						|
    procedure SetGraphic(Value: TGraphic);
 | 
						|
    procedure SetCaptionDetail(Value: String);
 | 
						|
  public
 | 
						|
    property CaptionDetail: String write SetCaptionDetail;
 | 
						|
    property FileName: String read FFileName;
 | 
						|
    property Modified: Boolean read FModified;
 | 
						|
    property Graphic: TGraphic read GetGraphic write SetGraphic;
 | 
						|
  end;
 | 
						|
 | 
						|
implementation
 | 
						|
 | 
						|
{$R *.lfm}
 | 
						|
 | 
						|
{ TGraphicPropertyEditorForm }
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.FormCreate(Sender: TObject);
 | 
						|
begin
 | 
						|
  Caption := oisLoadImageDialog;
 | 
						|
  GroupBox1.Caption:=oisPEPicture;
 | 
						|
  OkCancelButtonPanel.OKButton.Caption := oisOK;
 | 
						|
  OkCancelButtonPanel.CancelButton.Caption := oisCancel;
 | 
						|
  CopyAction.Caption := oiStdActEditCopyHeadLine;
 | 
						|
  PasteAction.Caption := oiStdActEditPasteHeadLine;
 | 
						|
  FileOpenAction.Caption := oisLoad;
 | 
						|
  FileSaveAction.Caption := oisSave;
 | 
						|
  ClearAction.Caption := oisClear;
 | 
						|
  OpenDialog.Title:=oisPEOpenImageFile;
 | 
						|
  SaveDialog.Title:=oisPESaveImageAs;
 | 
						|
  ImagePreview.OnPictureChanged:=@PictureChanged;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.ClearActionExecute(Sender: TObject);
 | 
						|
begin
 | 
						|
  ImagePreview.Picture.Clear;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.CopyActionExecute(Sender: TObject);
 | 
						|
begin
 | 
						|
  Clipboard.Assign(ImagePreview.Picture.Graphic);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.CopyActionUpdate(Sender: TObject);
 | 
						|
begin
 | 
						|
  CopyAction.Enabled := ImagePreview.Picture.Graphic <> nil;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.ImagePreviewPaintBackground(
 | 
						|
  ASender: TObject; ACanvas: TCanvas; ARect: TRect);
 | 
						|
const
 | 
						|
  cell=8; //8 pixels is usual checkers size
 | 
						|
var
 | 
						|
  bmp: TBitmap;
 | 
						|
  i, j: integer;
 | 
						|
begin
 | 
						|
  //Paint checkers BG picture for transparent image
 | 
						|
  bmp:= TBitmap.Create;
 | 
						|
  try
 | 
						|
    bmp.PixelFormat:= pf24bit;
 | 
						|
    bmp.SetSize(ARect.Right-ARect.Left, ARect.Bottom-ARect.Top);
 | 
						|
    bmp.Canvas.Brush.Color:= clWhite;
 | 
						|
    bmp.Canvas.FillRect(0, 0, bmp.Width, bmp.Height);
 | 
						|
    bmp.Canvas.Brush.Color:= clLtGray;
 | 
						|
 | 
						|
    for i:= 0 to bmp.Width div cell do
 | 
						|
      for j:= 0 to bmp.Height div cell do
 | 
						|
        if not (Odd(i) xor Odd(j)) then
 | 
						|
          bmp.Canvas.FillRect(i*cell, j*cell, (i+1)*cell, (j+1)*cell);
 | 
						|
 | 
						|
    ACanvas.CopyRect(ARect, bmp.Canvas, Rect(0, 0, bmp.Width, bmp.Height));
 | 
						|
  finally
 | 
						|
    FreeAndNil(bmp);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.FileSaveActionUpdate(Sender: TObject);
 | 
						|
begin
 | 
						|
  (Sender as TAction).Enabled := (Graphic <> nil) and (not Graphic.Empty);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.PasteActionExecute(Sender: TObject);
 | 
						|
begin
 | 
						|
  ImagePreview.Picture.Assign(Clipboard);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.PasteActionUpdate(Sender: TObject);
 | 
						|
begin
 | 
						|
  PasteAction.Enabled := Clipboard.HasPictureFormat;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.FileOpenActionExecute(Sender: TObject);
 | 
						|
begin
 | 
						|
  InitIDEFileDialog(OpenDialog);
 | 
						|
  if OpenDialog.Execute then
 | 
						|
  begin
 | 
						|
    try
 | 
						|
      ImagePreview.Picture.LoadFromFile(OpenDialog.FileName);
 | 
						|
      FFileName := OpenDialog.FileName; // OnPictureChange clears the field.
 | 
						|
    except
 | 
						|
      on E: Exception do begin
 | 
						|
        MessageDlg(oisErrorLoadingImage,
 | 
						|
          Format(oisErrorLoadingImage2, [FileName, LineEnding, E.Message]),
 | 
						|
          mtError, [mbOk], 0);
 | 
						|
        exit;
 | 
						|
      end;
 | 
						|
    end;
 | 
						|
  end;
 | 
						|
  StoreIDEFileDialog(OpenDialog);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.PictureChanged(Sender: TObject);
 | 
						|
begin
 | 
						|
  FModified := True;
 | 
						|
  FFileName := '';
 | 
						|
  if Graphic <> nil then
 | 
						|
    ScrollBox.Hint := Graphic.ClassName
 | 
						|
  else
 | 
						|
    ScrollBox.Hint := '';
 | 
						|
 | 
						|
  ScrollBoxResize(Self);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.ScrollBoxResize(Sender: TObject);
 | 
						|
begin
 | 
						|
  if ImagePreview.Width<ScrollBox.ClientWidth then
 | 
						|
    ImagePreview.Left:= (ScrollBox.ClientWidth-ImagePreview.Width) div 2
 | 
						|
  else
 | 
						|
    ImagePreview.Left:= 0;
 | 
						|
 | 
						|
  if ImagePreview.Height<ScrollBox.ClientHeight then
 | 
						|
    ImagePreview.Top:= (ScrollBox.ClientHeight-ImagePreview.Height) div 2
 | 
						|
  else
 | 
						|
    ImagePreview.Top:= 0;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.FileSaveActionExecute(Sender: TObject);
 | 
						|
begin
 | 
						|
  InitIDEFileDialog(SaveDialog);
 | 
						|
  if SaveDialog.Execute then
 | 
						|
    if SaveDialog.FilterIndex > 1 then
 | 
						|
      ImagePreview.Picture.SaveToFile(SaveDialog.FileName, SaveDialog.GetFilterExt)
 | 
						|
    else
 | 
						|
      ImagePreview.Picture.SaveToFile(SaveDialog.FileName);
 | 
						|
      
 | 
						|
  StoreIDEFileDialog(SaveDialog);
 | 
						|
end;
 | 
						|
 | 
						|
function TGraphicPropertyEditorForm.GetGraphic: TGraphic;
 | 
						|
begin
 | 
						|
  Result := ImagePreview.Picture.Graphic;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.SetGraphic(Value: TGraphic);
 | 
						|
begin
 | 
						|
  ImagePreview.Picture.Assign(Value);
 | 
						|
  FModified := False;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TGraphicPropertyEditorForm.SetCaptionDetail(Value: String);
 | 
						|
begin
 | 
						|
  Caption := oisLoadImageDialog + ' - ' + Value;
 | 
						|
end;
 | 
						|
 | 
						|
end.
 | 
						|
 |