513 lines
14 KiB
ObjectPascal

{ RxViewsPanel 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 RxViewsPanel;
{$I rx.inc}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Buttons, StdCtrls, LCLType;
type
TRxViewsPanel = class;
TRxViewsPanelItem = class;
TSelectViewEvent = procedure (Sender: TObject; ItemIndex:integer; const Item:TRxViewsPanelItem) of object;
{ TRxViewsPanelItem }
TRxViewsPanelItem = class(TCollectionItem)
private
FButton: TSpeedButton;
FImageIndex: integer;
FLabel:TLabel;
function GetAction: TBasicAction;
function GetCaption: string;
function GetEnabled: Boolean;
function GetHint: TTranslateString;
function GetImageIndex: integer;
function GetTag: Longint;
function GetVisible: boolean;
procedure SetAction(const AValue: TBasicAction);
procedure SetCaption(const AValue: string);
procedure SetEnabled(const AValue: Boolean);
procedure SetHint(const AValue: TTranslateString);
procedure SetImageIndex(const AValue: integer);
procedure SetTag(const AValue: Longint);
procedure SetVisible(const AValue: boolean);
procedure UpdatePosition;
procedure UpdateImage;
procedure DoViewButtonClick(Sender:TObject);
protected
function GetDisplayName: string; override;
public
constructor Create(ACollection: TCollection); override;
destructor Destroy; override;
published
property Action:TBasicAction read GetAction write SetAction;
property Visible:boolean read GetVisible write SetVisible;
property Caption:string read GetCaption Write SetCaption;
property Tag: Longint read GetTag write SetTag default 0;
property ImageIndex:integer read GetImageIndex write SetImageIndex;
property Hint:TTranslateString read GetHint write SetHint;
property Enabled: Boolean read GetEnabled write SetEnabled default True;
end;
{ TRxViewsPanelItems }
TRxViewsPanelItems = class(TCollection)
private
FRxViewsPanel:TRxViewsPanel;
function GetPanelItem(Index: Integer): TRxViewsPanelItem;
procedure SetPanelItem(Index: Integer; const AValue: TRxViewsPanelItem);
protected
procedure Update(Item: TCollectionItem);override;
public
constructor Create(ARxViewsPanel: TRxViewsPanel);
property Items[Index: Integer]: TRxViewsPanelItem read GetPanelItem write SetPanelItem; default;
procedure UpdateImages;
end;
{ TRxViewsPanel }
TRxViewsPanel = class(TCustomPanel)
private
FButtonHeght: integer;
FImageList: TImageList;
FItemIndex: integer;
FItems:TRxViewsPanelItems;
FOnSelectViewEvent: TSelectViewEvent;
function GetItems: TRxViewsPanelItems;
procedure SetButtonHeght(const AValue: integer);
procedure SetImageList(const AValue: TImageList);
procedure SetItemIndex(const AValue: integer);
procedure SetItems(const AValue: TRxViewsPanelItems);
procedure InternalSelectView(Item:TRxViewsPanelItem);
protected
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Align;
property Anchors;
property ButtonHeght:integer read FButtonHeght write SetButtonHeght;
property Color default clGrayText;
property Items:TRxViewsPanelItems read GetItems write SetItems;
property ImageList:TImageList read FImageList write SetImageList;
property OnSelectViewEvent:TSelectViewEvent read FOnSelectViewEvent write FOnSelectViewEvent;
property ItemIndex:integer read FItemIndex write SetItemIndex;
property Alignment;
property AutoSize;
property BorderSpacing;
property BevelInner;
property BevelOuter;
property BevelWidth;
property BidiMode;
property BorderWidth;
property BorderStyle;
property Caption;
property ChildSizing;
property ClientHeight;
property ClientWidth;
property Constraints;
property DockSite;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property Font;
property FullRepaint;
property ParentBidiMode;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property TabOrder;
property TabStop;
property UseDockManager default True;
property Visible;
property OnClick;
property OnContextPopup;
property OnDockDrop;
property OnDockOver;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnGetSiteInfo;
property OnGetDockCaption;
property OnMouseDown;
property OnMouseEnter;
property OnMouseLeave;
property OnMouseMove;
property OnMouseUp;
property OnMouseWheel;
property OnMouseWheelDown;
property OnMouseWheelUp;
property OnResize;
property OnStartDock;
property OnStartDrag;
property OnUnDock;
end;
implementation
{ TRxViewsPanel }
function TRxViewsPanel.GetItems: TRxViewsPanelItems;
begin
Result:=FItems;
end;
procedure TRxViewsPanel.SetButtonHeght(const AValue: integer);
var
I:integer;
begin
if FButtonHeght=AValue then exit;
FButtonHeght:=AValue;
for i:=0 to FItems.Count - 1 do
Items[i].FButton.Height:=AValue;
end;
procedure TRxViewsPanel.SetImageList(const AValue: TImageList);
begin
if FImageList=AValue then exit;
FImageList:=AValue;
FItems.UpdateImages;
end;
procedure TRxViewsPanel.SetItemIndex(const AValue: integer);
begin
if FItemIndex=AValue then exit;
if (AValue < 0) or (AValue > FItems.Count - 1) then exit;
FItemIndex:=AValue;
Items[AValue].FButton.Click;
Items[AValue].FButton.Down:=true;
end;
procedure TRxViewsPanel.SetItems(const AValue: TRxViewsPanelItems);
begin
FItems.Assign(AValue);
end;
procedure TRxViewsPanel.InternalSelectView(Item: TRxViewsPanelItem);
begin
FItemIndex:=Item.Index;
if Assigned(FOnSelectViewEvent) then
FOnSelectViewEvent(Self, Item.Index, Item);
end;
procedure TRxViewsPanel.Loaded;
begin
inherited Loaded;
FItems.Update(nil);
FItems.UpdateImages;
if (FItems.Count>0) and (FItemIndex>-1) and (FItemIndex < FItems.Count) then
FItems[FItemIndex].FButton.Down:=true;
end;
constructor TRxViewsPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
BevelOuter:=bvLowered;
Caption:='';
if Assigned(AOwner) then
Align:=alLeft;
Color:=clGrayText;
FItems:=TRxViewsPanelItems.Create(Self);
ControlStyle:=ControlStyle - [csSetCaption, csAcceptsControls];
FButtonHeght:=50;
end;
destructor TRxViewsPanel.Destroy;
begin
FreeAndNil(FItems);
inherited Destroy;
end;
{ TRxViewsPanelItem }
function TRxViewsPanelItem.GetAction: TBasicAction;
begin
Result:=FButton.Action;
end;
function TRxViewsPanelItem.GetCaption: string;
begin
Result:=FLabel.Caption;
end;
function TRxViewsPanelItem.GetEnabled: Boolean;
begin
Result:=FButton.Enabled;
end;
function TRxViewsPanelItem.GetHint: TTranslateString;
begin
Result:=FButton.Hint;
end;
function TRxViewsPanelItem.GetImageIndex: integer;
begin
{ if Assigned(FButton.Action) then
Result:=FButton.Action.;}
Result:=FImageIndex;
// FButton.Glyph.;
end;
function TRxViewsPanelItem.GetTag: Longint;
begin
Result:=FButton.Tag;
end;
function TRxViewsPanelItem.GetVisible: boolean;
begin
Result:=FButton.Visible;
end;
procedure TRxViewsPanelItem.SetAction(const AValue: TBasicAction);
begin
FButton.Action:=AValue;
end;
procedure TRxViewsPanelItem.SetCaption(const AValue: string);
begin
FLabel.Caption:=AValue;
end;
procedure TRxViewsPanelItem.SetEnabled(const AValue: Boolean);
begin
FButton.Enabled:=AValue;
FLabel.Enabled:=AValue;
end;
procedure TRxViewsPanelItem.SetHint(const AValue: TTranslateString);
begin
FButton.Hint:=AValue;
end;
procedure TRxViewsPanelItem.SetImageIndex(const AValue: integer);
begin
if FImageIndex=AValue then exit;
FImageIndex:=AValue;
UpdateImage;
end;
procedure TRxViewsPanelItem.SetTag(const AValue: Longint);
begin
FButton.Tag:=AValue;
end;
procedure TRxViewsPanelItem.SetVisible(const AValue: boolean);
begin
FButton.Visible:=AValue;
FLabel.Visible:=AValue;
end;
procedure TRxViewsPanelItem.UpdatePosition;
var
PP:TRxViewsPanelItem;
begin
if Index <> 0 then
begin
PP:=TRxViewsPanelItems(Collection).GetPanelItem(Index - 1);
if Assigned(PP.FLabel) then
begin
FButton.Top:=PP.FLabel.Top + PP.FLabel.Height;
end;
end;
FLabel.Top:=FButton.Top + FButton.Height;
end;
procedure TRxViewsPanelItem.UpdateImage;
var
VP:TRxViewsPanel;
begin
VP:=TRxViewsPanelItems(Collection).FRxViewsPanel;
if Assigned(VP.FImageList) then
VP.FImageList.GetBitmap(FImageIndex, FButton.Glyph);
end;
procedure TRxViewsPanelItem.DoViewButtonClick(Sender: TObject);
begin
TRxViewsPanelItems(Collection).FRxViewsPanel.InternalSelectView(Self);
end;
function TRxViewsPanelItem.GetDisplayName: string;
begin
if FLabel.Caption<> '' then
Result:=FLabel.Caption
else
Result:=inherited GetDisplayName;
end;
constructor TRxViewsPanelItem.Create(ACollection: TCollection);
var
VP:TRxViewsPanel;
begin
inherited Create(ACollection);
VP:=TRxViewsPanelItems(ACollection).FRxViewsPanel;
FImageIndex:=-1;
FButton:=TSpeedButton.Create(VP);
// FButton.Align:=alTop;
FButton.ShowCaption:=false;
FButton.Transparent:=true;
FButton.GroupIndex:=1;
FButton.Height:=VP.FButtonHeght;
FButton.Parent:=VP;
FLabel:=TLabel.Create(VP);
// FLabel.Align:=alTop;
FLabel.WordWrap:=true;
FLabel.Alignment:=taCenter;
FLabel.AutoSize:=true;
FLabel.Parent:=VP;
FButton.BorderSpacing.Around:=6;
FLabel.BorderSpacing.Around:=6;
FButton.AnchorSide[akLeft].Control:=VP;
FButton.AnchorSide[akRight].Control:=VP;
FButton.AnchorSide[akRight].Side:=asrBottom;
FButton.Anchors:=[akTop, akLeft, akRight];
FButton.OnClick:=@DoViewButtonClick;
FLabel.AnchorSide[akTop].Control:=FButton;
FLabel.AnchorSide[akLeft].Control:=VP;
FLabel.AnchorSide[akRight].Control:=VP;
FLabel.AnchorSide[akRight].Side:=asrBottom;
FLabel.Anchors:=[akTop, akLeft, akRight];
FLabel.Top:=FButton.Top + FButton.Height;
UpdatePosition;
end;
destructor TRxViewsPanelItem.Destroy;
begin
FreeAndNil(FButton);
FreeAndNil(FLabel);
inherited Destroy;
end;
{ TRxViewsPanelItems }
function TRxViewsPanelItems.GetPanelItem(Index: Integer): TRxViewsPanelItem;
begin
result := TRxViewsPanelItem( inherited Items[Index] );
end;
procedure TRxViewsPanelItems.SetPanelItem(Index: Integer;
const AValue: TRxViewsPanelItem);
begin
Items[Index].Assign( AValue );
end;
procedure TRxViewsPanelItems.Update(Item: TCollectionItem);
var
i:integer;
P, P1:TRxViewsPanelItem;
begin
inherited Update(Item);
if not Assigned(Item) then
begin
for i:=0 to Count - 1 do
begin
P:=GetPanelItem(I);
if Assigned(P.FButton) and Assigned(P.FLabel) then
begin
if i=0 then
begin
P.FButton.AnchorSide[akTop].Control:=FRxViewsPanel;
P.FButton.AnchorSide[akTop].Side:=asrTop;
P.FLabel.AnchorSide[akTop].Control:=P.FButton;
P.FLabel.AnchorSide[akTop].Side:=asrBottom;
end
else
begin
P1:=GetPanelItem(I-1);
if Assigned(P1.FButton) and Assigned(P1.FLabel) then
begin
P.FButton.AnchorSide[akTop].Control:=P1.FLabel;
P.FButton.AnchorSide[akTop].Side:=asrBottom;
P.FLabel.AnchorSide[akTop].Control:=P.FButton;
P.FLabel.AnchorSide[akTop].Side:=asrBottom;
end;
end;
P.FButton.AnchorSide[akLeft].Control:=FRxViewsPanel;
P.FButton.AnchorSide[akRight].Control:=FRxViewsPanel;
P.FButton.AnchorSide[akRight].Side:=asrBottom;
P.FLabel.AnchorSide[akTop].Control:=P.FButton;
P.FLabel.AnchorSide[akLeft].Control:=FRxViewsPanel;
P.FLabel.AnchorSide[akRight].Control:=FRxViewsPanel;
P.FLabel.AnchorSide[akRight].Side:=asrBottom;
end;
end;
end;
end;
constructor TRxViewsPanelItems.Create(ARxViewsPanel: TRxViewsPanel);
begin
inherited Create(TRxViewsPanelItem);
FRxViewsPanel:=ARxViewsPanel;
end;
procedure TRxViewsPanelItems.UpdateImages;
var
i:integer;
begin
for I:=0 to Count - 1 do
Items[i].UpdateImage;
end;
end.