317 lines
9.0 KiB
ObjectPascal
317 lines
9.0 KiB
ObjectPascal
{-----------------------------------------------------------------------------
|
|
The contents of this file are subject to the Mozilla Public License
|
|
Version 1.1 (the "License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
http://www.mozilla.org/MPL/MPL-1.1.html
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
|
|
the specific language governing rights and limitations under the License.
|
|
|
|
The Original Code is: JvPictureEditors.PAS, released on 2002-05-26.
|
|
|
|
The Initial Developer of the Original Code is John Doe.
|
|
Portions created by John Doe are Copyright (C) 2003 John Doe.
|
|
All Rights Reserved.
|
|
|
|
Contributor(s):
|
|
|
|
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
|
|
located at http://jvcl.sourceforge.net
|
|
|
|
Known Issues:
|
|
-----------------------------------------------------------------------------}
|
|
// $Id: JvPictureEditors.pas 10610 2006-05-19 13:35:08Z elahn $
|
|
|
|
unit JvPictureEditors;
|
|
|
|
{$I jvcl.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, Classes, Graphics, Forms, Controls, Dialogs, Menus,
|
|
{$IFDEF COMPILER6_UP}
|
|
RTLConsts, DesignIntf, DesignEditors, VCLEditors,
|
|
{$ELSE}
|
|
DsgnIntf,
|
|
{$ENDIF COMPILER6_UP}
|
|
JvPictureEditForm;
|
|
|
|
type
|
|
{ Property editor the TPicture properties (e.g. the Picture property). Brings
|
|
up a file open dialog allowing to load a picture file. }
|
|
TJvPictProperty = class(TPropertyEditor)
|
|
public
|
|
procedure Edit; override;
|
|
function GetAttributes: TPropertyAttributes; override;
|
|
function GetValue: string; override;
|
|
procedure SetValue(const Value: string); override;
|
|
end;
|
|
|
|
TJvGraphicPropertyEditor = class(TClassProperty)
|
|
public
|
|
procedure Edit; override;
|
|
function GetAttributes: TPropertyAttributes; override;
|
|
function GetValue: string; override;
|
|
procedure SetValue(const Value: string); override;
|
|
end;
|
|
|
|
TJvGraphicsEditor = class(TDefaultEditor)
|
|
public
|
|
{$IFDEF COMPILER6_UP}
|
|
procedure EditProperty(const Prop: IProperty; var Continue: Boolean); override;
|
|
{$ELSE}
|
|
procedure EditProperty(Prop: TPropertyEditor; var Continue, FreeEditor: Boolean); override;
|
|
{$ENDIF COMPILER6_UP}
|
|
end;
|
|
|
|
TJvPictEditor = class(TComponent)
|
|
private
|
|
FGraphicClass: TGraphicClass;
|
|
FPicture: TPicture;
|
|
FPicDlg: TPictureEditDialog;
|
|
FDecreaseColors: Boolean;
|
|
procedure SetPicture(Value: TPicture);
|
|
procedure SetGraphicClass(Value: TGraphicClass);
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
function Execute: Boolean;
|
|
property PicDlg: TPictureEditDialog read FPicDlg;
|
|
property GraphicClass: TGraphicClass read FGraphicClass write SetGraphicClass;
|
|
property Picture: TPicture read FPicture write SetPicture;
|
|
end;
|
|
|
|
function EditGraphic(Graphic: TGraphic; AClass: TGraphicClass;
|
|
const DialogCaption: string): Boolean;
|
|
|
|
implementation
|
|
|
|
uses
|
|
SysUtils, TypInfo, LibHelp, Consts,
|
|
JvTypes, JvJVCLUtils;
|
|
|
|
//=== Utility routines =======================================================
|
|
|
|
function EditGraphic(Graphic: TGraphic; AClass: TGraphicClass;
|
|
const DialogCaption: string): Boolean;
|
|
var
|
|
PictureEditor: TJvPictEditor;
|
|
begin
|
|
Result := False;
|
|
if Graphic = nil then
|
|
Exit;
|
|
PictureEditor := TJvPictEditor.Create(nil);
|
|
try
|
|
PictureEditor.FPicDlg.Caption := DialogCaption;
|
|
PictureEditor.GraphicClass := AClass;
|
|
if AClass = nil then
|
|
PictureEditor.GraphicClass := TGraphicClass(Graphic.ClassType);
|
|
PictureEditor.Picture.Assign(Graphic);
|
|
Result := PictureEditor.Execute;
|
|
if Result then
|
|
if (PictureEditor.Picture.Graphic = nil) or
|
|
(PictureEditor.Picture.Graphic is PictureEditor.GraphicClass) then
|
|
Graphic.Assign(PictureEditor.Picture.Graphic)
|
|
else
|
|
Result := False;
|
|
finally
|
|
PictureEditor.Free;
|
|
end;
|
|
end;
|
|
|
|
//=== { TJvPictProperty } ====================================================
|
|
|
|
procedure TJvPictProperty.Edit;
|
|
var
|
|
PictureEditor: TJvPictEditor;
|
|
Comp: TPersistent;
|
|
begin
|
|
PictureEditor := TJvPictEditor.Create(nil);
|
|
try
|
|
Comp := GetComponent(0);
|
|
if Comp is TComponent then
|
|
PictureEditor.FPicDlg.Caption := TComponent(Comp).Name + '.' + GetName;
|
|
PictureEditor.Picture := TPicture(Pointer(GetOrdValue));
|
|
if PictureEditor.Execute then
|
|
SetOrdValue(Longint(PictureEditor.Picture));
|
|
finally
|
|
PictureEditor.Free;
|
|
end;
|
|
end;
|
|
|
|
function TJvPictProperty.GetAttributes: TPropertyAttributes;
|
|
begin
|
|
Result := [paDialog];
|
|
end;
|
|
|
|
function TJvPictProperty.GetValue: string;
|
|
var
|
|
Picture: TPicture;
|
|
begin
|
|
Picture := TPicture(GetOrdValue);
|
|
if Picture.Graphic = nil then
|
|
Result := srNone
|
|
else
|
|
Result := '(' + Picture.Graphic.ClassName + ')';
|
|
end;
|
|
|
|
procedure TJvPictProperty.SetValue(const Value: string);
|
|
begin
|
|
if Value = '' then
|
|
SetOrdValue(0);
|
|
end;
|
|
|
|
//=== { TJvGraphicPropertyEditor } ===========================================
|
|
|
|
procedure TJvGraphicPropertyEditor.Edit;
|
|
var
|
|
PictureEditor: TJvPictEditor;
|
|
Comp: TPersistent;
|
|
begin
|
|
PictureEditor := TJvPictEditor.Create(nil);
|
|
try
|
|
Comp := GetComponent(0);
|
|
if Comp is TComponent then
|
|
PictureEditor.FPicDlg.Caption := TComponent(Comp).Name + '.' + GetName
|
|
else
|
|
PictureEditor.FPicDlg.Caption := GetName;
|
|
PictureEditor.GraphicClass := TGraphicClass(GetTypeData(GetPropType)^.ClassType);
|
|
PictureEditor.Picture.Graphic := TGraphic(Pointer(GetOrdValue));
|
|
if PictureEditor.Execute then
|
|
if (PictureEditor.Picture.Graphic = nil) or
|
|
(PictureEditor.Picture.Graphic is PictureEditor.GraphicClass) then
|
|
SetOrdValue(Longint(PictureEditor.Picture.Graphic))
|
|
else
|
|
raise EJVCLException.CreateRes(@SInvalidPropertyValue);
|
|
finally
|
|
PictureEditor.Free;
|
|
end;
|
|
end;
|
|
|
|
function TJvGraphicPropertyEditor.GetAttributes: TPropertyAttributes;
|
|
begin
|
|
Result := [paDialog];
|
|
end;
|
|
|
|
function TJvGraphicPropertyEditor.GetValue: string;
|
|
var
|
|
Graphic: TGraphic;
|
|
begin
|
|
Graphic := TGraphic(GetOrdValue);
|
|
if (Graphic = nil) or Graphic.Empty then
|
|
Result := srNone
|
|
else
|
|
Result := '(' + Graphic.ClassName + ')';
|
|
end;
|
|
|
|
procedure TJvGraphicPropertyEditor.SetValue(const Value: string);
|
|
begin
|
|
if Value = '' then
|
|
SetOrdValue(0);
|
|
end;
|
|
|
|
//=== { TJvGraphicsEditor } ==================================================
|
|
|
|
{$IFDEF COMPILER6_UP}
|
|
procedure TJvGraphicsEditor.EditProperty(const Prop: IProperty; var Continue: Boolean);
|
|
{$ELSE}
|
|
procedure TJvGraphicsEditor.EditProperty(Prop: TPropertyEditor; var Continue, FreeEditor: Boolean);
|
|
{$ENDIF COMPILER6_UP}
|
|
var
|
|
PropName: string;
|
|
begin
|
|
PropName := Prop.GetName;
|
|
if (CompareText(PropName, 'PICTURE') = 0) or
|
|
(CompareText(PropName, 'IMAGE') = 0) or
|
|
(CompareText(PropName, 'GLYPH') = 0) then
|
|
begin
|
|
Prop.Edit;
|
|
Continue := False;
|
|
end;
|
|
end;
|
|
|
|
//=== { TJvPictEditor } ======================================================
|
|
|
|
constructor TJvPictEditor.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FPicture := TPicture.Create;
|
|
FPicDlg := TPictureEditDialog.Create(Self);
|
|
FGraphicClass := TGraphic;
|
|
FPicDlg.GraphicClass := FGraphicClass;
|
|
end;
|
|
|
|
destructor TJvPictEditor.Destroy;
|
|
begin
|
|
FPicture.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TJvPictEditor.Execute: Boolean;
|
|
var
|
|
Bmp: TBitmap;
|
|
CurDir: string;
|
|
begin
|
|
FPicDlg.Pic.Assign(FPicture);
|
|
with FPicDlg.FileDialog do
|
|
begin
|
|
Options := [ofHideReadOnly, ofFileMustExist, ofShowHelp];
|
|
DefaultExt := GraphicExtension(GraphicClass);
|
|
Filter := GraphicFilter(GraphicClass);
|
|
HelpContext := hcDLoadPicture;
|
|
end;
|
|
with FPicDlg.SaveDialog do
|
|
begin
|
|
Options := [ofHideReadOnly, ofFileMustExist, ofShowHelp,
|
|
ofOverwritePrompt];
|
|
DefaultExt := GraphicExtension(GraphicClass);
|
|
Filter := GraphicFilter(GraphicClass);
|
|
HelpContext := hcDSavePicture;
|
|
end;
|
|
FPicDlg.ValidateImage;
|
|
CurDir := GetCurrentDir;
|
|
try
|
|
Result := FPicDlg.ShowModal = mrOk;
|
|
finally
|
|
SetCurrentDir(CurDir);
|
|
end;
|
|
FDecreaseColors := FPicDlg.DecreaseColors;
|
|
if Result then
|
|
begin
|
|
if FPicDlg.Pic.Graphic <> nil then
|
|
begin
|
|
if (GraphicClass = TBitmap) and (FPicDlg.Pic.Graphic is TIcon) then
|
|
begin
|
|
Bmp := CreateBitmapFromIcon(FPicDlg.Pic.Icon, FPicDlg.IconColor);
|
|
try
|
|
if FPicDlg.DecreaseColors then
|
|
SetBitmapPixelFormat(Bmp, pf4bit, DefaultMappingMethod);
|
|
FPicture.Assign(Bmp);
|
|
finally
|
|
Bmp.Free;
|
|
end;
|
|
end
|
|
else
|
|
FPicture.Assign(FPicDlg.Pic);
|
|
end
|
|
else
|
|
FPicture.Graphic := nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvPictEditor.SetGraphicClass(Value: TGraphicClass);
|
|
begin
|
|
FGraphicClass := Value;
|
|
if FPicDlg <> nil then
|
|
FPicDlg.GraphicClass := Value;
|
|
end;
|
|
|
|
procedure TJvPictEditor.SetPicture(Value: TPicture);
|
|
begin
|
|
FPicture.Assign(Value);
|
|
end;
|
|
|
|
end.
|