308 lines
8.8 KiB
ObjectPascal

unit bgrasvgimagelistform;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, BCSVGViewer,
BGRASVGImageList, ComponentEditors, Types, Math, LCLType, ComCtrls;
type
{ TfrmBGRASVGImageListEditor }
TfrmBGRASVGImageListEditor = class(TForm)
BCSVGViewerPreview: TBCSVGViewer;
btnAdd: TButton;
btnRemove: TButton;
btnUp: TButton;
btnDown: TButton;
btnReplace: TButton;
CheckBox_UseSVGAlignment: TCheckBox;
ImageList1: TImageList;
ListBox1: TListBox;
OpenDialog1: TOpenDialog;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton_AlignTop: TToolButton;
ToolButton_AlignLeft: TToolButton;
ToolButton_AlignCenter: TToolButton;
ToolButton_AlignRight: TToolButton;
ToolButton_AlignVCenter: TToolButton;
ToolButton_AlignBottom: TToolButton;
procedure btnAddClick(Sender: TObject);
procedure btnDownClick(Sender: TObject);
procedure btnRemoveClick(Sender: TObject);
procedure btnReplaceClick(Sender: TObject);
procedure btnUpClick(Sender: TObject);
procedure CheckBox_UseSVGAlignmentChange(Sender: TObject);
procedure ListBox1DrawItem(Control: TWinControl; Index: integer;
ARect: TRect; State: TOwnerDrawState);
procedure ListBox1SelectionChange(Sender: TObject; User: boolean);
procedure ToolButton_AlignBottomClick(Sender: TObject);
procedure ToolButton_AlignCenterClick(Sender: TObject);
procedure ToolButton_AlignLeftClick(Sender: TObject);
procedure ToolButton_AlignRightClick(Sender: TObject);
procedure ToolButton_AlignTopClick(Sender: TObject);
procedure ToolButton_AlignVCenterClick(Sender: TObject);
private
FComponent: TComponent;
function GetImageList: TBGRASVGImageList;
procedure UpdateListBox;
procedure UpdateButtons;
procedure UpdateToolButtonsAlign;
public
constructor {%H-}Create(AComponent: TComponent);
property ImageList: TBGRASVGImageList read GetImageList;
end;
{ TBGRASVGImageListEditor }
TBGRASVGImageListEditor = class(TComponentEditor)
protected
procedure DoShowEditor;
public
procedure ExecuteVerb(Index: integer); override;
function GetVerb({%H-}Index: integer): string; override;
function GetVerbCount: integer; override;
end;
var
frmBGRASVGImageListEditor: TfrmBGRASVGImageListEditor;
implementation
{$R *.lfm}
{ TBGRASVGImageListEditor }
procedure TBGRASVGImageListEditor.DoShowEditor;
var
f: TfrmBGRASVGImageListEditor;
begin
f := TfrmBGRASVGImageListEditor.Create(Component);
try
f.ShowModal;
Modified;
finally
f.Free;
end;
end;
procedure TBGRASVGImageListEditor.ExecuteVerb(Index: integer);
begin
case Index of
0: DoShowEditor;
end;
end;
function TBGRASVGImageListEditor.GetVerb(Index: integer): string;
begin
Result := 'Assign style';
end;
function TBGRASVGImageListEditor.GetVerbCount: integer;
begin
Result := 1;
end;
{ TfrmBGRASVGImageListEditor }
procedure TfrmBGRASVGImageListEditor.btnAddClick(Sender: TObject);
var
s: TStringList;
begin
if OpenDialog1.Execute then
begin
s := TStringList.Create;
try
s.LoadFromFile(OpenDialog1.FileName);
TBGRASVGImageList(FComponent).Add(s.Text);
finally
s.Free;
UpdateListBox;
ListBox1.ItemIndex := ListBox1.Count - 1;
end;
end;
end;
procedure TfrmBGRASVGImageListEditor.btnDownClick(Sender: TObject);
begin
TBGRASVGImageList(FComponent).Exchange(ListBox1.ItemIndex, ListBox1.ItemIndex + 1);
UpdateListBox;
ListBox1.ItemIndex := ListBox1.ItemIndex + 1;
end;
procedure TfrmBGRASVGImageListEditor.btnRemoveClick(Sender: TObject);
begin
TBGRASVGImageList(FComponent).Remove(ListBox1.ItemIndex);
UpdateListBox;
end;
procedure TfrmBGRASVGImageListEditor.btnReplaceClick(Sender: TObject);
var
s: TStringList;
begin
if OpenDialog1.Execute then
begin
s := TStringList.Create;
try
s.LoadFromFile(OpenDialog1.FileName);
TBGRASVGImageList(FComponent).Replace(ListBox1.ItemIndex, s.Text);
finally
s.Free;
UpdateListBox;
end;
end;
end;
procedure TfrmBGRASVGImageListEditor.btnUpClick(Sender: TObject);
begin
TBGRASVGImageList(FComponent).Exchange(ListBox1.ItemIndex, ListBox1.ItemIndex - 1);
UpdateListBox;
ListBox1.ItemIndex := ListBox1.ItemIndex - 1;
end;
procedure TfrmBGRASVGImageListEditor.CheckBox_UseSVGAlignmentChange(
Sender: TObject);
begin
ImageList.UseSVGAlignment:= CheckBox_UseSVGAlignment.Checked;
BCSVGViewerPreview.UseSVGAlignment:= ImageList.UseSVGAlignment;
ListBox1.Invalidate;
UpdateToolButtonsAlign;
end;
procedure TfrmBGRASVGImageListEditor.ListBox1DrawItem(Control: TWinControl;
Index: integer; ARect: TRect; State: TOwnerDrawState);
begin
ListBox1.Canvas.Brush.Color := clWhite;
if (odSelected in State) then
ListBox1.Canvas.Brush.Color := clHighlight;
ListBox1.Canvas.FillRect(ARect);
ListBox1.Canvas.TextOut(ARect.Height + ScaleX(4, 96),
ARect.Top, Index.ToString);
if (Index <> -1) then
TBGRASVGImageList(FComponent).Draw(Index, ListBox1, ListBox1.Canvas,
ARect.Left, ARect.Top, ARect.Height, ARect.Height);
end;
procedure TfrmBGRASVGImageListEditor.ListBox1SelectionChange(Sender: TObject;
User: boolean);
begin
UpdateButtons;
if ListBox1.ItemIndex <> -1 then
BCSVGViewerPreview.SVGString :=
TBGRASVGImageList(FComponent).SVGString[ListBox1.ItemIndex];
end;
procedure TfrmBGRASVGImageListEditor.ToolButton_AlignBottomClick(Sender: TObject
);
begin
ImageList.VerticalAlignment:= tlBottom;
BCSVGViewerPreview.VertAlign:= ImageList.VerticalAlignment;
UpdateToolButtonsAlign;
ListBox1.Invalidate;
end;
procedure TfrmBGRASVGImageListEditor.ToolButton_AlignCenterClick(Sender: TObject
);
begin
ImageList.HorizontalAlignment:= taCenter;
BCSVGViewerPreview.HorizAlign:= ImageList.HorizontalAlignment;
UpdateToolButtonsAlign;
ListBox1.Invalidate;
end;
procedure TfrmBGRASVGImageListEditor.ToolButton_AlignLeftClick(Sender: TObject);
begin
ImageList.HorizontalAlignment:= taLeftJustify;
BCSVGViewerPreview.HorizAlign:= ImageList.HorizontalAlignment;
UpdateToolButtonsAlign;
ListBox1.Invalidate;
end;
procedure TfrmBGRASVGImageListEditor.ToolButton_AlignRightClick(Sender: TObject
);
begin
ImageList.HorizontalAlignment:= taRightJustify;
BCSVGViewerPreview.HorizAlign:= ImageList.HorizontalAlignment;
UpdateToolButtonsAlign;
ListBox1.Invalidate;
end;
procedure TfrmBGRASVGImageListEditor.ToolButton_AlignTopClick(Sender: TObject);
begin
ImageList.VerticalAlignment:= tlTop;
BCSVGViewerPreview.VertAlign:= ImageList.VerticalAlignment;
UpdateToolButtonsAlign;
ListBox1.Invalidate;
end;
procedure TfrmBGRASVGImageListEditor.ToolButton_AlignVCenterClick(
Sender: TObject);
begin
ImageList.VerticalAlignment:= tlCenter;
BCSVGViewerPreview.VertAlign:= ImageList.VerticalAlignment;
UpdateToolButtonsAlign;
ListBox1.Invalidate;
end;
procedure TfrmBGRASVGImageListEditor.UpdateListBox;
var
i: integer;
index: integer;
begin
index := ListBox1.ItemIndex;
ListBox1.Clear;
for i := 0 to TBGRASVGImageList(FComponent).Count - 1 do
ListBox1.Items.Add('Image' + i.ToString);
if ListBox1.Count > 0 then
ListBox1.ItemIndex := index;
UpdateButtons;
end;
function TfrmBGRASVGImageListEditor.GetImageList: TBGRASVGImageList;
begin
result := TBGRASVGImageList(FComponent);
end;
procedure TfrmBGRASVGImageListEditor.UpdateButtons;
begin
btnUp.Enabled := (ListBox1.Count > 1) and (ListBox1.ItemIndex > 0);
btnDown.Enabled := (ListBox1.Count > 1) and (ListBox1.ItemIndex < ListBox1.Count - 1);
btnRemove.Enabled := (ListBox1.Count > 0) and (ListBox1.ItemIndex <> -1);
btnReplace.Enabled := (ListBox1.Count > 0) and (ListBox1.ItemIndex <> -1);
end;
procedure TfrmBGRASVGImageListEditor.UpdateToolButtonsAlign;
begin
ToolButton_AlignLeft.Down := (ImageList.HorizontalAlignment = taLeftJustify);
ToolButton_AlignCenter.Down := (ImageList.HorizontalAlignment = taCenter);
ToolButton_AlignRight.Down := (ImageList.HorizontalAlignment = taRightJustify);
ToolButton_AlignTop.Down := (ImageList.VerticalAlignment = tlTop);
ToolButton_AlignVCenter.Down := (ImageList.VerticalAlignment = tlCenter);
ToolButton_AlignBottom.Down := (ImageList.VerticalAlignment = tlBottom);
ToolBar1.Enabled:= not ImageList.UseSVGAlignment;
end;
constructor TfrmBGRASVGImageListEditor.Create(AComponent: TComponent);
begin
inherited Create(Application);
FComponent := AComponent;
ListBox1.ItemHeight := Max(ImageList.Height,
Max(16, ListBox1.Canvas.TextHeight('0')));
UpdateListBox;
CheckBox_UseSVGAlignment.Checked := ImageList.UseSVGAlignment;
BCSVGViewerPreview.UseSVGAlignment:= ImageList.UseSVGAlignment;
BCSVGViewerPreview.HorizAlign:= ImageList.HorizontalAlignment;
BCSVGViewerPreview.VertAlign:= ImageList.VerticalAlignment;
UpdateToolButtonsAlign;
end;
initialization
RegisterComponentEditor(TBGRASVGImageList, TBGRASVGImageListEditor);
end.