lazarus/ideintf/columndlg.pp
vincents b7505abecb Fixed memleak in rename identifier
git-svn-id: trunk@8090 -
2005-11-07 09:58:41 +00:00

452 lines
12 KiB
ObjectPascal

{
*****************************************************************************
* *
* See the file COPYING.modifiedLGPL, included in this distribution, *
* for details about the copyright. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* *
*****************************************************************************
}
unit ColumnDlg;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LCLProc, Forms, Controls, Graphics, Dialogs, LResources,
ComCtrls, StdCtrls, Buttons, ExtCtrls;
type
// TODO create more generic collection editor.
TColumnDlg = class(TForm)
ColumnsListBox: TLISTBOX;
CaptionLabel: TLABEL;
CaptionEdit: TEDIT;
WidthLabel: TLABEL;
WidthEdit: TEDIT;
AddButton: TBUTTON;
DeleteButton: TBUTTON;
AlignmentRadioGroup: TRADIOGROUP;
MoveUpButton: TBUTTON;
MoveDownButton: TBUTTON;
btnOK : TBitBtn;
btnCancel : TBitBtn;
cbVisible : TCheckbox;
cbAutoSize : TCheckBox;
private
FColumns: TListColumns;
FSelectedIndex : Integer;
procedure DisplayColumn(Value : Integer);
procedure SetColumns(const AValue: TListColumns);
protected
procedure AddButtonOnClick(sender : TObject);
procedure DeleteButtonOnClick(sender : TObject);
procedure MoveUpButtonOnClick(sender : TObject);
procedure MoveDownButtonOnClick(sender : TObject);
procedure AlignmentRadioGroupOnClick(sender : TObject);
procedure ColumnsListBoxOnClick(sender : TObject);
Procedure CaptionEditOnChange(Sender : TObject);
Procedure WidthEditOnChange(Sender : TObject);
Procedure cbVisibleOnClick(Sender : TObject);
Procedure cbAutoSizeOnClick(Sender : TObject);
Procedure FormOnShow(Sender : TObject);
procedure EnableComponents;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteDebugReport;
property Columns: TListColumns read FColumns write SetColumns;
end;
implementation
{ TColumnDlg }
constructor TColumnDlg.Create(TheOwner: TComponent);
Begin
inherited Create(TheOwner);
Caption := 'Column Editor';
Width := 400;
Height := 340;
OnShow := @FormOnShow;
Position := poScreenCenter;
ColumnsListBox := TListBox.Create(self);
with ColumnsListBox do
Begin
Parent := Self;
Left := 1;
Width := 170;
Top := 1;
Height := Self.ClientHeight-Top-40;
OnClick := @ColumnsListBoxOnClick;
end;
CaptionLabel := TLabel.Create(self);
with CaptionLabel do
Begin
Parent := self;
Caption := 'Caption';
Left := ColumnsListBox.Left+ColumnsListBox.Width+10;
Top := 15;
end;
CaptionEdit := TEdit.Create(self);
with CaptionEdit do
Begin
Parent := Self;
Text := '';
Left := CaptionLabel.Left;
Height := 25;
Top := CaptionLabel.Top+CaptionLabel.Height+5;
OnChange := @CaptionEditOnChange;
end;
WidthLabel := TLabel.Create(self);
with WidthLabel do
Begin
Parent := self;
Caption := 'Width';
Left := CaptionLabel.Left;
Top := CaptionEdit.Top+CaptionEdit.Height+5;
end;
WidthEdit := TEdit.Create(self);
with WidthEdit do
Begin
Parent := Self;
Text := '';
Left := WidthLabel.Left;
Height := 25;
Top := WidthLabel.Top+WidthLabel.Height+5;
OnChange := @WidthEditOnChange;
end;
AlignmentRadioGroup := TRadioGroup.Create(self);
with AlignmentRadioGroup do
Begin
Parent := Self;
Caption := 'Alignment';
Left := CaptionLabel.Left;
Top := WidthEdit.Top+WidthEdit.Height+5;
Columns := 3;
Height := 50;
Width := 200;
Items.Add('Left');
Items.Add('Center');
Items.Add('Right');
ItemIndex := 0;
OnClick := @AlignmentRadioGroupOnClick;
end;
cbVisible := TCheckBox.Create(self);
with cbVisible do
begin
Parent := Self;
Caption := 'Visible';
Left := CaptionLabel.Left;
Top := AlignmentRadioGroup.Top+AlignmentRadioGroup.Height+5;
Height := 25;
Checked := True;
OnClick := @cbVisibleOnClick;
end;
cbAutoSize := TCheckBox.Create(self);
with cbAutoSize do
begin
Parent := Self;
Caption := 'Auto Size';
Left := CaptionLabel.Left;
Top := cbVisible.Top + cbVisible.Height + 5;
Height := 25;
Checked := True;
OnClick := @cbAutoSizeOnClick;
end;
AddButton := TButton.Create(self);
with AddButton do
Begin
Parent := self;
Caption := 'Add';
Left := CaptionLabel.Left;
Top := cbAutoSize.Top+cbAutoSize.Height+5;
OnClick := @AddButtonOnClick;
end;
DeleteButton := TButton.Create(self);
with DeleteButton do
Begin
Parent := self;
Caption := 'Delete';
Left := AddButton.Left+AddButton.Width+5;
Top := AddButton.Top;
OnClick := @DeleteButtonOnClick;
end;
MoveUpButton := TButton.Create(self);
with MoveUpButton do
Begin
Parent := self;
Caption := 'Move up';
Left := 5;
Top := ColumnsListBox.Top+ColumnsListBox.Height+5;
OnClick := @MoveUpButtonOnClick;
end;
MoveDownButton := TButton.Create(self);
with MoveDownButton do
Begin
Parent := self;
Caption := 'Move down';
Left := MoveUpButton.Left+MoveUpButton.Width+5;
Top := MoveUpButton.Top;
OnClick := @MoveDownButtonOnClick;
end;
btnOK := TBitbtn.Create(self);
with btnOK do
Begin
Parent := self;
Caption := 'OK';
Left := CaptionLabel.Left;
Top := MoveUpButton.Top;
kind := bkOK;
end;
btnCancel := TBitbtn.Create(self);
with btnCancel do
Begin
Parent := self;
Caption := 'Cancel';
Left := btnOK.Left + btnOK.Width + 5;
Top := btnOK.Top;
Kind := bkCancel;
end;
FColumns := TListColumns.Create(nil);
FSelectedIndex:= -1;
end;
destructor TColumnDlg.Destroy;
begin
FreeAndNil(FColumns);
inherited Destroy;
end;
procedure TColumnDlg.AddButtonOnClick(sender : TObject);
var
Column : TListColumn;
Begin
//add
Column := FColumns.Add;
Column.Caption := 'Caption';
FSelectedIndex := Column.Index;
ColumnsListBox.Items.Add(Column.Caption);
ColumnsListBox.Selected[FSelectedIndex] := True;
DisplayColumn(FSelectedIndex);
//WriteDebugReport;
end;
procedure TColumnDlg.ColumnsListBoxOnClick(sender : TObject);
var
I : Integer;
begin
CaptionEdit.ReadOnly := True;
FSelectedIndex := -1;
if ColumnsListBox.SelCount = 0 then Exit;
CaptionEdit.ReadOnly := False;
I := 0;
While not ColumnsListBox.Selected[i] do
inc(i);
DisplayColumn(I);
end;
Procedure TColumnDlg.CaptionEditOnChange(Sender : TObject);
Var
ListColumn : TListColumn;
begin
if FSelectedIndex = -1 then Exit;
ListColumn := FColumns[FSelectedIndex];
ListColumn.Caption := CaptionEdit.Caption;
ColumnsListBox.Items[FSelectedIndex] := CaptionEdit.Caption;
ColumnsListBox.Selected[FSelectedIndex] := True;
end;
Procedure TColumnDlg.WidthEditOnChange(Sender : TObject);
Var
ListColumn : TListColumn;
begin
if FSelectedIndex = -1 then Exit;
ListColumn := FColumns[FSelectedIndex];
if WidthEdit.Caption = '' then
ListColumn.Width := 0
else
try
ListColumn.Width := StrToInt(WidthEdit.Caption);
except
showmessage('Invalid numeric Value');
// revert to previous value
WidthEdit.Caption := IntToStr(ListColumn.Width);
end;
end;
procedure TColumnDlg.DeleteButtonOnClick(sender : TObject);
var
Index : Integer;
begin
//delete
if FSelectedIndex = -1 then Exit;
Index := FSelectedIndex;
FSelectedIndex := -1;
FColumns[Index].Free;
ColumnsListBox.Items.Delete(Index);
if Index > 0 then
ColumnsListBox.Selected[Index-1] := True;
DisplayColumn(Index-1);
end;
procedure TColumnDlg.MoveUpButtonOnClick(sender : TObject);
Var
ListColumn : TListColumn;
Index : Integer;
begin
//move up
if FSelectedIndex <= 0 then Exit;
Index := FSelectedIndex;
FSelectedIndex := -1;
ListColumn := FColumns[Index];
ListColumn.Index := Index - 1;
ColumnsListBox.Items.Insert(Index-1,ListColumn.Caption);
ColumnsListBox.Items.Delete(Index+1);
ColumnsListBox.Selected[Index-1] := True;
DisplayColumn(Index-1);
end;
procedure TColumnDlg.MoveDownButtonOnClick(sender : TObject);
Var
ListColumn : TListColumn;
Index : Integer;
begin
//move down
if FSelectedIndex = -1 then Exit;
if (FSelectedIndex >= ColumnsListBox.Items.Count-1) then Exit;
Index := FSelectedIndex;
FSelectedIndex := -1;
ListColumn := FColumns[Index];
ListColumn.Index := Index + 1;
ColumnsListBox.Items.Insert(Index+2,ListColumn.Caption);
ColumnsListBox.Items.Delete(Index);
ColumnsListBox.Selected[Index+1] := True;
DisplayColumn(Index+1);
end;
Procedure TColumnDlg.DisplayColumn(Value : Integer);
Var
ListColumn : TListColumn;
begin
FSelectedIndex := -1;
if Value >=0 then begin
ListColumn := FColumns[Value];
CaptionEdit.Caption := ListColumn.Caption;
WidthEdit.Caption := IntToStr(Integer(ListColumn.Width));
case ListColumn.Alignment of
taLeftJustify : AlignmentRadioGroup.ItemIndex := 0;
taCenter: AlignmentRadioGroup.ItemIndex := 1;
taRightJustify : AlignmentRadioGroup.ItemIndex := 2;
end; //case
cbVisible.Checked := ListColumn.Visible;
cbAutoSize.Checked := ListColumn.AutoSize;
end;
FSelectedIndex := Value;
EnableComponents;
end;
procedure TColumnDlg.SetColumns(const AValue: TListColumns);
begin
FColumns.Assign(AValue);
end;
procedure TColumnDlg.AlignmentRadioGroupOnClick(sender : TObject);
Var
ListColumn : TListColumn;
begin
if FSelectedIndex = -1 then Exit;
ListColumn := FColumns[FSelectedIndex];
case AlignmentRadioGroup.ItemIndex of
0 : ListColumn.Alignment := taLeftJustify;
1 : ListColumn.Alignment := taCenter;
2 : ListColumn.Alignment := taRightJustify;
end;
end;
Procedure TColumnDlg.FormOnShow(Sender : TObject);
var
I : Integer;
begin
//clear the listbox and display the items if any...
ColumnsListBox.Items.Clear;
for I := 0 to FColumns.Count-1 do begin
DebugLn('TColumnDlg.FormOnShow ',IntToStr(i),' "',FColumns[i].Caption,'"');
ColumnsListBox.Items.Add(FColumns[i].Caption);
end;
if ColumnsListBox.Items.Count > 0 then
begin
ColumnsListBox.Selected[0] := True;
DisplayColumn(0);
end;
EnableComponents;
end;
procedure TColumnDlg.EnableComponents;
var
AColumnIsSelected: boolean;
begin
AColumnIsSelected:=FSelectedIndex>=0;
CaptionEdit.Enabled:=AColumnIsSelected;
WidthEdit.Enabled:=AColumnIsSelected;
AlignmentRadioGroup.Enabled:=AColumnIsSelected;
end;
procedure TColumnDlg.WriteDebugReport;
var
I: Integer;
begin
DebugLn('TColumnDlg.WriteDebugReport: ');
for I := 0 to ColumnsListBox.Items.Count-1 do begin
DebugLn('ListBox: ',IntToStr(i),' "',ColumnsListBox.Items[I],'"');
end;
for I := 0 to FColumns.Count-1 do begin
DebugLn('Columns: ',IntToStr(i),' "',FColumns[i].Caption,'" ');
end;
end;
procedure TColumnDlg.cbVisibleOnClick(Sender : TObject);
begin
if FSelectedIndex = -1 then Exit;
FColumns[FSelectedIndex].Visible := cbVisible.Checked;
end;
procedure TColumnDlg.cbAutoSizeOnClick(Sender : TObject);
begin
if FSelectedIndex = -1 then Exit;
FColumns[FSelectedIndex].AutoSize := cbAutoSize.Checked;
end;
end.