{ 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.