IDE: Refactor IDECoolBar classes. Move stuff from options frame to TIDECoolBar.

git-svn-id: trunk@62723 -
This commit is contained in:
juha 2020-03-08 23:00:22 +00:00
parent 44f5630b20
commit 7d8ad4dd58
2 changed files with 193 additions and 172 deletions

View File

@ -30,13 +30,13 @@ interface
uses
Classes, SysUtils,
// LCL
Forms, ExtCtrls, ComCtrls, Buttons, Controls, Graphics, Dialogs, StdCtrls, Spin, LCLProc,
Forms, ExtCtrls, ComCtrls, Buttons, Controls, StdCtrls, Spin,
// LazControls
DividerBevel,
// IDEIntf
IDEOptionsIntf, IDEOptEditorIntf, IDEImagesIntf,
// IDE
LazarusIDEStrConsts, EnvironmentOpts, IdeCoolbarData;
LazarusIDEStrConsts, MainBar, EnvironmentOpts, IdeCoolbarData;
type
@ -88,13 +88,8 @@ type
FTempCoolBarOptions: TIDECoolBarOptions;
// Used for assigning and testing the default configuration.
FDefaultOptions: TDefaultCoolBarOptions;
function AddBand(ToolBar: TToolBar; aBreak: Boolean): TCoolBand;
procedure EnableDisableGeneralButtons;
procedure EnableDisableToolbarButtons;
procedure SelectBand(const ID: integer);
function GetSelectedBand: Integer;
procedure ToolBarClick(Sender: TObject);
procedure PopulateToolBar;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
@ -108,8 +103,6 @@ type
implementation
uses MainBar, ToolbarConfig;
{$R *.lfm}
{ TIdeCoolbarOptionsFrame }
@ -200,7 +193,8 @@ begin
else
FTempCoolBar.CopyFromOptions(Opts);
PopulateToolBar;
FTempCoolBar.PopulateToolBar;
EnableDisableToolbarButtons;
end;
procedure TIdeCoolbarOptionsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
@ -226,15 +220,8 @@ end;
procedure TIdeCoolbarOptionsFrame.CoolBarMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: integer);
var
ABand: integer;
AGrabber: boolean;
begin
FTempCoolBar.CoolBar.MouseToBandPos(X, Y, ABand, AGrabber);
if ABand < 0 then
Exit;
if FTempCoolBar.CoolBar.Bands.Items[ABand].Color <> clHighlight then
SelectBand(ABand);
FTempCoolBar.SelectBandAtXY(X, Y);
end;
procedure TIdeCoolbarOptionsFrame.CoolbarResize(Sender: TObject);
@ -288,47 +275,6 @@ begin
EnableDisableGeneralButtons;
end;
procedure TIdeCoolbarOptionsFrame.SelectBand(const ID: integer);
var
I: integer;
Band: TCoolBand;
begin
FTempCoolBar.Coolbar.Color := clDefault;
for I := 0 to FTempCoolBar.CoolBar.Bands.Count - 1 do
begin
Band := FTempCoolBar.CoolBar.Bands.Items[I];
if I <> ID then
begin
Band.Color := clDefault;
Band.Control.Color := clDefault;
end
else
begin
Band.Color := clHighlight;
Band.Control.Color := clHighLight;
end;
end;
end;
function TIdeCoolbarOptionsFrame.GetSelectedBand: Integer;
var
I: Integer;
begin
Result := -1;
for I := 0 to FTempCoolBar.CoolBar.Bands.Count - 1 do
if FTempCoolBar.CoolBar.Bands.Items[I].Color = clHighlight then
Exit(I);
end;
procedure TIdeCoolbarOptionsFrame.ToolBarClick(Sender: TObject);
var
CoolBand: TCoolBand;
begin
CoolBand := FTempCoolBar.Coolbar.Bands.FindBand(Sender as TToolBar);
if CoolBand <> nil then
SelectBand(CoolBand.Index);
end;
procedure TIdeCoolbarOptionsFrame.EnableDisableGeneralButtons;
begin
bDefaultGeneral.Enabled := not FTempCoolBar.IsDefaultCoolbar;
@ -336,122 +282,30 @@ end;
procedure TIdeCoolbarOptionsFrame.EnableDisableToolbarButtons;
var
I: Integer;
Selected: Boolean;
IsSel: Boolean;
begin
Selected := False;
for I := 0 to FTempCoolBar.Coolbar.Bands.Count - 1 do
begin
if FTempCoolBar.Coolbar.Bands[I].Color = clHighlight then
begin
Selected := True;
Break;
end;
end;
bConfig.Enabled := Selected;
bDelete.Enabled := Selected;
IsSel := FTempCoolBar.GetSelectedBand > -1;
bConfig.Enabled := IsSel;
bDelete.Enabled := IsSel;
bDefaultToolbar.Enabled := not FTempCoolBar.IsDefaultToolbar;
end;
procedure UseToolbarButtons(IDEToolbar: TIDEToolBar);
var
I: Integer;
begin
IDEToolbar.UseCurrentOptions;
for I := 0 to Pred(IDEToolbar.ToolBar.ButtonCount) do
IDEToolbar.ToolBar.Buttons[I].Enabled := False;
end;
function TIdeCoolbarOptionsFrame.AddBand(ToolBar: TToolBar; aBreak: Boolean): TCoolBand;
begin
Result := FTempCoolBar.CoolBar.Bands.Add;
Result.Break := aBreak;
Result.Control := Toolbar;
//Result.MinWidth := 25;
//Result.MinHeight := 22;
Result.FixedSize := True;
end;
procedure TIdeCoolbarOptionsFrame.PopulateToolBar;
var
I: Integer;
IDEToolbar: TIDEToolBar;
begin
FTempCoolBar.CoolBar.Bands.Clear;
for I := 0 to FTempCoolBar.ToolBars.Count - 1 do
begin
IDEToolbar := FTempCoolBar.ToolBars[I];
IDEToolbar.OnToolBarClick := @ToolBarClick;
IDEToolbar.ToolBar.DisabledImages := IDEToolbar.ToolBar.Images;
AddBand(IDEToolbar.ToolBar, IDEToolbar.CurrentOptions.Break);
UseToolbarButtons(IDEToolbar);
end;
if FTempCoolBar.CoolBar.Bands.Count > 0 then
SelectBand(0);
FTempCoolBar.Coolbar.AutosizeBands;
EnableDisableToolbarButtons;
end;
procedure TIdeCoolbarOptionsFrame.bAddClick(Sender: TObject);
var
IDEToolbar: TIDEToolBar;
begin
IDEToolbar := FTempCoolBar.Add;
IDEToolbar.CurrentOptions.Break := False;
IDEToolbar.OnToolBarClick := @ToolBarClick;
IDEToolbar.ToolBar.DisabledImages := IDEToolbar.ToolBar.Images;
SelectBand(AddBand(IDEToolbar.ToolBar, True).Index);
FTempCoolBar.AddExtra;
EnableDisableToolbarButtons;
end;
procedure TIdeCoolbarOptionsFrame.bConfigClick(Sender: TObject);
var
ToConfig: Integer;
ToolBar: TToolBar;
IDEToolbar: TIDEToolBar;
begin
ToConfig := GetSelectedBand;
if ToConfig = -1 then
begin
MessageDlg(lisCoolbarSelectToolBar, mtInformation, [mbOk], 0);
Exit;
end;
ToolBar := FTempCoolBar.Coolbar.Bands.Items[ToConfig].Control as TToolBar;
Assert(Assigned(ToolBar), 'TIdeCoolbarOptionsFrame.bConfigClick: ToolBar=Nil.');
Assert(ToConfig = FTempCoolBar.FindByToolBar(ToolBar),
'TIdeCoolbarOptionsFrame.bConfigClick: Indices differ!');
IDEToolbar := FTempCoolBar.ToolBars[ToConfig];
if ShowToolBarConfig(IDEToolbar.CurrentOptions.ButtonNames) = mrOK then
UseToolbarButtons(IDEToolbar);
FTempCoolBar.Coolbar.AutosizeBands;
FTempCoolBar.Config;
EnableDisableToolbarButtons;
end;
procedure TIdeCoolbarOptionsFrame.bDeleteClick(Sender: TObject);
var
I: integer;
ToDelete: integer;
begin
if FTempCoolBar.Coolbar.Bands.Count = 1 then
begin
MessageDlg(lisCoolbarDeleteWarning, mtInformation, [mbOk], 0);
Exit;
end;
ToDelete := GetSelectedBand;
if ToDelete > -1 then
begin
if MessageDlg(lisCoolbarDeleteToolBar, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
if ToDelete < FTempCoolBar.CoolBar.Bands.Count-1 then
SelectBand(ToDelete + 1)
else if ToDelete > 0 then
SelectBand(ToDelete - 1);
I := FTempCoolBar.FindByToolBar((FTempCoolBar.CoolBar.Bands.Items[ToDelete].Control as TToolBar));
Assert(I = ToDelete, 'TIdeCoolbarOptionsFrame.bDeleteClick: index mismatch.');
// CoolBar Band gets deleted at the same go with FTempCoolBar item.
FTempCoolBar.ToolBars.Delete(ToDelete);
end;
end;
FTempCoolBar.Delete;
// CoolBar Band gets deleted at the same go with FTempCoolBar item.
EnableDisableToolbarButtons;
end;
@ -472,7 +326,8 @@ end;
procedure TIdeCoolbarOptionsFrame.bDefaultToolbarClick(Sender: TObject);
begin
FTempCoolBar.SetToolBarDefaults;
PopulateToolBar;
FTempCoolBar.PopulateToolBar;
EnableDisableToolbarButtons;
end;

View File

@ -33,8 +33,15 @@ unit IdeCoolbarData;
interface
uses
Classes, SysUtils, LCLProc, ComCtrls, ToolWin, Controls, fgl,
IDEImagesIntf, Laz2_XMLCfg, ToolbarConfig;
Classes, SysUtils, fgl,
// LCL
LCLProc, ComCtrls, Controls, Graphics, Dialogs, ToolWin,
// LazUtils
Laz2_XMLCfg,
// IdeIntf
IDEImagesIntf,
// IDE
LazarusIDEStrConsts, ToolbarConfig;
type
@ -137,7 +144,9 @@ type
FWidth: Integer; //same as Isvisible
// Used for assigning and testing the default configuration.
FDefaultOptions: TDefaultCoolBarOptions;
procedure DisableToolbarButtons(IDEToolbar: TIDEToolBar);
procedure SetIsVisible(AValue: Boolean);
procedure ToolBarClick(Sender: TObject);
public
constructor Create(ACoolBar: TCoolBar);
destructor Destroy; override;
@ -147,10 +156,18 @@ type
procedure CopyFromOptions(Options: TIDECoolBarOptions);
procedure CopyToOptions(Options: TIDECoolBarOptions);
function Add: TIDEToolBar;
function AddBand(ToolBar: TToolBar; aBreak: Boolean): TCoolBand;
procedure AddExtra;
procedure Delete;
function FindByToolBar(const aToolBar: TToolBar): Integer;
procedure Config;
procedure Sort;
procedure PopulateToolBar;
function GetSelectedBand: Integer;
function IsDefaultCoolbar: Boolean;
function IsDefaultToolbar: Boolean;
procedure SelectBand(const ID: integer);
procedure SelectBandAtXY(X, Y: integer);
public
property ToolBars: TIDEToolBarList read FCoolBarToolBars;
property CoolBar: TCoolBar read FCoolBar;
@ -384,12 +401,12 @@ begin
ButtonWidth := 22;
Height := 22;
Width := 0;
Flat := True;
Flat := True;
AutoSize := True;
Transparent := True;
EdgeInner := esNone;
EdgeOuter := esNone;
Images := IDEImages.Images_16;
Images := IDEImages.Images_16;
ShowHint := True;
OnClick := @DoToolBarClick;
end;
@ -430,13 +447,6 @@ end;
{ TIDECoolBar }
procedure TIDECoolBar.SetIsVisible(AValue: Boolean);
begin
FIsVisible := AValue;
if Assigned(FCoolBar) then
FCoolBar.Visible := AValue;
end;
constructor TIDECoolBar.Create(ACoolBar: TCoolBar);
begin
inherited Create;
@ -457,6 +467,22 @@ begin
inherited Destroy;
end;
procedure TIDECoolBar.SetIsVisible(AValue: Boolean);
begin
FIsVisible := AValue;
if Assigned(FCoolBar) then
FCoolBar.Visible := AValue;
end;
procedure TIDECoolBar.ToolBarClick(Sender: TObject);
var
CoolBand: TCoolBand;
begin
CoolBand := FCoolbar.Bands.FindBand(Sender as TToolBar);
if CoolBand <> nil then
SelectBand(CoolBand.Index);
end;
procedure TIDECoolBar.SetCoolBarDefaults;
begin
FCoolBar.Vertical := False;
@ -530,14 +556,82 @@ begin
FCoolBarToolBars.Add(Result);
end;
function TIDECoolBar.AddBand(ToolBar: TToolBar; aBreak: Boolean): TCoolBand;
begin
Result := FCoolBar.Bands.Add;
Result.Break := aBreak;
Result.Control := Toolbar;
//Result.MinWidth := 25;
//Result.MinHeight := 22;
Result.FixedSize := True;
end;
procedure TIDECoolBar.AddExtra;
var
IDEToolbar: TIDEToolBar;
begin
IDEToolbar := Add;
IDEToolbar.CurrentOptions.Break := False;
IDEToolbar.OnToolBarClick := @ToolBarClick;
IDEToolbar.ToolBar.DisabledImages := IDEToolbar.ToolBar.Images;
SelectBand(AddBand(IDEToolbar.ToolBar, True).Index);
end;
procedure TIDECoolBar.Delete;
var
I: integer;
ToDelete: integer;
begin
if FCoolbar.Bands.Count = 1 then
begin
MessageDlg(lisCoolbarDeleteWarning, mtInformation, [mbOk], 0);
Exit;
end;
ToDelete := GetSelectedBand;
if ToDelete > -1 then
begin
if MessageDlg(lisCoolbarDeleteToolBar, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
if ToDelete < FCoolBar.Bands.Count-1 then
SelectBand(ToDelete + 1)
else if ToDelete > 0 then
SelectBand(ToDelete - 1);
I := FindByToolBar((FCoolBar.Bands.Items[ToDelete].Control as TToolBar));
Assert(I = ToDelete, 'TIDECoolBar.Delete: index mismatch.');
ToolBars.Delete(ToDelete);
end;
end;
end;
function TIDECoolBar.FindByToolBar(const aToolBar: TToolBar): Integer;
var
I: Integer;
begin
Result := -1;
for I := 0 to FCoolbarToolBars.Count-1 do
if ToolBars[I].ToolBar = aToolBar then
Exit(I);
Result := -1;
end;
procedure TIDECoolBar.Config;
var
ToConfig: Integer;
ToolBar: TToolBar;
IDEToolbar: TIDEToolBar;
begin
ToConfig := GetSelectedBand;
if ToConfig = -1 then
begin
MessageDlg(lisCoolbarSelectToolBar, mtInformation, [mbOk], 0);
Exit;
end;
ToolBar := FCoolbar.Bands.Items[ToConfig].Control as TToolBar;
Assert(Assigned(ToolBar), 'TIDECoolBar.Config: ToolBar=Nil.');
Assert(ToConfig=FindByToolBar(ToolBar), 'TIDECoolBar.Config: Indices differ!');
IDEToolbar := ToolBars[ToConfig];
if ShowToolBarConfig(IDEToolbar.CurrentOptions.ButtonNames) = mrOK then
DisableToolbarButtons(IDEToolbar);
FCoolbar.AutosizeBands;
end;
function Compare(const Item1, Item2: TIDEToolBar): Integer;
@ -550,6 +644,44 @@ begin
FCoolbarToolBars.Sort(@Compare);
end;
procedure TIDECoolBar.DisableToolbarButtons(IDEToolbar: TIDEToolBar);
var
I: Integer;
begin
IDEToolbar.UseCurrentOptions;
for I := 0 to Pred(IDEToolbar.ToolBar.ButtonCount) do
IDEToolbar.ToolBar.Buttons[I].Enabled := False;
end;
procedure TIDECoolBar.PopulateToolBar;
var
I: Integer;
IDEToolbar: TIDEToolBar;
begin
FCoolBar.Bands.Clear;
for I := 0 to ToolBars.Count - 1 do
begin
IDEToolbar := ToolBars[I];
IDEToolbar.OnToolBarClick := @ToolBarClick;
IDEToolbar.ToolBar.DisabledImages := IDEToolbar.ToolBar.Images;
AddBand(IDEToolbar.ToolBar, IDEToolbar.CurrentOptions.Break);
DisableToolbarButtons(IDEToolbar);
end;
if FCoolBar.Bands.Count > 0 then
SelectBand(0);
FCoolbar.AutosizeBands;
end;
function TIDECoolBar.GetSelectedBand: Integer;
var
I: Integer;
begin
for I := 0 to FCoolBar.Bands.Count - 1 do
if FCoolBar.Bands.Items[I].Color = clHighlight then
Exit(I);
Result := -1;
end;
function TIDECoolBar.IsDefaultCoolbar: Boolean;
begin
Result := (FIsVisible) and (FCoolBar.BandBorderStyle = bsSingle) and
@ -570,4 +702,38 @@ begin
end;
end;
procedure TIDECoolBar.SelectBand(const ID: integer);
var
I: integer;
Band: TCoolBand;
begin
FCoolbar.Color := clDefault;
for I := 0 to FCoolBar.Bands.Count - 1 do
begin
Band := FCoolBar.Bands.Items[I];
if I <> ID then
begin
Band.Color := clDefault;
Band.Control.Color := clDefault;
end
else
begin
Band.Color := clHighlight;
Band.Control.Color := clHighLight;
end;
end;
end;
procedure TIDECoolBar.SelectBandAtXY(X, Y: integer);
var
ABand: integer;
AGrabber: boolean;
begin
FCoolBar.MouseToBandPos(X, Y, ABand, AGrabber);
if ABand < 0 then
Exit;
if FCoolBar.Bands.Items[ABand].Color <> clHighlight then
SelectBand(ABand);
end;
end.