Files
kolmck/Addons/MCKGRushImageCollectionEditor.pas

339 lines
10 KiB
ObjectPascal

unit MCKGRushImageCollectionEditor;
// file: MCKGRushImageCollectionEditor.pas
// file version: 0.35
// last modified: 06.02.06
// package: GRushControls
// author: Karpinskyj Alexandr aka homm
// mailto: homm86@mail.ru
// My humble Web-Page: http://www.homm86.narod.ru
interface
{$I KOLDEF.INC}
uses Windows,
Messages,
ShellAPI,
KOL,
KOLGRushControls,
tinyJPGGIFBMP,
tinyPNG,
mirror,
Classes,
Controls,
mckObjs,
Graphics,
mckCtrls,
MCKGRushControls,
Forms,
{$IFDEF _D6orHigher}
DesignEditors,
DesignIntf;
{$ELSE}
DsgnIntf;
{$ENDIF}
type
TKOLGRushImageCollectionEditor = class( TComponentEditor )
private
protected
public
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
ImageCollectionData= record
fImageType: TKOLGRushImageCollectionImageType;
fItemWidth: DWORD;
fItemHeight: DWORD;
fDataStream: TMemoryStream;
end;
PImageCollectionEditor = ^TImageCollectionEditor;
TImageCollectionEditor = object (TObj)
Form: KOL.PControl;
ScrollBox: PControl;
ImageShow: PControl;
ButtonOK: PGRushControl;
ButtonCancel: PGRushControl;
ButtonOpen_Close: PGRushControl;
ButtonSave: PGRushControl;
OSD: KOL.POpenSaveDialog;
Collection: ImageCollectionData;
Comp: TKOLGRushImageCollection;
Bitmap: KOL.PBitmap;
///////////////////
ActiveWindow: HWnd;
WindowList: Pointer;
procedure OKClick(Self_: KOL.PObj);
procedure CancelClick(Self_: KOL.PObj);
procedure CloseClick(Self_: KOL.PObj);
procedure OpenClick(Self_: KOL.PObj);
procedure SaveClick(Self_: KOL.PObj);
procedure CalcRects (Sender: PGRushControl; var Rects: TGRushRects);
procedure DoClose ( Sender: PObj; var Accept: Boolean );
procedure ImageShowPaint ( Sender: PControl; DC: HDC );
procedure SetControls;
end;
procedure Register;
var
ImageCollectionEditor: PImageCollectionEditor;
procedure NewImageCollectionEditor( var Result: PImageCollectionEditor; Component: TKOLGRushImageCollection );
implementation
procedure Register;
begin
RegisterComponentEditor( TKOLGRushImageCollection, TKOLGRushImageCollectionEditor );
end;
procedure NewImageCollectionEditor( var Result: PImageCollectionEditor; Component: TKOLGRushImageCollection );
begin
New(Result, Create);
with Result^ do begin
Form := NewForm(nil, Component.Name + ': Edit').SetClientSize(440, 256).CenterOnParent;
KOL.Applet := Form;
Form.ExStyle := Form.ExStyle or WS_EX_DLGMODALFRAME or WS_EX_WINDOWEDGE;
Form.Style := Form.Style and not (WS_MINIMIZEBOX or WS_MAXIMIZEBOX);
Form.CanResize := FALSE;
Form.OnClose := DoClose;
Form.Add2AutoFree(Result);
ScrollBox := NewScrollBoxEx(Form, esLowered).SetPosition(8, 8).SetSize(320, 240).SetBorder(0);
ImageShow := NewPanel(ScrollBox, esNone);
ImageShow.OnPaint := ImageShowPaint;
ButtonOpen_Close := PGRushControl(NewGRushButton(Result.Form, '').SetSize(96, 24).SetPosition(336, 8));
ButtonOpen_Close.OnRecalcRects := CalcRects;
ButtonSave := PGRushControl(NewGRushButton(Result.Form, 'Save as').SetSize(96, 24).SetPosition(336, 40));
ButtonSave.OnClick := Result.SaveClick;
ButtonSave.OnRecalcRects := CalcRects;
ButtonOK := PGRushControl(NewGRushButton(Result.Form, 'OK').SetSize(96, 24).SetPosition(336, 192));
ButtonOK.OnClick := Result.OKClick;
ButtonOK.OnRecalcRects := CalcRects;
ButtonOK.Focused := TRUE;
ButtonCancel := PGRushControl(NewGRushButton(Result.Form, 'Cancel').SetSize(96, 24).SetPosition(336, 224));
ButtonCancel.OnClick := Result.CancelClick;
ButtonCancel.OnRecalcRects := CalcRects;
OSD := NewOpenSaveDialog('chose file to open', ProjectSourcePath
, [OSFileMustExist, OSHideReadonly, OSPathMustExist, OSOverwritePrompt] );
OSD.Filter := 'Jpeg files|*.jpg;*.jpeg|Png files|*.png|Gif files|*.gif|Bmp files|*.bmp|'
+ 'All suported files|*.jpg;*.jpeg;*.png;*.gif;*.bmp|All files|*.*|';
OSD.FilterIndex := 5;
OSD.WndOwner := Form.Handle;
Comp := Component;
Collection.fImageType := Component.ImageType;
if assigned(Component.DataStream) then begin
Collection.fDataStream := TMemoryStream.Create;
Collection.fDataStream.LoadFromStream(Component.DataStream);
end;
Bitmap := Component.LoadBitmap;
SetControls;
end;
end;
procedure TKOLGRushImageCollectionEditor.Edit;
begin
if Component = nil then Exit;
if not(Component is TKOLGRushImageCollection) then Exit;
ImageCollectionEditor := nil;
AppletTerminated := FALSE;
try
NewImageCollectionEditor(ImageCollectionEditor, Component as TKOLGRushImageCollection);
ImageCollectionEditor.ActiveWindow := GetActiveWindow;
ImageCollectionEditor.WindowList := DisableTaskWindows(0);
KOL.Run(KOL.Applet);
finally
end;
(Component as TKOLGRushImageCollection).Change;
end;
procedure TKOLGRushImageCollectionEditor.ExecuteVerb(Index: Integer);
begin
if Index = 0 then
Edit;
end;
function TKOLGRushImageCollectionEditor.GetVerb(Index: Integer): string;
begin
if Index = 0 then
Result := 'Edit component';
end;
function TKOLGRushImageCollectionEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
procedure TImageCollectionEditor.SetControls;
begin
if Bitmap = nil then begin
try
Collection.fDataStream.Free;
finally
Collection.fDataStream := nil;
end;
Collection.fImageType := None;
ButtonOpen_Close.Caption := 'Open';
ButtonOpen_Close.OnClick := OpenClick;
ButtonSave.Enabled := FALSE;
ImageShow.Visible := FALSE;
end else begin
ButtonOpen_Close.Caption := 'Free';
ButtonOpen_Close.OnClick := CloseClick;
ButtonSave.Enabled := TRUE;
ImageShow.SetSize(Bitmap.Width, Bitmap.Height);
ImageShow.Visible := TRUE;
end;
end;
procedure TImageCollectionEditor.OKClick(Self_: KOL.PObj);
begin
try
Comp.DataStream.Free;
finally
Comp.DataStream := nil;
end;
TKOLGRushImageCollectionImageType((@Comp.ImageType)^) := Collection.fImageType;
if Comp.ImageType <> None then begin
Comp.DataStream := TMemoryStream.Create;
Comp.DataStream.LoadFromStream(Collection.fDataStream);
Comp.DataStream.Position := 0;
end;
Form.Close;
end;
procedure TImageCollectionEditor.CancelClick(Self_: KOL.PObj);
begin
Form.Close;
end;
procedure TImageCollectionEditor.OpenClick(Self_: KOL.PObj);
var KOLStream: KOL.PStream;
begin
OSD.OpenDialog := TRUE;
if OSD.Execute then begin
Collection.fDataStream := TMemoryStream.Create;
Collection.fDataStream.LoadFromFile(OSD.FileName);
KOLStream := NewExMemoryStream(Collection.fDataStream.Memory, Collection.fDataStream.Size);
try
tinyLoadPNG(Bitmap, KOLStream);
except
ShowMessage('��������� ������ �� ����� ������� ������������ ���� ��� *.png'
+ '. ��������� �������� �� ���� ������ (homm86@mail.ru) � ����������'
+ ' ���������� ���� ���� ��� ������ ����� ���������.');
try
Bitmap.Free;
finally
Bitmap := nil;
end;
end;
KOLStream.Free;
if Bitmap <> nil then begin
Collection.fImageType := PNG;
end else begin // maybe JPG?
tinyLoadJPGGIFBMPStream(Bitmap, Collection.fDataStream);
if Bitmap <> nil then begin
Collection.fImageType := BMP_GIF_JPG;
end else begin // not suported
Collection.fImageType := None;
ShowMessage ('This file type not suported.');
try
Collection.fDataStream.Free;
finally
Collection.fDataStream := nil;
end;
try
Bitmap.Free;
finally
Bitmap := nil;
end;
end;
end;
SetControls;
end;
end;
procedure TImageCollectionEditor.CloseClick(Self_: KOL.PObj);
begin
ImageShow.Visible := FALSE;
ButtonOpen_Close.OnClick := OpenClick;
ButtonOpen_Close.Caption := 'Open';
ButtonSave.Enabled := FALSE;
Collection.fImageType := None;
try
Collection.fDataStream.Free;
finally
Collection.fDataStream := nil;
end;
try
Bitmap.Free;
finally
Bitmap := nil;
end;
end;
procedure TImageCollectionEditor.SaveClick(Self_: KOL.PObj);
begin
try
OSD.OpenDialog := FALSE;
if OSD.Execute then begin
Collection.fDataStream.SaveToFile(OSD.FileName);
end;
except
ShowMessage('�� ������� ��������� �������.');
end;
end;
procedure TImageCollectionEditor.DoClose ( Sender: PObj; var Accept: Boolean );
begin
Accept := TRUE;
try
Collection.fDataStream.Free;
finally
Collection.fDataStream := nil;
end;
try
Bitmap.Free;
finally
Bitmap := nil;
end;
EnableTaskWindows(WindowList);
SetActiveWindow(ActiveWindow);
TerminateExecution(KOL.Applet);
end;
procedure TImageCollectionEditor.CalcRects (Sender: PGRushControl; var Rects: TGRushRects);
begin
InflateRect(Rects.AlphaRect, -4, -3);
end;
procedure TImageCollectionEditor.ImageShowPaint ( Sender: PControl; DC: HDC );
begin
if Bitmap <> nil then begin
BitBlt(DC, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
end;
end;
end.