You've already forked lazarus-ccr
5193 lines
154 KiB
ObjectPascal
5193 lines
154 KiB
ObjectPascal
![]() |
{-----------------------------------------------------------------------------
|
||
|
The contents of this file are subject to the Mozilla Public License
|
||
|
Version 1.1 (the "License"); you may not use this file except in compliance
|
||
|
with the License. You may obtain a copy of the License at
|
||
|
http://www.mozilla.org/MPL/MPL-1.1.html
|
||
|
|
||
|
Software distributed under the License is distributed on an "AS IS" basis,
|
||
|
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
|
||
|
the specific language governing rights and limitations under the License.
|
||
|
|
||
|
The Original Code is: JvNavigationPane.PAS, released on 2004-03-28.
|
||
|
|
||
|
The Initial Developer of the Original Code is Peter Thornqvist <peter3 at sourceforge dot net>
|
||
|
Portions created by Peter Thornqvist are Copyright (C) 2004 Peter Thornqvist.
|
||
|
All Rights Reserved.
|
||
|
|
||
|
Contributor(s):
|
||
|
|
||
|
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
|
||
|
located at http://jvcl.sourceforge.net
|
||
|
|
||
|
Known Issues:
|
||
|
-----------------------------------------------------------------------------}
|
||
|
// $Id: JvNavigationPane.pas 11400 2007-06-28 21:24:06Z ahuser $
|
||
|
|
||
|
// Initial port to Lazarus by Sergio Samayoa - september 2007.
|
||
|
// TODO: LM_NCPAINT isnt fired by lazarus, see what we can do about.
|
||
|
//
|
||
|
// 26.09.2007:
|
||
|
// BUG: (I think is of the JVCL base class) - also in Delphi
|
||
|
// - Made some panels iconic.
|
||
|
// - Click on popup button of the pane (TJvNavIconButton)
|
||
|
// - Don't select any menu option, just click and hold for a second any of
|
||
|
// the iconized pages.
|
||
|
// - Page isn't selected but button remains as down.
|
||
|
//
|
||
|
// LM_NCPAINT isn't fired in LCL (reply on forums from Luiz Americo).
|
||
|
// Also changing "BorderWidth" does nothing. This is inherited from TControl.
|
||
|
// This means that TJvExControl descendatns should deflate its bound by BorderWidth
|
||
|
// before painting itself and at last (after LM_PAINT) "send" LM_NCPAINT.
|
||
|
// This property should afect also the positioning if the controls inside.
|
||
|
|
||
|
{$mode objfpc}{$H+}
|
||
|
|
||
|
unit JvNavigationPane;
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
SysUtils, Classes, Controls, ExtCtrls, Graphics, ImgList, JvButton,
|
||
|
JvComponent, JvExExtCtrls, JvPageList, JvTypes, LCLIntf, LCLType, LMessages, Menus;
|
||
|
|
||
|
const
|
||
|
CM_PARENTSTYLEMANAGERCHANGE = CM_BASE + 1;
|
||
|
CM_PARENTSTYLEMANAGERCHANGED = CM_BASE + 2;
|
||
|
|
||
|
type
|
||
|
TJvCustomNavigationPane = class;
|
||
|
TJvNavIconButton = class;
|
||
|
TJvNavStyleLink = class;
|
||
|
TJvNavPaneStyleManager = class;
|
||
|
TMsgStyleManagerChange = record
|
||
|
Msg: Cardinal;
|
||
|
Sender: TControl;
|
||
|
StyleManager: TJvNavPaneStyleManager;
|
||
|
Result: Longint;
|
||
|
end;
|
||
|
|
||
|
TJvNavPanelHeader = class(TJvCustomControl)
|
||
|
private
|
||
|
FColorFrom: TColor;
|
||
|
FColorTo: TColor;
|
||
|
FImages: TCustomImageList;
|
||
|
FImageIndex: TImageIndex;
|
||
|
FChangeLink: TChangeLink;
|
||
|
FStyleManager: TJvNavPaneStyleManager;
|
||
|
FStyleLink: TJvNavStyleLink;
|
||
|
FWordWrap: Boolean;
|
||
|
FAlignment: TAlignment;
|
||
|
FParentStyleManager: Boolean;
|
||
|
procedure WMEraseBkgnd(var Msg: TLMEraseBkgnd); message LM_ERASEBKGND;
|
||
|
procedure SetColorFrom(const Value: TColor);
|
||
|
procedure SetColorTo(const Value: TColor);
|
||
|
procedure SetImageIndex(const Value: TImageIndex);
|
||
|
procedure SetImages(const Value: TCustomImageList);
|
||
|
procedure DoImagesChange(Sender: TObject);
|
||
|
procedure SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
procedure DoStyleChange(Sender: TObject);
|
||
|
procedure SetAlignment(const Value: TAlignment);
|
||
|
procedure SetWordWrap(const Value: Boolean);
|
||
|
procedure ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange); message CM_PARENTSTYLEMANAGERCHANGED;
|
||
|
procedure ParentStyleManagerChange(var Msg: TLMessage); message CM_PARENTSTYLEMANAGERCHANGE;
|
||
|
procedure CMControlChange(var Msg: TLMessage); message CM_CONTROLCHANGE;
|
||
|
procedure SetParentStyleManager(const Value: Boolean);
|
||
|
protected
|
||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||
|
procedure TextChanged; override;
|
||
|
procedure Paint; override;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
published
|
||
|
property Align;
|
||
|
property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
|
||
|
property Anchors;
|
||
|
property Caption;
|
||
|
property Constraints;
|
||
|
property DragCursor;
|
||
|
property DragKind;
|
||
|
property DragMode;
|
||
|
property OnStartDock;
|
||
|
property OnEndDock;
|
||
|
property OnUnDock;
|
||
|
property Enabled;
|
||
|
property Font;
|
||
|
property ParentFont;
|
||
|
property ParentShowHint;
|
||
|
property PopupMenu;
|
||
|
property ShowHint;
|
||
|
property Visible;
|
||
|
property WordWrap: Boolean read FWordWrap write SetWordWrap default False;
|
||
|
property ColorFrom: TColor read FColorFrom write SetColorFrom default TColor($D0835C);
|
||
|
property ColorTo: TColor read FColorTo write SetColorTo default TColor($903B09);
|
||
|
property Images: TCustomImageList read FImages write SetImages;
|
||
|
property ImageIndex: TImageIndex read FImageIndex write SetImageIndex default -1;
|
||
|
property StyleManager: TJvNavPaneStyleManager read FStyleManager write SetStyleManager;
|
||
|
// (p3) must be published after StyleManager
|
||
|
property ParentStyleManager: Boolean read FParentStyleManager write SetParentStyleManager default True;
|
||
|
property Height default 27;
|
||
|
property Width default 225;
|
||
|
property OnClick;
|
||
|
property OnContextPopup;
|
||
|
property OnDragDrop;
|
||
|
property OnDragOver;
|
||
|
property OnEndDrag;
|
||
|
property OnMouseDown;
|
||
|
property OnMouseMove;
|
||
|
property OnMouseUp;
|
||
|
property OnStartDrag;
|
||
|
end;
|
||
|
|
||
|
TJvNavPanelDivider = class(TJvExSplitter)
|
||
|
private
|
||
|
FColorFrom: TColor;
|
||
|
FColorTo: TColor;
|
||
|
FFrameColor: TColor;
|
||
|
FStyleManager: TJvNavPaneStyleManager;
|
||
|
FStyleLink: TJvNavStyleLink;
|
||
|
FAlignment: TAlignment;
|
||
|
FParentStyleManager: Boolean;
|
||
|
procedure SetColorFrom(const Value: TColor);
|
||
|
procedure SetColorTo(const Value: TColor);
|
||
|
procedure SetFrameColor(const Value: TColor);
|
||
|
procedure SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
procedure DoStyleChange(Sender: TObject);
|
||
|
procedure SetAlignment(const Value: TAlignment);
|
||
|
procedure ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange); message CM_PARENTSTYLEMANAGERCHANGED;
|
||
|
procedure SetParentStyleManager(const Value: Boolean);
|
||
|
protected
|
||
|
procedure Paint; override;
|
||
|
procedure TextChanged; override;
|
||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||
|
procedure RequestAlign; override;
|
||
|
// 25.09.2007 - SESS
|
||
|
procedure SetAlign(Value: TAlign); override;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
published
|
||
|
// NB! Color is published but not used
|
||
|
property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
|
||
|
property Align default alNone;
|
||
|
property Anchors;
|
||
|
property AutoSnap default False;
|
||
|
property Caption;
|
||
|
property ColorFrom: TColor read FColorFrom write SetColorFrom default TColor($FFDBBC);
|
||
|
property ColorTo: TColor read FColorTo write SetColorTo default TColor($F2C0A4);
|
||
|
property Constraints;
|
||
|
property Cursor default crSizeNS;
|
||
|
property Enabled;
|
||
|
property Font;
|
||
|
property FrameColor: TColor read FFrameColor write SetFrameColor default TColor($6F2F0C);
|
||
|
property Height default 19;
|
||
|
property ResizeStyle default rsUpdate;
|
||
|
property StyleManager: TJvNavPaneStyleManager read FStyleManager write SetStyleManager;
|
||
|
// (p3) must be published after StyleManager
|
||
|
property ParentStyleManager: Boolean read FParentStyleManager write SetParentStyleManager default True;
|
||
|
property Width default 125;
|
||
|
end;
|
||
|
|
||
|
TJvOutlookSplitter = class(TJvExSplitter)
|
||
|
private
|
||
|
FColorTo: TColor;
|
||
|
FColorFrom: TColor;
|
||
|
FStyleManager: TJvNavPaneStyleManager;
|
||
|
FStyleLink: TJvNavStyleLink;
|
||
|
FParentStyleManager: Boolean;
|
||
|
FDragZone: Integer;
|
||
|
FOldCursor: TCursor;
|
||
|
procedure SetColorFrom(const Value: TColor);
|
||
|
procedure SetColorTo(const Value: TColor);
|
||
|
procedure SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
procedure DoStyleChange(Sender: TObject);
|
||
|
procedure ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange); message CM_PARENTSTYLEMANAGERCHANGED;
|
||
|
procedure SetParentStyleManager(const Value: Boolean);
|
||
|
procedure SetCursor(const Value: TCursor);
|
||
|
function GetDragZoneRect: TRect;
|
||
|
function MouseInDragZone(X, Y: Integer): Boolean;
|
||
|
protected
|
||
|
procedure Paint; override;
|
||
|
procedure EnabledChanged; override;
|
||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||
|
procedure WMLButtonDown(var Msg: TLMLButtonDown); message LM_LBUTTONDOWN;
|
||
|
procedure WMMouseMove(var Msg: TLMMouseMove); message LM_MOUSEMOVE;
|
||
|
procedure RequestAlign; override;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
published
|
||
|
// NB! Color is published but not used
|
||
|
property Align default alBottom;
|
||
|
property AutoSnap default False;
|
||
|
property Cursor write SetCursor default crSizeNS;
|
||
|
// DragZone is the number of pixels in the center of the control that constitutes the draggable area.
|
||
|
// For example, with a left/right aligned splitter and a DragZone of 100, 50 pixels above and 50 pixels below
|
||
|
// the vertical midpoint can be clicked to start the sizing. Any clicks outside this area will not start a sizing operation
|
||
|
// If DragZone <= 0, the entire control is a drag zone
|
||
|
property DragZone: Integer read FDragZone write FDragZone default 0;
|
||
|
property ResizeStyle default rsUpdate;
|
||
|
property ColorFrom: TColor read FColorFrom write SetColorFrom default TColor($B78676);
|
||
|
property ColorTo: TColor read FColorTo write SetColorTo default TColor($A03D09);
|
||
|
property Height default 7;
|
||
|
property Enabled;
|
||
|
property StyleManager: TJvNavPaneStyleManager read FStyleManager write SetStyleManager;
|
||
|
// (p3) must be published after StyleManager
|
||
|
property ParentStyleManager: Boolean read FParentStyleManager write SetParentStyleManager default True;
|
||
|
property OnClick;
|
||
|
property OnMouseDown;
|
||
|
property OnMouseEnter;
|
||
|
property OnMouseLeave;
|
||
|
property OnDblClick;
|
||
|
property OnMouseUp;
|
||
|
property OnMouseMove;
|
||
|
end;
|
||
|
|
||
|
TJvNavPanelColors = class(TPersistent)
|
||
|
private
|
||
|
FButtonColorTo: TColor;
|
||
|
FButtonColorFrom: TColor;
|
||
|
FFrameColor: TColor;
|
||
|
FButtonHotColorFrom: TColor;
|
||
|
FButtonHotColorTo: TColor;
|
||
|
FButtonSelectedColorFrom: TColor;
|
||
|
FButtonSelectedColorTo: TColor;
|
||
|
FOnChange: TNotifyEvent;
|
||
|
FSplitterColorFrom: TColor;
|
||
|
FSplitterColorTo: TColor;
|
||
|
FDividerColorTo: TColor;
|
||
|
FDividerColorFrom: TColor;
|
||
|
FHeaderColorFrom: TColor;
|
||
|
FHeaderColorTo: TColor;
|
||
|
FButtonSeparatorColor: TColor;
|
||
|
FToolPanelColorFrom: TColor;
|
||
|
FToolPanelColorTo: TColor;
|
||
|
FToolPanelHeaderColorTo: TColor;
|
||
|
FToolPanelHeaderColorFrom: TColor;
|
||
|
procedure SetButtonColorFrom(const Value: TColor);
|
||
|
procedure SetButtonColorTo(const Value: TColor);
|
||
|
procedure SetFrameColor(const Value: TColor);
|
||
|
procedure SetButtonHotColorFrom(const Value: TColor);
|
||
|
procedure SetButtonHotColorTo(const Value: TColor);
|
||
|
procedure SetButtonSelectedColorFrom(const Value: TColor);
|
||
|
procedure SetButtonSelectedColorTo(const Value: TColor);
|
||
|
procedure SetSplitterColorFrom(const Value: TColor);
|
||
|
procedure SetSplitterColorTo(const Value: TColor);
|
||
|
procedure SetDividerColorFrom(const Value: TColor);
|
||
|
procedure SetDividerColorTo(const Value: TColor);
|
||
|
procedure SetHeaderColorFrom(const Value: TColor);
|
||
|
procedure SetHeaderColorTo(const Value: TColor);
|
||
|
procedure SetButtonSeparatorColor(const Value: TColor);
|
||
|
procedure SetToolPanelColorFrom(const Value: TColor);
|
||
|
procedure SetToolPanelColorTo(const Value: TColor);
|
||
|
procedure SetToolPanelHeaderColorFrom(const Value: TColor);
|
||
|
procedure SetToolPanelHeaderColorTo(const Value: TColor);
|
||
|
protected
|
||
|
procedure Change;
|
||
|
public
|
||
|
constructor Create;
|
||
|
procedure Assign(Source: TPersistent); override;
|
||
|
published
|
||
|
property ButtonColorFrom: TColor read FButtonColorFrom write SetButtonColorFrom default TColor($F7E2CD);
|
||
|
property ButtonColorTo: TColor read FButtonColorTo write SetButtonColorTo default TColor($F3A080);
|
||
|
property ButtonHotColorFrom: TColor read FButtonHotColorFrom write SetButtonHotColorFrom default TColor($DBFBFF);
|
||
|
property ButtonHotColorTo: TColor read FButtonHotColorTo write SetButtonHotColorTo default TColor($5FC8FB);
|
||
|
property ButtonSelectedColorFrom: TColor read FButtonSelectedColorFrom write SetButtonSelectedColorFrom default TColor($BBE2EA);
|
||
|
property ButtonSelectedColorTo: TColor read FButtonSelectedColorTo write SetButtonSelectedColorTo default TColor($389FDD);
|
||
|
property ButtonSeparatorColor: TColor read FButtonSeparatorColor write SetButtonSeparatorColor default clGray;
|
||
|
property SplitterColorFrom: TColor read FSplitterColorFrom write SetSplitterColorFrom default TColor($B78676);
|
||
|
property SplitterColorTo: TColor read FSplitterColorTo write SetSplitterColorTo default TColor($A03D09);
|
||
|
property DividerColorFrom: TColor read FDividerColorFrom write SetDividerColorFrom default TColor($FFDBBC);
|
||
|
property DividerColorTo: TColor read FDividerColorTo write SetDividerColorTo default TColor($F2C0A4);
|
||
|
property HeaderColorFrom: TColor read FHeaderColorFrom write SetHeaderColorFrom default TColor($D0835C);
|
||
|
property HeaderColorTo: TColor read FHeaderColorTo write SetHeaderColorTo default TColor($903B09);
|
||
|
property FrameColor: TColor read FFrameColor write SetFrameColor default TColor($6F2F0C);
|
||
|
property ToolPanelColorFrom: TColor read FToolPanelColorFrom write SetToolPanelColorFrom default clWindow;
|
||
|
property ToolPanelColorTo: TColor read FToolPanelColorTo write SetToolPanelColorTo default clWindow;
|
||
|
property ToolPanelHeaderColorFrom: TColor read FToolPanelHeaderColorFrom write SetToolPanelHeaderColorFrom default TColor($F7E2CD);
|
||
|
property ToolPanelHeaderColorTo: TColor read FToolPanelHeaderColorTo write SetToolPanelHeaderColorTo default TColor($F3A080);
|
||
|
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
||
|
end;
|
||
|
|
||
|
TJvNavPanelFonts = class(TPersistent)
|
||
|
private
|
||
|
FHeaderFont: TFont;
|
||
|
FNavPanelFont: TFont;
|
||
|
FDividerFont: TFont;
|
||
|
FOnChange: TNotifyEvent;
|
||
|
FNavPanelHotTrackFont: TFont;
|
||
|
FNavPanelHotTrackFontOptions: TJvTrackFontOptions;
|
||
|
procedure SetDividerFont(const Value: TFont);
|
||
|
procedure SetHeaderFont(const Value: TFont);
|
||
|
procedure SetNavPanelFont(const Value: TFont);
|
||
|
procedure SetNavPanelHotTrackFont(const Value: TFont);
|
||
|
procedure SetNavPanelHotTrackFontOptions(const Value: TJvTrackFontOptions);
|
||
|
protected
|
||
|
procedure Change;
|
||
|
procedure DoFontChange(Sender: TObject);
|
||
|
public
|
||
|
procedure Assign(Source: TPersistent); override;
|
||
|
constructor Create;
|
||
|
destructor Destroy; override;
|
||
|
published
|
||
|
property NavPanelFont: TFont read FNavPanelFont write SetNavPanelFont;
|
||
|
property NavPanelHotTrackFont: TFont read FNavPanelHotTrackFont write SetNavPanelHotTrackFont;
|
||
|
property NavPanelHotTrackFontOptions: TJvTrackFontOptions read FNavPanelHotTrackFontOptions write SetNavPanelHotTrackFontOptions default DefaultTrackFontOptions;
|
||
|
property DividerFont: TFont read FDividerFont write SetDividerFont;
|
||
|
property HeaderFont: TFont read FHeaderFont write SetHeaderFont;
|
||
|
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
||
|
end;
|
||
|
|
||
|
TJvIconPanel = class(TJvCustomControl)
|
||
|
private
|
||
|
FDropButton: TJvNavIconButton;
|
||
|
FColors: TJvNavPanelColors;
|
||
|
FStyleManager: TJvNavPaneStyleManager;
|
||
|
FStyleLink: TJvNavStyleLink;
|
||
|
FOnDropDownMenu: TContextPopupEvent;
|
||
|
FParentStyleManager: Boolean;
|
||
|
procedure SetDropDownMenu(const Value: TPopupMenu);
|
||
|
function GetDropDownMenu: TPopupMenu;
|
||
|
procedure SetColors(const Value: TJvNavPanelColors);
|
||
|
procedure SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
procedure DoStyleChange(Sender: TObject);
|
||
|
procedure ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange); message CM_PARENTSTYLEMANAGERCHANGED;
|
||
|
procedure ParentStyleManagerChange(var Msg: TLMessage); message CM_PARENTSTYLEMANAGERCHANGE;
|
||
|
procedure CMControlChange(var Msg: TLMessage); message CM_CONTROLCHANGE;
|
||
|
procedure WMEraseBkgnd(var Msg: TLMEraseBkgnd); message LM_ERASEBKGND;
|
||
|
procedure SetParentStyleManager(const Value: Boolean);
|
||
|
protected
|
||
|
procedure DoDropDownMenu(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
|
||
|
procedure DoColorsChange(Sender: TObject);
|
||
|
procedure Paint; override;
|
||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
property Colors: TJvNavPanelColors read FColors write SetColors;
|
||
|
property StyleManager: TJvNavPaneStyleManager read FStyleManager write SetStyleManager;
|
||
|
// (p3) must be published after StyleManager
|
||
|
property ParentStyleManager: Boolean read FParentStyleManager write SetParentStyleManager default True;
|
||
|
property DropDownMenu: TPopupMenu read GetDropDownMenu write SetDropDownMenu;
|
||
|
property OnDropDownMenu: TContextPopupEvent read FOnDropDownMenu write FOnDropDownMenu;
|
||
|
end;
|
||
|
|
||
|
TJvNavIconButtonType = (nibDropDown, nibImage, nibDropArrow, nibClose);
|
||
|
|
||
|
TJvNavIconButton = class(TJvCustomGraphicButton)
|
||
|
private
|
||
|
FChangeLink: TChangeLink;
|
||
|
FImages: TCustomImageList;
|
||
|
FImageIndex: TImageIndex;
|
||
|
FButtonType: TJvNavIconButtonType;
|
||
|
FColors: TJvNavPanelColors;
|
||
|
FStyleManager: TJvNavPaneStyleManager;
|
||
|
FStyleLink: TJvNavStyleLink;
|
||
|
FParentStyleManager: Boolean;
|
||
|
procedure SetImages(const Value: TCustomImageList);
|
||
|
procedure SetImageIndex(const Value: TImageIndex);
|
||
|
procedure DoImagesChange(Sender: TObject);
|
||
|
procedure SetButtonType(const Value: TJvNavIconButtonType);
|
||
|
procedure SetColors(const Value: TJvNavPanelColors);
|
||
|
procedure DoColorsChange(Sender: TObject);
|
||
|
procedure SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
procedure DoStyleChange(Sender: TObject);
|
||
|
procedure ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange); message CM_PARENTSTYLEMANAGERCHANGED;
|
||
|
procedure SetParentStyleManager(const Value: Boolean);
|
||
|
function IsColorsStored: Boolean;
|
||
|
protected
|
||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||
|
procedure Paint; override;
|
||
|
property OnDropDownMenu;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
published
|
||
|
property Action;
|
||
|
property Align;
|
||
|
property AllowAllUp;
|
||
|
property Anchors;
|
||
|
// property Caption;
|
||
|
property Constraints;
|
||
|
property Down;
|
||
|
property DragCursor;
|
||
|
property DragKind;
|
||
|
property OnEndDock;
|
||
|
property OnStartDock;
|
||
|
property DragMode;
|
||
|
property DropDownMenu;
|
||
|
property GroupIndex;
|
||
|
property Enabled;
|
||
|
property Font;
|
||
|
property ParentFont;
|
||
|
property ParentShowHint;
|
||
|
property PopupMenu;
|
||
|
property ShowHint;
|
||
|
property Visible;
|
||
|
property ButtonType: TJvNavIconButtonType read FButtonType write SetButtonType;
|
||
|
property Colors: TJvNavPanelColors read FColors write SetColors stored IsColorsStored;
|
||
|
property Images: TCustomImageList read FImages write SetImages;
|
||
|
property ImageIndex: TImageIndex read FImageIndex write SetImageIndex;
|
||
|
property StyleManager: TJvNavPaneStyleManager read FStyleManager write SetStyleManager;
|
||
|
// (p3) must be published after StyleManager
|
||
|
property ParentStyleManager: Boolean read FParentStyleManager write SetParentStyleManager default True;
|
||
|
property Width default 22;
|
||
|
property Height default 22;
|
||
|
property OnClick;
|
||
|
property OnContextPopup;
|
||
|
property OnDragDrop;
|
||
|
property OnDragOver;
|
||
|
property OnEndDrag;
|
||
|
property OnMouseDown;
|
||
|
property OnMouseMove;
|
||
|
property OnMouseUp;
|
||
|
property OnStartDrag;
|
||
|
end;
|
||
|
|
||
|
TJvNavPanelToolButton = class(TJvCustomGraphicButton)
|
||
|
private
|
||
|
FChangeLink: TChangeLink;
|
||
|
FImages: TCustomImageList;
|
||
|
FImageIndex: TImageIndex;
|
||
|
FButtonType: TJvNavIconButtonType;
|
||
|
FDrawPartialMenuFrame: Boolean;
|
||
|
FTransparentDown: Boolean;
|
||
|
procedure DoImagesChange(Sender: TObject);
|
||
|
procedure SetButtonType(const Value: TJvNavIconButtonType);
|
||
|
procedure SetImageIndex(const Value: TImageIndex);
|
||
|
procedure SetImages(const Value: TCustomImageList);
|
||
|
protected
|
||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||
|
procedure Paint; override;
|
||
|
procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
property TransparentDown: Boolean read FTransparentDown write FTransparentDown default False;
|
||
|
property DrawPartialMenuFrame: Boolean read FDrawPartialMenuFrame write FDrawPartialMenuFrame default False;
|
||
|
property Images: TCustomImageList read FImages write SetImages;
|
||
|
property ImageIndex: TImageIndex read FImageIndex write SetImageIndex;
|
||
|
property ButtonType: TJvNavIconButtonType read FButtonType write SetButtonType;
|
||
|
property Caption;
|
||
|
end;
|
||
|
|
||
|
TJvNavPanelButton = class(TJvCustomGraphicButton)
|
||
|
private
|
||
|
FImageIndex: TImageIndex;
|
||
|
FImages: TCustomImageList;
|
||
|
FColors: TJvNavPanelColors;
|
||
|
FStyleManager: TJvNavPaneStyleManager;
|
||
|
FStyleLink: TJvNavStyleLink;
|
||
|
FAlignment: TAlignment;
|
||
|
FWordWrap: Boolean;
|
||
|
FParentStyleManager: Boolean;
|
||
|
procedure SetImageIndex(const Value: TImageIndex);
|
||
|
procedure SetImages(const Value: TCustomImageList);
|
||
|
procedure SetColors(const Value: TJvNavPanelColors);
|
||
|
procedure DoColorsChange(Sender: TObject);
|
||
|
procedure SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
procedure DoStyleChange(Sender: TObject);
|
||
|
procedure SetAlignment(const Value: TAlignment);
|
||
|
procedure SetWordWrap(const Value: Boolean);
|
||
|
procedure CMDialogChar(var Msg: TCMDialogChar); message CM_DIALOGCHAR;
|
||
|
procedure ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange); message CM_PARENTSTYLEMANAGERCHANGED;
|
||
|
procedure SetParentStyleManager(const Value: Boolean);
|
||
|
function IsColorsStored: Boolean;
|
||
|
protected
|
||
|
procedure TextChanged; override;
|
||
|
procedure FontChanged; override;
|
||
|
procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
|
||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||
|
property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
|
||
|
property WordWrap: Boolean read FWordWrap write SetWordWrap default False;
|
||
|
procedure PaintButton(ACanvas: TCanvas); override;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
published
|
||
|
property Action;
|
||
|
property Align;
|
||
|
property AllowAllUp;
|
||
|
property Anchors;
|
||
|
property Caption;
|
||
|
property Constraints;
|
||
|
property Down;
|
||
|
property DropDownMenu;
|
||
|
property DragCursor;
|
||
|
property DragKind;
|
||
|
property OnEndDock;
|
||
|
property OnStartDock;
|
||
|
property DragMode;
|
||
|
property Enabled;
|
||
|
property Font;
|
||
|
property GroupIndex;
|
||
|
property HotTrack default True;
|
||
|
property HotTrackFont;
|
||
|
property HotTrackFontOptions;
|
||
|
property ParentFont;
|
||
|
property ParentShowHint;
|
||
|
property PopupMenu;
|
||
|
property ShowHint;
|
||
|
property Visible;
|
||
|
property Width default 125;
|
||
|
property Height default 28;
|
||
|
property Colors: TJvNavPanelColors read FColors write SetColors stored IsColorsStored;
|
||
|
property StyleManager: TJvNavPaneStyleManager read FStyleManager write SetStyleManager;
|
||
|
// (p3) must be published after StyleManager
|
||
|
property ParentStyleManager: Boolean read FParentStyleManager write SetParentStyleManager default True;
|
||
|
property ImageIndex: TImageIndex read FImageIndex write SetImageIndex;
|
||
|
property Images: TCustomImageList read FImages write SetImages;
|
||
|
property OnClick;
|
||
|
property OnContextPopup;
|
||
|
property OnDragDrop;
|
||
|
property OnDragOver;
|
||
|
property OnEndDrag;
|
||
|
property OnMouseDown;
|
||
|
property OnMouseMove;
|
||
|
property OnMouseUp;
|
||
|
property OnStartDrag;
|
||
|
end;
|
||
|
|
||
|
TJvNavPaneBackgroundImage = class(TPersistent)
|
||
|
private
|
||
|
FCenter: Boolean;
|
||
|
FTile: Boolean;
|
||
|
FTransparent: Boolean;
|
||
|
FProportional: Boolean;
|
||
|
FStretch: Boolean;
|
||
|
FDrawing: Boolean;
|
||
|
FPicture: TPicture;
|
||
|
FOnChange: TNotifyEvent;
|
||
|
procedure SetCenter(const Value: Boolean);
|
||
|
procedure SetPicture(const Value: TPicture);
|
||
|
procedure SetProportional(const Value: Boolean);
|
||
|
procedure SetStretch(const Value: Boolean);
|
||
|
procedure SetTile(const Value: Boolean);
|
||
|
procedure SetTransparent(const Value: Boolean);
|
||
|
procedure PictureChanged(Sender: TObject);
|
||
|
protected
|
||
|
procedure DrawImage(Canvas: TCanvas; ARect: TRect); virtual;
|
||
|
procedure Change; virtual;
|
||
|
function CalcRect(ADestRect: TRect): TRect;
|
||
|
public
|
||
|
constructor Create;
|
||
|
destructor Destroy; override;
|
||
|
function HasImage: Boolean;
|
||
|
published
|
||
|
property Picture: TPicture read FPicture write SetPicture;
|
||
|
property Stretch: Boolean read FStretch write SetStretch;
|
||
|
property Proportional: Boolean read FProportional write SetProportional;
|
||
|
property Center: Boolean read FCenter write SetCenter;
|
||
|
property Tile: Boolean read FTile write SetTile;
|
||
|
property Transparent: Boolean read FTransparent write SetTransparent;
|
||
|
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
||
|
end;
|
||
|
|
||
|
TJvNavPanelPage = class(TJvCustomPage)
|
||
|
private
|
||
|
FNavPanel: TJvNavPanelButton;
|
||
|
FIconButton: TJvNavIconButton;
|
||
|
FOnClick: TNotifyEvent;
|
||
|
FIconPanel: TJvIconPanel;
|
||
|
FStyleManager: TJvNavPaneStyleManager;
|
||
|
FStyleLink: TJvNavStyleLink;
|
||
|
FHeader: TJvNavPanelHeader;
|
||
|
FImageIndex: TImageIndex;
|
||
|
FParentStyleManager: Boolean;
|
||
|
FBackground: TJvNavPaneBackgroundImage;
|
||
|
procedure SetCaption(const Value: TCaption);
|
||
|
procedure SetIconic(const Value: Boolean);
|
||
|
procedure SetImageIndex(const Value: TImageIndex);
|
||
|
function GetCaption: TCaption;
|
||
|
function GetIconic: Boolean;
|
||
|
function GetImageIndex: TImageIndex;
|
||
|
procedure DoButtonClick(Sender: TObject);
|
||
|
function GetHint: string;
|
||
|
procedure SetHint(const Value: string);
|
||
|
procedure SetIconPanel(const Value: TJvIconPanel);
|
||
|
function GetColors: TJvNavPanelColors;
|
||
|
procedure SetColors(const Value: TJvNavPanelColors);
|
||
|
procedure SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
procedure DoStyleChange(Sender: TObject);
|
||
|
procedure SetAutoHeader(const Value: Boolean);
|
||
|
function GetAutoHeader: Boolean;
|
||
|
function GetAlignment: TAlignment;
|
||
|
function GetWordWrap: Boolean;
|
||
|
procedure SetAlignment(const Value: TAlignment);
|
||
|
procedure SetWordWrap(const Value: Boolean);
|
||
|
procedure ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange); message CM_PARENTSTYLEMANAGERCHANGED;
|
||
|
procedure ParentStyleManagerChange(var Msg: TLMessage); message CM_PARENTSTYLEMANAGERCHANGE;
|
||
|
procedure CMControlChange(var Msg: TLMessage); message CM_CONTROLCHANGE;
|
||
|
procedure SetParentStyleManager(const Value: Boolean);
|
||
|
procedure SetAction(const Value: TBasicAction); // override;
|
||
|
procedure SetBackground(const Value: TJvNavPaneBackgroundImage);
|
||
|
procedure DoBackgroundChange(Sender: TObject);
|
||
|
protected
|
||
|
procedure UpdatePageList;
|
||
|
function GetAction: TBasicAction; override;
|
||
|
procedure SetParent(AParent: TWinControl); override;
|
||
|
procedure SetPageIndex(Value: Integer); override;
|
||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||
|
property NavPanel: TJvNavPanelButton read FNavPanel;
|
||
|
property IconButton: TJvNavIconButton read FIconButton;
|
||
|
property IconPanel: TJvIconPanel read FIconPanel write SetIconPanel;
|
||
|
property Colors: TJvNavPanelColors read GetColors write SetColors;
|
||
|
property StyleManager: TJvNavPaneStyleManager read FStyleManager write SetStyleManager;
|
||
|
// (p3) must be published after StyleManager
|
||
|
property ParentStyleManager: Boolean read FParentStyleManager write SetParentStyleManager default True;
|
||
|
property Header: TJvNavPanelHeader read FHeader;
|
||
|
property Alignment: TAlignment read GetAlignment write SetAlignment;
|
||
|
property WordWrap: Boolean read GetWordWrap write SetWordWrap;
|
||
|
procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;
|
||
|
procedure Paint; override;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
property AutoHeader: Boolean read GetAutoHeader write SetAutoHeader;
|
||
|
published
|
||
|
property Action: TBasicAction read GetAction write SetAction;
|
||
|
property Background: TJvNavPaneBackgroundImage read FBackground write SetBackground;
|
||
|
property Color default clWindow;
|
||
|
property ParentColor default False;
|
||
|
property Caption: TCaption read GetCaption write SetCaption;
|
||
|
property DragCursor;
|
||
|
property DragKind;
|
||
|
property OnStartDock;
|
||
|
property OnDockDrop;
|
||
|
property OnDockOver;
|
||
|
property OnUnDock;
|
||
|
property OnEndDock;
|
||
|
property DragMode;
|
||
|
property Iconic: Boolean read GetIconic write SetIconic default False;
|
||
|
property ImageIndex: TImageIndex read GetImageIndex write SetImageIndex default -1;
|
||
|
property Hint: string read GetHint write SetHint;
|
||
|
property OnClick: TNotifyEvent read FOnClick write FOnClick;
|
||
|
property OnContextPopup;
|
||
|
property OnDragDrop;
|
||
|
property OnDragOver;
|
||
|
property OnEndDrag;
|
||
|
property OnEnter;
|
||
|
property OnExit;
|
||
|
property OnKeyDown;
|
||
|
property OnKeyPress;
|
||
|
property OnKeyUp;
|
||
|
property OnMouseDown;
|
||
|
property OnMouseEnter;
|
||
|
property OnMouseLeave;
|
||
|
property OnMouseMove;
|
||
|
property OnMouseUp;
|
||
|
property OnMouseWheel;
|
||
|
property OnMouseWheelDown;
|
||
|
property OnMouseWheelUp;
|
||
|
property OnResize;
|
||
|
property OnShow;
|
||
|
property OnStartDrag;
|
||
|
end;
|
||
|
|
||
|
TJvCustomNavPaneToolPanel = class;
|
||
|
|
||
|
TJvNavPaneToolButton = class(TCollectionItem)
|
||
|
private
|
||
|
FRealButton: TJvNavPanelToolButton;
|
||
|
procedure SetImageIndex(const Value: TImageIndex);
|
||
|
procedure SetEnabled(const Value: Boolean);
|
||
|
procedure SetAction(const Value: TBasicAction);
|
||
|
procedure SetHint(const Value: string);
|
||
|
function GetAction: TBasicAction;
|
||
|
function GetEnabled: Boolean;
|
||
|
function GetHint: string;
|
||
|
function GetImageIndex: TImageIndex;
|
||
|
public
|
||
|
procedure Assign(Source: TPersistent); override;
|
||
|
constructor Create(ACollection: Classes.TCollection); override;
|
||
|
destructor Destroy; override;
|
||
|
property Button: TJvNavPanelToolButton read FRealButton;
|
||
|
published
|
||
|
property Action: TBasicAction read GetAction write SetAction;
|
||
|
property Hint: string read GetHint write SetHint;
|
||
|
property ImageIndex: TImageIndex read GetImageIndex write SetImageIndex default -1;
|
||
|
property Enabled: Boolean read GetEnabled write SetEnabled default True;
|
||
|
end;
|
||
|
|
||
|
TJvNavPaneToolButtons = class(TOwnedCollection)
|
||
|
private
|
||
|
FPanel: TJvCustomNavPaneToolPanel;
|
||
|
function GetItem(Index: Integer): TJvNavPaneToolButton;
|
||
|
procedure SetItem(Index: Integer; const Value: TJvNavPaneToolButton);
|
||
|
protected
|
||
|
procedure Update(Item: TCollectionItem); override;
|
||
|
public
|
||
|
constructor Create(AOwner: TJvCustomNavPaneToolPanel);
|
||
|
function Add: TJvNavPaneToolButton;
|
||
|
property Items[Index: Integer]: TJvNavPaneToolButton read GetItem write SetItem; default;
|
||
|
end;
|
||
|
|
||
|
TJvNavPaneToolButtonClick = procedure(Sender: TObject; Index: Integer) of object;
|
||
|
TJvToolPanelHitTestInfo = (phtNowhere, phtAbove, phtBelow, phtToLeft, phtToRight, phtGrabber, phtHeader, phtClient);
|
||
|
TJvToolPanelHitTestInfos = set of TJvToolPanelHitTestInfo;
|
||
|
|
||
|
//SESS
|
||
|
TWMNCPaint = TLMessage;
|
||
|
|
||
|
TJvCustomNavPaneToolPanel = class(TJvCustomControl)
|
||
|
private
|
||
|
FStyleLink: TJvNavStyleLink;
|
||
|
FChangeLink: TChangeLink;
|
||
|
FStyleManager: TJvNavPaneStyleManager;
|
||
|
FButtonWidth: Integer;
|
||
|
FHeaderHeight: Integer;
|
||
|
FEdgeRounding: Integer;
|
||
|
FButtonHeight: Integer;
|
||
|
FImages: TCustomImageList;
|
||
|
FButtons: TJvNavPaneToolButtons;
|
||
|
FOnButtonClick: TJvNavPaneToolButtonClick;
|
||
|
FDropDown: TJvNavPanelToolButton;
|
||
|
FCloseButton: TJvNavPanelToolButton;
|
||
|
FOnClose: TNotifyEvent;
|
||
|
FShowGrabber: Boolean;
|
||
|
FOnDropDownMenu: TContextPopupEvent;
|
||
|
FParentStyleManager: Boolean;
|
||
|
FBackground: TJvNavPaneBackgroundImage;
|
||
|
FColors: TJvNavPanelColors;
|
||
|
FHeaderVisible: Boolean;
|
||
|
procedure DoStyleChange(Sender: TObject);
|
||
|
procedure DoImagesChange(Sender: TObject);
|
||
|
procedure ButtonsChanged;
|
||
|
procedure SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
procedure SetButtonHeight(const Value: Integer);
|
||
|
procedure SetButtonWidth(const Value: Integer);
|
||
|
procedure SetEdgeRounding(const Value: Integer);
|
||
|
procedure SetHeaderHeight(const Value: Integer);
|
||
|
procedure SetImages(const Value: TCustomImageList);
|
||
|
procedure SetButtons(const Value: TJvNavPaneToolButtons);
|
||
|
procedure InternalButtonClick(Sender: TObject);
|
||
|
function GetCloseButton: Boolean;
|
||
|
function GetDropDownMenu: TPopupMenu;
|
||
|
procedure SetCloseButton(const Value: Boolean);
|
||
|
procedure SetDropDownMenu(const Value: TPopupMenu);
|
||
|
procedure DoCloseClick(Sender: TObject);
|
||
|
procedure SetShowGrabber(const Value: Boolean);
|
||
|
procedure ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange); message CM_PARENTSTYLEMANAGERCHANGED;
|
||
|
procedure ParentStyleManagerChange(var Msg: TLMessage); message CM_PARENTSTYLEMANAGERCHANGE;
|
||
|
procedure SetParentStyleManager(const Value: Boolean);
|
||
|
function GetDrawPartialMenuFrame: Boolean;
|
||
|
procedure SetDrawPartialMenuFrame(const Value: Boolean);
|
||
|
procedure SetBackground(const Value: TJvNavPaneBackgroundImage);
|
||
|
procedure SetColors(const Value: TJvNavPanelColors);
|
||
|
procedure SetHeaderVisible(const Value: Boolean);
|
||
|
function IsColorsStored: Boolean;
|
||
|
procedure CMControlChange(var Msg: TLMessage); message CM_CONTROLCHANGE;
|
||
|
procedure WMEraseBkgnd(var Msg: TLMEraseBkgnd); message LM_ERASEBKGND;
|
||
|
procedure WMNCPaint(var Msg: TWMNCPaint); message LM_NCPAINT;
|
||
|
procedure AlignButtons;
|
||
|
protected
|
||
|
procedure Paint; override;
|
||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||
|
procedure TextChanged; override;
|
||
|
procedure FontChanged; override;
|
||
|
procedure DoDropDownMenu(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
|
||
|
property EdgeRounding: Integer read FEdgeRounding write SetEdgeRounding default 9;
|
||
|
procedure AdjustClientRect(var Rect: TRect); override;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
function GetHitTestInfoAt(X, Y: Integer): TJvToolPanelHitTestInfos;
|
||
|
procedure SetBounds(ALeft: Integer; ATop: Integer; AWidth: Integer; AHeight: Integer); override;
|
||
|
protected
|
||
|
property Background: TJvNavPaneBackgroundImage read FBackground write SetBackground;
|
||
|
property DrawPartialMenuFrame: Boolean read GetDrawPartialMenuFrame write SetDrawPartialMenuFrame default False;
|
||
|
property Buttons: TJvNavPaneToolButtons read FButtons write SetButtons;
|
||
|
property ButtonWidth: Integer read FButtonWidth write SetButtonWidth default 25;
|
||
|
property ButtonHeight: Integer read FButtonHeight write SetButtonHeight default 22;
|
||
|
property CloseButton: Boolean read GetCloseButton write SetCloseButton default True;
|
||
|
property Colors: TJvNavPanelColors read FColors write SetColors stored IsColorsStored;
|
||
|
property DropDownMenu: TPopupMenu read GetDropDownMenu write SetDropDownMenu;
|
||
|
property HeaderHeight: Integer read FHeaderHeight write SetHeaderHeight default 29;
|
||
|
property HeaderVisible: Boolean read FHeaderVisible write SetHeaderVisible default True;
|
||
|
property Images: TCustomImageList read FImages write SetImages;
|
||
|
// property ParentColor default False;
|
||
|
property ShowGrabber: Boolean read FShowGrabber write SetShowGrabber default True;
|
||
|
property StyleManager: TJvNavPaneStyleManager read FStyleManager write SetStyleManager;
|
||
|
property ParentStyleManager: Boolean read FParentStyleManager write SetParentStyleManager default True;
|
||
|
property OnButtonClick: TJvNavPaneToolButtonClick read FOnButtonClick write FOnButtonClick;
|
||
|
property OnClose: TNotifyEvent read FOnClose write FOnClose;
|
||
|
property OnDropDownMenu: TContextPopupEvent read FOnDropDownMenu write FOnDropDownMenu;
|
||
|
end;
|
||
|
|
||
|
TJvNavPaneToolPanel = class(TJvCustomNavPaneToolPanel)
|
||
|
published
|
||
|
property Align;
|
||
|
property Anchors;
|
||
|
property Caption;
|
||
|
property Constraints;
|
||
|
property BorderWidth;
|
||
|
property DragCursor;
|
||
|
property DragKind;
|
||
|
property DragMode;
|
||
|
property Background;
|
||
|
property DrawPartialMenuFrame;
|
||
|
property Buttons;
|
||
|
property ButtonWidth;
|
||
|
property ButtonHeight;
|
||
|
property CloseButton;
|
||
|
property Colors;
|
||
|
property DropDownMenu;
|
||
|
property HeaderHeight;
|
||
|
property HeaderVisible;
|
||
|
property Images;
|
||
|
property ShowGrabber;
|
||
|
property StyleManager;
|
||
|
// (p3) must be published after StyleManager
|
||
|
property ParentStyleManager;
|
||
|
property OnButtonClick;
|
||
|
property OnClose;
|
||
|
property OnDropDownMenu;
|
||
|
property Enabled;
|
||
|
property Font;
|
||
|
property ParentColor;
|
||
|
property ParentFont;
|
||
|
property ParentShowHint;
|
||
|
property PopupMenu;
|
||
|
property ShowHint;
|
||
|
property Visible;
|
||
|
property Width default 185;
|
||
|
property Height default 41;
|
||
|
property OnEndDock;
|
||
|
property OnStartDock;
|
||
|
property OnUnDock;
|
||
|
property OnClick;
|
||
|
property OnContextPopup;
|
||
|
property OnDragDrop;
|
||
|
property OnDragOver;
|
||
|
property OnEndDrag;
|
||
|
property OnMouseDown;
|
||
|
property OnMouseMove;
|
||
|
property OnMouseUp;
|
||
|
property OnStartDrag;
|
||
|
end;
|
||
|
|
||
|
TJvCustomNavigationPane = class(TJvCustomPageList)
|
||
|
private
|
||
|
FIconPanel: TJvIconPanel;
|
||
|
FSplitter: TJvOutlookSplitter;
|
||
|
FLargeImages: TCustomImageList;
|
||
|
FSmallImages: TCustomImageList;
|
||
|
FColors: TJvNavPanelColors;
|
||
|
FNavPanelFont: TFont;
|
||
|
FResizable: Boolean;
|
||
|
FButtonWidth: Integer;
|
||
|
FButtonHeight: Integer;
|
||
|
FStyleManager: TJvNavPaneStyleManager;
|
||
|
FStyleLink: TJvNavStyleLink;
|
||
|
FNavPanelHotTrackFont: TFont;
|
||
|
FNavPanelHotTrackFontOptions: TJvTrackFontOptions;
|
||
|
FAutoHeaders: Boolean;
|
||
|
FWordWrap: Boolean;
|
||
|
FAlignment: TAlignment;
|
||
|
FOnDropDownMenu: TContextPopupEvent;
|
||
|
FParentStyleManager: Boolean;
|
||
|
FBackground: TJvNavPaneBackgroundImage;
|
||
|
function GetDropDownMenu: TPopupMenu;
|
||
|
function GetSmallImages: TCustomImageList;
|
||
|
procedure SetDropDownMenu(const Value: TPopupMenu);
|
||
|
procedure SetLargeImages(const Value: TCustomImageList);
|
||
|
procedure SetSmallImages(const Value: TCustomImageList);
|
||
|
function GetMaximizedCount: Integer;
|
||
|
procedure SetMaximizedCount(Value: Integer);
|
||
|
procedure HidePanel(Index: Integer);
|
||
|
procedure ShowPanel(Index: Integer);
|
||
|
procedure SetColors(const Value: TJvNavPanelColors);
|
||
|
procedure SetResizable(const Value: Boolean);
|
||
|
function GetNavPage(Index: Integer): TJvNavPanelPage;
|
||
|
procedure DoSplitterCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean);
|
||
|
procedure DoColorsChange(Sender: TObject);
|
||
|
procedure SetNavPanelFont(const Value: TFont);
|
||
|
procedure SetNavPanelHotTrackFont(const Value: TFont);
|
||
|
procedure SetNavPanelHotTrackFontOptions(const Value: TJvTrackFontOptions);
|
||
|
procedure DoNavPanelFontChange(Sender: TObject);
|
||
|
procedure SetButtonHeight(const Value: Integer);
|
||
|
procedure SetButtonWidth(const Value: Integer);
|
||
|
procedure SetSplitterHeight(const Value: Integer);
|
||
|
function GetSplitterHeight: Integer;
|
||
|
procedure SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
procedure DoStyleChange(Sender: TObject);
|
||
|
procedure SetAutoHeaders(const Value: Boolean);
|
||
|
procedure SetAlignment(const Value: TAlignment);
|
||
|
procedure SetWordWrap(const Value: Boolean);
|
||
|
procedure ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange); message CM_PARENTSTYLEMANAGERCHANGED;
|
||
|
procedure ParentStyleManagerChange(var Msg: TLMessage); message CM_PARENTSTYLEMANAGERCHANGE;
|
||
|
procedure CMControlChange(var Msg: TLMessage); message CM_CONTROLCHANGE;
|
||
|
procedure WMNCPaint(var Msg: TWMNCPaint); message LM_NCPAINT;
|
||
|
procedure WMEraseBkgnd(var Msg: TLMEraseBkgnd); message LM_ERASEBKGND;
|
||
|
procedure SetParentStyleManager(const Value: Boolean);
|
||
|
procedure SetBackground(const Value: TJvNavPaneBackgroundImage);
|
||
|
function GetSplitterClick: TNotifyEvent;
|
||
|
function GetSplitterDblClick: TNotifyEvent;
|
||
|
function GetSplitterMouseDown: TMouseEvent;
|
||
|
function GetSplitterMouseEnter: TNotifyEvent;
|
||
|
function GetSplitterMouseLeave: TNotifyEvent;
|
||
|
function GetSplitterMouseMove: TMouseMoveEvent;
|
||
|
function GetSplitterMouseUp: TMouseEvent;
|
||
|
procedure SetSplitterClick(const Value: TNotifyEvent);
|
||
|
procedure SetSplitterDblClick(const Value: TNotifyEvent);
|
||
|
procedure SetSplitterMouseDown(const Value: TMouseEvent);
|
||
|
procedure SetSplitterMouseEnter(const Value: TNotifyEvent);
|
||
|
procedure SetSplitterMouseLeave(const Value: TNotifyEvent);
|
||
|
procedure SetSplitterMouseMove(const Value: TMouseMoveEvent);
|
||
|
procedure SetSplitterMouseUp(const Value: TMouseEvent);
|
||
|
function GetSplitterCanResize: TCanResizeEvent;
|
||
|
function GetSplitterMoved: TNotifyEvent;
|
||
|
function GetSplitterPaint: TNotifyEvent;
|
||
|
procedure SetSplitterCanResize(const Value: TCanResizeEvent);
|
||
|
procedure SetSplitterMoved(const Value: TNotifyEvent);
|
||
|
procedure SetSplitterPaint(const Value: TNotifyEvent);
|
||
|
protected
|
||
|
function IsColorsStored: Boolean;
|
||
|
function IsNavPanelFontStored: Boolean;
|
||
|
function IsNavPanelFontHotTrackStored: Boolean;
|
||
|
function IsNavPanelHotTrackFontOptionsStored: Boolean;
|
||
|
procedure UpdatePages; virtual;
|
||
|
procedure SetActivePage(Page: TJvCustomPage); override;
|
||
|
procedure InsertPage(APage: TJvCustomPage); override;
|
||
|
procedure RemovePage(APage: TJvCustomPage); override;
|
||
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
||
|
procedure Loaded; override;
|
||
|
procedure DoDropDownMenu(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
|
||
|
function InternalGetPageClass: TJvCustomPageClass; override;
|
||
|
property NavPages[Index: Integer]: TJvNavPanelPage read GetNavPage;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
function HidePage(Page: TJvCustomPage): TJvCustomPage; override;
|
||
|
function ShowPage(Page: TJvCustomPage; PageIndex: Integer = -1): TJvCustomPage; override;
|
||
|
procedure UpdatePositions;
|
||
|
protected
|
||
|
property BorderWidth default 1;
|
||
|
property AutoHeaders: Boolean read FAutoHeaders write SetAutoHeaders default False;
|
||
|
property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
|
||
|
property Background: TJvNavPaneBackgroundImage read FBackground write SetBackground;
|
||
|
property ButtonHeight: Integer read FButtonHeight write SetButtonHeight default 28;
|
||
|
property ButtonWidth: Integer read FButtonWidth write SetButtonWidth default 22;
|
||
|
property NavPanelFont: TFont read FNavPanelFont write SetNavPanelFont;
|
||
|
property NavPanelHotTrackFont: TFont read FNavPanelHotTrackFont write SetNavPanelHotTrackFont;
|
||
|
property NavPanelHotTrackFontOptions: TJvTrackFontOptions read FNavPanelHotTrackFontOptions write SetNavPanelHotTrackFontOptions;
|
||
|
property Color default clWindow;
|
||
|
property Colors: TJvNavPanelColors read FColors write SetColors;
|
||
|
property StyleManager: TJvNavPaneStyleManager read FStyleManager write SetStyleManager;
|
||
|
// (p3) must be published after StyleManager
|
||
|
property ParentStyleManager: Boolean read FParentStyleManager write SetParentStyleManager default True;
|
||
|
property DropDownMenu: TPopupMenu read GetDropDownMenu write SetDropDownMenu;
|
||
|
property LargeImages: TCustomImageList read FLargeImages write SetLargeImages;
|
||
|
property MaximizedCount: Integer read GetMaximizedCount write SetMaximizedCount;
|
||
|
property ParentColor default False;
|
||
|
property Resizable: Boolean read FResizable write SetResizable default True;
|
||
|
property SmallImages: TCustomImageList read GetSmallImages write SetSmallImages;
|
||
|
property SplitterHeight: Integer read GetSplitterHeight write SetSplitterHeight default 7;
|
||
|
property WordWrap: Boolean read FWordWrap write SetWordWrap default False;
|
||
|
property Splitter: TJvOutlookSplitter read FSplitter;
|
||
|
property IconPanel: TJvIconPanel read FIconPanel;
|
||
|
property OnDropDownMenu: TContextPopupEvent read FOnDropDownMenu write FOnDropDownMenu;
|
||
|
property OnSplitterCanResize: TCanResizeEvent read GetSplitterCanResize write SetSplitterCanResize;
|
||
|
property OnSplitterMoved: TNotifyEvent read GetSplitterMoved write SetSplitterMoved;
|
||
|
property OnSplitterPaint: TNotifyEvent read GetSplitterPaint write SetSplitterPaint;
|
||
|
property OnSplitterClick: TNotifyEvent read GetSplitterClick write SetSplitterClick;
|
||
|
property OnSplitterMouseEnter: TNotifyEvent read GetSplitterMouseEnter write SetSplitterMouseEnter;
|
||
|
property OnSplitterMouseLeave: TNotifyEvent read GetSplitterMouseLeave write SetSplitterMouseLeave;
|
||
|
property OnSplitterDblClick: TNotifyEvent read GetSplitterDblClick write SetSplitterDblClick;
|
||
|
property OnSplitterMouseDown: TMouseEvent read GetSplitterMouseDown write SetSplitterMouseDown;
|
||
|
property OnSplitterMouseMove: TMouseMoveEvent read GetSplitterMouseMove write SetSplitterMouseMove;
|
||
|
property OnSplitterMouseUp: TMouseEvent read GetSplitterMouseUp write SetSplitterMouseUp;
|
||
|
end;
|
||
|
|
||
|
TJvNavigationPane = class(TJvCustomNavigationPane)
|
||
|
public
|
||
|
property NavPages;
|
||
|
property Splitter;
|
||
|
property IconPanel;
|
||
|
published
|
||
|
property ActivePage;
|
||
|
// property Alignment;
|
||
|
property Align;
|
||
|
property Anchors;
|
||
|
property AutoHeaders;
|
||
|
property BorderWidth;
|
||
|
property DragCursor;
|
||
|
property DragKind;
|
||
|
property OnStartDock;
|
||
|
property OnDockDrop;
|
||
|
property OnDockOver;
|
||
|
property OnUnDock;
|
||
|
property OnEndDock;
|
||
|
property Background;
|
||
|
property ButtonHeight;
|
||
|
property ButtonWidth;
|
||
|
property Caption;
|
||
|
property Color;
|
||
|
property Colors stored IsColorsStored;
|
||
|
property StyleManager;
|
||
|
// (p3) must be published after StyleManager
|
||
|
property ParentStyleManager;
|
||
|
property Constraints;
|
||
|
property DragMode;
|
||
|
property DropDownMenu;
|
||
|
property Enabled;
|
||
|
property Font;
|
||
|
property ParentFont;
|
||
|
property ParentShowHint;
|
||
|
property PopupMenu;
|
||
|
property ShowHint;
|
||
|
property SplitterHeight;
|
||
|
property Visible;
|
||
|
property LargeImages;
|
||
|
property MaximizedCount;
|
||
|
property NavPanelFont stored IsNavPanelFontStored;
|
||
|
property NavPanelHotTrackFont stored IsNavPanelFontHotTrackStored;
|
||
|
property NavPanelHotTrackFontOptions stored IsNavPanelHotTrackFontOptionsStored;
|
||
|
property Resizable;
|
||
|
property SmallImages;
|
||
|
// property WordWrap;
|
||
|
property OnChange;
|
||
|
property OnChanging;
|
||
|
property OnDropDownMenu;
|
||
|
property OnClick;
|
||
|
property OnContextPopup;
|
||
|
property OnDragDrop;
|
||
|
property OnDragOver;
|
||
|
property OnEndDrag;
|
||
|
property OnStartDrag;
|
||
|
property OnEnter;
|
||
|
property OnExit;
|
||
|
property OnKeyDown;
|
||
|
property OnKeyPress;
|
||
|
property OnKeyUp;
|
||
|
property OnMouseDown;
|
||
|
property OnMouseEnter;
|
||
|
property OnMouseLeave;
|
||
|
property OnMouseMove;
|
||
|
property OnMouseUp;
|
||
|
property OnMouseWheel;
|
||
|
property OnMouseWheelDown;
|
||
|
property OnMouseWheelUp;
|
||
|
property OnResize;
|
||
|
property OnSplitterCanResize;
|
||
|
property OnSplitterMoved;
|
||
|
property OnSplitterPaint;
|
||
|
property OnSplitterClick;
|
||
|
property OnSplitterMouseEnter;
|
||
|
property OnSplitterMouseLeave;
|
||
|
property OnSplitterDblClick;
|
||
|
property OnSplitterMouseDown;
|
||
|
property OnSplitterMouseMove;
|
||
|
property OnSplitterMouseUp;
|
||
|
end;
|
||
|
|
||
|
TJvNavStyleLink = class(TObject)
|
||
|
private
|
||
|
FSender: TObject;
|
||
|
FOnChange: TNotifyEvent;
|
||
|
public
|
||
|
destructor Destroy; override;
|
||
|
procedure Change; dynamic;
|
||
|
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
||
|
property Sender: TObject read FSender write FSender;
|
||
|
end;
|
||
|
|
||
|
TJvNavPanelTheme = (nptStandard, nptXPBlue, nptXPSilver, nptXPOlive, nptCustom);
|
||
|
|
||
|
// TJvNavPaneStyleManager = class(TJvComponent)
|
||
|
TJvNavPaneStyleManager = class(TComponent)
|
||
|
private
|
||
|
FColors: TJvNavPanelColors;
|
||
|
FTheme: TJvNavPanelTheme;
|
||
|
FClients: TList;
|
||
|
FFonts: TJvNavPanelFonts;
|
||
|
FOnThemeChange: TNotifyEvent;
|
||
|
procedure SetColors(const Value: TJvNavPanelColors);
|
||
|
procedure SetTheme(const Value: TJvNavPanelTheme);
|
||
|
procedure DoThemeChange(Sender: TObject);
|
||
|
procedure SetFonts(const Value: TJvNavPanelFonts);
|
||
|
function IsColorsStored: Boolean;
|
||
|
function IsFontsStored: Boolean;
|
||
|
protected
|
||
|
procedure Change; virtual;
|
||
|
procedure AssignTo(Dest: TPersistent); override;
|
||
|
public
|
||
|
constructor Create(AOwner: TComponent); override;
|
||
|
destructor Destroy; override;
|
||
|
procedure Assign(Source: TPersistent); override;
|
||
|
procedure RegisterChanges(Value: TJvNavStyleLink);
|
||
|
procedure UnregisterChanges(Value: TJvNavStyleLink);
|
||
|
published
|
||
|
property Colors: TJvNavPanelColors read FColors write SetColors stored IsColorsStored;
|
||
|
property Fonts: TJvNavPanelFonts read FFonts write SetFonts stored IsFontsStored;
|
||
|
property Theme: TJvNavPanelTheme read FTheme write SetTheme nodefault;
|
||
|
property OnThemeChange: TNotifyEvent read FOnThemeChange write FOnThemeChange;
|
||
|
end;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
uses
|
||
|
ActnList, Forms, JvJVCLUtils, JvJCLUtils;
|
||
|
|
||
|
const
|
||
|
cNavPanelButtonGroupIndex = 113;
|
||
|
cToolButtonHeight = 18;
|
||
|
cToolButtonOffset = 14;
|
||
|
cToolButtonWidth = 18;
|
||
|
|
||
|
procedure InternalStyleManagerChanged(AControl: TWinControl; AStyleManager: TJvNavPaneStyleManager);
|
||
|
var
|
||
|
Msg: TMsgStyleManagerChange;
|
||
|
begin
|
||
|
Msg.Msg := CM_PARENTSTYLEMANAGERCHANGED;
|
||
|
Msg.Sender := AControl;
|
||
|
Msg.StyleManager := AStyleManager;
|
||
|
Msg.Result := 0;
|
||
|
AControl.Broadcast(Msg);
|
||
|
end;
|
||
|
|
||
|
//=== { TJvIconPanel } =======================================================
|
||
|
|
||
|
constructor TJvIconPanel.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
ControlStyle := ControlStyle - [csAcceptsControls];
|
||
|
FStyleLink := TJvNavStyleLink.Create;
|
||
|
FStyleLink.OnChange := @DoStyleChange;
|
||
|
ControlStyle := ControlStyle + [csOpaque, csAcceptsControls];
|
||
|
Height := 28;
|
||
|
FDropButton := TJvNavIconButton.Create(Self);
|
||
|
FDropButton.Visible := False;
|
||
|
FDropButton.ButtonType := nibDropDown;
|
||
|
FDropButton.GroupIndex := 0;
|
||
|
FDropButton.Width := 22;
|
||
|
FDropButton.Left := Width + 10;
|
||
|
FDropButton.Align := alRight;
|
||
|
FDropButton.Parent := Self;
|
||
|
FDropButton.OnDropDownMenu := @DoDropDownMenu;
|
||
|
FColors := TJvNavPanelColors.Create;
|
||
|
FColors.OnChange := @DoColorsChange;
|
||
|
FParentStyleManager := True;
|
||
|
end;
|
||
|
|
||
|
destructor TJvIconPanel.Destroy;
|
||
|
begin
|
||
|
FStyleLink.Free;
|
||
|
FColors.Free;
|
||
|
// Don't free FDropButton: it is freed automatically
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.DoColorsChange(Sender: TObject);
|
||
|
begin
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.DoStyleChange(Sender: TObject);
|
||
|
begin
|
||
|
Colors := (Sender as TJvNavPaneStyleManager).Colors;
|
||
|
Font := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelFont;
|
||
|
end;
|
||
|
|
||
|
function TJvIconPanel.GetDropDownMenu: TPopupMenu;
|
||
|
begin
|
||
|
Result := FDropButton.DropDownMenu
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.Notification(AComponent: TComponent;
|
||
|
Operation: TOperation);
|
||
|
begin
|
||
|
inherited Notification(AComponent, Operation);
|
||
|
if Operation = opRemove then
|
||
|
begin
|
||
|
if AComponent = StyleManager then
|
||
|
StyleManager := nil;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.Paint;
|
||
|
begin
|
||
|
GradientFillRect(Canvas, ClientRect, Colors.ButtonColorFrom, Colors.ButtonColorTo, fdTopToBottom, 32);
|
||
|
Canvas.Pen.Color := Colors.FrameColor;
|
||
|
if Align = alBottom then
|
||
|
begin
|
||
|
Canvas.MoveTo(0, 0);
|
||
|
Canvas.LineTo(Width + 1, 0);
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
Canvas.MoveTo(0, ClientHeight - 1);
|
||
|
Canvas.LineTo(Width + 1, ClientHeight - 1);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.SetColors(const Value: TJvNavPanelColors);
|
||
|
begin
|
||
|
FColors.Assign(Value);
|
||
|
FDropButton.Colors := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
//var
|
||
|
// I: Integer;
|
||
|
begin
|
||
|
if FStyleManager <> Value then
|
||
|
begin
|
||
|
ParentStyleManager := False;
|
||
|
if FStyleManager <> nil then
|
||
|
FStyleManager.UnregisterChanges(FStyleLink);
|
||
|
FStyleManager := Value;
|
||
|
if FStyleManager <> nil then
|
||
|
begin
|
||
|
FStyleManager.RegisterChanges(FStyleLink);
|
||
|
FStyleManager.FreeNotification(Self);
|
||
|
Colors := FStyleManager.Colors;
|
||
|
end;
|
||
|
end;
|
||
|
// FDropButton.StyleManager := Value;
|
||
|
InternalStyleManagerChanged(Self, Value);
|
||
|
// TODO: should this be removed?
|
||
|
// for I := 0 to ControlCount - 1 do
|
||
|
// if Controls[I] is TJvNavIconButton then
|
||
|
// TJvNavIconButton(Controls[I]).StyleManager := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.SetDropDownMenu(const Value: TPopupMenu);
|
||
|
begin
|
||
|
FDropButton.DropDownMenu := Value;
|
||
|
FDropButton.Visible := Value <> nil;
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.DoDropDownMenu(Sender: TObject; MousePos: TPoint;
|
||
|
var Handled: Boolean);
|
||
|
begin
|
||
|
if Assigned(FOnDropDownMenu) then
|
||
|
FOnDropDownMenu(Self, MousePos, Handled);
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange);
|
||
|
begin
|
||
|
if (Msg.Sender <> Self) and ParentStyleManager then
|
||
|
begin
|
||
|
StyleManager := Msg.StyleManager;
|
||
|
ParentStyleManager := True;
|
||
|
InternalStyleManagerChanged(Self, Msg.StyleManager);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.SetParentStyleManager(const Value: Boolean);
|
||
|
begin
|
||
|
if FParentStyleManager <> Value then
|
||
|
begin
|
||
|
FParentStyleManager := Value;
|
||
|
if FParentStyleManager and (Parent <> nil) then
|
||
|
Parent.Perform(CM_PARENTSTYLEMANAGERCHANGE, 0, 0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TJvIconPanel.CMControlChange(var Msg: TLMessage);
|
||
|
begin
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.WMEraseBkgnd(var Msg: TLMEraseBkgnd);
|
||
|
begin
|
||
|
Msg.Result := 1;
|
||
|
end;
|
||
|
|
||
|
procedure TJvIconPanel.ParentStyleManagerChange(var Msg: TLMessage);
|
||
|
begin
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
|
||
|
//=== { TJvCustomNavigationPane } ============================================
|
||
|
|
||
|
var
|
||
|
GlobalNavPanelPageRegistered: Boolean = False;
|
||
|
|
||
|
constructor TJvCustomNavigationPane.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
if not GlobalNavPanelPageRegistered then
|
||
|
begin
|
||
|
GlobalNavPanelPageRegistered := True;
|
||
|
RegisterClasses([TJvNavPanelPage]);
|
||
|
end;
|
||
|
|
||
|
FBackground := TJvNavPaneBackgroundImage.Create;
|
||
|
FBackground.OnChange := @DoColorsChange;
|
||
|
ControlStyle := ControlStyle - [csAcceptsControls];
|
||
|
FStyleLink := TJvNavStyleLink.Create;
|
||
|
FStyleLink.OnChange := @DoStyleChange;
|
||
|
FButtonHeight := 28;
|
||
|
FButtonWidth := 22;
|
||
|
BorderWidth := 1;
|
||
|
ParentColor := False;
|
||
|
Color := clWindow;
|
||
|
ControlStyle := ControlStyle + [csOpaque];
|
||
|
FResizable := True;
|
||
|
FColors := TJvNavPanelColors.Create;
|
||
|
FColors.OnChange := @DoColorsChange;
|
||
|
FIconPanel := TJvIconPanel.Create(Self);
|
||
|
FIconPanel.Parent := Self;
|
||
|
FIconPanel.Align := alBottom;
|
||
|
FIconPanel.OnDropDownMenu := @DoDropDownMenu;
|
||
|
|
||
|
FNavPanelFont := TFont.Create;
|
||
|
FNavPanelHotTrackFont := TFont.Create;
|
||
|
//TODO:
|
||
|
//FNavPanelFont.Assign(Screen.IconFont);
|
||
|
FNavPanelFont.Style := [fsBold];
|
||
|
FNavPanelFont.OnChange := @DoNavPanelFontChange;
|
||
|
FNavPanelHotTrackFont.Assign(FNavPanelFont);
|
||
|
FNavPanelHotTrackFont.OnChange := @DoNavPanelFontChange;
|
||
|
FNavPanelHotTrackFontOptions := DefaultTrackFontOptions;
|
||
|
FSplitter := TJvOutlookSplitter.Create(Self);
|
||
|
with FSplitter do
|
||
|
begin
|
||
|
ResizeStyle := rsNone;
|
||
|
MinSize := 1;
|
||
|
OnCanResize := @DoSplitterCanResize;
|
||
|
Parent := Self;
|
||
|
end;
|
||
|
FParentStyleManager := True;
|
||
|
FIconPanel.SetSubComponent(True);
|
||
|
FSplitter.SetSubComponent(True);
|
||
|
end;
|
||
|
|
||
|
destructor TJvCustomNavigationPane.Destroy;
|
||
|
begin
|
||
|
FStyleLink.Free;
|
||
|
FColors.Free;
|
||
|
FNavPanelFont.Free;
|
||
|
FNavPanelHotTrackFont.Free;
|
||
|
FBackground.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.DoSplitterCanResize(Sender: TObject;
|
||
|
var NewSize: Integer; var Accept: Boolean);
|
||
|
var
|
||
|
ACount: Integer;
|
||
|
begin
|
||
|
ACount := MaximizedCount;
|
||
|
if NewSize < ButtonHeight div 2 then
|
||
|
MaximizedCount := ACount - 1
|
||
|
else
|
||
|
if NewSize > ButtonHeight + ButtonHeight div 2 then
|
||
|
MaximizedCount := ACount + 1;
|
||
|
NewSize := 0;
|
||
|
Accept := False;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetDropDownMenu: TPopupMenu;
|
||
|
begin
|
||
|
if FIconPanel <> nil then
|
||
|
Result := FIconPanel.DropDownMenu
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSmallImages: TCustomImageList;
|
||
|
begin
|
||
|
Result := FSmallImages;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetMaximizedCount: Integer;
|
||
|
var
|
||
|
I: Integer;
|
||
|
begin
|
||
|
Result := 0;
|
||
|
for I := 0 to PageCount - 1 do
|
||
|
if not NavPages[I].Iconic then
|
||
|
Inc(Result);
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.HidePage(Page: TJvCustomPage): TJvCustomPage;
|
||
|
begin
|
||
|
Result := inherited HidePage(Page);
|
||
|
if Result <> nil then
|
||
|
UpdatePositions;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.ShowPage(Page: TJvCustomPage; PageIndex: Integer): TJvCustomPage;
|
||
|
begin
|
||
|
Result := inherited ShowPage(Page, PageIndex);
|
||
|
if Result <> nil then
|
||
|
UpdatePositions;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.Notification(AComponent: TComponent;
|
||
|
Operation: TOperation);
|
||
|
begin
|
||
|
inherited Notification(AComponent, Operation);
|
||
|
if Operation = opRemove then
|
||
|
begin
|
||
|
if AComponent = LargeImages then
|
||
|
LargeImages := nil;
|
||
|
if AComponent = SmallImages then
|
||
|
SmallImages := nil;
|
||
|
if AComponent = StyleManager then
|
||
|
StyleManager := nil;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetDropDownMenu(const Value: TPopupMenu);
|
||
|
begin
|
||
|
if FIconPanel <> nil then
|
||
|
FIconPanel.DropDownMenu := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetLargeImages(const Value: TCustomImageList);
|
||
|
begin
|
||
|
if FLargeImages <> Value then
|
||
|
begin
|
||
|
FLargeImages := Value;
|
||
|
UpdatePages;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSmallImages(const Value: TCustomImageList);
|
||
|
begin
|
||
|
if FSmallImages <> Value then
|
||
|
begin
|
||
|
FSmallImages := Value;
|
||
|
UpdatePages;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.HidePanel(Index: Integer);
|
||
|
begin
|
||
|
if (Index >= 0) and (Index < PageCount) then // don't hide the first panel
|
||
|
NavPages[Index].Iconic := True;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.ShowPanel(Index: Integer);
|
||
|
begin
|
||
|
if (Index >= 0) and (Index < PageCount) then
|
||
|
NavPages[Index].Iconic := False;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetMaximizedCount(Value: Integer);
|
||
|
var
|
||
|
I, ACount: Integer;
|
||
|
begin
|
||
|
ACount := MaximizedCount;
|
||
|
if Value < 0 then
|
||
|
Value := 0;
|
||
|
if Value > PageCount then
|
||
|
Value := PageCount;
|
||
|
if Value = MaximizedCount then
|
||
|
Exit;
|
||
|
while ACount > Value do
|
||
|
begin
|
||
|
HidePanel(ACount - 1);
|
||
|
Dec(ACount);
|
||
|
end;
|
||
|
if Value > ACount then
|
||
|
for I := Value downto ACount do
|
||
|
ShowPanel(I - 1);
|
||
|
UpdatePositions;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.UpdatePositions;
|
||
|
var
|
||
|
bw, bh, I, X, Y: Integer;
|
||
|
begin
|
||
|
if (csDestroying in ComponentState) or (FIconPanel = nil) then
|
||
|
Exit;
|
||
|
DisableAlign;
|
||
|
FIconPanel.DisableAlign;
|
||
|
try
|
||
|
// 25.09.2007 - SESS: Original code doesn't work in lazarus.
|
||
|
(*
|
||
|
Y := 0;
|
||
|
X := 0;
|
||
|
FSplitter.Top := Y;
|
||
|
FIconPanel.FDropButton.Left := Width;
|
||
|
FIconPanel.Top := Height - FIconPanel.Height;
|
||
|
Inc(Y, FSplitter.Height);
|
||
|
for I := 0 to PageCount - 1 do
|
||
|
begin
|
||
|
if (NavPages[I].NavPanel = nil) or (NavPages[I].IconButton = nil) then
|
||
|
Exit;
|
||
|
NavPages[I].IconButton.Left := X;
|
||
|
Inc(X, NavPages[I].IconButton.Width);
|
||
|
NavPages[I].NavPanel.Top := Y;
|
||
|
Inc(Y, NavPages[I].NavPanel.Height);
|
||
|
NavPages[I].Invalidate;
|
||
|
end;
|
||
|
*)
|
||
|
|
||
|
// 25.09.2007: Rewrited by SESS.
|
||
|
// Buttons heights & widths
|
||
|
bw := 0;
|
||
|
bh := 0;
|
||
|
for I := 0 to PageCount - 1 do
|
||
|
if NavPages[I].Iconic then
|
||
|
Inc(bw, NavPages[I].IconButton.Width)
|
||
|
else
|
||
|
Inc(bh, NavPages[I].NavPanel.Height);
|
||
|
|
||
|
// First positions
|
||
|
X := Self.Width - bw - FIconPanel.FDropButton.Width;
|
||
|
Y := Self.Height - FSplitter.Height - bh - FIconPanel.Height;
|
||
|
|
||
|
// Splitter
|
||
|
FSplitter.Top := Y;
|
||
|
Inc(Y, FSplitter.Height);
|
||
|
|
||
|
// Pages
|
||
|
for I := 0 to PageCount - 1 do
|
||
|
begin
|
||
|
if (NavPages[I].NavPanel = nil) or (NavPages[I].IconButton = nil) then
|
||
|
Exit;
|
||
|
if NavPages[I].Iconic then
|
||
|
begin
|
||
|
NavPages[I].IconButton.Left := X;
|
||
|
Inc(X, NavPages[I].IconButton.Width);
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
NavPages[I].NavPanel.Top := Y;
|
||
|
Inc(Y, NavPages[I].NavPanel.Height);
|
||
|
end;
|
||
|
NavPages[I].Invalidate;
|
||
|
end;
|
||
|
|
||
|
// Icon panel
|
||
|
FIconPanel.FDropButton.Left := X;
|
||
|
FIconPanel.Top := Y;
|
||
|
finally
|
||
|
EnableAlign;
|
||
|
FIconPanel.EnableAlign;
|
||
|
end;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetColors(const Value: TJvNavPanelColors);
|
||
|
begin
|
||
|
FColors.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.DoColorsChange(Sender: TObject);
|
||
|
begin
|
||
|
if FIconPanel <> nil then
|
||
|
TJvIconPanel(FIconPanel).Colors := Colors;
|
||
|
UpdatePages;
|
||
|
FSplitter.ColorFrom := Colors.SplitterColorFrom;
|
||
|
FSplitter.ColorTo := Colors.SplitterColorTo;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.Loaded;
|
||
|
begin
|
||
|
inherited Loaded;
|
||
|
UpdatePositions;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetResizable(const Value: Boolean);
|
||
|
begin
|
||
|
if FResizable <> Value then
|
||
|
begin
|
||
|
FResizable := Value;
|
||
|
FSplitter.Enabled := FResizable;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.InternalGetPageClass: TJvCustomPageClass;
|
||
|
begin
|
||
|
Result := TJvNavPanelPage;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetNavPage(Index: Integer): TJvNavPanelPage;
|
||
|
begin
|
||
|
Result := TJvNavPanelPage(Pages[Index]);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.InsertPage(APage: TJvCustomPage);
|
||
|
begin
|
||
|
inherited InsertPage(APage);
|
||
|
if APage <> nil then
|
||
|
begin
|
||
|
TJvNavPanelPage(APage).Top := FIconPanel.Top;
|
||
|
if (ActivePage = nil) and not (csLoading in ComponentState) then
|
||
|
ActivePage := APage;
|
||
|
end;
|
||
|
UpdatePositions;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetActivePage(Page: TJvCustomPage);
|
||
|
begin
|
||
|
inherited SetActivePage(Page);
|
||
|
if ActivePage <> nil then
|
||
|
begin
|
||
|
TJvNavPanelPage(ActivePage).NavPanel.Down := True;
|
||
|
TJvNavPanelPage(ActivePage).IconButton.Down := True;
|
||
|
TJvNavPanelPage(ActivePage).NavPanel.Invalidate;
|
||
|
TJvNavPanelPage(ActivePage).IconButton.Invalidate;
|
||
|
ActivePage.Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetBackground(const Value: TJvNavPaneBackgroundImage);
|
||
|
begin
|
||
|
FBackground.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetNavPanelFont(const Value: TFont);
|
||
|
begin
|
||
|
FNavPanelFont.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetNavPanelHotTrackFont(const Value: TFont);
|
||
|
begin
|
||
|
FNavPanelHotTrackFont.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetNavPanelHotTrackFontOptions(const Value: TJvTrackFontOptions);
|
||
|
begin
|
||
|
if FNavPanelHotTrackFontOptions <> Value then
|
||
|
begin
|
||
|
FNavPanelHotTrackFontOptions := Value;
|
||
|
UpdatePages;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.IsNavPanelFontStored: Boolean;
|
||
|
var
|
||
|
F: TFont;
|
||
|
begin
|
||
|
//TODO:
|
||
|
(*
|
||
|
F := Screen.IconFont;
|
||
|
with FNavPanelFont do
|
||
|
Result := ((StyleManager = nil) or (StyleManager.Theme = nptCustom)) and ((Name <> F.Name) or (Size <> F.Size) or (Style <> [fsBold]) or
|
||
|
(Color <> F.Color) or (Pitch <> F.Pitch) or (Charset <> F.Charset));
|
||
|
*)
|
||
|
Result := true;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.IsNavPanelFontHotTrackStored: Boolean;
|
||
|
begin
|
||
|
Result := IsNavPanelHotTrackFontOptionsStored or IsNavPanelFontStored;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.IsNavPanelHotTrackFontOptionsStored: Boolean;
|
||
|
begin
|
||
|
Result := not (hoFollowFont in NavPanelHotTrackFontOptions);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.DoNavPanelFontChange(Sender: TObject);
|
||
|
begin
|
||
|
UpdatePages;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.RemovePage(APage: TJvCustomPage);
|
||
|
begin
|
||
|
inherited RemovePage(APage);
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetButtonHeight(const Value: Integer);
|
||
|
begin
|
||
|
if FButtonHeight <> Value then
|
||
|
begin
|
||
|
FButtonHeight := Value;
|
||
|
UpdatePages;
|
||
|
FIconPanel.Height := FButtonHeight;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetButtonWidth(const Value: Integer);
|
||
|
begin
|
||
|
if FButtonWidth <> Value then
|
||
|
begin
|
||
|
FButtonWidth := Value;
|
||
|
UpdatePages;
|
||
|
FIconPanel.FDropButton.Width := FButtonWidth;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterHeight(const Value: Integer);
|
||
|
begin
|
||
|
if FSplitter.Height <> Value then
|
||
|
FSplitter.Height := Value;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterHeight: Integer;
|
||
|
begin
|
||
|
Result := FSplitter.Height;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
begin
|
||
|
if FStyleManager <> Value then
|
||
|
begin
|
||
|
ParentStyleManager := False;
|
||
|
if FStyleManager <> nil then
|
||
|
FStyleManager.UnregisterChanges(FStyleLink);
|
||
|
FStyleManager := Value;
|
||
|
if FStyleManager <> nil then
|
||
|
begin
|
||
|
FStyleManager.RegisterChanges(FStyleLink);
|
||
|
FStyleManager.FreeNotification(Self);
|
||
|
Colors := FStyleManager.Colors;
|
||
|
NavPanelFont := FStyleManager.Fonts.FNavPanelFont;
|
||
|
NavPanelHotTrackFont := FStyleManager.Fonts.FNavPanelHotTrackFont;
|
||
|
NavPanelHotTrackFontOptions := FStyleManager.Fonts.FNavPanelHotTrackFontOptions;
|
||
|
end;
|
||
|
// FSplitter.StyleManager := Value;
|
||
|
InternalStyleManagerChanged(Self, Value);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.DoStyleChange(Sender: TObject);
|
||
|
begin
|
||
|
Colors := (Sender as TJvNavPaneStyleManager).Colors;
|
||
|
NavPanelFont := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelFont;
|
||
|
NavPanelHotTrackFont := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelHotTrackFont;
|
||
|
NavPanelHotTrackFontOptions := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelHotTrackFontOptions;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetAutoHeaders(const Value: Boolean);
|
||
|
begin
|
||
|
if FAutoHeaders <> Value then
|
||
|
begin
|
||
|
FAutoHeaders := Value;
|
||
|
UpdatePages;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetAlignment(const Value: TAlignment);
|
||
|
begin
|
||
|
if FAlignment <> Value then
|
||
|
begin
|
||
|
FAlignment := Value;
|
||
|
UpdatePages;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetWordWrap(const Value: Boolean);
|
||
|
begin
|
||
|
if FWordWrap <> Value then
|
||
|
begin
|
||
|
FWordWrap := Value;
|
||
|
UpdatePages;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.UpdatePages;
|
||
|
var
|
||
|
I: Integer;
|
||
|
begin
|
||
|
for I := 0 to PageCount - 1 do
|
||
|
begin
|
||
|
NavPages[I].AutoHeader := AutoHeaders;
|
||
|
NavPages[I].NavPanel.Height := ButtonHeight;
|
||
|
NavPages[I].IconButton.Width := ButtonWidth;
|
||
|
NavPages[I].NavPanel.Colors := Colors;
|
||
|
NavPages[I].IconButton.Colors := Colors;
|
||
|
NavPages[I].NavPanel.HotTrackFontOptions := NavPanelHotTrackFontOptions;
|
||
|
NavPages[I].NavPanel.Font := FNavPanelFont;
|
||
|
NavPages[I].NavPanel.HotTrackFont := FNavPanelHotTrackFont;
|
||
|
|
||
|
NavPages[I].WordWrap := WordWrap;
|
||
|
NavPages[I].Alignment := Alignment;
|
||
|
NavPages[I].NavPanel.Images := LargeImages;
|
||
|
if AutoHeaders then
|
||
|
NavPages[I].Header.Images := LargeImages;
|
||
|
NavPages[I].IconButton.Images := SmallImages;
|
||
|
// NavPages[I].StyleManager := StyleManager;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.DoDropDownMenu(Sender: TObject;
|
||
|
MousePos: TPoint; var Handled: Boolean);
|
||
|
begin
|
||
|
if Assigned(FOnDropDownMenu) then
|
||
|
FOnDropDownMenu(Self, MousePos, Handled);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.ParentStyleManagerChanged(
|
||
|
var Msg: TMsgStyleManagerChange);
|
||
|
begin
|
||
|
if (Msg.Sender <> Self) and ParentStyleManager then
|
||
|
begin
|
||
|
StyleManager := Msg.StyleManager;
|
||
|
ParentStyleManager := True;
|
||
|
InternalStyleManagerChanged(Self, Msg.StyleManager);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetParentStyleManager(const Value: Boolean);
|
||
|
begin
|
||
|
if FParentStyleManager <> Value then
|
||
|
begin
|
||
|
FParentStyleManager := Value;
|
||
|
if FParentStyleManager and (Parent <> nil) then
|
||
|
Parent.Perform(CM_PARENTSTYLEMANAGERCHANGE, 0, 0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TJvCustomNavigationPane.CMControlChange(var Msg: TLMessage);
|
||
|
begin
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.WMNCPaint(var Msg: TWMNCPaint);
|
||
|
var
|
||
|
AColor: TColor;
|
||
|
begin
|
||
|
AColor := Color;
|
||
|
try
|
||
|
Color := Colors.FrameColor;
|
||
|
inherited;
|
||
|
finally
|
||
|
Color := AColor;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.WMEraseBkgnd(var Msg: TLMEraseBkgnd);
|
||
|
begin
|
||
|
if ActivePage = nil then
|
||
|
begin
|
||
|
Canvas.Brush.Color := Color;
|
||
|
Canvas.FillRect(ClientRect);
|
||
|
FBackground.DrawImage(Canvas, ClientRect);
|
||
|
end;
|
||
|
Msg.Result := 1;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.ParentStyleManagerChange(var Msg: TLMessage);
|
||
|
begin
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.IsColorsStored: Boolean;
|
||
|
begin
|
||
|
Result := (StyleManager = nil) or (StyleManager.Theme = nptCustom);
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterClick: TNotifyEvent;
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
Result := FSplitter.OnClick
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterDblClick: TNotifyEvent;
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
Result := FSplitter.OnDblClick
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterMouseDown: TMouseEvent;
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
Result := FSplitter.OnMouseDown
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterMouseEnter: TNotifyEvent;
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
Result := FSplitter.OnMouseEnter
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterMouseLeave: TNotifyEvent;
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
Result := FSplitter.OnMouseLeave
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterMouseMove: TMouseMoveEvent;
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
Result := FSplitter.OnMouseMove
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterMouseUp: TMouseEvent;
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
Result := FSplitter.OnMouseUp
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterCanResize: TCanResizeEvent;
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
Result := FSplitter.OnCanResize
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterMoved: TNotifyEvent;
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
Result := FSplitter.OnMoved
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavigationPane.GetSplitterPaint: TNotifyEvent;
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
Result := FSplitter.OnPaint
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterCanResize(const Value: TCanResizeEvent);
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
FSplitter.OnCanResize := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterMoved(const Value: TNotifyEvent);
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
FSplitter.OnMoved := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterPaint(const Value: TNotifyEvent);
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
FSplitter.OnPaint := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterClick(const Value: TNotifyEvent);
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
FSplitter.OnClick := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterDblClick(
|
||
|
const Value: TNotifyEvent);
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
FSplitter.OnDblClick := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterMouseDown(
|
||
|
const Value: TMouseEvent);
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
FSplitter.OnMouseDown := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterMouseEnter(
|
||
|
const Value: TNotifyEvent);
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
FSplitter.OnMouseEnter := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterMouseLeave(
|
||
|
const Value: TNotifyEvent);
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
FSplitter.OnMouseLeave := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterMouseMove(
|
||
|
const Value: TMouseMoveEvent);
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
FSplitter.OnMouseMove := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavigationPane.SetSplitterMouseUp(
|
||
|
const Value: TMouseEvent);
|
||
|
begin
|
||
|
if FSplitter <> nil then
|
||
|
FSplitter.OnMouseUp := Value;
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavIconButton } ===================================================
|
||
|
|
||
|
constructor TJvNavIconButton.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
FStyleLink := TJvNavStyleLink.Create;
|
||
|
FStyleLink.OnChange := @DoStyleChange;
|
||
|
FColors := TJvNavPanelColors.Create;
|
||
|
FColors.OnChange := @DoColorsChange;
|
||
|
FChangeLink := TChangeLink.Create;
|
||
|
FChangeLink.OnChange := @DoImagesChange;
|
||
|
Width := 22;
|
||
|
Height := 22;
|
||
|
//TODO:
|
||
|
//Font := Screen.IconFont;
|
||
|
Font.Style := [fsBold];
|
||
|
FParentStyleManager := True;
|
||
|
end;
|
||
|
|
||
|
destructor TJvNavIconButton.Destroy;
|
||
|
begin
|
||
|
FStyleLink.Free;
|
||
|
FChangeLink.Free;
|
||
|
FColors.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.DoColorsChange(Sender: TObject);
|
||
|
begin
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.DoImagesChange(Sender: TObject);
|
||
|
begin
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.Notification(AComponent: TComponent; Operation: TOperation);
|
||
|
begin
|
||
|
inherited Notification(AComponent, Operation);
|
||
|
if Operation = opRemove then
|
||
|
if AComponent = Images then
|
||
|
Images := nil
|
||
|
else
|
||
|
if AComponent = StyleManager then
|
||
|
StyleManager := nil;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.Paint;
|
||
|
var
|
||
|
Rect: TRect;
|
||
|
P: TPoint;
|
||
|
I: Integer;
|
||
|
|
||
|
h, w: integer;
|
||
|
begin
|
||
|
with Canvas do
|
||
|
begin
|
||
|
Rect := ClientRect;
|
||
|
Brush.Style := bsClear;
|
||
|
InflateRect(Rect, 0, -1);
|
||
|
if bsMouseInside in MouseStates then
|
||
|
begin
|
||
|
if bsMouseDown in MouseStates then
|
||
|
GradientFillRect(Canvas, Rect, Self.Colors.ButtonSelectedColorFrom,
|
||
|
Self.Colors.ButtonSelectedColorTo, fdTopToBottom, 32)
|
||
|
else
|
||
|
GradientFillRect(Canvas, Rect, Self.Colors.ButtonHotColorFrom,
|
||
|
Self.Colors.ButtonHotColorTo, fdTopToBottom, 32)
|
||
|
end
|
||
|
else
|
||
|
if Down then
|
||
|
GradientFillRect(Canvas, Rect, Self.Colors.ButtonSelectedColorFrom,
|
||
|
Self.Colors.ButtonSelectedColorTo, fdTopToBottom, 32);
|
||
|
case ButtonType of
|
||
|
nibDropDown:
|
||
|
begin // area should be 7x12
|
||
|
InflateRect(Rect, -((Rect.Right - Rect.Left) - 7) div 2, -((Rect.Bottom - Rect.Top) - 12) div 2);
|
||
|
if bsMouseDown in MouseStates then
|
||
|
OffsetRect(Rect, 1, 1);
|
||
|
Canvas.Pen.Color := clBlack;
|
||
|
P.X := Rect.Left;
|
||
|
P.Y := Rect.Top;
|
||
|
// chevron, upper
|
||
|
for I := 0 to 2 do
|
||
|
begin
|
||
|
Canvas.MoveTo(P.X, P.Y);
|
||
|
Canvas.LineTo(P.X + 2, P.Y);
|
||
|
Canvas.MoveTo(P.X + 4, P.Y);
|
||
|
Canvas.LineTo(P.X + 6, P.Y);
|
||
|
Inc(P.X);
|
||
|
Inc(P.Y);
|
||
|
end;
|
||
|
// chevron, lower
|
||
|
Dec(P.X);
|
||
|
Dec(P.Y);
|
||
|
for I := 0 to 2 do
|
||
|
begin
|
||
|
Canvas.MoveTo(P.X, P.Y);
|
||
|
Canvas.LineTo(P.X + 2, P.Y);
|
||
|
Canvas.MoveTo(P.X + 4, P.Y);
|
||
|
Canvas.LineTo(P.X + 6, P.Y);
|
||
|
Dec(P.X);
|
||
|
Inc(P.Y);
|
||
|
end;
|
||
|
// drop arrow
|
||
|
Inc(P.X, 1);
|
||
|
Inc(P.Y, 3);
|
||
|
for I := 0 to 3 do
|
||
|
begin
|
||
|
Canvas.MoveTo(P.X + I, P.Y + I);
|
||
|
Canvas.LineTo(P.X + 7 - I, P.Y + I);
|
||
|
end;
|
||
|
end;
|
||
|
nibImage:
|
||
|
begin
|
||
|
if (Images <> nil) and (ImageIndex >= 0) and (ImageIndex < Images.Count) then
|
||
|
// draw image only
|
||
|
Images.Draw(Canvas,
|
||
|
(Self.Width - Images.Width) div 2 + Ord(bsMouseDown in MouseStates),
|
||
|
(Self.Height - Images.Height) div 2 + Ord(bsMouseDown in MouseStates),
|
||
|
ImageIndex, Enabled);
|
||
|
end;
|
||
|
nibDropArrow:
|
||
|
begin
|
||
|
// area should be 9 x 5, centered
|
||
|
P.X := Rect.Left + (RectWidth(Rect) - 9) div 2 + Ord(bsMouseDown in MouseStates);
|
||
|
P.Y := Rect.Top + (RectHeight(Rect) - 5) div 2 + Ord(bsMouseDown in MouseStates);
|
||
|
Canvas.Pen.Color := clBlack;
|
||
|
for I := 0 to 4 do
|
||
|
begin
|
||
|
Canvas.MoveTo(P.X + I, P.Y + I);
|
||
|
Canvas.LineTo(P.X + 9 - I, P.Y + I);
|
||
|
end;
|
||
|
end;
|
||
|
nibClose:
|
||
|
begin
|
||
|
// area should be 8 x 8, centered
|
||
|
P.X := (RectWidth(ClientRect) - 8) div 2 + Ord(bsMouseDown in MouseStates);
|
||
|
P.Y := (RectHeight(ClientRect) - 8) div 2 + Ord(bsMouseDown in MouseStates);
|
||
|
Canvas.Pen.Color := clBlack;
|
||
|
for I := 0 to 7 do
|
||
|
begin
|
||
|
Canvas.MoveTo(P.X + I, P.Y + I);
|
||
|
Canvas.LineTo(P.X + I + 2, P.Y + I);
|
||
|
end;
|
||
|
Inc(P.X, 7);
|
||
|
for I := 0 to 7 do
|
||
|
begin
|
||
|
Canvas.MoveTo(P.X - I, P.Y + I);
|
||
|
Canvas.LineTo(P.X - I + 2, P.Y + I);
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
if csDesigning in ComponentState then
|
||
|
begin
|
||
|
Canvas.Pen.Color := clBlack;
|
||
|
Canvas.Pen.Style := psDot;
|
||
|
Canvas.Brush.Style := bsClear;
|
||
|
Canvas.Rectangle(ClientRect);
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.SetColors(const Value: TJvNavPanelColors);
|
||
|
begin
|
||
|
FColors.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.SetImageIndex(const Value: TImageIndex);
|
||
|
begin
|
||
|
if FImageIndex <> Value then
|
||
|
begin
|
||
|
FImageIndex := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.SetImages(const Value: TCustomImageList);
|
||
|
begin
|
||
|
if FImages <> Value then
|
||
|
begin
|
||
|
if FImages <> nil then
|
||
|
FImages.UnregisterChanges(FChangeLink);
|
||
|
FImages := Value;
|
||
|
if FImages <> nil then
|
||
|
begin
|
||
|
FImages.FreeNotification(Self);
|
||
|
FImages.RegisterChanges(FChangeLink);
|
||
|
end;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.SetButtonType(const Value: TJvNavIconButtonType);
|
||
|
begin
|
||
|
if FButtonType <> Value then
|
||
|
begin
|
||
|
FButtonType := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
begin
|
||
|
if FStyleManager <> Value then
|
||
|
begin
|
||
|
ParentStyleManager := False;
|
||
|
if FStyleManager <> nil then
|
||
|
FStyleManager.UnregisterChanges(FStyleLink);
|
||
|
FStyleManager := Value;
|
||
|
if FStyleManager <> nil then
|
||
|
begin
|
||
|
FStyleManager.RegisterChanges(FStyleLink);
|
||
|
FStyleManager.FreeNotification(Self);
|
||
|
Colors := FStyleManager.Colors;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.DoStyleChange(Sender: TObject);
|
||
|
begin
|
||
|
Colors := (Sender as TJvNavPaneStyleManager).Colors;
|
||
|
Font := (Sender as TJvNavPaneStyleManager).Fonts.DividerFont;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange);
|
||
|
begin
|
||
|
if (Msg.Sender <> Self) and ParentStyleManager then
|
||
|
begin
|
||
|
StyleManager := Msg.StyleManager;
|
||
|
ParentStyleManager := True;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavIconButton.SetParentStyleManager(const Value: Boolean);
|
||
|
begin
|
||
|
if FParentStyleManager <> Value then
|
||
|
begin
|
||
|
FParentStyleManager := Value;
|
||
|
if FParentStyleManager and (Parent <> nil) then
|
||
|
Parent.Perform(CM_PARENTSTYLEMANAGERCHANGE, 0, 0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TJvNavIconButton.IsColorsStored: Boolean;
|
||
|
begin
|
||
|
Result := (StyleManager = nil) or (StyleManager.Theme = nptCustom);
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPanelButton } ==================================================
|
||
|
|
||
|
constructor TJvNavPanelButton.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
FAlignment := taLeftJustify;
|
||
|
|
||
|
FStyleLink := TJvNavStyleLink.Create;
|
||
|
FStyleLink.OnChange := @DoStyleChange;
|
||
|
ControlStyle := ControlStyle + [csOpaque, csDisplayDragImage];
|
||
|
Flat := True;
|
||
|
HotTrack := True;
|
||
|
Height := 28;
|
||
|
FColors := TJvNavPanelColors.Create;
|
||
|
FColors.OnChange := @DoColorsChange;
|
||
|
//TODO:
|
||
|
//Font := Screen.IconFont;
|
||
|
Font.Style := [fsBold];
|
||
|
HotTrackFont := Font;
|
||
|
HotTrackFont.Style := [fsBold];
|
||
|
Width := 125;
|
||
|
Height := 28;
|
||
|
FParentStyleManager := True;
|
||
|
end;
|
||
|
|
||
|
destructor TJvNavPanelButton.Destroy;
|
||
|
begin
|
||
|
FStyleLink.Free;
|
||
|
FColors.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.ActionChange(Sender: TObject;
|
||
|
CheckDefaults: Boolean);
|
||
|
begin
|
||
|
if Sender is TCustomAction then
|
||
|
with TCustomAction(Sender) do
|
||
|
begin
|
||
|
if not CheckDefaults or (Self.Caption = '') or (Self.Caption = Self.Name) then
|
||
|
Self.Caption := Caption;
|
||
|
if not CheckDefaults or Self.Enabled then
|
||
|
Self.Enabled := Enabled;
|
||
|
if not CheckDefaults or (Self.Hint = '') then
|
||
|
Self.Hint := Hint;
|
||
|
if not CheckDefaults or (Self.ImageIndex = -1) then
|
||
|
Self.ImageIndex := ImageIndex;
|
||
|
if not CheckDefaults or Self.Visible then
|
||
|
Self.Visible := Visible;
|
||
|
if not CheckDefaults or not Assigned(Self.OnClick) then
|
||
|
Self.OnClick := OnExecute;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.DoColorsChange(Sender: TObject);
|
||
|
begin
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.DoStyleChange(Sender: TObject);
|
||
|
begin
|
||
|
Colors := (Sender as TJvNavPaneStyleManager).Colors;
|
||
|
Font := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelFont;
|
||
|
HotTrackFont := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelHotTrackFont;
|
||
|
HotTrackFontOptions := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelHotTrackFontOptions;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.FontChanged;
|
||
|
begin
|
||
|
inherited FontChanged;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.Notification(AComponent: TComponent;
|
||
|
Operation: TOperation);
|
||
|
begin
|
||
|
inherited Notification(AComponent, Operation);
|
||
|
if Operation = opRemove then
|
||
|
begin
|
||
|
if AComponent = StyleManager then
|
||
|
StyleManager := nil;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.PaintButton(ACanvas:TCanvas);
|
||
|
//const
|
||
|
// cAlignment: array [TAlignment] of Cardinal = (DT_LEFT, DT_RIGHT, DT_CENTER);
|
||
|
// cWordWrap: array [Boolean] of Cardinal = (DT_SINGLELINE, DT_WORDBREAK);
|
||
|
var
|
||
|
R: TRect;
|
||
|
X, Y: Integer;
|
||
|
|
||
|
function IsValidImage: Boolean;
|
||
|
begin
|
||
|
Result := Assigned(Images) and (ImageIndex >= 0);
|
||
|
end;
|
||
|
|
||
|
begin
|
||
|
R := ClientRect;
|
||
|
if HotTrack and (bsMouseInside in MouseStates) then
|
||
|
begin
|
||
|
if bsMouseDown in MouseStates then
|
||
|
GradientFillRect(ACanvas, R, Colors.ButtonSelectedColorTo, Colors.ButtonSelectedColorFrom, fdTopToBottom, 32)
|
||
|
else
|
||
|
GradientFillRect(ACanvas, R, Colors.ButtonHotColorFrom, Colors.ButtonHotColorTo, fdTopToBottom, 32);
|
||
|
end
|
||
|
else
|
||
|
if Down then
|
||
|
GradientFillRect(ACanvas, R, Colors.ButtonSelectedColorFrom, Colors.ButtonSelectedColorTo, fdTopToBottom, 32)
|
||
|
else
|
||
|
if bsMouseDown in MouseStates then
|
||
|
GradientFillRect(ACanvas, R, Colors.ButtonSelectedColorTo, Colors.ButtonSelectedColorFrom, fdTopToBottom, 32)
|
||
|
else
|
||
|
GradientFillRect(ACanvas, ClientRect, Colors.ButtonColorFrom, Colors.ButtonColorTo, fdTopToBottom, 32);
|
||
|
InflateRect(R, -4, -4);
|
||
|
if IsValidImage then
|
||
|
begin
|
||
|
Y := (Height - Images.Height) div 2;
|
||
|
X := 4;
|
||
|
Images.Draw(ACanvas, X, Y, ImageIndex);
|
||
|
Inc(R.Left, Images.Width + 4);
|
||
|
end;
|
||
|
if Caption <> '' then
|
||
|
begin
|
||
|
if HotTrack and (bsMouseInside in MouseStates) and not (bsMouseDown in MouseStates) then
|
||
|
ACanvas.Font := HotTrackFont
|
||
|
else
|
||
|
ACanvas.Font := Font;
|
||
|
SetBkMode(ACanvas.Handle, TRANSPARENT);
|
||
|
DrawText(ACanvas, Caption, Length(Caption), R, DT_SINGLELINE or DT_VCENTER);
|
||
|
end;
|
||
|
if Colors.ButtonSeparatorColor <> clNone then
|
||
|
begin
|
||
|
ACanvas.Pen.Color := Colors.ButtonSeparatorColor;
|
||
|
if Align = alBottom then
|
||
|
begin
|
||
|
ACanvas.MoveTo(0, 0);
|
||
|
ACanvas.LineTo(Width + 1, 0);
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
ACanvas.MoveTo(0, ClientHeight - 1);
|
||
|
ACanvas.LineTo(Width + 1, ClientHeight - 1);
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.SetColors(const Value: TJvNavPanelColors);
|
||
|
begin
|
||
|
FColors.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
begin
|
||
|
if FStyleManager <> Value then
|
||
|
begin
|
||
|
ParentStyleManager := False;
|
||
|
if FStyleManager <> nil then
|
||
|
FStyleManager.UnregisterChanges(FStyleLink);
|
||
|
FStyleManager := Value;
|
||
|
if FStyleManager <> nil then
|
||
|
begin
|
||
|
FStyleManager.RegisterChanges(FStyleLink);
|
||
|
FStyleManager.FreeNotification(Self);
|
||
|
Colors := FStyleManager.Colors;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.SetImageIndex(const Value: TImageIndex);
|
||
|
begin
|
||
|
if FImageIndex <> Value then
|
||
|
begin
|
||
|
FImageIndex := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.SetImages(const Value: TCustomImageList);
|
||
|
begin
|
||
|
if FImages <> Value then
|
||
|
begin
|
||
|
FImages := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.TextChanged;
|
||
|
begin
|
||
|
inherited TextChanged;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.SetAlignment(const Value: TAlignment);
|
||
|
begin
|
||
|
if FAlignment <> Value then
|
||
|
begin
|
||
|
FAlignment := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.SetWordWrap(const Value: Boolean);
|
||
|
begin
|
||
|
if FWordWrap <> Value then
|
||
|
begin
|
||
|
FWordWrap := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TJvNavPanelButton.CMDialogChar(var Msg: TCMDialogChar);
|
||
|
begin
|
||
|
if IsAccel(Msg.CharCode, Caption) then
|
||
|
begin
|
||
|
Msg.Result := 1;
|
||
|
Click;
|
||
|
end
|
||
|
else
|
||
|
inherited;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.ParentStyleManagerChanged(
|
||
|
var Msg: TMsgStyleManagerChange);
|
||
|
begin
|
||
|
if (Msg.Sender <> Self) and ParentStyleManager then
|
||
|
begin
|
||
|
StyleManager := Msg.StyleManager;
|
||
|
ParentStyleManager := True;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelButton.SetParentStyleManager(const Value: Boolean);
|
||
|
begin
|
||
|
if FParentStyleManager <> Value then
|
||
|
begin
|
||
|
FParentStyleManager := Value;
|
||
|
if FParentStyleManager and (Parent <> nil) then
|
||
|
Parent.Perform(CM_PARENTSTYLEMANAGERCHANGE, 0, 0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPanelButton.IsColorsStored: Boolean;
|
||
|
begin
|
||
|
Result := (StyleManager = nil) or (StyleManager.Theme = nptCustom);
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPanelColors } ==================================================
|
||
|
|
||
|
constructor TJvNavPanelColors.Create;
|
||
|
begin
|
||
|
inherited Create;
|
||
|
// use XPBlue as standard
|
||
|
FButtonColorFrom := TColor($F7E2CD);
|
||
|
FButtonColorTo := TColor($F3A080);
|
||
|
FButtonSelectedColorFrom := TColor($BBE2EA);
|
||
|
FButtonSelectedColorTo := TColor($389FDD);
|
||
|
FFrameColor := TColor($6F2F0C);
|
||
|
FButtonHotColorFrom := TColor($DBFBFF);
|
||
|
FButtonHotColorTo := TColor($5FC8FB);
|
||
|
FDividerColorFrom := TColor($FFDBBC);
|
||
|
FDividerColorTo := TColor($F2C0A4);
|
||
|
FHeaderColorFrom := TColor($D0835C);
|
||
|
FHeaderColorTo := TColor($903B09);
|
||
|
FSplitterColorFrom := TColor($B78676);
|
||
|
FSplitterColorTo := TColor($A03D09);
|
||
|
FButtonSeparatorColor := clGray;
|
||
|
FToolPanelColorFrom := clWindow;
|
||
|
FToolPanelColorTo := clWindow;
|
||
|
FToolPanelHeaderColorFrom := TColor($F7E2CD);
|
||
|
FToolPanelHeaderColorTo := TColor($F3A080);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.Assign(Source: TPersistent);
|
||
|
begin
|
||
|
if (Source is TJvNavPanelColors) then
|
||
|
begin
|
||
|
if (Source <> Self) then
|
||
|
begin
|
||
|
FButtonColorFrom := TJvNavPanelColors(Source).ButtonColorFrom;
|
||
|
FButtonColorTo := TJvNavPanelColors(Source).ButtonColorTo;
|
||
|
FButtonHotColorFrom := TJvNavPanelColors(Source).ButtonHotColorFrom;
|
||
|
FButtonHotColorTo := TJvNavPanelColors(Source).ButtonHotColorTo;
|
||
|
FButtonSelectedColorFrom := TJvNavPanelColors(Source).ButtonSelectedColorFrom;
|
||
|
FButtonSelectedColorTo := TJvNavPanelColors(Source).ButtonSelectedColorTo;
|
||
|
FFrameColor := TJvNavPanelColors(Source).FrameColor;
|
||
|
FHeaderColorFrom := TJvNavPanelColors(Source).HeaderColorFrom;
|
||
|
FHeaderColorTo := TJvNavPanelColors(Source).HeaderColorTo;
|
||
|
FDividerColorFrom := TJvNavPanelColors(Source).DividerColorFrom;
|
||
|
FDividerColorTo := TJvNavPanelColors(Source).DividerColorTo;
|
||
|
FSplitterColorFrom := TJvNavPanelColors(Source).SplitterColorFrom;
|
||
|
FSplitterColorTo := TJvNavPanelColors(Source).SplitterColorTo;
|
||
|
FButtonSeparatorColor := TJvNavPanelColors(Source).ButtonSeparatorColor;
|
||
|
FToolPanelColorFrom := TJvNavPanelColors(Source).ToolPanelColorFrom;
|
||
|
FToolPanelColorTo := TJvNavPanelColors(Source).ToolPanelColorTo;
|
||
|
FToolPanelHeaderColorFrom := TJvNavPanelColors(Source).ToolPanelHeaderColorFrom;
|
||
|
FToolPanelHeaderColorTo := TJvNavPanelColors(Source).ToolPanelHeaderColorTo;
|
||
|
Change;
|
||
|
end;
|
||
|
end
|
||
|
else
|
||
|
inherited Assign(Source);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.Change;
|
||
|
begin
|
||
|
if Assigned(FOnChange) then
|
||
|
FOnChange(Self);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetButtonColorFrom(const Value: TColor);
|
||
|
begin
|
||
|
if FButtonColorFrom <> Value then
|
||
|
begin
|
||
|
FButtonColorFrom := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetButtonColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FButtonColorTo <> Value then
|
||
|
begin
|
||
|
FButtonColorTo := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetDividerColorFrom(const Value: TColor);
|
||
|
begin
|
||
|
if FDividerColorFrom <> Value then
|
||
|
begin
|
||
|
FDividerColorFrom := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetDividerColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FDividerColorTo <> Value then
|
||
|
begin
|
||
|
FDividerColorTo := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetFrameColor(const Value: TColor);
|
||
|
begin
|
||
|
if FFrameColor <> Value then
|
||
|
begin
|
||
|
FFrameColor := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetHeaderColorFrom(const Value: TColor);
|
||
|
begin
|
||
|
if FHeaderColorFrom <> Value then
|
||
|
begin
|
||
|
FHeaderColorFrom := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetHeaderColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FHeaderColorTo <> Value then
|
||
|
begin
|
||
|
FHeaderColorTo := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetButtonHotColorFrom(const Value: TColor);
|
||
|
begin
|
||
|
if FButtonHotColorFrom <> Value then
|
||
|
begin
|
||
|
FButtonHotColorFrom := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetButtonHotColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FButtonHotColorTo <> Value then
|
||
|
begin
|
||
|
FButtonHotColorTo := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetButtonSelectedColorFrom(const Value: TColor);
|
||
|
begin
|
||
|
if FButtonSelectedColorFrom <> Value then
|
||
|
begin
|
||
|
FButtonSelectedColorFrom := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetButtonSelectedColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FButtonSelectedColorTo <> Value then
|
||
|
begin
|
||
|
FButtonSelectedColorTo := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetSplitterColorFrom(const Value: TColor);
|
||
|
begin
|
||
|
if FSplitterColorFrom <> Value then
|
||
|
begin
|
||
|
FSplitterColorFrom := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetSplitterColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FSplitterColorTo <> Value then
|
||
|
begin
|
||
|
FSplitterColorTo := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetButtonSeparatorColor(const Value: TColor);
|
||
|
begin
|
||
|
if FButtonSeparatorColor <> Value then
|
||
|
begin
|
||
|
FButtonSeparatorColor := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetToolPanelColorFrom(const Value: TColor);
|
||
|
begin
|
||
|
if FToolPanelColorFrom <> Value then
|
||
|
begin
|
||
|
FToolPanelColorFrom := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetToolPanelColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FToolPanelColorTo <> Value then
|
||
|
begin
|
||
|
FToolPanelColorTo := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetToolPanelHeaderColorFrom(
|
||
|
const Value: TColor);
|
||
|
begin
|
||
|
if FToolPanelHeaderColorFrom <> Value then
|
||
|
begin
|
||
|
FToolPanelHeaderColorFrom := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelColors.SetToolPanelHeaderColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FToolPanelHeaderColorTo <> Value then
|
||
|
begin
|
||
|
FToolPanelHeaderColorTo := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPanelFonts } ===================================================
|
||
|
|
||
|
constructor TJvNavPanelFonts.Create;
|
||
|
begin
|
||
|
inherited Create;
|
||
|
FDividerFont := TFont.Create;
|
||
|
FNavPanelFont := TFont.Create;
|
||
|
FNavPanelHotTrackFont := TFont.Create;
|
||
|
FHeaderFont := TFont.Create;
|
||
|
FHeaderFont.Name := 'Arial';
|
||
|
FHeaderFont.Size := 12;
|
||
|
FHeaderFont.Style := [fsBold];
|
||
|
FHeaderFont.Color := clWhite;
|
||
|
FHeaderFont.OnChange := @DoFontChange;
|
||
|
|
||
|
//TODO:
|
||
|
//FDividerFont.Assign(Screen.IconFont);
|
||
|
//FNavPanelFont.Assign(Screen.IconFont);
|
||
|
|
||
|
FNavPanelFont.Style := [fsBold];
|
||
|
FNavPanelHotTrackFont.Assign(FNavPanelFont);
|
||
|
FNavPanelHotTrackFontOptions := DefaultTrackFontOptions;
|
||
|
|
||
|
FDividerFont.OnChange := @DoFontChange;
|
||
|
FNavPanelFont.OnChange := @DoFontChange;
|
||
|
FNavPanelHotTrackFont.OnChange := @DoFontChange;
|
||
|
end;
|
||
|
|
||
|
destructor TJvNavPanelFonts.Destroy;
|
||
|
begin
|
||
|
FDividerFont.Free;
|
||
|
FHeaderFont.Free;
|
||
|
FNavPanelFont.Free;
|
||
|
FNavPanelHotTrackFont.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelFonts.Assign(Source: TPersistent);
|
||
|
begin
|
||
|
if Source is TJvNavPanelFonts then
|
||
|
begin
|
||
|
if Source <> Self then
|
||
|
begin
|
||
|
NavPanelFont := TJvNavPanelFonts(Source).NavPanelFont;
|
||
|
DividerFont := TJvNavPanelFonts(Source).DividerFont;
|
||
|
HeaderFont := TJvNavPanelFonts(Source).HeaderFont;
|
||
|
end;
|
||
|
end
|
||
|
else
|
||
|
inherited Assign(Source);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelFonts.Change;
|
||
|
begin
|
||
|
if Assigned(FOnChange) then
|
||
|
FOnChange(Self);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelFonts.DoFontChange(Sender: TObject);
|
||
|
begin
|
||
|
Change;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelFonts.SetDividerFont(const Value: TFont);
|
||
|
begin
|
||
|
FDividerFont.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelFonts.SetHeaderFont(const Value: TFont);
|
||
|
begin
|
||
|
FHeaderFont.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelFonts.SetNavPanelFont(const Value: TFont);
|
||
|
begin
|
||
|
FNavPanelFont.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelFonts.SetNavPanelHotTrackFont(const Value: TFont);
|
||
|
begin
|
||
|
FNavPanelHotTrackFont.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelFonts.SetNavPanelHotTrackFontOptions(const Value: TJvTrackFontOptions);
|
||
|
begin
|
||
|
if FNavPanelHotTrackFontOptions <> Value then
|
||
|
begin
|
||
|
FNavPanelHotTrackFontOptions := Value;
|
||
|
Change;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPanelPage } ====================================================
|
||
|
|
||
|
constructor TJvNavPanelPage.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
FBackground := TJvNavPaneBackgroundImage.Create;
|
||
|
FBackground.OnChange := @DoBackgroundChange;
|
||
|
ParentColor := False;
|
||
|
Color := clWindow;
|
||
|
ControlStyle := ControlStyle + [csDisplayDragImage];
|
||
|
FStyleLink := TJvNavStyleLink.Create;
|
||
|
FStyleLink.OnChange := @DoStyleChange;
|
||
|
FNavPanel := TJvNavPanelButton.Create(Self);
|
||
|
FNavPanel.Visible := True;
|
||
|
FNavPanel.Align := alBottom;
|
||
|
FNavPanel.GroupIndex := cNavPanelButtonGroupIndex; // use a silly number that no one else is probable to use
|
||
|
FNavPanel.AllowAllUp := False;
|
||
|
FIconButton := TJvNavIconButton.Create(Self);
|
||
|
FIconButton.ButtonType := nibImage;
|
||
|
FIconButton.Visible := False;
|
||
|
FIconButton.Align := alRight;
|
||
|
FIconButton.Width := 0;
|
||
|
FIconButton.GroupIndex := cNavPanelButtonGroupIndex;
|
||
|
FIconButton.AllowAllUp := False;
|
||
|
FNavPanel.OnClick := @DoButtonClick;
|
||
|
FIconButton.OnClick := @DoButtonClick;
|
||
|
ImageIndex := -1;
|
||
|
FParentStyleManager := True;
|
||
|
end;
|
||
|
|
||
|
destructor TJvNavPanelPage.Destroy;
|
||
|
begin
|
||
|
FStyleLink.Free;
|
||
|
FBackground.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
type
|
||
|
TJvCustomGraphicButtonAccess = class(TJvCustomGraphicButton)
|
||
|
public
|
||
|
property Down;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.DoButtonClick(Sender: TObject);
|
||
|
begin
|
||
|
{ We cannot test for NavPanel.Down if the Sender is a icon button }
|
||
|
if (Sender is TJvCustomGraphicButton) and TJvCustomGraphicButtonAccess(Sender).Down then
|
||
|
begin
|
||
|
if Parent <> nil then
|
||
|
TJvCustomNavigationPane(Parent).ActivePage := Self; // this sets "Down" as well
|
||
|
if Assigned(FOnClick) then
|
||
|
FOnClick(Self);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.DoStyleChange(Sender: TObject);
|
||
|
begin
|
||
|
Colors := (Sender as TJvNavPaneStyleManager).Colors;
|
||
|
NavPanel.Font := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelFont;
|
||
|
NavPanel.HotTrackFont := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelHotTrackFont;
|
||
|
NavPanel.HotTrackFontOptions := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelHotTrackFontOptions;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPanelPage.GetCaption: TCaption;
|
||
|
begin
|
||
|
if NavPanel = nil then
|
||
|
Result := ''
|
||
|
else
|
||
|
Result := NavPanel.Caption;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPanelPage.GetColors: TJvNavPanelColors;
|
||
|
begin
|
||
|
Result := NavPanel.Colors;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPanelPage.GetHint: string;
|
||
|
begin
|
||
|
if NavPanel = nil then
|
||
|
Result := ''
|
||
|
else
|
||
|
Result := NavPanel.Hint;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPanelPage.GetIconic: Boolean;
|
||
|
begin
|
||
|
if NavPanel = nil then
|
||
|
Result := False
|
||
|
else
|
||
|
Result := not NavPanel.Visible;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPanelPage.GetImageIndex: TImageIndex;
|
||
|
begin
|
||
|
if NavPanel = nil then
|
||
|
Result := FImageIndex
|
||
|
else
|
||
|
Result := NavPanel.ImageIndex;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.Notification(AComponent: TComponent;
|
||
|
Operation: TOperation);
|
||
|
begin
|
||
|
inherited Notification(AComponent, Operation);
|
||
|
if Operation = opRemove then
|
||
|
begin
|
||
|
if AComponent = IconPanel then
|
||
|
IconPanel := nil
|
||
|
else
|
||
|
if AComponent = StyleManager then
|
||
|
StyleManager := nil;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetCaption(const Value: TCaption);
|
||
|
begin
|
||
|
if NavPanel <> nil then
|
||
|
NavPanel.Caption := Value;
|
||
|
// TODO: StripHotkey
|
||
|
(*
|
||
|
if AutoHeader then
|
||
|
Header.Caption := StripHotkey(Value);
|
||
|
*)
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetColors(const Value: TJvNavPanelColors);
|
||
|
begin
|
||
|
NavPanel.Colors := Value;
|
||
|
IconButton.Colors := Value;
|
||
|
if AutoHeader then
|
||
|
begin
|
||
|
Header.ColorFrom := Value.HeaderColorFrom;
|
||
|
Header.ColorTo := Value.HeaderColorTo;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
begin
|
||
|
if FStyleManager <> Value then
|
||
|
begin
|
||
|
ParentStyleManager := False;
|
||
|
if FStyleManager <> nil then
|
||
|
FStyleManager.UnregisterChanges(FStyleLink);
|
||
|
FStyleManager := Value;
|
||
|
if FStyleManager <> nil then
|
||
|
begin
|
||
|
FStyleManager.RegisterChanges(FStyleLink);
|
||
|
FStyleManager.FreeNotification(Self);
|
||
|
Colors := FStyleManager.Colors;
|
||
|
end;
|
||
|
end;
|
||
|
// FNavPanel.StyleManager := Value;
|
||
|
// FIconButton.StyleManager := Value;
|
||
|
// if AutoHeader then
|
||
|
// Header.StyleManager := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetHint(const Value: string);
|
||
|
begin
|
||
|
NavPanel.Hint := Value;
|
||
|
IconButton.Hint := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetIconic(const Value: Boolean);
|
||
|
begin
|
||
|
NavPanel.Visible := not Value;
|
||
|
IconButton.Visible := Value;
|
||
|
NavPanel.Height := TJvCustomNavigationPane(Parent).ButtonHeight * Ord(NavPanel.Visible);
|
||
|
IconButton.Width := TJvCustomNavigationPane(Parent).ButtonWidth * Ord(IconButton.Visible);
|
||
|
UpdatePageList;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetIconPanel(const Value: TJvIconPanel);
|
||
|
begin
|
||
|
if (FIconPanel <> Value) and not (csDestroying in ComponentState) then
|
||
|
begin
|
||
|
FIconPanel := Value;
|
||
|
if IconButton <> nil then
|
||
|
begin
|
||
|
if FIconPanel <> nil then
|
||
|
begin
|
||
|
IconButton.Parent := FIconPanel;
|
||
|
FIconPanel.FreeNotification(Self);
|
||
|
end
|
||
|
else
|
||
|
IconButton.Parent := nil;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetImageIndex(const Value: TImageIndex);
|
||
|
begin
|
||
|
FImageIndex := Value;
|
||
|
NavPanel.ImageIndex := Value;
|
||
|
IconButton.ImageIndex := Value;
|
||
|
if AutoHeader then
|
||
|
Header.ImageIndex := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetPageIndex(Value: Integer);
|
||
|
begin
|
||
|
inherited SetPageIndex(Value);
|
||
|
UpdatePageList;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetParent( AParent: TWinControl);
|
||
|
begin
|
||
|
inherited SetParent(AParent);
|
||
|
if (FNavPanel = nil) or (FIconButton = nil) or (csDestroying in ComponentState) then
|
||
|
Exit;
|
||
|
NavPanel.Parent := AParent;
|
||
|
if AParent is TJvCustomNavigationPane then
|
||
|
begin
|
||
|
IconPanel := TJvCustomNavigationPane(AParent).FIconPanel;
|
||
|
// StyleManager := TJvCustomNavigationPane(AParent).StyleManager;
|
||
|
|
||
|
NavPanel.Colors := TJvCustomNavigationPane(AParent).Colors;
|
||
|
NavPanel.StyleManager := StyleManager;
|
||
|
NavPanel.Height := TJvCustomNavigationPane(AParent).ButtonHeight;
|
||
|
NavPanel.Images := TJvCustomNavigationPane(AParent).LargeImages;
|
||
|
NavPanel.Font := TJvCustomNavigationPane(AParent).NavPanelFont;
|
||
|
NavPanel.HotTrackFont := TJvCustomNavigationPane(AParent).NavPanelHotTrackFont;
|
||
|
NavPanel.HotTrackFontOptions := TJvCustomNavigationPane(AParent).NavPanelHotTrackFontOptions;
|
||
|
|
||
|
IconButton.Images := TJvCustomNavigationPane(AParent).SmallImages;
|
||
|
IconButton.Width := TJvCustomNavigationPane(AParent).ButtonWidth;
|
||
|
AutoHeader := TJvCustomNavigationPane(AParent).AutoHeaders;
|
||
|
end
|
||
|
else
|
||
|
IconButton.Parent := nil;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.UpdatePageList;
|
||
|
begin
|
||
|
if PageList <> nil then
|
||
|
TJvCustomNavigationPane(PageList).UpdatePositions;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetAutoHeader(const Value: Boolean);
|
||
|
begin
|
||
|
if AutoHeader <> Value then
|
||
|
begin
|
||
|
FreeAndNil(FHeader);
|
||
|
if Value then
|
||
|
begin
|
||
|
FHeader := TJvNavPanelHeader.Create(nil);
|
||
|
FHeader.ColorFrom := Colors.HeaderColorFrom;
|
||
|
FHeader.ColorTo := Colors.HeaderColorTo;
|
||
|
FHeader.Images := NavPanel.Images;
|
||
|
FHeader.ImageIndex := ImageIndex;
|
||
|
//TODO: StripHotkey
|
||
|
//FHeader.Caption := StripHotkey(Caption);
|
||
|
FHeader.Caption := Caption;
|
||
|
// make sure header is top-most
|
||
|
FHeader.Top := -10;
|
||
|
FHeader.Parent := Self;
|
||
|
FHeader.Align := alTop;
|
||
|
FHeader.Alignment := Alignment;
|
||
|
FHeader.WordWrap := WordWrap;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPanelPage.GetAutoHeader: Boolean;
|
||
|
begin
|
||
|
Result := FHeader <> nil;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPanelPage.GetAlignment: TAlignment;
|
||
|
begin
|
||
|
if NavPanel <> nil then
|
||
|
Result := NavPanel.Alignment
|
||
|
else
|
||
|
Result := taLeftJustify;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPanelPage.GetWordWrap: Boolean;
|
||
|
begin
|
||
|
if NavPanel <> nil then
|
||
|
Result := NavPanel.WordWrap
|
||
|
else
|
||
|
Result := False;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetAlignment(const Value: TAlignment);
|
||
|
begin
|
||
|
if NavPanel <> nil then
|
||
|
NavPanel.Alignment := Value;
|
||
|
if AutoHeader then
|
||
|
Header.Alignment := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetWordWrap(const Value: Boolean);
|
||
|
begin
|
||
|
if NavPanel <> nil then
|
||
|
NavPanel.WordWrap := Value;
|
||
|
if AutoHeader then
|
||
|
Header.WordWrap := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange);
|
||
|
begin
|
||
|
if (Msg.Sender <> Self) and ParentStyleManager then
|
||
|
begin
|
||
|
StyleManager := Msg.StyleManager;
|
||
|
ParentStyleManager := True;
|
||
|
InternalStyleManagerChanged(Self, Msg.StyleManager);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetParentStyleManager(const Value: Boolean);
|
||
|
begin
|
||
|
if FParentStyleManager <> Value then
|
||
|
begin
|
||
|
FParentStyleManager := Value;
|
||
|
if FParentStyleManager and (Parent <> nil) then
|
||
|
Parent.Perform(CM_PARENTSTYLEMANAGERCHANGE, 0, 0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.CMControlChange(var Msg: TLMessage);
|
||
|
begin
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.ParentStyleManagerChange(var Msg: TLMessage);
|
||
|
begin
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetBackground(const Value: TJvNavPaneBackgroundImage);
|
||
|
begin
|
||
|
FBackground.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.DoBackgroundChange(Sender: TObject);
|
||
|
begin
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.Paint;
|
||
|
begin
|
||
|
inherited Paint;
|
||
|
if FBackground.HasImage then
|
||
|
FBackground.DrawImage(Canvas, ClientRect)
|
||
|
else
|
||
|
if (Parent is TJvCustomNavigationPane) and TJvCustomNavigationPane(Parent).Background.HasImage then
|
||
|
TJvCustomNavigationPane(Parent).Background.DrawImage(Canvas, ClientRect);
|
||
|
end;
|
||
|
|
||
|
function TJvNavPanelPage.GetAction: TBasicAction;
|
||
|
begin
|
||
|
Result := inherited GetAction;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.SetAction(const Value: TBasicAction);
|
||
|
begin
|
||
|
inherited Action := Value;
|
||
|
FNavPanel.Action := Value;
|
||
|
FIconButton.Action := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelPage.ActionChange(Sender: TObject;
|
||
|
CheckDefaults: Boolean);
|
||
|
begin
|
||
|
if Sender is TCustomAction then
|
||
|
with TCustomAction(Sender) do
|
||
|
begin
|
||
|
if not CheckDefaults or (Self.Caption = '') or (Self.Caption = Self.Name) then
|
||
|
Self.Caption := Caption;
|
||
|
if not CheckDefaults or Self.Enabled then
|
||
|
Self.Enabled := Enabled; // NB! This disables resizing if the top-most button is disabled (due to TSplitter.FindControl)
|
||
|
if not CheckDefaults or (Self.Hint = '') then
|
||
|
Self.Hint := Hint;
|
||
|
if not CheckDefaults or (Self.ImageIndex = -1) then
|
||
|
Self.ImageIndex := ImageIndex;
|
||
|
if not CheckDefaults or Self.Visible then
|
||
|
Self.Visible := Visible;
|
||
|
if not CheckDefaults or not Assigned(Self.OnClick) then
|
||
|
Self.OnClick := OnExecute;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
//=== { TJvOutlookSplitter } =================================================
|
||
|
|
||
|
constructor TJvOutlookSplitter.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
ControlStyle := ControlStyle + [csOpaque];
|
||
|
FStyleLink := TJvNavStyleLink.Create;
|
||
|
FStyleLink.OnChange := @DoStyleChange;
|
||
|
FColorFrom := TColor($B78676);
|
||
|
FColorTo := TColor($A03D09);
|
||
|
Align := alBottom;
|
||
|
AutoSnap := False;
|
||
|
ResizeStyle := rsUpdate;
|
||
|
Height := 7;
|
||
|
Cursor := crSizeNS;
|
||
|
FParentStyleManager := True;
|
||
|
end;
|
||
|
|
||
|
destructor TJvOutlookSplitter.Destroy;
|
||
|
begin
|
||
|
FStyleLink.Free;
|
||
|
FStyleLink := nil;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.EnabledChanged;
|
||
|
begin
|
||
|
inherited EnabledChanged;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.DoStyleChange(Sender: TObject);
|
||
|
begin
|
||
|
with (Sender as TJvNavPaneStyleManager).Colors do
|
||
|
begin
|
||
|
FColorFrom := SplitterColorFrom;
|
||
|
FColorTo := SplitterColorTo;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.Notification(AComponent: TComponent;
|
||
|
Operation: TOperation);
|
||
|
begin
|
||
|
inherited Notification(AComponent, Operation);
|
||
|
if Operation = opRemove then
|
||
|
if AComponent = StyleManager then
|
||
|
StyleManager := nil;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.Paint;
|
||
|
var
|
||
|
I: Integer;
|
||
|
R: TRect;
|
||
|
begin
|
||
|
R := ClientRect;
|
||
|
if Align in [alTop, alBottom] then
|
||
|
begin
|
||
|
GradientFillRect(Canvas, R, ColorFrom, ColorTo, fdTopToBottom, R.Bottom - R.Top);
|
||
|
Inc(R.Left, (R.Right - R.Left) div 2 - 20);
|
||
|
Inc(R.Top, (R.Bottom - R.Top) div 2 - 1);
|
||
|
R.Right := R.Left + 2;
|
||
|
R.Bottom := R.Top + 2;
|
||
|
if Enabled then
|
||
|
for I := 0 to 9 do // draw the dots
|
||
|
begin
|
||
|
Canvas.Brush.Color := cl3DDkShadow;
|
||
|
Canvas.FillRect(R);
|
||
|
OffsetRect(R, 1, 1);
|
||
|
Canvas.Brush.Color := clWhite;
|
||
|
Canvas.FillRect(R);
|
||
|
Canvas.Brush.Color := ColorFrom; // (p3) this is probably not the right color, but it's close enough for me...
|
||
|
Canvas.FillRect(Rect(R.Left, R.Top, R.Left + 1, R.Top + 1));
|
||
|
OffsetRect(R, 3, -1);
|
||
|
end;
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
GradientFillRect(Canvas, R, ColorFrom, ColorTo, fdLeftToRight, R.Right - R.Left);
|
||
|
Inc(R.Top, (R.Bottom - R.Top) div 2 - 20);
|
||
|
Inc(R.Left, (R.Right - R.Left) div 2 - 1);
|
||
|
R.Right := R.Left + 2;
|
||
|
R.Bottom := R.Top + 2;
|
||
|
if Enabled then
|
||
|
for I := 0 to 9 do // draw the dots
|
||
|
begin
|
||
|
Canvas.Brush.Color := cl3DDkShadow;
|
||
|
Canvas.FillRect(R);
|
||
|
OffsetRect(R, 1, 1);
|
||
|
Canvas.Brush.Color := clWhite;
|
||
|
Canvas.FillRect(R);
|
||
|
Canvas.Brush.Color := ColorFrom;
|
||
|
Canvas.FillRect(Rect(R.Left, R.Top, R.Left + 1, R.Top + 1));
|
||
|
OffsetRect(R, -1, 3);
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.SetColorFrom(const Value: TColor);
|
||
|
begin
|
||
|
if FColorFrom <> Value then
|
||
|
begin
|
||
|
FColorFrom := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
begin
|
||
|
if FStyleManager <> Value then
|
||
|
begin
|
||
|
ParentStyleManager := False;
|
||
|
if FStyleManager <> nil then
|
||
|
FStyleManager.UnregisterChanges(FStyleLink);
|
||
|
FStyleManager := Value;
|
||
|
if FStyleManager <> nil then
|
||
|
begin
|
||
|
FStyleManager.RegisterChanges(FStyleLink);
|
||
|
FStyleManager.FreeNotification(Self);
|
||
|
ColorFrom := FStyleManager.Colors.SplitterColorFrom;
|
||
|
ColorTo := FStyleManager.Colors.SplitterColorTo;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.SetColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FColorTo <> Value then
|
||
|
begin
|
||
|
FColorTo := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange);
|
||
|
begin
|
||
|
if (Msg.Sender <> Self) and ParentStyleManager then
|
||
|
begin
|
||
|
StyleManager := Msg.StyleManager;
|
||
|
ParentStyleManager := True;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.SetParentStyleManager(const Value: Boolean);
|
||
|
begin
|
||
|
if FParentStyleManager <> Value then
|
||
|
begin
|
||
|
FParentStyleManager := Value;
|
||
|
if FParentStyleManager and (Parent <> nil) then
|
||
|
Parent.Perform(CM_PARENTSTYLEMANAGERCHANGE, 0, 0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TJvOutlookSplitter.GetDragZoneRect: TRect;
|
||
|
begin
|
||
|
Result := ClientRect;
|
||
|
if DragZone <> 0 then
|
||
|
begin
|
||
|
if Align in [alLeft, alRight] then
|
||
|
begin
|
||
|
if DragZone < RectHeight(Result) then
|
||
|
begin
|
||
|
Result.Top := (RectHeight(Result) - DragZone) div 2;
|
||
|
Result.Bottom := Result.Top + DragZone;
|
||
|
end;
|
||
|
end
|
||
|
else
|
||
|
if Align in [alTop, alBottom] then
|
||
|
begin
|
||
|
if DragZone < RectWidth(Result) then
|
||
|
begin
|
||
|
Result.Left := (RectWidth(Result) - DragZone) div 2;
|
||
|
Result.Right := Result.Left + DragZone;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TJvOutlookSplitter.MouseInDragZone(X, Y: Integer): Boolean;
|
||
|
begin
|
||
|
Result := (DragZone <= 0) or PtInRect(GetDragZoneRect, Point(X, Y));
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.WMLButtonDown(var Msg: TLMLButtonDown);
|
||
|
begin
|
||
|
if MouseInDragZone(Msg.XPos, Msg.YPos) then
|
||
|
inherited;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.WMMouseMove(var Msg: TLMMouseMove);
|
||
|
begin
|
||
|
inherited;
|
||
|
if MouseInDragZone(Msg.XPos, Msg.YPos) then
|
||
|
begin
|
||
|
if Cursor <> FOldCursor then
|
||
|
inherited Cursor := FOldCursor;
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
if Cursor <> crDefault then
|
||
|
begin
|
||
|
FOldCursor := Cursor;
|
||
|
inherited Cursor := crDefault;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.SetCursor(const Value: TCursor);
|
||
|
begin
|
||
|
inherited Cursor := Value;
|
||
|
FOldCursor := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvOutlookSplitter.RequestAlign;
|
||
|
begin
|
||
|
if (Cursor = crSizeWE) or (Cursor = crSizeNS) then
|
||
|
begin
|
||
|
if Align in [alLeft, alRight] then
|
||
|
Cursor := crSizeWE
|
||
|
else
|
||
|
Cursor := crSizeNS;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPanelHeader } ==================================================
|
||
|
|
||
|
constructor TJvNavPanelHeader.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
FChangeLink := TChangeLink.Create;
|
||
|
FChangeLink.OnChange := @DoImagesChange;
|
||
|
FStyleLink := TJvNavStyleLink.Create;
|
||
|
FStyleLink.OnChange := @DoStyleChange;
|
||
|
ControlStyle := ControlStyle + [csOpaque, csAcceptsControls];
|
||
|
FColorFrom := TColor($D0835C);
|
||
|
FColorTo := TColor($903B09);
|
||
|
Font.Name := 'Arial';
|
||
|
Font.Size := 12;
|
||
|
Font.Style := [fsBold];
|
||
|
Font.Color := clWhite;
|
||
|
Height := 27;
|
||
|
Width := 225;
|
||
|
FParentStyleManager := True;
|
||
|
end;
|
||
|
|
||
|
destructor TJvNavPanelHeader.Destroy;
|
||
|
begin
|
||
|
FChangeLink.Free;
|
||
|
FStyleLink.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.DoImagesChange(Sender: TObject);
|
||
|
begin
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.DoStyleChange(Sender: TObject);
|
||
|
begin
|
||
|
Font := (Sender as TJvNavPaneStyleManager).Fonts.HeaderFont;
|
||
|
with (Sender as TJvNavPaneStyleManager).Colors do
|
||
|
begin
|
||
|
FColorFrom := HeaderColorFrom;
|
||
|
FColorTo := HeaderColorTo;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.Notification(AComponent: TComponent;
|
||
|
Operation: TOperation);
|
||
|
begin
|
||
|
inherited Notification(AComponent, Operation);
|
||
|
if Operation = opRemove then
|
||
|
if AComponent = Images then
|
||
|
Images := nil
|
||
|
else
|
||
|
if AComponent = StyleManager then
|
||
|
StyleManager := nil;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.Paint;
|
||
|
const
|
||
|
cAlignment: array[TAlignment] of Cardinal = (DT_LEFT, DT_RIGHT, DT_CENTER);
|
||
|
cWordWrap: array[Boolean] of Cardinal = (DT_SINGLELINE, DT_WORDBREAK);
|
||
|
var
|
||
|
R, TempRect: TRect;
|
||
|
X, Y, H: Integer;
|
||
|
|
||
|
function IsValidImage: Boolean;
|
||
|
begin
|
||
|
Result := (Images <> nil) and (ImageIndex >= 0) and (ImageIndex < Images.Count);
|
||
|
end;
|
||
|
|
||
|
begin
|
||
|
R := ClientRect;
|
||
|
GradientFillRect(Canvas, R, ColorFrom, ColorTo, fdTopToBottom, 32);
|
||
|
H := Canvas.TextHeight(Caption);
|
||
|
if Caption <> '' then
|
||
|
begin
|
||
|
Canvas.Font := Font;
|
||
|
InflateRect(R, -4, 0);
|
||
|
SetBkMode(Canvas.Handle, TRANSPARENT);
|
||
|
TempRect := R;
|
||
|
DrawText(Canvas, Caption, Length(Caption), TempRect,
|
||
|
DT_CALCRECT or cAlignment[Alignment] or cWordWrap[WordWrap] or DT_VCENTER or DT_NOPREFIX or DT_END_ELLIPSIS);
|
||
|
if WordWrap then
|
||
|
OffsetRect(R, 0, (Height - H) div 2);
|
||
|
if IsValidImage and (Alignment = taCenter) then
|
||
|
OffsetRect(R, 0, -Images.Height div 2);
|
||
|
DrawText(Canvas, Caption, Length(Caption), R,
|
||
|
cAlignment[Alignment] or cWordWrap[WordWrap] or DT_VCENTER or DT_NOPREFIX or DT_END_ELLIPSIS);
|
||
|
end;
|
||
|
if IsValidImage then
|
||
|
begin
|
||
|
Y := (Height - Images.Height) div 2;
|
||
|
case Alignment of
|
||
|
taLeftJustify:
|
||
|
X := R.Right - Images.Width;
|
||
|
taRightJustify:
|
||
|
X := R.Left + 4;
|
||
|
else // taCenter
|
||
|
begin
|
||
|
if Caption <> '' then
|
||
|
begin
|
||
|
if WordWrap then
|
||
|
Y := R.Top + H + 4
|
||
|
else
|
||
|
Y := (Height + Canvas.TextHeight('Wq')) div 2 + 4;
|
||
|
end;
|
||
|
X := (Width - Images.Width) div 2;
|
||
|
end;
|
||
|
end;
|
||
|
if Y > Height - Images.Height - 4 then
|
||
|
Y := Height - Images.Height - 4;
|
||
|
Images.Draw(Canvas, X, Y, ImageIndex, True);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.SetColorFrom(const Value: TColor);
|
||
|
begin
|
||
|
if FColorFrom <> Value then
|
||
|
begin
|
||
|
FColorFrom := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
begin
|
||
|
if FStyleManager <> Value then
|
||
|
begin
|
||
|
ParentStyleManager := False;
|
||
|
if FStyleManager <> nil then
|
||
|
FStyleManager.UnregisterChanges(FStyleLink);
|
||
|
FStyleManager := Value;
|
||
|
if FStyleManager <> nil then
|
||
|
begin
|
||
|
FStyleManager.RegisterChanges(FStyleLink);
|
||
|
FStyleManager.FreeNotification(Self);
|
||
|
FColorFrom := FStyleManager.Colors.HeaderColorFrom;
|
||
|
FColorTo := FStyleManager.Colors.HeaderColorTo;
|
||
|
Font := FStyleManager.Fonts.HeaderFont;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
InternalStyleManagerChanged(Self, Value);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.SetColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FColorTo <> Value then
|
||
|
begin
|
||
|
FColorTo := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.SetImageIndex(const Value: TImageIndex);
|
||
|
begin
|
||
|
if FImageIndex <> Value then
|
||
|
begin
|
||
|
FImageIndex := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.SetImages(const Value: TCustomImageList);
|
||
|
begin
|
||
|
if FImages <> Value then
|
||
|
begin
|
||
|
if FImages <> nil then
|
||
|
FImages.UnregisterChanges(FChangeLink);
|
||
|
FImages := Value;
|
||
|
if FImages <> nil then
|
||
|
begin
|
||
|
FImages.RegisterChanges(FChangeLink);
|
||
|
FImages.FreeNotification(Self);
|
||
|
end;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.TextChanged;
|
||
|
begin
|
||
|
inherited TextChanged;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.WMEraseBkgnd(var Msg: TLMEraseBkgnd);
|
||
|
begin
|
||
|
Msg.Result := 1;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.SetAlignment(const Value: TAlignment);
|
||
|
begin
|
||
|
if FAlignment <> Value then
|
||
|
begin
|
||
|
FAlignment := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.SetWordWrap(const Value: Boolean);
|
||
|
begin
|
||
|
if FWordWrap <> Value then
|
||
|
begin
|
||
|
FWordWrap := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange);
|
||
|
begin
|
||
|
if (Msg.Sender <> Self) and ParentStyleManager then
|
||
|
begin
|
||
|
StyleManager := Msg.StyleManager;
|
||
|
ParentStyleManager := True;
|
||
|
InternalStyleManagerChanged(Self, Msg.StyleManager);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.ParentStyleManagerChange(var Msg: TLMessage);
|
||
|
begin
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.SetParentStyleManager(const Value: Boolean);
|
||
|
begin
|
||
|
if FParentStyleManager <> Value then
|
||
|
begin
|
||
|
FParentStyleManager := Value;
|
||
|
if FParentStyleManager and (Parent <> nil) then
|
||
|
Parent.Perform(CM_PARENTSTYLEMANAGERCHANGE, 0, 0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelHeader.CMControlChange(var Msg: TLMessage);
|
||
|
begin
|
||
|
// a control was inserted or removed
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPanelDivider } =================================================
|
||
|
|
||
|
constructor TJvNavPanelDivider.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
FAlignment := taLeftJustify;
|
||
|
FStyleLink := TJvNavStyleLink.Create;
|
||
|
FStyleLink.OnChange := @DoStyleChange;
|
||
|
Align := alNone;
|
||
|
AutoSnap := False;
|
||
|
ResizeStyle := rsUpdate;
|
||
|
ControlStyle := ControlStyle + [csOpaque];
|
||
|
FColorFrom := TColor($FFDBBC);
|
||
|
FColorTo := TColor($F2C0A4);
|
||
|
FFrameColor := TColor($6F2F0C);
|
||
|
Cursor := crSizeNS;
|
||
|
//TODO:
|
||
|
//Font := Screen.IconFont;
|
||
|
Height := 19;
|
||
|
Width := 125;
|
||
|
FParentStyleManager := True;
|
||
|
end;
|
||
|
|
||
|
// 25.09.2007 - SESS
|
||
|
// When align is assigned height is lost
|
||
|
procedure TJvNavPanelDivider.SetAlign(Value: TAlign);
|
||
|
var
|
||
|
SaveHeight: integer;
|
||
|
begin
|
||
|
SaveHeight := Height;
|
||
|
inherited SetAlign(Value);
|
||
|
Height := SaveHeight;
|
||
|
end;
|
||
|
|
||
|
destructor TJvNavPanelDivider.Destroy;
|
||
|
begin
|
||
|
FStyleLink.Free;
|
||
|
FStyleLink := nil;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.TextChanged;
|
||
|
begin
|
||
|
inherited TextChanged;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.DoStyleChange(Sender: TObject);
|
||
|
begin
|
||
|
Font := (Sender as TJvNavPaneStyleManager).Fonts.DividerFont;
|
||
|
with (Sender as TJvNavPaneStyleManager).Colors do
|
||
|
begin
|
||
|
FColorFrom := DividerColorFrom;
|
||
|
FColorTo := DividerColorTo;
|
||
|
Self.FFrameColor := FrameColor;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.Notification(AComponent: TComponent;
|
||
|
Operation: TOperation);
|
||
|
begin
|
||
|
inherited Notification(AComponent, Operation);
|
||
|
if Operation = opRemove then
|
||
|
begin
|
||
|
if AComponent = StyleManager then
|
||
|
StyleManager := nil;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.Paint;
|
||
|
const
|
||
|
cAlignment: array[TAlignment] of Cardinal = (DT_LEFT, DT_RIGHT, DT_CENTER);
|
||
|
var
|
||
|
R: TRect;
|
||
|
begin
|
||
|
R := ClientRect;
|
||
|
GradientFillRect(Canvas, R, ColorFrom, ColorTo, fdTopToBottom, 32);
|
||
|
if Caption <> '' then
|
||
|
begin
|
||
|
Canvas.Font := Font;
|
||
|
case Alignment of
|
||
|
taLeftJustify:
|
||
|
Inc(R.Left, 7);
|
||
|
taRightJustify:
|
||
|
Dec(R.Right, 7);
|
||
|
end;
|
||
|
SetBkMode(Canvas.Handle, TRANSPARENT);
|
||
|
DrawText(Canvas, Caption, Length(Caption), R,
|
||
|
DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX or DT_EDITCONTROL or cAlignment[Alignment]);
|
||
|
end;
|
||
|
Canvas.Pen.Color := FrameColor;
|
||
|
Canvas.MoveTo(0, ClientHeight - 1);
|
||
|
Canvas.LineTo(Width, ClientHeight - 1);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.SetColorFrom(const Value: TColor);
|
||
|
begin
|
||
|
if FColorFrom <> Value then
|
||
|
begin
|
||
|
FColorFrom := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
begin
|
||
|
if FStyleManager <> Value then
|
||
|
begin
|
||
|
ParentStyleManager := False;
|
||
|
if FStyleManager <> nil then
|
||
|
FStyleManager.UnregisterChanges(FStyleLink);
|
||
|
FStyleManager := Value;
|
||
|
if FStyleManager <> nil then
|
||
|
begin
|
||
|
FStyleManager.RegisterChanges(FStyleLink);
|
||
|
FStyleManager.FreeNotification(Self);
|
||
|
ColorFrom := FStyleManager.Colors.DividerColorFrom;
|
||
|
ColorTo := FStyleManager.Colors.DividerColorTo;
|
||
|
Font := FStyleManager.Fonts.DividerFont;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.SetColorTo(const Value: TColor);
|
||
|
begin
|
||
|
if FColorTo <> Value then
|
||
|
begin
|
||
|
FColorTo := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.SetFrameColor(const Value: TColor);
|
||
|
begin
|
||
|
if FFrameColor <> Value then
|
||
|
begin
|
||
|
FFrameColor := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.SetAlignment(const Value: TAlignment);
|
||
|
begin
|
||
|
if FAlignment <> Value then
|
||
|
begin
|
||
|
FAlignment := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange);
|
||
|
begin
|
||
|
if (Msg.Sender <> Self) and ParentStyleManager then
|
||
|
begin
|
||
|
StyleManager := Msg.StyleManager;
|
||
|
ParentStyleManager := True;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.SetParentStyleManager(const Value: Boolean);
|
||
|
begin
|
||
|
if FParentStyleManager <> Value then
|
||
|
begin
|
||
|
FParentStyleManager := Value;
|
||
|
if FParentStyleManager and (Parent <> nil) then
|
||
|
Parent.Perform(CM_PARENTSTYLEMANAGERCHANGE, 0, 0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelDivider.RequestAlign;
|
||
|
begin
|
||
|
if (Cursor = crSizeWE) or (Cursor = crSizeNS) then
|
||
|
begin
|
||
|
if Align in [alLeft, alRight] then
|
||
|
Cursor := crSizeWE
|
||
|
else
|
||
|
Cursor := crSizeNS;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPaneStyleManager } =============================================
|
||
|
|
||
|
constructor TJvNavPaneStyleManager.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
FClients := TList.Create;
|
||
|
FColors := TJvNavPanelColors.Create;
|
||
|
FFonts := TJvNavPanelFonts.Create;
|
||
|
FColors.OnChange := @DoThemeChange;
|
||
|
FFonts.OnChange := @DoThemeChange;
|
||
|
FTheme := nptCustom; // (p3) required to trigger the change method
|
||
|
Theme := nptStandard;
|
||
|
end;
|
||
|
|
||
|
destructor TJvNavPaneStyleManager.Destroy;
|
||
|
begin
|
||
|
while FClients.Count > 0 do
|
||
|
UnregisterChanges(TJvNavStyleLink(FClients.Last));
|
||
|
FClients.Free;
|
||
|
FClients := nil;
|
||
|
FColors.Free;
|
||
|
FFonts.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneStyleManager.Assign(Source: TPersistent);
|
||
|
var
|
||
|
SourceColors: TJvNavPanelColors;
|
||
|
SourceFonts: TJvNavPanelFonts;
|
||
|
begin
|
||
|
SourceFonts := nil;
|
||
|
if Source is TJvNavPaneStyleManager then
|
||
|
begin
|
||
|
Theme := TJvNavPaneStyleManager(Source).Theme;
|
||
|
if Theme = nptCustom then
|
||
|
begin
|
||
|
SourceColors := TJvNavPaneStyleManager(Source).Colors;
|
||
|
SourceFonts := TJvNavPaneStyleManager(Source).Fonts;
|
||
|
end
|
||
|
else
|
||
|
Exit;
|
||
|
end
|
||
|
else
|
||
|
if Source is TJvIconPanel then
|
||
|
SourceColors := TJvIconPanel(Source).Colors
|
||
|
else
|
||
|
if Source is TJvNavIconButton then
|
||
|
SourceColors := TJvNavIconButton(Source).Colors
|
||
|
else
|
||
|
if Source is TJvNavPanelButton then
|
||
|
SourceColors := TJvNavPanelButton(Source).Colors
|
||
|
else
|
||
|
if Source is TJvNavPanelPage then
|
||
|
SourceColors := TJvNavPanelPage(Source).Colors
|
||
|
else
|
||
|
if Source is TJvCustomNavigationPane then
|
||
|
SourceColors := TJvCustomNavigationPane(Source).Colors
|
||
|
else
|
||
|
begin
|
||
|
inherited Assign(Source);
|
||
|
Exit;
|
||
|
end;
|
||
|
FColors.Assign(SourceColors);
|
||
|
if SourceFonts <> nil then
|
||
|
FFonts.Assign(SourceFonts);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneStyleManager.AssignTo(Dest: TPersistent);
|
||
|
var
|
||
|
DestColors: TJvNavPanelColors;
|
||
|
DestFonts: TJvNavPanelFonts;
|
||
|
begin
|
||
|
DestFonts := nil;
|
||
|
if Dest is TJvNavPaneStyleManager then
|
||
|
begin
|
||
|
TJvNavPaneStyleManager(Dest).Theme := Theme;
|
||
|
if Theme = nptCustom then
|
||
|
begin
|
||
|
DestColors := TJvNavPaneStyleManager(Dest).Colors;
|
||
|
DestFonts := TJvNavPaneStyleManager(Dest).Fonts;
|
||
|
end
|
||
|
else
|
||
|
Exit;
|
||
|
end
|
||
|
else
|
||
|
if Dest is TJvIconPanel then
|
||
|
DestColors := TJvIconPanel(Dest).Colors
|
||
|
else
|
||
|
if Dest is TJvNavIconButton then
|
||
|
DestColors := TJvNavIconButton(Dest).Colors
|
||
|
else
|
||
|
if Dest is TJvNavPanelButton then
|
||
|
DestColors := TJvNavPanelButton(Dest).Colors
|
||
|
else
|
||
|
if Dest is TJvNavPanelPage then
|
||
|
DestColors := TJvNavPanelPage(Dest).Colors
|
||
|
else
|
||
|
if Dest is TJvCustomNavigationPane then
|
||
|
DestColors := TJvCustomNavigationPane(Dest).Colors
|
||
|
else
|
||
|
begin
|
||
|
inherited AssignTo(Dest);
|
||
|
Exit;
|
||
|
end;
|
||
|
DestColors.Assign(Colors);
|
||
|
if DestFonts <> nil then
|
||
|
DestFonts.Assign(Fonts);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneStyleManager.Change;
|
||
|
var
|
||
|
I: Integer;
|
||
|
begin
|
||
|
if FClients <> nil then
|
||
|
for I := 0 to FClients.Count - 1 do
|
||
|
TJvNavStyleLink(FClients[I]).Change;
|
||
|
if Assigned(FOnThemeChange) then
|
||
|
FOnThemeChange(Self);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneStyleManager.DoThemeChange(Sender: TObject);
|
||
|
begin
|
||
|
Theme := nptCustom;
|
||
|
Change;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneStyleManager.RegisterChanges(Value: TJvNavStyleLink);
|
||
|
begin
|
||
|
Value.Sender := Self;
|
||
|
if FClients <> nil then
|
||
|
FClients.Add(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneStyleManager.SetColors(const Value: TJvNavPanelColors);
|
||
|
begin
|
||
|
FColors.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneStyleManager.SetFonts(const Value: TJvNavPanelFonts);
|
||
|
begin
|
||
|
FFonts.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneStyleManager.SetTheme(const Value: TJvNavPanelTheme);
|
||
|
begin
|
||
|
if FTheme <> Value then
|
||
|
begin
|
||
|
FColors.OnChange := nil;
|
||
|
FFonts.OnChange := nil;
|
||
|
try
|
||
|
case Value of
|
||
|
nptStandard:
|
||
|
begin
|
||
|
FColors.ButtonColorFrom := TColor($FFFFFF);
|
||
|
FColors.ButtonColorTo := TColor($BDBEBD);
|
||
|
FColors.ButtonSelectedColorFrom := TColor($DECFCE);
|
||
|
FColors.ButtonSelectedColorTo := TColor($DECFCE);
|
||
|
FColors.FrameColor := TColor($848484);
|
||
|
FColors.ButtonHotColorFrom := TColor($C68284);
|
||
|
FColors.ButtonHotColorTo := TColor($C68284);
|
||
|
FColors.DividerColorFrom := TColor($EFF3EF);
|
||
|
FColors.DividerColorTo := TColor($C6C3C6);
|
||
|
FColors.HeaderColorFrom := TColor($848284);
|
||
|
FColors.HeaderColorTo := TColor($848284);
|
||
|
FColors.SplitterColorFrom := TColor($C6C3C6);
|
||
|
FColors.SplitterColorTo := TColor($8C8E8C);
|
||
|
FColors.ButtonSeparatorColor := clGray;
|
||
|
FColors.ToolPanelColorFrom := clWindow;
|
||
|
FColors.ToolPanelColorTo := clWindow;
|
||
|
FColors.ToolPanelHeaderColorFrom := TColor($FFFFFF);
|
||
|
FColors.ToolPanelHeaderColorTo := TColor($BDBEBD);
|
||
|
FFonts.HeaderFont.Color := clWindow;
|
||
|
FFonts.NavPanelFont.Color := clWindowText;
|
||
|
FFonts.NavPanelHotTrackFont.Color := clWindow;
|
||
|
FFonts.DividerFont.Color := clWindowText;
|
||
|
end;
|
||
|
nptXPBlue:
|
||
|
begin
|
||
|
FColors.ButtonColorFrom := TColor($F7E2CD);
|
||
|
FColors.ButtonColorTo := TColor($F3A080);
|
||
|
FColors.ButtonSelectedColorFrom := TColor($BBE2EA);
|
||
|
FColors.ButtonSelectedColorTo := TColor($389FDD);
|
||
|
FColors.FrameColor := TColor($6F2F0C);
|
||
|
FColors.ButtonHotColorFrom := TColor($DBFBFF);
|
||
|
FColors.ButtonHotColorTo := TColor($5FC8FB);
|
||
|
FColors.DividerColorFrom := TColor($FFDBBC);
|
||
|
FColors.DividerColorTo := TColor($F2C0A4);
|
||
|
FColors.HeaderColorFrom := TColor($D0835C);
|
||
|
FColors.HeaderColorTo := TColor($903B09);
|
||
|
FColors.SplitterColorFrom := TColor($B78676);
|
||
|
FColors.SplitterColorTo := TColor($A03D09);
|
||
|
FColors.ButtonSeparatorColor := TColor($602D00); // SESS
|
||
|
|
||
|
FColors.ToolPanelColorFrom := clWindow;
|
||
|
FColors.ToolPanelColorTo := clWindow;
|
||
|
FColors.ToolPanelHeaderColorFrom := TColor($F7E2CD);
|
||
|
FColors.ToolPanelHeaderColorTo := TColor($F3A080);
|
||
|
|
||
|
FFonts.HeaderFont.Color := clWindow;
|
||
|
FFonts.NavPanelFont.Color := clWindowText;
|
||
|
FFonts.NavPanelHotTrackFont.Color := clWindowText;
|
||
|
FFonts.DividerFont.Color := clWindowText;
|
||
|
end;
|
||
|
nptXPSilver:
|
||
|
begin
|
||
|
FColors.ButtonColorFrom := TColor($F4E2E1);
|
||
|
FColors.ButtonColorTo := TColor($B09494);
|
||
|
FColors.ButtonSelectedColorFrom := TColor($BBE2EA);
|
||
|
FColors.ButtonSelectedColorTo := TColor($389FDD);
|
||
|
FColors.FrameColor := TColor($527D92);
|
||
|
FColors.ButtonHotColorFrom := TColor($DBFBFF);
|
||
|
FColors.ButtonHotColorTo := TColor($5FC8FB);
|
||
|
FColors.DividerColorFrom := TColor($F8F3F4);
|
||
|
FColors.DividerColorTo := TColor($EADADB);
|
||
|
FColors.HeaderColorFrom := TColor($BAA8BA);
|
||
|
FColors.HeaderColorTo := TColor($917275);
|
||
|
FColors.SplitterColorFrom := TColor($B8ABA9);
|
||
|
FColors.SplitterColorTo := TColor($81767E);
|
||
|
FColors.ButtonSeparatorColor := TColor($947C7C);
|
||
|
FColors.ToolPanelColorFrom := clWindow;
|
||
|
FColors.ToolPanelColorTo := clWindow;
|
||
|
FColors.ToolPanelHeaderColorFrom := TColor($F4E2E1);
|
||
|
FColors.ToolPanelHeaderColorTo := TColor($B09494);
|
||
|
|
||
|
FFonts.HeaderFont.Color := clWindow;
|
||
|
FFonts.NavPanelFont.Color := clWindowText;
|
||
|
FFonts.NavPanelHotTrackFont.Color := clWindowText;
|
||
|
FFonts.DividerFont.Color := clWindowText;
|
||
|
end;
|
||
|
nptXPOlive:
|
||
|
begin
|
||
|
FColors.ButtonColorFrom := TColor($D6F3E3);
|
||
|
FColors.ButtonColorTo := TColor($93BFB2);
|
||
|
FColors.ButtonSelectedColorFrom := TColor($BBE2EA);
|
||
|
FColors.ButtonSelectedColorTo := TColor($389FDD);
|
||
|
FColors.FrameColor := TColor($5A7972);
|
||
|
FColors.ButtonHotColorFrom := TColor($DBFBFF);
|
||
|
FColors.ButtonHotColorTo := TColor($5FC8FB);
|
||
|
FColors.DividerColorFrom := TColor($D2F4EE);
|
||
|
FColors.DividerColorTo := TColor($B5DFD8);
|
||
|
FColors.HeaderColorFrom := TColor($94BFB4);
|
||
|
FColors.HeaderColorTo := TColor($427665);
|
||
|
FColors.SplitterColorFrom := TColor($758D81);
|
||
|
FColors.SplitterColorTo := TColor($3A584D);
|
||
|
FColors.ButtonSeparatorColor := TColor($588060);
|
||
|
FColors.ToolPanelColorFrom := clWindow;
|
||
|
FColors.ToolPanelColorTo := clWindow;
|
||
|
FColors.ToolPanelHeaderColorFrom := TColor($D6F3E3);
|
||
|
FColors.ToolPanelHeaderColorTo := TColor($93BFB2);
|
||
|
|
||
|
FFonts.HeaderFont.Color := clWindow;
|
||
|
FFonts.NavPanelFont.Color := clWindowText;
|
||
|
FFonts.NavPanelHotTrackFont.Color := clWindowText;
|
||
|
FFonts.DividerFont.Color := clWindowText;
|
||
|
end;
|
||
|
nptCustom:
|
||
|
begin
|
||
|
// do nothing
|
||
|
end;
|
||
|
end;
|
||
|
FTheme := Value;
|
||
|
Change;
|
||
|
finally
|
||
|
FColors.OnChange := @DoThemeChange;
|
||
|
FFonts.OnChange := @DoThemeChange;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneStyleManager.UnregisterChanges(Value: TJvNavStyleLink);
|
||
|
var
|
||
|
I: Integer;
|
||
|
begin
|
||
|
if FClients <> nil then
|
||
|
for I := 0 to FClients.Count - 1 do
|
||
|
if FClients[I] = Pointer(Value) then
|
||
|
begin
|
||
|
Value.Sender := nil;
|
||
|
FClients.Delete(I);
|
||
|
Break;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPaneStyleManager.IsColorsStored: Boolean;
|
||
|
begin
|
||
|
Result := Theme = nptCustom;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPaneStyleManager.IsFontsStored: Boolean;
|
||
|
begin
|
||
|
Result := Theme = nptCustom;
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavStyleLink } ====================================================
|
||
|
|
||
|
destructor TJvNavStyleLink.Destroy;
|
||
|
begin
|
||
|
if Sender is TJvNavPaneStyleManager then
|
||
|
TJvNavPaneStyleManager(Sender).UnregisterChanges(Self);
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavStyleLink.Change;
|
||
|
begin
|
||
|
if Assigned(FOnChange) then
|
||
|
FOnChange(Sender);
|
||
|
end;
|
||
|
|
||
|
//=== { TJvCustomNavPaneToolPanel } ==========================================
|
||
|
|
||
|
constructor TJvCustomNavPaneToolPanel.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
FHeaderVisible := True;
|
||
|
ParentColor := False;
|
||
|
FColors := TJvNavPanelColors.Create;
|
||
|
FColors.OnChange := @DoImagesChange;
|
||
|
FBackground := TJvNavPaneBackgroundImage.Create;
|
||
|
FBackground.OnChange := @DoImagesChange;
|
||
|
ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
|
||
|
csOpaque, csDoubleClicks, csReplicatable];
|
||
|
FButtons := TJvNavPaneToolButtons.Create(Self);
|
||
|
FStyleLink := TJvNavStyleLink.Create;
|
||
|
FStyleLink.OnChange := @DoStyleChange;
|
||
|
FChangeLink := TChangeLink.Create;
|
||
|
FChangeLink.OnChange := @DoImagesChange;
|
||
|
{
|
||
|
FColorFrom := TColor($F7E2CD);
|
||
|
FColorTo := TColor($F3A080);
|
||
|
FButtonColor := TColor($A03D09);
|
||
|
}
|
||
|
FButtonWidth := 25;
|
||
|
FButtonHeight := 22;
|
||
|
FHeaderHeight := 29;
|
||
|
FEdgeRounding := 9;
|
||
|
FShowGrabber := True;
|
||
|
//TODO:
|
||
|
//Font := Screen.IconFont;
|
||
|
Font.Style := [fsBold];
|
||
|
|
||
|
FCloseButton := TJvNavPanelToolButton.Create(Self);
|
||
|
FCloseButton.ButtonType := nibClose;
|
||
|
FCloseButton.Parent := Self;
|
||
|
FCloseButton.Visible := True;
|
||
|
FCloseButton.OnClick := @DoCloseClick;
|
||
|
|
||
|
FDropDown := TJvNavPanelToolButton.Create(Self);
|
||
|
FDropDown.Visible := False;
|
||
|
FDropDown.ButtonType := nibDropArrow;
|
||
|
FDropDown.OnDropDownMenu := @DoDropDownMenu;
|
||
|
FDropDown.Parent := Self;
|
||
|
|
||
|
Width := 185;
|
||
|
Height := 41;
|
||
|
FParentStyleManager := True;
|
||
|
end;
|
||
|
|
||
|
destructor TJvCustomNavPaneToolPanel.Destroy;
|
||
|
begin
|
||
|
FStyleLink.Free;
|
||
|
FChangeLink.Free;
|
||
|
FButtons.Free;
|
||
|
FBackground.Free;
|
||
|
FColors.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.ButtonsChanged;
|
||
|
var
|
||
|
I: Integer;
|
||
|
B: TJvNavPanelToolButton;
|
||
|
begin
|
||
|
if HeaderVisible then
|
||
|
for I := 0 to Buttons.Count - 1 do
|
||
|
begin
|
||
|
B := Buttons[I].Button;
|
||
|
B.Visible := False;
|
||
|
B.SetBounds(0, 0, ButtonWidth - 3, ButtonHeight - 2);
|
||
|
B.Images := Images;
|
||
|
if B.Action = nil then
|
||
|
B.OnClick := @InternalButtonClick;
|
||
|
B.Tag := I;
|
||
|
B.Parent := Self;
|
||
|
end;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.DoCloseClick(Sender: TObject);
|
||
|
begin
|
||
|
if Assigned(FOnClose) then
|
||
|
FOnClose(Self);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.DoDropDownMenu(Sender: TObject;
|
||
|
MousePos: TPoint; var Handled: Boolean);
|
||
|
begin
|
||
|
if Assigned(FOnDropDownMenu) then
|
||
|
FOnDropDownMenu(Self, MousePos, Handled);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.DoImagesChange(Sender: TObject);
|
||
|
begin
|
||
|
ButtonsChanged;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.DoStyleChange(Sender: TObject);
|
||
|
begin
|
||
|
Font := (Sender as TJvNavPaneStyleManager).Fonts.NavPanelFont;
|
||
|
Colors := (Sender as TJvNavPaneStyleManager).Colors;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.FontChanged;
|
||
|
begin
|
||
|
inherited FontChanged;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavPaneToolPanel.GetCloseButton: Boolean;
|
||
|
begin
|
||
|
Result := FCloseButton.Visible; // and HeaderVisible;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavPaneToolPanel.GetDropDownMenu: TPopupMenu;
|
||
|
begin
|
||
|
if not (csDestroying in ComponentState) then
|
||
|
Result := FDropDown.DropDownMenu
|
||
|
else
|
||
|
Result := nil;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavPaneToolPanel.GetHitTestInfoAt(X, Y: Integer): TJvToolPanelHitTestInfos;
|
||
|
|
||
|
function InRange(Value, Min, Max: Integer): Boolean;
|
||
|
begin
|
||
|
Result := (Value >= Min) and (Value <= Max);
|
||
|
end;
|
||
|
|
||
|
begin
|
||
|
if not Visible then
|
||
|
begin
|
||
|
Result := [phtNowhere];
|
||
|
Exit;
|
||
|
end;
|
||
|
Result := [];
|
||
|
if X < 0 then
|
||
|
Include(Result, phtToLeft);
|
||
|
if X > ClientWidth then
|
||
|
Include(Result, phtToRight);
|
||
|
if Y < 0 then
|
||
|
Include(Result, phtAbove);
|
||
|
if Y > ClientHeight then
|
||
|
Include(Result, phtBelow);
|
||
|
if InRange(Y, 0, HeaderHeight - EdgeRounding) then
|
||
|
if InRange(X, 0, ClientWidth) then
|
||
|
begin
|
||
|
Include(Result, phtHeader);
|
||
|
if (X <= 16) and ShowGrabber then
|
||
|
Include(Result, phtGrabber);
|
||
|
end;
|
||
|
if InRange(X, 0, ClientWidth) and InRange(Y, HeaderHeight, ClientHeight) then
|
||
|
Include(Result, phtClient);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.InternalButtonClick(Sender: TObject);
|
||
|
begin
|
||
|
if Assigned(FOnButtonClick) then
|
||
|
FOnButtonClick(Self, TJvNavPanelToolButton(Sender).Tag);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.Notification(AComponent: TComponent;
|
||
|
Operation: TOperation);
|
||
|
begin
|
||
|
inherited Notification(AComponent, Operation);
|
||
|
if Operation = opRemove then
|
||
|
begin
|
||
|
if AComponent = Images then
|
||
|
Images := nil
|
||
|
else
|
||
|
if AComponent = StyleManager then
|
||
|
StyleManager := nil
|
||
|
else
|
||
|
if AComponent = DropDownMenu then
|
||
|
DropDownMenu := nil;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.Paint;
|
||
|
var
|
||
|
R, R2: TRect;
|
||
|
I, X, Y: Integer;
|
||
|
B: TJvNavPanelToolButton;
|
||
|
begin
|
||
|
// first, fill the background
|
||
|
Canvas.Lock;
|
||
|
try
|
||
|
R := ClientRect;
|
||
|
if HeaderVisible then
|
||
|
Inc(R.Top, HeaderHeight);
|
||
|
GradientFillRect(Canvas, R, Colors.ToolPanelColorFrom, Colors.ToolPanelColorTo, fdTopToBottom, 255);
|
||
|
FBackground.DrawImage(Canvas, R);
|
||
|
R := ClientRect;
|
||
|
if HeaderVisible then
|
||
|
begin
|
||
|
R.Bottom := HeaderHeight - EdgeRounding;
|
||
|
R.Bottom := R.Top + HeaderHeight;
|
||
|
GradientFillRect(Canvas, R, Colors.ToolPanelHeaderColorFrom, Colors.ToolPanelHeaderColorTo, fdTopToBottom, 255);
|
||
|
// draw the drag dots
|
||
|
R2 := Rect(R.Left, R.Top + (HeaderHeight - cToolButtonHeight) div 2 + 2, R.Left + 2, R.Top + (HeaderHeight - cToolButtonHeight) div 2 + 4);
|
||
|
OffsetRect(R2, 6, 0);
|
||
|
if ShowGrabber then
|
||
|
begin
|
||
|
for I := 0 to 3 do
|
||
|
begin
|
||
|
Canvas.Brush.Color := clWhite;
|
||
|
OffsetRect(R2, 1, 1);
|
||
|
Canvas.FillRect(R2);
|
||
|
Canvas.Brush.Color := Colors.FrameColor;
|
||
|
OffsetRect(R2, -1, -1);
|
||
|
Canvas.FillRect(R2);
|
||
|
OffsetRect(R2, 0, 4);
|
||
|
end;
|
||
|
// draw the text
|
||
|
Inc(R.Left, 16);
|
||
|
end
|
||
|
else
|
||
|
Inc(R.Left, 12);
|
||
|
Canvas.Font := Self.Font;
|
||
|
if (DropDownMenu = nil) and not (csDesigning in ComponentState) then
|
||
|
begin
|
||
|
OffsetRect(R, 2, -1); // line up with where button caption should have been
|
||
|
SetBkMode(Canvas.Handle, TRANSPARENT);
|
||
|
if CloseButton then
|
||
|
R := Rect(R.Left, R.Top, FCloseButton.Left, R.Bottom);
|
||
|
DrawText(Canvas, Caption, Length(Caption), R, DT_SINGLELINE or DT_VCENTER or DT_LEFT or DT_END_ELLIPSIS);
|
||
|
end;
|
||
|
|
||
|
// draw the client areas top rounding, set pixels directly to avoid messing up any background image
|
||
|
|
||
|
// just a simple "arrow" in each corner in the same color as the gradient
|
||
|
// left corner
|
||
|
Y := HeaderHeight;
|
||
|
X := 0;
|
||
|
for I := 0 to 3 do
|
||
|
Canvas.Pixels[X, Y + I] := Colors.ToolPanelHeaderColorTo;
|
||
|
Inc(X);
|
||
|
for I := 0 to 2 do
|
||
|
Canvas.Pixels[X, Y + I] := Colors.ToolPanelHeaderColorTo;
|
||
|
Inc(X);
|
||
|
for I := 0 to 1 do
|
||
|
Canvas.Pixels[X, Y + I] := Colors.ToolPanelHeaderColorTo;
|
||
|
Inc(X);
|
||
|
Canvas.Pixels[X, Y] := Colors.ToolPanelHeaderColorTo;
|
||
|
// Inc(X);
|
||
|
// Canvas.Pixels[X, Y] := Colors.HeaderColorTo;
|
||
|
|
||
|
// right corner
|
||
|
Y := HeaderHeight;
|
||
|
X := ClientWidth - 1;
|
||
|
for I := 0 to 4 do
|
||
|
Canvas.Pixels[X, Y + I] := Colors.ToolPanelHeaderColorTo;
|
||
|
Dec(X);
|
||
|
for I := 0 to 2 do
|
||
|
Canvas.Pixels[X, Y + I] := Colors.ToolPanelHeaderColorTo;
|
||
|
Dec(X);
|
||
|
for I := 0 to 1 do
|
||
|
Canvas.Pixels[X, Y + I] := Colors.ToolPanelHeaderColorTo;
|
||
|
Dec(X);
|
||
|
Canvas.Pixels[X, Y] := Colors.ToolPanelHeaderColorTo;
|
||
|
Dec(X);
|
||
|
Canvas.Pixels[X, Y] := Colors.HeaderColorTo;
|
||
|
|
||
|
// draw the button area
|
||
|
R := ClientRect;
|
||
|
Inc(R.Top, HeaderHeight);
|
||
|
Inc(R.Right);
|
||
|
Canvas.Brush.Color := Colors.FrameColor;
|
||
|
Canvas.Pen.Style := psClear;
|
||
|
if Buttons.Count > 0 then
|
||
|
begin
|
||
|
R2 := Rect(R.Left, R.Top, R.Left + ButtonWidth * Buttons.Count - 1, R.Top + ButtonHeight);
|
||
|
Canvas.RoundRect(R2.Left, R2.Top, R2.Right, R2.Bottom, EdgeRounding, EdgeRounding);
|
||
|
// square two corners
|
||
|
Canvas.FillRect(Rect(R2.Right - EdgeRounding, R2.Top, R2.Right - 1, R2.Top + EdgeRounding));
|
||
|
Canvas.FillRect(Rect(R2.Left, R2.Bottom - EdgeRounding, R2.Left + EdgeRounding, R2.Bottom - 1));
|
||
|
Canvas.Pen.Style := psSolid;
|
||
|
Y := R2.Top;
|
||
|
// adjust the buttons and draw the dividers
|
||
|
for I := 0 to Buttons.Count - 1 do
|
||
|
begin
|
||
|
X := R2.Left + ButtonWidth * I;
|
||
|
B := Buttons[I].Button;
|
||
|
B.SetBounds(X + 3, Y + 2, ButtonWidth - 6, ButtonHeight - 4);
|
||
|
B.Visible := True;
|
||
|
if I > 0 then
|
||
|
begin
|
||
|
Canvas.Pen.Color := TColor($E7EBEF);
|
||
|
Canvas.MoveTo(X, R2.Top + 2);
|
||
|
Canvas.LineTo(X, R2.Bottom - 3);
|
||
|
end;
|
||
|
if I < Buttons.Count - 1 then
|
||
|
begin
|
||
|
Canvas.Pen.Color := TColor($CED3D6);
|
||
|
Canvas.MoveTo(X + ButtonWidth - 1, R2.Top + 1);
|
||
|
Canvas.LineTo(X + ButtonWidth - 1, R2.Bottom - 4);
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
finally
|
||
|
Canvas.Unlock;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.AlignButtons;
|
||
|
var
|
||
|
AOffset: Integer;
|
||
|
begin
|
||
|
if HeaderVisible and ShowGrabber then
|
||
|
AOffset := cToolButtonOffset
|
||
|
else
|
||
|
AOffset := 4;
|
||
|
if (Parent <> nil) and (HeaderHeight > cToolButtonHeight) then
|
||
|
begin
|
||
|
FCloseButton.SetBounds(ClientWidth - cToolButtonWidth - 2, (HeaderHeight - cToolButtonHeight) div 2, cToolButtonWidth, cToolButtonHeight);
|
||
|
if FCloseButton.Visible or (csDesigning in ComponentState) then
|
||
|
FDropDown.SetBounds(AOffset, (HeaderHeight - cToolButtonHeight) div 2, ClientWidth - cToolButtonWidth - AOffset - 2, cToolButtonHeight)
|
||
|
else
|
||
|
FDropDown.SetBounds(AOffset, (HeaderHeight - cToolButtonHeight) div 2, ClientWidth - AOffset - 4, cToolButtonHeight);
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
FCloseButton.SetBounds(0, 0, 0, 0);
|
||
|
FDropDown.SetBounds(0, 0, 0, 0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
|
||
|
begin
|
||
|
inherited SetBounds(ALeft, ATop, AWidth, AHeight);
|
||
|
AlignButtons;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetButtonHeight(const Value: Integer);
|
||
|
begin
|
||
|
if FButtonHeight <> Value then
|
||
|
begin
|
||
|
FButtonHeight := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetButtons(const Value: TJvNavPaneToolButtons);
|
||
|
begin
|
||
|
FButtons.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetButtonWidth(const Value: Integer);
|
||
|
begin
|
||
|
if FButtonWidth <> Value then
|
||
|
begin
|
||
|
FButtonWidth := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetCloseButton(const Value: Boolean);
|
||
|
begin
|
||
|
if FCloseButton.Visible <> Value then
|
||
|
begin
|
||
|
FCloseButton.Visible := Value;
|
||
|
SetBounds(Left, Top, Width, Height);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetDropDownMenu(const Value: TPopupMenu);
|
||
|
begin
|
||
|
if FDropDown.DropDownMenu <> Value then
|
||
|
begin
|
||
|
FDropDown.DropDownMenu := Value;
|
||
|
FDropDown.Visible := (Value <> nil); // and HeaderVisible;
|
||
|
SetBounds(Left, Top, Width, Height);
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetEdgeRounding(const Value: Integer);
|
||
|
begin
|
||
|
if FEdgeRounding <> Value then
|
||
|
begin
|
||
|
FEdgeRounding := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetHeaderHeight(const Value: Integer);
|
||
|
begin
|
||
|
if FHeaderHeight <> Value then
|
||
|
begin
|
||
|
FHeaderHeight := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetImages(const Value: TCustomImageList);
|
||
|
var
|
||
|
I: Integer;
|
||
|
begin
|
||
|
if FImages <> Value then
|
||
|
begin
|
||
|
if FImages <> nil then
|
||
|
FImages.UnregisterChanges(FChangeLink);
|
||
|
FImages := Value;
|
||
|
if FImages <> nil then
|
||
|
begin
|
||
|
FImages.RegisterChanges(FChangeLink);
|
||
|
FImages.FreeNotification(Self);
|
||
|
end;
|
||
|
for I := 0 to Buttons.Count - 1 do
|
||
|
Buttons[I].Button.Images := FImages;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetShowGrabber(const Value: Boolean);
|
||
|
begin
|
||
|
if FShowGrabber <> Value then
|
||
|
begin
|
||
|
FShowGrabber := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetStyleManager(const Value: TJvNavPaneStyleManager);
|
||
|
begin
|
||
|
if FStyleManager <> Value then
|
||
|
begin
|
||
|
ParentStyleManager := False;
|
||
|
if FStyleManager <> nil then
|
||
|
FStyleManager.UnregisterChanges(FStyleLink);
|
||
|
FStyleManager := Value;
|
||
|
if FStyleManager <> nil then
|
||
|
begin
|
||
|
FStyleManager.RegisterChanges(FStyleLink);
|
||
|
FStyleManager.FreeNotification(Self);
|
||
|
Colors := FStyleManager.Colors;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.ParentStyleManagerChanged(var Msg: TMsgStyleManagerChange);
|
||
|
begin
|
||
|
if (Msg.Sender <> Self) and ParentStyleManager then
|
||
|
begin
|
||
|
StyleManager := Msg.StyleManager;
|
||
|
ParentStyleManager := True;
|
||
|
InternalStyleManagerChanged(Self, Msg.StyleManager);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.TextChanged;
|
||
|
begin
|
||
|
inherited TextChanged;
|
||
|
FDropDown.Caption := Caption;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetParentStyleManager(const Value: Boolean);
|
||
|
begin
|
||
|
if FParentStyleManager <> Value then
|
||
|
begin
|
||
|
FParentStyleManager := Value;
|
||
|
if FParentStyleManager and (Parent <> nil) then
|
||
|
Parent.Perform(CM_PARENTSTYLEMANAGERCHANGE, 0, 0);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.CMControlChange(var Msg: TLMessage);
|
||
|
begin
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.WMEraseBkgnd(var Msg: TLMEraseBkgnd);
|
||
|
begin
|
||
|
Msg.Result := 1;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.WMNCPaint(var Msg: TWMNCPaint);
|
||
|
var
|
||
|
AColor: TColor;
|
||
|
begin
|
||
|
AColor := Color;
|
||
|
Color := Colors.FrameColor;
|
||
|
inherited;
|
||
|
Color := AColor;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.ParentStyleManagerChange(var Msg: TLMessage);
|
||
|
begin
|
||
|
InternalStyleManagerChanged(Self, StyleManager);
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavPaneToolPanel.GetDrawPartialMenuFrame: Boolean;
|
||
|
begin
|
||
|
if FDropDown <> nil then
|
||
|
Result := FDropDown.DrawPartialMenuFrame
|
||
|
else
|
||
|
Result := False;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetDrawPartialMenuFrame(const Value: Boolean);
|
||
|
begin
|
||
|
if FDropDown <> nil then
|
||
|
FDropDown.DrawPartialMenuFrame := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetBackground(const Value: TJvNavPaneBackgroundImage);
|
||
|
begin
|
||
|
FBackground.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetColors(const Value: TJvNavPanelColors);
|
||
|
begin
|
||
|
FColors.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.SetHeaderVisible(const Value: Boolean);
|
||
|
begin
|
||
|
if FHeaderVisible <> Value then
|
||
|
begin
|
||
|
FHeaderVisible := Value;
|
||
|
FCloseButton.Visible := CloseButton;
|
||
|
FDropDown.Visible := (FDropDown.DropDownMenu <> nil); // and Value;
|
||
|
ButtonsChanged;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TJvCustomNavPaneToolPanel.IsColorsStored: Boolean;
|
||
|
begin
|
||
|
Result := (StyleManager = nil) or (StyleManager.Theme = nptCustom);
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPaneToolButton } ===============================================
|
||
|
|
||
|
procedure TJvNavPaneToolButton.Assign(Source: TPersistent);
|
||
|
begin
|
||
|
if Source is TJvNavPaneToolButton then
|
||
|
begin
|
||
|
// if Source <> Self then
|
||
|
begin
|
||
|
Action := TJvNavPaneToolButton(Source).Action;
|
||
|
Hint := TJvNavPaneToolButton(Source).Hint;
|
||
|
ImageIndex := TJvNavPaneToolButton(Source).ImageIndex;
|
||
|
Enabled := TJvNavPaneToolButton(Source).Enabled
|
||
|
end;
|
||
|
end
|
||
|
else
|
||
|
inherited Assign(Source);
|
||
|
end;
|
||
|
|
||
|
constructor TJvNavPaneToolButton.Create(ACollection: Classes.TCollection);
|
||
|
begin
|
||
|
FRealButton := TJvNavPanelToolButton.Create(nil);
|
||
|
FRealButton.ButtonType := nibImage;
|
||
|
FRealButton.ImageIndex := -1;
|
||
|
inherited Create(ACollection);
|
||
|
end;
|
||
|
|
||
|
destructor TJvNavPaneToolButton.Destroy;
|
||
|
begin
|
||
|
FRealButton.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPaneToolButton.GetAction: TBasicAction;
|
||
|
begin
|
||
|
Result := FRealButton.Action;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPaneToolButton.GetEnabled: Boolean;
|
||
|
begin
|
||
|
Result := FRealButton.Enabled;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPaneToolButton.GetHint: string;
|
||
|
begin
|
||
|
Result := FRealButton.Hint;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPaneToolButton.GetImageIndex: TImageIndex;
|
||
|
begin
|
||
|
Result := FRealButton.ImageIndex;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneToolButton.SetAction(const Value: TBasicAction);
|
||
|
begin
|
||
|
FRealButton.Action := Value;
|
||
|
FRealButton.ActionChange(Value, False);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneToolButton.SetEnabled(const Value: Boolean);
|
||
|
begin
|
||
|
FRealButton.Enabled := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneToolButton.SetHint(const Value: string);
|
||
|
begin
|
||
|
FRealButton.Hint := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneToolButton.SetImageIndex(const Value: TImageIndex);
|
||
|
begin
|
||
|
FRealButton.ImageIndex := Value;
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPaneToolButtons } ==============================================
|
||
|
|
||
|
constructor TJvNavPaneToolButtons.Create(AOwner: TJvCustomNavPaneToolPanel);
|
||
|
begin
|
||
|
inherited Create(AOwner, TJvNavPaneToolButton);
|
||
|
FPanel := AOwner;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPaneToolButtons.Add: TJvNavPaneToolButton;
|
||
|
begin
|
||
|
Result := TJvNavPaneToolButton(inherited Add);
|
||
|
end;
|
||
|
|
||
|
function TJvNavPaneToolButtons.GetItem(Index: Integer): TJvNavPaneToolButton;
|
||
|
begin
|
||
|
Result := TJvNavPaneToolButton(inherited Items[Index]);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneToolButtons.SetItem(Index: Integer;
|
||
|
const Value: TJvNavPaneToolButton);
|
||
|
begin
|
||
|
inherited Items[Index] := Value;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneToolButtons.Update(Item: TCollectionItem);
|
||
|
begin
|
||
|
inherited Update(Item);
|
||
|
if FPanel <> nil then
|
||
|
FPanel.ButtonsChanged;
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPanelToolButton } ==============================================
|
||
|
|
||
|
constructor TJvNavPanelToolButton.Create(AOwner: TComponent);
|
||
|
begin
|
||
|
inherited Create(AOwner);
|
||
|
FChangeLink := TChangeLink.Create;
|
||
|
FChangeLink.OnChange := @DoImagesChange;
|
||
|
DrawPartialMenuFrame := False;
|
||
|
TransparentDown := False;
|
||
|
HotTrack := True;
|
||
|
end;
|
||
|
|
||
|
destructor TJvNavPanelToolButton.Destroy;
|
||
|
begin
|
||
|
FChangeLink.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelToolButton.ActionChange(Sender: TObject; CheckDefaults: Boolean);
|
||
|
begin
|
||
|
if Sender is TCustomAction then
|
||
|
with TCustomAction(Sender) do
|
||
|
begin
|
||
|
if not CheckDefaults or Self.Enabled then
|
||
|
Self.Enabled := Enabled;
|
||
|
if not CheckDefaults or (Self.Hint = '') then
|
||
|
Self.Hint := Hint;
|
||
|
if not CheckDefaults or (Self.ImageIndex = -1) then
|
||
|
Self.ImageIndex := ImageIndex;
|
||
|
if not CheckDefaults or Self.Visible then
|
||
|
Self.Visible := Visible;
|
||
|
if not CheckDefaults or not Assigned(Self.OnClick) then
|
||
|
Self.OnClick := OnExecute;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelToolButton.DoImagesChange(Sender: TObject);
|
||
|
begin
|
||
|
Invalidate;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelToolButton.Notification(AComponent: TComponent;
|
||
|
Operation: TOperation);
|
||
|
begin
|
||
|
inherited Notification(AComponent, Operation);
|
||
|
if (Operation = opRemove) and (AComponent = Images) then
|
||
|
Images := nil;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelToolButton.Paint;
|
||
|
label
|
||
|
DrawButton;
|
||
|
var
|
||
|
R: TRect;
|
||
|
I: Integer;
|
||
|
begin
|
||
|
// inherited Paint;
|
||
|
if MouseStates <> [] then
|
||
|
begin
|
||
|
Canvas.Pen.Color := TColor($6B2408);
|
||
|
if bsMouseInside in MouseStates then
|
||
|
Canvas.Brush.Color := TColor($D6BEB5);
|
||
|
if (bsMouseDown in MouseStates) or Down then
|
||
|
begin
|
||
|
if TransparentDown then
|
||
|
Canvas.Brush.Style := bsClear; // (p3) don't draw background - looks better IMO
|
||
|
if (ButtonType = nibDropArrow) and (DropDownMenu <> nil) then
|
||
|
begin
|
||
|
Canvas.Brush.Color := clWindow;
|
||
|
Canvas.Pen.Color := cl3DDkShadow;
|
||
|
if DrawPartialMenuFrame then
|
||
|
begin
|
||
|
Canvas.FillRect(ClientRect); // if Brush.Style = bsClear, this does nothing
|
||
|
Canvas.MoveTo(0, Height);
|
||
|
Canvas.LineTo(0, 0);
|
||
|
Canvas.LineTo(Width - 1, 0);
|
||
|
Canvas.LineTo(Width - 1, Height);
|
||
|
// (p3) yucky! first goto in JVCL?!!!
|
||
|
goto DrawButton;
|
||
|
end;
|
||
|
end
|
||
|
else
|
||
|
Canvas.Brush.Color := TColor($B59284);
|
||
|
end;
|
||
|
Canvas.Rectangle(ClientRect);
|
||
|
end;
|
||
|
DrawButton:
|
||
|
case ButtonType of
|
||
|
nibDropArrow: // dropdown arrow is 7x4, right-aligned
|
||
|
begin
|
||
|
R := ClientRect;
|
||
|
if Caption <> '' then
|
||
|
begin
|
||
|
InflateRect(R, -2, -2);
|
||
|
Canvas.Font := Font;
|
||
|
SetBkMode(Canvas.Handle, TRANSPARENT);
|
||
|
InflateRect(R, -2, 0);
|
||
|
Dec(R.Right, 3 + 7);
|
||
|
DrawText(Canvas, Caption, Length(Caption), R, DT_LEFT or DT_VCENTER or DT_NOPREFIX or DT_END_ELLIPSIS);
|
||
|
Inc(R.Right, 3 + 7);
|
||
|
InflateRect(R, 2, 0);
|
||
|
end;
|
||
|
R.Left := R.Right - 11;
|
||
|
Dec(R.Right, 4);
|
||
|
R.Top := (RectHeight(ClientRect) - 4) div 2;
|
||
|
Canvas.Pen.Color := clWindowText;
|
||
|
for I := 0 to 3 do
|
||
|
begin
|
||
|
Canvas.MoveTo(R.Left, R.Top);
|
||
|
Canvas.LineTo(R.Right, R.Top);
|
||
|
Dec(R.Right);
|
||
|
Inc(R.Left);
|
||
|
Inc(R.Top);
|
||
|
end;
|
||
|
end;
|
||
|
nibClose:
|
||
|
begin
|
||
|
// close button is 8x8, centered
|
||
|
if bsMouseDown in MouseStates then
|
||
|
Canvas.Pen.Color := clHighlightText
|
||
|
else
|
||
|
Canvas.Pen.Color := clWindowText;
|
||
|
R := ClientRect;
|
||
|
InflateRect(R, -(RectWidth(R) div 2 - 4), -(RectHeight(R) div 2 - 4));
|
||
|
if Odd(Height) or Odd(Width) then
|
||
|
begin
|
||
|
Inc(R.Right);
|
||
|
Inc(R.Bottom);
|
||
|
end;
|
||
|
// (p3) this isn't exactly the same as MS's but good enough for me :)
|
||
|
for I := 0 to 7 do
|
||
|
begin
|
||
|
Canvas.MoveTo(R.Left + I, R.Top + I);
|
||
|
Canvas.LineTo(R.Left + I + 2, R.Top + I);
|
||
|
end;
|
||
|
for I := 0 to 7 do
|
||
|
begin
|
||
|
Canvas.MoveTo(R.Right - I, R.Top + I);
|
||
|
Canvas.LineTo(R.Right - I - 2, R.Top + I);
|
||
|
end;
|
||
|
end;
|
||
|
nibImage:
|
||
|
if Assigned(Images) then
|
||
|
Images.Draw(Canvas,
|
||
|
(Width - Images.Width) div 2, (Height - Images.Height) div 2,
|
||
|
ImageIndex, Enabled);
|
||
|
else
|
||
|
//TODO:
|
||
|
//raise EJVCLException.CreateRes(@RsEUnsupportedButtonType);
|
||
|
raise Exception.Create('RsEUnsupportedButtonType');
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelToolButton.SetButtonType(const Value: TJvNavIconButtonType);
|
||
|
begin
|
||
|
if FButtonType <> Value then
|
||
|
begin
|
||
|
FButtonType := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelToolButton.SetImageIndex(const Value: TImageIndex);
|
||
|
begin
|
||
|
if FImageIndex <> Value then
|
||
|
begin
|
||
|
FImageIndex := Value;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPanelToolButton.SetImages(const Value: TCustomImageList);
|
||
|
begin
|
||
|
if FImages <> Value then
|
||
|
begin
|
||
|
if FImages <> nil then
|
||
|
FImages.UnregisterChanges(FChangeLink);
|
||
|
FImages := Value;
|
||
|
if FImages <> nil then
|
||
|
begin
|
||
|
FImages.RegisterChanges(FChangeLink);
|
||
|
FImages.FreeNotification(Self);
|
||
|
end;
|
||
|
Invalidate;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
//=== { TJvNavPaneBackgroundImage } ==========================================
|
||
|
|
||
|
constructor TJvNavPaneBackgroundImage.Create;
|
||
|
begin
|
||
|
inherited Create;
|
||
|
FPicture := TPicture.Create;
|
||
|
FPicture.OnChange := @PictureChanged;
|
||
|
end;
|
||
|
|
||
|
destructor TJvNavPaneBackgroundImage.Destroy;
|
||
|
begin
|
||
|
FPicture.Free;
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
function TJvNavPaneBackgroundImage.CalcRect(ADestRect: TRect): TRect;
|
||
|
var
|
||
|
W, H, CW, CH: Integer;
|
||
|
XYAspect: Double;
|
||
|
begin
|
||
|
W := Picture.Width;
|
||
|
H := Picture.Height;
|
||
|
CW := ADestRect.Right - ADestRect.Left;
|
||
|
CH := ADestRect.Bottom - ADestRect.Top;
|
||
|
if Stretch or (Proportional and ((W > CW) or (H > CH))) then
|
||
|
begin
|
||
|
if Proportional and (W > 0) and (H > 0) then
|
||
|
begin
|
||
|
XYAspect := W / H;
|
||
|
if W > H then
|
||
|
begin
|
||
|
W := CW;
|
||
|
H := Trunc(CW / XYAspect);
|
||
|
if H > CH then // woops, too big
|
||
|
begin
|
||
|
H := CH;
|
||
|
W := Trunc(CH * XYAspect);
|
||
|
end;
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
H := CH;
|
||
|
W := Trunc(CH * XYAspect);
|
||
|
if W > CW then // woops, too big
|
||
|
begin
|
||
|
W := CW;
|
||
|
H := Trunc(CW / XYAspect);
|
||
|
end;
|
||
|
end;
|
||
|
end
|
||
|
else
|
||
|
begin
|
||
|
W := CW;
|
||
|
H := CH;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
with Result do
|
||
|
begin
|
||
|
Left := ADestRect.Left;
|
||
|
Top := ADestRect.Top;
|
||
|
Right := ADestRect.Left + W;
|
||
|
Bottom := ADestRect.Top + H;
|
||
|
end;
|
||
|
|
||
|
if Center then
|
||
|
OffsetRect(Result, (CW - W) div 2, (CH - H) div 2);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneBackgroundImage.Change;
|
||
|
begin
|
||
|
FDrawing := True;
|
||
|
if Assigned(FOnChange) then
|
||
|
FOnChange(Self);
|
||
|
FDrawing := False;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneBackgroundImage.DrawImage(Canvas: TCanvas; ARect: TRect);
|
||
|
|
||
|
procedure TileImage;
|
||
|
var
|
||
|
X, Y: Integer;
|
||
|
G: TGraphic;
|
||
|
begin
|
||
|
G := Picture.Graphic;
|
||
|
X := ARect.Left;
|
||
|
Y := ARect.Top;
|
||
|
while Y < ARect.Bottom do
|
||
|
begin
|
||
|
Canvas.Draw(X, Y, G); // this doesn't clip on the right or bottom sides of ARect :(
|
||
|
Inc(X, G.Width);
|
||
|
if X > ARect.Right then
|
||
|
begin
|
||
|
X := ARect.Left;
|
||
|
Inc(Y, G.Height);
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
begin
|
||
|
if (Picture.Graphic = nil) or (Picture.Width = 0) or (Picture.Height = 0) then
|
||
|
Exit;
|
||
|
if Tile then
|
||
|
TileImage
|
||
|
else
|
||
|
with Canvas do
|
||
|
StretchDraw(CalcRect(ARect), Picture.Graphic);
|
||
|
end;
|
||
|
|
||
|
function TJvNavPaneBackgroundImage.HasImage: Boolean;
|
||
|
begin
|
||
|
with Picture do
|
||
|
Result := (Graphic <> nil) and (Width <> 0) and (Height <> 0);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneBackgroundImage.PictureChanged(Sender: TObject);
|
||
|
var
|
||
|
G: TGraphic;
|
||
|
begin
|
||
|
G := Picture.Graphic;
|
||
|
//TODO:
|
||
|
(*
|
||
|
if G <> nil then
|
||
|
if not ( (G is TMetaFile) or (G is TIcon)) then
|
||
|
G.Transparent := FTransparent;
|
||
|
*)
|
||
|
if not FDrawing then
|
||
|
Change;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneBackgroundImage.SetCenter(const Value: Boolean);
|
||
|
begin
|
||
|
if FCenter <> Value then
|
||
|
begin
|
||
|
FCenter := Value;
|
||
|
PictureChanged(Self);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneBackgroundImage.SetPicture(const Value: TPicture);
|
||
|
begin
|
||
|
FPicture.Assign(Value);
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneBackgroundImage.SetProportional(const Value: Boolean);
|
||
|
begin
|
||
|
if FProportional <> Value then
|
||
|
begin
|
||
|
FProportional := Value;
|
||
|
PictureChanged(Self);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneBackgroundImage.SetStretch(const Value: Boolean);
|
||
|
begin
|
||
|
if FStretch <> Value then
|
||
|
begin
|
||
|
FStretch := Value;
|
||
|
PictureChanged(Self);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneBackgroundImage.SetTile(const Value: Boolean);
|
||
|
begin
|
||
|
if FTile <> Value then
|
||
|
begin
|
||
|
FTile := Value;
|
||
|
PictureChanged(Self);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvNavPaneBackgroundImage.SetTransparent(const Value: Boolean);
|
||
|
begin
|
||
|
if FTransparent <> Value then
|
||
|
begin
|
||
|
FTransparent := Value;
|
||
|
PictureChanged(Self)
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TJvCustomNavPaneToolPanel.AdjustClientRect(var Rect: TRect);
|
||
|
begin
|
||
|
if HeaderVisible then
|
||
|
begin
|
||
|
Rect.Top := Rect.Top + HeaderHeight + EdgeRounding;
|
||
|
if Buttons.Count > 0 then
|
||
|
Rect.Top := Rect.Top + ButtonHeight - EdgeRounding;
|
||
|
end;
|
||
|
InflateRect(Rect, -2, -2);
|
||
|
inherited AdjustClientRect(Rect);
|
||
|
end;
|
||
|
|
||
|
{initialization
|
||
|
RegisterClasses([TJvNavPanelPage]);} // ahuser: moved to TJvCustomNavigationPane.Create
|
||
|
|
||
|
end.
|
||
|
|