916 lines
23 KiB
ObjectPascal

{ RxMDI unit
Copyright (C) 2005-2017 Lagunov Aleksey alexs75@yandex.ru and Lazarus team
original conception from rx library for Delphi (c)
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version with the following modification:
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent modules,and
to copy and distribute the resulting executable under terms of your choice,
provided that you also meet, for each linked independent module, the terms
and conditions of the license of that module. An independent module is a
module which is not derived from or based on this library. If you modify
this library, you may extend this exception to your version of the library,
but you are not obligated to do so. If you do not wish to do so, delete this
exception statement from your version.
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. See the GNU Library General Public License
for more details.
You should have received a copy of the GNU Library General Public License
along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
unit RxMDI;
{$I rx.inc}
interface
uses
Classes, SysUtils, Forms, Buttons, Menus, ExtCtrls, Graphics, Controls;
type
TRxMDITaskOption = (rxtoMidleClickClose);
TRxMDITaskOptions = set of TRxMDITaskOption;
TRxMDIPanel = class;
TRxMDITasks = class;
TRxMDIPanelChangeCurrentChild = procedure (Sender:TRxMDIPanel; AForm:TForm) of object;
{ TRxMDIButton }
TRxMDIButton = class(TSpeedButton)
private
FNavForm: TForm;
FActiveControl:TWinControl;
FNavPanel:TRxMDITasks;
procedure SetRxMDIForm(AValue: TForm);
procedure DoCreateMenuItems;
procedure DoCloseMenu(Sender: TObject);
procedure DoCloseAllMenu(Sender: TObject);
procedure DoCloseAllExcepThisMenu(Sender: TObject);
procedure DoActivateMenu(Sender: TObject);
procedure DoCreateButtonImage;
private
FMenu:TPopupMenu;
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor CreateButton(AOwner:TRxMDITasks; AForm:TForm);
procedure Click; override; // make Click public
procedure UpdateCaption;
property NavForm:TForm read FNavForm write SeTRxMDIForm;
end;
{ TRxMDITasks }
TRxMDITasks = class(TCustomPanel)
private
FBtnScrollLeft:TSpeedButton;
FBtnScrollRigth:TSpeedButton;
FMainPanel: TRxMDIPanel;
FOptions: TRxMDITaskOptions;
function GetFlatButton: boolean;
procedure SetFlatButton(AValue: boolean);
procedure UpdateScrollBtnStatus;
procedure ScrollLeftExecute(Sender: TObject);
procedure ScrollRigthExecute(Sender: TObject);
procedure ShowHiddenBtnOnResize;
procedure ChildWindowsShowLast;
procedure DoCloseAll(AIgnoreBtn:TRxMDIButton);
protected
procedure Paint; override;
procedure Resize; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure AddButton(Btn:TRxMDIButton);
procedure ShowWindow(F:TForm);
property MainPanel:TRxMDIPanel read FMainPanel write FMainPanel;
published
property Align;
property ShowHint;
property Color;
property ParentShowHint;
property FlatButton:boolean read GetFlatButton write SetFlatButton;
property Options:TRxMDITaskOptions read FOptions write FOptions;
end;
{ TRxMDICloseButton }
TRxMDICloseButton = class(TCustomSpeedButton)
private
FInfoLabel:TBoundLabel;
FLabelSpacing:integer;
FMDIPanel:TRxMDIPanel;
FShowInfoLabel: boolean;
procedure SetShowInfoLabel(AValue: boolean);
protected
procedure SetParent(AParent: TWinControl); override;
procedure Loaded; override;
procedure DoPositionLabel;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure CreateInternalLabel;
public
constructor Create(AOwner: TComponent); override;
published
property Align;
property Anchors;
property Glyph;
property Flat;
property ShowInfoLabel:boolean read FShowInfoLabel write SetShowInfoLabel default true;
end;
{ TRxMDIPanel }
TRxMDIPanel = class(TCustomPanel)
private
FCurrentChildWindow: TForm;
FCloseButton: TRxMDICloseButton;
FHideCloseButton: boolean;
FOnChangeCurrentChild: TRxMDIPanelChangeCurrentChild;
FTaskPanel: TRxMDITasks;
procedure SetCurrentChildWindow(AValue: TForm);
procedure navCloseButtonClick(Sender: TObject);
procedure SetHideCloseButton(AValue: boolean);
procedure SetRxMDICloseButton(AValue: TRxMDICloseButton);
procedure SetTaskPanel(AValue: TRxMDITasks);
function MDIButtonByForm(AForm:TForm):TRxMDIButton;
procedure HideCurrentWindow;
procedure ScreenEventRemoveForm(Sender: TObject; Form: TCustomForm);
procedure DoOnChangeCurrentChild(AForm:TForm);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure Loaded; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure ShowWindow(F:TForm);
procedure ChildWindowsAdd(F:TForm);
procedure ChildWindowsCreate(var AForm; FC:TFormClass);
procedure ChildWindowsUpdateCaption(F:TForm);
procedure CloseAll;
property CurrentChildWindow:TForm read FCurrentChildWindow write SetCurrentChildWindow;
published
property CloseButton:TRxMDICloseButton read FCloseButton write SetRxMDICloseButton;
property TaskPanel:TRxMDITasks read FTaskPanel write SetTaskPanel;
property Align;
property BevelInner;
property BevelOuter;
property ShowHint;
property ParentShowHint;
property HideCloseButton:boolean read FHideCloseButton write SetHideCloseButton;
property OnChangeCurrentChild:TRxMDIPanelChangeCurrentChild read FOnChangeCurrentChild write FOnChangeCurrentChild;
end;
implementation
uses LResources, rxlclutils, rxconst;
{ TRxMDICloseButton }
procedure TRxMDICloseButton.SetShowInfoLabel(AValue: boolean);
begin
if FShowInfoLabel=AValue then Exit;
FShowInfoLabel:=AValue;
if Assigned(FInfoLabel) then
FInfoLabel.Visible:=FShowInfoLabel;
end;
procedure TRxMDICloseButton.SetParent(AParent: TWinControl);
begin
inherited SetParent(AParent);
DoPositionLabel;
end;
procedure TRxMDICloseButton.Loaded;
begin
inherited Loaded;
DoPositionLabel;
end;
procedure TRxMDICloseButton.DoPositionLabel;
begin
if FInfoLabel = nil then exit;
if Parent<>nil then
Parent.DisableAlign;
//DebugLn(['TCustomLabeledEdit.DoPositionLabel ']);
FInfoLabel.Parent := Parent;
FInfoLabel.Visible := Visible and FShowInfoLabel;
{ case FLabelPosition of
lpAbove:
begin
FInfoLabel.AnchorParallel(akLeft,0,Self);
FInfoLabel.AnchorToCompanion(akBottom,FLabelSpacing,Self);
end;
lpBelow:
begin
FInfoLabel.AnchorParallel(akLeft,0,Self);
FInfoLabel.AnchorToCompanion(akTop,FLabelSpacing,Self);
end;
lpLeft :
begin}
FInfoLabel.AnchorToCompanion(akRight,FLabelSpacing,Self);
FInfoLabel.AnchorVerticalCenterTo(Self);
{ end;
lpRight:
begin
FInfoLabel.AnchorToCompanion(akLeft,FLabelSpacing,Self);
FInfoLabel.AnchorVerticalCenterTo(Self);
end;
end;}
if Parent<>nil then
Parent.EnableAlign;
end;
procedure TRxMDICloseButton.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (AComponent = FInfoLabel) and (Operation = opRemove) then
FInfoLabel := nil
else
if (AComponent = FMDIPanel) and (Operation = opRemove) then
begin
FMDIPanel:=nil;
OnClick:=nil;
end
end;
procedure TRxMDICloseButton.CreateInternalLabel;
begin
if FInfoLabel<>nil then exit;
FInfoLabel := TBoundLabel.Create(Self);
FInfoLabel.ControlStyle := FInfoLabel.ControlStyle + [csNoDesignSelectable];
FInfoLabel.Visible:=FShowInfoLabel;
end;
constructor TRxMDICloseButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// FLabelPosition := lpAbove;
FLabelSpacing := 6;
FShowInfoLabel:=true;
CreateInternalLabel;
Glyph:=LoadLazResBitmapImage('RxMDICloseIcon');
end;
{ TRxMDIPanel }
procedure TRxMDIPanel.SetCurrentChildWindow(AValue: TForm);
begin
FCurrentChildWindow:=AValue;
if Assigned(FCloseButton) then
begin
FCloseButton.Enabled:=Assigned(FCurrentChildWindow);
if FHideCloseButton then
FCloseButton.Visible:=FCloseButton.Enabled;
if FCloseButton.Enabled then
FCloseButton.FInfoLabel.Caption:=FCurrentChildWindow.Caption
else
FCloseButton.FInfoLabel.Caption:='';
end;
if Assigned(TaskPanel) then
TaskPanel.Visible:=Assigned(FCurrentChildWindow);
end;
procedure TRxMDIPanel.navCloseButtonClick(Sender: TObject);
begin
if Assigned(FCurrentChildWindow) then
begin
if not (csDestroying in FCurrentChildWindow.ComponentState) then
FCurrentChildWindow.Close
end;
end;
procedure TRxMDIPanel.SetHideCloseButton(AValue: boolean);
begin
if FHideCloseButton=AValue then Exit;
FHideCloseButton:=AValue;
if Assigned(FCloseButton) then
if FHideCloseButton then
FCloseButton.Visible:=FCloseButton.Enabled
else
FCloseButton.Visible:=true;
end;
procedure TRxMDIPanel.SetRxMDICloseButton(AValue: TRxMDICloseButton);
begin
if FCloseButton=AValue then Exit;
if Assigned(FCloseButton) then
begin
FCloseButton.OnClick:=nil;
FCloseButton.FMDIPanel:=nil;
end;
FCloseButton:=AValue;
if Assigned(FCloseButton) then
begin
FCloseButton.OnClick:=@navCloseButtonClick;
FCloseButton.FMDIPanel:=Self;
end;
end;
procedure TRxMDIPanel.SetTaskPanel(AValue: TRxMDITasks);
begin
if FTaskPanel=AValue then Exit;
FTaskPanel:=AValue;
if Assigned(FTaskPanel) then
FTaskPanel.FMainPanel:=Self;
end;
function TRxMDIPanel.MDIButtonByForm(AForm: TForm): TRxMDIButton;
var
i:integer;
begin
Result:=nil;
if not Assigned(FTaskPanel) then
exit;
for i:=0 to FTaskPanel.ComponentCount -1 do
begin
if (FTaskPanel.Components[i] is TRxMDIButton) and (TRxMDIButton(FTaskPanel.Components[i]).NavForm = AForm) then
begin
Result:=TRxMDIButton(FTaskPanel.Components[i]);
exit;
end;
end;
end;
procedure TRxMDIPanel.HideCurrentWindow;
var
MB:TRxMDIButton;
begin
if Assigned(FCurrentChildWindow) and (FCurrentChildWindow.Visible) then
begin
MB:=MDIButtonByForm(FCurrentChildWindow);
if Assigned(MB) then
MB.FActiveControl:=Application.MainForm.ActiveControl;
FCurrentChildWindow.Hide;
end;
end;
procedure TRxMDIPanel.ScreenEventRemoveForm(Sender: TObject; Form: TCustomForm);
var
i: Integer;
begin
if Assigned(FTaskPanel) then
begin
for i:=0 to FTaskPanel.ComponentCount-1 do
begin;
if (FTaskPanel.Components[i] is TRxMDIButton) and (TRxMDIButton(FTaskPanel.Components[i]).NavForm = Form) then
TRxMDIButton(FTaskPanel.Components[i]).FActiveControl:=nil;
end;
end;
end;
procedure TRxMDIPanel.DoOnChangeCurrentChild(AForm: TForm);
begin
if Assigned(FOnChangeCurrentChild) then
FOnChangeCurrentChild(Self, AForm);
end;
procedure TRxMDIPanel.Notification(AComponent: TComponent; Operation: TOperation
);
begin
inherited Notification(AComponent, Operation);
if (AComponent = FCloseButton) and (Operation = opRemove) then
FCloseButton := nil
else
if (AComponent = FTaskPanel) and (Operation = opRemove) then
FTaskPanel:=nil;
end;
procedure TRxMDIPanel.Loaded;
begin
inherited Loaded;
CurrentChildWindow:=nil;
end;
constructor TRxMDIPanel.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
Caption:='';
Align:=alClient;
BevelOuter:=bvLowered;
Screen.AddHandlerRemoveForm(@ScreenEventRemoveForm);
end;
destructor TRxMDIPanel.Destroy;
begin
Screen.RemoveHandlerRemoveForm(@ScreenEventRemoveForm);
inherited Destroy;
end;
procedure TRxMDIPanel.ShowWindow(F: TForm);
begin
TaskPanel.ShowWindow(F);
end;
procedure TRxMDIPanel.ChildWindowsAdd(F: TForm);
var
B:TRxMDIButton;
begin
Assert(Assigned(TaskPanel), sErrorLinkedTaskPanel);
HideCurrentWindow;
F.BorderStyle:=bsNone;
F.Align:=alClient;
F.Parent:=Self;
F.Visible:=true;
F.BringToFront;
if Assigned(Application) and Assigned(Application.MainForm) then
Application.MainForm.ActiveControl:=F;
B:=TRxMDIButton.CreateButton(TaskPanel, F);
DoOnChangeCurrentChild(F);
end;
procedure TRxMDIPanel.ChildWindowsCreate(var AForm; FC: TFormClass);
var
FForm:TForm absolute AForm;
begin
if not Assigned(FForm) then
begin
HideCurrentWindow;
FForm:=FC.Create(Self);
ChildWindowsAdd(FForm);
end
else
begin
ShowWindow(FForm);
DoOnChangeCurrentChild(FForm);
end;
end;
procedure TRxMDIPanel.ChildWindowsUpdateCaption(F: TForm);
var
i:integer;
B:TRxMDIButton;
begin
if (FCurrentChildWindow = F) and Assigned(FCloseButton) and FCloseButton.Enabled then
FCloseButton.FInfoLabel.Caption:=F.Caption;
for i:=0 to TaskPanel.ComponentCount -1 do
begin
if TRxMDIButton(TaskPanel.Components[i]).NavForm = F then
begin
TRxMDIButton(TaskPanel.Components[i]).UpdateCaption;
exit;
end;
end;
end;
procedure TRxMDIPanel.CloseAll;
begin
if Assigned(FTaskPanel) then
FTaskPanel.DoCloseAll(nil);
end;
{ TRxMDITasks }
procedure TRxMDITasks.UpdateScrollBtnStatus;
var
i, W:Integer;
B:TRxMDIButton;
begin
W:=FBtnScrollLeft.Width + FBtnScrollRigth.Width;
FBtnScrollLeft.Enabled:=false;
for i:=0 to ComponentCount-1 do
begin
B:=TRxMDIButton(Components[i]);
if not B.Visible then
FBtnScrollLeft.Enabled:=true
else
W:=W+B.Width + 2;
end;
FBtnScrollRigth.Enabled:=W > Width;
end;
function TRxMDITasks.GetFlatButton: boolean;
begin
Result:=FBtnScrollLeft.Flat;
end;
procedure TRxMDITasks.SetFlatButton(AValue: boolean);
var
B: TComponent;
begin
FBtnScrollLeft.Flat:=AValue;
FBtnScrollRigth.Flat:=AValue;
for B in Self do
if (B is TRxMDIButton) then
TRxMDIButton(B).Flat:=AValue;
end;
procedure TRxMDITasks.ScrollLeftExecute(Sender: TObject);
var
i:Integer;
B:TRxMDIButton;
begin
for i:=0 to ComponentCount-1 do
begin
if (Components[i] is TRxMDIButton) then
begin
B:=TRxMDIButton(Components[i]);
if not B.Visible then
begin
B.Visible:=true;
B.Left:=FBtnScrollLeft.Width;
break;
end;
end;
end;
UpdateScrollBtnStatus;
Invalidate;
end;
procedure TRxMDITasks.ScrollRigthExecute(Sender: TObject);
var
i:Integer;
B:TRxMDIButton;
begin
for i:=0 to ComponentCount - 1 do
begin
if (Components[i] is TRxMDIButton) then
begin
B:=TRxMDIButton(Components[i]);
if B.Visible then
begin
B.Visible:=false;
break;
end;
end;
end;
UpdateScrollBtnStatus;
Invalidate;
end;
procedure TRxMDITasks.ShowHiddenBtnOnResize;
begin
end;
procedure TRxMDITasks.ChildWindowsShowLast;
var
CC:TControl;
i:integer;
begin
if (FMainPanel.ControlCount>1) and (not Application.Terminated) then
begin
CC:=FMainPanel.Controls[FMainPanel.ControlCount-2];
if Assigned(CC) then
ShowWindow(CC as TForm)
end
else
begin
FMainPanel.CurrentChildWindow:=nil;
if not Application.Terminated then
if Assigned(FMainPanel) then
FMainPanel.DoOnChangeCurrentChild(nil);
end;
// Invalidate;
end;
procedure TRxMDITasks.DoCloseAll(AIgnoreBtn: TRxMDIButton);
var
i:integer;
begin
for i:=ComponentCount-1 downto 0 do
begin
if (Components[i] is TRxMDIButton) and (TRxMDIButton(Components[i]) <> AIgnoreBtn) then
TRxMDIButton(Components[i]).DoCloseMenu(nil);
end;
if Assigned(AIgnoreBtn) then
FMainPanel.CurrentChildWindow:=AIgnoreBtn.FNavForm;
end;
procedure TRxMDITasks.Paint;
var
i:integer;
H:integer;
B:TRxMDIButton;
begin
inherited Paint;
Canvas.Pen.Color:=clBlack;
H:=Height - 2;
for i:=0 to ComponentCount - 1 do
begin
if (Components[i] is TRxMDIButton) then
begin
B:=TRxMDIButton(Components[i]);
if (B.Visible) and (B.Left > B.Width) then
begin
Canvas.Pen.Color:=clBtnShadow;
Canvas.Line(B.Left - 2, 2, B.Left - 2, H);
Canvas.Pen.Color:=clWindow;
Canvas.Line(B.Left - 1, 2, B.Left - 1, H);
end;
end;
end;
end;
procedure TRxMDITasks.Resize;
begin
inherited Resize;
if Assigned(FBtnScrollLeft) and Assigned(FBtnScrollRigth) then
UpdateScrollBtnStatus;
end;
procedure TRxMDITasks.Notification(AComponent: TComponent; Operation: TOperation
);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) then
begin
if (AComponent = FMainPanel) then
FMainPanel := nil
else
if (AComponent is TRxMDIButton) then
Invalidate;
end;
end;
constructor TRxMDITasks.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
Caption:='';
FBtnScrollLeft:=TSpeedButton.Create(Self);
FBtnScrollLeft.Parent:=Self;
FBtnScrollLeft.Align:=alLeft;
FBtnScrollLeft.AnchorSide[akLeft].Control:=Self;
FBtnScrollLeft.Anchors:=[akLeft, akTop, akBottom];
FBtnScrollLeft.OnClick:=@ScrollLeftExecute;
FBtnScrollLeft.Caption:='<';
FBtnScrollLeft.ShowCaption:=true;
FBtnScrollLeft.AutoSize:=true;
FBtnScrollLeft.Flat:=true;
FBtnScrollLeft.Transparent:=false;
FBtnScrollRigth:=TSpeedButton.Create(Self);
FBtnScrollRigth.Parent:=Self;
FBtnScrollRigth.Align:=alRight;
FBtnScrollRigth.Anchors:=[akRight, akTop, akBottom];
FBtnScrollRigth.AnchorSide[akRight].Control:=Self;
FBtnScrollRigth.OnClick:=@ScrollRigthExecute;
FBtnScrollRigth.Caption:='>';
FBtnScrollRigth.ShowCaption:=true;
FBtnScrollRigth.AutoSize:=true;
FBtnScrollRigth.Flat:=true;
FBtnScrollRigth.Transparent:=false;
Align:=alBottom;
Height:=25;
end;
destructor TRxMDITasks.Destroy;
begin
FBtnScrollRigth:=nil;
FBtnScrollLeft:=nil;
inherited Destroy;
end;
procedure TRxMDITasks.AddButton(Btn: TRxMDIButton);
begin
Btn.Parent:=Self;
Btn.Left:=Width-1;
Btn.Down:=true;
Btn.BorderSpacing.Left:=3;
Btn.BorderSpacing.Right:=3;
Btn.Flat:=FlatButton;
FBtnScrollRigth.BringToFront;
FBtnScrollLeft.BringToFront;
UpdateScrollBtnStatus;
end;
procedure TRxMDITasks.ShowWindow(F: TForm);
var
i:integer;
begin
for i:=0 to ComponentCount -1 do
begin
if (Components[i] is TRxMDIButton) and (TRxMDIButton(Components[i]).NavForm = F) then
begin
TRxMDIButton(Components[i]).Click;
TRxMDIButton(Components[i]).Visible:=true;
exit;
end;
end;
end;
{ TRxMDIButton }
procedure TRxMDIButton.SetRxMDIForm(AValue: TForm);
var
FImageIndex:integer;
B:TBitmap;
begin
if FNavForm=AValue then Exit;
FNavForm:=AValue;
if Assigned(FNavForm) then
begin
FNavForm.AddHandlerClose(@FormClose);
Caption:=' '+FNavForm.Caption+' ';
DoCreateButtonImage;
if Assigned(FNavPanel) then
FNavPanel.FMainPanel.CurrentChildWindow:=NavForm;
end;
end;
procedure TRxMDIButton.DoCreateMenuItems;
var
Item: TMenuItem;
begin
Item:=TMenuItem.Create(Self);
Item.Caption:=Caption;
Item.OnClick:=@DoActivateMenu;
FMenu.Items.Add(Item);
Item:=TMenuItem.Create(Self);
Item.Caption:='-';
FMenu.Items.Add(Item);
Item:=TMenuItem.Create(Self);
Item.Caption:=sCloseWindows;
Item.OnClick:=@DoCloseMenu;
FMenu.Items.Add(Item);
Item:=TMenuItem.Create(Self);
Item.Caption:='-';
FMenu.Items.Add(Item);
Item:=TMenuItem.Create(Self);
Item.Caption:=sCloseAllExceptThis;
Item.OnClick:=@DoCloseAllExcepThisMenu;
FMenu.Items.Add(Item);
Item:=TMenuItem.Create(Self);
Item.Caption:=sCloseAllWindows;
Item.OnClick:=@DoCloseAllMenu;
FMenu.Items.Add(Item);
end;
procedure TRxMDIButton.DoCloseMenu(Sender: TObject);
begin
if Assigned(FNavForm) then
FNavForm.Close;
end;
procedure TRxMDIButton.DoCloseAllMenu(Sender: TObject);
begin
FNavPanel.DoCloseAll(nil);
end;
procedure TRxMDIButton.DoCloseAllExcepThisMenu(Sender: TObject);
begin
FNavPanel.DoCloseAll(Self);
end;
procedure TRxMDIButton.DoActivateMenu(Sender: TObject);
begin
Click;
end;
procedure TRxMDIButton.DoCreateButtonImage;
var
FImageIndex:integer;
B:TBitmap;
begin
if Assigned(NavForm.Icon) and (NavForm.Icon.Count>0) then
begin
B:=TBitmap.Create;
try
B.Width:=NavForm.Icon.Width;
B.Height:=NavForm.Icon.Height;
B.Canvas.Brush.Color:=Color;
B.Canvas.FillRect(0,0, B.Width, B.Height);
B.Canvas.Draw(0, 0, NavForm.Icon);
Glyph.Assign(B);
finally
B.Free;
end;
end;
end;
procedure TRxMDIButton.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
if (not Assigned(FNavPanel)) or (not Assigned(FNavPanel.FMainPanel)) then
exit;
if FNavPanel.FMainPanel.FCurrentChildWindow = Sender then
FNavPanel.ChildWindowsShowLast;
FNavPanel.ShowHiddenBtnOnResize;
CloseAction:=caFree;
if Assigned(Owner) then
Owner.RemoveComponent(Self);
FNavPanel.FMainPanel.RemoveControl(Sender as TCustomForm);
Application.ReleaseComponent(Self);
end;
procedure TRxMDIButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited MouseDown(Button, Shift, X, Y);
if Button = mbMiddle then
begin
if Assigned(Owner) then
begin
if rxtoMidleClickClose in (Owner as TRxMDITasks).Options then
DoCloseMenu(Self);
end;
end;
end;
procedure TRxMDIButton.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (AComponent = FActiveControl) and (Operation = opRemove) then
FActiveControl := nil
end;
constructor TRxMDIButton.CreateButton(AOwner: TRxMDITasks; AForm: TForm);
begin
inherited Create(AOwner);
FNavPanel:=AOwner;
Align:=alLeft;
NavForm:=AForm;
AutoSize:=true;
Flat:=true;
GroupIndex:=1;
FMenu:=TPopupMenu.Create(Self);
FMenu.Parent:=Self;
PopupMenu:=FMenu;
DoCreateMenuItems;
AOwner.AddButton(Self);
end;
procedure TRxMDIButton.Click;
begin
inherited Click;
if Assigned(FNavForm) then
begin
FNavPanel.FMainPanel.HideCurrentWindow;
FNavForm.Show;
FNavPanel.FMainPanel.CurrentChildWindow:=NavForm;
if Assigned(FActiveControl) and FActiveControl.HandleObjectShouldBeVisible then
FActiveControl.SetFocus;
if Assigned(FNavPanel.FMainPanel) then
FNavPanel.FMainPanel.DoOnChangeCurrentChild(FNavForm);
end;
Down:=true;
end;
procedure TRxMDIButton.UpdateCaption;
begin
if Assigned(FNavForm) then
Caption:=' '+FNavForm.Caption+' '
else
Caption:='---';
AdjustSize;
end;
initialization
{$I RxMDICloseIcon.lrs}
end.