git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@38 05c56307-c608-d34a-929d-697000501d7a
33886 lines
1.0 MiB
33886 lines
1.0 MiB
{*******************************************************************}
|
|
{ }
|
|
{ Developer Express Visual Component Library }
|
|
{ ExpressBars components }
|
|
{ }
|
|
{ Copyright (c) 1998-2009 Developer Express Inc. }
|
|
{ ALL RIGHTS RESERVED }
|
|
{ }
|
|
{ The entire contents of this file is protected by U.S. and }
|
|
{ International Copyright Laws. Unauthorized reproduction, }
|
|
{ reverse-engineering, and distribution of all or any portion of }
|
|
{ the code contained in this file is strictly prohibited and may }
|
|
{ result in severe civil and criminal penalties and will be }
|
|
{ prosecuted to the maximum extent possible under the law. }
|
|
{ }
|
|
{ RESTRICTIONS }
|
|
{ }
|
|
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
|
|
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
|
|
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
|
|
{ LICENSED TO DISTRIBUTE THE EXPRESSBARS AND ALL ACCOMPANYING VCL }
|
|
{ CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
|
|
{ }
|
|
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
|
|
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
|
|
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
|
|
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
|
|
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
|
|
{ }
|
|
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
|
|
{ ADDITIONAL RESTRICTIONS. }
|
|
{ }
|
|
{*******************************************************************}
|
|
|
|
unit dxBar;
|
|
|
|
{$I cxVer.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
SysUtils, TypInfo, Windows, Messages, Graphics, Controls, Forms, Classes,
|
|
ImgList, ActnList, Menus, StdCtrls, dxCommon,
|
|
dxThemeManager, cxLookAndFeels, cxClasses, cxControls, cxGraphics, cxLibraryConsts;
|
|
|
|
const
|
|
WM_REPAINTBAR = WM_DX + 1;
|
|
|
|
dxBarDefaultButtonArrowWidth = 11;
|
|
dxBarDefaultLargeButtonArrowWidth = 13;//4;
|
|
dxBarTransparentShadowSize = 4;
|
|
dxBarOpaqueShadowSize = 2;
|
|
|
|
type
|
|
TCurImageList = TCustomImageList;
|
|
|
|
TdxBarPopupMenuLink = class;
|
|
TdxBarManager = class;
|
|
TdxBar = class;
|
|
TdxBars = class;
|
|
TdxBarItemLink = class;
|
|
TdxBarItemLinks = class;
|
|
TdxBarPopupMenu = class;
|
|
TdxDockControl = class;
|
|
TdxBarDockControl = class;
|
|
TdxBarShadow = class;
|
|
TCustomdxBarControl = class;
|
|
TdxDockRow = class;
|
|
TdxBarControl = class;
|
|
TdxBarSubMenuControl = class;
|
|
TdxBarItem = class;
|
|
TdxBarItemControl = class;
|
|
TCustomdxBarSubItem = class;
|
|
TdxBarEditControl = class;
|
|
TdxBarItemControlPainterClass = class of TdxBarItemControlPainter;
|
|
|
|
TdxBarItemClass = class of TdxBarItem;
|
|
|
|
{--------------------------
|
|
Nonvisual components
|
|
--------------------------}
|
|
|
|
TdxBarDesigner = class
|
|
function CanAddComponent(BarManager: TdxBarManager): Boolean; virtual; abstract;
|
|
function CanDeleteComponent(BarManager: TdxBarManager; Component: TComponent): Boolean; virtual; abstract;
|
|
procedure DeleteComponent(BarManager: TdxBarManager; Component: TPersistent); virtual; abstract;
|
|
procedure SelectComponent(BarManager: TdxBarManager; Instance: TPersistent); virtual; abstract;
|
|
function SelectedComponent(BarManager: TdxBarManager): TPersistent; virtual; abstract;
|
|
procedure ShowDefaultEventHandler(AItem: TdxBarItem); virtual; abstract;
|
|
function UniqueName(BarManager: TdxBarManager; const BaseName: string): string; virtual; abstract;
|
|
end;
|
|
|
|
TdxBarHintWindowClass = class of TdxBarHintWindow;
|
|
|
|
TdxBarHintWindow = class(TCustomControl)
|
|
private
|
|
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
|
|
protected
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
procedure Paint; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
procedure ActivateHint(P: TPoint; const AHint: string; BarManager: TdxBarManager); virtual;
|
|
end;
|
|
|
|
TdxBarItemVisible = (ivNever, ivInCustomizing, ivAlways);
|
|
|
|
TdxBarGroup = class(TComponent)
|
|
private
|
|
FBarManager: TdxBarManager;
|
|
FEnabled: Boolean;
|
|
FItems: TList;
|
|
FItemsNames: TStringList;
|
|
FVisible: TdxBarItemVisible;
|
|
function GetCount: Integer;
|
|
function GetIndex: Integer;
|
|
function GetItem(Index: Integer): TComponent;
|
|
procedure SetEnabled(Value: Boolean);
|
|
procedure SetIndex(Value: Integer);
|
|
procedure SetVisible(Value: TdxBarItemVisible);
|
|
procedure ReadItems(Reader: TReader);
|
|
procedure WriteItems(Writer: TWriter);
|
|
protected
|
|
procedure DefineProperties(Filer: TFiler); override;
|
|
procedure Loaded; override;
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
|
procedure SetName(const NewName: TComponentName); override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
function GetParentComponent: TComponent; override;
|
|
function HasParent: Boolean; override;
|
|
procedure SetParentComponent(AParent: TComponent); override;
|
|
|
|
procedure Add(AItem: TComponent);
|
|
procedure Delete(Index: Integer);
|
|
function IndexOf(AItem: TComponent): Integer;
|
|
procedure Move(FromIndex, ToIndex: Integer);
|
|
procedure Remove(AItem: TComponent);
|
|
|
|
property BarManager: TdxBarManager read FBarManager;
|
|
property Count: Integer read GetCount;
|
|
property Index: Integer read GetIndex write SetIndex;
|
|
property Items[Index: Integer]: TComponent read GetItem; default;
|
|
published
|
|
property Enabled: Boolean read FEnabled write SetEnabled default True;
|
|
property Visible: TdxBarItemVisible read FVisible write SetVisible default ivAlways;
|
|
end;
|
|
|
|
TdxBarPopupMenuLinkActionEvent = procedure(Sender: TdxBarPopupMenuLink; var X, Y: Integer;
|
|
ClickedByMouse: Boolean; var AllowPopup: Boolean) of object;
|
|
|
|
TdxBarPopupMenuLink = class(TCollectionItem)
|
|
private
|
|
FControl: TWinControl;
|
|
FPopupMenu: TdxBarPopupMenu;
|
|
FProcessChildren: Boolean;
|
|
FOnAction: TdxBarPopupMenuLinkActionEvent;
|
|
function GetBarManager: TdxBarManager;
|
|
procedure SetControl(Value: TWinControl);
|
|
procedure SetPopupMenu(Value: TdxBarPopupMenu);
|
|
protected
|
|
function IsShortCut(AShortCut: TShortCut): Boolean;
|
|
public
|
|
constructor Create(Collection: TCollection); override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
function DoAction(Wnd: HWND; P: TPoint): Boolean;
|
|
property BarManager: TdxBarManager read GetBarManager;
|
|
published
|
|
property Control: TWinControl read FControl write SetControl;
|
|
property PopupMenu: TdxBarPopupMenu read FPopupMenu write SetPopupMenu;
|
|
property ProcessChildren: Boolean read FProcessChildren write FProcessChildren default True;
|
|
property OnAction: TdxBarPopupMenuLinkActionEvent read FOnAction write FOnAction;
|
|
end;
|
|
|
|
TdxBarPopupMenuLinks = class(TCollection)
|
|
private
|
|
FBarManager: TdxBarManager;
|
|
function GetItem(Index: Integer): TdxBarPopupMenuLink;
|
|
procedure SetItem(Index: Integer; Value: TdxBarPopupMenuLink);
|
|
protected
|
|
function GetOwner: TPersistent; override;
|
|
function IsShortCut(AControl: TWinControl; AShortCut: TShortCut): Boolean;
|
|
public
|
|
constructor Create(ABarManager: TdxBarManager);
|
|
function Add: TdxBarPopupMenuLink;
|
|
function DoAction(AControl: TWinControl; Wnd: HWND; const P: TPoint): Boolean;
|
|
property BarManager: TdxBarManager read FBarManager;
|
|
property Items[Index: Integer]: TdxBarPopupMenuLink read GetItem write SetItem; default;
|
|
end;
|
|
|
|
TdxBarBackgrounds = class(TPersistent)
|
|
private
|
|
FBarBackgroundBitmap: TBitmap;
|
|
FSubMenuBackgroundBitmap: TBitmap;
|
|
FBarManager: TdxBarManager;
|
|
procedure BitmapChanged(Sender: TObject);
|
|
procedure SetBarBackgroundBitmap(Value: TBitmap);
|
|
procedure SetSubMenuBackgroundBitmap(Value: TBitmap);
|
|
protected
|
|
procedure Changed;
|
|
function GetOwner: TPersistent; override;
|
|
public
|
|
constructor Create(ABarManager: TdxBarManager);
|
|
destructor Destroy; override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
property BarManager: TdxBarManager read FBarManager;
|
|
published
|
|
property Bar: TBitmap read FBarBackgroundBitmap write SetBarBackgroundBitmap;
|
|
property SubMenu: TBitmap read FSubMenuBackgroundBitmap write SetSubMenuBackgroundBitmap;
|
|
end;
|
|
|
|
TdxBarDockingStyle = (dsNone, dsLeft, dsTop, dsRight, dsBottom);
|
|
TdxBarDockingStyles = set of TdxBarDockingStyle;
|
|
TdxBarManagerStyle = (bmsStandard, bmsEnhanced, bmsFlat, bmsXP, bmsOffice11,
|
|
bmsUseLookAndFeel);
|
|
TdxBarMenuAnimations = (maNone, maRandom, maUnfold, maSlide, maFade);
|
|
TdxBarEvent = procedure(Sender: TdxBarManager; ABar: TdxBar) of object;
|
|
TdxBarItemLinkEvent = procedure(Sender: TdxBarManager; AItemLink: TdxBarItemLink) of object;
|
|
TdxBarVisibleChangeEvent = procedure(Sender: TdxBarManager; ABar: TdxBar) of object;
|
|
TdxBarCanDockingEvent = procedure(Sender: TdxBar; Style: TdxBarDockingStyle;
|
|
DockControl: TdxDockControl; var CanDocking: Boolean) of object;
|
|
TdxBarMenuMergeEvent = procedure(Sender, ChildBarManager: TdxBarManager; AddItems: Boolean) of object;
|
|
TdxBarShowPopupEvent = procedure(Sender: TdxBarManager; PopupItemLinks: TdxBarItemLinks) of object;
|
|
TdxBarClickItemEvent = procedure(Sender: TdxBarManager; ClickedItem: TdxBarItem) of object;
|
|
|
|
TdxBarManager = class(TComponent)
|
|
private
|
|
FAllowCallFromAnotherForm: Boolean;
|
|
FAllowReset: Boolean;
|
|
FAlwaysMerge: Boolean;
|
|
FAlwaysSaveText: Boolean;
|
|
FAutoDockColor: Boolean;
|
|
FAutoHideEmptyBars: Boolean;
|
|
FBackgrounds: TdxBarBackgrounds;
|
|
FBarRestoringList: TList;
|
|
FBars: TdxBars;
|
|
FButtonArrowWidth: Integer;
|
|
FCanCustomize: Boolean;
|
|
FCanModifyDesigner: Boolean;
|
|
FChangingStyle: Boolean;
|
|
FCategories: TStrings;
|
|
FCreatingFlag: Boolean;
|
|
FDesigning: Boolean;
|
|
FDetachingSubMenu: Boolean;
|
|
FDockColor: TColor;
|
|
FDockControls: TList;
|
|
FDragging: Boolean;
|
|
FDraggingItem: TdxBarItem;
|
|
FDraggingItemLink: TdxBarItemLink;
|
|
FDraggingItemLinkParentHandle: HWND;
|
|
FEditFontHandle: HFONT;
|
|
FFirstDocksUpdate: Boolean;
|
|
FFlatCloseButton: Boolean;
|
|
FFlatToolbarsBorderBrush: HBRUSH;
|
|
FFlatToolbarsBrush: HBRUSH;
|
|
FFlatToolbarsDownedBrush: HBRUSH;
|
|
FFlatToolbarsDownedSelBrush: HBRUSH;
|
|
FFlatToolbarsSelBrush: HBRUSH;
|
|
FFocusedBarControl: TCustomdxBarControl;
|
|
FFont: TFont;
|
|
FGroups: TList;
|
|
FHelpButtonGlyph: TBitmap;
|
|
FHelpContext: THelpContext;
|
|
FHideFloatingBarsWhenInactive: Boolean;
|
|
FImageListBkColor: TColor;
|
|
FImages, FLargeImages, FHotImages: TCurImageList;
|
|
FDisabledImages, FDisabledLargeImages: TCurImageList;
|
|
FImagesChangeLink, FLargeImagesChangeLink, FHotImagesChangeLink: TChangeLink;
|
|
FDisabledImagesChangeLink, FDisabledLargeImagesChangeLink: TChangeLink;
|
|
FIniFileName: string;
|
|
FInternalFontChange: Boolean;
|
|
FIsCustomizing: Boolean;
|
|
FIsHandleCreating: Boolean;
|
|
FItems: TList;
|
|
FLargeButtonArrowWidth: Integer;
|
|
FLargeIcons: Boolean;
|
|
FLockUpdate: Boolean;
|
|
FLookAndFeel: TcxLookAndFeel;
|
|
FMainForm: TCustomForm;
|
|
FMainFormActive: Boolean;
|
|
FMainMenuBar: TdxBar;
|
|
FMakeDisabledImagesFaded: Boolean;
|
|
FMenuAnimations: TdxBarMenuAnimations;
|
|
FMenusShowRecentItemsFirst: Boolean;
|
|
FModified: Boolean;
|
|
FMostRecentItemsPercents: Byte;
|
|
FMostRecentlyUsedUseCount: Integer;
|
|
FNotDocking: TdxBarDockingStyles;
|
|
FPainterClass: TdxBarItemControlPainterClass;
|
|
FPopupMenuLinks: TdxBarPopupMenuLinks;
|
|
FPopupMenus: TList;
|
|
FPrevActiveMDIChild: HWND;
|
|
FPrevChildMainMenuVisible: Boolean;
|
|
FReadStateCount: Integer;
|
|
FRegistryPath: string;
|
|
FScaled: Boolean;
|
|
FSelectedItem: TdxBarItemControl;
|
|
FShowCloseButton: Boolean;
|
|
FShowFullMenusAfterDelay: Boolean;
|
|
FShowHelpButton: Boolean;
|
|
FShowHint: Boolean;
|
|
FShowHintForDisabledItems: Boolean;
|
|
FShowShortCutInHint: Boolean;
|
|
FStoreInIniFile: Boolean;
|
|
FStoreInRegistry: Boolean;
|
|
FIniFileStream: TStream;
|
|
FStretchGlyphs: Boolean;
|
|
FStyle: TdxBarManagerStyle;
|
|
FSunkenBorder: Boolean;
|
|
FThemeAvailable: Boolean;
|
|
FThemeChangedNotificator: TdxThemeChangedNotificator;
|
|
FThemeToolbarsBrush: HBRUSH;
|
|
// FThemeToolbarsDownedBrush: HBRUSH;
|
|
// FThemeToolbarsDownedSelBrush: HBRUSH;
|
|
// FThemeToolbarsSelBrush: HBRUSH;
|
|
FToolbarsVisibleChanging: Boolean;
|
|
FUseF10ForMenu: Boolean;
|
|
FUseFullReset: Boolean;
|
|
FUseLargeImagesForLargeIcons: Boolean;
|
|
FUseSystemFont: Boolean;
|
|
FWaitForDockingTime: Integer;
|
|
IsMDIMaximized: Boolean;
|
|
|
|
FBeforeFingersSize: Integer;
|
|
FFingersSize: Integer;
|
|
FSubMenuBeginGroupIndent: Integer;
|
|
FGlyphSize: Integer;
|
|
FButtonWidth: Integer;
|
|
FButtonHeight: Integer;
|
|
FRealButtonArrowWidth: Integer;
|
|
|
|
FOnBarAdd: TdxBarEvent;
|
|
FOnBarAfterReset: TdxBarEvent;
|
|
FOnBarBeforeReset: TdxBarEvent;
|
|
FOnBarClose: TdxBarEvent;
|
|
FOnBarDelete: TdxBarEvent;
|
|
FOnBarDockingStyleChange: TdxBarEvent;
|
|
FOnBarVisibleChange: TdxBarVisibleChangeEvent;
|
|
|
|
FOnItemLinkAdd: TdxBarItemLinkEvent;
|
|
FOnItemLinkChange: TdxBarItemLinkEvent;
|
|
FOnItemLinkDelete: TdxBarItemLinkEvent;
|
|
|
|
FOnCloseButtonClick: TNotifyEvent;
|
|
FOnDocking: TdxBarCanDockingEvent;
|
|
FOnHelpButtonClick: TNotifyEvent;
|
|
FOnHideCustomizingForm: TNotifyEvent;
|
|
FOnMenuMerge: TdxBarMenuMergeEvent;
|
|
FOnShowCustomizingForm: TNotifyEvent;
|
|
FOnShowCustomizingPopup: TdxBarShowPopupEvent;
|
|
FOnShowToolbarsPopup: TdxBarShowPopupEvent;
|
|
|
|
FOnClickItem: TdxBarClickItemEvent;
|
|
|
|
function GetBarControlFocused: Boolean;
|
|
function GetCategoryItemsVisible(AIndex: Integer): TdxBarItemVisible;
|
|
function GetCategoryVisible(AIndex: Integer): Boolean;
|
|
function GetDockColor: TColor;
|
|
function GetDockControl(Index: Integer): TdxDockControl;
|
|
function GetDockControlCount: Integer;
|
|
function GetFlat: Boolean;
|
|
function GetFlatToolbarsBorderColor: COLORREF;
|
|
function GetFlatToolbarsColor: COLORREF;
|
|
function GetFlatToolbarsDownedColor: COLORREF;
|
|
function GetFlatToolbarsDownedSelColor: COLORREF;
|
|
function GetFlatToolbarsSelColor: COLORREF;
|
|
function GetGroup(Index: Integer): TdxBarGroup;
|
|
function GetGroupCount: Integer;
|
|
function GetIsCustomizing: Boolean;
|
|
function GetIsDestroying: Boolean;
|
|
function GetIsLoading: Boolean;
|
|
function GetItemCount: Integer;
|
|
function GetItem(Index: Integer): TdxBarItem;
|
|
function GetMainMenuControl: TdxBarControl;
|
|
function GetRealLargeButtonArrowWidth: Integer;
|
|
function GetRestoringListBar(Index: Integer): TdxBar;
|
|
function GetRestoringListBarCount: Integer;
|
|
procedure SetAutoDockColor(Value: Boolean);
|
|
procedure SetAutoHideEmptyBars(Value: Boolean);
|
|
procedure SetBackgrounds(Value: TdxBarBackgrounds);
|
|
procedure SetBars(Value: TdxBars);
|
|
procedure SetButtonArrowWidth(Value: Integer);
|
|
procedure SetCategories(Value: TStrings);
|
|
procedure SetCategoryItemsVisible(AIndex: Integer; Value: TdxBarItemVisible);
|
|
procedure SetCategoryVisible(AIndex: Integer; Value: Boolean);
|
|
procedure SetDockColor(Value: TColor);
|
|
procedure SetFlatCloseButton(Value: Boolean);
|
|
procedure SetFont(Value: TFont);
|
|
procedure SetHelpButtonGlyph(Value: TBitmap);
|
|
procedure SetHideFloatingBarsWhenInactive(Value: Boolean);
|
|
procedure SetHotImages(Value: TCurImageList);
|
|
procedure SetImageListBkColor(Value: TColor);
|
|
procedure SetImages(Value: TCurImageList);
|
|
procedure SetDisabledImages(Value: TCurImageList);
|
|
procedure SetDisabledLargeImages(Value: TCurImageList);
|
|
procedure SetLargeButtonArrowWidth(Value: Integer);
|
|
procedure SetLargeIcons(Value: Boolean);
|
|
procedure SetLargeImages(Value: TCurImageList);
|
|
procedure SetLockUpdate(Value: Boolean);
|
|
procedure SetLookAndFeel(Value: TcxLookAndFeel);
|
|
procedure SetMakeDisabledImagesFaded(Value: Boolean);
|
|
procedure SetMenuAnimations(Value: TdxBarMenuAnimations);
|
|
procedure SetMenusShowRecentItemsFirst(Value: Boolean);
|
|
procedure SetMostRecentItemsPercents(Value: Byte);
|
|
procedure SetNotDocking(Value: TdxBarDockingStyles);
|
|
procedure SetPopupMenuLinks(Value: TdxBarPopupMenuLinks);
|
|
procedure SetScaled(Value: Boolean);
|
|
procedure SetSelectedItem(Value: TdxBarItemControl);
|
|
procedure SetShowCloseButton(Value: Boolean);
|
|
procedure SetShowFullMenusAfterDelay(Value: Boolean);
|
|
procedure SetShowHelpButton(Value: Boolean);
|
|
procedure SetShowHint(Value: Boolean);
|
|
procedure SetShowShortCutInHint(Value: Boolean);
|
|
procedure SetStyle(Value: TdxBarManagerStyle);
|
|
procedure SetSunkenBorder(Value: Boolean);
|
|
procedure SetUseSystemFont(Value: Boolean);
|
|
procedure SetUseLargeImagesForLargeIcons(Value: Boolean);
|
|
procedure SetWaitForDockingTime(Value: Integer);
|
|
|
|
procedure AddCustomizeLink(ItemLinks: TdxBarItemLinks;
|
|
ABeginGroup: Boolean; ItemClass: TdxBarItemClass);
|
|
procedure CalcButtonsConsts;
|
|
procedure DrawDraggingLine(AControl: TdxBarItemControl;
|
|
IsBeginGroup, IsFirstPart, IsVerticalDirection: Boolean);
|
|
procedure FontChanged(Sender: TObject);
|
|
function ActiveMDIChild: HWND;
|
|
procedure MainFormClientWndProc(Msg: UINT; wParam: WPARAM; lParam: LPARAM);
|
|
procedure MainFormWndProc(Msg: UINT; wParam: WPARAM; lParam: LPARAM);
|
|
function LoadMainFormFromBin: TForm;
|
|
procedure CheckToolbarsVisibility;
|
|
|
|
procedure DisplayHint;
|
|
procedure HintActivate(AShow: Boolean; const CustomHint: string);
|
|
|
|
procedure DestroyItems;
|
|
procedure HelpButtonGlyphChanged(Sender: TObject);
|
|
procedure HotImageListChange(Sender: TObject);
|
|
procedure ImageListChange(Sender: TObject);
|
|
procedure LargeIconsChanged;
|
|
procedure LargeImageListChange(Sender: TObject);
|
|
procedure DisabledImageListChange(Sender: TObject);
|
|
procedure DisabledLargeImageListChange(Sender: TObject);
|
|
procedure ToolbarsPopupClick(Sender: TObject);
|
|
|
|
procedure CalcMostRecentlyUsedUseCount;
|
|
function ShowRecentItemsFirst: Boolean;
|
|
|
|
procedure AddDockControl(ADockControl: TdxDockControl);
|
|
procedure RemoveDockControl(ADockControl: TdxDockControl);
|
|
|
|
procedure AddGroup(AGroup: TdxBarGroup);
|
|
procedure RemoveGroup(AGroup: TdxBarGroup);
|
|
|
|
function IsDockColorStored: Boolean;
|
|
procedure ReadDockControlHeights(Reader: TReader);
|
|
procedure WriteDockControlHeights(Writer: TWriter);
|
|
|
|
procedure CreateFlatToolbarsBrushes;
|
|
procedure DestroyFlatToolbarsBrushes;
|
|
|
|
procedure CreateThemeToolbarsBrushes;
|
|
procedure DestroyThemeToolbarsBrushes;
|
|
procedure DestroyToolbarsBrushes;
|
|
|
|
procedure CreateToolbarsBrushes;
|
|
procedure RecreateToolbarsBrushes;
|
|
procedure RefreshFloatingBarsShadows;
|
|
procedure ResetBackgrounds;
|
|
procedure InitPainterClass;
|
|
procedure InternalStyleChanged;
|
|
procedure ThemeChanged;
|
|
procedure LFChanged(Sender: TcxLookAndFeel; AChangedValues: TcxLookAndFeelValues);
|
|
protected
|
|
procedure CreateBarRestoringList;
|
|
procedure DestroyBarRestoringList;
|
|
function BarRestoringListExists: Boolean;
|
|
procedure AddBarToRestoringList(ABar: TdxBar);
|
|
procedure RemoveBarFromRestoringList(ABar: TdxBar);
|
|
procedure ShowBarsFromRestoringList(ADockControl: TdxBarDockControl);
|
|
property RestoringListBarCount: Integer read GetRestoringListBarCount;
|
|
property RestoringListBars[Index: Integer]: TdxBar read GetRestoringListBar;
|
|
|
|
procedure AssignFont;
|
|
function CanReset: Boolean;
|
|
procedure DefineProperties(Filer: TFiler); override;
|
|
procedure DesignerModified;
|
|
procedure DoBarAfterReset(ABar: TdxBar); dynamic;
|
|
procedure DoBarBeforeReset(ABar: TdxBar); dynamic;
|
|
procedure DoBarClose(ABar: TdxBar); dynamic;
|
|
procedure DoBarDockingStyleChanged(ABar: TdxBar); dynamic;
|
|
procedure DoClickItem(AItem: TdxBarItem); virtual;
|
|
procedure DoCloseButtonClick; dynamic;
|
|
function DoDocking(ABar: TdxBar; AStyle: TdxBarDockingStyle;
|
|
ADockControl: TdxDockControl): Boolean; virtual;
|
|
procedure DoHelpButtonClick; dynamic;
|
|
procedure DoShowCustomizingPopup(PopupItemLinks: TdxBarItemLinks); dynamic;
|
|
procedure DoShowToolbarsPopup(PopupItemLinks: TdxBarItemLinks); dynamic;
|
|
procedure DragAndDrop(AItem: TdxBarItem; AItemLink: TdxBarItemLink);
|
|
function FindDockControl(APath: string): TdxBarDockControl;
|
|
function GetCategoryRealIndex(AIndex: Integer): Integer;
|
|
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
|
|
function GetPainterClass: TdxBarItemControlPainterClass; virtual;
|
|
function GetWindowForMouseCapturing: HWND;
|
|
procedure HotImagesChanged;
|
|
procedure ImagesChanged;
|
|
procedure LargeImagesChanged;
|
|
procedure DisabledImagesChanged;
|
|
procedure DisabledLargeImagesChanged;
|
|
function IsLargeImagesForLargeIcons: Boolean;
|
|
|
|
procedure Loaded; override;
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
|
procedure ReadState(Reader: TReader); override;
|
|
procedure SetName(const NewName: TComponentName); override;
|
|
procedure ShowToolbars(Show, ForceHiding: Boolean; ActiveWindow: HWND);
|
|
procedure UpdateItems(Sender: TdxBarItem);
|
|
|
|
property BarControlFocused: Boolean read GetBarControlFocused;
|
|
property Dragging: Boolean read FDragging;
|
|
property DraggingItem: TdxBarItem read FDraggingItem;
|
|
property DraggingItemLink: TdxBarItemLink read FDraggingItemLink;
|
|
property FocusedBarControl: TCustomdxBarControl read FFocusedBarControl;
|
|
property IsDestroying: Boolean read GetIsDestroying;
|
|
property IsHandleCreating: Boolean read FIsHandleCreating;
|
|
property IsLoading: Boolean read GetIsLoading;
|
|
property MainFormActive: Boolean read FMainFormActive;
|
|
|
|
function BorderSizeX: Integer;
|
|
function BorderSizeY: Integer;
|
|
function FingersSize(ABar: TdxBar): Integer;
|
|
property BeforeFingersSize: Integer read FBeforeFingersSize;
|
|
property SubMenuBeginGroupIndent: Integer read FSubMenuBeginGroupIndent;
|
|
property GlyphSize: Integer read FGlyphSize;
|
|
property ButtonWidth: Integer read FButtonWidth;
|
|
property ButtonHeight: Integer read FButtonHeight;
|
|
property RealButtonArrowWidth: Integer read FRealButtonArrowWidth;
|
|
property RealLargeButtonArrowWidth: Integer read GetRealLargeButtonArrowWidth;
|
|
|
|
function GetLightColor(ABtnFaceColorPart, AHighlightColorPart, AWindowColorPart: Integer): COLORREF;
|
|
property CanModifyDesigner: Boolean read FCanModifyDesigner write FCanModifyDesigner;
|
|
property Flat: Boolean read GetFlat;
|
|
property FlatToolbarsBorderBrush: HBRUSH read FFlatToolbarsBorderBrush;
|
|
property FlatToolbarsBrush: HBRUSH read FFlatToolbarsBrush;
|
|
property FlatToolbarsDownedBrush: HBRUSH read FFlatToolbarsDownedBrush;
|
|
property FlatToolbarsDownedSelBrush: HBRUSH read FFlatToolbarsDownedSelBrush;
|
|
property FlatToolbarsSelBrush: HBRUSH read FFlatToolbarsSelBrush;
|
|
property FlatToolbarsBorderColor: COLORREF read GetFlatToolbarsBorderColor;
|
|
property FlatToolbarsColor: COLORREF read GetFlatToolbarsColor;
|
|
property FlatToolbarsDownedColor: COLORREF read GetFlatToolbarsDownedColor;
|
|
property FlatToolbarsDownedSelColor: COLORREF read GetFlatToolbarsDownedSelColor;
|
|
property FlatToolbarsSelColor: COLORREF read GetFlatToolbarsSelColor;
|
|
property ThemeToolbarsBrush: HBRUSH read FThemeToolbarsBrush;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
|
|
function BarByCaption(const ACaption: string): TdxBar;
|
|
function BarByName(const AName: string): TdxBar;
|
|
function GetAllItemsByCategory(ACategory: Integer; List: TList): Integer;
|
|
function GetCountByCategory(ACategory: Integer): Integer;
|
|
function GetItemByCategory(ACategory, AIndex: Integer): TdxBarItem;
|
|
function GetItemByName(const AName: string): TdxBarItem;
|
|
function GetItemsByCategory(ACategory: Integer; List: TList): Integer;
|
|
|
|
procedure MoveItem(CurIndex, NewIndex: Integer);
|
|
procedure ExchangeItems(Index1, Index2: Integer);
|
|
|
|
procedure CreateToolbarsPopupList(ItemLinks: TdxBarItemLinks);
|
|
procedure Customizing(Show: Boolean);
|
|
procedure HideAll;
|
|
procedure ResetUsageData;
|
|
procedure ResetUsageDataWithConfirmation;
|
|
//procedure WhatIsThis;
|
|
|
|
procedure LoadFromRegistry(ARegistryPath: string);
|
|
procedure SaveToRegistry(ARegistryPath: string);
|
|
procedure LoadFromIniFile(AFileName: string);
|
|
procedure SaveToIniFile(AFileName: string);
|
|
procedure LoadFromStream(AStream: TStream);
|
|
procedure SaveToStream(AStream: TStream);
|
|
|
|
function CreateGroup: TdxBarGroup;
|
|
|
|
function CanShowRecentItems: Boolean;
|
|
function GetPaintStyle: TdxBarManagerStyle;
|
|
|
|
property CategoryItemsVisible[AIndex: Integer]: TdxBarItemVisible
|
|
read GetCategoryItemsVisible write SetCategoryItemsVisible;
|
|
property CategoryVisible[AIndex: Integer]: Boolean read GetCategoryVisible
|
|
write SetCategoryVisible;
|
|
property Designing: Boolean read FDesigning;
|
|
property DockControlCount: Integer read GetDockControlCount;
|
|
property DockControls[Index: Integer]: TdxDockControl read GetDockControl;
|
|
property GroupCount: Integer read GetGroupCount;
|
|
property Groups[Index: Integer]: TdxBarGroup read GetGroup;
|
|
property IsCustomizing: Boolean read GetIsCustomizing;
|
|
property ItemCount: Integer read GetItemCount;
|
|
property Items[Index: Integer]: TdxBarItem read GetItem;
|
|
property LockUpdate: Boolean read FLockUpdate write SetLockUpdate;
|
|
property MainForm: TCustomForm read FMainForm;
|
|
property MainMenuControl: TdxBarControl read GetMainMenuControl;
|
|
property MainMenuBar: TdxBar read FMainMenuBar;
|
|
property Modified: Boolean read FModified write FModified; // only for Standard style
|
|
property PainterClass: TdxBarItemControlPainterClass read FPainterClass;
|
|
property SelectedItem: TdxBarItemControl read FSelectedItem write SetSelectedItem;
|
|
published
|
|
property AllowCallFromAnotherForm: Boolean read FAllowCallFromAnotherForm
|
|
write FAllowCallFromAnotherForm default False;
|
|
property AllowReset: Boolean read FAllowReset write FAllowReset default True;
|
|
property AlwaysMerge: Boolean read FAlwaysMerge write FAlwaysMerge default False;
|
|
property AlwaysSaveText: Boolean read FAlwaysSaveText write FAlwaysSaveText default False;
|
|
property AutoDockColor: Boolean read FAutoDockColor write SetAutoDockColor default True;
|
|
property AutoHideEmptyBars: Boolean read FAutoHideEmptyBars write SetAutoHideEmptyBars default False;
|
|
property Scaled: Boolean read FScaled write SetScaled default True; // must be before Font
|
|
property Font: TFont read FFont write SetFont; // must be before Bars
|
|
property Backgrounds: TdxBarBackgrounds read FBackgrounds write SetBackgrounds;
|
|
property Bars: TdxBars read FBars write SetBars;
|
|
property ButtonArrowWidth: Integer read FButtonArrowWidth write SetButtonArrowWidth
|
|
default dxBarDefaultButtonArrowWidth;
|
|
property CanCustomize: Boolean read FCanCustomize write FCanCustomize default True;
|
|
property Categories: TStrings read FCategories write SetCategories;
|
|
property DockColor: TColor read GetDockColor write SetDockColor stored IsDockColorStored;
|
|
property FlatCloseButton: Boolean read FFlatCloseButton write SetFlatCloseButton default False;
|
|
property HelpButtonGlyph: TBitmap read FHelpButtonGlyph write SetHelpButtonGlyph;
|
|
property HelpContext: THelpContext read FHelpContext write FHelpContext default 0;
|
|
property HideFloatingBarsWhenInactive: Boolean read FHideFloatingBarsWhenInactive
|
|
write SetHideFloatingBarsWhenInactive default True;
|
|
property HotImages: TCurImageList read FHotImages write SetHotImages;
|
|
property ImageListBkColor: TColor read FImageListBkColor write SetImageListBkColor default clFuchsia;
|
|
property Images: TCurImageList read FImages write SetImages;
|
|
property DisabledImages: TCurImageList read FDisabledImages write SetDisabledImages;
|
|
property DisabledLargeImages: TCurImageList read FDisabledLargeImages write SetDisabledLargeImages;
|
|
property IniFileName: string read FIniFileName write FIniFileName;
|
|
property LargeImages: TCurImageList read FLargeImages write SetLargeImages;
|
|
property LargeButtonArrowWidth: Integer read FLargeButtonArrowWidth write
|
|
SetLargeButtonArrowWidth default dxBarDefaultLargeButtonArrowWidth;
|
|
property LargeIcons: Boolean read FLargeIcons write SetLargeIcons default False;
|
|
property LookAndFeel: TcxLookAndFeel read FLookAndFeel write SetLookAndFeel;
|
|
property MakeDisabledImagesFaded: Boolean read FMakeDisabledImagesFaded write SetMakeDisabledImagesFaded default False;
|
|
property MenuAnimations: TdxBarMenuAnimations read FMenuAnimations
|
|
write SetMenuAnimations default maNone;
|
|
property MenusShowRecentItemsFirst: Boolean read FMenusShowRecentItemsFirst
|
|
write SetMenusShowRecentItemsFirst default True;
|
|
property MostRecentItemsPercents: Byte read FMostRecentItemsPercents
|
|
write SetMostRecentItemsPercents default 95;
|
|
property NotDocking: TdxBarDockingStyles read FNotDocking write SetNotDocking default [];
|
|
property PopupMenuLinks: TdxBarPopupMenuLinks read FPopupMenuLinks write SetPopupMenuLinks;
|
|
property RegistryPath: string read FRegistryPath write FRegistryPath;
|
|
property ShowCloseButton: Boolean read FShowCloseButton write SetShowCloseButton default False;
|
|
property ShowFullMenusAfterDelay: Boolean read FShowFullMenusAfterDelay
|
|
write SetShowFullMenusAfterDelay default True;
|
|
property ShowHelpButton: Boolean read FShowHelpButton write SetShowHelpButton default False;
|
|
property ShowHint: Boolean read FShowHint write SetShowHint default True;
|
|
property ShowHintForDisabledItems: Boolean read FShowHintForDisabledItems
|
|
write FShowHintForDisabledItems default True;
|
|
property ShowShortCutInHint: Boolean read FShowShortCutInHint
|
|
write SetShowShortCutInHint default False;
|
|
property StoreInIniFile: Boolean read FStoreInIniFile write FStoreInIniFile default False;
|
|
property StoreInRegistry: Boolean read FStoreInRegistry write FStoreInRegistry default False;
|
|
property StretchGlyphs: Boolean read FStretchGlyphs write FStretchGlyphs default True;
|
|
property Style: TdxBarManagerStyle read FStyle write SetStyle default bmsEnhanced;
|
|
property SunkenBorder: Boolean read FSunkenBorder write SetSunkenBorder default False;
|
|
property UseF10ForMenu: Boolean read FUseF10ForMenu write FUseF10ForMenu default True;
|
|
property UseFullReset: Boolean read FUseFullReset write FUseFullReset default False;
|
|
property UseLargeImagesForLargeIcons: Boolean read FUseLargeImagesForLargeIcons write SetUseLargeImagesForLargeIcons default False;
|
|
property UseSystemFont: Boolean read FUseSystemFont write SetUseSystemFont;
|
|
property WaitForDockingTime: Integer read FWaitForDockingTime write SetWaitForDockingTime default 21;
|
|
|
|
property OnBarAdd: TdxBarEvent read FOnBarAdd write FOnBarAdd;
|
|
property OnBarAfterReset: TdxBarEvent read FOnBarAfterReset write FOnBarAfterReset;
|
|
property OnBarBeforeReset: TdxBarEvent read FOnBarBeforeReset write FOnBarBeforeReset;
|
|
property OnBarClose: TdxBarEvent read FOnBarClose write FOnBarClose;
|
|
property OnBarDelete: TdxBarEvent read FOnBarDelete write FOnBarDelete;
|
|
property OnBarDockingStyleChange: TdxBarEvent read FOnBarDockingStyleChange
|
|
write FOnBarDockingStyleChange;
|
|
property OnBarVisibleChange: TdxBarVisibleChangeEvent read FOnBarVisibleChange
|
|
write FOnBarVisibleChange;
|
|
|
|
property OnItemLinkAdd: TdxBarItemLinkEvent read FOnItemLinkAdd
|
|
write FOnItemLinkAdd;
|
|
property OnItemLinkChange: TdxBarItemLinkEvent read FOnItemLinkChange
|
|
write FOnItemLinkChange;
|
|
property OnItemLinkDelete: TdxBarItemLinkEvent read FOnItemLinkDelete
|
|
write FOnItemLinkDelete;
|
|
|
|
property OnCloseButtonClick: TNotifyEvent read FOnCloseButtonClick
|
|
write FOnCloseButtonClick;
|
|
property OnDocking: TdxBarCanDockingEvent read FOnDocking write FOnDocking;
|
|
property OnHelpButtonClick: TNotifyEvent read FOnHelpButtonClick write FOnHelpButtonClick;
|
|
property OnHideCustomizingForm: TNotifyEvent read FOnHideCustomizingForm
|
|
write FOnHideCustomizingForm;
|
|
property OnMenuMerge: TdxBarMenuMergeEvent read FOnMenuMerge write FOnMenuMerge;
|
|
property OnShowCustomizingForm: TNotifyEvent read FOnShowCustomizingForm
|
|
write FOnShowCustomizingForm;
|
|
property OnShowCustomizingPopup: TdxBarShowPopupEvent read FOnShowCustomizingPopup
|
|
write FOnShowCustomizingPopup;
|
|
property OnShowToolbarsPopup: TdxBarShowPopupEvent read FOnShowToolbarsPopup
|
|
write FOnShowToolbarsPopup;
|
|
|
|
property OnClickItem: TdxBarClickItemEvent read FOnClickItem write FOnClickItem;
|
|
end;
|
|
|
|
TdxBarManagerList = class
|
|
private
|
|
FList: TList;
|
|
function GetBarManager(Index: Integer): TdxBarManager;
|
|
function GetCount: Integer;
|
|
function GetCustomizingBarManager: TdxBarManager;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
property BarManagers[Index: Integer]: TdxBarManager read GetBarManager; default;
|
|
property Count: Integer read GetCount;
|
|
property CustomizingBarManager: TdxBarManager read GetCustomizingBarManager;
|
|
end;
|
|
|
|
TdxBarBorderStyle = (bbsNone, bbsSingle);
|
|
TdxBarStaticBorderStyle = (sbsNone, sbsLowered, sbsRaised, sbsEtched, sbsBump);
|
|
TdxBarSpinEditButton = (sbNone, sbUp, sbDown);
|
|
|
|
TdxBar = class(TCollectionItem)
|
|
private
|
|
FAllowClose: Boolean;
|
|
FAllowCustomizing: Boolean;
|
|
FAllowQuickCustomizing: Boolean;
|
|
FAllowReset: Boolean;
|
|
FAlphaBlendValue: Byte;
|
|
FBackgroundBitmap: TBitmap;
|
|
FBars: TdxBars;
|
|
FBorderStyle: TdxBarBorderStyle;
|
|
FCaption: string;
|
|
FColor: TColor;
|
|
FChangingDockingStyle: Boolean;
|
|
FDockControl: TdxBarDockControl;
|
|
FDockedDockControl: TdxBarDockControl;
|
|
FDockedDockingStyle: TdxBarDockingStyle;
|
|
FDockedLeft: Integer;
|
|
FDockedTop: Integer;
|
|
FDockingStyle: TdxBarDockingStyle;
|
|
FEditFontHandle: HFONT;
|
|
FFloatLeft: Integer;
|
|
FFloatTop: Integer;
|
|
FFloatClientWidth: Integer;
|
|
FFloatClientHeight: Integer;
|
|
FFont: TFont;
|
|
FFreeNotificationItems: TList;
|
|
FHidden: Boolean; // if True, then doesn't show in customizing form in run-time
|
|
FInternalFontChange: Boolean;
|
|
FInternallyHidden: Boolean;
|
|
FIsMainMenu: Boolean;
|
|
FIsPredefined: Boolean;
|
|
FItemLinks: TdxBarItemLinks;
|
|
FLoadedDockControl: TdxBarDockControl;
|
|
FLoadedDockingStyle: TdxBarDockingStyle;
|
|
FLoadedVisible: Boolean;
|
|
FLockUpdate: Boolean;
|
|
FName: string;
|
|
FNotDocking: TdxBarDockingStyles;
|
|
FMultiLine: Boolean;
|
|
FOneOnRow: Boolean;
|
|
FRotateWhenVertical: Boolean;
|
|
FRow: Integer;
|
|
FShowMark: Boolean;
|
|
FSizeGrip: Boolean;
|
|
FUseOwnFont: Boolean;
|
|
FUseRecentItems: Boolean;
|
|
FUseRestSpace: Boolean;
|
|
FVisible: Boolean; // is it currently visible or not?
|
|
FWholeRow: Boolean;
|
|
|
|
procedure BitmapChanged(Sender: TObject);
|
|
function GetBarManager: TdxBarManager;
|
|
function GetControl: TdxBarControl;
|
|
function GetDockedDockingStyle: TdxBarDockingStyle;
|
|
function GetDockingStyle: TdxBarDockingStyle;
|
|
function GetRealDockControl: TdxDockControl;
|
|
procedure SetAllowClose(Value: Boolean);
|
|
procedure SetAllowQuickCustomizing(Value: Boolean);
|
|
procedure SetAlphaBlendValue(Value: Byte);
|
|
procedure SetBackgroundBitmap(Value: TBitmap);
|
|
procedure SetBorderStyle(Value: TdxBarBorderStyle);
|
|
procedure SetCaption(Value: string);
|
|
procedure SetColor(Value: TColor);
|
|
procedure SetDockControl(Value: TdxBarDockControl);
|
|
procedure SetDockedDockControl(Value: TdxBarDockControl);
|
|
procedure SetDockedValue(Index: Integer; Value: Integer);
|
|
procedure SetDockingStyle(Value: TdxBarDockingStyle);
|
|
procedure SetFloatValue(Index: Integer; Value: Integer);
|
|
procedure SetFont(Value: TFont);
|
|
procedure SetHidden(Value: Boolean);
|
|
procedure SetIsMainMenu(Value: Boolean);
|
|
procedure SetItemLinks(Value: TdxBarItemLinks);
|
|
procedure SetLockUpdate(Value: Boolean);
|
|
procedure SetMultiLine(Value: Boolean);
|
|
procedure SetNotDocking(Value: TdxBarDockingStyles);
|
|
procedure SetRotateWhenVertical(Value: Boolean);
|
|
procedure SetRow(Value: Integer);
|
|
procedure SetShowMark(Value: Boolean);
|
|
procedure SetSizeGrip(Value: Boolean);
|
|
procedure SetUseOwnFont(Value: Boolean);
|
|
procedure SetUseRecentItems(Value: Boolean);
|
|
procedure SetUseRestSpace(Value: Boolean);
|
|
procedure SetVisible(Value: Boolean);
|
|
procedure SetWholeRow(Value: Boolean);
|
|
|
|
procedure FontChanged(Sender: TObject);
|
|
procedure ItemLinksChanged(Sender: TObject);
|
|
procedure ResetToolbarClick(Sender: TObject);
|
|
|
|
function IsDockedDockingStyleStored: Boolean;
|
|
function IsDockingStyleStored: Boolean;
|
|
protected
|
|
procedure AddFreeNotification(AItem: TdxBarItem);
|
|
procedure RemoveFreeNotification(AItem: TdxBarItem);
|
|
procedure MakeFreeNotification;
|
|
procedure CheckBarName(const AName: string);
|
|
|
|
function BarNCSizeX(AStyle: TdxBarDockingStyle): Integer;
|
|
function BarNCSizeY(AStyle: TdxBarDockingStyle): Integer;
|
|
function CanClose: Boolean;
|
|
function CanMoving: Boolean;
|
|
function CanReset: Boolean;
|
|
function HasSizeGrip: Boolean;
|
|
function IsShortCut(AShortCut: TShortCut): Boolean;
|
|
function IsStatusBar: Boolean;
|
|
property Bars: TdxBars read FBars;
|
|
public
|
|
constructor Create(Collection: TCollection); override;
|
|
destructor Destroy; override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
procedure ChangeDockingStyle(AStyle: TdxBarDockingStyle;
|
|
ADockControl: TdxDockControl);
|
|
procedure Reset;
|
|
procedure ResetWithConfirmation;
|
|
|
|
property BarManager: TdxBarManager read GetBarManager;
|
|
property Control: TdxBarControl read GetControl;
|
|
property IsPredefined: Boolean read FIsPredefined;
|
|
property LockUpdate: Boolean read FLockUpdate write SetLockUpdate;
|
|
property RealDockControl: TdxDockControl read GetRealDockControl;
|
|
published
|
|
property AllowClose: Boolean read FAllowClose write SetAllowClose default True;
|
|
property AllowCustomizing: Boolean read FAllowCustomizing write FAllowCustomizing
|
|
default True;
|
|
property AllowQuickCustomizing: Boolean read FAllowQuickCustomizing
|
|
write SetAllowQuickCustomizing default True;
|
|
property AllowReset: Boolean read FAllowReset write FAllowReset default True;
|
|
property BorderStyle: TdxBarBorderStyle read FBorderStyle write SetBorderStyle
|
|
default bbsSingle;
|
|
property Caption: string read FCaption write SetCaption;
|
|
property Color: TColor read FColor write SetColor default clDefault;
|
|
property DockControl: TdxBarDockControl read FDockControl write SetDockControl;
|
|
property DockedDockControl: TdxBarDockControl read FDockedDockControl
|
|
write SetDockedDockControl;
|
|
property DockedDockingStyle: TdxBarDockingStyle read GetDockedDockingStyle
|
|
write FDockedDockingStyle stored IsDockedDockingStyleStored;
|
|
property DockedLeft: Integer index 1 read FDockedLeft write SetDockedValue;
|
|
property DockedTop: Integer index 2 read FDockedTop write SetDockedValue;
|
|
property DockingStyle: TdxBarDockingStyle read GetDockingStyle write SetDockingStyle
|
|
stored IsDockingStyleStored;
|
|
property FloatLeft: Integer index 1 read FFloatLeft write SetFloatValue;
|
|
property FloatTop: Integer index 2 read FFloatTop write SetFloatValue;
|
|
property FloatClientWidth: Integer index 3 read FFloatClientWidth write SetFloatValue;
|
|
property FloatClientHeight: Integer index 4 read FFloatClientHeight write SetFloatValue;
|
|
property Font: TFont read FFont write SetFont stored FUseOwnFont;
|
|
property Hidden: Boolean read FHidden write SetHidden default False;
|
|
property IsMainMenu: Boolean read FIsMainMenu write SetIsMainMenu default False;
|
|
property ItemLinks: TdxBarItemLinks read FItemLinks write SetItemLinks;
|
|
property MultiLine: Boolean read FMultiLine write SetMultiLine default False;
|
|
property Name: string read FName write FName;
|
|
property NotDocking: TdxBarDockingStyles read FNotDocking write SetNotDocking default [];
|
|
property OneOnRow: Boolean read FOneOnRow write FOneOnRow;
|
|
property RotateWhenVertical: Boolean read FRotateWhenVertical write SetRotateWhenVertical
|
|
default True;
|
|
property Row: Integer read FRow write SetRow;
|
|
property ShowMark: Boolean read FShowMark write SetShowMark default True;
|
|
property SizeGrip: Boolean read FSizeGrip write SetSizeGrip default True;
|
|
property UseOwnFont: Boolean read FUseOwnFont write SetUseOwnFont;
|
|
property UseRecentItems: Boolean read FUseRecentItems write SetUseRecentItems default True;
|
|
property UseRestSpace: Boolean read FUseRestSpace write SetUseRestSpace default False;
|
|
property Visible: Boolean read FVisible write SetVisible;
|
|
property WholeRow: Boolean read FWholeRow write SetWholeRow;
|
|
property BackgroundBitmap: TBitmap read FBackgroundBitmap write SetBackgroundBitmap;
|
|
property AlphaBlendValue: Byte read FAlphaBlendValue write SetAlphaBlendValue default 255;
|
|
end;
|
|
|
|
TdxDockControls = array[dsLeft..dsBottom] of TdxDockControl;
|
|
|
|
TdxBars = class(TCollection)
|
|
private
|
|
FDockControls: TdxDockControls;
|
|
FDocking: Boolean;
|
|
FDockingZoneSize: Integer;
|
|
FBarManager: TdxBarManager;
|
|
FLoading: Boolean;
|
|
FMoving: Boolean;
|
|
FMovingBarControl: TdxBarControl;
|
|
FMovingBarOriginalDockingStyle: TdxBarDockingStyle;
|
|
FMovingOffset: TPoint;
|
|
FMovingStaticOffset: TPoint;
|
|
|
|
function GetDockControl(Index: TdxBarDockingStyle): TdxDockControl;
|
|
function GetItem(Index: Integer): TdxBar;
|
|
procedure SetItem(Index: Integer; Value: TdxBar);
|
|
protected
|
|
function GetOwner: TPersistent; override;
|
|
|
|
procedure RegInDock(AStyle: TdxBarDockingStyle; ADockControl: TdxDockControl;
|
|
ABarControl: TdxBarControl; APos: TPoint);
|
|
procedure UnregFromDock(AStyle: TdxBarDockingStyle;
|
|
ADockControl: TdxDockControl; ABarControl: TdxBarControl);
|
|
|
|
procedure ChangeBarControlPos(ABarControl: TdxBarControl; APos: TPoint);
|
|
function GetDockingStyleAtPos(Bar: TdxBar; Pos: TPoint;
|
|
var DockControl: TdxDockControl): TdxBarDockingStyle;
|
|
procedure Moving(AMovingBarControl: TdxBarControl);
|
|
procedure Update(Item: TCollectionItem); override;
|
|
|
|
property DockingZoneSize: Integer read FDockingZoneSize write FDockingZoneSize;
|
|
public
|
|
constructor Create(ABarManager: TdxBarManager);
|
|
destructor Destroy; override;
|
|
function Add: TdxBar;
|
|
function GetUniqueToolbarName(const BaseName: string): string;
|
|
|
|
property BarManager: TdxBarManager read FBarManager;
|
|
property DockControls[Index: TdxBarDockingStyle]: TdxDockControl read GetDockControl;
|
|
property IsLoading: Boolean read FLoading write FLoading;
|
|
property IsMoving: Boolean read FMoving;
|
|
property Items[Index: Integer]: TdxBar read GetItem write SetItem; default;
|
|
end;
|
|
|
|
TdxBarUserDefine = (udCaption, udGlyph, udPaintStyle, udWidth);
|
|
TdxBarUserDefines = set of TdxBarUserDefine;
|
|
|
|
TdxBarPaintStyle = (psStandard, psCaption, psCaptionInMenu, psCaptionGlyph);
|
|
|
|
TdxBarItemLink = class(TCollectionItem)
|
|
private
|
|
FBeginGroup: Boolean;
|
|
FControl: TdxBarItemControl;
|
|
FData: Integer;
|
|
FItem: TdxBarItem;
|
|
FItemRect: TRect;
|
|
FLoadedRecentIndex: Integer;
|
|
FLoadedUseCount: Integer;
|
|
FLoadedVisible: Boolean;
|
|
FMostRecentlyUsed: Boolean;
|
|
FOriginalItemLink: TdxBarItemLink;
|
|
FPrevRecentIndex: Integer;
|
|
FRowHeight: Integer;
|
|
FUseCount: Integer;
|
|
FUserCaption: string;
|
|
FUserDefine: TdxBarUserDefines;
|
|
FUserGlyph: TBitmap;
|
|
FUserPaintStyle: TdxBarPaintStyle;
|
|
FUserWidth: Integer;
|
|
FVisible: Boolean;
|
|
|
|
function GetAvailableIndex: Integer;
|
|
function GetBarControl: TCustomdxBarControl;
|
|
function GetBarManager: TdxBarManager;
|
|
function GetBeginGroup: Boolean;
|
|
function GetCanVisibleIndex: Integer;
|
|
function GetCaption: string;
|
|
function GetGlyph: TBitmap;
|
|
function GetOwnerValue: TdxBarItemLinks;
|
|
function GetPaintStyle: TdxBarPaintStyle;
|
|
function GetVisibleIndex: Integer;
|
|
function GetWidth: Integer;
|
|
procedure SetBeginGroup(Value: Boolean);
|
|
procedure SetItem(Value: TdxBarItem);
|
|
procedure SetMostRecentlyUsed(Value: Boolean);
|
|
procedure SetUserCaption(Value: string);
|
|
procedure SetUserDefine(Value: TdxBarUserDefines);
|
|
procedure SetUserGlyph(Value: TBitmap);
|
|
procedure SetUserPaintStyle(Value: TdxBarPaintStyle);
|
|
procedure SetUserWidth(Value: Integer);
|
|
procedure SetVisible(Value: Boolean);
|
|
|
|
procedure AddToRecentList;
|
|
procedure RemoveFromRecentList;
|
|
procedure RestoreRecentIndex;
|
|
procedure SaveRecentIndex;
|
|
procedure InternalBringToTopInRecentList(IncCount: Boolean);
|
|
procedure Synchronize(AItemLink: TdxBarItemLink);
|
|
procedure CheckMostRecentlyUsed;
|
|
function GetRecentIndex: Integer;
|
|
procedure SetRecentIndex(Value: Integer);
|
|
property RecentIndex: Integer read GetRecentIndex write SetRecentIndex;
|
|
|
|
function CanVisible: Boolean;
|
|
function GetRealItemLink: TdxBarItemLink;
|
|
protected
|
|
function HasItem(AItem: TdxBarItem): Boolean;
|
|
procedure InitiateAction;
|
|
function IsAccel(Key: Word; Shift: TShiftState): Boolean;
|
|
procedure ItemLinkChanged;
|
|
|
|
property RowHeight: Integer read FRowHeight write FRowHeight;
|
|
public
|
|
constructor Create(Collection: TCollection); override;
|
|
destructor Destroy; override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
procedure BringToTopInRecentList(IncCount: Boolean);
|
|
procedure CreateControl;
|
|
procedure DestroyControl;
|
|
procedure SendToBottomInRecentList;
|
|
|
|
property AvailableIndex: Integer read GetAvailableIndex;
|
|
property BarControl: TCustomdxBarControl read GetBarControl;
|
|
property BarManager: TdxBarManager read GetBarManager;
|
|
property CanVisibleIndex: Integer read GetCanVisibleIndex;
|
|
property Caption: string read GetCaption;
|
|
property Control: TdxBarItemControl read FControl;
|
|
property Data: Integer read FData write FData default 0;
|
|
property Glyph: TBitmap read GetGlyph;
|
|
property ItemRect: TRect read FItemRect write FItemRect;
|
|
property OriginalItemLink: TdxBarItemLink read FOriginalItemLink;
|
|
property Owner: TdxBarItemLinks read GetOwnerValue;
|
|
property PaintStyle: TdxBarPaintStyle read GetPaintStyle;
|
|
property RealItemLink: TdxBarItemLink read GetRealItemLink;
|
|
property VisibleIndex: Integer read GetVisibleIndex;
|
|
property Width: Integer read GetWidth;
|
|
published
|
|
property BeginGroup: Boolean read GetBeginGroup write SetBeginGroup default False;
|
|
property Item: TdxBarItem read FItem write SetItem;
|
|
property MostRecentlyUsed: Boolean read FMostRecentlyUsed
|
|
write SetMostRecentlyUsed default True;
|
|
property UserCaption: string read FUserCaption write SetUserCaption;
|
|
property UserDefine: TdxBarUserDefines read FUserDefine write SetUserDefine default [];
|
|
property UserGlyph: TBitmap read FUserGlyph write SetUserGlyph;
|
|
property UserPaintStyle: TdxBarPaintStyle read FUserPaintStyle
|
|
write SetUserPaintStyle default psStandard;
|
|
property UserWidth: Integer read FUserWidth write SetUserWidth default 0;
|
|
property Visible: Boolean read FVisible write SetVisible;
|
|
end;
|
|
|
|
TdxBarIterationProc = procedure(Index: Integer; ItemLink: TdxBarItemLink;
|
|
var Stop: Boolean; var Data: Pointer) of object;
|
|
|
|
TdxBarItemLinks = class(TCollection)
|
|
private
|
|
FAssigning: Boolean;
|
|
FAvailableItems, FCanVisibleItems, FVisibleItems: TList;
|
|
FBarControl: TCustomdxBarControl;
|
|
FBarManager: TdxBarManager;
|
|
FOwner: TObject;
|
|
FPrevRecentItemCount: Integer;
|
|
FRecentItems: TList;
|
|
FRecentItemCount: Integer;
|
|
FUseRecentItems: Boolean;
|
|
FOnChange: TNotifyEvent;
|
|
|
|
function GetAvailableItem(Index: Integer): TdxBarItemLink;
|
|
function GetAvailableItemCount: Integer;
|
|
function GetCanVisibleItem(Index: Integer): TdxBarItemLink;
|
|
function GetCanVisibleItemCount: Integer;
|
|
function GetItem(Index: Integer): TdxBarItemLink;
|
|
function GetMostRecentItemCount: Integer;
|
|
function GetRealVisibleItemCount: Integer;
|
|
function GetVisibleItem(Index: Integer): TdxBarItemLink;
|
|
function GetVisibleItemCount: Integer;
|
|
procedure SetItem(Index: Integer; Value: TdxBarItemLink);
|
|
procedure SetRecentItemCount(Value: Integer);
|
|
|
|
procedure RefreshVisibilityLists;
|
|
property MostRecentItemCount: Integer read GetMostRecentItemCount;
|
|
procedure RestoreRecentItemCount;
|
|
property RecentItemCount: Integer read FRecentItemCount write SetRecentItemCount;
|
|
|
|
procedure EmptyItemRects;
|
|
procedure Loaded(CheckVisible: Boolean);
|
|
procedure CheckVisibleIntegrity;
|
|
procedure AssignUsageData(AItemLinks: TdxBarItemLinks);
|
|
protected
|
|
function CanUseRecentItems: Boolean;
|
|
procedure InitiateActions;
|
|
function IsDesignTimeLinks: Boolean;
|
|
function IsShortCut(AShortCut: TShortCut): Boolean;
|
|
|
|
function FindItemWithAccel(Key: Word; Shift: TShiftState; Current: TdxBarItemLink): TdxBarItemLink;
|
|
function First: TdxBarItemLink;
|
|
function Last: TdxBarItemLink;
|
|
function Next(Current: TdxBarItemLink): TdxBarItemLink;
|
|
function Prev(Current: TdxBarItemLink): TdxBarItemLink;
|
|
|
|
function GetOwner: TPersistent; override;
|
|
procedure Update(Item: TCollectionItem); override;
|
|
|
|
property RealVisibleItemCount: Integer read GetRealVisibleItemCount;
|
|
public
|
|
constructor Create(ABarManager: TdxBarManager);
|
|
destructor Destroy; override;
|
|
function Add: TdxBarItemLink;
|
|
procedure Assign(Source: TPersistent); override;
|
|
function AvailableIndexOf(Value: TdxBarItemLink): Integer;
|
|
function CanVisibleIndexOf(Value: TdxBarItemLink): Integer;
|
|
procedure CreateBarControl;
|
|
procedure FreeForeignItems(ForeignBarManager: TdxBarManager);
|
|
function HasItem(AItem: TdxBarItem): Boolean;
|
|
function IndexOf(Value: TdxBarItemLink): Integer;
|
|
function VisibleIndexOf(Value: TdxBarItemLink): Integer;
|
|
|
|
property AvailableItems[Index: Integer]: TdxBarItemLink read GetAvailableItem;
|
|
property AvailableItemCount: Integer read GetAvailableItemCount;
|
|
property BarControl: TCustomdxBarControl read FBarControl write FBarControl;
|
|
property BarManager: TdxBarManager read FBarManager;
|
|
property CanVisibleItems[Index: Integer]: TdxBarItemLink read GetCanVisibleItem;
|
|
property CanVisibleItemCount: Integer read GetCanVisibleItemCount;
|
|
property Items[Index: Integer]: TdxBarItemLink read GetItem write SetItem; default;
|
|
{$WARNINGS OFF}
|
|
property Owner: TObject read FOwner; // TdxBar, TdxBarPopupMenu, TCustomdxBarSubItem, nil
|
|
{$WARNINGS ON}
|
|
property VisibleItems[Index: Integer]: TdxBarItemLink read GetVisibleItem;
|
|
property VisibleItemCount: Integer read GetVisibleItemCount;
|
|
|
|
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
|
end;
|
|
|
|
TdxBarPaintSubMenuBarEvent = procedure(Sender: TObject;
|
|
Canvas: TCanvas; const R: TRect) of object;
|
|
|
|
TdxBarPopupMenu = class(TComponent, IUnknown, IcxPopupMenu)
|
|
private
|
|
DontUseMessageLoop: Boolean;
|
|
FBackgroundBitmap: TBitmap;
|
|
FBarManager: TdxBarManager;
|
|
FBarSize: Integer;
|
|
FEditFontHandle: HFONT;
|
|
FFont: TFont;
|
|
FInternalFontChange: Boolean;
|
|
FItemLinks: TdxBarItemLinks;
|
|
FOwnerBounds: PRect;
|
|
FOwnerControl: TWinControl;
|
|
FOwnerWidth, FOwnerHeight: Integer;
|
|
FPopupMenuVisible: Boolean;
|
|
FShowAnimation: Boolean;
|
|
FUseOwnFont: Boolean;
|
|
FUseRecentItems: Boolean;
|
|
FOnCloseUp: TNotifyEvent;
|
|
FOnPaintBar: TdxBarPaintSubMenuBarEvent;
|
|
FOnPopup: TNotifyEvent;
|
|
|
|
function GetSubMenuControl: TdxBarSubMenuControl;
|
|
procedure SetBackgroundBitmap(Value: TBitmap);
|
|
procedure SetBarManager(Value: TdxBarManager);
|
|
procedure SetBarSize(Value: Integer);
|
|
procedure SetFont(Value: TFont);
|
|
procedure SetItemLinks(Value: TdxBarItemLinks);
|
|
procedure SetUseOwnFont(Value: Boolean);
|
|
procedure SetUseRecentItems(Value: Boolean);
|
|
|
|
procedure FontChanged(Sender: TObject);
|
|
procedure SubMenuCloseUp(Sender: TObject);
|
|
procedure SubMenuPopup(Sender: TObject);
|
|
procedure OwnerDesignerModified;
|
|
protected
|
|
procedure DoPaintBar(Canvas: TCanvas; const R: TRect); virtual;
|
|
function IsShortCut(AShortCut: TShortCut): Boolean;
|
|
function IsShortCutKey(var Message: TWMKey): Boolean;
|
|
procedure Loaded; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Popup(X, Y: Integer);
|
|
procedure PopupEx(X, Y, AOwnerWidth, AOwnerHeight: Integer;
|
|
AShowAnimation: Boolean; AOwnerBounds: PRect);
|
|
procedure PopupFromCursorPos;
|
|
property SubMenuControl: TdxBarSubMenuControl read GetSubMenuControl;
|
|
published
|
|
property BarManager: TdxBarManager read FBarManager write SetBarManager;
|
|
property BarSize: Integer read FBarSize write SetBarSize default 0;
|
|
property Font: TFont read FFont write SetFont stored FUseOwnFont;
|
|
property ItemLinks: TdxBarItemLinks read FItemLinks write SetItemLinks;
|
|
property UseOwnFont: Boolean read FUseOwnFont write SetUseOwnFont;
|
|
property UseRecentItems: Boolean read FUseRecentItems write SetUseRecentItems default False;
|
|
property BackgroundBitmap: TBitmap read FBackgroundBitmap write SetBackgroundBitmap;
|
|
|
|
property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp;
|
|
property OnPaintBar: TdxBarPaintSubMenuBarEvent read FOnPaintBar write FOnPaintBar;
|
|
property OnPopup: TNotifyEvent read FOnPopup write FOnPopup;
|
|
end;
|
|
|
|
{-----------------------
|
|
Visual components
|
|
-----------------------}
|
|
|
|
{ dock controls }
|
|
|
|
TdxDockControl = class(TCustomControl)
|
|
private
|
|
FAllowDocking: Boolean;
|
|
FBackgroundBitmap: TBitmap;
|
|
FBackgroundTempBitmap: TBitmap;
|
|
FBarManager: TdxBarManager;
|
|
FDockingStyle: TdxBarDockingStyle;
|
|
FIsBarHandleDestroying: Boolean;
|
|
FRowList: TList;
|
|
FRowMarginSize: Integer;
|
|
|
|
procedure BitmapChanged(Sender: TObject);
|
|
function GetBars: TdxBars;
|
|
function GetDockingStyle: TdxBarDockingStyle;
|
|
function GetHorizontal: Boolean;
|
|
function GetIsDesigning: Boolean;
|
|
function GetIsLoading: Boolean;
|
|
function GetMain: Boolean;
|
|
function GetRow(Index: Integer): TdxDockRow;
|
|
function GetRowCount: Integer;
|
|
function GetTopLeft: Boolean;
|
|
function GetVertical: Boolean;
|
|
procedure SetBarManager(Value: TdxBarManager);
|
|
procedure SetBackgroundBitmap(Value: TBitmap);
|
|
|
|
procedure WMDestroy(var Message: TMessage); message WM_DESTROY;
|
|
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
|
|
procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
|
|
procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
|
|
procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
|
|
procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
|
|
procedure WMSize(var Message: TWMSize); message WM_SIZE;
|
|
procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
|
|
procedure CMSysColorChange(var Message: TMessage); message CM_SYSCOLORCHANGE;
|
|
protected
|
|
procedure AlignControls(AControl: TControl; var Rect: TRect); override;
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
|
procedure RequestAlign; override;
|
|
procedure WndProc(var Message: TMessage); override;
|
|
|
|
procedure AddBarControl(ABarControl: TdxBarControl; APos: TPoint; Update: Boolean);
|
|
procedure DeleteBarControl(ABarControl: TdxBarControl; ADockCol: TObject; Update: Boolean);
|
|
procedure MoveBarControl(ABarControl: TdxBarControl; APos: TPoint);
|
|
|
|
procedure AssignPositions;
|
|
procedure BarManagerChanged; virtual;
|
|
function CanDocking(Bar: TdxBar): Boolean; virtual;
|
|
procedure ColorChanged; virtual;
|
|
function GetDockZoneBounds: TRect;
|
|
procedure GetDockZoneMargins(Row, ZoneNumber: Integer; var M1, M2: Integer);
|
|
function GetRectForRow(ARow: Integer): TRect;
|
|
function GetClientSize: Integer; virtual;
|
|
function GetSize: Integer;
|
|
function GetRowAtPos(APos: TPoint; var Insert: Boolean): Integer;
|
|
function GetColAtPos(ARow: Integer; APos: TPoint): Integer;
|
|
procedure GetPosForRow(Row: Integer; OneOnRow: Boolean; var P: TPoint);
|
|
function GetSunkenBorder: Boolean; virtual;
|
|
function GetMainForm: TCustomForm; virtual;
|
|
procedure NCChanged;
|
|
procedure PaintBarControls;
|
|
procedure SetSize;
|
|
procedure UpdateDock;
|
|
|
|
procedure FillBackground(DC: HDC; ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor); virtual;
|
|
function IsBackgroundBitmap: Boolean; virtual;
|
|
function IsTransparent: Boolean; virtual;
|
|
procedure RepaintBarControls; virtual;
|
|
procedure ResetBackground; virtual;
|
|
procedure UpdateDoubleBuffered; virtual;
|
|
property BackgroundTempBitmap: TBitmap read FBackgroundTempBitmap;
|
|
|
|
property AllowDocking: Boolean read FAllowDocking write FAllowDocking default True;
|
|
property BackgroundBitmap: TBitmap read FBackgroundBitmap write SetBackgroundBitmap;
|
|
property Horizontal: Boolean read GetHorizontal;
|
|
property IsBarHandleDestroying: Boolean read FIsBarHandleDestroying write FIsBarHandleDestroying;
|
|
property IsDesigning: Boolean read GetIsDesigning;
|
|
property IsLoading: Boolean read GetIsLoading;
|
|
property Main: Boolean read GetMain;
|
|
property RowMarginSize: Integer read FRowMarginSize write FRowMarginSize;
|
|
property SunkenBorder: Boolean read GetSunkenBorder;
|
|
property TopLeft: Boolean read GetTopLeft;
|
|
property Vertical: Boolean read GetVertical;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
constructor CreateEx(AOwner: TComponent; ABarManager: TdxBarManager;
|
|
ADockStyle: TdxBarDockingStyle);
|
|
destructor Destroy; override;
|
|
procedure InitiateAction; override;
|
|
|
|
property BarManager: TdxBarManager read FBarManager write SetBarManager;
|
|
property Bars: TdxBars read GetBars;
|
|
property DockingStyle: TdxBarDockingStyle read GetDockingStyle;
|
|
property RowCount: Integer read GetRowCount;
|
|
property RowList: TList read FRowList;
|
|
property Rows[Index: Integer]: TdxDockRow read GetRow;
|
|
end;
|
|
|
|
TdxBarDockAlign = (dalNone, dalTop, dalBottom, dalLeft, dalRight);
|
|
|
|
TdxBarDockControl = class(TdxDockControl)
|
|
private
|
|
FAllowZeroSizeInDesignTime: Boolean;
|
|
FSunkenBorder: Boolean;
|
|
FUseOwnColor: Boolean;
|
|
FUseOwnSunkenBorder: Boolean;
|
|
function GetAlign: TdxBarDockAlign;
|
|
function GetColor: TColor;
|
|
function GetIsLoading: Boolean;
|
|
function GetParentColor: Boolean;
|
|
procedure SetAlign(Value: TdxBarDockAlign);
|
|
procedure SetAllowZeroSizeInDesignTime(Value: Boolean);
|
|
procedure SetColor(Value: TColor);
|
|
procedure SetParentColor(Value: Boolean);
|
|
procedure SetSunkenBorder(Value: Boolean);
|
|
procedure SetUseOwnColor(Value: Boolean);
|
|
procedure SetUseOwnSunkenBorder(Value: Boolean);
|
|
function IsColorStored: Boolean;
|
|
procedure WMCreate(var Message: TWMCreate); message WM_CREATE;
|
|
procedure WMSize(var Message: TWMSize); message WM_SIZE;
|
|
protected
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
procedure Paint; override;
|
|
procedure BarManagerChanged; override;
|
|
function CanDocking(Bar: TdxBar): Boolean; override;
|
|
procedure ColorChanged; override;
|
|
function GetClientSize: Integer; override;
|
|
function GetMinSize: Integer;
|
|
function GetSunkenBorder: Boolean; override;
|
|
function GetMainForm: TCustomForm; override;
|
|
property IsLoading: Boolean read GetIsLoading;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
published
|
|
property Align: TdxBarDockAlign read GetAlign write SetAlign;
|
|
property AllowDocking;
|
|
property AllowZeroSizeInDesignTime: Boolean read FAllowZeroSizeInDesignTime
|
|
write SetAllowZeroSizeInDesignTime default False;
|
|
property Anchors;
|
|
property BarManager;
|
|
property Color read GetColor write SetColor stored IsColorStored;
|
|
property ParentColor: Boolean read GetParentColor write SetParentColor
|
|
stored IsColorStored;
|
|
property SunkenBorder: Boolean read GetSunkenBorder write SetSunkenBorder
|
|
stored FUseOwnSunkenBorder;
|
|
property UseOwnColor: Boolean read FUseOwnColor write SetUseOwnColor default False;
|
|
property UseOwnSunkenBorder: Boolean read FUseOwnSunkenBorder
|
|
write SetUseOwnSunkenBorder default False;
|
|
property Visible;
|
|
property BackgroundBitmap;
|
|
|
|
property OnClick;
|
|
property OnDblClick;
|
|
property OnMouseDown;
|
|
property OnMouseMove;
|
|
property OnMouseUp;
|
|
property OnResize;
|
|
end;
|
|
|
|
{ shadow support }
|
|
|
|
TdxBarShadowCorner = (scLeft, scRight, scTop);
|
|
TdxBarShadowCorners = set of TdxBarShadowCorner;
|
|
|
|
TdxBarShadowPartKind = (spHorizontal, spVertical);
|
|
|
|
TdxBarShadowPart = class(TCustomControl)
|
|
private
|
|
FCorners: TdxBarShadowCorners;
|
|
FImage: TBitmap;
|
|
FKind: TdxBarShadowPartKind;
|
|
FOwner: TdxBarShadow;
|
|
function GetControl: TWinControl;
|
|
function GetShadowSize: Integer;
|
|
function GetTransparent: Boolean;
|
|
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
|
|
protected
|
|
function CanShow: Boolean;
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
procedure Paint; override;
|
|
procedure UpdateImage;
|
|
property Control: TWinControl read GetControl;
|
|
property Image: TBitmap read FImage;
|
|
property Owner: TdxBarShadow read FOwner;
|
|
property ShadowSize: Integer read GetShadowSize;
|
|
property Transparent: Boolean read GetTransparent;
|
|
public
|
|
constructor CreateEx(AOwner: TdxBarShadow;
|
|
AKind: TdxBarShadowPartKind; ACorners: TdxBarShadowCorners);
|
|
destructor Destroy; override;
|
|
procedure Hide;
|
|
procedure Show;
|
|
procedure UpdateBounds(const ABounds: TRect);
|
|
property Corners: TdxBarShadowCorners read FCorners;
|
|
property Kind: TdxBarShadowPartKind read FKind;
|
|
end;
|
|
|
|
TdxBarShadow = class
|
|
private
|
|
FHorizontal: Boolean;
|
|
FOwner: TWinControl;
|
|
FParts: array[0..4] of TdxBarShadowPart;
|
|
FVisible: Boolean;
|
|
function GetShadowSize: Integer;
|
|
function GetTransparent: Boolean;
|
|
procedure SetVisible(Value: Boolean);
|
|
protected
|
|
R1, R2: TRect;
|
|
procedure CreateParts;
|
|
procedure DestroyParts;
|
|
procedure Hide;
|
|
procedure Show;
|
|
property Transparent: Boolean read GetTransparent;
|
|
public
|
|
constructor Create(AOwner: TWinControl);
|
|
destructor Destroy; override;
|
|
procedure Refresh;
|
|
procedure SetOwnerBounds(AR1, AR2: TRect);
|
|
property Horizontal: Boolean read FHorizontal;
|
|
property Owner: TWinControl read FOwner;
|
|
property ShadowSize: Integer read GetShadowSize;
|
|
property Visible: Boolean read FVisible write SetVisible;
|
|
end;
|
|
|
|
{ TCustomdxBarControl }
|
|
|
|
TdxBarMarkState = (msNone, msSelected, msPressed);
|
|
|
|
TCustomdxBarControl = class(TCustomControl)
|
|
private
|
|
FBackgroundTempBitmap: TBitmap;
|
|
FBkBrush: HBRUSH;
|
|
FChildBar: TCustomdxBarControl;
|
|
FClickedControl: TdxBarItemControl;
|
|
FDestroyFlag: Boolean;
|
|
FDockControl: TdxDockControl;
|
|
FDockingStyle: TdxBarDockingStyle;
|
|
FDragDown: Boolean;
|
|
FDragPoint: TPoint;
|
|
FIgnoreMouseClick: Boolean;
|
|
FInRepaint: Boolean;
|
|
FIsActive: Boolean;
|
|
FItemLinks: TdxBarItemLinks;
|
|
FMarkState: TdxBarMarkState;
|
|
FMouseOverClickedControl: Boolean;
|
|
FMovingChanging: Boolean;
|
|
FOwnerBounds: TRect;
|
|
FOwnerControl: TWinControl;
|
|
FParentBar: TCustomdxBarControl;
|
|
FPrevActiveBarControl: TCustomdxBarControl;
|
|
FSelectedItem: TdxBarItemControl;
|
|
FShadow: TdxBarShadow;
|
|
|
|
FTextSize, FEditTextSize: Integer;
|
|
FMenuArrowHeight, FMenuArrowWidth: Integer;
|
|
FComboBoxArrowWidth: Integer;
|
|
|
|
function GetBarControlOwnerBrush: HBRUSH;
|
|
function GetBarManager: TdxBarManager;
|
|
function GetFlat: Boolean;
|
|
function GetIsDestroying: Boolean;
|
|
function GetOwnerLinkBounds(AOwnerPart: Boolean): TRect;
|
|
function GetPainterClass: TdxBarItemControlPainterClass;
|
|
procedure SetDockControl(Value: TdxDockControl);
|
|
|
|
procedure WMCaptureChanged(var Message: TMessage); message WM_CAPTURECHANGED;
|
|
procedure WMDestroy(var Message: TMessage); message WM_DESTROY;
|
|
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
|
|
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
|
|
procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
|
|
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
|
|
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
|
|
procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
|
|
procedure WMMouseLeave(var Message: TMessage); message WM_MOUSELEAVE;
|
|
procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
|
|
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
|
|
procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
|
|
procedure WMRepaintBar(var Message: TMessage); message WM_REPAINTBAR;
|
|
procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR;
|
|
procedure WMSize(var Message: TWMSize); message WM_SIZE;
|
|
procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
|
|
protected
|
|
FLastMousePos: TPoint;
|
|
|
|
procedure AdjustSize; override;
|
|
procedure CreateWindowHandle(const Params: TCreateParams); override;
|
|
procedure CreateWnd; override;
|
|
procedure DestroyWindowHandle; override;
|
|
procedure CreateControls; virtual;
|
|
procedure DestroyControls; virtual;
|
|
procedure WndProc(var Message: TMessage); override;
|
|
|
|
procedure BeforeDestroyHandle;
|
|
procedure CalcDrawingConsts; virtual;
|
|
function CanAlignControl(AControl: TdxBarItemControl): Boolean; virtual;
|
|
function CanCallInheritedNCCalcSize: Boolean; virtual; // obsolete
|
|
//function CanCallInheritedNCPaint: Boolean; virtual;
|
|
function CanCustomizing: Boolean; virtual;
|
|
function CanFinishMouseTracking(const Message: TWMNCHitTest): Boolean; dynamic;
|
|
function ChildrenHaveShadows: Boolean; virtual;
|
|
procedure DblClickOnItem(Item: TdxBarItemControl); dynamic;
|
|
procedure DrawSelectedItem(AControl: TdxBarItemControl);
|
|
procedure FocusNextBarControl(AForward: Boolean);
|
|
function GetBeginGroupSize: Integer; virtual; abstract;
|
|
function GetEditFontHandle: HFONT; virtual;
|
|
function GetFullItemRect(Item: TdxBarItemControl): TRect; virtual;
|
|
function GetIsCustomizing: Boolean; virtual;
|
|
function GetIsShadowVisible: Boolean; virtual;
|
|
function GetItemRectEx(Item: TdxBarItemControl; IsBeginGroup: Boolean): TRect; virtual;
|
|
function GetItemRegion(Item: TdxBarItemControl): HRGN; virtual;
|
|
function GetItemScreenRect(Item: TdxBarItemControl): TRect;
|
|
function GetOwnerControl: TWinControl; virtual;
|
|
function GetToolbarBrush: HBRUSH; virtual;
|
|
function GetToolbarDownedBrush: HBRUSH; virtual;
|
|
function GetToolbarDownedSelBrush: HBRUSH; virtual;
|
|
function GetToolbarSelBrush: HBRUSH; virtual;
|
|
procedure GetWindowRect(var R: TRect);
|
|
function HasShadow: Boolean;
|
|
function HideOnClick: Boolean; virtual;
|
|
function IsChildBar(Value: TCustomdxBarControl): Boolean; virtual;
|
|
function IsLinkedToOwner: Boolean; virtual;
|
|
function ItemAtPosEx(Pos: TPoint;
|
|
var IsBeginGroup, IsFirstPart, IsVerticalDirection: Boolean): TdxBarItemControl; virtual;
|
|
function ItemExists(Item: TdxBarItemControl): Boolean;
|
|
function MarkExists: Boolean; virtual;
|
|
function NotHandleMouseMove(P: TPoint): Boolean; virtual;
|
|
procedure PaintItem(AControl: TdxBarItemControl); virtual;
|
|
procedure PaintSelectedItem(OldSelectedItem: TdxBarItemControl); virtual;
|
|
procedure ResizeShadow;
|
|
function SelectedItemWantsKey(Key: Word): Boolean;
|
|
procedure SetCursorForMoving(AMoving: Boolean);
|
|
procedure SetDockingStyle(Value: TdxBarDockingStyle); virtual;
|
|
procedure SetFont; virtual; abstract;
|
|
procedure SetIsActive(Value: Boolean); virtual;
|
|
procedure SetKeySelectedItem(Value: TdxBarItemControl); virtual;
|
|
procedure SetLayeredAttributes; virtual;
|
|
procedure SetMarkState(Value: TdxBarMarkState); virtual; abstract;
|
|
procedure SetMouseSelectedItem(Value: TdxBarItemControl); virtual;
|
|
procedure SetSelectedItem(Value: TdxBarItemControl); virtual;
|
|
procedure UpdateControlStyle;
|
|
function WantMouse: Boolean;
|
|
|
|
procedure FillBackground(DC: HDC; ARect: TRect; ABrush: HBRUSH; AColor: TColor;
|
|
AIsClientArea: Boolean); virtual;
|
|
procedure FillBackgroundRgn(DC: HDC; ARgn: HRGN; ABrush: HBRUSH; AIsClientArea: Boolean); virtual;
|
|
procedure FullInvalidate;
|
|
procedure FullRepaint;
|
|
function IsInternal: Boolean; virtual;
|
|
function IsBackgroundBitmap: Boolean; virtual;
|
|
function IsTransparent: Boolean; virtual;
|
|
function NCOffset: TPoint; virtual;
|
|
function PointBarToDock(const APoint: TPoint): TPoint;
|
|
procedure ResetBackground; virtual;
|
|
procedure UpdateDoubleBuffered; virtual;
|
|
property BackgroundTempBitmap: TBitmap read FBackgroundTempBitmap;
|
|
|
|
property ChildBar: TCustomdxBarControl read FChildBar write FChildBar;
|
|
property DockControl: TdxDockControl read FDockControl write SetDockControl;
|
|
property DockingStyle: TdxBarDockingStyle read FDockingStyle write SetDockingStyle;
|
|
property Flat: Boolean read GetFlat; // TODO: obsolete
|
|
property IsDestroying: Boolean read GetIsDestroying;
|
|
property IsShadowVisible: Boolean read GetIsShadowVisible;
|
|
property MarkState: TdxBarMarkState read FMarkState write SetMarkState;
|
|
property ParentBar: TCustomdxBarControl read FParentBar write FParentBar;
|
|
property SelectedItem: TdxBarItemControl read FSelectedItem write SetSelectedItem;
|
|
property Shadow: TdxBarShadow read FShadow;
|
|
|
|
property BeginGroupSize: Integer read GetBeginGroupSize;
|
|
property OwnerBounds: TRect read FOwnerBounds write FOwnerBounds;
|
|
property OwnerControl: TWinControl read GetOwnerControl;
|
|
property OwnerLinkBounds[AOwnerPart: Boolean]: TRect read GetOwnerLinkBounds;
|
|
|
|
property BarControlOwnerBrush: HBRUSH read GetBarControlOwnerBrush;
|
|
property PainterClass: TdxBarItemControlPainterClass read GetPainterClass;
|
|
property ToolbarBrush: HBRUSH read GetToolbarBrush;
|
|
property ToolbarDownedBrush: HBRUSH read GetToolbarDownedBrush;
|
|
property ToolbarDownedSelBrush: HBRUSH read GetToolbarDownedSelBrush;
|
|
property ToolbarSelBrush: HBRUSH read GetToolbarSelBrush;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
function GetItemRect(Item: TdxBarItemControl): TRect;
|
|
procedure HideAll; virtual;
|
|
function ItemAtPos(Pos: TPoint): TdxBarItemControl;
|
|
procedure RepaintBar; virtual;
|
|
|
|
property BarManager: TdxBarManager read GetBarManager;
|
|
property BkBrush: HBRUSH read FBkBrush;
|
|
property Canvas;
|
|
property ComboBoxArrowWidth: Integer read FComboBoxArrowWidth;
|
|
property EditFontHandle: HFONT read GetEditFontHandle;
|
|
property EditTextSize: Integer read FEditTextSize;
|
|
property Font;
|
|
property IsActive: Boolean read FIsActive write SetIsActive;
|
|
property IsCustomizing: Boolean read GetIsCustomizing;
|
|
property ItemLinks: TdxBarItemLinks read FItemLinks write FItemLinks;
|
|
property MenuArrowHeight: Integer read FMenuArrowHeight;
|
|
property MenuArrowWidth: Integer read FMenuArrowWidth;
|
|
property TextSize: Integer read FTextSize;
|
|
end;
|
|
|
|
{ TdxBarControl }
|
|
|
|
TdxDockCol = class
|
|
private
|
|
FBarControl: TdxBarControl;
|
|
FDockRow: TdxDockRow;
|
|
FPos: TPoint;
|
|
public
|
|
constructor Create(ADockRow: TdxDockRow; ABarControl: TdxBarControl);
|
|
procedure AssignPosition;
|
|
property BarControl: TdxBarControl read FBarControl;
|
|
property DockRow: TdxDockRow read FDockRow;
|
|
property Pos: TPoint read FPos write FPos;
|
|
end;
|
|
|
|
TdxDockRow = class
|
|
protected
|
|
FColList: TList;
|
|
FDockControl: TdxDockControl;
|
|
function GetCol(Index: Integer): TdxDockCol;
|
|
function GetColCount: Integer;
|
|
public
|
|
constructor Create(ADockControl: TdxDockControl);
|
|
destructor Destroy; override;
|
|
property ColCount: Integer read GetColCount;
|
|
property ColList: TList read FColList;
|
|
property Cols[Index: Integer]: TdxDockCol read GetCol;
|
|
property DockControl: TdxDockControl read FDockControl;
|
|
end;
|
|
|
|
TdxBarMDIButton = (mdibMinimize, mdibRestore, mdibClose);
|
|
TdxBarMDIButtons = set of TdxBarMDIButton;
|
|
|
|
TdxBarControl = class(TCustomdxBarControl)
|
|
private
|
|
BeforeBarGetFocusFocusedWnd: HWND;
|
|
FBar: TdxBar;
|
|
FCloseButtonState: TdxBarMarkState;
|
|
FDockedHandle, FFloatingHandle: HWND;
|
|
FEditSizingCursor, FRightBorderSizing: Boolean;
|
|
FHasCaption: Boolean;
|
|
FHasSizeGrip: Boolean;
|
|
FHitTest: Longint;
|
|
FInternalLockCount: Integer;
|
|
FIsDowned: Boolean;
|
|
FMDIButtonWidth, FMDIButtonHeight: Integer;
|
|
FMinSize, FMaxSize: Integer;
|
|
FMoreButtonsHintTimer: UINT;
|
|
FMoving: Boolean;
|
|
FSettingFont: Boolean;
|
|
FSizingEditWidth: Integer;
|
|
FTruncated: Boolean;
|
|
FQuickPopup: TdxBarControl;
|
|
NewLeft, NewTop, NewWidth, NewHeight: Integer;
|
|
RX, RY: TPoint;
|
|
|
|
function GetCaptionBkColor: COLORREF;
|
|
function GetCaptionColor: COLORREF;
|
|
function GetHorizontal: Boolean;
|
|
function GetInternallyLocked: Boolean;
|
|
function GetMultiLine: Boolean;
|
|
function GetVertical: Boolean;
|
|
procedure SetCloseButtonState(Value: TdxBarMarkState);
|
|
procedure SetMoving(Value: Boolean);
|
|
|
|
procedure CalcControlsPositions;
|
|
procedure ChangeStyleWinTo(AStyle: TdxBarDockingStyle;
|
|
ADockControl: TdxDockControl);
|
|
procedure DrawEditSizingFrame(AWidth: Integer);
|
|
function GetDragPointOffset(Style: TdxBarDockingStyle): TPoint;
|
|
function GetCaptionNCRect: TRect;
|
|
function GetCaptionRect: TRect;
|
|
procedure DrawCloseButton(DC: HDC);
|
|
procedure DrawMark(DC: HDC);
|
|
|
|
procedure DrawMDIButton(AButton: TdxBarMDIButton; ASelected, APressed: Boolean);
|
|
function GetMDIWidth: Integer;
|
|
function GetMDIHeight: Integer;
|
|
function RectMDI(Button: TdxBarMDIButton): TRect;
|
|
function RealMDIButtonsOnBar: Boolean;
|
|
function MDIButtonsOnBar: Boolean;
|
|
function MDIButtonEnabled(AButton: TdxBarMDIButton; State: Integer): Boolean;
|
|
|
|
procedure StartMoreButtonsHintTimer;
|
|
procedure FinishMoreButtonsHintTimer;
|
|
|
|
procedure CheckMarkState(const P: TPoint);
|
|
|
|
procedure WMCaptureChanged(var Message: TMessage); message WM_CAPTURECHANGED;
|
|
procedure WMDestroy(var Message: TMessage); message WM_DESTROY;
|
|
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
|
|
procedure WMGetMinMaxInfo(var Message: TWMGetMinmaxInfo); message WM_GETMINMAXINFO;
|
|
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
|
|
procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
|
|
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
|
|
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
|
|
procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
|
|
procedure WMMouseLeave(var Message: TMessage); message WM_MOUSELEAVE;
|
|
procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
|
|
procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
|
|
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
|
|
procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
|
|
procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
|
|
procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
|
|
procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR;
|
|
procedure WMSize(var Message: TWMSize); message WM_SIZE;
|
|
procedure WMSizing(var Message: TMessage); message WM_SIZING;
|
|
procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
|
|
procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
|
|
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
|
|
protected
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
procedure CreateWnd; override;
|
|
procedure Paint; override;
|
|
procedure WndProc(var Message: TMessage); override;
|
|
|
|
procedure BeginInternal;
|
|
procedure EndInternal;
|
|
property InternallyLocked: Boolean read GetInternallyLocked;
|
|
|
|
procedure CalcDrawingConsts; override;
|
|
function CanAlignControl(AControl: TdxBarItemControl): Boolean; override;
|
|
function CanCallInheritedNCCalcSize: Boolean; override; // obsolete
|
|
function CanCustomizing: Boolean; override;
|
|
function CanFinishMouseTracking(const Message: TWMNCHitTest): Boolean; override;
|
|
function CloseButtonRect: TRect;
|
|
function CloseButtonRectNC: TRect;
|
|
function GetAlphaBlendValue: Byte;
|
|
function GetBeginGroupSize: Integer; override;
|
|
function GetCol: Integer;
|
|
function GetDockCol: TdxDockCol;
|
|
function GetRow: Integer;
|
|
function GetMainForm: TCustomForm; virtual;
|
|
function GetMinWidth(AStyle: TdxBarDockingStyle): Integer;
|
|
function GetMinHeight(AStyle: TdxBarDockingStyle): Integer;
|
|
function GetMaxWidth(AStyle: TdxBarDockingStyle): Integer;
|
|
function GetMaxHeight(AStyle: TdxBarDockingStyle): Integer;
|
|
procedure GetMultiLineBarSize(AStyle: TdxBarDockingStyle;
|
|
ASize: Integer; var Result: TPoint);
|
|
function GetSizeAllCursorBounds: TRect; virtual;
|
|
function GetSizeForWidth(AStyle: TdxBarDockingStyle; AWidth: Integer): TPoint;
|
|
function GetSizeForHeight(AStyle: TdxBarDockingStyle; AHeight: Integer): TPoint;
|
|
function GetTrackSize(AStyle: TdxBarDockingStyle): TPoint;
|
|
procedure InvalidateMark;
|
|
function MarkExists: Boolean; override;
|
|
function MarkNCRect: TRect;
|
|
function MarkRect: TRect;
|
|
function MarkItemRect: TRect;
|
|
function MarkScreenRect: TRect;
|
|
function SizeGripRect: TRect;
|
|
|
|
procedure BarManagerStyleChanged;
|
|
procedure CaptionChanged; virtual;
|
|
procedure DrawMDIButtons(ARgn: HRGN; AButtons: TdxBarMDIButtons);
|
|
procedure FrameChanged;
|
|
function GetEditFontHandle: HFONT; override;
|
|
function GetFullItemRect(Item: TdxBarItemControl): TRect; override;
|
|
function GetItemRegion(Item: TdxBarItemControl): HRGN; override;
|
|
function GetToolbarBrush: HBRUSH; override;
|
|
function ItemAtPosEx(Pos: TPoint;
|
|
var IsBeginGroup, IsFirstPart, IsVerticalDirection: Boolean): TdxBarItemControl; override;
|
|
function NotHandleMouseMove(P: TPoint): Boolean; override;
|
|
procedure PaintItem(AControl: TdxBarItemControl); override;
|
|
procedure RebuildBar;
|
|
procedure RefreshShadow;
|
|
procedure RepaintMDIButtons;
|
|
procedure SavePos;
|
|
procedure SetFont; override;
|
|
procedure SetIsActive(Value: Boolean); override;
|
|
procedure SetDockingStyle(Value: TdxBarDockingStyle); override;
|
|
procedure SetKeySelectedItem(Value: TdxBarItemControl); override;
|
|
procedure SetLayeredAttributes; override;
|
|
procedure SetMarkState(Value: TdxBarMarkState); override;
|
|
|
|
procedure FillBackground(DC: HDC; ARect: TRect; ABrush: HBRUSH; AColor: TColor;
|
|
AIsClientArea: Boolean); override;
|
|
function IsBackgroundBitmap: Boolean; override;
|
|
function IsTransparent: Boolean; override;
|
|
function NCOffset: TPoint; override;
|
|
|
|
property CaptionBkColor: COLORREF read GetCaptionBkColor;
|
|
property CaptionColor: COLORREF read GetCaptionColor;
|
|
property CloseButtonState: TdxBarMarkState read FCloseButtonState
|
|
write SetCloseButtonState;
|
|
|
|
property Horizontal: Boolean read GetHorizontal;
|
|
property IsDowned: Boolean read FIsDowned write FIsDowned;
|
|
property Moving: Boolean read FMoving write SetMoving;
|
|
property MultiLine: Boolean read GetMultiLine;
|
|
property Vertical: Boolean read GetVertical;
|
|
|
|
property MDIButtonWidth: Integer read FMDIButtonWidth;
|
|
property MDIButtonHeight: Integer read FMDIButtonHeight;
|
|
public
|
|
constructor CreateEx(AOwner: TComponent; ABar: TdxBar); virtual;
|
|
destructor Destroy; override;
|
|
procedure BarGetFocus(ASelectedItem: TdxBarItemControl); virtual;
|
|
procedure BarLostFocus; virtual;
|
|
procedure HideAll; override;
|
|
procedure Repaint; override;
|
|
procedure RepaintBar; override;
|
|
property Bar: TdxBar read FBar;
|
|
end;
|
|
|
|
{ TdxBarSubMenuControl }
|
|
|
|
TdxBarButtonControl = class;
|
|
TdxBarSubItemControl = class;
|
|
|
|
TXDirection = (xdLeft, xdRight);
|
|
TYDirection = (ydTop, ydBottom);
|
|
|
|
TdxBarSubMenuControl = class(TCustomdxBarControl)
|
|
private
|
|
FDestroyingControls: Boolean;
|
|
FDetachCaptionSelected: Boolean;
|
|
FDropDownButton: TdxBarButtonControl;
|
|
FExpandingMenu: Boolean;
|
|
FExpandMenuTimer: UINT;
|
|
FLightBrush: HBRUSH;
|
|
FLightPalette: HPALETTE;
|
|
FMarkSize: Integer;
|
|
FMenuAnimations: TdxBarMenuAnimations;
|
|
FNonRecent: Boolean;
|
|
FNormalItemHeight: Integer;
|
|
FOnShowLeft, FOnShowTop: Integer;
|
|
FOwnerWidth, FOwnerHeight: Integer;
|
|
FSavedItemLinks: TList;
|
|
FScrollTimerID: UINT;
|
|
FShowAnimation: Boolean;
|
|
FTopIndex: Integer;
|
|
FSubItem: TdxBarSubItemControl;
|
|
XDirection: TXDirection;
|
|
YDirection: TYDirection;
|
|
|
|
FOnCloseUp: TNotifyEvent;
|
|
FOnPopup: TNotifyEvent;
|
|
|
|
function GetBarSize: Integer;
|
|
function GetBorderSize: Integer;
|
|
function GetDetachCaptionSize: Integer;
|
|
function GetMaxVisibleCount: Integer;
|
|
function GetToolbarItemsBrush: HBRUSH;
|
|
procedure SetDetachCaptionSelected(Value: Boolean);
|
|
procedure SetTopIndex(Value: Integer);
|
|
|
|
procedure CalcControlsPositions(Size: PPoint);
|
|
procedure CreateLightBrush;
|
|
procedure DestroyLightBrush;
|
|
procedure PreparePalette(DC: HDC);
|
|
procedure UnpreparePalette(DC: HDC);
|
|
procedure ExpandMenu;
|
|
function ExtendedView: Boolean;
|
|
procedure InvalidateDetachCaption;
|
|
function MouseOnUpArrow: Boolean;
|
|
function MouseOnDownArrow: Boolean;
|
|
function MouseOnMark: Boolean;
|
|
procedure SetExpandMenuTimer(Time: UINT; ExpandAfterDelay: Boolean);
|
|
procedure KillExpandMenuTimer;
|
|
|
|
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
|
|
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
|
|
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
|
|
procedure WMMouseLeave(var Message: TMessage); message WM_MOUSELEAVE;
|
|
procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
|
|
procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
|
|
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
|
|
procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
|
|
procedure WMPrint(var Message: TMessage); message WM_PRINT;
|
|
procedure WMPrintClient(var Message: TMessage); message WM_PRINTCLIENT;
|
|
procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
|
|
procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP;
|
|
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
|
|
protected
|
|
ParentWnd: HWND;
|
|
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
procedure CreateWnd; override;
|
|
procedure DestroyWindowHandle; override;
|
|
procedure DestroyWnd; override;
|
|
procedure DoCloseUp; dynamic;
|
|
procedure DoPopup; dynamic;
|
|
procedure Paint; override;
|
|
procedure NCPaint(DC: HDC);
|
|
|
|
procedure CalcDrawingConsts; override;
|
|
function CanCustomizing: Boolean; override;
|
|
function ChildrenHaveShadows: Boolean; override;
|
|
procedure CreateControls; override;
|
|
procedure DestroyControls; override;
|
|
procedure DrawBar(const R: TRect);
|
|
function GetBeginGroupSize: Integer; override;
|
|
function GetEditFontHandle: HFONT; override;
|
|
function GetIsContextMenu: Boolean; virtual;
|
|
function GetIsCustomizing: Boolean; override;
|
|
function GetIsShadowVisible: Boolean; override;
|
|
function GetItemRectEx(Item: TdxBarItemControl; IsBeginGroup: Boolean): TRect; override;
|
|
function HideOnClick: Boolean; override;
|
|
function ItemAtPosEx(Pos: TPoint;
|
|
var IsBeginGroup, IsFirstPart, IsVerticalDirection: Boolean): TdxBarItemControl; override;
|
|
procedure PaintItem(AControl: TdxBarItemControl); override;
|
|
procedure SetFont; override;
|
|
procedure SetIsActive(Value: Boolean); override;
|
|
procedure SetLayeredAttributes; override;
|
|
procedure SetMarkState(Value: TdxBarMarkState); override;
|
|
procedure SetRecentItemCount;
|
|
procedure SetSelectedItem(Value: TdxBarItemControl); override;
|
|
procedure SetSizeAndCheckBounds(var ChangeXDirection, ChangeYDirection: Boolean);
|
|
|
|
function CanDetach: Boolean;
|
|
function Detachable: Boolean;
|
|
function DetachCaptionAreaSize: Integer;
|
|
function DetachCaptionRect: TRect;
|
|
function MouseOnDetachCaption: Boolean;
|
|
procedure DoDetachMenu;
|
|
|
|
function MarkArrowSize: Integer;
|
|
function MarkExists: Boolean; override;
|
|
function MarkRect: TRect;
|
|
|
|
function DownArrowExists: Boolean;
|
|
function UpArrowExists: Boolean;
|
|
function VisibleCount: Integer;
|
|
|
|
procedure FillBackground(DC: HDC; ARect: TRect; ABrush: HBRUSH; AColor: TColor;
|
|
AIsClientArea: Boolean); override;
|
|
function GetBackgroundBitmap: TBitmap;
|
|
function GetIndent1: Integer;
|
|
function GetIndent2: Integer;
|
|
function IsTransparent: Boolean; override;
|
|
|
|
property BarSize: Integer read GetBarSize;
|
|
property BorderSize: Integer read GetBorderSize;
|
|
property DetachCaptionSelected: Boolean read FDetachCaptionSelected
|
|
write SetDetachCaptionSelected;
|
|
property DetachCaptionSize: Integer read GetDetachCaptionSize;
|
|
property MarkSize: Integer read FMarkSize;
|
|
property NormalItemHeight: Integer read FNormalItemHeight;
|
|
|
|
property ToolbarItemsBrush: HBRUSH read GetToolbarItemsBrush;
|
|
|
|
property IsContextMenu: Boolean read GetIsContextMenu;
|
|
property TopIndex: Integer read FTopIndex write SetTopIndex;
|
|
property MaxVisibleCount: Integer read GetMaxVisibleCount;
|
|
|
|
property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp;
|
|
property OnPopup: TNotifyEvent read FOnPopup write FOnPopup;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Hide;
|
|
procedure HideAll; override;
|
|
procedure RepaintBar; override;
|
|
procedure Show;
|
|
|
|
property OwnerWidth: Integer read FOwnerWidth write FOwnerWidth;
|
|
property OwnerHeight: Integer read FOwnerHeight write FOwnerHeight;
|
|
end;
|
|
|
|
{--------------------------------------
|
|
Items
|
|
--------------------------------------}
|
|
|
|
TdxBarItemActionLink = class(TActionLink)
|
|
protected
|
|
FClient: TdxBarItem;
|
|
procedure AssignClient(AClient: TObject); override;
|
|
function IsCaptionLinked: Boolean; override;
|
|
function IsCheckedLinked: Boolean; override;
|
|
function IsEnabledLinked: Boolean; override;
|
|
function IsHelpContextLinked: Boolean; override;
|
|
function IsHintLinked: Boolean; override;
|
|
function IsImageIndexLinked: Boolean; override;
|
|
function IsShortCutLinked: Boolean; override;
|
|
function IsVisibleLinked: Boolean; override;
|
|
function IsOnExecuteLinked: Boolean; override;
|
|
procedure SetCaption(const Value: string); override;
|
|
procedure SetChecked(Value: Boolean); override;
|
|
procedure SetEnabled(Value: Boolean); override;
|
|
procedure SetHelpContext(Value: THelpContext); override;
|
|
procedure SetHint(const Value: string); override;
|
|
procedure SetImageIndex(Value: Integer); override;
|
|
procedure SetShortCut(Value: TShortCut); override;
|
|
procedure SetVisible(Value: Boolean); override;
|
|
procedure SetOnExecute(Value: TNotifyEvent); override;
|
|
end;
|
|
|
|
TdxBarItemActionLinkClass = class of TdxBarItemActionLink;
|
|
|
|
TdxBarItemAlign = (iaLeft, iaCenter, iaRight, iaClient);
|
|
|
|
TdxBarItem = class(TComponent)
|
|
private
|
|
FActionLink: TdxBarItemActionLink;
|
|
FAlign: TdxBarItemAlign;
|
|
FBarManager: TdxBarManager;
|
|
FCaption: string;
|
|
FCategory: Integer;
|
|
FCheckDefaults: Boolean;
|
|
FClickItemLink: TdxBarItemLink;
|
|
FData: TObject;
|
|
FDescription: string;
|
|
FEnabled: Boolean;
|
|
FGlyph: TBitmap;
|
|
FHelpContext: THelpContext;
|
|
FHint: string;
|
|
FImageIndex: Integer;
|
|
FLinks: TList; // the list of the itemlinks
|
|
FLoadedVisible: TdxBarItemVisible;
|
|
FShortCut: TShortCut;
|
|
FUnclickAfterDoing: Boolean;
|
|
FVisible: TdxBarItemVisible;
|
|
|
|
FOnClick: TNotifyEvent;
|
|
FOnCreate: TNotifyEvent;
|
|
FOnDestroy: TNotifyEvent;
|
|
function GetAction: TBasicAction;
|
|
function GetActuallyVisible: Boolean;
|
|
function GetCurItemLink: TdxBarItemLink;
|
|
function GetEnabled: Boolean;
|
|
function GetFlat: Boolean;
|
|
function GetIndex: Integer;
|
|
function GetIsDesigning: Boolean;
|
|
function GetIsDestroying: Boolean;
|
|
function GetIsLoading: Boolean;
|
|
function GetLinkCount: Integer;
|
|
function GetLinks(Index: Integer): TdxBarItemLink;
|
|
function GetPainterClass: TdxBarItemControlPainterClass;
|
|
function GetVisibleForUser: Boolean;
|
|
procedure SetAction(Value: TBasicAction);
|
|
procedure SetAlign(Value: TdxBarItemAlign);
|
|
procedure SetCaption(Value: string);
|
|
procedure SetCategory(Value: Integer);
|
|
procedure SetDescription(Value: string);
|
|
procedure SetEnabled(Value: Boolean);
|
|
procedure SetGlyph(Value: TBitmap);
|
|
procedure SetShortCut(Value: TShortCut);
|
|
procedure SetVisible(Value: TdxBarItemVisible);
|
|
|
|
procedure DestroyLinks;
|
|
procedure DoActionChange(Sender: TObject);
|
|
function IsCaptionStored: Boolean;
|
|
function IsEnabledStored: Boolean;
|
|
function IsHelpContextStored: Boolean;
|
|
function IsHintStored: Boolean;
|
|
function IsImageIndexStored: Boolean;
|
|
function IsShortCutStored: Boolean;
|
|
function IsVisibleStored: Boolean;
|
|
function IsOnClickStored: Boolean;
|
|
function GetHintFromCaption: string;
|
|
procedure OnGlyphChanged(Sender: TObject);
|
|
protected
|
|
procedure AssignTo(Dest: TPersistent); override;
|
|
procedure Loaded; override;
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
|
procedure ReadState(Reader: TReader); override;
|
|
procedure SetName(const NewName: TComponentName); override;
|
|
|
|
procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); dynamic;
|
|
procedure AlignChanged; dynamic;
|
|
procedure BarManagerChanged; virtual;
|
|
function CanClicked: Boolean; virtual;
|
|
procedure CaptionChanged; virtual;
|
|
procedure EnabledChanged; virtual;
|
|
function GetActionLinkClass: TdxBarItemActionLinkClass; dynamic;
|
|
function GetActionImageIndex: Integer; virtual;
|
|
procedure SetActionImageIndex(Value: Integer); virtual;
|
|
function GetHidden: Boolean; virtual;
|
|
procedure GlyphChanged; virtual;
|
|
function HasAccel(AItemLink: TdxBarItemLink): Boolean; virtual;
|
|
function HasControls: Boolean;
|
|
procedure HideControl(AControl: TdxBarItemControl); virtual;
|
|
procedure HotGlyphChanged; virtual;
|
|
function ImageIndexLinked: Boolean;
|
|
function InternalActuallyVisible: Boolean; virtual;
|
|
function IsHintFromCaption: Boolean;
|
|
procedure LargeGlyphChanged; virtual;
|
|
function NeedToBeHidden: Boolean; virtual;
|
|
procedure ObjectNotification(AOperation: TOperation; AObject: TObject); virtual;
|
|
procedure SetImageIndex(Value: Integer); virtual;
|
|
procedure ShortCutChanged; virtual;
|
|
procedure Update; virtual;
|
|
procedure UpdateEx; virtual;
|
|
function UseHotImages: Boolean; virtual;
|
|
function UseLargeImages: Boolean; virtual;
|
|
procedure VisibleChanged; virtual;
|
|
|
|
property ActionLink: TdxBarItemActionLink read FActionLink write FActionLink;
|
|
property ActionImageIndex: Integer read GetActionImageIndex write SetActionImageIndex;
|
|
property Flat: Boolean read GetFlat;
|
|
property Hidden: Boolean read GetHidden;
|
|
property IsDesigning: Boolean read GetIsDesigning;
|
|
property IsDestroying: Boolean read GetIsDestroying;
|
|
property IsLoading: Boolean read GetIsLoading;
|
|
property PainterClass: TdxBarItemControlPainterClass read GetPainterClass;
|
|
property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure BeforeDestruction; override;
|
|
procedure Click; dynamic;
|
|
procedure DirectClick; dynamic;
|
|
procedure DoClick; dynamic;
|
|
function GetParentComponent: TComponent; override;
|
|
function HasParent: Boolean; override;
|
|
procedure SetParentComponent(AParent: TComponent); override;
|
|
function GetCurImages: TCurImageList; virtual;
|
|
|
|
property ActuallyVisible: Boolean read GetActuallyVisible;
|
|
property BarManager: TdxBarManager read FBarManager;
|
|
property ClickItemLink: TdxBarItemLink read FClickItemLink;
|
|
property CurItemLink: TdxBarItemLink read GetCurItemLink;
|
|
property Data: TObject read FData write FData;
|
|
property Glyph: TBitmap read FGlyph write SetGlyph;
|
|
property ImageIndex: Integer read FImageIndex write SetImageIndex
|
|
stored IsImageIndexStored default -1;
|
|
property Index: Integer read GetIndex;
|
|
property LinkCount: Integer read GetLinkCount;
|
|
property Links[Index: Integer]: TdxBarItemLink read GetLinks;
|
|
property ShortCut: TShortCut read FShortCut write SetShortCut
|
|
stored IsShortCutStored default 0;
|
|
property UnclickAfterDoing: Boolean read FUnclickAfterDoing write FUnclickAfterDoing
|
|
default False;
|
|
property VisibleForUser: Boolean read GetVisibleForUser;
|
|
|
|
property OnClick: TNotifyEvent read FOnClick write FOnClick stored IsOnClickStored;
|
|
published
|
|
property Action: TBasicAction read GetAction write SetAction;
|
|
property Align: TdxBarItemAlign read FAlign write SetAlign default iaLeft;
|
|
property Caption: string read FCaption write SetCaption stored IsCaptionStored;
|
|
property Category: Integer read FCategory write SetCategory;
|
|
property Description: string read FDescription write SetDescription;
|
|
property Enabled: Boolean read GetEnabled write SetEnabled
|
|
stored IsEnabledStored default True;
|
|
property HelpContext: THelpContext read FHelpContext write FHelpContext
|
|
stored IsHelpContextStored default 0;
|
|
property Hint: string read FHint write FHint stored IsHintStored;
|
|
property Visible: TdxBarItemVisible read FVisible write SetVisible stored IsVisibleStored;
|
|
|
|
property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
|
|
end;
|
|
|
|
TdxBarWindowItem = class(TdxBarItem)
|
|
private
|
|
FEmptyWindow: Boolean;
|
|
FText: string;
|
|
|
|
FOnChange: TNotifyEvent;
|
|
FOnCurChange: TNotifyEvent;
|
|
FOnEnter: TNotifyEvent;
|
|
FOnExit: TNotifyEvent;
|
|
FOnKeyDown: TKeyEvent;
|
|
FOnKeyPress: TKeyPressEvent;
|
|
FOnKeyUp: TKeyEvent;
|
|
|
|
function GetCurText: string;
|
|
function GetFocusedItemLink: TdxBarItemLink;
|
|
procedure SetCurText(Value: string);
|
|
protected
|
|
function CanClicked: Boolean; override;
|
|
procedure Change; dynamic;
|
|
procedure CurChange; dynamic;
|
|
procedure DoEnter; dynamic;
|
|
procedure DoExit; dynamic;
|
|
procedure KeyDown(var Key: Word; Shift: TShiftState); dynamic;
|
|
procedure KeyPress(var Key: Char); dynamic;
|
|
procedure KeyUp(var Key: Word; Shift: TShiftState); dynamic;
|
|
procedure SetText(Value: string); virtual;
|
|
property EmptyWindow: Boolean read FEmptyWindow write FEmptyWindow;
|
|
public
|
|
procedure SetFocus(ACheckBarControlVisibility: Boolean = False); virtual;
|
|
property CurText: string read GetCurText write SetCurText;
|
|
property FocusedItemLink: TdxBarItemLink read GetFocusedItemLink;
|
|
published
|
|
property Text: string read FText write SetText;
|
|
|
|
property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
|
property OnCurChange: TNotifyEvent read FOnCurChange write FOnCurChange;
|
|
property OnEnter: TNotifyEvent read FOnEnter write FOnEnter;
|
|
property OnExit: TNotifyEvent read FOnExit write FOnExit;
|
|
property OnKeyDown: TKeyEvent read FOnKeyDown write FOnKeyDown;
|
|
property OnKeyPress: TKeyPressEvent read FOnKeyPress write FOnKeyPress;
|
|
property OnKeyUp: TKeyEvent read FOnKeyUp write FOnKeyUp;
|
|
end;
|
|
|
|
TdxBarButtonStyle = (bsDefault, bsChecked, bsDropDown);
|
|
|
|
TdxBarButton = class(TdxBarItem)
|
|
private
|
|
FAllowAllUp: Boolean;
|
|
FButtonStyle: TdxBarButtonStyle;
|
|
FCloseSubMenuOnClick: Boolean;
|
|
FDown: Boolean;
|
|
FDropDownEnabled: Boolean;
|
|
FDropDownMenu: TdxBarPopupMenu;
|
|
FGroupIndex: Integer;
|
|
FLowered: Boolean;
|
|
FPaintStyle: TdxBarPaintStyle;
|
|
|
|
procedure SetAllowAllUp(Value: Boolean);
|
|
procedure SetButtonStyle(Value: TdxBarButtonStyle);
|
|
procedure SetDown(Value: Boolean);
|
|
procedure SetDropDownEnabled(Value: Boolean);
|
|
procedure SetDropDownMenu(Value: TdxBarPopupMenu);
|
|
procedure SetGroupIndex(Value: Integer);
|
|
procedure SetLowered(Value: Boolean);
|
|
procedure SetPaintStyle(Value: TdxBarPaintStyle);
|
|
|
|
function IsDownStored: Boolean;
|
|
protected
|
|
procedure ButtonStyleChanged; virtual;
|
|
function CanChangePaintStyle: Boolean; virtual;
|
|
procedure DownChanged; virtual;
|
|
procedure DoDropDown(AControl: TdxBarButtonControl; X, Y: Integer;
|
|
ByMouse: Boolean); dynamic;
|
|
procedure DropDownEnabledChanged; virtual;
|
|
function HasAccel(AItemLink: TdxBarItemLink): Boolean; override;
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
|
procedure PaintStyleChanged; virtual;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
procedure Click; override;
|
|
published
|
|
property AllowAllUp: Boolean read FAllowAllUp write SetAllowAllUp default False;
|
|
property ButtonStyle: TdxBarButtonStyle read FButtonStyle write SetButtonStyle
|
|
default bsDefault;
|
|
property CloseSubMenuOnClick: Boolean read FCloseSubMenuOnClick write FCloseSubMenuOnClick
|
|
default True;
|
|
property DropDownEnabled: Boolean read FDropDownEnabled write SetDropDownEnabled default True;
|
|
property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0; // must be here
|
|
property Down: Boolean read FDown write SetDown
|
|
stored IsDownStored default False;
|
|
property DropDownMenu: TdxBarPopupMenu read FDropDownMenu write SetDropDownMenu;
|
|
property Glyph;
|
|
property ImageIndex;
|
|
property Lowered: Boolean read FLowered write SetLowered default False;
|
|
property PaintStyle: TdxBarPaintStyle read FPaintStyle write SetPaintStyle default psStandard;
|
|
property ShortCut;
|
|
property UnclickAfterDoing default True;
|
|
|
|
property OnClick;
|
|
end;
|
|
|
|
TdxBarEdit = class(TdxBarWindowItem)
|
|
private
|
|
FMaxLength: Integer;
|
|
FReadOnly: Boolean;
|
|
FShowCaption: Boolean;
|
|
FWidth: Integer;
|
|
|
|
procedure SetMaxLength(Value: Integer);
|
|
procedure SetShowCaption(Value: Boolean);
|
|
procedure SetWidth(Value: Integer);
|
|
protected
|
|
procedure DrawInterior(ABarEditControl: TdxBarEditControl; ACanvas: TCanvas;
|
|
R: TRect; ItemLink: TdxBarItemLink); virtual;
|
|
function HasAccel(AItemLink: TdxBarItemLink): Boolean; override;
|
|
procedure WidthChanged; virtual;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
published
|
|
property Glyph;
|
|
property ImageIndex;
|
|
property MaxLength: Integer read FMaxLength write SetMaxLength default 0;
|
|
property ReadOnly: Boolean read FReadOnly write FReadOnly default False;
|
|
property ShowCaption: Boolean read FShowCaption write SetShowCaption default False;
|
|
property Width: Integer read FWidth write SetWidth;
|
|
|
|
property OnClick;
|
|
end;
|
|
|
|
TCustomdxBarCombo = class;
|
|
|
|
TdxBarCheckKeyForDropDownWindowEvent = procedure (Sender: TCustomdxBarCombo;
|
|
Key: Word; Shift: TShiftState; var AcceptKey: Boolean) of object;
|
|
TdxBarGetDropDownWindowEvent = procedure (Sender: TCustomdxBarCombo;
|
|
var Window: HWND) of object;
|
|
|
|
TCustomdxBarCombo = class(TdxBarEdit)
|
|
private
|
|
FOnCheckKeyForDropDownWindow: TdxBarCheckKeyForDropDownWindowEvent;
|
|
FOnCloseUp: TNotifyEvent;
|
|
FOnDropDown: TNotifyEvent;
|
|
FOnGetDropDownWindow: TdxBarGetDropDownWindowEvent;
|
|
function GetDroppedDown: Boolean;
|
|
function GetShowEditor: Boolean;
|
|
procedure SetDroppedDown(Value: Boolean);
|
|
procedure SetShowEditor(Value: Boolean);
|
|
protected
|
|
procedure AfterDropDown; dynamic;
|
|
procedure CheckDropDownPoint(var X, Y: Integer);
|
|
function CheckKeyForDropDownWindow(Key: Word; Shift: TShiftState): Boolean; virtual;
|
|
procedure CloseUp; dynamic;
|
|
procedure DropDown(X, Y: Integer); dynamic;
|
|
function GetDropDownWindow: HWND; virtual;
|
|
procedure InitDropDownWindow; virtual;
|
|
public
|
|
property DropDownWindow: HWND read GetDropDownWindow;
|
|
property DroppedDown: Boolean read GetDroppedDown write SetDroppedDown;
|
|
published
|
|
property ShowEditor: Boolean read GetShowEditor write SetShowEditor default True;
|
|
|
|
property OnCheckKeyForDropDownWindow: TdxBarCheckKeyForDropDownWindowEvent
|
|
read FOnCheckKeyForDropDownWindow write FOnCheckKeyForDropDownWindow;
|
|
property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp;
|
|
property OnDropDown: TNotifyEvent read FOnDropDown write FOnDropDown;
|
|
property OnGetDropDownWindow: TdxBarGetDropDownWindowEvent
|
|
read FOnGetDropDownWindow write FOnGetDropDownWindow;
|
|
end;
|
|
|
|
TdxBarCustomCombo = class;
|
|
|
|
TdxBarDrawItemEvent = procedure(Sender: TdxBarCustomCombo; AIndex: Integer;
|
|
ARect: TRect; AState: TOwnerDrawState) of object;
|
|
|
|
TdxBarMeasureItemEvent = procedure(Sender: TdxBarCustomCombo; AIndex: Integer;
|
|
var AHeight: Integer) of object;
|
|
|
|
TdxBarCustomCombo = class(TCustomdxBarCombo)
|
|
private
|
|
FDropDownCount: Integer;
|
|
FDropDownWidth: Integer;
|
|
FInteriorIsDrawing: Boolean;
|
|
FItemHeight: Integer;
|
|
FItemIndex: Integer;
|
|
FItems: TStrings;
|
|
FListBox: TCustomListBox;
|
|
FSorted: Boolean;
|
|
FOnDrawItem: TdxBarDrawItemEvent;
|
|
FOnMeasureItem: TdxBarMeasureItemEvent;
|
|
|
|
function GetCurItemIndex: Integer;
|
|
function GetItemsHeight(Index: Integer): Integer;
|
|
procedure SetCurItemIndex(Value: Integer);
|
|
procedure SetItemIndex(Value: Integer);
|
|
procedure SetItems(Value: TStrings);
|
|
procedure SetSorted(Value: Boolean);
|
|
|
|
procedure CheckLocalPos;
|
|
procedure ItemsChanged(Sender: TObject);
|
|
procedure ListBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect;
|
|
State: TOwnerDrawState);
|
|
procedure ListBoxMeasureItem(Control: TWinControl; Index: Integer; var Height: Integer);
|
|
protected
|
|
FCanvas: TCanvas;
|
|
procedure AfterDropDown; override;
|
|
function CheckKeyForDropDownWindow(Key: Word; Shift: TShiftState): Boolean; override;
|
|
procedure CloseUp; override;
|
|
procedure CurChange; override;
|
|
procedure DrawInterior(ABarEditControl: TdxBarEditControl; ACanvas: TCanvas;
|
|
R: TRect; ItemLink: TdxBarItemLink); override;
|
|
procedure DrawItem(AIndex: Integer; ARect: TRect; AState: TOwnerDrawState); virtual;
|
|
procedure DropDown(X, Y: Integer); override;
|
|
function GetCanvas: TCanvas; virtual;
|
|
function GetDropDownWidth: Integer; virtual;
|
|
function GetDropDownWindow: HWND; override;
|
|
function GetNearestItemIndex(AText: string): Integer;
|
|
procedure InitDropDownWindow; override;
|
|
procedure MeasureItem(AIndex: Integer; var AHeight: Integer); virtual;
|
|
procedure MeasureItemWidth(AIndex: Integer; var AWidth: Integer); virtual;
|
|
procedure SetText(Value: string); override;
|
|
property ListBox: TCustomListBox read FListBox;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
|
|
property Canvas: TCanvas read GetCanvas;
|
|
property CurItemIndex: Integer read GetCurItemIndex write SetCurItemIndex;
|
|
property ItemHeight: Integer read FItemHeight write FItemHeight default 0;
|
|
property Items: TStrings read FItems write SetItems;
|
|
property ItemsHeight[Index: Integer]: Integer read GetItemsHeight;
|
|
property Sorted: Boolean read FSorted write SetSorted default False;
|
|
property ItemIndex: Integer read FItemIndex write SetItemIndex; // loading after all
|
|
published
|
|
property DropDownCount: Integer read FDropDownCount write FDropDownCount default 8;
|
|
property DropDownWidth: Integer read FDropDownWidth write FDropDownWidth default 0;
|
|
|
|
property OnDrawItem: TdxBarDrawItemEvent read FOnDrawItem write FOnDrawItem;
|
|
property OnMeasureItem: TdxBarMeasureItemEvent read FOnMeasureItem write FOnMeasureItem;
|
|
end;
|
|
|
|
TdxBarCombo = class(TdxBarCustomCombo)
|
|
published
|
|
property ItemHeight;
|
|
property Items;
|
|
property Sorted;
|
|
property ItemIndex; // loading after all
|
|
end;
|
|
|
|
TCustomdxBarSubItem = class(TdxBarItem)
|
|
private
|
|
FBarSize: Integer;
|
|
FDetachable: Boolean;
|
|
FDetachingBar: TdxBar;
|
|
FItemLinks: TdxBarItemLinks;
|
|
FShowCaption: Boolean;
|
|
FOnCloseUp: TNotifyEvent;
|
|
FOnDetaching: TNotifyEvent;
|
|
FOnPaintBar: TdxBarPaintSubMenuBarEvent;
|
|
FOnPopup: TNotifyEvent;
|
|
function GetDetachingBarIndex: Integer;
|
|
procedure SetBarSize(Value: Integer);
|
|
procedure SetDetachingBar(Value: Integer);
|
|
procedure SetItemLinks(Value: TdxBarItemLinks);
|
|
procedure SetShowCaption(Value: Boolean);
|
|
protected
|
|
procedure BarManagerChanged; override;
|
|
function CanClicked: Boolean; override;
|
|
procedure DoCloseUp; dynamic;
|
|
procedure DoDetaching; dynamic;
|
|
procedure DoPaintBar(Canvas: TCanvas; const R: TRect); virtual;
|
|
procedure DoPopup; dynamic;
|
|
function HasDesignTimeLinks: Boolean; virtual;
|
|
function IsShortCut(AShortCut: TShortCut): Boolean;
|
|
procedure ObjectNotification(AOperation: TOperation; AObject: TObject); override;
|
|
|
|
property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp;
|
|
property OnPopup: TNotifyEvent read FOnPopup write FOnPopup;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
function CanContainItem(AItem: TdxBarItem): Boolean;
|
|
function GetDetachingBar: TdxBar;
|
|
procedure DropDown;
|
|
|
|
property ItemLinks: TdxBarItemLinks read FItemLinks write SetItemLinks;
|
|
published
|
|
property BarSize: Integer read FBarSize write SetBarSize default 0;
|
|
property Detachable: Boolean read FDetachable write FDetachable default False;
|
|
property DetachingBar: Integer read GetDetachingBarIndex write SetDetachingBar
|
|
default -1;
|
|
property Glyph;
|
|
property ImageIndex;
|
|
property ShowCaption: Boolean read FShowCaption write SetShowCaption default True;
|
|
property OnClick;
|
|
property OnDetaching: TNotifyEvent read FOnDetaching write FOnDetaching;
|
|
property OnPaintBar: TdxBarPaintSubMenuBarEvent read FOnPaintBar write FOnPaintBar;
|
|
end;
|
|
|
|
TdxBarSubItem = class(TCustomdxBarSubItem)
|
|
private
|
|
FAllowCustomizing: Boolean;
|
|
FIsInternal: Boolean;
|
|
protected
|
|
function HasDesignTimeLinks: Boolean; override;
|
|
property IsInternal: Boolean read FIsInternal;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
published
|
|
property AllowCustomizing: Boolean read FAllowCustomizing write FAllowCustomizing
|
|
default True;
|
|
property ItemLinks;
|
|
property OnCloseUp;
|
|
property OnPopup;
|
|
end;
|
|
|
|
TCustomdxBarContainerItem = class(TCustomdxBarSubItem)
|
|
private
|
|
FInOnGetData: Boolean;
|
|
FNeedClearItemList: Boolean;
|
|
FOnGetData: TNotifyEvent;
|
|
protected
|
|
procedure AddListedItemLinks(AItemLinks: TdxBarItemLinks; AIndex: Integer;
|
|
FirstCall: Boolean; CallingItemLink: TdxBarItemLink); virtual;
|
|
procedure DeleteListedItemLinks(AItemLinks: TdxBarItemLinks; AIndex: Integer); virtual;
|
|
procedure ClearItemList; virtual;
|
|
function HideWhenRun: Boolean; virtual;
|
|
function InternalActuallyVisible: Boolean; override;
|
|
procedure ItemLinksChanged; virtual;
|
|
procedure NeedClearItemList;
|
|
public
|
|
destructor Destroy; override;
|
|
published
|
|
property OnGetData: TNotifyEvent read FOnGetData write FOnGetData;
|
|
end;
|
|
|
|
TdxBarListItem = class(TCustomdxBarContainerItem)
|
|
private
|
|
FItemIndex: Integer;
|
|
FItemList: TList;
|
|
FItems: TStrings;
|
|
FShowCheck: Boolean;
|
|
FShowNumbers: Boolean;
|
|
function GetDataIndex: Integer;
|
|
procedure SetDataIndex(Value: Integer);
|
|
procedure SetItems(Value: TStrings);
|
|
procedure ClickItem(Sender: TObject);
|
|
procedure ItemsChanged(Sender: TObject);
|
|
protected
|
|
procedure AddListedItemLinks(AItemLinks: TdxBarItemLinks; AIndex: Integer;
|
|
FirstCall: Boolean; CallingItemLink: TdxBarItemLink); override;
|
|
procedure ClearItemList; override;
|
|
procedure DeleteListedItemLinks(AItemLinks: TdxBarItemLinks; AIndex: Integer); override;
|
|
function GetDisplayText(const AText: string): string; virtual;
|
|
function InternalActuallyVisible: Boolean; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure DirectClick; override;
|
|
property ItemList: TList read FItemList;
|
|
published
|
|
property DataIndex: Integer read GetDataIndex write SetDataIndex stored False;
|
|
property ItemIndex: Integer read FItemIndex write FItemIndex default -1;
|
|
property Items: TStrings read FItems write SetItems;
|
|
property ShowCheck: Boolean read FShowCheck write FShowCheck default False;
|
|
property ShowNumbers: Boolean read FShowNumbers write FShowNumbers default True;
|
|
end;
|
|
|
|
TdxBarContainerItem = class(TCustomdxBarContainerItem)
|
|
protected
|
|
procedure AddListedItemLinks(AItemLinks: TdxBarItemLinks; AIndex: Integer;
|
|
FirstCall: Boolean; CallingItemLink: TdxBarItemLink); override;
|
|
procedure DeleteListedItemLinks(AItemLinks: TdxBarItemLinks; AIndex: Integer); override;
|
|
function InternalActuallyVisible: Boolean; override;
|
|
function IsItemsExist: Boolean; virtual;
|
|
published
|
|
property ItemLinks;
|
|
end;
|
|
|
|
TdxBarPaintType = (ptHorz, ptMenu, ptVert);
|
|
|
|
{--------------------------------------
|
|
Item's controls
|
|
--------------------------------------}
|
|
|
|
TdxBarItemControlClass = class of TdxBarItemControl;
|
|
|
|
TdxBarItemControl = class(TObject)
|
|
private
|
|
FBeginGroupRect: TRect;
|
|
FBreakingRow: Boolean;
|
|
FChangeRecentGroup: Boolean;
|
|
FHasWindow: Boolean;
|
|
FIsActive: Boolean;
|
|
FItemLink: TdxBarItemLink;
|
|
FLastInRow: Boolean;
|
|
FNonRecent: Boolean;
|
|
FParent: TCustomdxBarControl;
|
|
FPressed: Boolean;
|
|
FSelectedByMouse: Boolean;
|
|
|
|
function GetAlign: TdxBarItemAlign;
|
|
function GetBarManager: TdxBarManager;
|
|
function GetFlat: Boolean;
|
|
function GetIsSelected: Boolean;
|
|
function GetItem: TdxBarItem;
|
|
function GetNormalItemHeightInSubMenu: Integer;
|
|
function GetRealHeight: Integer;
|
|
function GetRealWidth: Integer;
|
|
function GetUnclickAfterDoing: Boolean;
|
|
procedure SetPressed(Value: Boolean);
|
|
protected
|
|
procedure AlignChanged; dynamic;
|
|
procedure BeforeDestroyParentHandle; virtual;
|
|
procedure BeginGroupChanged; virtual;
|
|
procedure CaptionChanged; virtual;
|
|
procedure EnabledChanged; virtual;
|
|
procedure GlyphChanged; virtual;
|
|
procedure PressedChanged; virtual;
|
|
procedure RealVisibleChanging(AVisible: Boolean); virtual;
|
|
procedure ShortCutChanged; virtual;
|
|
procedure VisibleChanged; virtual;
|
|
|
|
function CanClicked: Boolean; virtual;
|
|
function CanCustomize: Boolean; virtual;
|
|
function CanMouseSelect: Boolean; virtual;
|
|
function CanSelect: Boolean; virtual;
|
|
function CanVisuallyPressed: Boolean;
|
|
procedure Click(ByMouse: Boolean); virtual;
|
|
procedure ControlActivate(Immediately: Boolean); virtual;
|
|
procedure ControlInactivate(Immediately: Boolean); virtual;
|
|
procedure ControlClick(ByMouse: Boolean); virtual;
|
|
procedure ControlUnclick(ByMouse: Boolean); virtual;
|
|
procedure DblClick; dynamic;
|
|
function DrawSelected: Boolean; virtual;
|
|
function WantsDblClick: Boolean; dynamic;
|
|
|
|
procedure KeyDown(Key: Word); virtual;
|
|
function WantsKey(Key: Word): Boolean; virtual;
|
|
|
|
procedure DrawLowered(DC: HDC; var R: TRect);
|
|
procedure DrawGlyph(R: TRect; FullBounds: PRect; PaintType: TdxBarPaintType;
|
|
IsGlyphEmpty, Selected, Down, DrawDowned, Center, ForceUseBkBrush,
|
|
BarControlOwner, IsSplit: Boolean);
|
|
procedure DrawGlyphAndBkgnd(R: TRect; const GlyphRect: TRect; PaintType: TdxBarPaintType;
|
|
AGlyph: TBitmap; AImages: TCurImageList; AImageIndex: Integer;
|
|
IsGlyphEmpty, Selected, Down, DrawDowned, ForceUseBkBrush, GrayScale,
|
|
BarControlOwner, IsSplit: Boolean);
|
|
procedure DrawGlyphAndTextInSubMenu(DC: HDC; var R: TRect;
|
|
Selected, ShowGlyph, Down: Boolean);
|
|
procedure DrawItemText(DC: HDC; S: string; PaintRect: TRect;
|
|
Alignment: UINT; Enabled, Selected, Rotated, Clipped, FlatText: Boolean);
|
|
procedure FrameAndFillRect(DC: HDC; var R: TRect; Enabled, Selected, Pressed: Boolean);
|
|
procedure GetArrowParams(APaintType: TdxBarPaintType;
|
|
AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH; var AArrowColor: COLORREF); virtual;
|
|
|
|
function GetCaption: string; virtual;
|
|
function GetEnabled: Boolean; virtual;
|
|
function GetGlyph: TBitmap; virtual;
|
|
function GetImageIndex: Integer; virtual;
|
|
function GetImages(AInToolbar: Boolean): TCurImageList; virtual;
|
|
function GetHint: string; virtual;
|
|
function GetHotImages: TCurImageList; virtual;
|
|
function GetImageEnabled(APaintType: TdxBarPaintType): Boolean; virtual;
|
|
function GetLargeImages: TCurImageList; virtual;
|
|
function GetPainterClass: TdxBarItemControlPainterClass; virtual;
|
|
function GetShortCut: TShortCut; virtual;
|
|
function GetTextAreaOffset: Integer; virtual;
|
|
|
|
function GetHeight: Integer; virtual;
|
|
function GetMinHeight: Integer; virtual;
|
|
function GetMinWidth: Integer; virtual;
|
|
function GetOwnedBarControl: TCustomdxBarControl; virtual;
|
|
function GetWidth: Integer; virtual;
|
|
function HasHint: Boolean; virtual;
|
|
function HasShadow: Boolean; virtual;
|
|
function ImageExists: Boolean;
|
|
function ImageIndexLinked: Boolean;
|
|
function IsDestroyOnClick: Boolean; virtual;
|
|
function IsExpandable: Boolean; virtual;
|
|
function IsInvertTextColor: Boolean; virtual;
|
|
function MousePressed: Boolean;
|
|
function NeedCaptureMouse: Boolean; virtual;
|
|
procedure Paint(ARect: TRect; PaintType: TdxBarPaintType); virtual;
|
|
function ParentIsQuickCustControl: Boolean;
|
|
function WantMouse: Boolean;
|
|
|
|
procedure CheckNonRecent;
|
|
procedure UncheckNonRecent;
|
|
|
|
property Align: TdxBarItemAlign read GetAlign;
|
|
property Caption: string read GetCaption;
|
|
property Enabled: Boolean read GetEnabled;
|
|
property Flat: Boolean read GetFlat;
|
|
property Glyph: TBitmap read GetGlyph;
|
|
property Height: Integer read GetRealHeight;
|
|
property Hint: string read GetHint;
|
|
property HotImages: TCurImageList read GetHotImages;
|
|
property ImageIndex: Integer read GetImageIndex;
|
|
property Images[AInToolbar: Boolean]: TCurImageList read GetImages;
|
|
property LargeImages: TCurImageList read GetLargeImages;
|
|
property MinHeight: Integer read GetMinHeight;
|
|
property MinWidth: Integer read GetMinWidth;
|
|
property NormalItemHeightInSubMenu: Integer read GetNormalItemHeightInSubMenu;
|
|
property OwnedBarControl: TCustomdxBarControl read GetOwnedBarControl;
|
|
property Pressed: Boolean read FPressed write SetPressed;
|
|
property ShortCut: TShortCut read GetShortCut;
|
|
property TextAreaOffset: Integer read GetTextAreaOffset;
|
|
property UnclickAfterDoing: Boolean read GetUnclickAfterDoing;
|
|
property Width: Integer read GetRealWidth;
|
|
public
|
|
constructor Create(AItemLink: TdxBarItemLink); virtual;
|
|
destructor Destroy; override;
|
|
procedure Repaint; virtual;
|
|
|
|
property BarManager: TdxBarManager read GetBarManager;
|
|
property HasWindow: Boolean read FHasWindow;
|
|
property IsActive: Boolean read FIsActive;
|
|
property IsSelected: Boolean read GetIsSelected;
|
|
property Item: TdxBarItem read GetItem;
|
|
property ItemLink: TdxBarItemLink read FItemLink;
|
|
property PainterClass: TdxBarItemControlPainterClass read GetPainterClass;
|
|
property Parent: TCustomdxBarControl read FParent;
|
|
end;
|
|
|
|
TdxBarWinControl = class(TdxBarItemControl)
|
|
private
|
|
FDefWndProc: Pointer;
|
|
FFocused: Boolean;
|
|
FFocusing: Boolean;
|
|
FHandle: HWND;
|
|
FKeyPressedInside: Integer;
|
|
FPrevDefWndProc: Pointer;
|
|
FPrevFocusedControl: HWND;
|
|
FWindowRect: TRect;
|
|
function GetItem: TdxBarWindowItem;
|
|
function GetWindowRect: TRect;
|
|
procedure SetWindowRect(const Value: TRect);
|
|
protected
|
|
function CanClicked: Boolean; override;
|
|
procedure ControlInactivate(Immediately: Boolean); override;
|
|
procedure ControlClick(ByMouse: Boolean); override;
|
|
procedure CreateWindowHandle; virtual;
|
|
procedure DestroyWindowHandle; virtual;
|
|
function DoKeyDown(var Message: TWMKey): Boolean;
|
|
function DoKeyPress(var Message: TWMKey): Boolean;
|
|
function DoKeyUp(var Message: TWMKey): Boolean;
|
|
procedure EnabledChanged; override;
|
|
function GetText: string; virtual;
|
|
function IsDestroyOnClick: Boolean; override;
|
|
procedure SetFocused(Value: Boolean); virtual;
|
|
procedure SetText(Value: string); virtual;
|
|
procedure WndProc(var Message: TMessage); virtual;
|
|
public
|
|
constructor Create(AItemLink: TdxBarItemLink); override;
|
|
destructor Destroy; override;
|
|
property Focused: Boolean read FFocused write SetFocused;
|
|
property Handle: HWND read FHandle;
|
|
property Item: TdxBarWindowItem read GetItem;
|
|
property Text: string read GetText write SetText;
|
|
property WindowRect: TRect read GetWindowRect write SetWindowRect;
|
|
end;
|
|
|
|
TdxBarButtonControl = class(TdxBarItemControl)
|
|
private
|
|
FDroppedDown: Boolean;
|
|
FShowAnimation: Boolean;
|
|
function GetButtonStyle: TdxBarButtonStyle;
|
|
function GetDown: Boolean;
|
|
function GetDropDownEnabled: Boolean;
|
|
function GetDropDownMenuControl: TdxBarSubMenuControl;
|
|
function GetDroppedDownFlat: Boolean;
|
|
function GetGroupIndex: Integer;
|
|
function GetItem: TdxBarButton;
|
|
function GetLowered: Boolean;
|
|
function GetPaintStyle: TdxBarPaintStyle;
|
|
function MouseOverArrow: Boolean;
|
|
protected
|
|
function ArrowPressed: Boolean;
|
|
function ArrowWidth: Integer; virtual;
|
|
procedure ButtonStyleChanged; virtual;
|
|
procedure ControlInactivate(Immediately: Boolean); override;
|
|
procedure ControlClick(ByMouse: Boolean); override;
|
|
procedure ControlUnclick(ByMouse: Boolean); override;
|
|
procedure DoCloseUp; dynamic;
|
|
procedure DoDropDown(ByMouse: Boolean); dynamic;
|
|
procedure DownChanged; virtual;
|
|
procedure DrawArrow(const ARect: TRect; Selected, DrawDowned: Boolean; PaintType: TdxBarPaintType);
|
|
function DrawSelected: Boolean; override;
|
|
procedure DropDownEnabledChanged; virtual;
|
|
procedure GlyphChanged; override;
|
|
function GetDefaultHeight: Integer; virtual;
|
|
function GetDefaultWidth: Integer; virtual;
|
|
function GetHeight: Integer; override;
|
|
function GetOwnedBarControl: TCustomdxBarControl; override;
|
|
function GetWidth: Integer; override;
|
|
function IsDestroyOnClick: Boolean; override;
|
|
function IsFlatTextSelected(APressed: Boolean): Boolean;
|
|
procedure KeyDown(Key: Word); override;
|
|
function NeedCaptureMouse: Boolean; override;
|
|
procedure Paint(ARect: TRect; PaintType: TdxBarPaintType); override;
|
|
procedure PaintStyleChanged; virtual;
|
|
procedure PreparePaintStyleOnBar(var APaintStyle: TdxBarPaintStyle); virtual;
|
|
function WantsKey(Key: Word): Boolean; override;
|
|
|
|
property ButtonStyle: TdxBarButtonStyle read GetButtonStyle;
|
|
property Down: Boolean read GetDown;
|
|
property DropDownEnabled: Boolean read GetDropDownEnabled;
|
|
property DropDownMenuControl: TdxBarSubMenuControl read GetDropDownMenuControl;
|
|
property DroppedDown: Boolean read FDroppedDown;
|
|
property DroppedDownFlat: Boolean read GetDroppedDownFlat; // TODO: obsolete
|
|
property GroupIndex: Integer read GetGroupIndex;
|
|
property Lowered: Boolean read GetLowered;
|
|
property PaintStyle: TdxBarPaintStyle read GetPaintStyle;
|
|
public
|
|
property Item: TdxBarButton read GetItem;
|
|
end;
|
|
|
|
TdxBarEditControl = class(TdxBarWinControl)
|
|
private
|
|
function GetCaptionWidth: Integer;
|
|
function GetItem: TdxBarEdit;
|
|
function GetMaxLength: Integer;
|
|
function GetReadOnly: Boolean;
|
|
function GetShowCaption: Boolean;
|
|
protected
|
|
procedure ControlClick(ByMouse: Boolean); override;
|
|
procedure CreateWindowHandle; override;
|
|
procedure DrawBorder(DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType;
|
|
Selected: Boolean);
|
|
procedure DrawCaption(DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType;
|
|
Selected: Boolean);
|
|
function DrawSelected: Boolean; override;
|
|
procedure DrawTextField(DC: HDC; const ARect: TRect);
|
|
function GetHeight: Integer; override;
|
|
function GetMinWidth: Integer; override;
|
|
function GetWidth: Integer; override;
|
|
procedure Paint(ARect: TRect; PaintType: TdxBarPaintType); override;
|
|
procedure SetFocused(Value: Boolean); override;
|
|
procedure SetText(Value: string); override;
|
|
procedure WidthChanged; virtual;
|
|
procedure WndProc(var Message: TMessage); override;
|
|
|
|
property CaptionWidth: Integer read GetCaptionWidth;
|
|
property MaxLength: Integer read GetMaxLength;
|
|
property ReadOnly: Boolean read GetReadOnly;
|
|
property ShowCaption: Boolean read GetShowCaption;
|
|
public
|
|
property Item: TdxBarEdit read GetItem;
|
|
end;
|
|
|
|
TCustomdxBarComboControl = class(TdxBarEditControl)
|
|
private
|
|
FDropDownButtonRect: TRect;
|
|
FOnPressDroppedDown: Boolean;
|
|
FDroppedDown: Boolean;
|
|
|
|
function GetDropDownWindow: HWND;
|
|
function GetItem: TCustomdxBarCombo;
|
|
protected
|
|
procedure ControlInactivate(Immediately: Boolean); override;
|
|
procedure EnabledChanged; override;
|
|
procedure GetArrowParams(APaintType: TdxBarPaintType;
|
|
AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH; var AArrowColor: COLORREF); override; // obsolete
|
|
procedure Paint(ARect: TRect; PaintType: TdxBarPaintType); override;
|
|
procedure SetDroppedDown(Value: Boolean); virtual;
|
|
procedure WndProc(var Message: TMessage); override;
|
|
|
|
property DropDownButtonRect: TRect read FDropDownButtonRect;
|
|
property DropDownWindow: HWND read GetDropDownWindow;
|
|
public
|
|
property DroppedDown: Boolean read FDroppedDown write SetDroppedDown;
|
|
property Item: TCustomdxBarCombo read GetItem;
|
|
end;
|
|
|
|
TdxBarComboControl = class(TCustomdxBarComboControl)
|
|
private
|
|
FLocalItemIndex: Integer;
|
|
function GetItem: TdxBarCustomCombo;
|
|
function GetItemIndex: Integer;
|
|
function GetItems: TStrings;
|
|
function GetSorted: Boolean;
|
|
procedure SetLocalItemIndex(Value: Integer);
|
|
protected
|
|
procedure SetFocused(Value: Boolean); override;
|
|
procedure WndProc(var Message: TMessage); override;
|
|
|
|
property ItemIndex: Integer read GetItemIndex;
|
|
property Items: TStrings read GetItems;
|
|
property Sorted: Boolean read GetSorted;
|
|
public
|
|
property Item: TdxBarCustomCombo read GetItem;
|
|
property LocalItemIndex: Integer read FLocalItemIndex write SetLocalItemIndex;
|
|
end;
|
|
|
|
TdxBarSubItemControl = class(TdxBarItemControl)
|
|
private
|
|
FShowAnimation: Boolean;
|
|
function GetCaptionOffset: Integer;
|
|
function GetItem: TCustomdxBarSubItem;
|
|
protected
|
|
procedure GlyphChanged; override;
|
|
function GetSubMenuControl: TdxBarSubMenuControl; virtual;
|
|
function CanClicked: Boolean; override;
|
|
procedure ControlActivate(Immediately: Boolean); override;
|
|
procedure ControlInactivate(Immediately: Boolean); override;
|
|
procedure ControlClick(ByMouse: Boolean); override;
|
|
procedure CreateSubMenuControl; virtual;
|
|
procedure DoCreateSubMenuControl;
|
|
function GetDefaultHeight: Integer; virtual;
|
|
function GetDefaultWidth: Integer; virtual;
|
|
function GetHeight: Integer; override;
|
|
function GetOwnedBarControl: TCustomdxBarControl; override;
|
|
function GetWidth: Integer; override;
|
|
function HasSubMenu: Boolean; virtual;
|
|
function IsDestroyOnClick: Boolean; override;
|
|
function IsExpandable: Boolean; override;
|
|
procedure KeyDown(Key: Word); override;
|
|
procedure Paint(ARect: TRect; PaintType: TdxBarPaintType); override;
|
|
function WantsDblClick: Boolean; override;
|
|
function WantsKey(Key: Word): Boolean; override;
|
|
property CaptionOffset: Integer read GetCaptionOffset;
|
|
public
|
|
destructor Destroy; override;
|
|
property Item: TCustomdxBarSubItem read GetItem;
|
|
property SubMenuControl: TdxBarSubMenuControl read GetSubMenuControl;
|
|
end;
|
|
|
|
TdxBarContainerItemControl = class(TdxBarSubItemControl)
|
|
private
|
|
function GetItem: TCustomdxBarContainerItem;
|
|
protected
|
|
procedure CreateSubMenuControl; override;
|
|
function GetCaption: string; override;
|
|
function IsExpandable: Boolean; override;
|
|
procedure Paint(ARect: TRect; PaintType: TdxBarPaintType); override;
|
|
function ShowRealCaption: Boolean;
|
|
public
|
|
property Item: TCustomdxBarContainerItem read GetItem;
|
|
end;
|
|
|
|
{--------------------------------------
|
|
Item's painters
|
|
--------------------------------------}
|
|
// TODO: rename TdxBarItemControlPainter to TdxBarPainter?
|
|
|
|
TdxArrowType = ({atLeft, }atRight, {atUp, }atDown);
|
|
|
|
TdxBarItemControlPainter = class
|
|
protected
|
|
// Common
|
|
class procedure DrawGlyphBorder(ABarItemControl: TdxBarItemControl; DC: HDC; ABrush: HBRUSH;
|
|
NeedBorder: Boolean; R: TRect; PaintType: TdxBarPaintType; IsGlyphEmpty,
|
|
Selected, Down, DrawDowned, BarControlOwner, IsSplit: Boolean); virtual;
|
|
class procedure DrawGlyphCheckMark(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
X, Y, DoubleSize: Integer); virtual;
|
|
class procedure DrawGlyphEmptyImage(ABarItemControl: TdxBarItemControl; DC: HDC; R: TRect;
|
|
ABrush: HBRUSH; NeedBorder: Boolean; PaintType: TdxBarPaintType; Selected,
|
|
Down, DrawDowned: Boolean); virtual;
|
|
class procedure DrawGlyphImage(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; const GlyphRect: TRect;
|
|
AGlyph: TBitmap; AImages: TCurImageList; AImageIndex: Integer; Selected,
|
|
Down, DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner: Boolean;
|
|
PaintType: TdxBarPaintType); virtual;
|
|
class procedure DrawItemArrow(DC: HDC; R: TRect; ArrowType: TdxArrowType;
|
|
Enabled, Selected, Flat: Boolean); virtual;
|
|
class procedure DrawLargeItemArrow(DC: HDC; R: TRect; ArrowType: TdxArrowType;
|
|
Size: Integer; Selected, Enabled, Flat: Boolean); virtual;
|
|
class procedure GetEditColors(ABarItemControl: TdxBarItemControl; var ATextColor,
|
|
ABkColor: COLORREF); virtual;
|
|
class function GetFadedColor(ABarControl: TCustomdxBarControl): TColor; virtual;
|
|
class procedure GetTextColors(ABarItemControl: TdxBarItemControl; AEnabled,
|
|
ASelected, AFlat: Boolean; var AColor1, AColor2: TColor); virtual;
|
|
class function IgnoreGlyphOpaque: Boolean; virtual;
|
|
class function IgnoreNonRecentColor: Boolean; virtual;
|
|
class function IsMenuItem(ABarItemControl: TdxBarItemControl): Boolean; virtual;
|
|
// Bar
|
|
class function BarIsBarSmall(ABarControl: TdxBarControl; const R: TRect): Boolean; virtual;
|
|
class function BarCaptionBkColor(ABarControl: TdxBarControl; AMainFormActive: Boolean): COLORREF; virtual;
|
|
class function BarCaptionColor(ABarControl: TdxBarControl): COLORREF; virtual;
|
|
class function BarMarkArrowColor(ABarControl: TdxBarControl; AState: TdxBarMarkState): COLORREF; virtual;
|
|
class procedure BarDrawGrip(ABarControl: TdxBarControl; DC: HDC; R: TRect;
|
|
AToolbarBrush: HBRUSH); virtual;
|
|
class procedure BarDrawMarkArrow(ABarControl: TdxBarControl; DC: HDC; MarkR: TRect); virtual;
|
|
class procedure BarDrawMarkAtPos(ABarControl: TdxBarControl; DC: HDC;
|
|
const ItemRect: TRect; Offset: Integer); virtual;
|
|
class procedure BarDrawMarkBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect; AToolbarBrush: HBRUSH); virtual;
|
|
class procedure BarDrawMarkElements(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect); virtual;
|
|
class procedure BarOffsetFloatingBarCaption(ABarControl: TdxBarControl;
|
|
var X: Integer; var R: TRect); virtual;
|
|
class function GetDrawMarkElementColor(ABarControl: TdxBarControl): Integer; virtual;
|
|
// ComboControl
|
|
class procedure ComboControlDrawOneArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; X, Y, Size: Integer; Color: COLORREF); virtual;
|
|
// SubMenuControl
|
|
class procedure SubMenuControlDrawArrow(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect; UpArrow: Boolean); virtual;
|
|
class procedure SubMenuControlDrawMark(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect; ASelected: Boolean); virtual;
|
|
// Edit
|
|
class procedure EditOffsetInteriorRect(var R: TRect); virtual;
|
|
// SpinEditControl
|
|
class procedure SpinEditControlDrawOneArrow(DC: HDC; X, Y, XSize, YSize, Color: Integer;
|
|
AButton: TdxBarSpinEditButton);
|
|
// DateNavigator
|
|
class procedure DateNavigatorDrawButtonCaption(DC: HDC; R: TRect; Offset: Integer;
|
|
const ACaption: string; AOpaque: Boolean); virtual;
|
|
public
|
|
// Common
|
|
class procedure DrawBackground(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
R: TRect; ABrush: HBRUSH; AOpaque: Boolean); virtual;
|
|
class procedure DrawBackgroundFrameRect(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R: TRect; ABrush: HBRUSH; AOpaque: Boolean); virtual;
|
|
class procedure DrawDisabledShadowRect(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
R: TRect); virtual;
|
|
class procedure DrawGlyph(ABarItemControl: TdxBarItemControl; R: TRect; FullBounds: PRect;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned, Center,
|
|
ForceUseBkBrush, BarControlOwner, IsSplit: Boolean); virtual;
|
|
class procedure DrawGlyphAndBkgnd(ABarItemControl: TdxBarItemControl; R: TRect;
|
|
const GlyphRect: TRect; PaintType: TdxBarPaintType; AGlyph: TBitmap;
|
|
AImages: TCurImageList; AImageIndex: Integer; IsGlyphEmpty, Selected, Down,
|
|
DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner, IsSplit: Boolean); virtual;
|
|
class procedure DrawGlyphAndTextInSubMenu(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Selected, ShowGlyph, Down: Boolean); virtual;
|
|
class procedure DrawItemText(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
S: string; PaintRect: TRect; Alignment: UINT; Enabled, Selected, Rotated,
|
|
Clipped, FlatText: Boolean); virtual;
|
|
class procedure DrawLowered(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
var R: TRect); virtual;
|
|
class procedure DrawStaticBorder(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
var ARect: TRect; ABorderWidth: Integer; ABorderStyle: TdxBarStaticBorderStyle); virtual;
|
|
class procedure FrameAndFillRect(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
var R: TRect; Enabled, Selected, Pressed: Boolean); virtual;
|
|
class procedure GetArrowParams(ABarItemControl: TdxBarItemControl; APaintType: TdxBarPaintType;
|
|
AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH; var AArrowColor: COLORREF); virtual;
|
|
class function GlyphBkgndBrush(ABarItemControl: TdxBarItemControl;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, GrayScale, BarControlOwner: Boolean): HBRUSH; virtual;
|
|
class function GlyphDownShift(ABarItemControl: TdxBarItemControl): Integer; virtual;
|
|
class function GlyphDrawDownedShift(ABarItemControl: TdxBarItemControl; ADown: Boolean): Integer; virtual;
|
|
class function IsFlatItemText: Boolean; virtual;
|
|
class function IsItemTextSelectedInverted: Boolean; virtual;
|
|
class function LoweredBorderSize(ABarItemControl: TdxBarItemControl): Integer; virtual;
|
|
class function TextAreaOffset(ABarItemControl: TdxBarItemControl): Integer; virtual;
|
|
// BarManager
|
|
class function BeforeFingersSize: Integer; virtual;
|
|
class function BorderSizeX: Integer; virtual;
|
|
class function BorderSizeY: Integer; virtual;
|
|
class function EmptyFingersSize: Integer; virtual;
|
|
class function FingersSize: Integer; virtual;
|
|
class function GripperSize: Integer; virtual;
|
|
class function RealButtonArrowWidth(ABarManager: TdxBarManager): Integer; virtual;
|
|
class function RealLargeButtonArrowWidth(ABarManager: TdxBarManager): Integer; virtual;
|
|
class function SubMenuBeginGroupIndent: Integer; virtual;
|
|
// DockControl
|
|
class procedure DockControlFillBackground(ADockControl: TdxDockControl;
|
|
DC: HDC; ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor); virtual;
|
|
class function IsNativeBackground: Boolean; virtual;
|
|
// CustomBar
|
|
class function BarChildrenHaveShadows(ABarControl: TCustomdxBarControl): Boolean; virtual;
|
|
class function BarControlOwnerBrush(ABarManager: TdxBarManager): HBRUSH; virtual;
|
|
class procedure BarDrawDockedBackground(ABarControl: TCustomdxBarControl; DC: HDC;
|
|
ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor); virtual;
|
|
class procedure BarDrawFloatingBackground(ABarControl: TCustomdxBarControl; DC: HDC;
|
|
ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor); virtual;
|
|
class procedure BarDrawOwnerLink(ABarControl: TCustomdxBarControl; DC: HDC); virtual;
|
|
class function BarHasShadow(ABarControl: TCustomdxBarControl): Boolean; virtual;
|
|
class function BarToolbarBrush(ABarControl: TCustomdxBarControl): HBRUSH; virtual;
|
|
class function BarToolbarBrushEx(ABarControl: TdxBarControl): HBRUSH; virtual;
|
|
class function BarToolbarDownedBrush(ABarControl: TCustomdxBarControl): HBRUSH; virtual;
|
|
class function BarToolbarDownedSelBrush(ABarControl: TCustomdxBarControl): HBRUSH; virtual;
|
|
class function BarToolbarSelBrush(ABarControl: TCustomdxBarControl): HBRUSH; virtual;
|
|
class function ComboBoxArrowWidth(ABarControl: TCustomdxBarControl; DC: HDC;
|
|
cX: Integer): Integer; virtual;
|
|
class function EditBorderSize(DC: HDC): Integer; virtual;
|
|
class function EditTextSize(ABarControl: TCustomdxBarControl; DC: HDC; cY: Integer): Integer; virtual;
|
|
// Bar
|
|
class function BarAllowHotTrack: Boolean; virtual;
|
|
class function BarAllowQuickCustomizing: Boolean; virtual;
|
|
class function BarBeginGroupSideSize: Integer; virtual;
|
|
class function BarBeginGroupSize: Integer; virtual;
|
|
class procedure BarBorderPaintSizes(ABarControl: TdxBarControl; var R: TRect); virtual;
|
|
class function BarBorderSize: Integer; virtual;
|
|
class procedure BarBorderSizes(ABar: TdxBar; AStyle: TdxBarDockingStyle; var R: TRect); virtual;
|
|
class function BarCaptionAreaSize: Integer; virtual;
|
|
class procedure BarCaptionFillBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
R: TRect; AToolbarBrush: HBRUSH); virtual;
|
|
class function BarCaptionSize: Integer; virtual;
|
|
class function BarCaptionTransparent: Boolean; virtual;
|
|
class function BarCloseButtonSize: TSize; virtual;
|
|
class procedure BarDrawBeginGroup(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect; AToolbarBrush: HBRUSH; AHorz: Boolean); virtual;
|
|
class procedure BarDrawCaptionElement(ABarControl: TdxBarControl; DC: HDC;
|
|
R: TRect; AState: TdxBarMarkState); virtual;
|
|
class procedure BarDrawCloseButton(ABarControl: TdxBarControl; DC: HDC; R: TRect); virtual;
|
|
class procedure BarDrawDockedBarBorder(ABarControl: TdxBarControl; DC: HDC; R: TRect;
|
|
AToolbarBrush: HBRUSH); virtual;
|
|
class procedure BarDrawFloatingBarBorder(ABarControl: TdxBarControl; DC: HDC;
|
|
var R, CR: TRect; AToolbarBrush: HBRUSH); virtual;
|
|
class procedure BarDrawFloatingBarCaption(ABarControl: TdxBarControl; DC: HDC;
|
|
var R, CR: TRect; AToolbarBrush: HBRUSH); virtual;
|
|
class procedure BarDrawMark(ABarControl: TdxBarControl; DC: HDC; MarkR: TRect); virtual;
|
|
class procedure BarDrawMarks(ABarControl: TdxBarControl; DC: HDC; ItemRect: TRect;
|
|
AToolbarBrush: HBRUSH); virtual;
|
|
class procedure BarDrawMDIButton(ABarControl: TdxBarControl; AButton: TdxBarMDIButton;
|
|
ASelected, APressed: Boolean; DC: HDC; R: TRect); virtual;
|
|
class procedure BarDrawStatusBarGrip(ABarControl: TdxBarControl; DC: HDC;
|
|
R: TRect; AToolbarBrush: HBRUSH); virtual;
|
|
class procedure BarDrawStatusBarTopBorder(ABarControl: TdxBarControl; DC: HDC;
|
|
R: TRect; AToolbarBrush: HBRUSH); virtual;
|
|
class function BarHorSize: Integer; virtual;
|
|
class function BarMarkRect(ABarControl: TdxBarControl): TRect; virtual;
|
|
class function BarMarkItemRect(ABarControl: TdxBarControl): TRect; virtual;
|
|
class procedure BarMarkRectInvalidate(ABarControl: TdxBarControl); virtual;
|
|
class function BarTopSize: Integer; virtual;
|
|
class function BarBottomSize: Integer; virtual;
|
|
class function BarUseSystemClose: Boolean; virtual;
|
|
class function BarUseSystemNCBorder: Boolean; virtual;
|
|
class procedure StatusBarFillBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor); virtual;
|
|
class function StatusBarGripSize(ABarManager: TdxBarManager): TSize; virtual;
|
|
class function StatusBarTopBorderSize(ABarManager: TdxBarManager): Integer; virtual;
|
|
// QuickCustItem
|
|
class function BarToolbarBrushEx2(ABarControl: TdxBarControl): HBRUSH; virtual;
|
|
class procedure DrawQuickCustItemFrame(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R, ARect: TRect; Selected: Boolean); virtual;
|
|
class procedure DrawQuickCustItemFrameSelected(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; WholeR, R: TRect; Selected: Boolean); virtual;
|
|
class function IsQuickControlPopupOnRight: Boolean; virtual;
|
|
// ButtonControl
|
|
class function ButtonBorderHeight: Integer; virtual;
|
|
class function ButtonBorderWidth: Integer; virtual;
|
|
class procedure CorrectButtonControlDefaultHeight(var DefaultHeight: Integer); virtual;
|
|
class procedure CorrectButtonControlDefaultWidth(ABarItemControl: TdxBarItemControl;
|
|
var DefaultWidth: Integer); virtual;
|
|
class procedure DrawButtonControlArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R1: TRect; Brush: HBRUSH; ArrowColor: COLORREF; Selected, DrawDowned, DroppedDown,
|
|
DropDownEnabled, IsDropDownMenuControlExist: Boolean; PaintType: TdxBarPaintType); virtual;
|
|
class function IsDropDownRepaintNeeded: Boolean; virtual;
|
|
class procedure OffsetCaptionBounds(ABarButtonControl: TdxBarButtonControl; APressed: Boolean; var R: TRect); virtual;
|
|
class procedure OffsetEllipsisBounds(ABarItemControl: TdxBarItemControl; APressed: Boolean; var R: TRect); virtual;
|
|
// ComboControl
|
|
class function ComboControlArrowOffset: Integer; virtual;
|
|
class procedure ComboControlDrawArrow(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; Selected: Boolean; PaintType: TdxBarPaintType); virtual;
|
|
class procedure ComboControlGetArrowParams(ABarItemControl: TdxBarItemControl;
|
|
APaintType: TdxBarPaintType; AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH;
|
|
var AArrowColor: COLORREF); virtual;
|
|
// DropDownListBox
|
|
class function DropDownListBoxBorderSize: Integer; virtual;
|
|
class procedure DropDownListBoxDrawBorder(ABarManager: TdxBarManager; DC: HDC; R: TRect); virtual;
|
|
// SubItemControl
|
|
class function SubItemControlCaptionOffset(ABarSubItemControl: TdxBarSubItemControl): Integer; virtual;
|
|
class function SubItemControlDefaultHeight(ABarSubItemControl: TdxBarSubItemControl): Integer; virtual;
|
|
class function SubItemControlDefaultWidth(ABarSubItemControl: TdxBarSubItemControl): Integer; virtual;
|
|
class procedure SubItemControlDraw(ABarSubItemControl: TdxBarSubItemControl;
|
|
DC: HDC; R: TRect; Selected, Down: Boolean; PaintType: TdxBarPaintType); virtual;
|
|
// SubMenuControl
|
|
class function SubMenuControlArrowsOffset: Integer; virtual;
|
|
class function SubMenuControlBeginGroupSize: Integer; virtual;
|
|
class function SubMenuControlBorderSize: Integer; virtual;
|
|
class procedure SubMenuControlCalcDrawingConsts(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ATextSize, AMenuArrowWidth, AMarkSize, ANormalItemHeight: Integer); virtual;
|
|
class procedure SubMenuControlCalcRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect; var AClientHeight: Integer); virtual;
|
|
class procedure SubMenuControlCalcSize(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect); virtual;
|
|
class function SubMenuControlDetachCaptionAreaSize(ABarSubMenuControl: TdxBarSubMenuControl): Integer; virtual;
|
|
class procedure SubMenuControlDrawArrowsArea(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; ABrush: HBRUSH; AMaxVisibleCount: Integer); virtual;
|
|
class procedure SubMenuControlDrawBackground(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; ARect: TRect; ABrush: HBRUSH; AColor: TColor); virtual;
|
|
class procedure SubMenuControlDrawBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect); virtual;
|
|
class procedure SubMenuControlDrawClientBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; var R: TRect; ABrush: HBRUSH); virtual;
|
|
class procedure SubMenuControlDrawDetachCaption(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect); virtual;
|
|
class procedure SubMenuControlDrawBeginGroup(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AControl: TdxBarItemControl; DC: HDC; AItemRect: TRect; LeftDelta: Integer); virtual;
|
|
class procedure SubMenuControlDrawItemFrame(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AControl: TdxBarItemControl; DC: HDC; AItemRect: TRect; AIndex, LeftDelta: Integer); virtual;
|
|
class function SubMenuControlIsOffsetRecentGroupNeeded: Boolean; virtual;
|
|
class function SubMenuControlMarkArrowSize(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AMarkSize: Integer): Integer; virtual;
|
|
class function SubMenuControlMarkRectOffset(ABarSubMenuControl: TdxBarSubMenuControl): Integer; virtual;
|
|
class procedure SubMenuControlOffsetDetachCaptionRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var R: TRect); virtual;
|
|
class procedure SubMenuControlPrepareBkBrush(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ABkBrush: HBRUSH); virtual;
|
|
class function SubMenuControlToolbarItemsBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH; virtual;
|
|
// Edit
|
|
class procedure EditDrawInterior(ABarEditControl: TdxBarEditControl;
|
|
ABarEdit: TdxBarEdit; ACanvas: TCanvas; R: TRect; ItemLink: TdxBarItemLink); virtual;
|
|
// CustomCombo
|
|
class procedure CustomComboDrawItem(ABarCustomCombo: TdxBarCustomCombo;
|
|
ACanvas: TCanvas; AIndex: Integer; ARect: TRect; AState: TOwnerDrawState;
|
|
AInteriorIsDrawing: Boolean); virtual;
|
|
// EditControl
|
|
class function EditControlCaptionWidth(ABarEditControl: TdxBarEditControl;
|
|
ATextWidth: Integer): Integer; virtual;
|
|
class procedure EditControlDrawBorder(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean); virtual;
|
|
class procedure EditControlDrawCaption(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean); virtual;
|
|
class procedure EditControlDrawTextField(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; const ARect: TRect; AIgnoreEnabled: Boolean); virtual;
|
|
class function EditControlES_Style: Integer; virtual;
|
|
class procedure EditControlPrepareEditWnd(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND); virtual;
|
|
class procedure EditControlUpdateWndText(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND; ANotEqual: Boolean); virtual;
|
|
// ColorCombo
|
|
class procedure ColorComboDrawCustomButton(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; var ACustomColorButtonRect: TRect; Selected, Pressed: Boolean); virtual;
|
|
// SysPanel
|
|
class procedure SysPanelCalcSize(AHandle: HWND; var ARect: TRect; var Corner: TdxCorner;
|
|
Combo: TdxBarItem; AllowResizing: Boolean); virtual;
|
|
class procedure SysPanelDraw(AHandle: HWND; AllowResizing, MouseAboveCloseButton,
|
|
CloseButtonIsTracking: Boolean; var CloseButtonRect, GripRect: TRect; Corner: TdxCorner); virtual;
|
|
class function SysPanelSize: Integer; virtual;
|
|
// DateNavigator
|
|
class function IsDateNavigatorFlat: Boolean; virtual;
|
|
class procedure DateNavigatorDrawButton(ABarItem: TdxBarItem;
|
|
DC: HDC; R: TRect; const ACaption: string; APressed: Boolean); virtual;
|
|
class function DateNavigatorHeaderColor: TColor; virtual;
|
|
// SpinEditControl
|
|
class procedure SpinEditControlDrawButton(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; ARect: TRect; XSize, YSize, Size: Integer; Selected: Boolean;
|
|
AButton, AActiveButton: TdxBarSpinEditButton; AButtonPressed: Boolean); virtual;
|
|
class procedure SpinEditControlDrawFrame(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect); virtual;
|
|
// ProgressControl
|
|
class function ProgressControlBarBrushColor: TColorRef; virtual;
|
|
class function ProgressControlBarHeight(ABarItemControl: TdxBarItemControl): Integer; virtual;
|
|
class procedure ProgressControlDrawBar(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
BarR: TRect; ABarBrushColor: TColorRef; PaintType: TdxBarPaintType; ASmooth: Boolean;
|
|
Position, Min, Max: Integer); virtual;
|
|
class function ProgressControlIndent(ABarItemControl: TdxBarItemControl): Integer; virtual;
|
|
// ContainerControl
|
|
class function ContainerControlSubMenuOffset: Integer; virtual;
|
|
// InPlaceSubItemControl
|
|
class function InPlaceSubItemControlBrush: HBRUSH; virtual;
|
|
class procedure InPlaceSubItemControlDrawInMenu(ABarContainerItemControl: TdxBarContainerItemControl;
|
|
DC: HDC; Selected, AItemExpanded: Boolean; ARect: TRect); virtual;
|
|
end;
|
|
|
|
// TdxBarItemControlPainterClass = class of TdxBarItemControlPainter;
|
|
|
|
TdxBarItemControlStandardPainter = class(TdxBarItemControlPainter)
|
|
protected
|
|
class procedure DrawGlyphBorder(ABarItemControl: TdxBarItemControl; DC: HDC; ABrush: HBRUSH;
|
|
NeedBorder: Boolean; R: TRect; PaintType: TdxBarPaintType; IsGlyphEmpty,
|
|
Selected, Down, DrawDowned, BarControlOwner, IsSplit: Boolean); override;
|
|
class procedure DrawGlyphCheckMark(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
X, Y, DoubleSize: Integer); override;
|
|
class function IgnoreGlyphOpaque: Boolean; override;
|
|
// Bar
|
|
class function BarIsBarSmall(ABarControl: TdxBarControl; const R: TRect): Boolean; override;
|
|
class procedure BarDrawMarkAtPos(ABarControl: TdxBarControl; DC: HDC;
|
|
const ItemRect: TRect; Offset: Integer); override;
|
|
class procedure BarDrawMarkBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect; AToolbarBrush: HBRUSH); override;
|
|
public
|
|
// Common
|
|
class procedure DrawDisabledShadowRect(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
R: TRect); override;
|
|
class procedure DrawGlyphAndTextInSubMenu(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Selected, ShowGlyph, Down: Boolean); override;
|
|
class procedure DrawLowered(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
var R: TRect); override;
|
|
class procedure FrameAndFillRect(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
var R: TRect; Enabled, Selected, Pressed: Boolean); override;
|
|
class function GlyphBkgndBrush(ABarItemControl: TdxBarItemControl;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, GrayScale, BarControlOwner: Boolean): HBRUSH; override;
|
|
class function GlyphDownShift(ABarItemControl: TdxBarItemControl): Integer; override;
|
|
class function GlyphDrawDownedShift(ABarItemControl: TdxBarItemControl; ADown: Boolean): Integer; override;
|
|
class function LoweredBorderSize(ABarItemControl: TdxBarItemControl): Integer; override;
|
|
// BarManager
|
|
class function BeforeFingersSize: Integer; override;
|
|
class function FingersSize: Integer; override;
|
|
class function SubMenuBeginGroupIndent: Integer; override;
|
|
// Bar
|
|
class procedure BarDrawCloseButton(ABarControl: TdxBarControl; DC: HDC; R: TRect); override;
|
|
class procedure BarDrawDockedBarBorder(ABarControl: TdxBarControl; DC: HDC; R: TRect;
|
|
AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawFloatingBarBorder(ABarControl: TdxBarControl; DC: HDC;
|
|
var R, CR: TRect; AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawMDIButton(ABarControl: TdxBarControl; AButton: TdxBarMDIButton;
|
|
ASelected, APressed: Boolean; DC: HDC; R: TRect); override;
|
|
class function BarHorSize: Integer; override;
|
|
class function BarMarkItemRect(ABarControl: TdxBarControl): TRect; override;
|
|
class function BarTopSize: Integer; override;
|
|
class function BarBottomSize: Integer; override;
|
|
class function BarUseSystemClose: Boolean; override;
|
|
class function BarUseSystemNCBorder: Boolean; override;
|
|
// ButtonControl
|
|
class procedure DrawButtonControlArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R1: TRect; Brush: HBRUSH; ArrowColor: COLORREF; Selected, DrawDowned, DroppedDown,
|
|
DropDownEnabled, IsDropDownMenuControlExist: Boolean; PaintType: TdxBarPaintType); override;
|
|
class procedure OffsetCaptionBounds(ABarButtonControl: TdxBarButtonControl; APressed: Boolean; var R: TRect); override;
|
|
class procedure OffsetEllipsisBounds(ABarItemControl: TdxBarItemControl; APressed: Boolean; var R: TRect); override;
|
|
// ComboControl
|
|
class procedure ComboControlDrawArrow(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; Selected: Boolean; PaintType: TdxBarPaintType); override;
|
|
// DropDownListBox
|
|
class function DropDownListBoxBorderSize: Integer; override;
|
|
class procedure DropDownListBoxDrawBorder(ABarManager: TdxBarManager; DC: HDC; R: TRect); override;
|
|
// SubMenuControl
|
|
class procedure SubMenuControlDrawItemFrame(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AControl: TdxBarItemControl; DC: HDC; AItemRect: TRect; AIndex, LeftDelta: Integer); override;
|
|
class function SubMenuControlIsOffsetRecentGroupNeeded: Boolean; override;
|
|
class function SubMenuControlMarkRectOffset(ABarSubMenuControl: TdxBarSubMenuControl): Integer; override;
|
|
// EditControl
|
|
class procedure EditControlPrepareEditWnd(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND); override;
|
|
end;
|
|
|
|
TdxBarItemControlEnhancedPainter = class(TdxBarItemControlStandardPainter)
|
|
protected
|
|
// Bar
|
|
class procedure BarDrawMarkAtPos(ABarControl: TdxBarControl; DC: HDC;
|
|
const ItemRect: TRect; Offset: Integer); override;
|
|
class procedure BarDrawMarkBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect; AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawMarkElements(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect); override;
|
|
public
|
|
// BarManager
|
|
class function BeforeFingersSize: Integer; override;
|
|
class function FingersSize: Integer; override;
|
|
class function SubMenuBeginGroupIndent: Integer; override;
|
|
// Bar
|
|
class function BarAllowQuickCustomizing: Boolean; override;
|
|
class procedure BarDrawDockedBarBorder(ABarControl: TdxBarControl; DC: HDC; R: TRect;
|
|
AToolbarBrush: HBRUSH); override;
|
|
class function BarMarkItemRect(ABarControl: TdxBarControl): TRect; override;
|
|
end;
|
|
|
|
TdxBarItemControlFlatPainter = class(TdxBarItemControlPainter)
|
|
protected
|
|
// Common
|
|
class procedure DrawGlyphBorder(ABarItemControl: TdxBarItemControl; DC: HDC; ABrush: HBRUSH;
|
|
NeedBorder: Boolean; R: TRect; PaintType: TdxBarPaintType; IsGlyphEmpty,
|
|
Selected, Down, DrawDowned, BarControlOwner, IsSplit: Boolean); override;
|
|
class procedure DrawGlyphCheckMark(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
X, Y, DoubleSize: Integer); override;
|
|
class procedure DrawGlyphImage(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; const GlyphRect: TRect;
|
|
AGlyph: TBitmap; AImages: TCurImageList; AImageIndex: Integer; Selected,
|
|
Down, DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner: Boolean;
|
|
PaintType: TdxBarPaintType); override;
|
|
class procedure FrameFlatSelRect(DC: HDC; const R: TRect); virtual;
|
|
// Bar
|
|
class function BarCaptionBkColor(ABarControl: TdxBarControl; AMainFormActive: Boolean): COLORREF; override;
|
|
class function BarMarkArrowColor(ABarControl: TdxBarControl; AState: TdxBarMarkState): COLORREF; override;
|
|
class procedure BarDrawMarkBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect; AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawMarkElements(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect); override;
|
|
class procedure BarOffsetFloatingBarCaption(ABarControl: TdxBarControl;
|
|
var X: Integer; var R: TRect); override;
|
|
class function GetDrawMarkElementColor(ABarControl: TdxBarControl): Integer; override;
|
|
// Edit
|
|
class procedure EditOffsetInteriorRect(var R: TRect); override;
|
|
public
|
|
// Common
|
|
class procedure DrawGlyphAndTextInSubMenu(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Selected, ShowGlyph, Down: Boolean); override;
|
|
class procedure DrawLowered(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
var R: TRect); override;
|
|
class procedure DrawStaticBorder(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
var ARect: TRect; ABorderWidth: Integer; ABorderStyle: TdxBarStaticBorderStyle); override;
|
|
class procedure FrameAndFillRect(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
var R: TRect; Enabled, Selected, Pressed: Boolean); override;
|
|
class procedure GetArrowParams(ABarItemControl: TdxBarItemControl; APaintType: TdxBarPaintType;
|
|
AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH; var AArrowColor: COLORREF); override;
|
|
class function GlyphBkgndBrush(ABarItemControl: TdxBarItemControl;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, GrayScale, BarControlOwner: Boolean): HBRUSH; override;
|
|
class function IsFlatItemText: Boolean; override;
|
|
class function LoweredBorderSize(ABarItemControl: TdxBarItemControl): Integer; override;
|
|
class function StaticBorderBrush(ABarItemControl: TdxBarItemControl; ABorderStyle: TdxBarStaticBorderStyle): HBRUSH; virtual;
|
|
class function TextAreaOffset(ABarItemControl: TdxBarItemControl): Integer; override;
|
|
// BarManager
|
|
class function BeforeFingersSize: Integer; override;
|
|
class function FingersSize: Integer; override;
|
|
class function RealButtonArrowWidth(ABarManager: TdxBarManager): Integer; override;
|
|
class function RealLargeButtonArrowWidth(ABarManager: TdxBarManager): Integer; override;
|
|
class function SubMenuBeginGroupIndent: Integer; override;
|
|
// CustomBar
|
|
class function BarChildrenHaveShadows(ABarControl: TCustomdxBarControl): Boolean; override;
|
|
class procedure BarDrawBarControlOwner(ACustomBarControl: TCustomdxBarControl; DC: HDC;
|
|
R: TRect; ABarControl: TCustomdxBarControl); virtual;
|
|
class procedure BarDrawBarControlOwnerBorder(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R: TRect; ABarItemControl: TdxBarItemControl; ABarControl: TCustomdxBarControl); virtual;
|
|
class procedure BarDrawBarControlOwnerFrame(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R: TRect); virtual;
|
|
class procedure BarDrawBarControlOwnerLink(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R, ALinkR: TRect; ABarItemControl: TdxBarItemControl); virtual;
|
|
class function BarHasShadow(ABarControl: TCustomdxBarControl): Boolean; override;
|
|
class function BarToolbarBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function BarToolbarBrushEx(ABarControl: TdxBarControl): HBRUSH; override;
|
|
class function BarToolbarDownedBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function BarToolbarDownedSelBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function BarToolbarSelBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function EditBorderSize(DC: HDC): Integer; override;
|
|
// Bar
|
|
class function BarAllowHotTrack: Boolean; override;
|
|
class function BarAllowQuickCustomizing: Boolean; override;
|
|
class function BarBeginGroupSideSize: Integer; override;
|
|
class function BarBeginGroupSize: Integer; override;
|
|
class procedure BarDrawBeginGroup(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect; AToolbarBrush: HBRUSH; AHorz: Boolean); override;
|
|
class procedure BarDrawCloseButton(ABarControl: TdxBarControl; DC: HDC; R: TRect); override;
|
|
class procedure BarDrawDockedBarBorder(ABarControl: TdxBarControl; DC: HDC; R: TRect;
|
|
AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawFloatingBarBorder(ABarControl: TdxBarControl; DC: HDC;
|
|
var R, CR: TRect; AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawMark(ABarControl: TdxBarControl; DC: HDC; MarkR: TRect); override;
|
|
class procedure BarDrawMDIButton(ABarControl: TdxBarControl; AButton: TdxBarMDIButton;
|
|
ASelected, APressed: Boolean; DC: HDC; R: TRect); override;
|
|
class function BarMarkItemRect(ABarControl: TdxBarControl): TRect; override;
|
|
// QuickCustItem
|
|
class function BarToolbarBrushEx2(ABarControl: TdxBarControl): HBRUSH; override;
|
|
class procedure DrawQuickCustItemFrame(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R, ARect: TRect; Selected: Boolean); override;
|
|
class procedure DrawQuickCustItemFrameSelected(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; WholeR, R: TRect; Selected: Boolean); override;
|
|
class function IsQuickControlPopupOnRight: Boolean; override;
|
|
// ButtonControl
|
|
class procedure CorrectButtonControlDefaultHeight(var DefaultHeight: Integer); override;
|
|
class procedure CorrectButtonControlDefaultWidth(ABarItemControl: TdxBarItemControl;
|
|
var DefaultWidth: Integer); override;
|
|
class procedure DrawButtonControlArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R1: TRect; Brush: HBRUSH; ArrowColor: COLORREF; Selected, DrawDowned, DroppedDown,
|
|
DropDownEnabled, IsDropDownMenuControlExist: Boolean; PaintType: TdxBarPaintType); override;
|
|
class function IsDropDownRepaintNeeded: Boolean; override;
|
|
// ComboControl
|
|
class procedure ComboControlDrawArrow(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; Selected: Boolean; PaintType: TdxBarPaintType); override;
|
|
class procedure ComboControlGetArrowParams(ABarItemControl: TdxBarItemControl;
|
|
APaintType: TdxBarPaintType; AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH;
|
|
var AArrowColor: COLORREF); override;
|
|
// DropDownListBox
|
|
class function DropDownListBoxBorderSize: Integer; override;
|
|
class procedure DropDownListBoxDrawBorder(ABarManager: TdxBarManager; DC: HDC; R: TRect); override;
|
|
// SubItemControl
|
|
class function SubItemControlCaptionOffset(ABarSubItemControl: TdxBarSubItemControl): Integer; override;
|
|
class function SubItemControlDefaultHeight(ABarSubItemControl: TdxBarSubItemControl): Integer; override;
|
|
class function SubItemControlDefaultWidth(ABarSubItemControl: TdxBarSubItemControl): Integer; override;
|
|
class procedure SubItemControlDraw(ABarSubItemControl: TdxBarSubItemControl;
|
|
DC: HDC; R: TRect; Selected, Down: Boolean; PaintType: TdxBarPaintType); override;
|
|
// SubMenuControl
|
|
class function SubMenuControlBeginGroupSize: Integer; override;
|
|
class function SubMenuControlBorderSize: Integer; override;
|
|
class procedure SubMenuControlCalcDrawingConsts(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ATextSize, AMenuArrowWidth, AMarkSize, ANormalItemHeight: Integer); override;
|
|
class procedure SubMenuControlCalcRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect; var AClientHeight: Integer); override;
|
|
class procedure SubMenuControlCalcSize(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect); override;
|
|
class function SubMenuControlDetachCaptionAreaSize(ABarSubMenuControl: TdxBarSubMenuControl): Integer; override;
|
|
class procedure SubMenuControlDrawArrowsArea(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; ABrush: HBRUSH; AMaxVisibleCount: Integer); override;
|
|
class procedure SubMenuControlDrawBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect); override;
|
|
class procedure SubMenuControlDrawClientBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; var R: TRect; ABrush: HBRUSH); override;
|
|
class procedure SubMenuControlDrawDetachCaption(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect); override;
|
|
class procedure SubMenuControlDrawBeginGroup(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AControl: TdxBarItemControl; DC: HDC; AItemRect: TRect; LeftDelta: Integer); override;
|
|
class function SubMenuControlGroupSeparatorBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH; virtual;
|
|
class function SubMenuControlMarkArrowSize(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AMarkSize: Integer): Integer; override;
|
|
class procedure SubMenuControlOffsetDetachCaptionRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var R: TRect); override;
|
|
class procedure SubMenuControlPrepareBkBrush(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ABkBrush: HBRUSH); override;
|
|
class function SubMenuControlToolbarItemsBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH; override;
|
|
// CustomCombo
|
|
class procedure CustomComboDrawItem(ABarCustomCombo: TdxBarCustomCombo;
|
|
ACanvas: TCanvas; AIndex: Integer; ARect: TRect; AState: TOwnerDrawState;
|
|
AInteriorIsDrawing: Boolean); override;
|
|
// EditControl
|
|
class function EditControlCaptionWidth(ABarEditControl: TdxBarEditControl;
|
|
ATextWidth: Integer): Integer; override;
|
|
class procedure EditControlDrawBorder(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean); override;
|
|
class procedure EditControlDrawCaption(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean); override;
|
|
class procedure EditControlDrawTextField(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; const ARect: TRect; AIgnoreEnabled: Boolean); override;
|
|
class function EditControlES_Style: Integer; override;
|
|
class procedure EditControlPrepareEditWnd(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND); override;
|
|
class procedure EditControlUpdateWndText(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND; ANotEqual: Boolean); override;
|
|
// SysPanel
|
|
class procedure SysPanelDraw(AHandle: HWND; AllowResizing, MouseAboveCloseButton,
|
|
CloseButtonIsTracking: Boolean; var CloseButtonRect, GripRect: TRect; Corner: TdxCorner); override;
|
|
// DateNavigator
|
|
class function IsDateNavigatorFlat: Boolean; override;
|
|
class procedure DateNavigatorDrawButton(ABarItem: TdxBarItem;
|
|
DC: HDC; R: TRect; const ACaption: string; APressed: Boolean); override;
|
|
// SpinEditControl
|
|
class procedure SpinEditControlDrawButton(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; ARect: TRect; XSize, YSize, Size: Integer; Selected: Boolean;
|
|
AButton, AActiveButton: TdxBarSpinEditButton; AButtonPressed: Boolean); override;
|
|
// ContainerControl
|
|
class function ContainerControlSubMenuOffset: Integer; override;
|
|
// InPlaceSubItemControl
|
|
class procedure InPlaceSubItemControlDrawInMenu(ABarContainerItemControl: TdxBarContainerItemControl;
|
|
DC: HDC; Selected, AItemExpanded: Boolean; ARect: TRect); override;
|
|
end;
|
|
|
|
TdxBarItemControlOffice11Painter = class(TdxBarItemControlFlatPainter)
|
|
protected
|
|
// Common
|
|
class procedure DrawGlyphBorder(ABarItemControl: TdxBarItemControl; DC: HDC; ABrush: HBRUSH;
|
|
NeedBorder: Boolean; R: TRect; PaintType: TdxBarPaintType; IsGlyphEmpty,
|
|
Selected, Down, DrawDowned, BarControlOwner, IsSplit: Boolean); override;
|
|
class procedure DrawGlyphImage(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; const GlyphRect: TRect;
|
|
AGlyph: TBitmap; AImages: TCurImageList; AImageIndex: Integer; Selected,
|
|
Down, DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner: Boolean;
|
|
PaintType: TdxBarPaintType); override;
|
|
class procedure DrawItemArrow(DC: HDC; R: TRect; ArrowType: TdxArrowType;
|
|
Enabled, Selected, Flat: Boolean); override;
|
|
class procedure DrawLargeItemArrow(DC: HDC; R: TRect; ArrowType: TdxArrowType;
|
|
Size: Integer; Selected, Enabled, Flat: Boolean); override;
|
|
class procedure FrameFlatSelRect(DC: HDC; const R: TRect); override;
|
|
class function GetBarGradientRect(ABarControl: TCustomdxBarControl): TRect;
|
|
class procedure GetDockColors(ADockControl: TdxDockControl; var AColor1, AColor2: TColor);
|
|
class procedure GetMarkColors(ABarControl: TdxBarControl; var AMarkColor1, AMarkColor2, AColor6, AColor9: TColor);
|
|
class procedure GetSelectedColors(ABarItemControl: TdxBarItemControl;
|
|
ADown, ASelected: Boolean; var AColor1, AColor2: TColor);
|
|
class procedure GetEditColors(ABarItemControl: TdxBarItemControl; var ATextColor,
|
|
ABkColor: COLORREF); override;
|
|
class function GetFadedColor(ABarControl: TCustomdxBarControl): TColor; override;
|
|
class procedure GetTextColors(ABarItemControl: TdxBarItemControl; AEnabled,
|
|
ASelected, AFlat: Boolean; var AColor1, AColor2: TColor); override;
|
|
class function IgnoreNonRecentColor: Boolean; override;
|
|
class function IsMenuGradient(ABarItemControl: TdxBarItemControl): Boolean;
|
|
class function IsSimpleMark(ABarControl: TdxBarControl): Boolean;
|
|
// Bar
|
|
class function BarCaptionBkColor(ABarControl: TdxBarControl; AMainFormActive: Boolean): COLORREF; override;
|
|
class function BarCaptionColor(ABarControl: TdxBarControl): COLORREF; override;
|
|
class function BarMarkArrowColor(ABarControl: TdxBarControl; AState: TdxBarMarkState): COLORREF; override;
|
|
class procedure BarDrawFingerElements(ABarControl: TCustomdxBarControl; DC: HDC;
|
|
ARect: TRect; AHorizontal: Boolean); virtual;
|
|
class procedure BarDrawMarkBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect; AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawMarkElements(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect); override;
|
|
// SubMenuControl
|
|
class procedure SubMenuControlDrawMark(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect; ASelected: Boolean); override;
|
|
// ComboControl
|
|
class procedure ComboControlDrawOneArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; X, Y, Size: Integer; Color: COLORREF); override;
|
|
public
|
|
// Common
|
|
class procedure DrawGlyphAndTextInSubMenu(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Selected, ShowGlyph, Down: Boolean); override;
|
|
class procedure FrameAndFillRect(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
var R: TRect; Enabled, Selected, Pressed: Boolean); override;
|
|
class procedure GetArrowParams(ABarItemControl: TdxBarItemControl; APaintType: TdxBarPaintType;
|
|
AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH; var AArrowColor: COLORREF); override;
|
|
class function GlyphBkgndBrush(ABarItemControl: TdxBarItemControl;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, GrayScale, BarControlOwner: Boolean): HBRUSH; override;
|
|
class function IsItemTextSelectedInverted: Boolean; override;
|
|
class function StaticBorderBrush(ABarItemControl: TdxBarItemControl;
|
|
ABorderStyle: TdxBarStaticBorderStyle): HBRUSH; override;
|
|
// BarManager
|
|
class function BeforeFingersSize: Integer; override;
|
|
class function BorderSizeX: Integer; override;
|
|
class function BorderSizeY: Integer; override;
|
|
class function EmptyFingersSize: Integer; override;
|
|
// DockControl
|
|
class procedure DockControlFillBackground(ADockControl: TdxDockControl;
|
|
DC: HDC; ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor); override;
|
|
class function IsNativeBackground: Boolean; override;
|
|
// CustomBar
|
|
class function BarControlOwnerBrush(ABarManager: TdxBarManager): HBRUSH; override;
|
|
class procedure BarDrawBarControlOwnerFrame(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R: TRect); override;
|
|
class procedure BarDrawBarControlOwnerLink(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R, ALinkR: TRect; ABarItemControl: TdxBarItemControl); override;
|
|
class procedure BarDrawDockedBackground(ABarControl: TCustomdxBarControl; DC: HDC;
|
|
ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor); override;
|
|
class procedure BarDrawFloatingBackground(ABarControl: TCustomdxBarControl; DC: HDC;
|
|
ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor); override;
|
|
class procedure BarDrawOwnerLink(ABarControl: TCustomdxBarControl; DC: HDC); override;
|
|
class function BarHasShadow(ABarControl: TCustomdxBarControl): Boolean; override;
|
|
class function BarToolbarBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function BarToolbarBrushEx(ABarControl: TdxBarControl): HBRUSH; override;
|
|
class function BarToolbarDownedBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function BarToolbarDownedSelBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function BarToolbarSelBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function ComboBoxArrowWidth(ABarControl: TCustomdxBarControl; DC: HDC;
|
|
cX: Integer): Integer; override;
|
|
// Bar
|
|
class function BarBeforeFingersIndent: Integer; virtual;
|
|
class procedure BarBorderPaintSizes(ABarControl: TdxBarControl; var R: TRect); override;
|
|
class procedure BarBorderSizes(ABar: TdxBar; AStyle: TdxBarDockingStyle; var R: TRect); override;
|
|
class procedure BarDrawBeginGroup(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect; AToolbarBrush: HBRUSH; AHorz: Boolean); override;
|
|
class procedure BarDrawCaptionElement(ABarControl: TdxBarControl; DC: HDC;
|
|
R: TRect; AState: TdxBarMarkState); override;
|
|
class procedure BarDrawDockedBarBorder(ABarControl: TdxBarControl; DC: HDC; R: TRect;
|
|
AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawFloatingBarBorder(ABarControl: TdxBarControl; DC: HDC;
|
|
var R, CR: TRect; AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawFloatingBarCaption(ABarControl: TdxBarControl; DC: HDC;
|
|
var R, CR: TRect; AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawStatusBarGrip(ABarControl: TdxBarControl; DC: HDC;
|
|
R: TRect; AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawStatusBarTopBorder(ABarControl: TdxBarControl; DC: HDC;
|
|
R: TRect; AToolbarBrush: HBRUSH); override;
|
|
class function BarMarkRect(ABarControl: TdxBarControl): TRect; override;
|
|
class procedure BarMarkRectInvalidate(ABarControl: TdxBarControl); override;
|
|
class procedure StatusBarFillBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor); override;
|
|
class function StatusBarGripSize(ABarManager: TdxBarManager): TSize; override;
|
|
class function StatusBarTopBorderSize(ABarManager: TdxBarManager): Integer; override;
|
|
// SubMenuControl
|
|
class function IsSingleMenuBorder(ABarSubMenuControl: TdxBarSubMenuControl): Boolean;
|
|
class procedure SubMenuControlCalcDrawingConsts(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ATextSize, AMenuArrowWidth, AMarkSize, ANormalItemHeight: Integer); override;
|
|
class procedure SubMenuControlDrawBackground(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; ARect: TRect; ABrush: HBRUSH; AColor: TColor); override;
|
|
class procedure SubMenuControlDrawClientBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; var R: TRect; ABrush: HBRUSH); override;
|
|
class function SubMenuControlDetachCaptionAreaSize(ABarSubMenuControl: TdxBarSubMenuControl): Integer; override;
|
|
class procedure SubMenuControlDrawBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect); override;
|
|
class procedure SubMenuControlDrawDetachCaption(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect); override;
|
|
class function SubMenuControlGroupSeparatorBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH; override;
|
|
class procedure SubMenuControlOffsetDetachCaptionRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var R: TRect); override;
|
|
class function SubMenuControlToolbarItemsBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH; override;
|
|
// DropDownListBox
|
|
class procedure DropDownListBoxDrawBorder(ABarManager: TdxBarManager; DC: HDC; R: TRect); override;
|
|
// QuickCustItem
|
|
class function BarToolbarBrushEx2(ABarControl: TdxBarControl): HBRUSH; override;
|
|
class procedure DrawQuickCustItemFrame(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R, ARect: TRect; Selected: Boolean); override;
|
|
class procedure DrawQuickCustItemFrameSelected(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; WholeR, R: TRect; Selected: Boolean); override;
|
|
// EditControl
|
|
class function EditControlCaptionWidth(ABarEditControl: TdxBarEditControl;
|
|
ATextWidth: Integer): Integer; override;
|
|
class procedure EditControlDrawBorder(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean); override;
|
|
class procedure EditControlDrawCaption(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean); override;
|
|
// ButtonControl
|
|
class procedure DrawButtonControlArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R1: TRect; Brush: HBRUSH; ArrowColor: COLORREF; Selected, DrawDowned, DroppedDown,
|
|
DropDownEnabled, IsDropDownMenuControlExist: Boolean; PaintType: TdxBarPaintType); override;
|
|
// ComboControl
|
|
class procedure ComboControlDrawArrow(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; Selected: Boolean; PaintType: TdxBarPaintType); override;
|
|
class procedure ComboControlGetArrowParams(ABarItemControl: TdxBarItemControl;
|
|
APaintType: TdxBarPaintType; AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH;
|
|
var AArrowColor: COLORREF); override;
|
|
// ProgressControl
|
|
class function ProgressControlIndent(ABarItemControl: TdxBarItemControl): Integer; override;
|
|
// DateNavigator
|
|
class procedure DateNavigatorDrawButton(ABarItem: TdxBarItem;
|
|
DC: HDC; R: TRect; const ACaption: string; APressed: Boolean); override;
|
|
class function DateNavigatorHeaderColor: TColor; override;
|
|
// InPlaceSubItemControl
|
|
class function InPlaceSubItemControlBrush: HBRUSH; override;
|
|
end;
|
|
|
|
TdxBarItemControlXPPainter = class(TdxBarItemControlPainter)
|
|
protected
|
|
// Common
|
|
class procedure DrawGlyphBorder(ABarItemControl: TdxBarItemControl; DC: HDC; ABrush: HBRUSH;
|
|
NeedBorder: Boolean; R: TRect; PaintType: TdxBarPaintType; IsGlyphEmpty,
|
|
Selected, Down, DrawDowned, BarControlOwner, IsSplit: Boolean); override;
|
|
class procedure DrawGlyphCheckMark(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
X, Y, DoubleSize: Integer); override;
|
|
class procedure DrawGlyphImage(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; const GlyphRect: TRect;
|
|
AGlyph: TBitmap; AImages: TCurImageList; AImageIndex: Integer; Selected,
|
|
Down, DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner: Boolean;
|
|
PaintType: TdxBarPaintType); override;
|
|
class function GetFadedColor(ABarControl: TCustomdxBarControl): TColor; override;
|
|
class function IsMenuItem(ABarItemControl: TdxBarItemControl): Boolean; override;
|
|
// Bar
|
|
class procedure BarDrawGrip(ABarControl: TdxBarControl; DC: HDC; R: TRect;
|
|
AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawMarkBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect; AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawMarkElements(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect); override;
|
|
class procedure BarOffsetFloatingBarCaption(ABarControl: TdxBarControl;
|
|
var X: Integer; var R: TRect); override;
|
|
// Edit
|
|
class procedure EditOffsetInteriorRect(var R: TRect); override;
|
|
public
|
|
// Common
|
|
class procedure DrawGlyphAndTextInSubMenu(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Selected, ShowGlyph, Down: Boolean); override;
|
|
class procedure DrawLowered(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
var R: TRect); override;
|
|
class function GlyphBkgndBrush(ABarItemControl: TdxBarItemControl;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, GrayScale, BarControlOwner: Boolean): HBRUSH; override;
|
|
class function GlyphDownShift(ABarItemControl: TdxBarItemControl): Integer; override;
|
|
class function GlyphDrawDownedShift(ABarItemControl: TdxBarItemControl; ADown: Boolean): Integer; override;
|
|
// BarManager
|
|
class function BeforeFingersSize: Integer; override;
|
|
class function FingersSize: Integer; override;
|
|
class function GripperSize: Integer; override;
|
|
class function RealButtonArrowWidth(ABarManager: TdxBarManager): Integer; override;
|
|
class function RealLargeButtonArrowWidth(ABarManager: TdxBarManager): Integer; override;
|
|
// DockControl
|
|
class procedure DockControlFillBackground(ADockControl: TdxDockControl;
|
|
DC: HDC; ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor); override;
|
|
class function IsNativeBackground: Boolean; override;
|
|
// CustomBar
|
|
// class function BarChildrenHaveShadows(ABarControl: TCustomdxBarControl): Boolean; override;
|
|
class function BarHasShadow(ABarControl: TCustomdxBarControl): Boolean; override;
|
|
class function BarToolbarBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function BarToolbarBrushEx(ABarControl: TdxBarControl): HBRUSH; override;
|
|
class function BarToolbarDownedBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function BarToolbarDownedSelBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function BarToolbarSelBrush(ABarControl: TCustomdxBarControl): HBRUSH; override;
|
|
class function ComboBoxArrowWidth(ABarControl: TCustomdxBarControl; DC: HDC;
|
|
cX: Integer): Integer; override;
|
|
class function EditBorderSize(DC: HDC): Integer; override;
|
|
// Bar
|
|
class function BarAllowHotTrack: Boolean; override;
|
|
class function BarAllowQuickCustomizing: Boolean; override;
|
|
class function BarBeginGroupSideSize: Integer; override;
|
|
class function BarBeginGroupSize: Integer; override;
|
|
class function BarBorderSize: Integer; override;
|
|
class procedure BarCaptionFillBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
R: TRect; AToolbarBrush: HBRUSH); override;
|
|
// class function BarCaptionSize: Integer; override;
|
|
class function BarCaptionTransparent: Boolean; override;
|
|
class function BarCloseButtonSize: TSize; override;
|
|
class procedure BarDrawBeginGroup(ABarControl: TdxBarControl; DC: HDC;
|
|
ItemRect: TRect; AToolbarBrush: HBRUSH; AHorz: Boolean); override;
|
|
class procedure BarDrawCloseButton(ABarControl: TdxBarControl; DC: HDC; R: TRect); override;
|
|
class procedure BarDrawDockedBarBorder(ABarControl: TdxBarControl; DC: HDC; R: TRect;
|
|
AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawFloatingBarBorder(ABarControl: TdxBarControl; DC: HDC;
|
|
var R, CR: TRect; AToolbarBrush: HBRUSH); override;
|
|
class procedure BarDrawMDIButton(ABarControl: TdxBarControl; AButton: TdxBarMDIButton;
|
|
ASelected, APressed: Boolean; DC: HDC; R: TRect); override;
|
|
class function BarMarkItemRect(ABarControl: TdxBarControl): TRect; override;
|
|
class procedure StatusBarFillBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor); override;
|
|
class function StatusBarGripSize(ABarManager: TdxBarManager): TSize; override;
|
|
// QuickCustItem
|
|
class function IsQuickControlPopupOnRight: Boolean; override;
|
|
// ButtonControl
|
|
class function ButtonBorderHeight: Integer; override;
|
|
class function ButtonBorderWidth: Integer; override;
|
|
class procedure CorrectButtonControlDefaultHeight(var DefaultHeight: Integer); override;
|
|
class procedure DrawButtonControlArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R1: TRect; Brush: HBRUSH; ArrowColor: COLORREF; Selected, DrawDowned, DroppedDown,
|
|
DropDownEnabled, IsDropDownMenuControlExist: Boolean; PaintType: TdxBarPaintType); override;
|
|
class procedure OffsetCaptionBounds(ABarButtonControl: TdxBarButtonControl;
|
|
APressed: Boolean; var R: TRect); override;
|
|
class procedure OffsetEllipsisBounds(ABarItemControl: TdxBarItemControl;
|
|
APressed: Boolean; var R: TRect); override;
|
|
// EditControl
|
|
class function EditControlCaptionWidth(ABarEditControl: TdxBarEditControl;
|
|
ATextWidth: Integer): Integer; override;
|
|
class procedure EditControlDrawBorder(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean); override;
|
|
class procedure EditControlDrawCaption(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean); override;
|
|
class procedure EditControlDrawTextField(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; const ARect: TRect; AIgnoreEnabled: Boolean); override;
|
|
class function EditControlES_Style: Integer; override;
|
|
class procedure EditControlPrepareEditWnd(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND); override;
|
|
class procedure EditControlUpdateWndText(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND; ANotEqual: Boolean); override;
|
|
// CustomCombo
|
|
class procedure CustomComboDrawItem(ABarCustomCombo: TdxBarCustomCombo;
|
|
ACanvas: TCanvas; AIndex: Integer; ARect: TRect; AState: TOwnerDrawState;
|
|
AInteriorIsDrawing: Boolean); override;
|
|
// ComboControl
|
|
class function ComboControlArrowOffset: Integer; override;
|
|
class procedure ComboControlDrawArrow(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; Selected: Boolean; PaintType: TdxBarPaintType); override;
|
|
// SubMenuControl
|
|
class function SubMenuControlArrowsOffset: Integer; override;
|
|
class function SubMenuControlBeginGroupSize: Integer; override;
|
|
class function SubMenuControlBorderSize: Integer; override;
|
|
class procedure SubMenuControlCalcRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect; var AClientHeight: Integer); override;
|
|
class procedure SubMenuControlCalcSize(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect); override;
|
|
class function SubMenuControlDetachCaptionAreaSize(ABarSubMenuControl: TdxBarSubMenuControl): Integer; override;
|
|
class procedure SubMenuControlDrawBeginGroup(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AControl: TdxBarItemControl; DC: HDC; AItemRect: TRect; LeftDelta: Integer); override;
|
|
class procedure SubMenuControlDrawBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect); override;
|
|
class procedure SubMenuControlDrawClientBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; var R: TRect; ABrush: HBRUSH); override;
|
|
class procedure SubMenuControlOffsetDetachCaptionRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var R: TRect); override;
|
|
class procedure SubMenuControlPrepareBkBrush(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ABkBrush: HBRUSH); override;
|
|
class function SubMenuControlToolbarItemsBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH; override;
|
|
// DropDownListBox
|
|
class function DropDownListBoxBorderSize: Integer; override;
|
|
class procedure DropDownListBoxDrawBorder(ABarManager: TdxBarManager; DC: HDC; R: TRect); override;
|
|
// ColorCombo
|
|
class procedure ColorComboDrawCustomButton(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; var ACustomColorButtonRect: TRect; Selected, Pressed: Boolean); override;
|
|
// DateNavigator
|
|
class function IsDateNavigatorFlat: Boolean; override;
|
|
class procedure DateNavigatorDrawButton(ABarItem: TdxBarItem;
|
|
DC: HDC; R: TRect; const ACaption: string; APressed: Boolean); override;
|
|
// SysPanel
|
|
class procedure SysPanelDraw(AHandle: HWND; AllowResizing, MouseAboveCloseButton,
|
|
CloseButtonIsTracking: Boolean; var CloseButtonRect, GripRect: TRect; Corner: TdxCorner); override;
|
|
class function SysPanelSize: Integer; override;
|
|
// SpinEditControl
|
|
class procedure SpinEditControlDrawButton(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; ARect: TRect; XSize, YSize, Size: Integer; Selected: Boolean;
|
|
AButton, AActiveButton: TdxBarSpinEditButton; AButtonPressed: Boolean); override;
|
|
class procedure SpinEditControlDrawFrame(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect); override;
|
|
// ProgressControl
|
|
class function ProgressControlBarBrushColor: TColorRef; override;
|
|
class function ProgressControlBarHeight(ABarItemControl: TdxBarItemControl): Integer; override;
|
|
class procedure ProgressControlDrawBar(ABarItemControl: TdxBarItemControl; DC: HDC;
|
|
BarR: TRect; ABarBrushColor: TColorRef; PaintType: TdxBarPaintType; ASmooth: Boolean;
|
|
Position, Min, Max: Integer); override;
|
|
end;
|
|
|
|
function dxBarItemClass(AIndex: Integer): TdxBarItemClass;
|
|
function dxBarItemCount: Integer;
|
|
function dxBarVisibleItemClass(AIndex: Integer): TdxBarItemClass;
|
|
function dxBarVisibleItemCount: Integer;
|
|
procedure dxBarRegisterItem(AItemClass: TdxBarItemClass;
|
|
AItemControlClass: TdxBarItemControlClass; AVisible: Boolean);
|
|
procedure dxBarUnregisterItem(AItemClass: TdxBarItemClass);
|
|
procedure dxBarDesignerModified(ABarManager: TdxBarManager);
|
|
function dxGenBarItemName(ABarManager: TdxBarManager; ABarItemClass: TdxBarItemClass): string;
|
|
|
|
function ActiveBarControl: TCustomdxBarControl;
|
|
function VisibleTodxBarVisible(Value: Boolean): TdxBarItemVisible;
|
|
function GetBarManagerByForm(AForm: TCustomForm): TdxBarManager;
|
|
|
|
function GetWorkArea(const P: TPoint): TRect;
|
|
function IsVertical(ABarControl: TCustomdxBarControl): Boolean;
|
|
function GetTextOf(const S: string): string;
|
|
procedure DrawItemArrow(DC: HDC; R: TRect; ArrowType: TdxArrowType;
|
|
Enabled, Selected, Flat: Boolean);
|
|
procedure DrawLargeItemArrow(DC: HDC; R: TRect; ArrowType: TdxArrowType;
|
|
Size: Integer; Selected, Enabled, Flat: Boolean);
|
|
procedure FrameFlatSelRect(DC: HDC; const R: TRect);
|
|
procedure DrawVerticalGradient(Canvas: TCanvas; const ARect: TRect;
|
|
FromR, ToR, FromG, ToG, FromB, ToB: Byte);
|
|
procedure TransparentDraw(DrawDC: HDC; Brush: HBRUSH; FullRect, R: TRect; ABitmap: TBitmap;
|
|
AImages: TCurImageList; AImageIndex: Integer; AEnabled, AGrayScale, AFlat,
|
|
ASelected, ADown, APressed, AShadow, ATransparent: Boolean; AFadedColor: TColor;
|
|
ImageListBkColor: TColor);
|
|
function CloneFont(Source: HFONT): HFONT;
|
|
procedure FillRectByBitmap(DC: HDC; ADestR, ASourceR: TRect; ABitmap: TBitmap);
|
|
procedure SaveClipRgn(DC: HDC; var AClipRgn: HRGN; var AClipRgnExists: Boolean);
|
|
procedure RestoreClipRgn(DC: HDC; var AClipRgn: HRGN; var AClipRgnExists: Boolean);
|
|
|
|
procedure ProcessMouseMessages;
|
|
procedure ProcessPaintMessages;
|
|
|
|
function dxBarCustomizingPopup: TdxBarSubMenuControl;
|
|
function dxBarCustomizingPopupItemLink: TdxBarItemLink;
|
|
|
|
procedure ClearInternalItemList;
|
|
|
|
function LeftButtonPressed: Boolean;
|
|
function RightButtonPressed: Boolean;
|
|
|
|
var
|
|
dxBarDesigner: TdxBarDesigner;
|
|
dxBarHintWindowClass: TdxBarHintWindowClass = TdxBarHintWindow;
|
|
dxBarManagerList: TdxBarManagerList;
|
|
PatternBrush: HBRUSH;
|
|
InternalItemList: TList;
|
|
dxBarMakeInactiveImagesDingy: Boolean = True;
|
|
dxBarPlaySound: Boolean = True;
|
|
|
|
const
|
|
dxBarManagerTempCategoryIndex = -1000;
|
|
dxBarCustomizingPopupPaintStyleGroupIndex = -1000;
|
|
|
|
dxBarNonrecentlyUsedItemsColorDelta: Integer = 20;
|
|
dxBarFlatToolbarsColorDelta: Integer = 20;
|
|
|
|
dxBarWaitForSubMenuTime: Integer = 400;
|
|
|
|
implementation
|
|
|
|
{$R dxBar.res}
|
|
|
|
uses
|
|
CommCtrl, MMSystem, Registry, IniFiles,
|
|
dxCore, dxUxTheme, dxThemeConsts, dxOffice11,
|
|
dxBarCommon, dxBarStrs, dxBarCustForm, dxBarPopupMenuEd;
|
|
|
|
const
|
|
{$IFNDEF DELPHI6}
|
|
WS_EX_LAYERED = $00080000;
|
|
AC_SRC_ALPHA = $01;
|
|
LWA_ALPHA = $00000002;
|
|
{$ENDIF}
|
|
|
|
dxBarButtonBorderWidth = 7;
|
|
dxBarButtonBorderHeight = 6;
|
|
|
|
dxBarFingerSize = 3;
|
|
dxBarHorSize = 4;
|
|
dxBarTopSize = 2;
|
|
dxBarBottomSize = 1;
|
|
dxBarFlatBorderSize = 3;
|
|
|
|
DefautGlyphSize = 16;
|
|
InsertZone = 10;
|
|
MarkSizeX = 11;
|
|
MarkSizeY = 9;
|
|
MarkSizeArrowY = 4;
|
|
MarkSizeArrowX = 2 * MarkSizeArrowY - 1;
|
|
MakeBeginGroupDragSize = 4;
|
|
MinToolbarSize = 2 + 19 + 2;
|
|
FloatToolbarMarkIndent = 1;
|
|
|
|
HintOffset = 20;
|
|
|
|
MinEditWidth = 20;
|
|
EditSizingZoneSize = 7;
|
|
|
|
MinDockSize = 3;
|
|
DetachAreaDelta = 15;
|
|
|
|
dxBarWaitForShowHintTime = 1000;
|
|
dxBarWaitForHideHintTime = 10000;
|
|
dxBarHiddedHintLifeTime = 400;
|
|
dxBarScrollMenuTime = 80;
|
|
dxBarSlowExpandMenuTime = 4000;
|
|
|
|
MDIButtonCommands: array[TdxBarMDIButton] of Integer =
|
|
(SC_MINIMIZE, SC_RESTORE, SC_CLOSE);
|
|
MDIButtonStyles: array[TdxBarMDIButton] of Integer =
|
|
(DFCS_CAPTIONMIN, DFCS_CAPTIONRESTORE, DFCS_CAPTIONCLOSE);
|
|
|
|
ImageShadowSize = 2;
|
|
|
|
ListItemSeparator = '-';
|
|
|
|
type
|
|
PBoolean = ^Boolean;
|
|
|
|
TCurIniFile = TMemIniFile;
|
|
|
|
TDummyBitmap = class(TBitmap);
|
|
TDummyControl = class(TControl);
|
|
TDummyForm = class(TCustomForm);
|
|
|
|
TRegItemRecord = class
|
|
public
|
|
ItemClass: TdxBarItemClass;
|
|
ItemControlClass: TdxBarItemControlClass;
|
|
Visible: Boolean;
|
|
end;
|
|
|
|
var
|
|
FUser32DLL: HMODULE;
|
|
TrackMouseEvent: function(var EventTrack: TTrackMouseEvent): BOOL; stdcall;
|
|
|
|
UpdateLayeredWindow: function(Handle: THandle; hdcDest: HDC;
|
|
pptDst: PPoint; _psize: PSize; hdcSrc: HDC; pptSrc: PPoint; crKey: COLORREF;
|
|
pblend: PBLENDFUNCTION; dwFlags: DWORD): Boolean; stdcall;
|
|
|
|
FRegItemList: TList;
|
|
FBarControls: TList;
|
|
|
|
FActiveBarControl: TCustomdxBarControl;
|
|
|
|
FIsMDIButtonPressed, FIsMouseOverMDIButton: Boolean;
|
|
FPressedMDIButton, FSelectedMDIButton: TdxBarMDIButton;
|
|
|
|
ResettingToolbar, InternalLoading: Boolean;
|
|
|
|
ShowFullMenus: Boolean;
|
|
|
|
BitsPerPixel: Integer;
|
|
|
|
{ blending }
|
|
|
|
type
|
|
TAnimateWindowProc = function(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): BOOL; stdcall;
|
|
TSetLayeredWindowAttributes = function (Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; stdcall;
|
|
|
|
var
|
|
AnimateWindowProc: TAnimateWindowProc = nil;
|
|
SetLayeredWindowAttributes: TSetLayeredWindowAttributes = nil;
|
|
|
|
procedure SetLayeredWndAttributes(AHandle: HWND; AAlphaBlendValue: Integer);
|
|
var
|
|
AStyle: Integer;
|
|
begin
|
|
if Assigned(SetLayeredWindowAttributes) then
|
|
begin
|
|
AStyle := GetWindowLong(AHandle, GWL_EXSTYLE);
|
|
if AAlphaBlendValue < 255 then
|
|
begin
|
|
if (AStyle and WS_EX_LAYERED) = 0 then
|
|
SetWindowLong(AHandle, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);
|
|
SetLayeredWindowAttributes(AHandle, 0, AAlphaBlendValue, LWA_ALPHA);
|
|
end
|
|
else
|
|
if (AStyle and WS_EX_LAYERED) <> 0 then
|
|
begin
|
|
SetWindowLong(AHandle, GWL_EXSTYLE, AStyle and not WS_EX_LAYERED);
|
|
RedrawWindow(AHandle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function IsPopupMenuShowed: Boolean;
|
|
var
|
|
I, J: Integer;
|
|
begin
|
|
Result := False;
|
|
for I := 0 to dxBarManagerList.Count - 1 do
|
|
for J := 0 to dxBarManagerList[I].FPopupMenus.Count - 1 do
|
|
if TdxBarPopupMenu(dxBarManagerList[I].FPopupMenus[J]).FPopupMenuVisible then
|
|
begin
|
|
Result := True;
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
{ global methods }
|
|
|
|
function dxBarItemClass(AIndex: Integer): TdxBarItemClass;
|
|
begin
|
|
Result := TRegItemRecord(FRegItemList[AIndex]).ItemClass;
|
|
end;
|
|
|
|
function dxBarItemCount: Integer;
|
|
begin
|
|
Result := FRegItemList.Count;
|
|
end;
|
|
|
|
function dxBarVisibleItemClass(AIndex: Integer): TdxBarItemClass;
|
|
var
|
|
VisibleIndex, I: Integer;
|
|
begin
|
|
Result := nil;
|
|
VisibleIndex := -1;
|
|
with FRegItemList do
|
|
for I := 0 to Count - 1 do
|
|
with TRegItemRecord(FRegItemList[I]) do
|
|
begin
|
|
if Visible then Inc(VisibleIndex);
|
|
if VisibleIndex = AIndex then
|
|
begin
|
|
Result := ItemClass;
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function dxBarVisibleItemCount: Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
with FRegItemList do
|
|
for I := 0 to Count - 1 do
|
|
if TRegItemRecord(FRegItemList[I]).Visible then Inc(Result);
|
|
end;
|
|
|
|
procedure dxBarRegisterItem(AItemClass: TdxBarItemClass;
|
|
AItemControlClass: TdxBarItemControlClass; AVisible: Boolean);
|
|
var
|
|
ARecord: TRegItemRecord;
|
|
begin
|
|
ARecord := TRegItemRecord.Create;
|
|
with ARecord do
|
|
begin
|
|
ItemClass := AItemClass;
|
|
ItemControlClass := AItemControlClass;
|
|
Visible := AVisible;
|
|
end;
|
|
FRegItemList.Add(ARecord);
|
|
RegisterClass(AItemClass);
|
|
end;
|
|
|
|
procedure dxBarUnregisterItem(AItemClass: TdxBarItemClass);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to FRegItemList.Count - 1 do
|
|
if TRegItemRecord(FRegItemList[I]).ItemClass = AItemClass then
|
|
begin
|
|
TRegItemRecord(FRegItemList[I]).Free;
|
|
FRegItemList.Delete(I);
|
|
UnregisterClass(AItemClass);
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
procedure AddBarControl(ABarControl: TCustomdxBarControl);
|
|
begin
|
|
FBarControls.Add(ABarControl);
|
|
end;
|
|
|
|
procedure RemoveBarControl(ABarControl: TCustomdxBarControl);
|
|
begin
|
|
FBarControls.Remove(ABarControl);
|
|
end;
|
|
|
|
function BarControlExists(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := (ABarControl <> nil) and (FBarControls.IndexOf(ABarControl) <> -1);
|
|
end;
|
|
|
|
procedure dxBarDesignerModified(ABarManager: TdxBarManager);
|
|
begin
|
|
if ABarManager <> nil then ABarManager.DesignerModified;
|
|
end;
|
|
|
|
function dxGenBarItemName(ABarManager: TdxBarManager; ABarItemClass: TdxBarItemClass): string;
|
|
var
|
|
S, S1: string;
|
|
I, J: Integer;
|
|
AFound: Boolean;
|
|
begin
|
|
S := ABarItemClass.ClassName;
|
|
Delete(S, 1, 1);
|
|
J := 0;
|
|
repeat
|
|
Inc(J);
|
|
S1 := S + IntToStr(J);
|
|
AFound := False;
|
|
for I := 0 to ABarManager.ItemCount - 1 do
|
|
if CompareText(S1, ABarManager.Items[I].Name) = 0 then
|
|
begin
|
|
AFound := True;
|
|
Break;
|
|
end;
|
|
until not AFound;
|
|
Result := S1;
|
|
end;
|
|
|
|
function ActiveBarControl: TCustomdxBarControl;
|
|
begin
|
|
Result := FActiveBarControl;
|
|
end;
|
|
|
|
function VisibleTodxBarVisible(Value: Boolean): TdxBarItemVisible;
|
|
begin
|
|
if Value then
|
|
Result := ivAlways
|
|
else
|
|
Result := ivNever;
|
|
end;
|
|
|
|
function GetBarManagerByForm(AForm: TCustomForm): TdxBarManager;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := nil;
|
|
if AForm = nil then Exit;
|
|
|
|
if TCustomForm(AForm).Parent = nil then
|
|
begin
|
|
if Assigned(cxControls.cxGetParentFormForDocking) then
|
|
AForm := cxControls.cxGetParentFormForDocking(AForm);
|
|
end;
|
|
|
|
if (AForm <> nil) and (dxBarManagerList <> nil) then
|
|
for I := 0 to dxBarManagerList.Count - 1 do
|
|
if dxBarManagerList[I].MainForm = AForm then
|
|
begin
|
|
Result := dxBarManagerList[I];
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
function GetParentBarOrSubMenuForBar(Value: TCustomdxBarControl): TCustomdxBarControl;
|
|
begin
|
|
Result := Value;
|
|
while (Result <> nil) and not Result.IsDestroying do
|
|
if Result.ParentBar <> nil then
|
|
Result := Result.ParentBar
|
|
else
|
|
if (Result is TdxBarSubMenuControl) and
|
|
(TdxBarSubMenuControl(Result).FDropDownButton <> nil) then
|
|
Result := TdxBarSubMenuControl(Result).FDropDownButton.Parent
|
|
else
|
|
Break;
|
|
end;
|
|
|
|
function GetParentBarForBar(Value: TCustomdxBarControl): TCustomdxBarControl;
|
|
begin
|
|
Result := GetParentBarOrSubMenuForBar(Value);
|
|
if Result is TdxBarSubMenuControl then Result := nil;
|
|
end;
|
|
|
|
function GetParentBarOrSubMenuForControl(Value: TdxBarItemControl): TCustomdxBarControl;
|
|
begin
|
|
if Value = nil then
|
|
Result := nil
|
|
else
|
|
Result := GetParentBarOrSubMenuForBar(Value.Parent);
|
|
end;
|
|
|
|
function GetParentBarForControl(Value: TdxBarItemControl): TCustomdxBarControl;
|
|
begin
|
|
Result := GetParentBarOrSubMenuForControl(Value);
|
|
if Result is TdxBarSubMenuControl then Result := nil;
|
|
end;
|
|
|
|
function FindVCLControl(Wnd: HWND): TWinControl;
|
|
begin
|
|
repeat
|
|
Result := FindControl(Wnd);
|
|
if Result <> nil then Break;
|
|
Wnd := GetParent(Wnd);
|
|
until Wnd = 0;
|
|
end;
|
|
|
|
function HasAsParent(Wnd: HWND; ParentWnd: HWND): Boolean;
|
|
begin
|
|
repeat
|
|
Wnd := GetParent(Wnd);
|
|
Result := Wnd = ParentWnd;
|
|
if (Wnd = 0) or Result then Break;
|
|
until False;
|
|
end;
|
|
|
|
function WindowFromPointEx(P: TPoint): HWND;
|
|
|
|
function FindOne(Wnd: HWND; P: TPoint): HWND;
|
|
begin
|
|
Result := ChildWindowFromPointEx(Wnd, P, CWP_SKIPINVISIBLE);
|
|
if Result = 0 then
|
|
Result := Wnd
|
|
else
|
|
if Result <> Wnd then
|
|
begin
|
|
MapWindowPoints(Wnd, Result, P, 1);
|
|
Result := FindOne(Result, P);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Result := WindowFromPoint(P);
|
|
if Result <> 0 then
|
|
begin
|
|
ScreenToClient(Result, P);
|
|
Result := FindOne(Result, P);
|
|
end;
|
|
end;
|
|
|
|
function GetTextOf(const S: string): string;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := S;
|
|
I := 1;
|
|
while I < Length(Result) do
|
|
begin
|
|
if Result[I] = '&' then Delete(Result, I, 1);
|
|
Inc(I);
|
|
end;
|
|
end;
|
|
|
|
procedure DrawItemArrow(DC: HDC; R: TRect; ArrowType: TdxArrowType;
|
|
Enabled, Selected, Flat: Boolean);
|
|
var
|
|
Size: Integer;
|
|
begin
|
|
if ArrowType = atRight then
|
|
Size := R.Bottom - R.Top - 6
|
|
else // atDown
|
|
Size := R.Right - R.Left - 8;
|
|
Size := (Size - 1) div 2 + Byte(Size mod 2 <> 0);
|
|
if Size < 3 then Size := 3;
|
|
DrawLargeItemArrow(DC, R, ArrowType, Size, Selected, Enabled, Flat);
|
|
end;
|
|
|
|
procedure DrawLargeItemArrow(DC: HDC; R: TRect; ArrowType: TdxArrowType;
|
|
Size: Integer; Selected, Enabled, Flat: Boolean);
|
|
var
|
|
Color: COLORREF;
|
|
X, Y: Integer;
|
|
P: array[1..3] of TPoint;
|
|
Pen: HPEN;
|
|
Brush: HBRUSH;
|
|
|
|
procedure DrawEnabled;
|
|
begin
|
|
with R do
|
|
if ArrowType = atRight then
|
|
begin
|
|
X := (Left + Right - Size) div 2;
|
|
Y := (Top + Bottom - (2 * Size - 1)) div 2;
|
|
P[1] := Point(X, Y);
|
|
P[2] := Point(X, Y + 2 * Size - 2);
|
|
end
|
|
else // atDown
|
|
begin
|
|
X := (Left + Right - (2 * Size - 1)) div 2;
|
|
Y := (Top + Bottom - Size) div 2;
|
|
P[1] := Point(X, Y);
|
|
P[2] := Point(X + 2 * Size - 2, Y);
|
|
end;
|
|
P[3] := Point(X + Size - 1, Y + Size - 1);
|
|
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(Color)));
|
|
Brush := SelectObject(DC, GetSysColorBrush(Color));
|
|
Polygon(DC, P, 3);
|
|
SelectObject(DC, Brush);
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
end;
|
|
|
|
procedure DrawDisabled;
|
|
begin
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT)));
|
|
if ArrowType = atRight then
|
|
begin
|
|
MoveToEx(DC, X + Size - 1, Y + Size, nil);
|
|
LineTo(DC, X, Y + 2 * Size - 1);
|
|
MoveToEx(DC, X + Size, Y + Size, nil);
|
|
LineTo(DC, X, Y + 2 * Size);
|
|
end
|
|
else
|
|
begin
|
|
MoveToEx(DC, X + Size, Y + Size - 1, nil);
|
|
LineTo(DC, X + 2 * Size - 1, Y);
|
|
MoveToEx(DC, X + Size, Y + Size, nil);
|
|
LineTo(DC, X + 2 * Size, Y);
|
|
end;
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
end;
|
|
|
|
begin
|
|
if Enabled then
|
|
if Selected then
|
|
begin
|
|
if IsHighContrastWhite then
|
|
Color := COLOR_BTNFACE // White
|
|
else
|
|
Color := COLOR_HIGHLIGHTTEXT;
|
|
end
|
|
else
|
|
Color := COLOR_BTNTEXT
|
|
else
|
|
Color := COLOR_BTNSHADOW;
|
|
DrawEnabled;
|
|
if not Enabled and not Flat then DrawDisabled;
|
|
end;
|
|
|
|
procedure FrameFlatSelRect(DC: HDC; const R: TRect);
|
|
begin
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_HIGHLIGHT));
|
|
end;
|
|
|
|
{ items global functions }
|
|
|
|
function GetWorkArea(const P: TPoint): TRect;
|
|
begin
|
|
Result := GetDesktopWorkArea(P);
|
|
end;
|
|
|
|
procedure CheckEditWidth(var Value: Integer);
|
|
begin
|
|
if Value < MinEditWidth then Value := MinEditWidth;
|
|
end;
|
|
|
|
function IsRealVertical(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := ABarControl is TdxBarControl and TdxBarControl(ABarControl).Vertical;
|
|
end;
|
|
|
|
function IsVertical(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := IsRealVertical(ABarControl) and TdxBarControl(ABarControl).Bar.RotateWhenVertical;
|
|
end;
|
|
|
|
procedure RefreshDeviceConsts;
|
|
var
|
|
DC: Integer;
|
|
begin
|
|
DC := GetDC(0);
|
|
try
|
|
BitsPerPixel := GetDeviceCaps(DC, BITSPIXEL);
|
|
finally
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
end;
|
|
|
|
procedure CreatePatternBrush;
|
|
var
|
|
Pattern: TBitmap;
|
|
X, Y: Integer;
|
|
begin
|
|
Pattern := TBitmap.Create;
|
|
with Pattern, Canvas do
|
|
begin
|
|
Width := 8;
|
|
Height := 8;
|
|
Brush.Color := GetSysColor(COLOR_BTNHIGHLIGHT);
|
|
FillRect(Rect(0, 0, Width, Height));
|
|
for Y := 0 to 7 do
|
|
for X := 0 to 7 do
|
|
if (Y mod 2) = (X mod 2) then
|
|
Pixels[X, Y] := GetSysColor(COLOR_BTNFACE);
|
|
end;
|
|
if PatternBrush <> 0 then DeleteObject(PatternBrush);
|
|
PatternBrush := Windows.CreatePatternBrush(Pattern.Handle);
|
|
Pattern.Free;
|
|
end;
|
|
|
|
procedure DrawVerticalGradient(Canvas: TCanvas; const ARect: TRect;
|
|
FromR, ToR, FromG, ToG, FromB, ToB: Byte);
|
|
var
|
|
SR: TRect;
|
|
H, I: Integer;
|
|
R, G, B: Byte;
|
|
begin
|
|
SR := ARect;
|
|
with ARect do
|
|
H := Bottom - Top;
|
|
for I := 0 to 255 do
|
|
begin
|
|
SR.Bottom := ARect.Top + MulDiv(I + 1, H, 256);
|
|
with Canvas do
|
|
begin
|
|
R := FromR + MulDiv(I, ToR - FromR, 255);
|
|
G := FromG + MulDiv(I, ToG - FromG, 255);
|
|
B := FromB + MulDiv(I, ToB - FromB, 255);
|
|
Brush.Color := RGB(R, G, B);
|
|
FillRect(SR);
|
|
end;
|
|
SR.Top := SR.Bottom;
|
|
end;
|
|
end;
|
|
|
|
procedure TransparentDraw(DrawDC: HDC; Brush: HBRUSH; FullRect, R: TRect; ABitmap: TBitmap;
|
|
AImages: TCurImageList; AImageIndex: Integer;
|
|
AEnabled, AGrayScale, AFlat, ASelected, ADown, APressed, AShadow, ATransparent: Boolean;
|
|
AFadedColor: TColor; ImageListBkColor: TColor);
|
|
const
|
|
ROP_DSPDxax = $00E20746;
|
|
AndOrBitBltFlags: array[Boolean] of DWORD = (MERGEPAINT, SRCAND);
|
|
BitBltFlags: array[Boolean] of DWORD = (SRCINVERT, ROP_DSPDxax);
|
|
type
|
|
// PColors = ^TColors;
|
|
// TColors = array[0..MaxInt - 1] of Byte;
|
|
TColors = array of Byte;
|
|
var
|
|
W, H, BW, BH, X, Y: Integer;
|
|
DC, BDC, MaskDC: HDC;
|
|
B, BitmapHandle, PrevBitmapHandle, MaskHandle: HBITMAP;
|
|
PrevPalette: HPALETTE;
|
|
BI: TBitmapInfo;
|
|
ATransparentColor, ATextColor, ABackColor: COLORREF;
|
|
ABrush: HBRUSH;
|
|
|
|
function GetBitmapColors(ABitmap: HBITMAP): TColors;
|
|
begin
|
|
with BI.bmiHeader do
|
|
begin
|
|
biSize := SizeOf(BI.bmiHeader);
|
|
biWidth := BW;
|
|
biHeight := -BH;
|
|
biPlanes := 1;
|
|
biBitCount := 32;
|
|
biCompression := BI_RGB;
|
|
|
|
// GetMem(Result, 4 * BW * BH);
|
|
SetLength(Result, 4 * BW * BH);
|
|
GetDIBits(DrawDC, ABitmap, 0, BH, Result, BI, DIB_RGB_COLORS);
|
|
end;
|
|
end;
|
|
|
|
procedure SetBitmapColors(ABitmap: HBITMAP; AColors: TColors);
|
|
begin
|
|
SetDIBits(DrawDC, ABitmap, 0, BH, AColors, BI, DIB_RGB_COLORS);
|
|
// FreeMem(AColors);
|
|
end;
|
|
|
|
procedure CreateGrayScaleBitmap;
|
|
var
|
|
Colors: TColors;
|
|
I, J, K: Integer;
|
|
AColor: COLORREF;
|
|
begin
|
|
Colors := GetBitmapColors(BitmapHandle);
|
|
try
|
|
for I := 0 to BW - 1 do
|
|
for J := 0 to BH - 1 do
|
|
begin
|
|
K := (J * BW + I) * 4;
|
|
AColor := (Colors[K] + Colors[K + 1] + Colors[K + 2]) div 3;
|
|
Colors[K] := AColor;
|
|
Colors[K + 1] := AColor;
|
|
Colors[K + 2] := AColor;
|
|
end;
|
|
finally
|
|
SetBitmapColors(BitmapHandle, Colors);
|
|
end;
|
|
end;
|
|
|
|
procedure CreateFadedBitmap;
|
|
var
|
|
Colors: TColors;
|
|
I, J, K, P1, P2, AColor: Integer;
|
|
R, G, B: Byte;
|
|
begin
|
|
Colors := GetBitmapColors(BitmapHandle);
|
|
try
|
|
R := GetRValue(AFadedColor);
|
|
G := GetGValue(AFadedColor);
|
|
B := GetBValue(AFadedColor);
|
|
P1 := 192;
|
|
// P1 := 100;
|
|
P2 := 64;
|
|
for I := 0 to BW - 1 do
|
|
for J := 0 to BH - 1 do
|
|
begin
|
|
K := (J * BW + I) * 4;
|
|
AColor := (77 * Colors[K] + 151 * Colors[K + 1] + 28 * Colors[K + 2]) div 256;
|
|
AColor := (AColor * P1 + 255 * (256 - P1)) div 256;
|
|
Colors[K] := (P2 * AColor + (256 - P2) * B) div 256;
|
|
Colors[K + 1] := (P2 * AColor + (256 - P2) * G) div 256;
|
|
Colors[K + 2] := (P2 * AColor + (256 - P2) * R) div 256;
|
|
end;
|
|
finally
|
|
SetBitmapColors(BitmapHandle, Colors);
|
|
end;
|
|
end;
|
|
|
|
procedure MakeBitmapDingy;
|
|
var
|
|
Colors: TColors;
|
|
I, J, K: Integer;
|
|
|
|
procedure LightColor(var AColor: Byte);
|
|
begin
|
|
Inc(AColor, MulDiv(255 - AColor, 3, 10));
|
|
end;
|
|
|
|
begin
|
|
Colors := GetBitmapColors(BitmapHandle);
|
|
try
|
|
for I := 0 to BW - 1 do
|
|
for J := 0 to BH - 1 do
|
|
begin
|
|
K := (J * BW + I) * 4;
|
|
LightColor(Colors[K]);
|
|
LightColor(Colors[K + 1]);
|
|
LightColor(Colors[K + 2]);
|
|
end;
|
|
finally
|
|
SetBitmapColors(BitmapHandle, Colors);
|
|
end;
|
|
end;
|
|
|
|
procedure DrawShadow;
|
|
var
|
|
LogBrush: TLogBrush;
|
|
begin
|
|
GetObject(Brush, SizeOf(LogBrush), @LogBrush);
|
|
ATextColor := SetTextColor(DC, GetSysColor(COLOR_BTNSHADOW));
|
|
ABackColor := SetBkColor(DC, LogBrush.lbColor);
|
|
ABrush := SelectObject(DC, Brush);
|
|
StretchBlt(DC, X + ImageShadowSize, Y + ImageShadowSize, W, H, MaskDC,
|
|
0, 0, BW, BH, SRCCOPY);
|
|
SelectObject(DC, ABrush);
|
|
SetTextColor(DC, ATextColor);
|
|
SetBkColor(DC, ABackColor);
|
|
end;
|
|
|
|
function InvertImage: Boolean;
|
|
begin
|
|
Result :=
|
|
not AGrayScale and not (AFlat and ASelected) and (GetSysColor(COLOR_BTNFACE) = 0);
|
|
end;
|
|
|
|
var
|
|
AFaded: Boolean;
|
|
begin
|
|
AFaded := AFadedColor <> clNone;
|
|
if AFaded then AFadedColor := ColorToRGB(AFadedColor);
|
|
with R do
|
|
begin
|
|
W := Right - Left;
|
|
H := Bottom - Top;
|
|
if (ABitmap = nil) or ABitmap.Empty then
|
|
begin
|
|
BW := AImages.Width;
|
|
BH := AImages.Height;
|
|
end
|
|
else
|
|
begin
|
|
BW := ABitmap.Width;
|
|
BH := ABitmap.Height;
|
|
end;
|
|
OffsetRect(R, -FullRect.Left, -FullRect.Top);
|
|
|
|
DC := CreateCompatibleDC(DrawDC);
|
|
with FullRect do
|
|
B := CreateCompatibleBitmap(DrawDC, Right - Left, Bottom - Top);
|
|
B := SelectObject(DC, B);
|
|
PrevPalette := SelectPalette(DC, GetCurrentObject(DrawDC, OBJ_PAL), True);
|
|
RealizePalette(DC);
|
|
try
|
|
with FullRect do
|
|
if ATransparent then
|
|
BitBlt(DC, 0, 0, Right - Left, Bottom - Top, DrawDC, Left, Top, SRCCOPY)
|
|
else
|
|
FillRect(DC, Rect(0, 0, Right - Left, Bottom - Top), Brush);
|
|
|
|
if AEnabled or AFaded then
|
|
begin
|
|
BDC := CreateCompatibleDC(DrawDC);
|
|
BitmapHandle := CreateCompatibleBitmap(DrawDC, BW, BH);
|
|
PrevBitmapHandle := SelectObject(BDC, BitmapHandle);
|
|
try
|
|
if (ABitmap = nil) or ABitmap.Empty then
|
|
begin
|
|
ABrush := CreateSolidBrush(ColorToRGB(ImageListBkColor));
|
|
FillRect(BDC, Rect(0, 0, BW, BH), ABrush);
|
|
DeleteObject(ABrush);
|
|
ImageList_Draw(AImages.Handle, AImageIndex, BDC, 0, 0, ILD_NORMAL);
|
|
end
|
|
else
|
|
BitBlt(BDC, 0, 0, BW, BH, ABitmap.Canvas.Handle, 0, 0, SRCCOPY);
|
|
|
|
ATransparentColor := GetPixel(BDC, 0, BH - 1);
|
|
|
|
MaskDC := CreateCompatibleDC(DrawDC);
|
|
MaskHandle := CreateBitmap(BW, BH, 1, 1, nil);
|
|
MaskHandle := SelectObject(MaskDC, MaskHandle);
|
|
try
|
|
ABackColor := SetBkColor(BDC, ATransparentColor);
|
|
BitBlt(MaskDC, 0, 0, BW, BH, BDC, 0, 0, SRCCOPY);
|
|
SetBkColor(BDC, ABackColor);
|
|
|
|
if not AEnabled and AFaded then
|
|
CreateFadedBitmap
|
|
else
|
|
if AGrayScale then
|
|
CreateGrayScaleBitmap;
|
|
|
|
if (AEnabled or not AFaded) and AFlat and not ASelected and not ADown and not AGrayScale and
|
|
dxBarMakeInactiveImagesDingy and (BitsPerPixel > 8) then
|
|
MakeBitmapDingy;
|
|
|
|
X := Left;
|
|
Y := Top;
|
|
if AFlat and AShadow and ASelected and not APressed {and not ADown} then
|
|
begin
|
|
Dec(X, ImageShadowSize div 2);
|
|
Dec(Y, ImageShadowSize div 2);
|
|
DrawShadow;
|
|
end;
|
|
|
|
StretchBlt(DC, X, Y, W, H, MaskDC, 0, 0, BW, BH, AndOrBitBltFlags[InvertImage]);
|
|
BitBlt(BDC, 0, 0, BW, BH, MaskDC, 0, 0, SRCPAINT);
|
|
StretchBlt(DC, X, Y, W, H, BDC, 0, 0, BW, BH, AndOrBitBltFlags[not InvertImage]);
|
|
finally
|
|
DeleteObject(SelectObject(MaskDC, MaskHandle));
|
|
DeleteDC(MaskDC);
|
|
end;
|
|
finally
|
|
SelectObject(BDC, PrevBitmapHandle);
|
|
DeleteObject(BitmapHandle);
|
|
DeleteDC(BDC);
|
|
end
|
|
end
|
|
else
|
|
begin
|
|
MaskDC := CreateCompatibleDC(DrawDC);
|
|
MaskHandle := CreateBitmap(BW, BH, 1, 1, nil);
|
|
MaskHandle := SelectObject(MaskDC, MaskHandle);
|
|
try
|
|
if (ABitmap = nil) or ABitmap.Empty then
|
|
begin
|
|
FillRect(MaskDC, Rect(0, 0, BW, BH), GetStockObject(WHITE_BRUSH));
|
|
ImageList_Draw(AImages.Handle, AImageIndex, MaskDC, 0, 0, ILD_NORMAL);
|
|
end
|
|
else
|
|
begin
|
|
BitBlt(MaskDC, 0, 0, BW, BH, ABitmap.Canvas.Handle, 0, 0, SRCCOPY);
|
|
ABackColor := SetBkColor(ABitmap.Canvas.Handle, ColorToRGB(ABitmap.TransparentColor));
|
|
BitBlt(MaskDC, 0, 0, BW, BH, ABitmap.Canvas.Handle, 0, 0, BitBltFlags[IsWin95]);
|
|
SetBkColor(ABitmap.Canvas.Handle, ABackColor);
|
|
end;
|
|
|
|
ATextColor := SetTextColor(DC, $FFFFFF);
|
|
ABackColor := SetBkColor(DC, 0);
|
|
ABrush := SelectObject(DC, GetSysColorBrush(COLOR_BTNHIGHLIGHT));
|
|
if not AFlat then
|
|
StretchBlt(DC, Left + 1, Top + 1, W, H, MaskDC, 0, 0, BW, BH, ROP_DSPDxax);
|
|
SelectObject(DC, GetSysColorBrush(COLOR_BTNSHADOW));
|
|
StretchBlt(DC, Left, Top, W, H, MaskDC, 0, 0, BW, BH, ROP_DSPDxax);
|
|
SelectObject(DC, ABrush);
|
|
SetTextColor(DC, ATextColor);
|
|
SetBkColor(DC, ABackColor);
|
|
finally
|
|
DeleteObject(SelectObject(MaskDC, MaskHandle));
|
|
DeleteDC(MaskDC);
|
|
end;
|
|
end;
|
|
|
|
with FullRect do
|
|
BitBlt(DrawDC, Left, Top, Right - Left, Bottom - Top, DC, 0, 0, SRCCOPY);
|
|
finally
|
|
SelectPalette(DC, PrevPalette, False);
|
|
DeleteObject(SelectObject(DC, B));
|
|
DeleteDC(DC);
|
|
end;
|
|
end;
|
|
end;
|
|
{
|
|
procedure TransparentDrawEx(DrawDC: HDC; SourceDC: HDC; R: TRect; Brush: HBRUSH);
|
|
const
|
|
ROP_DSPDxax = $00E20746;
|
|
CopyBitBltFlags: array[Boolean] of DWORD = (SRCCOPY, NOTSRCCOPY);
|
|
var
|
|
W, H: Integer;
|
|
MaskDC: HDC;
|
|
MaskHandle: HBITMAP;
|
|
PrevPalette: HPALETTE;
|
|
ATextColor, ABackColor: COLORREF;
|
|
ABrush: HBRUSH;
|
|
begin
|
|
with R do
|
|
begin
|
|
W := Right - Left;
|
|
H := Bottom - Top;
|
|
|
|
PrevPalette := SelectPalette(SourceDC, GetCurrentObject(DrawDC, OBJ_PAL), True);
|
|
RealizePalette(SourceDC);
|
|
try
|
|
MaskDC := CreateCompatibleDC(DrawDC);
|
|
MaskHandle := CreateBitmap(W, H, 1, 1, nil);
|
|
MaskHandle := SelectObject(MaskDC, MaskHandle);
|
|
try
|
|
ABackColor := SetBkColor(SourceDC, GetPixel(SourceDC, 0, H - 1));
|
|
BitBlt(MaskDC, 0, 0, W, H, SourceDC, 0, 0, SRCCOPY);
|
|
SetBkColor(SourceDC, ABackColor);
|
|
|
|
StretchBlt(DrawDC, Left, Top, W, H, SourceDC, 0, 0, W, H,
|
|
CopyBitBltFlags[(GetSysColor(COLOR_BTNFACE) = 0)]);
|
|
|
|
ATextColor := SetTextColor(DrawDC, 0);
|
|
ABackColor := SetBkColor(DrawDC, $FFFFFF);
|
|
ABrush := SelectObject(DrawDC, Brush);
|
|
StretchBlt(DrawDC, Left, Top, W, H, MaskDC, 0, 0, W, H, ROP_DSPDxax);
|
|
SelectObject(DrawDC, ABrush);
|
|
SetTextColor(DrawDC, ATextColor);
|
|
SetBkColor(DrawDC, ABackColor);
|
|
finally
|
|
DeleteObject(SelectObject(MaskDC, MaskHandle));
|
|
DeleteDC(MaskDC);
|
|
end;
|
|
finally
|
|
SelectPalette(SourceDC, PrevPalette, False);
|
|
end;
|
|
end;
|
|
end;
|
|
}
|
|
|
|
{ toolbars global function }
|
|
|
|
{function SMCaptionY: Integer;
|
|
begin
|
|
Result := GetSystemMetrics(SM_CYSMCAPTION);
|
|
end;
|
|
}
|
|
procedure ProcessMouseMessages;
|
|
var
|
|
Msg: TMsg;
|
|
begin
|
|
while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_NOREMOVE) do
|
|
begin
|
|
case Integer(GetMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST)) of
|
|
-1: Break;
|
|
0: begin
|
|
PostQuitMessage(Msg.wParam);
|
|
Break;
|
|
end;
|
|
end;
|
|
DispatchMessage(Msg);
|
|
end;
|
|
end;
|
|
|
|
procedure ProcessPaintMessages;
|
|
var
|
|
Msg: TMsg;
|
|
begin
|
|
while PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_NOREMOVE) do
|
|
begin
|
|
case Integer(GetMessage(Msg, 0, WM_PAINT, WM_PAINT)) of
|
|
-1: Break;
|
|
0: begin
|
|
PostQuitMessage(Msg.wParam);
|
|
Break;
|
|
end;
|
|
end;
|
|
DispatchMessage(Msg);
|
|
end;
|
|
end;
|
|
|
|
type
|
|
TPlaySoundType = (psMenuPopup, psMenuCommand, psStopPlay);
|
|
|
|
procedure PlaySound(APlaySoundType: TPlaySoundType);
|
|
const
|
|
PlaySounds: array[TPlaySoundType] of PChar = ('MenuPopup', 'MenuCommand', nil);
|
|
begin
|
|
if dxBarPlaySound then
|
|
MMSystem.PlaySound(PlaySounds[APlaySoundType], 0,
|
|
SND_ALIAS or SND_ASYNC or SND_NODEFAULT {or SND_NOSTOP }or SND_NOWAIT);
|
|
end;
|
|
|
|
procedure InitMMSystem;
|
|
begin
|
|
PlaySound(psStopPlay);
|
|
end;
|
|
|
|
procedure CreateEditFontHandle(Font: TFont; var EditFontHandle: HFONT; Scaled: Boolean);
|
|
var
|
|
SystemLogFont, LogFont: TLogFont;
|
|
begin
|
|
if EditFontHandle <> 0 then DeleteObject(EditFontHandle);
|
|
if Scaled then
|
|
begin
|
|
SystemParametersInfo(SPI_GETICONTITLELOGFONT, SizeOf(SystemLogFont), @SystemLogFont, 0);
|
|
GetObject(Font.Handle, SizeOf(LogFont), @LogFont);
|
|
LogFont.lfHeight := SystemLogFont.lfHeight;
|
|
with LogFont do
|
|
if lfHeight > -11 then lfHeight := -11;
|
|
EditFontHandle := CreateFontIndirect(LogFont);
|
|
end
|
|
else
|
|
EditFontHandle := CloneFont(Font.Handle);
|
|
end;
|
|
|
|
function CloneFont(Source: HFONT): HFONT;
|
|
var
|
|
LogFont: TLogFont;
|
|
begin
|
|
GetObject(Source, SizeOf(LogFont), @LogFont);
|
|
Result := CreateFontIndirect(LogFont);
|
|
end;
|
|
|
|
procedure RestoreClipRgn(DC: HDC; var AClipRgn: HRGN; var AClipRgnExists: Boolean);
|
|
begin
|
|
if AClipRgnExists then
|
|
SelectClipRgn(DC, AClipRgn)
|
|
else
|
|
SelectClipRgn(DC, 0);
|
|
DeleteObject(AClipRgn);
|
|
end;
|
|
|
|
procedure SaveClipRgn(DC: HDC; var AClipRgn: HRGN; var AClipRgnExists: Boolean);
|
|
begin
|
|
AClipRgn := CreateRectRgn(0, 0, 0, 0);
|
|
AClipRgnExists := GetClipRgn(DC, AClipRgn) = 1;
|
|
end;
|
|
|
|
procedure AddClipRect(DC: HDC; const R: TRect);
|
|
var
|
|
ARgn: HRGN;
|
|
begin
|
|
with R do
|
|
ARgn := CreateRectRgn(Left, Top, Right, Bottom);
|
|
ExtSelectClipRgn(DC, ARgn, RGN_OR);
|
|
DeleteObject(ARgn);
|
|
end;
|
|
|
|
procedure ExcludeRect(var MainRgn: HRGN; const R: TRect);
|
|
var
|
|
TempRgn: HRGN;
|
|
begin
|
|
TempRgn := CreateRectRgnIndirect(R);
|
|
CombineRgn(MainRgn, MainRgn, TempRgn, RGN_DIFF);
|
|
DeleteObject(TempRgn);
|
|
end;
|
|
|
|
function GetRealColor(AColor: COLORREF): COLORREF;
|
|
var
|
|
DC: HDC;
|
|
begin
|
|
DC := GetDC(0);
|
|
Result := GetNearestColor(DC, AColor);
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
procedure FillBackgroundRect(DC: HDC; ADestR, ASourceR: TRect; ABrush: HBRUSH;
|
|
AColor: TColor; ABitmap: TBitmap);
|
|
var
|
|
ABrushExist: Boolean;
|
|
begin
|
|
if (ABitmap <> nil) and not ABitmap.Empty then
|
|
FillRectByBitmap(DC, ADestR, ASourceR, ABitmap)
|
|
else
|
|
begin
|
|
ABrushExist := ABrush <> 0;
|
|
if not ABrushExist then
|
|
ABrush := CreateSolidBrush(ColorToRGB(AColor));
|
|
FillRect(DC, ADestR, ABrush);
|
|
if not ABrushExist then
|
|
DeleteObject(ABrush);
|
|
end;
|
|
end;
|
|
|
|
procedure FillRectByBitmap(DC: HDC; ADestR, ASourceR: TRect; ABitmap: TBitmap);
|
|
var
|
|
W, H, RW, RH: Integer;
|
|
I, J, XStart, XEnd, YStart, YEnd, X, Y: Integer;
|
|
AClipRgn: HRGN;
|
|
AClipRgnExists: Boolean;
|
|
begin
|
|
W := ABitmap.Width;
|
|
H := ABitmap.Height;
|
|
RW := ASourceR.Right - ASourceR.Left;
|
|
RH := ASourceR.Bottom - ASourceR.Top;
|
|
if (W = 0) or (H = 0) or (RW = 0) or (RH = 0) then Exit;
|
|
XStart := ASourceR.Left div W;
|
|
XEnd := (ASourceR.Right - 1) div W;
|
|
YStart := ASourceR.Top div H;
|
|
YEnd := (ASourceR.Bottom - 1) div H;
|
|
SaveClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
with ADestR do
|
|
IntersectClipRect(DC, Left, Top, Right, Bottom);
|
|
for J := YStart to YEnd do
|
|
for I := XStart to XEnd do
|
|
begin
|
|
Y := J * H - (ASourceR.Top - ADestR.Top);
|
|
X := I * W - (ASourceR.Left - ADestR.Left);
|
|
BitBlt(DC, X, Y, W, H, ABitmap.Canvas.Handle, 0, 0, SRCCOPY);
|
|
end;
|
|
RestoreClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
end;
|
|
|
|
{ mouse tracking functions }
|
|
|
|
var
|
|
FMouseTrackingWnd: HWND;
|
|
FMouseTrackingTimerID: UINT;
|
|
|
|
function MouseTracking(AWnd: HWND): Boolean;
|
|
var
|
|
Event: TTrackMouseEvent;
|
|
begin
|
|
if @TrackMouseEvent <> nil then
|
|
begin
|
|
with Event do
|
|
begin
|
|
cbSize := SizeOf(Event);
|
|
dwFlags := TME_QUERY;
|
|
hwndTrack := AWnd;
|
|
end;
|
|
TrackMouseEvent(Event);
|
|
Result := Event.dwFlags and TME_LEAVE <> 0;
|
|
end
|
|
else Result := AWnd = FMouseTrackingWnd;
|
|
end;
|
|
|
|
procedure FinishMouseTracking(AWnd: HWND);
|
|
var
|
|
Event: TTrackMouseEvent;
|
|
begin
|
|
if MouseTracking(AWnd) then
|
|
begin
|
|
if @TrackMouseEvent <> nil then
|
|
begin
|
|
with Event do
|
|
begin
|
|
cbSize := SizeOf(Event);
|
|
dwFlags := TME_LEAVE or TME_CANCEL;
|
|
hwndTrack := AWnd;
|
|
end;
|
|
TrackMouseEvent(Event);
|
|
end
|
|
else
|
|
begin
|
|
KillTimer(0, FMouseTrackingTimerID);
|
|
FMouseTrackingTimerID := 0;
|
|
FMouseTrackingWnd := 0;
|
|
end;
|
|
SendMessage(AWnd, WM_MOUSELEAVE, 0, 0);
|
|
end;
|
|
end;
|
|
|
|
procedure MouseTrackingTimerProc(Wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
GetCursorPos(P);
|
|
Wnd := WindowFromPointEx(P);
|
|
if Wnd <> FMouseTrackingWnd then
|
|
FinishMouseTracking(FMouseTrackingWnd);
|
|
end;
|
|
|
|
procedure StartMouseTracking(AWnd: HWND);
|
|
var
|
|
Event: TTrackMouseEvent;
|
|
begin
|
|
if not MouseTracking(AWnd) then
|
|
if @TrackMouseEvent <> nil then
|
|
begin
|
|
with Event do
|
|
begin
|
|
cbSize := SizeOf(Event);
|
|
dwFlags := TME_LEAVE;
|
|
hwndTrack := AWnd;
|
|
end;
|
|
TrackMouseEvent(Event);
|
|
end
|
|
else
|
|
begin
|
|
if FMouseTrackingWnd <> 0 then FinishMouseTracking(FMouseTrackingWnd);
|
|
FMouseTrackingWnd := AWnd;
|
|
FMouseTrackingTimerID := SetTimer(0, 0, 50, @MouseTrackingTimerProc);
|
|
end;
|
|
end;
|
|
|
|
{ internal item list }
|
|
|
|
procedure ClearInternalItemList;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
with InternalItemList do
|
|
for I := Count - 1 downto 0 do
|
|
with TdxBarItem(Items[I]) do
|
|
if not HasControls then Free;
|
|
end;
|
|
|
|
{ test of mouse keys pressing }
|
|
|
|
function LeftButtonPressed: Boolean;
|
|
begin
|
|
if GetSystemMetrics(SM_SWAPBUTTON) = 0 then
|
|
Result := GetAsyncKeyState(VK_LBUTTON) < 0
|
|
else
|
|
Result := GetAsyncKeyState(VK_RBUTTON) < 0;
|
|
end;
|
|
|
|
function RightButtonPressed: Boolean;
|
|
begin
|
|
if GetSystemMetrics(SM_SWAPBUTTON) = 0 then
|
|
Result := GetAsyncKeyState(VK_RBUTTON) < 0
|
|
else
|
|
Result := GetAsyncKeyState(VK_LBUTTON) < 0;
|
|
end;
|
|
|
|
procedure DrawSizeGrip(DC: HDC; R: TRect);
|
|
const
|
|
ROP_DSPDxax = $00E20746;
|
|
var
|
|
APrevBitmap, ATempBitmap, AMaskBitmap: HBITMAP;
|
|
TempDC, MDC, MaskDC: HDC;
|
|
W, H: Integer;
|
|
APrevBkColor: COLORREF;
|
|
begin
|
|
W := R.Right - R.Left;
|
|
H := R.Bottom - R.Top;
|
|
TempDC := CreateCompatibleDC(DC);
|
|
ATempBitmap := SelectObject(TempDC, CreateCompatibleBitmap(DC, W, H));
|
|
try
|
|
BitBlt(TempDC, 0, 0, W, H, DC, R.Left, R.Top, SRCCOPY); // 1
|
|
MDC := CreateCompatibleDC(DC);
|
|
APrevBitmap := SelectObject(MDC, CreateCompatibleBitmap(DC, W, H));
|
|
DrawFrameControl(MDC, Rect(0, 0, W, H), DFC_SCROLL, DFCS_SCROLLSIZEGRIP); // 2
|
|
|
|
MaskDC := CreateCompatibleDC(DC);
|
|
AMaskBitmap := SelectObject(MaskDC, CreateBitmap(W, H, 1, 1, nil));
|
|
try
|
|
APrevBkColor := SetBkColor(MDC, ColorToRGB(clBtnFace)); //!
|
|
BitBlt(MaskDC, 0, 0, W, H, MDC, 0, 0, SRCCOPY);
|
|
SetBkColor(MDC, APrevBkColor);
|
|
|
|
BitBlt(TempDC, 0, 0, W, H, MaskDC, 0, 0, MERGEPAINT);
|
|
BitBlt(MDC, 0, 0, W, H, MaskDC, 0, 0, SRCPAINT);
|
|
BitBlt(TempDC, 0, 0, W, H, MDC, 0, 0, SRCAND);
|
|
finally
|
|
DeleteObject(SelectObject(MaskDC, AMaskBitmap));
|
|
DeleteDC(MaskDC);
|
|
end;
|
|
|
|
DeleteObject(SelectObject(MDC, APrevBitmap));
|
|
DeleteDC(MDC);
|
|
|
|
BitBlt(DC, R.Left, R.Top, W, H, TempDC, 0, 0, SRCCOPY);
|
|
finally
|
|
DeleteObject(SelectObject(TempDC, ATempBitmap));
|
|
DeleteDC(TempDC);
|
|
end;
|
|
end;
|
|
|
|
{ XP routines }
|
|
|
|
function ThemeEditState(ABarEditControl: TdxBarEditControl): Integer;
|
|
begin
|
|
if not ABarEditControl.Enabled then
|
|
Result := ETS_DISABLED
|
|
else
|
|
if ABarEditControl.ReadOnly then
|
|
Result := ETS_READONLY
|
|
else
|
|
Result := ETS_NORMAL;
|
|
end;
|
|
|
|
function ThemeEditColor(ATheme: TdxTheme; AEditState: Integer): COLORREF;
|
|
begin
|
|
Result := GetSysColor(COLOR_WINDOW);
|
|
if AEditState = ETS_DISABLED then
|
|
begin
|
|
if FAILED(GetThemeColor(ATheme, EP_EDITTEXT, AEditState, TMT_FILLCOLOR, Result)) then
|
|
Result := GetSysColor(COLOR_WINDOW);
|
|
end;
|
|
end;
|
|
|
|
function ThemeEditTextColor(ATheme: TdxTheme; AEditState: Integer): COLORREF;
|
|
begin
|
|
if FAILED(GetThemeColor(ATheme, EP_EDITTEXT, AEditState, TMT_TEXTCOLOR, Result)) then
|
|
begin
|
|
if AEditState = ETS_DISABLED then
|
|
Result := GetSysColor(COLOR_GRAYTEXT)
|
|
else
|
|
Result := GetSysColor(COLOR_WINDOWTEXT);
|
|
end;
|
|
end;
|
|
|
|
function ThemeToolbarColor: COLORREF;
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
ATheme := OpenTheme(totToolbar);
|
|
if FAILED(GetThemeColor(ATheme, 0, 0, TMT_FILLCOLOR, Result)) then
|
|
Result := COLOR_BTNFACE;
|
|
end;
|
|
|
|
function ThemeCloseButtonSize(DC: HDC): TSize;
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
ATheme := OpenTheme(totWindow);
|
|
GetThemePartSize(ATheme, DC, WP_SMALLCLOSEBUTTON, CBS_NORMAL,
|
|
nil, TS_TRUE, @Result);
|
|
end;
|
|
|
|
procedure ThemeDrawCloseButton(DC: HDC; var R: TRect; ASelected, APressed: Boolean;
|
|
ACorner: TdxCorner);
|
|
const
|
|
ButtonStates: array [TdxBarMarkState] of Integer = (CBS_NORMAL, CBS_HOT, CBS_PUSHED);
|
|
var
|
|
ATheme: TdxTheme;
|
|
AState, X: Integer;
|
|
ASize: TSize;
|
|
begin
|
|
ATheme := OpenTheme(totWindow);
|
|
if APressed then
|
|
AState := CBS_PUSHED
|
|
else
|
|
if ASelected then
|
|
AState := CBS_HOT
|
|
else
|
|
AState := CBS_NORMAL;
|
|
ASize := ThemeCloseButtonSize(DC);
|
|
if (R.Bottom - R.Top) > ASize.cy then
|
|
X := ((R.Bottom - R.Top) - ASize.cy) div 2
|
|
else
|
|
X := 0;
|
|
with R do
|
|
begin
|
|
if ACorner in [coTopRight, coBottomRight] then
|
|
begin
|
|
Inc(Left, X);
|
|
Right := Left + ASize.cx;
|
|
end
|
|
else
|
|
begin
|
|
Dec(Right, X);
|
|
Left := Right - ASize.cx;
|
|
end;
|
|
Inc(Top, X);
|
|
Bottom := Top + ASize.cy;
|
|
end;
|
|
FillRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
|
|
DrawThemeBackground(ATheme, DC, WP_SMALLCLOSEBUTTON, AState, @R);
|
|
end;
|
|
|
|
function ThemeSizeGripSize(DC: HDC): TSize;
|
|
const
|
|
Offset = 2; // !
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
ATheme := OpenTheme(totScrollBar);
|
|
GetThemePartSize(ATheme, DC, SBP_SIZEBOX, SZB_RIGHTALIGN,
|
|
nil, TS_TRUE, @Result);
|
|
Result.cx := Result.cx + Offset;
|
|
Result.cy := Result.cy + Offset;
|
|
end;
|
|
|
|
procedure ThemeDrawSizeGrip(DC: HDC; var R: TRect; ACorner: TdxCorner);
|
|
const
|
|
Offset = 2; // !
|
|
Delta = 1;
|
|
var
|
|
ATheme: TdxTheme;
|
|
AMirrorX, AMirrorY: Boolean;
|
|
R1: TRect;
|
|
AScrollBarSize: TSize;
|
|
APrevBitmap: HBITMAP;
|
|
MDC: HDC;
|
|
X, Y: Integer;
|
|
begin
|
|
ATheme := OpenTheme(totScrollBar);
|
|
AScrollBarSize := ThemeSizeGripSize(DC);
|
|
|
|
with R do
|
|
begin
|
|
if ACorner in [coTopRight, coBottomRight] then
|
|
Left := Right - AScrollBarSize.cx - Delta
|
|
else
|
|
Right := Left + AScrollBarSize.cx + Delta;
|
|
if ACorner in [coBottomLeft, coBottomRight] then
|
|
Top := Bottom - AScrollBarSize.cy
|
|
else
|
|
Bottom := Top + AScrollBarSize.cy;
|
|
AMirrorX := ACorner in [coTopLeft, coBottomLeft];
|
|
AMirrorY := ACorner in [coTopLeft, coTopRight];
|
|
end;
|
|
|
|
FillRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
|
|
|
|
R1 := R;
|
|
with R1 do
|
|
begin
|
|
if AMirrorX then
|
|
Dec(Right, Offset)
|
|
else
|
|
Inc(Left, Offset);
|
|
if AMirrorY then
|
|
Dec(Bottom, Offset)
|
|
else
|
|
Inc(Top, Offset);
|
|
end;
|
|
|
|
X := R1.Left;
|
|
Y := R1.Top;
|
|
OffsetRect(R1, -R1.Left, -R1.Top);
|
|
MDC := CreateCompatibleDC(DC);
|
|
APrevBitmap := SelectObject(MDC, CreateCompatibleBitmap(DC, R1.Right, R1.Bottom));
|
|
FillRect(MDC, R1, COLOR_BTNFACE + 1);
|
|
DrawThemeBackground(ATheme, MDC, SBP_SIZEBOX, SZB_RIGHTALIGN, @R1);
|
|
with R1 do
|
|
StretchBlt(DC, X, Y, Right, Bottom,
|
|
MDC, Byte(AMirrorX) * (Right - 1), Byte(AMirrorY) * (Bottom - 1),
|
|
(2 * Byte(not AMirrorX) - 1) * Right,
|
|
(2 * Byte(not AMirrorY) - 1) * Bottom, SRCCOPY);
|
|
DeleteObject(SelectObject(MDC, APrevBitmap));
|
|
DeleteDC(MDC);
|
|
end;
|
|
|
|
{ TdxBarToolbarsPopup }
|
|
|
|
type
|
|
TdxBarToolbarsPopup = class(TdxBarSubMenuControl)
|
|
protected
|
|
function GetIsCustomizing: Boolean; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
end;
|
|
|
|
constructor TdxBarToolbarsPopup.Create(AOwner: TComponent);
|
|
begin
|
|
ClearInternalItemList;
|
|
inherited Create(AOwner);
|
|
FItemLinks := TdxBarItemLinks.Create(BarManager);
|
|
FItemLinks.FOwner := Self;
|
|
BarManager.CreateToolbarsPopupList(FItemLinks);
|
|
FItemLinks.FBarControl := Self;
|
|
end;
|
|
|
|
destructor TdxBarToolbarsPopup.Destroy;
|
|
begin
|
|
Destroying;
|
|
FItemLinks.Free;
|
|
FItemLinks := nil;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarToolbarsPopup.GetIsCustomizing: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure ShowToolbarsPopup(Sender: TCustomControl; ABarManager: TdxBarManager; P: TPoint);
|
|
var
|
|
ToolbarsPopup: TdxBarToolbarsPopup;
|
|
begin
|
|
ToolbarsPopup := TdxBarToolbarsPopup.Create(ABarManager);
|
|
with ToolbarsPopup do
|
|
if FItemLinks.Count = 0 then Free
|
|
else
|
|
begin
|
|
ABarManager.HideAll;
|
|
Left := P.X;
|
|
Top := P.Y;
|
|
FShowAnimation := True;
|
|
Show;
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarCustomizingPopup }
|
|
|
|
type
|
|
TdxBarCustomizingPopup = class(TdxBarSubMenuControl)
|
|
private
|
|
FStartIndex: Integer;
|
|
procedure TextItemChange(Sender: TObject);
|
|
procedure ItemClick(Sender: TObject);
|
|
protected
|
|
procedure DesignClick(ACode: Integer);
|
|
procedure DoCloseUp; override;
|
|
function GetIsCustomizing: Boolean; override;
|
|
procedure LoadDesignItems(AItemLinks: TdxBarItemLinks);
|
|
public
|
|
constructor CreateEx(AOwner: TComponent; ACustomizingItemLinks: TdxBarItemLinks;
|
|
ACustomizingItemLink: TdxBarItemLink); virtual;
|
|
destructor Destroy; override;
|
|
end;
|
|
|
|
var
|
|
FCustomizingPopupItemLink: TdxBarItemLink;
|
|
FCustomizingPopupItemLinks: TdxBarItemLinks;
|
|
FCreatingBarItem: Boolean;
|
|
CustomizedPopup: TdxBarCustomizingPopup;
|
|
|
|
function dxBarCustomizingPopup: TdxBarSubMenuControl;
|
|
begin
|
|
Result := CustomizedPopup;
|
|
end;
|
|
|
|
function dxBarCustomizingPopupItemLink: TdxBarItemLink;
|
|
begin
|
|
Result := FCustomizingPopupItemLink;
|
|
end;
|
|
|
|
// TODO: remove to designer
|
|
|
|
constructor TdxBarCustomizingPopup.CreateEx(AOwner: TComponent; ACustomizingItemLinks: TdxBarItemLinks;
|
|
ACustomizingItemLink: TdxBarItemLink);
|
|
var
|
|
ResStrs: array[-4..9] of string;
|
|
FItemCount: Integer;
|
|
I, J: Integer;
|
|
AItem: TdxBarItem;
|
|
ASubItem: TdxBarSubItem;
|
|
AItemLink: TdxBarItemLink;
|
|
AEmptyBar: Boolean;
|
|
CCPS: Boolean;
|
|
begin
|
|
ResStrs[-4] := cxGetResourceString(@dxSBAR_CP_ADDSUBITEM);
|
|
ResStrs[-3] := cxGetResourceString(@dxSBAR_CP_ADDBUTTON);
|
|
ResStrs[-2] := cxGetResourceString(@dxSBAR_CP_ADDITEM);
|
|
ResStrs[-1] := cxGetResourceString(@dxSBAR_CP_DELETEBAR);
|
|
ResStrs[0] := cxGetResourceString(@dxSBAR_CP_RESET);
|
|
ResStrs[1] := cxGetResourceString(@dxSBAR_CP_DELETE);
|
|
ResStrs[2] := cxGetResourceString(@dxSBAR_CP_NAME);
|
|
ResStrs[3] := cxGetResourceString(@dxSBAR_CP_DEFAULTSTYLE);
|
|
ResStrs[4] := cxGetResourceString(@dxSBAR_CP_TEXTONLYALWAYS);
|
|
ResStrs[5] := cxGetResourceString(@dxSBAR_CP_TEXTONLYINMENUS);
|
|
ResStrs[6] := cxGetResourceString(@dxSBAR_CP_IMAGEANDTEXT);
|
|
ResStrs[7] := cxGetResourceString(@dxSBAR_CP_BEGINAGROUP);
|
|
ResStrs[8] := cxGetResourceString(@dxSBAR_CP_VISIBLE);
|
|
ResStrs[9] := cxGetResourceString(@dxSBAR_CP_MOSTRECENTLYUSED);
|
|
|
|
ClearInternalItemList;
|
|
inherited Create(AOwner);
|
|
FCustomizingPopupItemLinks := ACustomizingItemLinks;
|
|
FCustomizingPopupItemLink := ACustomizingItemLink;
|
|
FShowAnimation := False;
|
|
FItemLinks := TdxBarItemLinks.Create(BarManager);
|
|
FItemLinks.FOwner := Self;
|
|
// create items
|
|
FItemCount := 8;
|
|
AEmptyBar := False;
|
|
if BarManager.Designing then
|
|
begin
|
|
FStartIndex := 4;
|
|
if FCustomizingPopupItemLink = nil then
|
|
begin
|
|
FItemCount := 0;
|
|
AEmptyBar := FCustomizingPopupItemLinks.BarControl is TdxBarControl;
|
|
end
|
|
else
|
|
Inc(FItemCount, 1 + Byte(BarManager.CanShowRecentItems));
|
|
end
|
|
else
|
|
FStartIndex := 0;
|
|
J := -FStartIndex;
|
|
for I := J to FItemCount - 1 do
|
|
begin
|
|
if (I = -1) and not AEmptyBar then
|
|
begin
|
|
Dec(FStartIndex);
|
|
Continue;
|
|
end;
|
|
if I = -2 then
|
|
begin
|
|
ASubItem := TdxBarSubItem.Create(nil);
|
|
ASubItem.FIsInternal := True;
|
|
InternalItemList.Add(ASubItem);
|
|
LoadDesignItems(ASubItem.ItemLinks);
|
|
end
|
|
else
|
|
if I = 2 then
|
|
InternalItemList.Add(TdxBarEdit.Create(nil))
|
|
else
|
|
InternalItemList.Add(TdxBarButton.Create(nil));
|
|
AItem := TdxBarItem(InternalItemList.Last);
|
|
with AItem do
|
|
begin
|
|
if (I = 2) and BarManager.Designing then
|
|
Caption := cxGetResourceString(@dxSBAR_CP_CAPTION)
|
|
else
|
|
Caption := ResStrs[I];
|
|
Tag := (I);
|
|
OnClick := ItemClick;
|
|
if I in [3..6, 7, 8, 9] then
|
|
with TdxBarButton(InternalItemList.Last) do
|
|
begin
|
|
ButtonStyle := bsChecked;
|
|
if I in [3..6] then GroupIndex := dxBarCustomizingPopupPaintStyleGroupIndex;
|
|
end;
|
|
end;
|
|
AItemLink := FItemLinks.Add;
|
|
if (I in [0, 2, 3, 7]) or (I = -1) then AItemLink.BeginGroup := True;
|
|
AItemLink.Item := AItem;
|
|
end;
|
|
FItemLinks.FBarControl := Self;
|
|
// prepare
|
|
if FItemCount > 0 then // not AEmptyBar
|
|
begin
|
|
with TdxBarEdit(ItemLinks[FStartIndex + 2].Item) do
|
|
begin
|
|
Text := FCustomizingPopupItemLink.Caption;
|
|
FOnChange := TextItemChange;
|
|
end;
|
|
CCPS := (FCustomizingPopupItemLink.Item is TdxBarButton) and
|
|
TdxBarButton(FCustomizingPopupItemLink.Item).CanChangePaintStyle;
|
|
for I := 3 to 6 do
|
|
with TdxBarButton(ItemLinks[FStartIndex + I].Item) do
|
|
begin
|
|
Enabled := CCPS;
|
|
Down :=
|
|
CCPS and (Ord(FCustomizingPopupItemLink.PaintStyle) = I - 3) or (not CCPS and (I = 3));
|
|
end;
|
|
with TdxBarButton(ItemLinks[FStartIndex + 7].Item) do
|
|
begin
|
|
Enabled := FCustomizingPopupItemLink.Index > 0;
|
|
Down := FCustomizingPopupItemLink.BeginGroup;
|
|
end;
|
|
if ItemLinks.Count > (FStartIndex + 8) then
|
|
with TdxBarButton(ItemLinks[FStartIndex + 8].Item) do
|
|
Down := FCustomizingPopupItemLink.Visible;
|
|
if ItemLinks.Count > (FStartIndex + 9) then
|
|
with TdxBarButton(ItemLinks[FStartIndex + 9].Item) do
|
|
Down := FCustomizingPopupItemLink.MostRecentlyUsed;
|
|
end;
|
|
BarManager.DoShowCustomizingPopup(FItemLinks);
|
|
end;
|
|
|
|
destructor TdxBarCustomizingPopup.Destroy;
|
|
begin
|
|
Destroying;
|
|
FItemLinks.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TdxBarCustomizingPopup.TextItemChange(Sender: TObject);
|
|
begin
|
|
if TdxBarEdit(Sender).Text = '' then
|
|
begin
|
|
if dxBarCustomizingPopup <> nil then dxBarCustomizingPopup.Hide;
|
|
Application.MessageBox(PChar(cxGetResourceString(@dxSBAR_COMMANDNAMECANNOTBEBLANK)),
|
|
PChar(Application.Title), MB_ICONSTOP);
|
|
end
|
|
else
|
|
if BarManager.Designing then
|
|
begin
|
|
FCustomizingPopupItemLink.Item.Caption := TdxBarEdit(Sender).Text;
|
|
BarManager.DesignerModified;
|
|
end
|
|
else
|
|
FCustomizingPopupItemLink.UserCaption := TdxBarEdit(Sender).Text;
|
|
end;
|
|
|
|
procedure TdxBarCustomizingPopup.ItemClick(Sender: TObject);
|
|
var
|
|
ATag: Integer;
|
|
begin
|
|
ATag := (TComponent(Sender).Tag);
|
|
if ATag < 0 then
|
|
begin
|
|
FCreatingBarItem := True;
|
|
try
|
|
DesignClick(ATag);
|
|
finally
|
|
FCreatingBarItem := False;
|
|
end;
|
|
end
|
|
else
|
|
case ATag of
|
|
0: FCustomizingPopupItemLink.UserDefine := [];
|
|
1: begin
|
|
FCustomizingPopupItemLink.Free;
|
|
FCustomizingPopupItemLink := nil;
|
|
end;
|
|
3..6:
|
|
FCustomizingPopupItemLink.UserPaintStyle :=
|
|
TdxBarPaintStyle((TComponent(Sender).Tag) - 3);
|
|
7: with FCustomizingPopupItemLink do
|
|
BeginGroup := not BeginGroup;
|
|
8: with FCustomizingPopupItemLink do
|
|
Visible := not Visible;
|
|
9: with FCustomizingPopupItemLink do
|
|
MostRecentlyUsed := not MostRecentlyUsed;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarCustomizingPopup.DesignClick(ACode: Integer);
|
|
var
|
|
ABar: TdxBar;
|
|
ABarManager: TdxBarManager;
|
|
ABarItemClass: TdxBarItemClass;
|
|
AItem: TdxBarItem;
|
|
AItemLink: TdxBarItemLink;
|
|
AItemLinks: TdxBarItemLinks;
|
|
ACategoryIndex: Integer;
|
|
begin
|
|
if ACode = -1 then
|
|
begin
|
|
if FCustomizingPopupItemLinks.BarControl is TdxBarControl then
|
|
begin
|
|
ABar := TdxBarControl(FCustomizingPopupItemLinks.BarControl).Bar;
|
|
ABar.Free;
|
|
FCustomizingPopupItemLinks := nil;
|
|
FCustomizingPopupItemLink := nil;
|
|
DeleteCustomizingBar(ABar); // update cust form
|
|
end;
|
|
Exit;
|
|
end;
|
|
if ACode = -4 then
|
|
ABarItemClass := TdxBarSubItem
|
|
else
|
|
if ACode = -3 then
|
|
ABarItemClass := TdxBarButton
|
|
else
|
|
if ACode <= -100 then
|
|
ABarItemClass := dxBarVisibleItemClass(-(ACode + 100))
|
|
else
|
|
Exit;
|
|
|
|
AItemLinks := FCustomizingPopupItemLinks;
|
|
ABarManager := AItemLinks.BarManager;
|
|
AItem := ABarItemClass.Create(ABarManager.Owner);
|
|
try
|
|
// Category
|
|
ACategoryIndex := ABarManager.Categories.IndexOf(dxSBAR_DEFAULTCATEGORYNAME);
|
|
if ACategoryIndex = -1 then ACategoryIndex := 0;
|
|
AItem.Category := ACategoryIndex;
|
|
// Name
|
|
AItem.Name := dxGenBarItemName(ABarManager, ABarItemClass);
|
|
// Caption
|
|
AItem.Caption := 'New Item';
|
|
// put in toolbar
|
|
AItemLinks.BeginUpdate;
|
|
try
|
|
AItemLink := AItemLinks.Add;
|
|
AItemLink.Item := AItem;
|
|
if FCustomizingPopupItemLink <> nil then
|
|
AItemLink.Index := FCustomizingPopupItemLink.Index + 1;
|
|
finally
|
|
AItemLinks.EndUpdate;
|
|
end;
|
|
UpdateCustomizingCommands(AItem);
|
|
if AItemLinks.BarControl <> nil then
|
|
begin
|
|
AItemLinks.BarControl.RepaintBar;
|
|
// select if visible
|
|
if not IsRectEmpty(AItemLinks.BarControl.GetItemRect(AItemLink.Control)) then
|
|
AItemLinks.BarControl.SetKeySelectedItem(AItemLink.Control);
|
|
end;
|
|
except
|
|
AItem.Free;
|
|
raise;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarCustomizingPopup.DoCloseUp;
|
|
begin
|
|
if FCustomizingPopupItemLink <> nil then
|
|
with FCustomizingPopupItemLink do
|
|
if not BarManager.FIsCustomizing and
|
|
(BarControl <> nil) and (BarControl.SelectedItem = Control) then
|
|
begin
|
|
BarManager.FSelectedItem := nil;
|
|
BarControl.SelectedItem := nil;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBarCustomizingPopup.GetIsCustomizing: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarCustomizingPopup.LoadDesignItems(AItemLinks: TdxBarItemLinks);
|
|
var
|
|
I: Integer;
|
|
AItem: TdxBarButton;
|
|
AItemLink: TdxBarItemLink;
|
|
begin
|
|
for I := 0 to dxBarVisibleItemCount - 1 do
|
|
begin
|
|
AItem := TdxBarButton.Create(nil);
|
|
AItem.Tag := (-100 - I);
|
|
AItem.Caption := dxBarVisibleItemClass(I).ClassName;
|
|
AItem.OnClick := ItemClick;
|
|
AItemLink := AItemLinks.Add;
|
|
AItemLink.Item := AItem;
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarDropDownListBox }
|
|
|
|
type
|
|
TdxBarDropDownListBox = class(TCustomListBox)
|
|
private
|
|
FCombo: TdxBarCustomCombo;
|
|
WaitForCapture: Boolean;
|
|
procedure WMCaptureChanged(var Message: TMessage); message WM_CAPTURECHANGED;
|
|
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
|
|
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
|
|
procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
|
|
procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
|
|
protected
|
|
procedure Click; override;
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
procedure CreateWnd; override;
|
|
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
|
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
property OnDrawItem;
|
|
property OnMeasureItem;
|
|
end;
|
|
|
|
constructor TdxBarDropDownListBox.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
BorderStyle := bsNone;
|
|
Style := lbOwnerDrawVariable;
|
|
Visible := False;
|
|
end;
|
|
|
|
procedure TdxBarDropDownListBox.WMCaptureChanged(var Message: TMessage);
|
|
begin
|
|
inherited;
|
|
WaitForCapture := False;
|
|
end;
|
|
|
|
procedure TdxBarDropDownListBox.WMEraseBkgnd(var Message: TWMEraseBkgnd);
|
|
begin
|
|
Message.Result := 1;
|
|
end;
|
|
|
|
procedure TdxBarDropDownListBox.WMLButtonUp(var Message: TWMLButtonUp);
|
|
var
|
|
ACombo: TdxBarCustomCombo;
|
|
AItemIndex: Integer;
|
|
AItemLink, RealItemLink: TdxBarItemLink;
|
|
begin
|
|
inherited;
|
|
if WaitForCapture then
|
|
begin
|
|
ReleaseCapture;
|
|
Exit;
|
|
end;
|
|
ACombo := FCombo;
|
|
AItemIndex := ItemIndex;
|
|
AItemLink := ACombo.CurItemLink;
|
|
RealItemLink := AItemLink.RealItemLink;
|
|
if RealItemLink <> nil then
|
|
begin
|
|
RealItemLink.BringToTopInRecentList(True);
|
|
RealItemLink.BarManager.HideAll;
|
|
end
|
|
else
|
|
AItemLink.BarManager.HideAll;
|
|
if AItemIndex > -1 then ACombo.ItemIndex := AItemIndex;
|
|
end;
|
|
|
|
procedure TdxBarDropDownListBox.WMNCCalcSize(var Message: TWMNCCalcSize);
|
|
var
|
|
ABorderSize: Integer;
|
|
begin
|
|
inherited;
|
|
ABorderSize := FCombo.BarManager.PainterClass.DropDownListBoxBorderSize;
|
|
InflateRect(Message.CalcSize_Params.rgrc[0], -ABorderSize, -ABorderSize);
|
|
end;
|
|
|
|
procedure TdxBarDropDownListBox.WMNCPaint(var Message: TWMNCPaint);
|
|
var
|
|
R: TRect;
|
|
DC: HDC;
|
|
begin
|
|
inherited;
|
|
GetWindowRect(Handle, R);
|
|
OffsetRect(R, -R.Left, -R.Top);
|
|
DC := GetWindowDC(Handle);
|
|
FCombo.BarManager.PainterClass.DropDownListBoxDrawBorder(FCombo.BarManager, DC, R);
|
|
ReleaseDC(Handle, DC);
|
|
end;
|
|
|
|
procedure TdxBarDropDownListBox.Click;
|
|
begin
|
|
if ItemIndex > -1 then
|
|
TdxBarComboControl(FCombo.CurItemLink.Control).LocalItemIndex := ItemIndex;
|
|
end;
|
|
|
|
procedure TdxBarDropDownListBox.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited;
|
|
with Params do
|
|
begin
|
|
ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
|
|
WindowClass.Style := WindowClass.Style or CS_SAVEBITS;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarDropDownListBox.CreateWnd;
|
|
begin
|
|
inherited;
|
|
Font.Handle := CloneFont(FCombo.CurItemLink.BarControl.EditFontHandle);
|
|
Font.Color := clWindowText;
|
|
Canvas.Font := Font;
|
|
Windows.SetParent(Handle, 0);
|
|
CallWindowProc(DefWndProc, Handle, WM_SETFOCUS, 0, 0);
|
|
end;
|
|
|
|
procedure TdxBarDropDownListBox.KeyDown(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
if (ItemIndex = -1) and (Items.Count > 0) then ItemIndex := TopIndex;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarDropDownListBox.MouseMove(Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if (GetCapture = Handle) and WaitForCapture and PtInRect(ClientRect, Point(X, Y)) then
|
|
begin
|
|
WaitForCapture := False;
|
|
CallWindowProc(DefWndProc, Handle, WM_LBUTTONDOWN, 0, MAKELPARAM(X, Y));
|
|
end;
|
|
inherited;
|
|
I := ItemAtPos(Point(X, Y), True);
|
|
if (0 <= I) and (I <= Items.Count - 1) then
|
|
ItemIndex := I;
|
|
end;
|
|
|
|
{ TdxBarQuickCustItem and TdxBarQuickCustItemControl }
|
|
|
|
type
|
|
TdxBarQuickCustItem = class(TdxBarButton)
|
|
public
|
|
procedure DoClick; override;
|
|
end;
|
|
|
|
TdxBarQuickCustItemControl = class(TdxBarButtonControl)
|
|
private
|
|
function GetLinkedItemLink: TdxBarItemLink;
|
|
protected
|
|
procedure ControlUnclick(ByMouse: Boolean); override;
|
|
function GetCaption: string; override;
|
|
function GetGlyph: TBitmap; override;
|
|
function GetImageIndex: Integer; override;
|
|
function GetImages(AInToolbar: Boolean): TCurImageList; override;
|
|
function GetHint: string; override;
|
|
function GetShortCut: TShortCut; override;
|
|
function GetDefaultWidth: Integer; override;
|
|
function IsDestroyOnClick: Boolean; override;
|
|
procedure Paint(ARect: TRect; PaintType: TdxBarPaintType); override;
|
|
property LinkedItemLink: TdxBarItemLink read GetLinkedItemLink;
|
|
end;
|
|
|
|
procedure TdxBarQuickCustItem.DoClick;
|
|
var
|
|
ItemLink: TdxBarItemLink;
|
|
begin
|
|
inherited;
|
|
ItemLink := TdxBarItemLink(ClickItemLink.Data);
|
|
with ItemLink do
|
|
Visible := not Visible;
|
|
end;
|
|
|
|
function TdxBarQuickCustItemControl.GetLinkedItemLink: TdxBarItemLink;
|
|
begin
|
|
Result := TdxBarItemLink(FItemLink.Data);
|
|
end;
|
|
|
|
procedure TdxBarQuickCustItemControl.ControlUnclick(ByMouse: Boolean);
|
|
begin
|
|
inherited;
|
|
Repaint;
|
|
end;
|
|
|
|
function TdxBarQuickCustItemControl.GetCaption: string;
|
|
begin
|
|
Result := LinkedItemLink.Caption;
|
|
end;
|
|
|
|
function TdxBarQuickCustItemControl.GetGlyph: TBitmap;
|
|
begin
|
|
Result := LinkedItemLink.Glyph;
|
|
end;
|
|
|
|
function TdxBarQuickCustItemControl.GetImageIndex: Integer;
|
|
begin
|
|
Result := LinkedItemLink.Item.ImageIndex;
|
|
end;
|
|
|
|
function TdxBarQuickCustItemControl.GetImages(AInToolbar: Boolean): TCurImageList;
|
|
begin
|
|
Result := LinkedItemLink.Item.GetCurImages;
|
|
end;
|
|
|
|
function TdxBarQuickCustItemControl.GetHint: string;
|
|
begin
|
|
Result := LinkedItemLink.Item.Hint;
|
|
end;
|
|
|
|
function TdxBarQuickCustItemControl.GetShortCut: TShortCut;
|
|
begin
|
|
Result := LinkedItemLink.Item.ShortCut;
|
|
end;
|
|
|
|
function TdxBarQuickCustItemControl.GetDefaultWidth: Integer;
|
|
begin
|
|
Result := inherited GetDefaultWidth;
|
|
Inc(Result, GetDefaultHeight);
|
|
end;
|
|
|
|
function TdxBarQuickCustItemControl.IsDestroyOnClick: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarQuickCustItemControl.Paint(ARect: TRect; PaintType: TdxBarPaintType);
|
|
var
|
|
WholeR, R: TRect;
|
|
DC: HDC;
|
|
Selected: Boolean;
|
|
begin
|
|
WholeR := ARect;
|
|
R := ARect;
|
|
DC := Parent.Canvas.Handle;
|
|
Selected := IsSelected;
|
|
PainterClass.DrawQuickCustItemFrame(Self, DC, R, ARect, Selected);
|
|
PainterClass.DrawGlyph(Self, R, nil, ptMenu, True, Selected, LinkedItemLink.Visible, False, False,
|
|
False, False, False);
|
|
inherited;
|
|
PainterClass.DrawQuickCustItemFrameSelected(Self, DC, WholeR, R, Selected);
|
|
end;
|
|
|
|
{ TdxBarQuickCustExtButtonControl }
|
|
|
|
type
|
|
TdxBarQuickCustExtButton = class(TdxBarButton);
|
|
|
|
TdxBarQuickCustExtButtonControl = class(TdxBarButtonControl)
|
|
protected
|
|
function GetTextAreaOffset: Integer; override;
|
|
function GetDefaultWidth: Integer; override;
|
|
procedure Paint(ARect: TRect; PaintType: TdxBarPaintType); override;
|
|
end;
|
|
|
|
function TdxBarQuickCustExtButtonControl.GetTextAreaOffset: Integer;
|
|
begin
|
|
Result := inherited GetTextAreaOffset + GetDefaultHeight;
|
|
end;
|
|
|
|
function TdxBarQuickCustExtButtonControl.GetDefaultWidth: Integer;
|
|
begin
|
|
Result := inherited GetDefaultWidth;
|
|
Inc(Result, GetDefaultHeight);
|
|
end;
|
|
|
|
procedure TdxBarQuickCustExtButtonControl.Paint(ARect: TRect; PaintType: TdxBarPaintType);
|
|
var
|
|
WholeR, R: TRect;
|
|
DC: HDC;
|
|
Selected: Boolean;
|
|
begin
|
|
WholeR := ARect;
|
|
R := ARect;
|
|
DC := Parent.Canvas.Handle;
|
|
Selected := IsSelected;
|
|
PainterClass.DrawQuickCustItemFrame(Self, DC, R, ARect, Selected);
|
|
PainterClass.DrawGlyph(Self, R, nil, ptMenu, True, Selected, False, False, False,
|
|
False, False, False);
|
|
inherited;
|
|
PainterClass.DrawQuickCustItemFrameSelected(Self, DC, WholeR, R, Selected);
|
|
end;
|
|
|
|
{ TdxBarQuickControl }
|
|
|
|
type
|
|
TdxBarQuickSubItem = class(TdxBarSubItem)
|
|
end;
|
|
|
|
TdxBarQuickControl = class(TdxBarControl)
|
|
private
|
|
FAddRemoveSubItem: TdxBarQuickSubItem;
|
|
FOwnerBar: TdxBarControl;
|
|
FQuickCustItem: TdxBarQuickCustItem;
|
|
procedure AddRemoveSubItemPopup(Sender: TObject);
|
|
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
|
|
procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
|
|
procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
|
|
procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
|
|
protected
|
|
function GetMainForm: TCustomForm; override;
|
|
function GetToolbarBrush: HBRUSH; override;
|
|
function HideOnClick: Boolean; override;
|
|
function IsLinkedToOwner: Boolean; override;
|
|
function IsInternal: Boolean; override;
|
|
function GetOwnerControl: TWinControl; override;
|
|
public
|
|
constructor CreateWithOwnerBar(AOwner: TComponent; AOwnerBar: TdxBarControl);
|
|
destructor Destroy; override;
|
|
procedure CloseUp;
|
|
procedure HideAll; override;
|
|
procedure Popup(const OwnerR: TRect);
|
|
end;
|
|
|
|
var
|
|
QuickCustBar: TdxBarQuickControl;
|
|
HideQuickCustBarTimer: UINT;
|
|
|
|
procedure FinishHideQuickCustBar;
|
|
begin
|
|
if HideQuickCustBarTimer <> 0 then
|
|
begin
|
|
KillTimer(0, HideQuickCustBarTimer);
|
|
HideQuickCustBarTimer := 0;
|
|
end;
|
|
end;
|
|
|
|
procedure HideQuickCustBarTimerProc(Wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
|
|
begin
|
|
FinishHideQuickCustBar;
|
|
if (QuickCustBar <> nil) and (QuickCustBar.BarManager.SelectedItem <> nil) and
|
|
(GetParentBarForControl(QuickCustBar.BarManager.SelectedItem) <> QuickCustBar) then
|
|
try
|
|
QuickCustBar.CloseUp;
|
|
except
|
|
end;
|
|
end;
|
|
|
|
procedure StartHideQuickCustBar;
|
|
begin
|
|
if HideQuickCustBarTimer = 0 then
|
|
HideQuickCustBarTimer := SetTimer(0, 0, 200, @HideQuickCustBarTimerProc);
|
|
end;
|
|
|
|
constructor TdxBarQuickControl.CreateWithOwnerBar(AOwner: TComponent; AOwnerBar: TdxBarControl);
|
|
var
|
|
I: Integer;
|
|
ItemLink: TdxBarItemLink;
|
|
begin
|
|
ClearInternalItemList;
|
|
inherited Create(AOwner);
|
|
QuickCustBar := Self;
|
|
FHasCaption := False;
|
|
FOwnerBar := AOwnerBar;
|
|
OwnerBounds := FOwnerBar.MarkScreenRect;
|
|
|
|
FBar := BarManager.Bars.Add;
|
|
FBar.FAllowQuickCustomizing := False;
|
|
FBar.Hidden := True;
|
|
FBar.Font := FOwnerBar.Font;
|
|
FBar.UseOwnFont := FOwnerBar.Bar.UseOwnFont;
|
|
FItemLinks := FBar.ItemLinks;
|
|
FItemLinks.FBarControl := Self;
|
|
|
|
// add links to available items
|
|
FAddRemoveSubItem := TdxBarQuickSubItem.Create(BarManager.MainForm);
|
|
with FAddRemoveSubItem do
|
|
begin
|
|
Caption := cxGetResourceString(@dxSBAR_ADDREMOVEBUTTONS);
|
|
Enabled := FOwnerBar.Bar.AllowQuickCustomizing;
|
|
if Enabled then OnPopup := AddRemoveSubItemPopup;
|
|
end;
|
|
InternalItemList.Add(FAddRemoveSubItem);
|
|
|
|
for I := 0 to FOwnerBar.ItemLinks.CanVisibleItemCount - 1 do
|
|
begin
|
|
ItemLink := FOwnerBar.ItemLinks.CanVisibleItems[I];
|
|
if (ItemLink.VisibleIndex = -1) or
|
|
(ItemLink.Control <> nil) and IsRectEmpty(ItemLink.ItemRect) then
|
|
begin
|
|
FItemLinks.Add.Assign(ItemLink);
|
|
FItemLinks[FItemLinks.Count - 1].FOriginalItemLink := ItemLink;
|
|
end;
|
|
end;
|
|
with FItemLinks.Add do
|
|
begin
|
|
Item := FAddRemoveSubItem;
|
|
BeginGroup := True;
|
|
end;
|
|
end;
|
|
|
|
destructor TdxBarQuickControl.Destroy;
|
|
begin
|
|
FinishHideQuickCustBar;
|
|
QuickCustBar := nil;
|
|
inherited;
|
|
if FQuickCustItem <> nil then
|
|
begin
|
|
FQuickCustItem.Free;
|
|
FQuickCustItem := nil;
|
|
end;
|
|
FBar.Free;
|
|
end;
|
|
|
|
procedure TdxBarQuickControl.AddRemoveSubItemPopup(Sender: TObject);
|
|
var
|
|
I: Integer;
|
|
ItemLink: TdxBarItemLink;
|
|
AllowReset: Boolean;
|
|
begin
|
|
ClearInternalItemList;
|
|
FAddRemoveSubItem.ItemLinks.Clear;
|
|
|
|
FQuickCustItem := TdxBarQuickCustItem.Create(BarManager.MainForm);
|
|
for I := 0 to FOwnerBar.ItemLinks.AvailableItemCount - 1 do
|
|
begin
|
|
ItemLink := FOwnerBar.ItemLinks.AvailableItems[I];
|
|
if (ItemLink.Control = nil) or ItemLink.Control.CanCustomize then
|
|
with FAddRemoveSubItem.ItemLinks.Add do
|
|
begin
|
|
Item := FQuickCustItem;
|
|
Data := Integer(ItemLink);
|
|
end;
|
|
end;
|
|
// add reset button
|
|
AllowReset := BarManager.CanReset and FOwnerBar.Bar.CanReset;
|
|
if AllowReset then
|
|
begin
|
|
InternalItemList.Add(TdxBarQuickCustExtButton.Create(BarManager.MainForm));
|
|
with TdxBarButton(InternalItemList.Last) do
|
|
begin
|
|
Caption := cxGetResourceString(@dxSBAR_RESETTOOLBAR);
|
|
OnClick := FOwnerBar.Bar.ResetToolbarClick;
|
|
end;
|
|
with FAddRemoveSubItem.ItemLinks.Add do
|
|
begin
|
|
BeginGroup := True;
|
|
Item := TdxBarButton(InternalItemList.Last);
|
|
end;
|
|
end;
|
|
// add customize button
|
|
BarManager.AddCustomizeLink(FAddRemoveSubItem.ItemLinks,
|
|
not AllowReset, TdxBarQuickCustExtButton);
|
|
end;
|
|
|
|
procedure TdxBarQuickControl.WMNCHitTest(var Message: TWMNCHitTest);
|
|
begin
|
|
inherited;
|
|
with Message do
|
|
if Result <> HTCLIENT then Result := HTBORDER;
|
|
FHitTest := HTCLIENT;
|
|
end;
|
|
|
|
procedure TdxBarQuickControl.WMNCPaint(var Message: TMessage);
|
|
var
|
|
DC: HDC;
|
|
begin
|
|
inherited;
|
|
DC := GetWindowDC(Handle);
|
|
PainterClass.BarDrawOwnerLink(Self, DC);
|
|
ReleaseDC(Handle, DC);
|
|
end;
|
|
|
|
procedure TdxBarQuickControl.WMRButtonDown(var Message: TWMRButtonDown);
|
|
begin
|
|
with TMessage(Message) do
|
|
Result := DefWindowProc(Handle, Msg, wParam, lParam);
|
|
end;
|
|
|
|
procedure TdxBarQuickControl.WMWindowPosChanged(var Message: TWMWindowPosChanged);
|
|
begin
|
|
inherited;
|
|
if (Message.WindowPos^.flags and SWP_HIDEWINDOW <> 0) and not IsDestroying then
|
|
CloseUp;
|
|
end;
|
|
|
|
function TdxBarQuickControl.GetMainForm: TCustomForm;
|
|
begin
|
|
if FOwnerBar <> nil then
|
|
Result := FOwnerBar.GetMainForm
|
|
else
|
|
Result := inherited GetMainForm;
|
|
end;
|
|
|
|
function TdxBarQuickControl.GetToolbarBrush: HBRUSH;
|
|
begin
|
|
Result := PainterClass.BarToolbarBrushEx2(Self);
|
|
end;
|
|
|
|
function TdxBarQuickControl.HideOnClick: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TdxBarQuickControl.IsLinkedToOwner: Boolean;
|
|
begin
|
|
Result := inherited IsLinkedToOwner{ or
|
|
((FOwnerBar <> nil) and (FOwnerBar.FQuickPopup = Self))};
|
|
end;
|
|
|
|
function TdxBarQuickControl.IsInternal: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TdxBarQuickControl.GetOwnerControl: TWinControl;
|
|
begin
|
|
Result := FOwnerBar;
|
|
end;
|
|
|
|
procedure TdxBarQuickControl.CloseUp;
|
|
begin
|
|
FOwnerBar.MarkState := msNone;
|
|
end;
|
|
|
|
procedure TdxBarQuickControl.HideAll;
|
|
var
|
|
WasFocused: Boolean;
|
|
P: TPoint;
|
|
begin
|
|
WasFocused := BarManager.FocusedBarControl = Self;
|
|
inherited;
|
|
if WasFocused then
|
|
begin
|
|
if LeftButtonPressed then
|
|
begin
|
|
GetCursorPos(P);
|
|
Windows.ScreenToClient(FOwnerBar.Handle, P);
|
|
if PtInRect(FOwnerBar.MarkRect, P) then
|
|
FOwnerBar.FIgnoreMouseClick := True;
|
|
end;
|
|
CloseUp;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarQuickControl.Popup(const OwnerR: TRect);
|
|
var
|
|
P, Size: TPoint;
|
|
WorkArea: TRect;
|
|
begin
|
|
Size := GetSizeForWidth(dsNone, 0);
|
|
Inc(Size.X, 2 * BarManager.BorderSizeX);
|
|
Inc(Size.Y, 2 * BarManager.BorderSizeY);
|
|
if IsRealVertical(FOwnerBar) then
|
|
P := Point(OwnerR.Right, OwnerR.Top)
|
|
else
|
|
if (FOwnerBar.DockingStyle = dsNone) and PainterClass.IsQuickControlPopupOnRight then
|
|
P := Point(OwnerR.Left, OwnerR.Bottom)
|
|
else
|
|
P := Point(OwnerR.Right - Size.X, OwnerR.Bottom);
|
|
WorkArea := GetWorkArea(P);
|
|
if IsRealVertical(FOwnerBar) then
|
|
begin
|
|
if P.X + Size.X > WorkArea.Right then P.X := OwnerR.Left - Size.X;
|
|
if P.Y < WorkArea.Top then P.Y := WorkArea.Top;
|
|
if P.Y + Size.Y > WorkArea.Bottom then P.Y := WorkArea.Bottom - Size.Y;
|
|
end
|
|
else
|
|
begin
|
|
if P.X < WorkArea.Left then P.X := WorkArea.Left;
|
|
if P.X + Size.X > WorkArea.Right then P.X := WorkArea.Right - Size.X;
|
|
if P.Y + Size.Y > WorkArea.Bottom then P.Y := OwnerR.Top - Size.Y;
|
|
end;
|
|
SetWindowPos(Handle, HWND_TOP, P.X, P.Y, Size.X, Size.Y,
|
|
SWP_SHOWWINDOW or SWP_NOACTIVATE);
|
|
end;
|
|
|
|
{ TdxBarManagerCategories }
|
|
|
|
type
|
|
TdxBarCategoryData = class
|
|
public
|
|
ItemsVisible, LoadedItemsVisible: TdxBarItemVisible;
|
|
Visible: Boolean;
|
|
end;
|
|
|
|
TdxBarManagerCategories = class(TStringList)
|
|
private
|
|
FMoving: Boolean;
|
|
Owner: TdxBarManager;
|
|
procedure ListChanged(Sender: TObject);
|
|
procedure ChangeCategory(OldCategory, NewCategory: Integer);
|
|
procedure ReadItemsVisibles(Reader: TReader);
|
|
procedure ReadVisibles(Reader: TReader);
|
|
procedure WriteItemsVisibles(Writer: TWriter);
|
|
procedure WriteVisibles(Writer: TWriter);
|
|
protected
|
|
procedure ClearObjects;
|
|
procedure DefineProperties(Filer: TFiler); override;
|
|
public
|
|
constructor Create(AOwner: TdxBarManager);
|
|
destructor Destroy; override;
|
|
procedure Clear; override;
|
|
procedure Delete(Index: Integer); override;
|
|
procedure Insert(Index: Integer; const S: string); override;
|
|
procedure Exchange(Index1, Index2: Integer); override;
|
|
procedure Move(CurIndex, NewIndex: Integer); override;
|
|
end;
|
|
|
|
constructor TdxBarManagerCategories.Create(AOwner: TdxBarManager);
|
|
begin
|
|
inherited Create;
|
|
Owner := AOwner;
|
|
if not Owner.IsLoading then
|
|
Add(cxGetResourceString(@dxSBAR_DEFAULTCATEGORYNAME));
|
|
OnChange := ListChanged;
|
|
end;
|
|
|
|
destructor TdxBarManagerCategories.Destroy;
|
|
begin
|
|
ClearObjects;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.Clear;
|
|
begin
|
|
ClearObjects;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.ListChanged(Sender: TObject);
|
|
begin
|
|
Owner.DesignerModified;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.ChangeCategory(OldCategory, NewCategory: Integer);
|
|
var
|
|
List: TList;
|
|
I: Integer;
|
|
begin
|
|
if (OldCategory > -1) and (OldCategory < Count) and (NewCategory > -1) then
|
|
begin
|
|
List := TList.Create;
|
|
Owner.GetAllItemsByCategory(OldCategory, List);
|
|
for I := 0 to List.Count - 1 do
|
|
TdxBarItem(List[I]).FCategory := NewCategory;
|
|
List.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.ReadItemsVisibles(Reader: TReader);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Reader.ReadListBegin;
|
|
try
|
|
BeginUpdate;
|
|
try
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
if Reader.EndOfList then Break;
|
|
Owner.CategoryItemsVisible[I] := TdxBarItemVisible(Reader.ReadInteger);
|
|
end;
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
finally
|
|
Reader.ReadListEnd;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.ReadVisibles(Reader: TReader);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Reader.ReadListBegin;
|
|
try
|
|
BeginUpdate;
|
|
try
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
if Reader.EndOfList then Break;
|
|
Owner.CategoryVisible[I] := Reader.ReadBoolean;
|
|
end;
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
finally
|
|
Reader.ReadListEnd;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.WriteItemsVisibles(Writer: TWriter);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Writer.WriteListBegin;
|
|
try
|
|
for I := 0 to Count - 1 do
|
|
Writer.WriteInteger(Longint(Owner.CategoryItemsVisible[I]));
|
|
finally
|
|
Writer.WriteListEnd;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.WriteVisibles(Writer: TWriter);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Writer.WriteListBegin;
|
|
try
|
|
for I := 0 to Count - 1 do
|
|
Writer.WriteBoolean(Owner.CategoryVisible[I]);
|
|
finally
|
|
Writer.WriteListEnd;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.ClearObjects;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
if Objects[I] <> nil then
|
|
begin
|
|
TdxBarCategoryData(Objects[I]).Free;
|
|
Objects[I] := nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.DefineProperties(Filer: TFiler);
|
|
begin
|
|
inherited;
|
|
Filer.DefineProperty('ItemsVisibles', ReadItemsVisibles, WriteItemsVisibles, True);
|
|
Filer.DefineProperty('Visibles', ReadVisibles, WriteVisibles, True);
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.Delete(Index: Integer);
|
|
var
|
|
List: TList;
|
|
I: Integer;
|
|
begin
|
|
if FMoving then inherited
|
|
else
|
|
begin
|
|
if (Index > -1) and (Index < Count) then
|
|
begin
|
|
List := TList.Create;
|
|
Owner.GetAllItemsByCategory(Index, List);
|
|
for I := 0 to List.Count - 1 do TdxBarItem(List[I]).Free;
|
|
List.Free;
|
|
for I := Index + 1 to Count - 1 do ChangeCategory(I, I - 1);
|
|
if Objects[Index] <> nil then
|
|
TdxBarCategoryData(Objects[Index]).Free;
|
|
inherited;
|
|
end;
|
|
if Count = 0 then
|
|
Add(cxGetResourceString(@dxSBAR_DEFAULTCATEGORYNAME));
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.Insert(Index: Integer; const S: string);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if not FMoving and (Index > -1) and (Index < Count) then
|
|
for I := Count - 1 downto Index do ChangeCategory(I, I + 1);
|
|
inherited Insert(Index, S);
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.Exchange(Index1, Index2: Integer);
|
|
var
|
|
I: Integer;
|
|
List1: TList;
|
|
List2: TList;
|
|
begin
|
|
if (Index1 > -1) and (Index1 < Count) and
|
|
(Index2 > -1) and (Index2 < Count) then
|
|
begin
|
|
List1 := TList.Create;
|
|
List2 := TList.Create;
|
|
Owner.GetAllItemsByCategory(Index1, List1);
|
|
Owner.GetAllItemsByCategory(Index2, List2);
|
|
for I := 0 to List1.Count - 1 do
|
|
TdxBarItem(List1[I]).Category := Index2;
|
|
for I := 0 to List2.Count - 1 do
|
|
TdxBarItem(List2[I]).Category := Index1;
|
|
List2.Free;
|
|
List1.Free;
|
|
inherited Exchange(Index1, Index2);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManagerCategories.Move(CurIndex, NewIndex: Integer);
|
|
var
|
|
List: TList;
|
|
I: Integer;
|
|
begin
|
|
if (0 <= CurIndex) and (CurIndex < Count) and
|
|
(0 <= NewIndex) and (NewIndex < Count) and
|
|
(CurIndex <> NewIndex) then
|
|
begin
|
|
List := TList.Create;
|
|
Owner.GetAllItemsByCategory(CurIndex, List);
|
|
for I := 0 to List.Count - 1 do
|
|
TdxBarItem(List[I]).FCategory := dxBarManagerTempCategoryIndex;
|
|
if CurIndex < NewIndex then
|
|
for I := CurIndex + 1 to NewIndex do
|
|
ChangeCategory(I, I - 1)
|
|
else
|
|
for I := CurIndex - 1 downto NewIndex do
|
|
ChangeCategory(I, I + 1);
|
|
for I := 0 to List.Count - 1 do
|
|
TdxBarItem(List[I]).FCategory := NewIndex;
|
|
List.Free;
|
|
FMoving := True;
|
|
inherited Move(CurIndex, NewIndex);
|
|
FMoving := False;
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarHintWindow }
|
|
|
|
constructor TdxBarHintWindow.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
Color := clInfoBk;
|
|
Canvas.Brush.Style := bsClear;
|
|
end;
|
|
|
|
procedure TdxBarHintWindow.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited CreateParams(Params);
|
|
with Params do
|
|
begin
|
|
Style := WS_POPUP or WS_DISABLED;
|
|
WindowClass.Style := WindowClass.Style or CS_SAVEBITS;
|
|
ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarHintWindow.Paint;
|
|
var
|
|
R: TRect;
|
|
begin
|
|
R := ClientRect;
|
|
DrawEdge(Canvas.Handle, R, BDR_RAISEDOUTER, BF_RECT);
|
|
InflateRect(R, -1, -1);
|
|
Inc(R.Left, 2);
|
|
Inc(R.Top, 2);
|
|
cxDrawText(Canvas.Handle, Caption, R,
|
|
DT_LEFT or DT_NOCLIP or DT_NOPREFIX or DT_WORDBREAK);
|
|
end;
|
|
|
|
procedure TdxBarHintWindow.ActivateHint(P: TPoint; const AHint: string; BarManager: TdxBarManager);
|
|
var
|
|
NonClientMetrics: TNonClientMetrics;
|
|
R, WorkArea: TRect;
|
|
begin
|
|
Caption := AHint;
|
|
|
|
if BarManager.UseSystemFont then
|
|
begin
|
|
NonClientMetrics.cbSize := SizeOf(NonClientMetrics);
|
|
if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then
|
|
Canvas.Font.Handle := CreateFontIndirect(NonClientMetrics.lfStatusFont)
|
|
else
|
|
Canvas.Font.Size := 8;
|
|
end
|
|
else Canvas.Font := BarManager.Font;
|
|
{$IFNDEF DELPHI6}
|
|
Canvas.Font.Color := clInfoText;
|
|
{$ELSE}
|
|
Canvas.Font.Color := Screen.HintFont.Color;
|
|
{$ENDIF}
|
|
Color := Application.HintColor;
|
|
|
|
WorkArea := GetWorkArea(P);
|
|
R := Rect(0, 0, WorkArea.Right - WorkArea.Left, 0);
|
|
cxDrawText(Canvas.Handle, AHint, R, DT_CALCRECT or DT_LEFT or DT_NOPREFIX or DT_WORDBREAK);
|
|
Inc(R.Right, 2 * (1 + 2));
|
|
Inc(R.Bottom, 2 * (1 + 2));
|
|
Width := R.Right;
|
|
Height := R.Bottom;
|
|
OffsetRect(R, P.X, P.Y);
|
|
|
|
if R.Left + Width > WorkArea.Right then
|
|
R.Left := WorkArea.Right - Width;
|
|
// if R.Top + Height > WorkArea.Bottom then
|
|
// R.Top := P.Y - 5 * HintOffset div 2;
|
|
if R.Top + Height > WorkArea.Bottom then
|
|
R.Top := P.Y - Height - HintOffset;
|
|
if R.Left < WorkArea.Left then R.Left := WorkArea.Left;
|
|
if R.Top < WorkArea.Top then R.Top := WorkArea.Top;
|
|
|
|
InvalidateRect(Handle, nil, True);
|
|
SetWindowPos(Handle, HWND_TOPMOST, R.Left, R.Top, 0,
|
|
0, SWP_NOSIZE or SWP_SHOWWINDOW or SWP_NOACTIVATE);
|
|
end;
|
|
|
|
procedure TdxBarHintWindow.WMNCHitTest(var Message: TWMNCHitTest);
|
|
begin
|
|
Message.Result := HTTRANSPARENT;
|
|
end;
|
|
|
|
{ TdxBarGroup }
|
|
|
|
constructor TdxBarGroup.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
FEnabled := True;
|
|
FItems := TList.Create;
|
|
FVisible := ivAlways;
|
|
end;
|
|
|
|
destructor TdxBarGroup.Destroy;
|
|
begin
|
|
FBarManager.RemoveGroup(Self);
|
|
FItems.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBarGroup.GetCount: Integer;
|
|
begin
|
|
Result := FItems.Count;
|
|
end;
|
|
|
|
function TdxBarGroup.GetIndex: Integer;
|
|
begin
|
|
Result := FBarManager.FGroups.IndexOf(Self);
|
|
end;
|
|
|
|
function TdxBarGroup.GetItem(Index: Integer): TComponent;
|
|
begin
|
|
Result := TComponent(FItems[Index]);
|
|
end;
|
|
|
|
procedure TdxBarGroup.SetEnabled(Value: Boolean);
|
|
var
|
|
PrevLockUpdate, ALock: Boolean;
|
|
I: Integer;
|
|
Item: TComponent;
|
|
begin
|
|
//if FEnabled <> Value then
|
|
begin
|
|
FEnabled := Value;
|
|
PrevLockUpdate := FBarManager.LockUpdate;
|
|
ALock := (QuickCustBar = nil) and ([csLoading, csDestroying] * ComponentState = []);
|
|
if ALock then
|
|
FBarManager.LockUpdate := True;
|
|
try
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
Item := Items[I];
|
|
if Item is TdxBarItem then
|
|
TdxBarItem(Item).Enabled := Value
|
|
else
|
|
TdxBarGroup(Item).Enabled := Value;
|
|
end;
|
|
finally
|
|
if ALock then
|
|
FBarManager.LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarGroup.SetIndex(Value: Integer);
|
|
begin
|
|
if Index <> Value then
|
|
FBarManager.FGroups.Move(Index, Value);
|
|
end;
|
|
|
|
procedure TdxBarGroup.SetVisible(Value: TdxBarItemVisible);
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
I: Integer;
|
|
Item: TComponent;
|
|
begin
|
|
//if FVisible <> Value then
|
|
begin
|
|
FVisible := Value;
|
|
PrevLockUpdate := FBarManager.LockUpdate;
|
|
if [csLoading, csDestroying] * ComponentState = [] then
|
|
FBarManager.LockUpdate := True;
|
|
try
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
Item := Items[I];
|
|
if Item is TdxBarItem then
|
|
TdxBarItem(Item).Visible := Value
|
|
else
|
|
TdxBarGroup(Item).Visible := Value;
|
|
end;
|
|
finally
|
|
FBarManager.LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarGroup.ReadItems(Reader: TReader);
|
|
begin
|
|
if FItemsNames = nil then
|
|
FItemsNames := TStringList.Create
|
|
else
|
|
FItemsNames.Clear;
|
|
Reader.ReadListBegin;
|
|
try
|
|
while not Reader.EndOfList do
|
|
FItemsNames.Add(Reader.ReadString);
|
|
finally
|
|
Reader.ReadListEnd;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarGroup.WriteItems(Writer: TWriter);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Writer.WriteListBegin;
|
|
try
|
|
for I := 0 to Count - 1 do
|
|
Writer.WriteString(Items[I].Name);
|
|
finally
|
|
Writer.WriteListEnd;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarGroup.DefineProperties(Filer: TFiler);
|
|
begin
|
|
inherited;
|
|
Filer.DefineProperty('Items', ReadItems, WriteItems, Count <> 0);
|
|
end;
|
|
|
|
procedure TdxBarGroup.Loaded;
|
|
var
|
|
I: Integer;
|
|
AItem: TComponent;
|
|
begin
|
|
inherited;
|
|
if FItemsNames = nil then Exit;
|
|
try
|
|
for I := 0 to FItemsNames.Count - 1 do
|
|
begin
|
|
AItem := FBarManager.MainForm.FindComponent(FItemsNames[I]);
|
|
if AItem <> nil then Add(AItem);
|
|
end;
|
|
finally
|
|
FItemsNames.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarGroup.Notification(AComponent: TComponent; Operation: TOperation);
|
|
begin
|
|
inherited;
|
|
if (Operation = opRemove) and (AComponent <> Self) and
|
|
((AComponent is TdxBarItem) or (AComponent is TdxBarGroup)) then
|
|
Remove(AComponent);
|
|
end;
|
|
|
|
procedure TdxBarGroup.SetName(const NewName: TComponentName);
|
|
begin
|
|
inherited;
|
|
UpdateGroups;
|
|
end;
|
|
|
|
function TdxBarGroup.GetParentComponent: TComponent;
|
|
begin
|
|
Result := FBarManager;
|
|
end;
|
|
|
|
function TdxBarGroup.HasParent: Boolean;
|
|
begin
|
|
Result := FBarManager <> nil;
|
|
end;
|
|
|
|
procedure TdxBarGroup.SetParentComponent(AParent: TComponent);
|
|
begin
|
|
inherited;
|
|
if AParent is TdxBarManager then
|
|
TdxBarManager(AParent).AddGroup(Self);
|
|
end;
|
|
|
|
procedure TdxBarGroup.Add(AItem: TComponent);
|
|
|
|
function IsRecursive(AItem: TComponent): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := False;
|
|
if AItem is TdxBarGroup then
|
|
begin
|
|
Result := AItem = Self;
|
|
if not Result then
|
|
with TdxBarGroup(AItem) do
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
Result := IsRecursive(Items[I]);
|
|
if Result then Break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if (AItem = nil) or (IndexOf(AItem) <> -1) or
|
|
not ((AItem is TdxBarItem) or (AItem is TdxBarGroup)) then Exit;
|
|
if IsRecursive(AItem) then
|
|
raise Exception.Create(cxGetResourceString(@dxSBAR_RECURSIVEGROUPS));
|
|
FItems.Add(AItem);
|
|
AItem.FreeNotification(Self);
|
|
end;
|
|
|
|
procedure TdxBarGroup.Delete(Index: Integer);
|
|
begin
|
|
FItems.Delete(Index);
|
|
end;
|
|
|
|
function TdxBarGroup.IndexOf(AItem: TComponent): Integer;
|
|
begin
|
|
Result := FItems.IndexOf(AItem);
|
|
end;
|
|
|
|
procedure TdxBarGroup.Move(FromIndex, ToIndex: Integer);
|
|
begin
|
|
FItems.Move(FromIndex, ToIndex);
|
|
end;
|
|
|
|
procedure TdxBarGroup.Remove(AItem: TComponent);
|
|
begin
|
|
FItems.Remove(AItem);
|
|
end;
|
|
|
|
{ TdxBarPopupMenuLink }
|
|
|
|
function TdxBarPopupMenuLink.GetBarManager: TdxBarManager;
|
|
begin
|
|
Result := TdxBarPopupMenuLinks(Collection).BarManager;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenuLink.SetControl(Value: TWinControl);
|
|
begin
|
|
if (Value <> nil) and
|
|
(GetBarManagerByForm(GetParentForm(Value{$IFDEF DELPHI9}, not BarManager.Designing{$ENDIF})) <> BarManager) then
|
|
Value := nil;
|
|
if FControl <> Value then
|
|
begin
|
|
FControl := Value;
|
|
if Value <> nil then Value.FreeNotification(BarManager);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenuLink.SetPopupMenu(Value: TdxBarPopupMenu);
|
|
begin
|
|
if FPopupMenu <> Value then
|
|
begin
|
|
FPopupMenu := Value;
|
|
if Value <> nil then Value.FreeNotification(BarManager);
|
|
end;
|
|
end;
|
|
|
|
function TdxBarPopupMenuLink.IsShortCut(AShortCut: TShortCut): Boolean;
|
|
var
|
|
X, Y: Integer;
|
|
begin
|
|
Result := FPopupMenu <> nil;
|
|
if Assigned(FOnAction) then
|
|
begin
|
|
X := -1;
|
|
Y := -1;
|
|
FOnAction(Self, X, Y, False, Result);
|
|
end;
|
|
if Result then
|
|
Result := (FPopupMenu <> nil) and FPopupMenu.IsShortCut(AShortCut);
|
|
end;
|
|
|
|
constructor TdxBarPopupMenuLink.Create(Collection: TCollection);
|
|
begin
|
|
inherited;
|
|
FProcessChildren := True;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenuLink.Assign(Source: TPersistent);
|
|
|
|
function FindLinkComponent(AComponent: TComponent): TComponent;
|
|
begin
|
|
if AComponent <> nil then
|
|
Result := BarManager.Owner.FindComponent(AComponent.Name)
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
begin
|
|
if Source is TdxBarPopupMenuLink then
|
|
begin
|
|
Control := FindLinkComponent(TdxBarPopupMenuLink(Source).Control) as TWinControl;
|
|
PopupMenu := FindLinkComponent(TdxBarPopupMenuLink(Source).PopupMenu) as TdxBarPopupMenu;
|
|
ProcessChildren := TdxBarPopupMenuLink(Source).ProcessChildren;
|
|
end
|
|
else inherited Assign(Source);
|
|
end;
|
|
|
|
function TdxBarPopupMenuLink.DoAction(Wnd: HWND; P: TPoint): Boolean;
|
|
var
|
|
Msg: TMsg;
|
|
ClickedByMouse: Boolean;
|
|
{$IFDEF DELPHI5}
|
|
PrevP: TPoint;
|
|
{$ENDIF}
|
|
begin
|
|
PeekMessage(Msg, Wnd, WM_CONTEXTMENU, WM_CONTEXTMENU, PM_REMOVE);
|
|
ClickedByMouse := P.X <> -1;
|
|
if ClickedByMouse then
|
|
begin
|
|
ScreenToClient(Wnd, P);
|
|
{$IFDEF DELPHI5}
|
|
PrevP := P;
|
|
MapWindowPoints(Wnd, FControl.Handle, PrevP, 1);
|
|
{$ENDIF}
|
|
end
|
|
else
|
|
begin
|
|
{$IFDEF DELPHI5}
|
|
PrevP := P;
|
|
{$ENDIF}
|
|
if HideCaret(Wnd) then
|
|
begin
|
|
ShowCaret(Wnd);
|
|
GetCaretPos(P);
|
|
end
|
|
else
|
|
P := Point(0, 0);
|
|
end;
|
|
{$IFDEF DELPHI5}
|
|
Result := False;
|
|
TDummyControl(FControl).DoContextPopup(PrevP, Result);
|
|
if Result then Exit;
|
|
{$ENDIF}
|
|
Result := FPopupMenu <> nil;
|
|
if Assigned(FOnAction) then
|
|
begin
|
|
MapWindowPoints(Wnd, FControl.Handle, P, 1);
|
|
FOnAction(Self, P.X, P.Y, ClickedByMouse, Result);
|
|
MapWindowPoints(FControl.Handle, Wnd, P, 1);
|
|
end;
|
|
if Result and (FPopupMenu <> nil) then
|
|
begin
|
|
if IsWindowEnabled(Wnd) then SetFocus(Wnd);
|
|
ClientToScreen(Wnd, P);
|
|
FPopupMenu.Popup(P.X, P.Y);
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarPopupMenuLinks }
|
|
|
|
constructor TdxBarPopupMenuLinks.Create(ABarManager: TdxBarManager);
|
|
begin
|
|
inherited Create(TdxBarPopupMenuLink);
|
|
FBarManager := ABarManager;
|
|
end;
|
|
|
|
function TdxBarPopupMenuLinks.GetItem(Index: Integer): TdxBarPopupMenuLink;
|
|
begin
|
|
Result := TdxBarPopupMenuLink(inherited GetItem(Index));
|
|
end;
|
|
|
|
procedure TdxBarPopupMenuLinks.SetItem(Index: Integer; Value: TdxBarPopupMenuLink);
|
|
begin
|
|
inherited SetItem(Index, Value);
|
|
end;
|
|
|
|
function TdxBarPopupMenuLinks.GetOwner: TPersistent;
|
|
begin
|
|
Result := FBarManager;
|
|
end;
|
|
|
|
function TdxBarPopupMenuLinks.IsShortCut(AControl: TWinControl;
|
|
AShortCut: TShortCut): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := False;
|
|
// process controls
|
|
for I := 0 to Count - 1 do
|
|
if Items[I].Control = AControl then
|
|
begin
|
|
Result := Items[I].IsShortCut(AShortCut);
|
|
if Result then Break;
|
|
end;
|
|
// process children
|
|
if not Result then
|
|
begin
|
|
AControl := AControl.Parent;
|
|
while not Result and (AControl <> nil) do
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
if Items[I].ProcessChildren and (Items[I].Control = AControl) then
|
|
begin
|
|
Result := Items[I].IsShortCut(AShortCut);
|
|
if Result then Break;
|
|
end;
|
|
AControl := AControl.Parent;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarPopupMenuLinks.Add: TdxBarPopupMenuLink;
|
|
begin
|
|
Result := TdxBarPopupMenuLink(inherited Add);
|
|
end;
|
|
|
|
function TdxBarPopupMenuLinks.DoAction(AControl: TWinControl; Wnd: HWND;
|
|
const P: TPoint): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := False;
|
|
if FBarManager.Designing then Exit;
|
|
// process controls
|
|
for I := 0 to Count - 1 do
|
|
if Items[I].Control = AControl then
|
|
begin
|
|
Result := Items[I].DoAction(Wnd, P);
|
|
if Result then Break;
|
|
end;
|
|
// process children
|
|
if not Result then
|
|
begin
|
|
AControl := AControl.Parent;
|
|
while not Result and (AControl <> nil) do
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
if Items[I].ProcessChildren and (Items[I].Control = AControl) then
|
|
begin
|
|
Result := Items[I].DoAction(Wnd, P);
|
|
if Result then Break;
|
|
end;
|
|
AControl := AControl.Parent;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarBackgrounds }
|
|
|
|
constructor TdxBarBackgrounds.Create(ABarManager: TdxBarManager);
|
|
begin
|
|
inherited Create;
|
|
FBarManager := ABarManager;
|
|
FBarBackgroundBitmap := TBitmap.Create;
|
|
FBarBackgroundBitmap.OnChange := BitmapChanged;
|
|
FSubMenuBackgroundBitmap := TBitmap.Create;
|
|
end;
|
|
|
|
destructor TdxBarBackgrounds.Destroy;
|
|
begin
|
|
FSubMenuBackgroundBitmap.Free;
|
|
FSubMenuBackgroundBitmap := nil;
|
|
FBarBackgroundBitmap.Free;
|
|
FBarBackgroundBitmap := nil;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TdxBarBackgrounds.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TdxBarBackgrounds then
|
|
begin
|
|
Bar := TdxBarBackgrounds(Source).Bar;
|
|
SubMenu := TdxBarBackgrounds(Source).SubMenu;
|
|
end
|
|
else
|
|
inherited Assign(Source);
|
|
end;
|
|
|
|
procedure TdxBarBackgrounds.Changed;
|
|
begin
|
|
BarManager.InternalStyleChanged; // TODO: ???
|
|
end;
|
|
|
|
function TdxBarBackgrounds.GetOwner: TPersistent;
|
|
begin
|
|
Result := FBarManager;
|
|
end;
|
|
|
|
procedure TdxBarBackgrounds.BitmapChanged(Sender: TObject);
|
|
begin
|
|
Changed;
|
|
end;
|
|
|
|
procedure TdxBarBackgrounds.SetBarBackgroundBitmap(Value: TBitmap);
|
|
var
|
|
AChanged: Boolean;
|
|
begin
|
|
AChanged := not ((Value = nil) and FBarBackgroundBitmap.Empty);
|
|
FBarBackgroundBitmap.Assign(Value);
|
|
if AChanged then
|
|
Changed;
|
|
end;
|
|
|
|
procedure TdxBarBackgrounds.SetSubMenuBackgroundBitmap(Value: TBitmap);
|
|
begin
|
|
FSubMenuBackgroundBitmap.Assign(Value);
|
|
end;
|
|
|
|
{ TdxBarManager }
|
|
|
|
var
|
|
KeyboardHookHandle: HHOOK;
|
|
MouseHookHandle: HHOOK;
|
|
WndProcHookHandle: HHOOK;
|
|
EatKey, WaitForMenu, DontCallNextKeybHook: Boolean;
|
|
EatingKey: WPARAM;
|
|
InMouseHook: Boolean;
|
|
AClassName: PChar;
|
|
|
|
FDockTimerID: UINT;
|
|
FDockBarManager: TdxBarManager;
|
|
|
|
FHintWindow: TdxBarHintWindow;
|
|
FHintWindowShowing: Boolean;
|
|
FHintTimerID, FHiddenHintTimerID: UINT;
|
|
FCustomHint: string;
|
|
FLiveHiddenHint: Boolean;
|
|
|
|
AnimatingSubMenu: TdxBarSubMenuControl;
|
|
|
|
procedure KillHintTimer;
|
|
begin
|
|
if FHintTimerID <> 0 then
|
|
begin
|
|
KillTimer(0, FHintTimerID);
|
|
FHintTimerID := 0;
|
|
end;
|
|
end;
|
|
|
|
procedure KillHiddenHintTimer;
|
|
begin
|
|
if FHiddenHintTimerID <> 0 then
|
|
begin
|
|
KillTimer(0, FHiddenHintTimerID);
|
|
FHiddenHintTimerID := 0;
|
|
FLiveHiddenHint := False;
|
|
end;
|
|
end;
|
|
|
|
function dxBarKeyboardHook(Code: Integer; wParam: WParam; lParam: LParam): LRESULT; stdcall;
|
|
const
|
|
KeyMessages: array[Boolean] of Integer = (WM_KEYUP, WM_KEYDOWN);
|
|
var
|
|
AControl: TWinControl;
|
|
AForm: TCustomForm;
|
|
ABarManager, AFormBarManager, ATempBarManager: TdxBarManager;
|
|
AKeyPressed: Boolean;
|
|
//Msg: TMsg;
|
|
Res: LRESULT;
|
|
APopupMenuLinks: TdxBarPopupMenuLinks;
|
|
|
|
function GetPopupMenuLinksForFocusedWindow(var AControl: TWinControl): TdxBarPopupMenuLinks;
|
|
var
|
|
ABarManager: TdxBarManager;
|
|
begin
|
|
Result := nil;
|
|
AControl := FindVCLControl(GetFocus);
|
|
if AControl <> nil then
|
|
begin
|
|
ABarManager := GetBarManagerByForm(GetParentForm(AControl));
|
|
if ABarManager <> nil then
|
|
Result := ABarManager.PopupMenuLinks;
|
|
end;
|
|
end;
|
|
|
|
function KeyPressed: Boolean;
|
|
var
|
|
KS: TKeyboardState;
|
|
I: Integer;
|
|
begin
|
|
GetKeyboardState(KS);
|
|
for I := Low(KS) to High(KS) do
|
|
begin
|
|
Result := KS[I] and 128 <> 0;
|
|
if Result then Break;
|
|
end;
|
|
end;
|
|
|
|
function ShiftState: TShiftState;
|
|
begin
|
|
Result := [];
|
|
if GetAsyncKeyState(VK_SHIFT) < 0 then Result := Result + [ssShift];
|
|
if GetAsyncKeyState(VK_CONTROL) < 0 then Result := Result + [ssCtrl];
|
|
if GetAsyncKeyState(VK_MENU) < 0 then Result := Result + [ssAlt];
|
|
end;
|
|
|
|
procedure HandleKey;
|
|
var
|
|
Shift: TShiftState;
|
|
AItemLink: TdxBarItemLink;
|
|
UniqueItem: Boolean;
|
|
|
|
function IsShortCutUsed: Boolean;
|
|
var
|
|
ShortCut: TShortCut;
|
|
AControl: TWinControl;
|
|
APopupMenuLinks: TdxBarPopupMenuLinks;
|
|
|
|
procedure CheckBarManager(ABarManager: TdxBarManager);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
with ABarManager do
|
|
begin
|
|
if MainMenuBar = nil then
|
|
Result := False
|
|
else
|
|
Result := MainMenuBar.IsShortCut(ShortCut);
|
|
if not Result then
|
|
for I := 0 to Bars.Count - 1 do
|
|
if Bars[I].Visible and not Bars[I].IsMainMenu and
|
|
(Bars[I].Control <> nil) and Bars[I].Control.HandleAllocated and
|
|
IsWindowVisible(Bars[I].Control.Handle) then
|
|
begin
|
|
Result := Bars[I].IsShortCut(ShortCut);
|
|
if Result then Break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
ShortCut := Byte(wParam);
|
|
if GetAsyncKeyState(VK_SHIFT) < 0 then Inc(ShortCut, scShift);
|
|
if GetAsyncKeyState(VK_CONTROL) < 0 then Inc(ShortCut, scCtrl);
|
|
if GetAsyncKeyState(VK_MENU) < 0 then Inc(ShortCut, scAlt);
|
|
|
|
APopupMenuLinks := GetPopupMenuLinksForFocusedWindow(AControl);
|
|
if (APopupMenuLinks <> nil) and
|
|
APopupMenuLinks.IsShortCut(AControl, ShortCut) then
|
|
begin
|
|
Result := True;
|
|
Exit;
|
|
end;
|
|
|
|
CheckBarManager(ABarManager);
|
|
if not Result and (AFormBarManager <> ABarManager) and (AFormBarManager <> nil) then
|
|
CheckBarManager(AFormBarManager);
|
|
end;
|
|
|
|
function GlobalFindItemWithAccel(ABarManager: TdxBarManager): TdxBarItemLink;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
with ABarManager do
|
|
begin
|
|
if MainMenuControl <> nil then
|
|
Result := MainMenuBar.ItemLinks.FindItemWithAccel(wParam, Shift, nil)
|
|
else
|
|
Result := nil;
|
|
if Result = nil then
|
|
for I := 0 to Bars.Count - 1 do
|
|
if Bars[I].Visible and not Bars[I].IsMainMenu then
|
|
begin
|
|
Result := Bars[I].ItemLinks.FindItemWithAccel(wParam, Shift, nil);
|
|
if Result <> nil then Break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if IsShortCutUsed then
|
|
Result := 1
|
|
else
|
|
if GetAsyncKeyState(VK_MENU) < 0 then
|
|
begin
|
|
Shift := ShiftState - [ssAlt];
|
|
AItemLink := GlobalFindItemWithAccel(ABarManager);
|
|
if (AItemLink = nil) and (AFormBarManager <> ABarManager) and (AFormBarManager <> nil) then
|
|
AItemLink := GlobalFindItemWithAccel(AFormBarManager);
|
|
if (AItemLink <> nil) and AItemLink.Item.Enabled then
|
|
with AItemLink do
|
|
begin
|
|
UniqueItem := Owner.FindItemWithAccel(wParam, Shift, AItemLink) = AItemLink;
|
|
if not Control.IsDestroyOnClick or not UniqueItem then
|
|
TdxBarControl(BarControl).BarGetFocus(Control);
|
|
if UniqueItem then
|
|
begin
|
|
if Control is TdxBarSubItemControl then
|
|
TdxBarControl(BarControl).IsDowned := True;
|
|
Control.Click(False);
|
|
end;
|
|
Result := 1;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Result := 0;
|
|
try
|
|
if Code = HC_NOREMOVE then Exit;
|
|
|
|
if FIsMDIButtonPressed then
|
|
begin
|
|
Result := 1;
|
|
Exit;
|
|
end;
|
|
|
|
if wParam = VK_PROCESSKEY then Exit; // for Korean windows
|
|
|
|
if Code >= 0 then
|
|
begin
|
|
if EatKey and (wParam = EatingKey) and ((lParam shr 31) and 1 <> 0) then // release eating key
|
|
begin
|
|
EatKey := False;
|
|
Result := 1;
|
|
Exit;
|
|
end;
|
|
|
|
if (ActiveBarControl <> nil) and
|
|
not ActiveBarControl.BarManager.FDetachingSubMenu then
|
|
if not ActiveBarControl.IsCustomizing then
|
|
with ActiveBarControl do
|
|
if not (SelectedItem is TdxBarWinControl and
|
|
TdxBarWinControl(SelectedItem).Focused) then
|
|
begin
|
|
//PeekMessage(Msg, GetFocus, WM_CONTEXTMENU, WM_CONTEXTMENU, PM_REMOVE);
|
|
AKeyPressed := (lParam shr 31) and 1 = 0;
|
|
if AKeyPressed then
|
|
begin
|
|
EatKey := True;
|
|
EatingKey := wParam;
|
|
end;
|
|
SendMessage(Handle, KeyMessages[AKeyPressed], wParam, lParam);
|
|
if (ActiveBarControl <> nil) or (GetAsyncKeyState(wParam) >= 0) then
|
|
EatKey := False;
|
|
Result := 1;
|
|
Exit;
|
|
end
|
|
else
|
|
else
|
|
if (wParam = VK_ESCAPE) and (GetCapture = ActiveBarControl.Handle) then
|
|
begin
|
|
ReleaseCapture;
|
|
Result := 1;
|
|
Exit;
|
|
end;
|
|
|
|
if GetCapture = 0 then
|
|
begin
|
|
if (wParam = VK_APPS) and ((lParam shr 31) and 1 <> 0) or
|
|
(wParam = VK_F10) and ((lParam shr 31) and 1 = 0) and (ShiftState = [ssShift]) then
|
|
begin
|
|
APopupMenuLinks := GetPopupMenuLinksForFocusedWindow(AControl);
|
|
if (APopupMenuLinks <> nil) and
|
|
APopupMenuLinks.DoAction(AControl, GetFocus, Point(-1, -1)) then
|
|
begin
|
|
Result := 1;
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
AControl := FindControl(GetActiveWindow);
|
|
if (AControl is TCustomForm) and IsWindowEnabled(AControl.Handle) then
|
|
AForm := TCustomForm(AControl)
|
|
else
|
|
AForm := nil;
|
|
if (AForm <> nil) and not (csDesigning in AForm.ComponentState) then
|
|
begin
|
|
with TDummyForm(AForm) do
|
|
if (FormStyle = fsMDIForm) and (ActiveMDIChild <> nil) then
|
|
AForm := ActiveMDIChild;
|
|
AFormBarManager := GetBarManagerByForm(AForm);
|
|
// check dock form
|
|
if (AFormBarManager = nil) and not (fsModal in AForm.FormState) and
|
|
(FindControl(GetParent(AForm.Handle)) is TCustomForm) then
|
|
AFormBarManager := GetBarManagerByForm(TCustomForm(FindControl(GetParent(AForm.Handle))));
|
|
|
|
ABarManager := AFormBarManager;
|
|
|
|
if (TDummyForm(AForm).FormStyle = fsMDIChild) or
|
|
not (TDummyForm(AForm).FormStyle in [fsMDIChild, fsMDIForm]) and (ABarManager = nil) and
|
|
(GetBarManagerByForm(Application.MainForm) <> nil) and
|
|
GetBarManagerByForm(Application.MainForm).AllowCallFromAnotherForm and
|
|
IsWindowEnabled(Application.MainForm.Handle) then
|
|
ABarManager := GetBarManagerByForm(Application.MainForm);
|
|
|
|
if AFormBarManager = nil then
|
|
AFormBarManager := ABarManager
|
|
else
|
|
if (TDummyForm(AForm).FormStyle = fsMDIChild) and
|
|
(AFormBarManager.MainMenuControl <> nil) then // Main menu in MDI Child
|
|
begin
|
|
ATempBarManager := ABarManager;
|
|
ABarManager := AFormBarManager;
|
|
AFormBarManager := ATempBarManager;
|
|
end;
|
|
|
|
end
|
|
else
|
|
begin
|
|
ABarManager := nil;
|
|
AFormBarManager := nil;
|
|
end;
|
|
|
|
if (ABarManager <> nil) and not ABarManager.IsCustomizing and
|
|
not ABarManager.BarControlFocused then
|
|
if (lParam shr 31) and 1 <> 0 then // release key
|
|
if (ABarManager.MainMenuControl <> nil) and
|
|
((wParam = VK_MENU) and WaitForMenu and not KeyPressed or
|
|
ABarManager.UseF10ForMenu and (wParam = VK_F10) and (ShiftState = [])) then
|
|
begin
|
|
WaitForMenu := False;
|
|
ABarManager.MainMenuControl.BarGetFocus(nil);
|
|
Result := 1;
|
|
Exit;
|
|
end
|
|
else WaitForMenu := False
|
|
else // press key
|
|
if wParam = VK_MENU then
|
|
WaitForMenu := True
|
|
else
|
|
begin
|
|
WaitForMenu := False;
|
|
HandleKey;
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
finally
|
|
if DontCallNextKeybHook then Result := 0
|
|
else
|
|
begin
|
|
Res := CallNextHookEx(KeyboardHookHandle, Code, wParam, lParam);
|
|
if Result = 0 then Result := Res;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function dxBarMouseHook(Code: Integer; wParam: WParam; lParam: LParam): LRESULT; stdcall;
|
|
var
|
|
ManualProcessing: Boolean;
|
|
ACustomizingForm: TCustomForm;
|
|
ABarManager: TdxBarManager;
|
|
I: Integer;
|
|
P: TPoint;
|
|
AKeys: Longint;
|
|
BarControl: TCustomdxBarControl;
|
|
Control: TWinControl;
|
|
Res: HRESULT;
|
|
|
|
function ProcessMouseMessage: Boolean;
|
|
var
|
|
AWnd: HWND;
|
|
AControl: TCustomdxBarControl;
|
|
|
|
function IsParentWnd(AWnd, ARootParentWnd: HWND): Boolean;
|
|
var
|
|
AParentWnd: HWND;
|
|
begin
|
|
AParentWnd := AWnd;
|
|
repeat
|
|
AParentWnd := GetParent(AParentWnd);
|
|
Result := AParentWnd = ARootParentWnd;
|
|
until Result or (AParentWnd = 0);
|
|
end;
|
|
|
|
begin
|
|
with PMouseHookStruct(lParam)^ do
|
|
begin
|
|
AControl := ActiveBarControl;
|
|
if AControl <> nil then
|
|
begin
|
|
Result := True;
|
|
repeat
|
|
if (hwnd = AControl.Handle) or (GetParent(hwnd) = AControl.Handle) {or
|
|
(GetParent(GetParent(hwnd)) = AControl.Handle)} then
|
|
Exit;
|
|
AControl := AControl.ParentBar;
|
|
until AControl = nil;
|
|
|
|
if (ActiveBarControl.SelectedItem <> nil) and
|
|
(ActiveBarControl.SelectedItem is TCustomdxBarComboControl) and
|
|
TCustomdxBarComboControl(ActiveBarControl.SelectedItem).DroppedDown then
|
|
begin
|
|
AWnd := TCustomdxBarComboControl(ActiveBarControl.SelectedItem).DropDownWindow;
|
|
Result := IsWindowVisible(AWnd) and ((hwnd = AWnd) or IsParentWnd(hwnd, AWnd));
|
|
end
|
|
else
|
|
Result := False;
|
|
end
|
|
else
|
|
Result := False;
|
|
end;
|
|
end;
|
|
(* function ProcessMouseMessage: Boolean;
|
|
var
|
|
TopWnd: HWND;
|
|
AControl: TCustomdxBarControl;
|
|
|
|
function TopWndIsChild: Boolean;
|
|
var
|
|
Wnd: HWND;
|
|
begin
|
|
Result := True;
|
|
Wnd := TopWnd;
|
|
repeat
|
|
if Wnd = ActiveBarControl.Handle then Exit;
|
|
Wnd := GetParent(Wnd);
|
|
until Wnd = 0;
|
|
Result := False;
|
|
end;
|
|
|
|
begin
|
|
Result := True;
|
|
with PMouseHookStruct(lParam)^ do
|
|
begin
|
|
//if hwnd = GetTopWindow(0) then Exit;
|
|
TopWnd := GetTopWindow(0);
|
|
if (hwnd = TopWnd) or
|
|
not IsWindowVisible(TopWnd) and TopWndIsChild then Exit;
|
|
AControl := ActiveBarControl;
|
|
repeat
|
|
if (hwnd = AControl.Handle) or
|
|
(GetParent(hwnd) = AControl.Handle) then Exit;
|
|
AControl := AControl.ParentBar;
|
|
until AControl = nil;
|
|
end;
|
|
Result := False;
|
|
end;*)
|
|
|
|
function ActiveControl: TdxBarItemControl;
|
|
begin
|
|
Result := nil;
|
|
with PMouseHookStruct(lParam)^ do
|
|
begin
|
|
if FindControl(hwnd) is TCustomdxBarControl then
|
|
Result := TCustomdxBarControl(FindControl(hwnd)).SelectedItem;
|
|
|
|
if (Result = nil) and (GetCapture > 0) and (ActiveBarControl <> nil) then
|
|
if WindowFromPointEx(pt) = ActiveBarControl.Handle then
|
|
Result := ActiveBarControl.SelectedItem
|
|
else
|
|
begin
|
|
Result := ActiveBarControl.SelectedItem;
|
|
if (Result <> nil) and
|
|
(not (Result.ItemLink.Item is TCustomdxBarCombo) or
|
|
not TCustomdxBarCombo(Result.ItemLink.Item).DroppedDown) then
|
|
Result := nil;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function NeedProccessThisEvent(wnd: HWND): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := (FindControl(wnd) is TCustomForm);
|
|
if IsWin95 and not Result then
|
|
begin
|
|
for I := 0 to Screen.FormCount - 1 do
|
|
if wnd = Screen.Forms[I].Handle then
|
|
begin
|
|
Result := True;
|
|
break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Result := 0;
|
|
try
|
|
ManualProcessing := False;
|
|
|
|
if dxBarCustomizingForm <> nil then
|
|
ACustomizingForm := dxBarCustomizingForm.BarManager.MainForm
|
|
else
|
|
ACustomizingForm := nil;
|
|
if (ACustomizingForm <> nil) and (TDummyForm(ACustomizingForm).FormStyle = fsMDIChild) and
|
|
not (csDesigning in ACustomizingForm.ComponentState) then
|
|
begin
|
|
Control := FindControl(PMouseHookStruct(lParam)^.hwnd);
|
|
if (Control is TCustomForm) and (TDummyForm(Control).FormStyle = fsMDIForm) then
|
|
begin
|
|
P := PMouseHookStruct(lParam)^.pt;
|
|
ScreenToClient(TDummyForm(Control).ClientHandle, P);
|
|
if ChildWindowFromPointEx(TDummyForm(Control).ClientHandle, P, CWP_SKIPINVISIBLE) = ACustomizingForm.Handle then
|
|
begin
|
|
if (WM_MOUSEMOVE <= wParam) and (wParam <= WM_MBUTTONDBLCLK) then
|
|
wParam := wParam - WM_MOUSEMOVE + WM_NCMOUSEMOVE;
|
|
with PMouseHookStruct(lParam)^ do
|
|
begin
|
|
hwnd := ACustomizingForm.Handle;
|
|
wHitTestCode := UINT(HTERROR);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
with PMouseHookStruct(lParam)^ do
|
|
if NeedProccessThisEvent(hwnd) and (SmallInt(wHitTestCode) = HTERROR) then
|
|
begin
|
|
ABarManager := GetBarManagerByForm(TCustomForm(FindControl(hwnd)));
|
|
if (ABarManager = nil) or not ABarManager.FIsCustomizing then
|
|
ABarManager := dxBarManagerList.CustomizingBarManager;
|
|
if (ABarManager <> nil) and ABarManager.FIsCustomizing and
|
|
(dxBarCustomizingForm <> nil) and dxBarCustomizingForm.Active then
|
|
with ABarManager do
|
|
for I := 0 to Bars.Count - 1 do
|
|
if (Bars[I].Control <> nil) and Bars[I].Control.WantMouse then
|
|
begin
|
|
ManualProcessing := True;
|
|
hwnd := Bars[I].Control.Handle;
|
|
wHitTestCode := SendMessage(hwnd, WM_NCHITTEST, 0, MakeLParam(pt.X, pt.Y));
|
|
SendMessage(hwnd, WM_SETCURSOR, hwnd, MakeLParam(wHitTestCode, wParam));
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
if not InMouseHook and (Code >= 0) and (FActiveBarControl <> nil) then
|
|
begin
|
|
InMouseHook := True;
|
|
if ((wParam = WM_RBUTTONUP) or (wParam = WM_NCRBUTTONUP) or
|
|
(wParam = WM_MBUTTONUP) or (wParam = WM_NCMBUTTONUP)) and
|
|
(ActiveControl = nil) and not ProcessMouseMessage then
|
|
begin
|
|
InMouseHook := False;
|
|
Result := 1;
|
|
Exit;
|
|
end;
|
|
if not ActiveBarControl.BarManager.Dragging then
|
|
repeat
|
|
if (((wParam = WM_LBUTTONUP) or (wParam = WM_NCLBUTTONUP)) and (ActiveControl = nil) and
|
|
(AnimatingSubMenu = nil) and not ActiveBarControl.IsCustomizing and
|
|
((ActiveBarControl is TdxBarControl) or (ActiveBarControl.ParentBar <> nil)) or
|
|
(wParam = WM_LBUTTONDOWN) or (wParam = WM_LBUTTONDBLCLK) or
|
|
(wParam = WM_RBUTTONDOWN) or (wParam = WM_RBUTTONDBLCLK) or
|
|
(wParam = WM_MBUTTONDOWN) or (wParam = WM_MBUTTONDBLCLK) or
|
|
(wParam = WM_NCLBUTTONDOWN) or (wParam = WM_NCLBUTTONDBLCLK) or
|
|
(wParam = WM_NCRBUTTONDOWN) or (wParam = WM_NCRBUTTONDBLCLK) or
|
|
(wParam = WM_NCMBUTTONDOWN) or (wParam = WM_NCMBUTTONDBLCLK)) and
|
|
not ProcessMouseMessage then
|
|
ActiveBarControl.HideAll
|
|
else Break;
|
|
until ActiveBarControl = nil;
|
|
InMouseHook := False;
|
|
if not IsWindowVisible(PMouseHookStruct(lParam)^.hwnd) then
|
|
begin
|
|
Result := 1;
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
if (QuickCustBar <> nil) and not QuickCustBar.IsActive and
|
|
((WM_MOUSEFIRST < wParam) and (wParam <= WM_MOUSELAST) or
|
|
(WM_NCMOUSEMOVE < wParam) and (wParam <= WM_NCMBUTTONDBLCLK)) then
|
|
begin
|
|
with PMouseHookStruct(lParam)^ do
|
|
begin
|
|
if FindControl(hwnd) is TCustomdxBarControl then
|
|
BarControl := TCustomdxBarControl(FindControl(hwnd))
|
|
else
|
|
BarControl := nil;
|
|
P := pt;
|
|
if BarControl <> nil then ScreenToClient(hwnd, P);
|
|
end;
|
|
if (BarControl = nil) or (BarControl <> QuickCustBar) and
|
|
((BarControl <> QuickCustBar.FOwnerBar) or
|
|
not PtInRect(TdxBarControl(BarControl).MarkRect, P) or
|
|
(wParam = WM_RBUTTONDOWN)) then
|
|
QuickCustBar.CloseUp;
|
|
end;
|
|
|
|
with PMouseHookStruct(lParam)^ do
|
|
if ManualProcessing then
|
|
begin
|
|
P := pt;
|
|
if (WM_NCMOUSEMOVE <= wParam) and (wParam <= WM_NCMBUTTONDBLCLK) then
|
|
begin
|
|
wParam := wParam - WM_NCMOUSEMOVE + WM_MOUSEMOVE;
|
|
ScreenToClient(hwnd, P);
|
|
end;
|
|
if wParam <> WM_MOUSEMOVE then
|
|
SetForegroundWindow(dxBarCustomizingForm.Handle);
|
|
AKeys :=
|
|
Byte(GetAsyncKeyState(VK_CONTROL) < 0) * MK_CONTROL +
|
|
Byte(LeftButtonPressed) * MK_LBUTTON +
|
|
Byte(GetAsyncKeyState(VK_MBUTTON) < 0) * MK_MBUTTON +
|
|
Byte(RightButtonPressed) * MK_RBUTTON +
|
|
Byte(GetAsyncKeyState(VK_SHIFT) < 0) * MK_SHIFT;
|
|
SendMessage(hwnd, wParam, AKeys, MakeLParam(P.X, P.Y));
|
|
Result := 1;
|
|
end
|
|
else
|
|
if ((wParam = WM_RBUTTONUP) or (wParam = WM_NCRBUTTONUP)) {and (GetCapture = 0) }then
|
|
begin
|
|
Control := FindVCLControl(hwnd);
|
|
if (Control <> nil) and IsWindowEnabled(Control.Handle){for Modal windows} then
|
|
begin
|
|
ABarManager := GetBarManagerByForm(GetParentForm(Control));
|
|
// we should leave Result = 0 and pass message to the window for processing
|
|
// because of the ListView (it does not stop multiselection without this, see #22286)
|
|
if (ABarManager <> nil) then
|
|
ABarManager.PopupMenuLinks.DoAction(Control, hwnd, pt);
|
|
{ if (ABarManager <> nil) and
|
|
ABarManager.PopupMenuLinks.DoAction(Control, hwnd, pt) then
|
|
Result := 1;}
|
|
end;
|
|
end;
|
|
finally
|
|
Res := CallNextHookEx(MouseHookHandle, Code, wParam, lParam);
|
|
if Result = 0 then Result := Res;
|
|
end;
|
|
end;
|
|
|
|
// win95 bug fix
|
|
var
|
|
FIsGetingBarManagerdxBarWndProcHook: Boolean;
|
|
|
|
function dxBarWndProcHook(Code: Integer; wParam: WParam; lParam: LParam): LRESULT; stdcall;
|
|
var
|
|
AWnd, AParentWnd: HWND;
|
|
ABarManager, ABarManager2: TdxBarManager;
|
|
|
|
function GetParentFormHandle(Wnd: HWND): HWND;
|
|
begin
|
|
Result := Wnd;
|
|
while not (FindControl(Result) is TCustomForm) and (GetParent(Result) <> 0) do
|
|
Result := GetParent(Result);
|
|
end;
|
|
|
|
function GetBarManager(AWnd: HWND): TdxBarManager;
|
|
var
|
|
AControl: TWinControl;
|
|
begin
|
|
AControl := FindControl(AWnd);
|
|
if AControl is TCustomForm then
|
|
Result := GetBarManagerByForm(TCustomForm(AControl))
|
|
else
|
|
{ if (message = WM_ACTIVATE) and (wParam = WA_INACTIVE) and
|
|
(AControl is TdxBarControl) then // for control containers
|
|
begin
|
|
ABarManager := TdxBarControl(AControl).BarManager;
|
|
AControl := FindControl(lParam);
|
|
if (AControl is TCustomForm) and (AControl = ABarManager.MainForm) or
|
|
(AControl is TdxBarControl) and (TdxBarControl(AControl).BarManager = ABarManager) then
|
|
ABarManager := nil;
|
|
end
|
|
else}
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure ActivateMDIChildFormToolbars(AActivate: Boolean; AActiveWindow: HWND);
|
|
var
|
|
I: Integer;
|
|
AMDIBarManager: TdxBarManager;
|
|
begin
|
|
for I := 0 to dxBarManagerList.Count - 1 do
|
|
begin
|
|
AMDIBarManager := dxBarManagerList[I];
|
|
if (TDummyForm(AMDIBarManager.MainForm).FormStyle = fsMDIChild) and
|
|
(not AActivate or (Application.MainForm.ActiveMDIChild = AMDIBarManager.MainForm)) then
|
|
begin
|
|
if (FindControl(AActiveWindow) is TCustomdxBarControl) and
|
|
(TCustomdxBarControl(FindControl(AActiveWindow)).BarManager = AMDIBarManager) then
|
|
Break;
|
|
AMDIBarManager.ShowToolbars(AActivate, False, AActiveWindow);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{procedure NotifyActiveMDIChildAboutActivation;
|
|
begin
|
|
ABarManager := GetBarManagerByForm(Application.MainForm.ActiveMDIChild);
|
|
if ABarManager <> nil then
|
|
with PCWPStruct(lParam)^ do
|
|
ABarManager.MainFormWndProc(message, wParam, lParam);
|
|
end;}
|
|
|
|
begin
|
|
with PCWPStruct(lParam)^ do
|
|
begin
|
|
AWnd := hwnd;
|
|
if (message = WM_HELP) and (ActiveBarControl <> nil) then
|
|
begin
|
|
AParentWnd := ActiveBarControl.BarManager.MainForm.Handle;
|
|
if GetParentFormHandle(AWnd) <> AParentWnd then
|
|
AWnd := AParentWnd;
|
|
end;
|
|
if not FIsGetingBarManagerdxBarWndProcHook then
|
|
begin
|
|
FIsGetingBarManagerdxBarWndProcHook := True;
|
|
ABarManager := GetBarManager(AWnd);
|
|
FIsGetingBarManagerdxBarWndProcHook := False;
|
|
if ABarManager <> nil then
|
|
ABarManager.MainFormWndProc(message, wParam, lParam)
|
|
else
|
|
if (message = WM_ACTIVATE) and not (FindControl(AWnd) is TdxBarSubMenuControl) and
|
|
not (FindControl(AWnd) is TdxBarQuickControl) and
|
|
not ((FindControl(AWnd) is TdxBarControl) and (Windows.HWND(lParam) = GetParent(hwnd))) then
|
|
begin
|
|
// !!!
|
|
FIsGetingBarManagerdxBarWndProcHook := True;
|
|
if (FindControl(GetParent(AWnd)) is TCustomForm) and
|
|
IsWindowVisible(GetParent(AWnd)) then
|
|
ABarManager2 := GetBarManager(GetParent(AWnd))
|
|
else
|
|
ABarManager2 := nil;
|
|
FIsGetingBarManagerdxBarWndProcHook := False;
|
|
if ABarManager2 <> nil then
|
|
ABarManager2.MainFormWndProc(message, wParam, lParam)
|
|
end;
|
|
if (Application.MainForm <> nil) and (Application.MainForm.FormStyle = fsMDIForm) and
|
|
Application.MainForm.HandleAllocated and (AWnd = Application.MainForm.Handle) and
|
|
not IsPopupMenuShowed then
|
|
case message of
|
|
WM_ACTIVATE:
|
|
ActivateMDIChildFormToolbars(LOWORD(wParam) <> WA_INACTIVE, lParam);
|
|
{WM_ACTIVATE:
|
|
if (LOWORD(wParam) = WA_INACTIVE) or
|
|
(ABarManager = nil) or not ABarManager.IsCustomizing or
|
|
(csDestroying in dxBarCustomizingForm.ComponentState) then
|
|
NotifyActiveMDIChildAboutActivation;}
|
|
WM_WINDOWPOSCHANGED:
|
|
if dxBarCustomizingForm <> nil then
|
|
dxBarCustomizingForm.UpdateVisibility(PWindowPos(lParam)^);
|
|
end;
|
|
end;
|
|
end;
|
|
(*
|
|
with PCWPStruct(lParam)^ do
|
|
begin
|
|
AWnd := hwnd;
|
|
if (message = WM_HELP) and (ActiveBarControl <> nil) then
|
|
begin
|
|
AParentWnd := ActiveBarControl.BarManager.MainForm.Handle;
|
|
if GetParentFormHandle(AWnd) <> AParentWnd then
|
|
AWnd := AParentWnd;
|
|
end;
|
|
ABarManager := GetBarManager(AWnd);
|
|
if ABarManager <> nil then
|
|
ABarManager.MainFormWndProc(message, wParam, lParam);
|
|
if (Application.MainForm <> nil) and (Application.MainForm.FormStyle = fsMDIForm) and
|
|
Application.MainForm.HandleAllocated and (AWnd = Application.MainForm.Handle) then
|
|
case message of
|
|
{WM_ACTIVATE:
|
|
if (LOWORD(wParam) = WA_INACTIVE) or
|
|
(ABarManager = nil) or not ABarManager.IsCustomizing or
|
|
(csDestroying in dxBarCustomizingForm.ComponentState) then
|
|
NotifyActiveMDIChildAboutActivation;}
|
|
WM_WINDOWPOSCHANGED:
|
|
if dxBarCustomizingForm <> nil then
|
|
dxBarCustomizingForm.UpdateVisibility(PWindowPos(lParam)^);
|
|
end;
|
|
end;
|
|
*)
|
|
Result := CallNextHookEx(WndProcHookHandle, Code, wParam, lParam);
|
|
with PCWPStruct(lParam)^ do
|
|
if (message = WM_CHILDACTIVATE) or (message = WM_DESTROY) or (message = WM_MDIACTIVATE) then
|
|
begin
|
|
AParentWnd := GetParent(AWnd);
|
|
if AParentWnd <> 0 then
|
|
begin
|
|
GetClassName(AParentWnd, AClassName, 256);
|
|
if AnsiStrIComp(AClassName, 'MDICLIENT') = 0 then
|
|
begin
|
|
ABarManager := GetBarManager(GetParent(AParentWnd));
|
|
if ABarManager <> nil then
|
|
ABarManager.MainFormClientWndProc(message, wParam, lParam);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure RegisterdxBarManager(ABarManager: TdxBarManager);
|
|
begin
|
|
if dxBarManagerList.FList.IndexOf(ABarManager) < 0 then
|
|
begin
|
|
if dxBarManagerList.Count = 0 then
|
|
InitMMSystem;
|
|
dxBarManagerList.FList.Add(ABarManager);
|
|
end;
|
|
if not ABarManager.Designing and (FHintWindow = nil) then
|
|
FHintWindow := dxBarHintWindowClass.Create(nil);
|
|
if KeyboardHookHandle = 0 then
|
|
KeyboardHookHandle :=
|
|
SetWindowsHookEx(WH_KEYBOARD, dxBarKeyboardHook, 0, GetCurrentThreadId);
|
|
if MouseHookHandle = 0 then
|
|
MouseHookHandle := SetWindowsHookEx(WH_MOUSE, dxBarMouseHook, 0, GetCurrentThreadId);
|
|
if WndProcHookHandle = 0 then
|
|
WndProcHookHandle :=
|
|
SetWindowsHookEx(WH_CALLWNDPROC, dxBarWndProcHook, 0, GetCurrentThreadId);
|
|
end;
|
|
|
|
procedure UnregisterdxBarManager(ABarManager: TdxBarManager);
|
|
begin
|
|
dxBarManagerList.FList.Remove(ABarManager);
|
|
if dxBarManagerList.Count = 0 then
|
|
begin
|
|
if WndProcHookHandle <> 0 then
|
|
begin
|
|
UnhookWindowsHookEx(WndProcHookHandle);
|
|
WndProcHookHandle := 0;
|
|
end;
|
|
if MouseHookHandle <> 0 then
|
|
begin
|
|
UnhookWindowsHookEx(MouseHookHandle);
|
|
MouseHookHandle := 0;
|
|
end;
|
|
if KeyboardHookHandle <> 0 then
|
|
begin
|
|
UnhookWindowsHookEx(KeyboardHookHandle);
|
|
KeyboardHookHandle := 0;
|
|
end;
|
|
if FHintWindow <> nil then
|
|
begin
|
|
FHintWindow.Free;
|
|
FHintWindow := nil;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
constructor TdxBarManager.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
|
|
FCreatingFlag := True;
|
|
if (AOwner = nil) and (Application.MainForm <> nil) then
|
|
AOwner := Application.MainForm;
|
|
if not (AOwner is TCustomForm) then
|
|
raise Exception.Create(cxGetResourceString(@dxSBAR_BARMANAGERBADOWNER));
|
|
FMainForm := TCustomForm(AOwner);
|
|
if GetBarManagerByForm(FMainForm) <> nil then
|
|
raise Exception.Create(cxGetResourceString(@dxSBAR_BARMANAGERMORETHENONE));
|
|
FCreatingFlag := False;
|
|
|
|
RegisterdxBarManager(Self);
|
|
FBackgrounds := TdxBarBackgrounds.Create(Self);
|
|
InitPainterClass;
|
|
FCanModifyDesigner := True;
|
|
FDesigning := csDesigning in ComponentState;
|
|
FAllowReset := True;
|
|
FAutoDockColor := True;
|
|
FItems := TList.Create;
|
|
FCategories := TdxBarManagerCategories.Create(Self);
|
|
FDockControls := TList.Create;
|
|
FPopupMenus := TList.Create;
|
|
FBars := TdxBars.Create(Self);
|
|
FCanCustomize := True;
|
|
FDockColor := clBtnFace;
|
|
FFont := TFont.Create;
|
|
FFont.OnChange := FontChanged;
|
|
FGroups := TList.Create;
|
|
FHelpButtonGlyph := TBitmap.Create;
|
|
FHelpButtonGlyph.OnChange := HelpButtonGlyphChanged;
|
|
FHideFloatingBarsWhenInactive := True;
|
|
FImageListBkColor := clFuchsia;
|
|
FImagesChangeLink := TChangeLink.Create;
|
|
FImagesChangeLink.OnChange := ImageListChange;
|
|
FLargeImagesChangeLink := TChangeLink.Create;
|
|
FLargeImagesChangeLink.OnChange := LargeImageListChange;
|
|
FHotImagesChangeLink := TChangeLink.Create;
|
|
FHotImagesChangeLink.OnChange := HotImageListChange;
|
|
FDisabledImagesChangeLink := TChangeLink.Create;
|
|
FDisabledImagesChangeLink.OnChange := DisabledImageListChange;
|
|
FDisabledLargeImagesChangeLink := TChangeLink.Create;
|
|
FDisabledLargeImagesChangeLink.OnChange := DisabledLargeImageListChange;
|
|
FThemeChangedNotificator := TdxThemeChangedNotificator.Create;
|
|
FThemeChangedNotificator.OnThemeChanged := ThemeChanged;
|
|
FButtonArrowWidth := dxBarDefaultButtonArrowWidth;
|
|
FLargeButtonArrowWidth := dxBarDefaultLargeButtonArrowWidth;
|
|
FMenusShowRecentItemsFirst := True;
|
|
FMostRecentItemsPercents := 95;
|
|
CalcMostRecentlyUsedUseCount;
|
|
FPopupMenuLinks := TdxBarPopupMenuLinks.Create(Self);
|
|
FScaled := True;
|
|
FShowFullMenusAfterDelay := True;
|
|
FShowHint := True;
|
|
FShowHintForDisabledItems := True;
|
|
FStretchGlyphs := True;
|
|
CalcButtonsConsts;
|
|
|
|
FLookAndFeel := TcxLookAndFeel.Create(Self);
|
|
FLookAndFeel.OnChanged := LFChanged;
|
|
Style := bmsEnhanced;
|
|
|
|
FUseF10ForMenu := True;
|
|
UseSystemFont := True;
|
|
FWaitForDockingTime := 21;
|
|
CreateToolbarsBrushes;
|
|
end;
|
|
|
|
destructor TdxBarManager.Destroy;
|
|
begin
|
|
if not FCreatingFlag then
|
|
begin
|
|
FLookAndFeel.Free;
|
|
FLookAndFeel := nil;
|
|
|
|
FThemeChangedNotificator.Free;
|
|
|
|
if FHintTimerID <> 0 then
|
|
begin
|
|
KillHintTimer;
|
|
HintActivate(False, '');
|
|
end;
|
|
KillHiddenHintTimer;
|
|
Customizing(False);
|
|
|
|
DestroyToolbarsBrushes;
|
|
while FPopupMenus.Count > 0 do
|
|
TdxBarPopupMenu(FPopupMenus.Last).Free;
|
|
FPopupMenus.Free;
|
|
FDisabledImagesChangeLink.Free;
|
|
FDisabledLargeImagesChangeLink.Free;
|
|
FHotImagesChangeLink.Free;
|
|
FLargeImagesChangeLink.Free;
|
|
FImagesChangeLink.Free;
|
|
FHelpButtonGlyph.Free;
|
|
while GroupCount > 0 do Groups[0].Free;
|
|
FGroups.Free;
|
|
FFont.Free;
|
|
DeleteObject(FEditFontHandle);
|
|
FBars.Free;
|
|
FBars := nil;
|
|
FDockControls.Free;
|
|
FDockControls := nil;
|
|
DestroyItems;
|
|
FItems.Free;
|
|
UnregisterdxBarManager(Self);
|
|
FCategories.Free;
|
|
DestroyBarRestoringList;
|
|
FPopupMenuLinks.Free;
|
|
FBackgrounds.Free;
|
|
end;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarManager.GetBarControlFocused: Boolean;
|
|
begin
|
|
Result := FFocusedBarControl <> nil;
|
|
end;
|
|
|
|
function TdxBarManager.GetCategoryItemsVisible(AIndex: Integer): TdxBarItemVisible;
|
|
begin
|
|
if (0 <= AIndex) and (AIndex < FCategories.Count) then
|
|
with FCategories do
|
|
if Objects[AIndex] = nil then
|
|
Result := ivAlways
|
|
else
|
|
Result := TdxBarCategoryData(Objects[AIndex]).ItemsVisible
|
|
else Result := ivNever;
|
|
end;
|
|
|
|
function TdxBarManager.GetCategoryVisible(AIndex: Integer): Boolean;
|
|
begin
|
|
if (0 <= AIndex) and (AIndex < FCategories.Count) then
|
|
with FCategories do
|
|
Result := (Objects[AIndex] = nil) or TdxBarCategoryData(Objects[AIndex]).Visible
|
|
else Result := False;
|
|
end;
|
|
|
|
function TdxBarManager.GetDockColor: TColor;
|
|
begin
|
|
if FAutoDockColor then
|
|
Result := FMainForm.Color
|
|
else
|
|
Result := FDockColor;
|
|
end;
|
|
|
|
function TdxBarManager.GetDockControl(Index: Integer): TdxDockControl;
|
|
begin
|
|
Result := FDockControls[Index];
|
|
end;
|
|
|
|
function TdxBarManager.GetDockControlCount: Integer;
|
|
begin
|
|
Result := FDockControls.Count;
|
|
end;
|
|
|
|
function TdxBarManager.GetFlat: Boolean;
|
|
begin
|
|
Result := FStyle = bmsFlat;
|
|
end;
|
|
|
|
function TdxBarManager.GetFlatToolbarsBorderColor: COLORREF;
|
|
|
|
function GetDarkValue(Value: Byte): Byte;
|
|
begin
|
|
Result := MulDiv(Value, 8, 10);
|
|
end;
|
|
|
|
begin
|
|
Result := GetSysColor(COLOR_BTNSHADOW);
|
|
Result := RGB(
|
|
GetDarkValue(GetRValue(Result)),
|
|
GetDarkValue(GetGValue(Result)),
|
|
GetDarkValue(GetBValue(Result)));
|
|
Result := GetRealColor(Result);
|
|
end;
|
|
|
|
function TdxBarManager.GetFlatToolbarsColor: COLORREF;
|
|
|
|
function GetLightValue(Value: Byte): Byte;
|
|
begin
|
|
Result := Value + MulDiv(255 - Value, 16, 100);
|
|
end;
|
|
|
|
begin
|
|
Result := GetSysColor(COLOR_BTNFACE);
|
|
Result := RGB(
|
|
GetLightValue(GetRValue(Result)),
|
|
GetLightValue(GetGValue(Result)),
|
|
GetLightValue(GetBValue(Result)));
|
|
Result := GetRealColor(Result);
|
|
end;
|
|
|
|
function TdxBarManager.GetFlatToolbarsDownedColor: COLORREF;
|
|
begin
|
|
Result := GetRealColor(GetLightColor(11, 9, 73));
|
|
end;
|
|
|
|
function TdxBarManager.GetFlatToolbarsDownedSelColor: COLORREF;
|
|
begin
|
|
Result := GetRealColor(GetLightColor(14, 44, 40));
|
|
end;
|
|
|
|
function TdxBarManager.GetFlatToolbarsSelColor: COLORREF;
|
|
begin
|
|
Result := GetRealColor(GetLightColor(-2, 30, 72));
|
|
end;
|
|
|
|
function TdxBarManager.GetGroup(Index: Integer): TdxBarGroup;
|
|
begin
|
|
Result := TdxBarGroup(FGroups[Index]);
|
|
end;
|
|
|
|
function TdxBarManager.GetGroupCount: Integer;
|
|
begin
|
|
Result := FGroups.Count;
|
|
end;
|
|
|
|
function TdxBarManager.GetIsCustomizing: Boolean;
|
|
begin
|
|
Result := FIsCustomizing or FDesigning;
|
|
end;
|
|
|
|
function TdxBarManager.GetIsDestroying: Boolean;
|
|
begin
|
|
Result := csDestroying in ComponentState;
|
|
end;
|
|
|
|
function TdxBarManager.GetItemCount: Integer;
|
|
begin
|
|
Result := FItems.Count;
|
|
end;
|
|
|
|
function TdxBarManager.GetItem(Index: Integer): TdxBarItem;
|
|
begin
|
|
if (0 <= Index) and (Index < FItems.Count) then
|
|
Result := TdxBarItem(FItems[Index])
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TdxBarManager.GetRealLargeButtonArrowWidth: Integer;
|
|
begin
|
|
Result := PainterClass.RealLargeButtonArrowWidth(Self);
|
|
end;
|
|
|
|
function TdxBarManager.GetRestoringListBar(Index: Integer): TdxBar;
|
|
begin
|
|
Result := TdxBar(FBarRestoringList[Index]);
|
|
end;
|
|
|
|
function TdxBarManager.GetRestoringListBarCount: Integer;
|
|
begin
|
|
if BarRestoringListExists then
|
|
Result := FBarRestoringList.Count
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetAutoDockColor(Value: Boolean);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FAutoDockColor <> Value then
|
|
begin
|
|
FAutoDockColor := Value;
|
|
for I := 0 to DockControlCount - 1 do
|
|
DockControls[I].ColorChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetAutoHideEmptyBars(Value: Boolean);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FAutoHideEmptyBars <> Value then
|
|
begin
|
|
FAutoHideEmptyBars := Value;
|
|
if not Value then
|
|
for I := 0 to FBars.Count - 1 do
|
|
Bars[I].FInternallyHidden := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetBackgrounds(Value: TdxBarBackgrounds);
|
|
begin
|
|
FBackgrounds.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarManager.SetBars(Value: TdxBars);
|
|
begin
|
|
FBars.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarManager.SetButtonArrowWidth(Value: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FButtonArrowWidth <> Value then
|
|
begin
|
|
if Value < 2 then Exit;
|
|
FButtonArrowWidth := Value;
|
|
CalcButtonsConsts;
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
if Control <> nil then Control.RepaintBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetCategories(Value: TStrings);
|
|
begin
|
|
Categories.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarManager.SetCategoryItemsVisible(AIndex: Integer; Value: TdxBarItemVisible);
|
|
var
|
|
PrevValue: TdxBarItemVisible;
|
|
EmptyBars, AList: TList;
|
|
PrevLockUpdate: Boolean;
|
|
I: Integer;
|
|
begin
|
|
if (0 <= AIndex) and (AIndex < FCategories.Count) then
|
|
begin
|
|
PrevValue := CategoryItemsVisible[AIndex];
|
|
with FCategories do
|
|
begin
|
|
if Objects[AIndex] = nil then
|
|
begin
|
|
Objects[AIndex] := TdxBarCategoryData.Create;
|
|
with TdxBarCategoryData(Objects[AIndex]) do
|
|
begin
|
|
ItemsVisible := ivAlways;
|
|
Visible := True;
|
|
end;
|
|
end;
|
|
if Self.IsLoading then
|
|
begin
|
|
TdxBarCategoryData(Objects[AIndex]).LoadedItemsVisible := Value;
|
|
Exit;
|
|
end;
|
|
TdxBarCategoryData(Objects[AIndex]).ItemsVisible := Value;
|
|
|
|
if not FDesigning then
|
|
begin
|
|
EmptyBars := nil;
|
|
if FAutoHideEmptyBars then
|
|
begin
|
|
EmptyBars := TList.Create;
|
|
for I := 0 to FBars.Count - 1 do
|
|
if FBars[I].ItemLinks.AvailableItemCount = 0 then EmptyBars.Add(FBars[I]);
|
|
end;
|
|
|
|
PrevLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
|
|
AList := TList.Create;
|
|
try
|
|
GetAllItemsByCategory(AIndex, AList);
|
|
if Value = ivAlways then
|
|
for I := AList.Count - 1 downto 0 do
|
|
with TdxBarItem(AList[I]) do
|
|
if Visible = PrevValue then Visible := Value
|
|
else
|
|
else
|
|
for I := 0 to AList.Count - 1 do
|
|
with TdxBarItem(AList[I]) do
|
|
if Visible = PrevValue then Visible := Value;
|
|
finally
|
|
AList.Free;
|
|
|
|
if FAutoHideEmptyBars then
|
|
begin
|
|
for I := 0 to FBars.Count - 1 do
|
|
if (Value = ivNever) and (FBars[I].ItemLinks.AvailableItemCount = 0) and
|
|
(EmptyBars.IndexOf(FBars[I]) = -1) or
|
|
(Value = ivAlways) and (FBars[I].ItemLinks.AvailableItemCount > 0) and
|
|
FBars[I].FInternallyHidden then
|
|
with FBars[I] do
|
|
begin
|
|
Visible := Value = ivAlways;
|
|
FInternallyHidden := Value = ivNever;
|
|
end;
|
|
EmptyBars.Free;
|
|
end;
|
|
|
|
LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
if Value <> PrevValue then DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetCategoryVisible(AIndex: Integer; Value: Boolean);
|
|
begin
|
|
if (0 <= AIndex) and (AIndex < FCategories.Count) and
|
|
(CategoryVisible[AIndex] <> Value) then
|
|
begin
|
|
with FCategories do
|
|
begin
|
|
if Objects[AIndex] = nil then
|
|
begin
|
|
Objects[AIndex] := TdxBarCategoryData.Create;
|
|
TdxBarCategoryData(Objects[AIndex]).ItemsVisible := ivAlways;
|
|
end;
|
|
TdxBarCategoryData(Objects[AIndex]).Visible := Value;
|
|
end;
|
|
DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarManager.GetMainMenuControl: TdxBarControl;
|
|
begin
|
|
if FMainMenuBar <> nil then
|
|
Result := FMainMenuBar.Control
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetDockColor(Value: TColor);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FDockColor <> Value then
|
|
begin
|
|
FDockColor := Value;
|
|
FAutoDockColor := False;
|
|
for I := 0 to DockControlCount - 1 do
|
|
DockControls[I].ColorChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetFlatCloseButton(Value: Boolean);
|
|
begin
|
|
if FFlatCloseButton <> Value then
|
|
begin
|
|
FFlatCloseButton := Value;
|
|
if MainMenuControl <> nil then
|
|
begin
|
|
if (SelectedItem <> nil) and (SelectedItem.Parent = MainMenuControl) then
|
|
SelectedItem := nil;
|
|
MainMenuControl.RepaintBar;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetFont(Value: TFont);
|
|
begin
|
|
FFont.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarManager.SetHelpButtonGlyph(Value: TBitmap);
|
|
begin
|
|
FHelpButtonGlyph.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarManager.SetHideFloatingBarsWhenInactive(Value: Boolean);
|
|
begin
|
|
if FHideFloatingBarsWhenInactive <> Value then
|
|
begin
|
|
FHideFloatingBarsWhenInactive := Value;
|
|
ShowToolbars(FMainFormActive or not FHideFloatingBarsWhenInactive, False, 0);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetHotImages(Value: TCurImageList);
|
|
begin
|
|
if FHotImages <> Value then
|
|
begin
|
|
if FHotImages <> nil then
|
|
FHotImages.UnRegisterChanges(FHotImagesChangeLink);
|
|
FHotImages := Value;
|
|
if FHotImages <> nil then
|
|
begin
|
|
FHotImages.RegisterChanges(FHotImagesChangeLink);
|
|
FHotImages.FreeNotification(Self);
|
|
end;
|
|
HotImagesChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetImageListBkColor(Value: TColor);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FImageListBkColor <> Value then
|
|
begin
|
|
FImageListBkColor := Value;
|
|
for I := 0 to FBars.Count - 1 do
|
|
with FBars[I] do
|
|
if Control <> nil then Control.Repaint;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetImages(Value: TCurImageList);
|
|
begin
|
|
if FImages <> Value then
|
|
begin
|
|
if FImages <> nil then
|
|
FImages.UnRegisterChanges(FImagesChangeLink);
|
|
FImages := Value;
|
|
if FImages <> nil then
|
|
begin
|
|
FImages.RegisterChanges(FImagesChangeLink);
|
|
FImages.FreeNotification(Self);
|
|
end;
|
|
ImagesChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetDisabledImages(Value: TCurImageList);
|
|
begin
|
|
if FDisabledImages <> Value then
|
|
begin
|
|
if FDisabledImages <> nil then
|
|
FDisabledImages.UnRegisterChanges(FDisabledImagesChangeLink);
|
|
FDisabledImages := Value;
|
|
if FDisabledImages <> nil then
|
|
begin
|
|
FDisabledImages.RegisterChanges(FDisabledImagesChangeLink);
|
|
FDisabledImages.FreeNotification(Self);
|
|
end;
|
|
DisabledImagesChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetDisabledLargeImages(Value: TCurImageList);
|
|
begin
|
|
if FDisabledLargeImages <> Value then
|
|
begin
|
|
if FDisabledLargeImages <> nil then
|
|
FDisabledLargeImages.UnRegisterChanges(FDisabledLargeImagesChangeLink);
|
|
FDisabledLargeImages := Value;
|
|
if FDisabledLargeImages <> nil then
|
|
begin
|
|
FDisabledLargeImages.RegisterChanges(FDisabledLargeImagesChangeLink);
|
|
FDisabledLargeImages.FreeNotification(Self);
|
|
end;
|
|
DisabledLargeImagesChanged;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarManager.GetIsLoading: Boolean;
|
|
begin
|
|
Result := csLoading in ComponentState;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetLargeButtonArrowWidth(Value: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FLargeButtonArrowWidth <> Value then
|
|
begin
|
|
if Value < 2 then Exit;
|
|
FLargeButtonArrowWidth := Value;
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
if Control <> nil then Control.RepaintBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetLargeIcons(Value: Boolean);
|
|
begin
|
|
if FLargeIcons <> Value then
|
|
begin
|
|
FLargeIcons := Value;
|
|
LargeIconsChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetLargeImages(Value: TCurImageList);
|
|
begin
|
|
if FLargeImages <> Value then
|
|
begin
|
|
if FLargeImages <> nil then
|
|
FLargeImages.UnRegisterChanges(FLargeImagesChangeLink);
|
|
FLargeImages := Value;
|
|
if FLargeImages <> nil then
|
|
begin
|
|
FLargeImages.RegisterChanges(FLargeImagesChangeLink);
|
|
FLargeImages.FreeNotification(Self);
|
|
end;
|
|
if LargeIcons and UseLargeImagesForLargeIcons then
|
|
LargeIconsChanged;
|
|
LargeImagesChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetLockUpdate(Value: Boolean);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FLockUpdate <> Value then
|
|
begin
|
|
FLockUpdate := Value;
|
|
|
|
for I := 0 to DockControlCount - 1 do
|
|
with DockControls[I] do
|
|
if Visible and HandleAllocated then
|
|
SendMessage(Handle, WM_SETREDRAW, WPARAM(not Self.FLockUpdate), 0);
|
|
|
|
for I := 0 to Bars.Count - 1 do
|
|
if FBars[I].DockingStyle = dsNone then
|
|
FBars[I].LockUpdate := FLockUpdate
|
|
else
|
|
FBars[I].FLockUpdate := FLockUpdate;
|
|
|
|
if not FLockUpdate then
|
|
begin
|
|
// Recreate ItemLink.Control(s) !!!
|
|
{ for I := 0 to Bars.Count - 1 do
|
|
if FBars[I].DockingStyle <> dsNone then
|
|
begin
|
|
if FBars[I].Control <> nil then
|
|
begin
|
|
FBars[I].Control.DestroyControls;
|
|
FBars[I].Control.CreateControls;
|
|
end;
|
|
end;}
|
|
|
|
for I := 0 to DockControlCount - 1 do
|
|
with DockControls[I] do
|
|
if Visible and HandleAllocated then
|
|
begin
|
|
UpdateDock;
|
|
SendMessage(Handle, WM_NCPAINT, 0, 0);
|
|
end;
|
|
for I := 0 to FBars.Count - 1 do
|
|
if (FBars[I].DockingStyle <> dsNone) and (FBars[I].Control <> nil) then
|
|
with FBars[I].Control do
|
|
begin
|
|
FrameChanged;
|
|
Repaint;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetLookAndFeel(Value: TcxLookAndFeel);
|
|
begin
|
|
FLookAndFeel.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarManager.SetMakeDisabledImagesFaded(Value: Boolean);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FMakeDisabledImagesFaded <> Value then
|
|
begin
|
|
FMakeDisabledImagesFaded := Value;
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
if Control <> nil then Control.RepaintBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetMenuAnimations(Value: TdxBarMenuAnimations);
|
|
begin
|
|
if FMenuAnimations <> Value then
|
|
begin
|
|
FMenuAnimations := Value;
|
|
DesignerModified;
|
|
UpdateBarManagerOptions;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetMenusShowRecentItemsFirst(Value: Boolean);
|
|
begin
|
|
if FMenusShowRecentItemsFirst <> Value then
|
|
begin
|
|
FMenusShowRecentItemsFirst := Value;
|
|
DesignerModified;
|
|
UpdateBarManagerOptions;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetMostRecentItemsPercents(Value: Byte);
|
|
begin
|
|
if Value > 100 then Value := 100;
|
|
FMostRecentItemsPercents := Value;
|
|
CalcMostRecentlyUsedUseCount;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetNotDocking(Value: TdxBarDockingStyles);
|
|
begin
|
|
if FNotDocking <> Value then
|
|
begin
|
|
FNotDocking := Value;
|
|
InternalStyleChanged; // TODO: ???
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetPopupMenuLinks(Value: TdxBarPopupMenuLinks);
|
|
begin
|
|
FPopupMenuLinks.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarManager.SetScaled(Value: Boolean);
|
|
begin
|
|
if FScaled <> Value then
|
|
begin
|
|
FScaled := Value;
|
|
if Value and not FUseSystemFont then AssignFont;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetSelectedItem(Value: TdxBarItemControl);
|
|
var
|
|
OldSelectedItem: TdxBarItemControl;
|
|
begin
|
|
if FSelectedItem <> Value then
|
|
begin
|
|
if IsCustomizing and (FSelectedItem <> nil) and
|
|
((Value = nil) or
|
|
(GetParentBarForControl(Value) <> GetParentBarForControl(FSelectedItem))) then
|
|
if GetParentBarForControl(FSelectedItem) <> nil then
|
|
GetParentBarForControl(FSelectedItem).SetMouseSelectedItem(nil)
|
|
else
|
|
if (dxBarSubMenuEditor <> nil) and (GetParentBarOrSubMenuForControl(FSelectedItem) =
|
|
dxBarSubMenuEditor.ItemLinks.BarControl) then
|
|
dxBarSubMenuEditor.ItemLinks.BarControl.Free;
|
|
OldSelectedItem := FSelectedItem;
|
|
FSelectedItem := Value;
|
|
if (OldSelectedItem <> nil) and (OldSelectedItem.Parent <> nil) and
|
|
not FDragging then OldSelectedItem.Repaint;
|
|
if Designing and (FSelectedItem <> nil) and not FDragging then
|
|
dxBarDesigner.SelectComponent(Self, FSelectedItem.ItemLink.Item);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetShowCloseButton(Value: Boolean);
|
|
begin
|
|
if FShowCloseButton <> Value then
|
|
begin
|
|
FShowCloseButton := Value;
|
|
if MainMenuControl <> nil then
|
|
begin
|
|
if (SelectedItem <> nil) and (SelectedItem.Parent = MainMenuControl) then
|
|
SelectedItem := nil;
|
|
MainMenuControl.RepaintBar;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetShowFullMenusAfterDelay(Value: Boolean);
|
|
begin
|
|
if FShowFullMenusAfterDelay <> Value then
|
|
begin
|
|
FShowFullMenusAfterDelay := Value;
|
|
DesignerModified;
|
|
UpdateBarManagerOptions;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetShowHelpButton(Value: Boolean);
|
|
begin
|
|
if FShowHelpButton <> Value then
|
|
begin
|
|
FShowHelpButton := Value;
|
|
UpdateHelpButton;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetShowHint(Value: Boolean);
|
|
begin
|
|
if FShowHint <> Value then
|
|
begin
|
|
FShowHint := Value;
|
|
DesignerModified;
|
|
UpdateBarManagerOptions;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetShowShortCutInHint(Value: Boolean);
|
|
begin
|
|
if FShowShortCutInHint <> Value then
|
|
begin
|
|
FShowShortCutInHint := Value;
|
|
DesignerModified;
|
|
UpdateBarManagerOptions;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetStyle(Value: TdxBarManagerStyle);
|
|
begin
|
|
if FStyle <> Value then
|
|
begin
|
|
FStyle := Value;
|
|
InternalStyleChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetSunkenBorder(Value: Boolean);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FSunkenBorder <> Value then
|
|
begin
|
|
FSunkenBorder := Value;
|
|
for I := 0 to DockControlCount - 1 do
|
|
DockControls[I].NCChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetUseSystemFont(Value: Boolean);
|
|
begin
|
|
if FUseSystemFont <> Value then
|
|
begin
|
|
FUseSystemFont := Value;
|
|
if FUseSystemFont then
|
|
MainFormWndProc(WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetUseLargeImagesForLargeIcons(Value: Boolean);
|
|
begin
|
|
if FUseLargeImagesForLargeIcons <> Value then
|
|
begin
|
|
FUseLargeImagesForLargeIcons := Value;
|
|
LargeIconsChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SetWaitForDockingTime(Value: Integer);
|
|
begin
|
|
if Value >= 0 then FWaitForDockingTime := Value;
|
|
end;
|
|
|
|
procedure TdxBarManager.AddCustomizeLink(ItemLinks: TdxBarItemLinks;
|
|
ABeginGroup: Boolean; ItemClass: TdxBarItemClass);
|
|
begin
|
|
if FCanCustomize then
|
|
begin
|
|
InternalItemList.Add(ItemClass.Create(nil));
|
|
with TdxBarButton(InternalItemList.Last) do
|
|
begin
|
|
Caption := cxGetResourceString(@dxSBAR_CUSTOMIZE);
|
|
Enabled := dxBarCustomizingForm = nil;
|
|
Tag := 1000;
|
|
OnClick := ToolbarsPopupClick;
|
|
end;
|
|
with ItemLinks.Add do
|
|
begin
|
|
Item := TdxBarButton(InternalItemList.Last);
|
|
BeginGroup := ABeginGroup;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.CalcButtonsConsts;
|
|
begin
|
|
if FLargeIcons then
|
|
begin
|
|
if IsLargeImagesForLargeIcons then
|
|
FGlyphSize := LargeImages.Width
|
|
else
|
|
FGlyphSize := DefautGlyphSize * 2;
|
|
end
|
|
else
|
|
FGlyphSize := DefautGlyphSize; // * (1 + Byte(FLargeIcons));
|
|
FButtonWidth := FGlyphSize + PainterClass.ButtonBorderWidth;
|
|
FButtonHeight := FGlyphSize + PainterClass.ButtonBorderHeight;
|
|
FRealButtonArrowWidth := PainterClass.RealButtonArrowWidth(Self);
|
|
end;
|
|
|
|
procedure TdxBarManager.DrawDraggingLine(AControl: TdxBarItemControl;
|
|
IsBeginGroup, IsFirstPart, IsVerticalDirection: Boolean);
|
|
const
|
|
LineSize = 6;
|
|
Pairs: array[0..5] of DWORD = (2, 2, 2, 2, 2, 2);
|
|
type
|
|
PPoints = ^TPoints;
|
|
TPoints = array[0..0] of TPoint;
|
|
var
|
|
IsLastControl: Boolean;
|
|
R: TRect;
|
|
DC: HDC;
|
|
Origin: Integer;
|
|
|
|
procedure PolyPolyLine(const Points: array of TPoint);
|
|
begin
|
|
Windows.PolyPolyLine(DC, PPoints(@Points)^, Pairs, 6);
|
|
end;
|
|
|
|
begin
|
|
if IsBeginGroup then
|
|
begin
|
|
if IsFirstPart then
|
|
with AControl do
|
|
AControl := Parent.ItemLinks.VisibleItems[ItemLink.VisibleIndex - 1].Control;
|
|
IsFirstPart := not IsFirstPart;
|
|
end
|
|
else
|
|
if not IsFirstPart then
|
|
begin
|
|
with AControl do
|
|
IsLastControl := AControl.FLastInRow or
|
|
Parent.ItemLinks.VisibleItems[ItemLink.VisibleIndex + 1].BeginGroup;
|
|
if not IsLastControl then
|
|
begin
|
|
with AControl do
|
|
AControl := Parent.ItemLinks.VisibleItems[ItemLink.VisibleIndex + 1].Control;
|
|
IsFirstPart := True;
|
|
end;
|
|
end;
|
|
R := AControl.Parent.GetItemRect(AControl);
|
|
|
|
DC := AControl.Parent.Canvas.Handle;
|
|
with R do
|
|
begin
|
|
SetROP2(DC, R2_NOT);
|
|
if IsVerticalDirection then
|
|
begin
|
|
if IsFirstPart then Origin := R.Top
|
|
else Origin := R.Bottom - LineSize;
|
|
PolyPolyLine(
|
|
[Point(Left, Origin), Point(Left, Origin + LineSize),
|
|
Point(Left + 1, Origin + 1), Point(Left + 1, Origin + LineSize - 1),
|
|
|
|
Point(Left + 2, Origin + 2), Point(Right - 2, Origin + 2),
|
|
Point(Left + 2, Origin + 3), Point(Right - 2, Origin + 3),
|
|
|
|
Point(Right - 2, Origin + 1), Point(Right - 2, Origin + LineSize - 1),
|
|
Point(Right - 1, Origin), Point(Right - 1, Origin + LineSize)]);
|
|
end
|
|
else
|
|
begin
|
|
if IsFirstPart then Origin := R.Left
|
|
else Origin := R.Right - LineSize;
|
|
PolyPolyLine(
|
|
[Point(Origin, Top), Point(Origin + LineSize, Top),
|
|
Point(Origin + 1, Top + 1), Point(Origin + LineSize - 1, Top + 1),
|
|
|
|
Point(Origin + 2, Top + 2), Point(Origin + 2, Bottom - 2),
|
|
Point(Origin + 3, Top + 2), Point(Origin + 3, Bottom - 2),
|
|
|
|
Point(Origin + 1, Bottom - 2), Point(Origin + LineSize - 1, Bottom - 2),
|
|
Point(Origin, Bottom - 1), Point(Origin + LineSize, Bottom - 1)]);
|
|
end;
|
|
SetROP2(DC, R2_COPYPEN);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.FontChanged(Sender: TObject);
|
|
|
|
procedure ProcessBars;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
begin
|
|
FInternalFontChange := True;
|
|
try
|
|
if UseOwnFont then
|
|
FontChanged(nil)
|
|
else
|
|
Font := Self.FFont;
|
|
finally
|
|
FInternalFontChange := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure ProcessPopupMenus;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to FPopupMenus.Count - 1 do
|
|
with TdxBarPopupMenu(FPopupMenus[I]) do
|
|
begin
|
|
FInternalFontChange := True;
|
|
try
|
|
if UseOwnFont then
|
|
FontChanged(nil)
|
|
else
|
|
Font := Self.FFont;
|
|
finally
|
|
FInternalFontChange := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if not FInternalFontChange then
|
|
FUseSystemFont := False;
|
|
if FScaled then
|
|
begin
|
|
FFont.OnChange := nil;
|
|
try
|
|
AssignFont;
|
|
finally
|
|
FFont.OnChange := FontChanged;
|
|
end;
|
|
end;
|
|
CreateEditFontHandle(FFont, FEditFontHandle, FScaled);
|
|
ProcessBars;
|
|
ProcessPopupMenus;
|
|
end;
|
|
|
|
{ TSystemMenuSubItem }
|
|
|
|
type
|
|
TSystemMenuSubItem = class(TCustomdxBarSubItem)
|
|
private
|
|
FMDIChildHandle: HWND;
|
|
function GetIconHandle: HICON;
|
|
procedure ButtonClick(Sender: TObject);
|
|
protected
|
|
procedure BuildMenu;
|
|
procedure DirectClick; override;
|
|
public
|
|
property IconHandle: HICON read GetIconHandle;
|
|
property MDIChildHandle: HWND read FMDIChildHandle write FMDIChildHandle;
|
|
end;
|
|
|
|
function TSystemMenuSubItem.GetIconHandle: HICON;
|
|
begin
|
|
Result := SendMessage(FMDIChildHandle, WM_GETICON, ICON_SMALL, 0);
|
|
if Result = 0 then
|
|
Result := SendMessage(FMDIChildHandle, WM_GETICON, ICON_BIG, 0);
|
|
Result :=
|
|
CopyImage(Result, IMAGE_ICON, 16, 16, LR_COPYFROMRESOURCE);
|
|
end;
|
|
|
|
procedure TSystemMenuSubItem.ButtonClick(Sender: TObject);
|
|
begin
|
|
with TdxBarItem(Sender) do
|
|
SendMessage(MDIChildHandle, WM_SYSCOMMAND, Tag, 0);
|
|
end;
|
|
|
|
procedure TSystemMenuSubItem.BuildMenu;
|
|
const
|
|
SLength = 1024;
|
|
|
|
procedure BuildSubMenu(SubItem: TCustomdxBarSubItem; Menu: HWND);
|
|
const
|
|
BitmapNames: array[HBMMENU_POPUP_CLOSE..HBMMENU_POPUP_MINIMIZE] of string =
|
|
('DXBARCLOSE', 'DXBARRESTORE', 'DXBARMAXIMIZE', 'DXBARMINIMIZE');
|
|
var
|
|
ABeginGroup: Boolean;
|
|
S: PChar;
|
|
I, P: Integer;
|
|
MI: TMenuItemInfo;
|
|
AShortCutText: string;
|
|
AItem: TdxBarItem;
|
|
begin
|
|
ABeginGroup := False;
|
|
GetMem(S, SLength);
|
|
try
|
|
for I := 0 to GetMenuItemCount(Menu) - 1 do
|
|
begin
|
|
with MI do
|
|
begin
|
|
if not IsWin95 then
|
|
cbSize := SizeOf(MI)
|
|
else
|
|
begin
|
|
cbSize := 44;
|
|
MI.hbmpItem := 0;
|
|
end;
|
|
fMask :=
|
|
MIIM_CHECKMARKS or MIIM_ID or MIIM_STATE or MIIM_SUBMENU or MIIM_TYPE;
|
|
dwTypeData := S;
|
|
cch := SLength;
|
|
end;
|
|
GetMenuItemInfo(Menu, I, True, MI);
|
|
|
|
if MI.fType and MFT_SEPARATOR <> 0 then
|
|
begin
|
|
ABeginGroup := True;
|
|
Continue;
|
|
end;
|
|
|
|
if MI.fType and MFT_BITMAP <> 0 then
|
|
GetMenuString(Menu, I, S, SLength, MF_BYPOSITION)
|
|
else
|
|
if MI.cch = 0 then StrCopy(S, '');
|
|
P := Pos(#9, S);
|
|
if P = 0 then
|
|
AShortCutText := ''
|
|
else
|
|
begin
|
|
AShortCutText := Copy(S, P + 1, Length(S) - P);
|
|
StrLCopy(S, S, P - 1);
|
|
end;
|
|
|
|
if MI.hSubMenu = 0 then
|
|
begin
|
|
AItem := TdxBarButton.Create(Owner);
|
|
if MI.fState and MFS_CHECKED <> 0 then
|
|
with TdxBarButton(AItem) do
|
|
begin
|
|
ButtonStyle := bsChecked;
|
|
Down := True;
|
|
end;
|
|
with AItem do
|
|
begin
|
|
Tag := MI.wID;
|
|
OnClick := ButtonClick;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
AItem := TdxBarSubItem.Create(Owner);
|
|
BuildSubMenu(TCustomdxBarSubItem(AItem), MI.hSubMenu);
|
|
end;
|
|
InternalItemList.Add(AItem);
|
|
with AItem do
|
|
begin
|
|
Caption := S;
|
|
Enabled := MI.fState and (MFS_DISABLED or MFS_GRAYED) = 0;
|
|
if MI.hbmpItem in [HBMMENU_POPUP_CLOSE..HBMMENU_POPUP_MINIMIZE] then
|
|
Glyph.Handle := LoadBitmap(HInstance, PChar(BitmapNames[MI.hbmpItem]))
|
|
else
|
|
begin
|
|
if MI.fState and MFS_CHECKED <> 0 then
|
|
if MI.hbmpChecked <> 0 then
|
|
Glyph.Handle := CopyImage(MI.hbmpChecked, IMAGE_BITMAP, 0, 0, 0)
|
|
else
|
|
else
|
|
if MI.hbmpUnchecked <> 0 then
|
|
Glyph.Handle := CopyImage(MI.hbmpUnchecked, IMAGE_BITMAP, 0, 0, 0);
|
|
if (Glyph.Handle = 0) and (MI.fType and MFT_BITMAP <> 0) then
|
|
Glyph.Handle := CopyImage(HBITMAP(MI.dwTypeData), IMAGE_BITMAP, 0, 0, 0);
|
|
end;
|
|
ShortCut := TextToShortCut(AShortCutText);
|
|
end;
|
|
|
|
with SubItem.ItemLinks.Add do
|
|
begin
|
|
BeginGroup := ABeginGroup;
|
|
Item := AItem;
|
|
end;
|
|
ABeginGroup := False;
|
|
end;
|
|
finally
|
|
FreeMem(S);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
ClearInternalItemList;
|
|
BuildSubMenu(Self, GetSystemMenu(FMDIChildHandle, False));
|
|
end;
|
|
|
|
procedure TSystemMenuSubItem.DirectClick;
|
|
begin
|
|
BuildMenu;
|
|
inherited;
|
|
end;
|
|
|
|
{ TSystemMenuSubItemControl }
|
|
|
|
type
|
|
TSystemMenuSubItemControl = class(TdxBarSubItemControl)
|
|
private
|
|
function GetItem: TSystemMenuSubItem;
|
|
protected
|
|
function CanCustomize: Boolean; override;
|
|
function CanSelect: Boolean; override;
|
|
procedure DblClick; override;
|
|
function HasShadow: Boolean; override;
|
|
function GetHeight: Integer; override;
|
|
function GetWidth: Integer; override;
|
|
function IsExpandable: Boolean; override;
|
|
procedure Paint(ARect: TRect; PaintType: TdxBarPaintType); override;
|
|
function WantsDblClick: Boolean; override;
|
|
public
|
|
property Item: TSystemMenuSubItem read GetItem;
|
|
end;
|
|
|
|
function TSystemMenuSubItemControl.GetItem: TSystemMenuSubItem;
|
|
begin
|
|
Result := TSystemMenuSubItem(ItemLink.Item);
|
|
end;
|
|
|
|
function TSystemMenuSubItemControl.CanCustomize: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TSystemMenuSubItemControl.CanSelect: Boolean;
|
|
begin
|
|
Result := not BarManager.IsCustomizing;
|
|
end;
|
|
|
|
procedure TSystemMenuSubItemControl.DblClick;
|
|
begin
|
|
inherited;
|
|
Parent.HideAll;
|
|
with Item do
|
|
SendMessage(FMDIChildHandle, WM_SYSCOMMAND,
|
|
GetMenuDefaultItem(GetSystemMenu(FMDIChildHandle, False), 0, 0), 0);
|
|
end;
|
|
|
|
function TSystemMenuSubItemControl.HasShadow: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TSystemMenuSubItemControl.GetHeight: Integer;
|
|
begin
|
|
Result := GetSystemMetrics(SM_CYSMICON);
|
|
end;
|
|
|
|
function TSystemMenuSubItemControl.GetWidth: Integer;
|
|
begin
|
|
Result := GetSystemMetrics(SM_CXSMICON);
|
|
end;
|
|
|
|
function TSystemMenuSubItemControl.IsExpandable: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TSystemMenuSubItemControl.Paint(ARect: TRect; PaintType: TdxBarPaintType);
|
|
var
|
|
Icon: HIcon;
|
|
begin
|
|
Icon := Item.IconHandle;
|
|
with ARect do
|
|
begin
|
|
Parent.FillBackground(Parent.Canvas.Handle, ARect, Parent.BkBrush, clNone, True);
|
|
DrawIconEx(Parent.Canvas.Handle, Left, Top, Icon,
|
|
Right - Left, Bottom - Top, 0, 0{Parent.BkBrush}, DI_NORMAL);
|
|
end;
|
|
DestroyIcon(Icon);
|
|
end;
|
|
|
|
function TSystemMenuSubItemControl.WantsDblClick: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
{ continuation }
|
|
|
|
function TdxBarManager.ActiveMDIChild: HWND;
|
|
begin
|
|
Result := SendMessage(TDummyForm(FMainForm).ClientHandle, WM_MDIGETACTIVE, 0, 0);
|
|
end;
|
|
|
|
procedure TdxBarManager.MainFormClientWndProc(Msg: UINT; wParam: WPARAM; lParam: LPARAM);
|
|
var
|
|
AActiveMDIChild: HWND;
|
|
PrevIsMDIMaximized: Boolean;
|
|
PrevLockUpdate: Boolean;
|
|
|
|
procedure RefreshMainMenu(AWnd: HWND; AddItems, OnlySystemMenu, LeaveUpdateLocked: Boolean);
|
|
var
|
|
AForm: TWinControl;
|
|
ABarManager: TdxBarManager;
|
|
I: Integer;
|
|
AItemLink: TdxBarItemLink;
|
|
|
|
procedure CreateMDIChildSystemMenu(AWnd: HWND);
|
|
var
|
|
SystemMenuSubItem: TSystemMenuSubItem;
|
|
begin
|
|
if GetSystemMenu(AWnd, False) = 0 then Exit;
|
|
MainMenuBar.LockUpdate := True;
|
|
ClearInternalItemList;
|
|
SystemMenuSubItem := TSystemMenuSubItem.Create(FMainForm);
|
|
InternalItemList.Add(SystemMenuSubItem);
|
|
SystemMenuSubItem.MDIChildHandle := AWnd;
|
|
with MainMenuBar.ItemLinks.Add do
|
|
begin
|
|
Item := SystemMenuSubItem;
|
|
Index := 0;
|
|
end;
|
|
end;
|
|
|
|
procedure DestroyMDIChildSystemMenu;
|
|
begin
|
|
if (MainMenuBar.ItemLinks.Count <> 0) and
|
|
(MainMenuBar.ItemLinks[0].Item is TSystemMenuSubItem) then
|
|
begin
|
|
MainMenuBar.LockUpdate := True;
|
|
MainMenuBar.ItemLinks[0].Free;
|
|
ClearInternalItemList;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
PrevBoundsRect: TRect;
|
|
|
|
procedure SetRightWindowRect;
|
|
var
|
|
AHandle: HWND;
|
|
R: TRect;
|
|
begin
|
|
with TDummyForm(ABarManager.MainForm) do
|
|
if HandleAllocated then
|
|
begin
|
|
AHandle := Handle;
|
|
PrevBoundsRect := BoundsRect;
|
|
GetWindowRect(AHandle, R);
|
|
MapWindowPoints(0, GetParent(AHandle), R, 2);
|
|
WindowHandle := 0;
|
|
BoundsRect := R;
|
|
WindowHandle := AHandle;
|
|
end;
|
|
end;
|
|
|
|
procedure RestoreOriginalWindowRect;
|
|
var
|
|
AHandle: HWND;
|
|
begin
|
|
with TDummyForm(ABarManager.MainForm) do
|
|
if HandleAllocated then
|
|
begin
|
|
AHandle := Handle;
|
|
WindowHandle := 0;
|
|
BoundsRect := PrevBoundsRect;
|
|
WindowHandle := AHandle;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
AForm := FindControl(AWnd);
|
|
if (MainMenuBar = nil) or (AForm = nil) then Exit;
|
|
|
|
if AddItems and IsZoomed(AWnd) then
|
|
CreateMDIChildSystemMenu(AWnd)
|
|
else
|
|
if not AddItems then
|
|
DestroyMDIChildSystemMenu;
|
|
if OnlySystemMenu then Exit;
|
|
|
|
with TDummyForm(FMainForm) do
|
|
begin
|
|
ABarManager := GetBarManagerByForm(TCustomForm(AForm));
|
|
if (ABarManager = nil) or (ABarManager.MainMenuBar = nil) then Exit;
|
|
|
|
if AddItems and (FAlwaysMerge or IsZoomed(AWnd)) then
|
|
begin
|
|
FPrevChildMainMenuVisible := ABarManager.MainMenuBar.Visible;
|
|
if Assigned(FOnMenuMerge) then
|
|
FOnMenuMerge(Self, ABarManager, True)
|
|
else
|
|
begin
|
|
MainMenuBar.LockUpdate := True;
|
|
for I := 0 to ABarManager.MainMenuBar.ItemLinks.CanVisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := MainMenuBar.ItemLinks.Add;
|
|
AItemLink.Assign(ABarManager.MainMenuBar.ItemLinks.CanVisibleItems[I]); // ****
|
|
end;
|
|
MainMenuBar.LockUpdate := PrevLockUpdate;
|
|
end;
|
|
SetRightWindowRect;
|
|
ABarManager.MainMenuBar.Visible := False;
|
|
RestoreOriginalWindowRect;
|
|
end;
|
|
if not AddItems then
|
|
begin
|
|
MainMenuBar.LockUpdate := True;
|
|
for I := MainMenuBar.ItemLinks.CanVisibleItemCount - 1 downto 0 do
|
|
begin
|
|
AItemLink := MainMenuBar.ItemLinks.CanVisibleItems[I];
|
|
if AItemLink.Item.BarManager = ABarManager then AItemLink.Free; // ***
|
|
end;
|
|
if not LeaveUpdateLocked then
|
|
MainMenuBar.LockUpdate := PrevLockUpdate;
|
|
if Assigned(FOnMenuMerge) then
|
|
FOnMenuMerge(Self, ABarManager, False);
|
|
SetRightWindowRect;
|
|
if not FAlwaysMerge and not ABarManager.MainMenuBar.Visible then
|
|
ABarManager.MainMenuBar.Visible := FPrevChildMainMenuVisible;
|
|
RestoreOriginalWindowRect;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
AActiveMDIChild := ActiveMDIChild;
|
|
PrevIsMDIMaximized := IsMDIMaximized;
|
|
IsMDIMaximized := (AActiveMDIChild <> 0) and IsZoomed(AActiveMDIChild);
|
|
|
|
if MainMenuBar <> nil then
|
|
PrevLockUpdate := MainMenuBar.LockUpdate
|
|
else
|
|
PrevLockUpdate := False;
|
|
try
|
|
if AActiveMDIChild <> FPrevActiveMDIChild then
|
|
begin
|
|
RefreshMainMenu(FPrevActiveMDIChild, False, False, True);
|
|
RefreshMainMenu(AActiveMDIChild, True, False, False);
|
|
end
|
|
else
|
|
if IsMDIMaximized <> PrevIsMDIMaximized then
|
|
RefreshMainMenu(AActiveMDIChild, IsMDIMaximized, FAlwaysMerge, False);
|
|
finally
|
|
if MainMenuBar <> nil then
|
|
MainMenuBar.LockUpdate := PrevLockUpdate;
|
|
end;
|
|
|
|
if (IsMDIMaximized <> PrevIsMDIMaximized) and (MainMenuControl <> nil) then
|
|
MainMenuControl.RepaintBar;
|
|
FPrevActiveMDIChild := AActiveMDIChild;
|
|
end;
|
|
|
|
procedure TdxBarManager.MainFormWndProc(Msg: UINT; wParam: WPARAM; lParam: LPARAM);
|
|
var
|
|
AControl: TWinControl;
|
|
P: TPoint;
|
|
AItem: TdxBarItemControl;
|
|
ContextID: Integer;
|
|
I: Integer;
|
|
|
|
procedure ActivateToolbars(Activate, ForceHiding: Boolean; ActiveWindow: HWND);
|
|
begin
|
|
FMainFormActive := Activate;
|
|
ShowToolbars(Activate, ForceHiding, ActiveWindow);
|
|
end;
|
|
|
|
begin
|
|
if (csDestroying in FMainForm.ComponentState) or (FMainForm = dxBarCustomizingForm) then
|
|
begin
|
|
if (Msg = WM_DESTROY) and not FDesigning then
|
|
begin
|
|
if FStoreInRegistry then SaveToRegistry(FRegistryPath);
|
|
if FStoreInIniFile then SaveToIniFile(FIniFileName);
|
|
end;
|
|
Exit;
|
|
end;
|
|
|
|
case Msg of
|
|
WM_ACTIVATE:
|
|
begin
|
|
if (LOWORD(wParam) = WA_INACTIVE) and (FindControl(lParam) is TCustomdxBarControl) then
|
|
with TCustomdxBarControl(FindControl(lParam)) do
|
|
if (BarManager = Self) {and IsActive}{for control containers} then Exit;
|
|
FMainFormActive := LOWORD(wParam) <> WA_INACTIVE;
|
|
// if (LOWORD(wParam) <> WA_INACTIVE) and not IsWindowVisible(MainForm.Handle) then Exit;
|
|
ActivateToolbars(FMainFormActive, False, lParam);
|
|
|
|
// notify MDI Forms
|
|
if (TDummyForm(MainForm).ActiveMDIChild <> nil) and
|
|
(GetBarManagerByForm(TDummyForm(MainForm).ActiveMDIChild) <> nil) then
|
|
GetBarManagerByForm(TDummyForm(MainForm).ActiveMDIChild).MainFormWndProc(Msg, wParam, lParam);
|
|
|
|
if not FToolbarsVisibleChanging and FMainFormActive and
|
|
(dxBarCustomizingForm <> nil) and FIsCustomizing and
|
|
not IsWindowEnabled(MainForm.Handle) then
|
|
SendMessage(dxBarCustomizingForm.Handle, Msg, wParam, MainForm.Handle);
|
|
end;
|
|
|
|
WM_ACTIVATEAPP:
|
|
if wParam = 0 then
|
|
begin
|
|
// notify MDI Forms
|
|
if (TDummyForm(MainForm).ActiveMDIChild <> nil) and
|
|
(GetBarManagerByForm(TDummyForm(MainForm).ActiveMDIChild) <> nil) then
|
|
GetBarManagerByForm(TDummyForm(MainForm).ActiveMDIChild).MainFormWndProc(Msg, wParam, lParam);
|
|
|
|
ActivateToolbars(False, False, 0);
|
|
if SelectedItem <> nil then
|
|
SendMessage(SelectedItem.Parent.Handle, WM_MOUSELEAVE, 0, 0);
|
|
SelectedItem := nil;
|
|
end;
|
|
|
|
WM_CHILDACTIVATE:
|
|
ActivateToolbars(True, False, 0);
|
|
|
|
WM_CREATE:
|
|
if BarRestoringListExists then
|
|
begin
|
|
FIsHandleCreating := True;
|
|
try
|
|
for I := 0 to DockControlCount - 1 do
|
|
if CanAllocateHandle(DockControls[I]) then // for BarDockControl
|
|
DockControls[I].HandleNeeded;
|
|
ShowBarsFromRestoringList(nil);
|
|
finally
|
|
if RestoringListBarCount = 0 then // for BarDockControl
|
|
DestroyBarRestoringList;
|
|
FIsHandleCreating := False;
|
|
end;
|
|
end;
|
|
|
|
WM_DISPLAYCHANGE: CheckToolbarsVisibility;
|
|
|
|
WM_HELP:
|
|
if not FDesigning then
|
|
with PHelpInfo(lParam)^ do
|
|
if iContextType = HELPINFO_WINDOW then
|
|
begin
|
|
AItem := nil;
|
|
if ActiveBarControl <> nil then
|
|
begin
|
|
AControl := ActiveBarControl;
|
|
AItem := TCustomdxBarControl(AControl).SelectedItem;
|
|
if (AItem = nil) or (AItem.Item.HelpContext = 0) then
|
|
begin
|
|
while TCustomdxBarControl(AControl).ParentBar <> nil do
|
|
begin
|
|
AItem := TdxBarSubMenuControl(AControl).FSubItem;
|
|
AControl := TCustomdxBarControl(AControl).ParentBar;
|
|
if AItem.Item.HelpContext <> 0 then Break;
|
|
end;
|
|
if (AItem = nil) or (AItem.Item.HelpContext = 0) then
|
|
begin
|
|
HideAll;
|
|
ContextID := AControl.HelpContext;
|
|
if ContextID <> 0 then
|
|
if biHelp in TDummyForm(FMainForm).BorderIcons then
|
|
Application.HelpCommand(HELP_CONTEXTPOPUP, ContextID)
|
|
else
|
|
Application.HelpContext(ContextID);
|
|
Exit;
|
|
end;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
AControl := FindControl(hItemHandle);
|
|
if AControl is TCustomdxBarControl then
|
|
begin
|
|
P := MousePos;
|
|
ScreenToClient(AControl.Handle, P);
|
|
AItem := TCustomdxBarControl(AControl).ItemAtPos(P);
|
|
end;
|
|
end;
|
|
if AItem <> nil then
|
|
begin
|
|
with AItem.ItemLink.ItemRect do P := Point((Left + Right) div 2, Bottom);
|
|
ClientToScreen(AControl.Handle, P);
|
|
ContextID := AItem.Item.HelpContext;
|
|
HideAll;
|
|
if ContextID = 0 then Exit;
|
|
if biHelp in TDummyForm(FMainForm).BorderIcons then
|
|
begin
|
|
Application.HelpCommand(HELP_SETPOPUP_POS, Longint(PointToSmallPoint(P)));
|
|
Application.HelpCommand(HELP_CONTEXTPOPUP, ContextID);
|
|
end
|
|
else
|
|
Application.HelpContext(ContextID);
|
|
end;
|
|
end;
|
|
|
|
WM_MDIACTIVATE:
|
|
if TDummyForm(MainForm).FormStyle = fsMDIChild then
|
|
ActivateToolbars(HWND(lParam) = MainForm.Handle, False, 0);
|
|
|
|
{WM_NCACTIVATE: - does not allow submenu.edit.setfocus
|
|
if TDummyForm(MainForm).FormStyle = fsMDIChild then
|
|
ActivateToolbars(Boolean(wParam), False, 0);}
|
|
|
|
WM_SETTINGCHANGE:
|
|
case wParam of
|
|
SPI_SETNONCLIENTMETRICS: AssignFont;
|
|
SPI_SETWORKAREA: CheckToolbarsVisibility;
|
|
end;
|
|
|
|
WM_SYSCOLORCHANGE:
|
|
begin
|
|
RefreshDeviceConsts;
|
|
CreatePatternBrush;
|
|
RecreateToolbarsBrushes;
|
|
RefreshFloatingBarsShadows;
|
|
if TDummyForm(MainForm).FormStyle = fsMDIForm then
|
|
for I := 0 to dxBarManagerList.Count - 1 do
|
|
if TDummyForm(dxBarManagerList[I].MainForm).FormStyle = fsMDIChild then
|
|
dxBarManagerList[I].MainFormWndProc(MSg, wParam, lParam);
|
|
end;
|
|
|
|
WM_SYSCOMMAND:
|
|
begin
|
|
if (wParam = SC_CLOSE) and FDesigning and
|
|
(ActiveBarControl <> nil) and (ActiveBarControl.BarManager = Self) then
|
|
ActiveBarControl.HideAll;
|
|
if (wParam = SC_MINIMIZE) or (wParam = SC_MAXIMIZE) or
|
|
(wParam = SC_RESTORE) or (wParam = SC_CLOSE) then
|
|
begin
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
if Visible and (Control <> nil) and (DockingStyle = dsNone) then
|
|
with Control do
|
|
if (wParam = SC_MINIMIZE) or (wParam = SC_CLOSE) then
|
|
ShowWindow(Handle, SW_HIDE)
|
|
else
|
|
begin
|
|
ShowWindow(Handle, SW_SHOWNOACTIVATE);
|
|
UpdateWindow(Handle);
|
|
end;
|
|
//if IsWindowVisible(MainForm.Handle) then ProcessPaintMessages;
|
|
end;
|
|
end;
|
|
|
|
WM_WINDOWPOSCHANGED:
|
|
if FIsCustomizing and (dxBarCustomizingForm <> nil) then
|
|
begin
|
|
dxBarCustomizingForm.UpdateVisibility(PWindowPos(lParam)^);
|
|
if dxBarSubMenuEditor <> nil then
|
|
if PWindowPos(lParam)^.flags and SWP_SHOWWINDOW <> 0 then
|
|
ShowWindow(dxBarSubMenuEditor.Handle, SW_SHOWNA)
|
|
else
|
|
if PWindowPos(lParam)^.flags and SWP_HIDEWINDOW <> 0 then
|
|
ShowWindow(dxBarSubMenuEditor.Handle, SW_HIDE);
|
|
end;
|
|
|
|
WM_WINDOWPOSCHANGING:
|
|
if (PWindowPos(lParam)^.flags and SWP_HIDEWINDOW <> 0) and
|
|
(PWindowPos(lParam)^.hwnd = MainForm.Handle) then
|
|
ActivateToolbars(False, True, 0);
|
|
end;
|
|
end;
|
|
|
|
function TdxBarManager.LoadMainFormFromBin: TForm;
|
|
var
|
|
HInstance: HINST;
|
|
ResName, S: string;
|
|
HResource: THandle;
|
|
PrevCursor: TCursor;
|
|
ResStream: TResourceStream;
|
|
OutStream, BinStream: TMemoryStream;
|
|
StrList, OutStrList: TStringList;
|
|
I, J: Integer;
|
|
TempBarManager: TdxBarManager;
|
|
begin
|
|
Result := nil;
|
|
|
|
HInstance := FindResourceHInstance(FindClassHInstance(MainForm.ClassType));
|
|
ResName := MainForm.ClassName;
|
|
HResource := FindResource(HInstance, PChar(ResName), RT_RCDATA);
|
|
if HResource = 0 then Exit;
|
|
|
|
PrevCursor := Screen.Cursor;
|
|
Screen.Cursor := crHourglass;
|
|
ResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
|
|
OutStream := TMemoryStream.Create;
|
|
BinStream := TMemoryStream.Create;
|
|
try
|
|
ObjectBinaryToText(ResStream, OutStream);
|
|
OutStream.Position := 0;
|
|
StrList := TStringList.Create;
|
|
try
|
|
StrList.LoadFromStream(OutStream);
|
|
|
|
OutStrList := TStringList.Create;
|
|
try
|
|
// add Width, Height, ClientWidth, ClientHeight values
|
|
J := 0;
|
|
for I := 1 to StrList.Count - 1 do
|
|
begin
|
|
S := StrList[I];
|
|
if (Copy(S, 3, 7) = 'Width =') or
|
|
(Copy(S, 3, 8) = 'Height =') or
|
|
(Copy(S, 3, 13) = 'ClientWidth =') or
|
|
(Copy(S, 3, 14) = 'ClientHeight =') then
|
|
begin
|
|
OutStrList.Add(StrList[I]);
|
|
Inc(J);
|
|
if J = 2 then Break;
|
|
end;
|
|
end;
|
|
|
|
S := 'object ' + Name + ': ' + ClassName;
|
|
for I := 5 to StrList.Count - 1 do
|
|
if Trim(StrList[I]) = S then
|
|
begin
|
|
S := Copy(StrList[I], 1, Pos('o', StrList[I]) - 1) + 'end';
|
|
for J := I to StrList.Count - 1 do
|
|
begin
|
|
if Copy(TrimLeft(StrList[J]), 1, 2) <> 'On' then
|
|
OutStrList.Add(StrList[J]);
|
|
if StrList[J] = S then Break;
|
|
end;
|
|
OutStrList.Insert(0, 'object TempForm: TdxBarTempForm');
|
|
OutStrList.Add('end');
|
|
|
|
OutStream.Clear;
|
|
OutStrList.SaveToStream(OutStream);
|
|
OutStream.Position := 0;
|
|
ObjectTextToBinary(OutStream, BinStream);
|
|
BinStream.Position := 0;
|
|
Result := TForm.Create(nil);
|
|
try
|
|
RegisterClass(TPersistentClass(ClassType));
|
|
InternalLoading := True;
|
|
try
|
|
BinStream.ReadComponent(Result);
|
|
finally
|
|
InternalLoading := False;
|
|
end;
|
|
UnregisterClass(TPersistentClass(ClassType));
|
|
except
|
|
Result.Free;
|
|
Result := nil;
|
|
raise;
|
|
end;
|
|
Break;
|
|
end;
|
|
finally
|
|
OutStrList.Free;
|
|
end;
|
|
finally
|
|
StrList.Free;
|
|
end;
|
|
finally
|
|
BinStream.Free;
|
|
OutStream.Free;
|
|
ResStream.Free;
|
|
Screen.Cursor := PrevCursor;
|
|
end;
|
|
if Result <> nil then
|
|
begin
|
|
TempBarManager := TdxBarManager(Result.FindComponent(Name));
|
|
if TempBarManager <> nil then
|
|
begin
|
|
TempBarManager.StoreInIniFile := False;
|
|
TempBarManager.StoreInRegistry := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.CheckToolbarsVisibility;
|
|
var
|
|
WorkArea, R: TRect;
|
|
I: Integer;
|
|
begin
|
|
with FMainForm do
|
|
WorkArea := GetWorkArea(Point(Left + Width div 2, Top + Height div 2));
|
|
for I := 0 to FBars.Count - 1 do
|
|
with FBars[I] do
|
|
if DockingStyle = dsNone then
|
|
begin
|
|
if Control = nil then
|
|
R := Bounds(FloatLeft, FloatTop,
|
|
BarNCSizeX(dsNone) + FloatClientWidth, BarNCSizeY(dsNone) + FloatClientHeight)
|
|
else
|
|
R := Control.BoundsRect;
|
|
with WorkArea do
|
|
begin
|
|
if R.Bottom > Bottom then OffsetRect(R, 0, Bottom - R.Bottom);
|
|
if R.Top < Top then OffsetRect(R, 0, Top - R.Top);
|
|
if R.Right > Right then OffsetRect(R, Right - R.Right, 0);
|
|
if R.Left < Left then OffsetRect(R, Left - R.Left, 0);
|
|
end;
|
|
if Control = nil then
|
|
begin
|
|
FloatLeft := R.Left;
|
|
FloatTop := R.Top;
|
|
end
|
|
else
|
|
Control.BoundsRect := R;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
HintTimerABarManager: TdxBarManager;
|
|
|
|
procedure ShowHintTimerProc(Wnd: HWnd; Msg, TimerID, SysTime: Longint); stdcall;
|
|
begin
|
|
if (HintTimerABarManager <> nil) and
|
|
not HintTimerABarManager.IsDestroying then
|
|
with HintTimerABarManager do
|
|
begin
|
|
KillHintTimer;
|
|
DisplayHint;
|
|
end;
|
|
end;
|
|
|
|
procedure HideHintTimerProc(Wnd: HWnd; Msg, TimerID, SysTime: Longint); stdcall;
|
|
begin
|
|
if (HintTimerABarManager <> nil) and
|
|
not HintTimerABarManager.IsDestroying then
|
|
with HintTimerABarManager do
|
|
begin
|
|
KillHintTimer;
|
|
HintActivate(False, '');
|
|
end;
|
|
end;
|
|
|
|
procedure KillHiddenHintTimerProc(Wnd: HWnd; Msg, TimerID, SysTime: Longint); stdcall;
|
|
begin
|
|
KillHiddenHintTimer;
|
|
end;
|
|
|
|
procedure TdxBarManager.DisplayHint;
|
|
var
|
|
P: TPoint;
|
|
S, S1: string;
|
|
Action: TBasicAction;
|
|
begin
|
|
if (SelectedItem <> nil) and (SelectedItem.Parent <> nil) and
|
|
not SelectedItem.Parent.IsActive or (FCustomHint <> '') then
|
|
begin
|
|
GetCursorPos(P);
|
|
if FCustomHint = '' then
|
|
with SelectedItem.Parent do
|
|
if ItemAtPos(ScreenToClient(P)) <> Self.SelectedItem then Exit;
|
|
Inc(P.Y, HintOffset);
|
|
if FCustomHint = '' then
|
|
begin
|
|
S := GetShortHint(SelectedItem.Hint);
|
|
Action := SelectedItem.Item.Action;
|
|
if Action is TCustomAction then
|
|
if not TCustomAction(Action).DoHint(S) then
|
|
begin
|
|
HintActivate(False, '');
|
|
Exit;
|
|
end;
|
|
end
|
|
else S := FCustomHint;
|
|
if (S <> '') and
|
|
((FCustomHint <> '') or (SelectedItem.Enabled or ShowHintForDisabledItems)) then
|
|
begin
|
|
if (FCustomHint = '') and
|
|
(ShowShortCutInHint or Application.HintShortCuts) then
|
|
begin
|
|
S1 := ShortCutToText(SelectedItem.ShortCut);
|
|
if S1 <> '' then S := S + ' (' + S1 + ')';
|
|
end;
|
|
FHintWindow.ActivateHint(P, S, Self);
|
|
FHintWindowShowing := True;
|
|
HintTimerABarManager := Self;
|
|
FHintTimerID := SetTimer(0, 0, dxBarWaitForHideHintTime, @HideHintTimerProc);
|
|
end
|
|
else HintActivate(False, '');
|
|
end;
|
|
end;
|
|
|
|
var
|
|
FHintTimerPrevShow: Boolean; //***
|
|
|
|
procedure TdxBarManager.HintActivate(AShow: Boolean; const CustomHint: string);
|
|
var
|
|
PrevShow: Boolean;
|
|
begin
|
|
if IsCustomizing or not FShowHint or (not AShow and not FHintTimerPrevShow){***} then Exit;
|
|
FHintTimerPrevShow := AShow; //***
|
|
FCustomHint := CustomHint;
|
|
FHintWindowShowing := False;
|
|
PrevShow := AShow;
|
|
AShow := AShow and
|
|
((FSelectedItem <> nil) and not FSelectedItem.Parent.IsActive or (FCustomHint <> ''));
|
|
if AShow then
|
|
begin
|
|
KillHintTimer;
|
|
if not IsWindowVisible(FHintWindow.Handle) and not FLiveHiddenHint then
|
|
begin
|
|
HintTimerABarManager := Self;
|
|
FHintTimerID := SetTimer(0, 0, dxBarWaitForShowHintTime, @ShowHintTimerProc);
|
|
end
|
|
else DisplayHint;
|
|
end
|
|
else
|
|
begin
|
|
KillHintTimer;
|
|
if IsWindowVisible(FHintWindow.Handle) then
|
|
begin
|
|
ShowWindow(FHintWindow.Handle, SW_HIDE);
|
|
if PrevShow then
|
|
begin
|
|
KillHiddenHintTimer;
|
|
FLiveHiddenHint := True;
|
|
FHiddenHintTimerID := SetTimer(0, 0, dxBarHiddedHintLifeTime, @KillHiddenHintTimerProc);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.DestroyItems;
|
|
var
|
|
AItem: TdxBarItem;
|
|
begin
|
|
while FItems.Count > 0 do
|
|
begin
|
|
AItem := TdxBarItem(FItems.Last);
|
|
FItems.Remove(AItem);
|
|
AItem.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.HelpButtonGlyphChanged(Sender: TObject);
|
|
begin
|
|
UpdateHelpButton;
|
|
end;
|
|
|
|
procedure TdxBarManager.HotImageListChange(Sender: TObject);
|
|
begin
|
|
HotImagesChanged;
|
|
end;
|
|
|
|
procedure TdxBarManager.ImageListChange(Sender: TObject);
|
|
begin
|
|
if not IsLoading then ImagesChanged;
|
|
end;
|
|
|
|
procedure TdxBarManager.LargeIconsChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
CalcButtonsConsts;
|
|
DesignerModified;
|
|
UpdateBarManagerOptions;
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
if Control <> nil then Control.RepaintBar;
|
|
end;
|
|
|
|
procedure TdxBarManager.LargeImageListChange(Sender: TObject);
|
|
begin
|
|
LargeImagesChanged;
|
|
end;
|
|
|
|
procedure TdxBarManager.DisabledImageListChange(Sender: TObject);
|
|
begin
|
|
DisabledImagesChanged;
|
|
end;
|
|
|
|
procedure TdxBarManager.DisabledLargeImageListChange(Sender: TObject);
|
|
begin
|
|
DisabledLargeImagesChanged;
|
|
end;
|
|
|
|
procedure TdxBarManager.ToolbarsPopupClick(Sender: TObject);
|
|
begin
|
|
if TComponent(Sender).Tag = 1000 then Customizing(True)
|
|
else
|
|
with Bars[TComponent(Sender).Tag] do
|
|
Visible := not Visible;
|
|
end;
|
|
|
|
procedure TdxBarManager.CalcMostRecentlyUsedUseCount;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FMostRecentItemsPercents = 100 then FMostRecentlyUsedUseCount := 0
|
|
else
|
|
for I := 1 to MaxInt do
|
|
if I * (100 - FMostRecentItemsPercents) div 100 > 0 then
|
|
begin
|
|
FMostRecentlyUsedUseCount := I;
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarManager.ShowRecentItemsFirst: Boolean;
|
|
begin
|
|
Result := CanShowRecentItems and MenusShowRecentItemsFirst;
|
|
end;
|
|
|
|
procedure TdxBarManager.AddDockControl(ADockControl: TdxDockControl);
|
|
begin
|
|
FDockControls.Add(ADockControl);
|
|
FreeNotification(ADockControl);
|
|
end;
|
|
|
|
procedure TdxBarManager.RemoveDockControl(ADockControl: TdxDockControl);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FBars <> nil then
|
|
for I := 0 to FBars.Count - 1 do
|
|
with FBars[I] do
|
|
begin
|
|
if DockControl = ADockControl then DockControl := nil;
|
|
if DockedDockControl = ADockControl then DockedDockControl := nil;
|
|
if RealDockControl = ADockControl then Visible := False;
|
|
end;
|
|
if FDockControls <> nil then FDockControls.Remove(ADockControl);
|
|
if ADockControl.Main and (FBars <> nil) then
|
|
FBars.FDockControls[ADockControl.FDockingStyle] := nil;
|
|
ADockControl.ParentColor := True;
|
|
end;
|
|
|
|
procedure TdxBarManager.AddGroup(AGroup: TdxBarGroup);
|
|
begin
|
|
FGroups.Add(AGroup);
|
|
AGroup.FBarManager := Self;
|
|
end;
|
|
|
|
procedure TdxBarManager.RemoveGroup(AGroup: TdxBarGroup);
|
|
begin
|
|
FGroups.Remove(AGroup);
|
|
end;
|
|
|
|
function TdxBarManager.IsDockColorStored: Boolean;
|
|
begin
|
|
Result := not FAutoDockColor;
|
|
end;
|
|
|
|
procedure TdxBarManager.ReadDockControlHeights(Reader: TReader);
|
|
begin
|
|
with Reader, FBars do
|
|
begin
|
|
ReadListBegin;
|
|
try
|
|
FDockControls[dsLeft].Width := ReadInteger;
|
|
FDockControls[dsRight].Width := ReadInteger;
|
|
FDockControls[dsTop].Height := ReadInteger;
|
|
FDockControls[dsBottom].Height := ReadInteger;
|
|
finally
|
|
ReadListEnd;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.WriteDockControlHeights(Writer: TWriter);
|
|
begin
|
|
with Writer, FBars do
|
|
begin
|
|
WriteListBegin;
|
|
try
|
|
WriteInteger(FDockControls[dsLeft].Width);
|
|
WriteInteger(FDockControls[dsRight].Width);
|
|
WriteInteger(FDockControls[dsTop].Height);
|
|
WriteInteger(FDockControls[dsBottom].Height);
|
|
finally
|
|
WriteListEnd;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.CreateFlatToolbarsBrushes;
|
|
begin
|
|
DestroyFlatToolbarsBrushes;
|
|
FFlatToolbarsBorderBrush := CreateSolidBrush(FlatToolbarsBorderColor);
|
|
FFlatToolbarsBrush := CreateSolidBrush(FlatToolbarsColor);
|
|
FFlatToolbarsDownedBrush := CreateSolidBrush(FlatToolbarsDownedColor);
|
|
FFlatToolbarsDownedSelBrush := CreateSolidBrush(FlatToolbarsDownedSelColor);
|
|
FFlatToolbarsSelBrush := CreateSolidBrush(FlatToolbarsSelColor);
|
|
end;
|
|
|
|
procedure TdxBarManager.DestroyFlatToolbarsBrushes;
|
|
begin
|
|
if FFlatToolbarsSelBrush <> 0 then DeleteObject(FFlatToolbarsSelBrush);
|
|
if FFlatToolbarsDownedSelBrush <> 0 then DeleteObject(FFlatToolbarsDownedSelBrush);
|
|
if FFlatToolbarsDownedBrush <> 0 then DeleteObject(FFlatToolbarsDownedBrush);
|
|
if FFlatToolbarsBrush <> 0 then DeleteObject(FFlatToolbarsBrush);
|
|
if FFlatToolbarsBorderBrush <> 0 then DeleteObject(FFlatToolbarsBorderBrush);
|
|
end;
|
|
|
|
procedure TdxBarManager.CreateThemeToolbarsBrushes;
|
|
begin
|
|
DestroyThemeToolbarsBrushes;
|
|
if FThemeAvailable then
|
|
begin
|
|
FThemeToolbarsBrush := CreateSolidBrush(ThemeToolbarColor);
|
|
// FThemeToolbarsDownedBrush := CreateSolidBrush();
|
|
// FThemeToolbarsDownedSelBrush := CreateSolidBrush();
|
|
// FThemeToolbarsSelBrush := CreateSolidBrush();
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.DestroyThemeToolbarsBrushes;
|
|
begin
|
|
// if FThemeToolbarsSelBrush <> 0 then DeleteObject(FThemeToolbarsSelBrush);
|
|
// if FThemeToolbarsDownedSelBrush <> 0 then DeleteObject(FThemeToolbarsDownedSelBrush);
|
|
// if FThemeToolbarsDownedBrush <> 0 then DeleteObject(FThemeToolbarsDownedBrush);
|
|
if FThemeToolbarsBrush <> 0 then DeleteObject(FThemeToolbarsBrush);
|
|
end;
|
|
|
|
procedure TdxBarManager.DestroyToolbarsBrushes;
|
|
begin
|
|
DestroyThemeToolbarsBrushes;
|
|
DestroyFlatToolbarsBrushes;
|
|
ReleaseOffice11Colors;
|
|
end;
|
|
|
|
procedure TdxBarManager.CreateToolbarsBrushes;
|
|
begin
|
|
CreateFlatToolbarsBrushes;
|
|
CreateThemeToolbarsBrushes;
|
|
CreateOffice11Colors;
|
|
ResetBackgrounds;
|
|
end;
|
|
|
|
procedure TdxBarManager.RecreateToolbarsBrushes;
|
|
begin
|
|
CreateFlatToolbarsBrushes;
|
|
CreateThemeToolbarsBrushes;
|
|
RefreshOffice11Colors;
|
|
ResetBackgrounds;
|
|
end;
|
|
|
|
procedure TdxBarManager.RefreshFloatingBarsShadows;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Bars.Count - 1 do
|
|
if (Bars[I].DockingStyle = dsNone) and (Bars[I].Control <> nil) then
|
|
Bars[I].Control.RefreshShadow;
|
|
end;
|
|
|
|
procedure TdxBarManager.ResetBackgrounds;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to DockControlCount - 1 do
|
|
begin
|
|
// DockControls[I].ResetBackground;
|
|
DockControls[I].BarManagerChanged;
|
|
DockControls[I].UpdateDoubleBuffered;
|
|
DockControls[I].Invalidate;
|
|
end;
|
|
for I := 0 to Bars.Count - 1 do
|
|
if Bars[I].Control <> nil then
|
|
begin
|
|
Bars[I].Control.ResetBackground;
|
|
Bars[I].Control.UpdateDoubleBuffered;
|
|
Bars[I].Control.FullInvalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.InitPainterClass;
|
|
begin
|
|
FThemeAvailable := AreVisualStylesAvailable([totToolBar, totComboBox, totEdit,
|
|
totWindow, totScrollBar, totRebar, totStatus, totSpin, totProgress]);
|
|
FPainterClass := GetPainterClass;
|
|
end;
|
|
|
|
procedure TdxBarManager.InternalStyleChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
FChangingStyle := True;
|
|
try
|
|
InitPainterClass;
|
|
FBeforeFingersSize := PainterClass.BeforeFingersSize;
|
|
FFingersSize := PainterClass.FingersSize;
|
|
FSubMenuBeginGroupIndent := PainterClass.SubMenuBeginGroupIndent;
|
|
CalcButtonsConsts;
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
if Control <> nil then Control.BarManagerStyleChanged;
|
|
HostBarManagerStyleChanged;
|
|
ResetBackgrounds;
|
|
finally
|
|
FChangingStyle := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.ThemeChanged;
|
|
begin
|
|
InternalStyleChanged;
|
|
end;
|
|
|
|
procedure TdxBarManager.LFChanged(Sender: TcxLookAndFeel; AChangedValues: TcxLookAndFeelValues);
|
|
begin
|
|
if not IsDestroying then
|
|
InternalStyleChanged;
|
|
end;
|
|
|
|
procedure TdxBarManager.CreateBarRestoringList;
|
|
begin
|
|
if not BarRestoringListExists then
|
|
FBarRestoringList := TList.Create;
|
|
end;
|
|
|
|
procedure TdxBarManager.DestroyBarRestoringList;
|
|
begin
|
|
FreeAndNil(FBarRestoringList);
|
|
end;
|
|
|
|
function TdxBarManager.BarRestoringListExists: Boolean;
|
|
begin
|
|
Result := FBarRestoringList <> nil;
|
|
end;
|
|
|
|
procedure TdxBarManager.AddBarToRestoringList(ABar: TdxBar);
|
|
begin
|
|
if BarRestoringListExists and (FBarRestoringList.IndexOf(ABar) = -1) then
|
|
FBarRestoringList.Add(ABar);
|
|
end;
|
|
|
|
procedure TdxBarManager.RemoveBarFromRestoringList(ABar: TdxBar);
|
|
begin
|
|
if BarRestoringListExists then
|
|
FBarRestoringList.Remove(ABar);
|
|
end;
|
|
|
|
procedure TdxBarManager.ShowBarsFromRestoringList(ADockControl: TdxBarDockControl);
|
|
|
|
function CanShowBar(ABar: TdxBar): Boolean;
|
|
begin
|
|
if ADockControl = nil then
|
|
Result := (ABar.RealDockControl = nil) or ABar.RealDockControl.HandleAllocated
|
|
else
|
|
Result := (ABar.DockControl = ADockControl) and (ABar.DockingStyle <> dsNone);
|
|
end;
|
|
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := RestoringListBarCount - 1 downto 0 do
|
|
if CanShowBar(RestoringListBars[I]) then
|
|
RestoringListBars[I].Visible := True;
|
|
end;
|
|
|
|
procedure TdxBarManager.AssignFont;
|
|
var
|
|
NonClientMetrics: TNonClientMetrics;
|
|
begin
|
|
NonClientMetrics.cbSize := SizeOf(NonClientMetrics);
|
|
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0);
|
|
if FUseSystemFont then
|
|
begin
|
|
FInternalFontChange := True;
|
|
try
|
|
Font.Handle := CreateFontIndirect(NonClientMetrics.lfMenuFont);
|
|
finally
|
|
FInternalFontChange := False;
|
|
end;
|
|
end
|
|
else
|
|
if FScaled then
|
|
Font.Height := NonClientMetrics.lfMenuFont.lfHeight;
|
|
end;
|
|
|
|
function TdxBarManager.CanReset: Boolean;
|
|
begin
|
|
Result := (FReadStateCount = 1) and FAllowReset;
|
|
end;
|
|
|
|
procedure TdxBarManager.DefineProperties(Filer: TFiler);
|
|
begin
|
|
inherited;
|
|
Filer.DefineProperty('DockControlHeights', ReadDockControlHeights, WriteDockControlHeights, True);
|
|
end;
|
|
|
|
procedure TdxBarManager.DesignerModified;
|
|
|
|
function ImagesAreLoaded: Boolean;
|
|
|
|
function ComponentIsLoaded(AComponent: TComponent): Boolean;
|
|
begin
|
|
Result := (AComponent = nil) or not (csLoading in AComponent.ComponentState);
|
|
end;
|
|
|
|
begin
|
|
Result := ComponentIsLoaded(HotImages) and ComponentIsLoaded(Images) and
|
|
ComponentIsLoaded(LargeImages) and ComponentIsLoaded(DisabledImages) and
|
|
ComponentIsLoaded(DisabledLargeImages);
|
|
end;
|
|
|
|
begin
|
|
if not IsLoading and not IsDestroying and FCanModifyDesigner then
|
|
begin
|
|
FModified := True;
|
|
if Designing and not (csUpdating in ComponentState) and not FFirstDocksUpdate and
|
|
(FMainForm <> nil) and (FMainForm.Designer <> nil) and ImagesAreLoaded then
|
|
FMainForm.Designer.Modified;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.DoBarAfterReset(ABar: TdxBar);
|
|
begin
|
|
if Assigned(FOnBarAfterReset) then FOnBarAfterReset(Self, ABar);
|
|
end;
|
|
|
|
procedure TdxBarManager.DoBarBeforeReset(ABar: TdxBar);
|
|
begin
|
|
if Assigned(FOnBarBeforeReset) then FOnBarBeforeReset(Self, ABar);
|
|
end;
|
|
|
|
procedure TdxBarManager.DoBarClose(ABar: TdxBar);
|
|
begin
|
|
if Assigned(FOnBarClose) then FOnBarClose(Self, ABar);
|
|
end;
|
|
|
|
procedure TdxBarManager.DoBarDockingStyleChanged(ABar: TdxBar);
|
|
begin
|
|
if not FBars.FLoading then
|
|
begin
|
|
if Assigned(FOnBarDockingStyleChange) then
|
|
FOnBarDockingStyleChange(Self, ABar);
|
|
DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.DoClickItem(AItem: TdxBarItem);
|
|
begin
|
|
if Assigned(FOnClickItem) then FOnClickItem(Self, AItem);
|
|
end;
|
|
|
|
procedure TdxBarManager.DoCloseButtonClick;
|
|
begin
|
|
if Assigned(FOnCloseButtonClick) then FOnCloseButtonClick(Self);
|
|
end;
|
|
|
|
function TdxBarManager.DoDocking(ABar: TdxBar; AStyle: TdxBarDockingStyle;
|
|
ADockControl: TdxDockControl): Boolean;
|
|
begin
|
|
Result :=
|
|
not (AStyle in ABar.NotDocking) and
|
|
(((ADockControl = nil) or ADockControl.Main) and not (AStyle in NotDocking) or
|
|
(ADockControl <> nil) and not ADockControl.Main and ADockControl.CanDocking(ABar));
|
|
if Assigned(FOnDocking) then FOnDocking(ABar, AStyle, ADockControl, Result);
|
|
end;
|
|
|
|
procedure TdxBarManager.DoHelpButtonClick;
|
|
begin
|
|
if Assigned(FOnHelpButtonClick) then FOnHelpButtonClick(Self);
|
|
end;
|
|
|
|
procedure TdxBarManager.DoShowCustomizingPopup(PopupItemLinks: TdxBarItemLinks);
|
|
begin
|
|
if Assigned(FOnShowCustomizingPopup) then FOnShowCustomizingPopup(Self, PopupItemLinks);
|
|
end;
|
|
|
|
procedure TdxBarManager.DoShowToolbarsPopup(PopupItemLinks: TdxBarItemLinks);
|
|
begin
|
|
if Assigned(FOnShowToolbarsPopup) then FOnShowToolbarsPopup(Self, PopupItemLinks);
|
|
end;
|
|
|
|
procedure TdxBarManager.DragAndDrop(AItem: TdxBarItem; AItemLink: TdxBarItemLink);
|
|
var
|
|
PrevCursor: TCursor;
|
|
CaptureWnd, Wnd: HWND;
|
|
WasDragging, EndDrag, DragOverCategories,
|
|
FDragCopy, CopyModeChanged, FDragLineVisible,
|
|
IsFirstPart, IsBeginGroup, IsVerticalDirection,
|
|
FDragOverBeginGroup, FDragOverFirstPart, FDragOverVerticalDirection,
|
|
FSetBeginGroup, NeedRepaintBar: Boolean;
|
|
Msg: TMsg;
|
|
P, DragDownPoint: TPoint;
|
|
AControl: TWinControl;
|
|
ABarControl: TCustomdxBarControl;
|
|
R: TRect;
|
|
I: Integer;
|
|
ACursor: TCursor;
|
|
FDragOverItemControl, AItemControl: TdxBarItemControl;
|
|
AList: TList;
|
|
AItemLinks: TdxBarItemLinks;
|
|
|
|
function NeedDragLineVisible: Boolean;
|
|
begin
|
|
Result := FDragOverItemControl <> nil;
|
|
if Result then
|
|
with FDragOverItemControl, DraggingItemLink do
|
|
Result := not
|
|
((DraggingItemLink <> nil) and (GetAsyncKeyState(VK_CONTROL) >= 0) and
|
|
|
|
((ItemLink = DraggingItemLink) and
|
|
(not FDragOverBeginGroup or not FDragOverFirstPart) or
|
|
|
|
(VisibleIndex > 0) and
|
|
(ItemLink = Owner.VisibleItems[VisibleIndex - 1]) and
|
|
(not BeginGroup and not FDragOverBeginGroup and not FDragOverFirstPart) or
|
|
|
|
(VisibleIndex < Owner.VisibleItemCount - 1) and
|
|
(ItemLink = Owner.VisibleItems[VisibleIndex + 1]) and
|
|
((FDragOverBeginGroup and FDragOverFirstPart) or
|
|
(not ItemLink.BeginGroup and FDragOverFirstPart))));
|
|
end;
|
|
|
|
procedure DrawDraggingLine;
|
|
begin
|
|
if FDragOverItemControl <> nil then
|
|
begin
|
|
if not FDragLineVisible then
|
|
FDragOverItemControl.Parent.Update;
|
|
Self.DrawDraggingLine(FDragOverItemControl,
|
|
FDragOverBeginGroup, FDragOverFirstPart, FDragOverVerticalDirection);
|
|
FDragLineVisible := not FDragLineVisible;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
FDraggingItem := AItem;
|
|
FDraggingItemLink := AItemLink;
|
|
FDragging := True;
|
|
if FDraggingItemLink <> nil then
|
|
begin
|
|
GetCursorPos(DragDownPoint);
|
|
ScreenToClient(FDraggingItemLink.BarControl.Handle, DragDownPoint);
|
|
with FDraggingItemLink.ItemRect do
|
|
begin
|
|
Dec(DragDownPoint.X, Left);
|
|
Dec(DragDownPoint.Y, Top);
|
|
end;
|
|
end;
|
|
|
|
ABarControl := nil;
|
|
FDragOverItemControl := nil;
|
|
FDragOverBeginGroup := False;
|
|
FDragOverFirstPart := False;
|
|
FDragOverVerticalDirection := False;
|
|
WasDragging := False;
|
|
EndDrag := False;
|
|
DragOverCategories := False;
|
|
|
|
FDragCopy := GetAsyncKeyState(VK_CONTROL) < 0;
|
|
CopyModeChanged := False;
|
|
FDragLineVisible := False;
|
|
|
|
PrevCursor := Screen.Cursor;
|
|
CaptureWnd := GetWindowForMouseCapturing;
|
|
SetCapture(CaptureWnd);
|
|
try
|
|
while GetCapture = CaptureWnd do
|
|
begin
|
|
case Integer(GetMessage(Msg, 0, 0, 0)) of
|
|
-1: Break;
|
|
0: begin
|
|
PostQuitMessage(Msg.wParam);
|
|
Break;
|
|
end;
|
|
end;
|
|
with Msg do
|
|
if ((message = WM_KEYDOWN) or (message = WM_KEYUP)) and
|
|
(wParam = VK_CONTROL) then
|
|
begin
|
|
CopyModeChanged := FDragCopy <> (message = WM_KEYDOWN);
|
|
FDragCopy := message = WM_KEYDOWN;
|
|
message := WM_MOUSEMOVE;
|
|
end;
|
|
case Msg.message of
|
|
WM_KEYDOWN, WM_KEYUP:
|
|
if Msg.wParam = VK_ESCAPE then Break;
|
|
WM_MOUSEMOVE:
|
|
begin
|
|
WasDragging := True;
|
|
GetCursorPos(P); // don't change this line
|
|
ABarControl := nil;
|
|
|
|
Wnd := WindowFromPointEx(P);
|
|
AControl := FindControl(Wnd);
|
|
|
|
if (AControl is TCustomdxBarControl) and
|
|
(TCustomdxBarControl(AControl).BarManager <> Self) then
|
|
begin
|
|
Wnd := 0;
|
|
AControl := nil;
|
|
end;
|
|
|
|
if (dxBarCustomizingForm <> nil) and (DraggingItemLink = nil) and FDesigning then
|
|
with dxBarCustomizingForm.LCategories do
|
|
if AControl = dxBarCustomizingForm.LCategories then
|
|
begin
|
|
Windows.ScreenToClient(Handle, P);
|
|
I := ItemAtPos(P, True);
|
|
if (0 <= I) and (I <= Items.Count - 1) then
|
|
begin
|
|
ItemIndex := I;
|
|
ACursor := crdxBarDrag;
|
|
DragOverCategories := True;
|
|
end
|
|
else
|
|
begin
|
|
ItemIndex := DraggingItem.Category;
|
|
ACursor := crdxBarDragNoDrop;
|
|
DragOverCategories := False;
|
|
end;
|
|
SetCursor(Screen.Cursors[ACursor]);
|
|
Continue;
|
|
end
|
|
else
|
|
begin
|
|
ItemIndex := DraggingItem.Category;
|
|
DragOverCategories := False;
|
|
end;
|
|
|
|
if (dxBarSubMenuEditor <> nil) and (dxBarSubMenuEditor.Handle = Wnd) then
|
|
dxBarSubMenuEditor.Perform(CM_ACTIVATE, 0, 0)
|
|
else
|
|
if AControl is TCustomdxBarControl then
|
|
ABarControl := TCustomdxBarControl(AControl)
|
|
else
|
|
begin
|
|
if dxBarCustomizingForm <> nil then
|
|
GetWindowRect(dxBarCustomizingForm.Handle, R);
|
|
if (dxBarCustomizingForm = nil) or not PtInRect(R, P) then
|
|
for I := 0 to Bars.Count - 1 do
|
|
if (Bars[I].Control <> nil) and Bars[I].Control.WantMouse then
|
|
begin
|
|
ABarControl := Bars[I].Control;
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
if (ABarControl <> nil) and not ABarControl.CanCustomizing then
|
|
ABarControl := nil;
|
|
|
|
if ABarControl <> nil then
|
|
begin
|
|
ScreenToClient(ABarControl.Handle, P);
|
|
AItemControl :=
|
|
ABarControl.ItemAtPosEx(P, IsBeginGroup, IsFirstPart, IsVerticalDirection);
|
|
end
|
|
else
|
|
AItemControl := nil;
|
|
|
|
if (ABarControl = nil) or
|
|
(AItemControl = nil) and (ABarControl.ItemLinks.VisibleItemCount <> 0) then
|
|
ACursor := crdxBarDragNoDrop
|
|
else
|
|
if (GetAsyncKeyState(VK_CONTROL) < 0) or (FDraggingItemLink = nil) then
|
|
ACursor := crdxBarDragCopy
|
|
else
|
|
ACursor := crdxBarDrag;
|
|
SetCursor(Screen.Cursors[ACursor]);
|
|
|
|
if ABarControl = nil then
|
|
begin
|
|
if FDragLineVisible then DrawDraggingLine;
|
|
FDragOverItemControl := nil;
|
|
end
|
|
else
|
|
begin
|
|
if (not (ABarControl is TdxBarSubMenuControl) or
|
|
(TdxBarSubMenuControl(ABarControl).FScrollTimerID = 0)) and
|
|
((AItemControl <> FDragOverItemControl) or
|
|
(IsBeginGroup <> FDragOverBeginGroup) or
|
|
(IsFirstPart <> FDragOverFirstPart) or
|
|
(IsVerticalDirection <> FDragOverVerticalDirection) or
|
|
CopyModeChanged) then
|
|
begin
|
|
if not CopyModeChanged and NeedDragLineVisible or
|
|
CopyModeChanged and
|
|
((FDragCopy and not FDragLineVisible) or
|
|
(not FDragCopy and FDragLineVisible and not NeedDragLineVisible)) then
|
|
DrawDraggingLine;
|
|
if AItemControl <> FDragOverItemControl then
|
|
begin
|
|
if AItemControl <> nil then
|
|
if (AItemControl is TdxBarSubItemControl) or
|
|
(AItemControl.Parent.SelectedItem is TdxBarSubItemControl) then
|
|
AItemControl.Parent.SetMouseSelectedItem(AItemControl)
|
|
else
|
|
begin // for better painting
|
|
SelectedItem := AItemControl;
|
|
AItemControl.Parent.FSelectedItem := AItemControl;
|
|
end;
|
|
FDragOverItemControl := AItemControl;
|
|
end;
|
|
if (FDragOverItemControl <> nil) and not CopyModeChanged then
|
|
begin
|
|
FDragOverBeginGroup := IsBeginGroup;
|
|
FDragOverFirstPart := IsFirstPart;
|
|
FDragOverVerticalDirection := IsVerticalDirection;
|
|
if NeedDragLineVisible then DrawDraggingLine;
|
|
end;
|
|
CopyModeChanged := False;
|
|
end;
|
|
if ABarControl is TdxBarSubMenuControl then
|
|
begin
|
|
SendMessage(ABarControl.Handle, WM_MOUSEMOVE, 0, MakeLParam(P.X, P.Y));
|
|
if TdxBarSubMenuControl(ABarControl).FScrollTimerID > 0 then
|
|
begin
|
|
if FDragLineVisible then DrawDraggingLine;
|
|
FDragOverItemControl := nil;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
WM_LBUTTONUP:
|
|
begin
|
|
EndDrag := True;
|
|
Break;
|
|
end;
|
|
else
|
|
TranslateMessage(Msg);
|
|
DispatchMessage(Msg);
|
|
end;
|
|
end;
|
|
finally
|
|
if FDragLineVisible and (SelectedItem <> nil) and (SelectedItem = FDragOverItemControl) then
|
|
DrawDraggingLine;
|
|
if GetCapture = CaptureWnd then ReleaseCapture;
|
|
SetCursor(Screen.Cursors[PrevCursor]);
|
|
if FDraggingItemLinkParentHandle <> 0 then
|
|
begin
|
|
DestroyWindow(FDraggingItemLinkParentHandle);
|
|
FDraggingItemLinkParentHandle := 0;
|
|
end;
|
|
FDragging := False;
|
|
if EndDrag and WasDragging then
|
|
if DragOverCategories then
|
|
if (dxBarCustomizingForm <> nil) and
|
|
(DraggingItem.Category <> dxBarCustomizingForm.LCategories.ItemIndex) then
|
|
with dxBarCustomizingForm do // move item to another category
|
|
begin
|
|
AList := TList.Create;
|
|
GetAllItemsByCategory(LCategories.ItemIndex, AList);
|
|
if AList.Count > 0 then
|
|
begin
|
|
I := TdxBarItem(AList[AList.Count - 1]).Index + 1;
|
|
if I > ItemCount - 1 then Dec(I);
|
|
MoveItem(DraggingItem.Index, I);
|
|
end;
|
|
AList.Free;
|
|
DraggingItem.Category := LCategories.ItemIndex;
|
|
end
|
|
else
|
|
else
|
|
if ABarControl = nil then
|
|
begin
|
|
if (DraggingItemLink <> nil) and (GetAsyncKeyState(VK_CONTROL) >= 0) then
|
|
begin // delete dragging itemlink
|
|
DraggingItemLink.Free;
|
|
FDraggingItemLink := nil;
|
|
DesignerModified;
|
|
end;
|
|
if FSelectedItem <> nil then
|
|
begin
|
|
ABarControl := FSelectedItem.Parent;
|
|
FSelectedItem := nil;
|
|
ABarControl.RepaintBar;
|
|
end;
|
|
end
|
|
else
|
|
if ABarControl <> nil then
|
|
if (FDragOverItemControl <> nil) and (FDraggingItemLink <> nil) and
|
|
((FDragOverItemControl.ItemLink = FDraggingItemLink) or not NeedDragLineVisible) and
|
|
(GetAsyncKeyState(VK_CONTROL) >= 0) and
|
|
not (FDragOverBeginGroup and FDragOverFirstPart) then
|
|
begin // change BeginGroup only
|
|
GetCursorPos(P);
|
|
ScreenToClient(FDraggingItemLink.BarControl.Handle, P);
|
|
with FDraggingItemLink.ItemRect do
|
|
begin
|
|
Dec(P.X, Left);
|
|
Dec(P.Y, Top);
|
|
end;
|
|
if (ABarControl is TdxBarSubMenuControl) or IsRealVertical(ABarControl) then
|
|
I := P.Y - DragDownPoint.Y
|
|
else
|
|
I := P.X - DragDownPoint.X;
|
|
if Abs(I) >= MakeBeginGroupDragSize then
|
|
with FDraggingItemLink do
|
|
if BeginGroup <> (I > 0) then
|
|
begin
|
|
BarControl.FSelectedItem := Control;
|
|
FSelectedItem := Control;
|
|
BeginGroup := I > 0;
|
|
end
|
|
else
|
|
BarControl.SetKeySelectedItem(Control);
|
|
end
|
|
else // create new [and delete old] itemlink
|
|
if (FDragOverItemControl <> nil) or
|
|
PtInRect(ABarControl.ClientRect, P) and
|
|
(ABarControl.ItemLinks.VisibleItemCount = 0) then
|
|
with ABarControl.ItemLinks.Add do
|
|
begin
|
|
InternalBringToTopInRecentList(True);
|
|
AItemLinks := ABarControl.ItemLinks;
|
|
|
|
Item := FDraggingItem;
|
|
if DraggingItemLink <> nil then
|
|
begin
|
|
Assign(DraggingItemLink);
|
|
FBeginGroup := False;
|
|
end;
|
|
|
|
if FDragOverItemControl <> nil then
|
|
begin
|
|
FSetBeginGroup := FDragOverBeginGroup and not FDragOverFirstPart or
|
|
not FDragOverBeginGroup and FDragOverFirstPart and
|
|
FDragOverItemControl.ItemLink.BeginGroup;
|
|
Index := FDragOverItemControl.ItemLink.Index +
|
|
Byte(not FDragOverBeginGroup and not FDragOverFirstPart);
|
|
if FSetBeginGroup then
|
|
begin
|
|
BeginGroup := True;
|
|
with FDragOverItemControl do
|
|
begin
|
|
Parent.FDestroyFlag := True; // for RepaintBar
|
|
ItemLink.BeginGroup := False;
|
|
Parent.FDestroyFlag := False;
|
|
end;
|
|
end;
|
|
end;
|
|
CreateControl;
|
|
FSelectedItem := Control;
|
|
ABarControl.FSelectedItem := Control;
|
|
|
|
if (DraggingItemLink <> nil) and (GetAsyncKeyState(VK_CONTROL) >= 0) then
|
|
begin
|
|
NeedRepaintBar := DraggingItemLink.Owner <> AItemLinks;
|
|
DraggingItemLink.Free;
|
|
FDraggingItemLink := nil;
|
|
end
|
|
else NeedRepaintBar := True;
|
|
|
|
if NeedRepaintBar and (AItemLinks.BarControl <> nil) then
|
|
AItemLinks.BarControl.RepaintBar;
|
|
DesignerModified;
|
|
|
|
// activate barcontrol which contains new itemlink
|
|
if (ActiveBarControl <> nil) and (AItemLinks.BarControl is TdxBarControl) and
|
|
(ActiveBarControl <> AItemLinks.BarControl) then
|
|
begin
|
|
ActiveBarControl.HideAll;
|
|
if AItemLinks.BarControl <> nil then
|
|
TdxBarControl(AItemLinks.BarControl).BarGetFocus(Control);
|
|
end;
|
|
end
|
|
else
|
|
if SelectedItem <> nil then SelectedItem := nil;
|
|
FDraggingItem := nil;
|
|
if FDraggingItemLink <> nil then
|
|
if FDraggingItemLink.Control <> nil then
|
|
with FDraggingItemLink.Control do
|
|
begin
|
|
FDraggingItemLink := nil;
|
|
Repaint;
|
|
end
|
|
else FDraggingItemLink := nil;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarManager.FindDockControl(APath: string): TdxBarDockControl;
|
|
var
|
|
ARootName: string;
|
|
ARoot: TComponent;
|
|
begin
|
|
ARootName := Copy(APath, 1, Pos('.', APath) - 1);
|
|
if ARootName <> '' then
|
|
begin
|
|
ARoot := FindGlobalComponent(ARootName);
|
|
Delete(APath, 1, Length(ARootName) + 1);
|
|
end
|
|
else
|
|
ARoot := FMainForm;
|
|
{$IFDEF DELPHI5}
|
|
Result := FindNestedComponent(ARoot, APath) as TdxBarDockControl;
|
|
{$ELSE}
|
|
Result := ARoot.FindComponent(APath) as TdxBarDockControl;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
function TdxBarManager.GetCategoryRealIndex(AIndex: Integer): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FDesigning then Result := AIndex
|
|
else
|
|
begin
|
|
Result := -1;
|
|
for I := 0 to FCategories.Count - 1 do
|
|
if CategoryVisible[I] then
|
|
begin
|
|
Inc(Result);
|
|
if Result = AIndex then
|
|
begin
|
|
Result := I;
|
|
Exit;
|
|
end;
|
|
end;
|
|
Result := -1;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.GetChildren(Proc: TGetChildProc; Root: TComponent);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
// for I := 0 to GroupCount - 1 do
|
|
// if Groups[I].Owner = Root then Proc(Groups[I]);
|
|
for I := 0 to ItemCount - 1 do
|
|
if (Items[I].Owner = Root) and (Items[I].Category > -1) then Proc(Items[I]);
|
|
for I := 0 to GroupCount - 1 do
|
|
if Groups[I].Owner = Root then Proc(Groups[I]);
|
|
end;
|
|
|
|
function TdxBarManager.GetPainterClass: TdxBarItemControlPainterClass;
|
|
begin
|
|
case GetPaintStyle of
|
|
bmsEnhanced:
|
|
Result := TdxBarItemControlEnhancedPainter;
|
|
bmsFlat:
|
|
Result := TdxBarItemControlFlatPainter;
|
|
bmsXP:
|
|
begin
|
|
if FThemeAvailable then
|
|
Result := TdxBarItemControlXPPainter
|
|
else
|
|
Result := TdxBarItemControlEnhancedPainter;
|
|
end;
|
|
bmsOffice11:
|
|
Result := TdxBarItemControlOffice11Painter;
|
|
else
|
|
Result := TdxBarItemControlStandardPainter;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarManager.GetWindowForMouseCapturing: HWND;
|
|
begin
|
|
if FIsCustomizing and (dxBarCustomizingForm <> nil) then
|
|
Result := dxBarCustomizingForm.Handle
|
|
else
|
|
if IsWindowVisible(Application.Handle) then
|
|
Result := Application.Handle
|
|
else
|
|
Result := FMainForm.Handle;
|
|
end;
|
|
|
|
procedure TdxBarManager.HotImagesChanged;
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
I: Integer;
|
|
begin
|
|
if not IsLoading and not IsDestroying then
|
|
begin
|
|
PrevLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
try
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I].UseHotImages then Items[I].HotGlyphChanged;
|
|
finally
|
|
LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.ImagesChanged;
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
I: Integer;
|
|
begin
|
|
if not IsLoading and not IsDestroying then
|
|
begin
|
|
PrevLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
try
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I].ImageIndex > -1 then Items[I].GlyphChanged;
|
|
finally
|
|
LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.LargeImagesChanged;
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
I: Integer;
|
|
begin
|
|
if not IsLoading and not IsDestroying then
|
|
begin
|
|
PrevLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
try
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I].UseLargeImages then Items[I].LargeGlyphChanged;
|
|
finally
|
|
LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.DisabledImagesChanged;
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
I: Integer;
|
|
begin
|
|
if not IsLoading and not IsDestroying then
|
|
begin
|
|
PrevLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
try
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I].ImageIndex > -1 then Items[I].GlyphChanged;
|
|
finally
|
|
LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.DisabledLargeImagesChanged;
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
I: Integer;
|
|
begin
|
|
if not IsLoading and not IsDestroying then
|
|
begin
|
|
PrevLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
try
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I].UseLargeImages then Items[I].LargeGlyphChanged;
|
|
finally
|
|
LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarManager.IsLargeImagesForLargeIcons: Boolean;
|
|
begin
|
|
Result := UseLargeImagesForLargeIcons and (LargeImages <> nil);
|
|
end;
|
|
|
|
procedure TdxBarManager.Loaded;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited Loaded;
|
|
if LockUpdate then Exit;
|
|
|
|
FBars.FLoading := True;
|
|
for I := 0 to ItemCount - 1 do
|
|
with Items[I] do
|
|
begin
|
|
if Items[I] is TCustomdxBarSubItem then
|
|
TCustomdxBarSubItem(Items[I]).ItemLinks.Loaded(True);
|
|
Visible := FLoadedVisible;
|
|
end;
|
|
for I := 0 to FBars.Count - 1 do
|
|
with FBars[I] do
|
|
begin
|
|
FIsPredefined := True;
|
|
ItemLinks.Loaded(True);
|
|
DockControl := FLoadedDockControl;
|
|
if DockControl = nil then
|
|
DockingStyle := FLoadedDockingStyle;
|
|
Visible := FLoadedVisible;
|
|
end;
|
|
if not FDesigning and not InternalLoading then
|
|
begin
|
|
if FStoreInRegistry then LoadFromRegistry(FRegistryPath);
|
|
if FStoreInIniFile then LoadFromIniFile(FIniFileName);
|
|
end;
|
|
FBars.FLoading := False;
|
|
|
|
for I := 0 to FCategories.Count - 1 do
|
|
if FCategories.Objects[I] <> nil then
|
|
CategoryItemsVisible[I] := TdxBarCategoryData(FCategories.Objects[I]).LoadedItemsVisible;
|
|
|
|
FFirstDocksUpdate := True;
|
|
for I := 0 to DockControlCount - 1 do
|
|
DockControls[I].UpdateDock;
|
|
FFirstDocksUpdate := False;
|
|
end;
|
|
|
|
procedure TdxBarManager.Notification(AComponent: TComponent; Operation: TOperation);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited;
|
|
if Operation = opRemove then
|
|
begin
|
|
if AComponent = DisabledLargeImages then DisabledLargeImages := nil;
|
|
if AComponent = DisabledImages then DisabledImages := nil;
|
|
if AComponent = HotImages then HotImages := nil;
|
|
if AComponent = Images then Images := nil;
|
|
if AComponent = LargeImages then LargeImages := nil;
|
|
if AComponent is TControl then
|
|
for I := 0 to FPopupMenuLinks.Count - 1 do
|
|
if FPopupMenuLinks[I].Control = AComponent then
|
|
FPopupMenuLinks[I].Control := nil;
|
|
if AComponent is TdxBarPopupMenu then
|
|
for I := 0 to FPopupMenuLinks.Count - 1 do
|
|
if FPopupMenuLinks[I].PopupMenu = AComponent then
|
|
FPopupMenuLinks[I].PopupMenu := nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.ReadState(Reader: TReader);
|
|
begin
|
|
inherited;
|
|
Inc(FReadStateCount);
|
|
end;
|
|
|
|
procedure TdxBarManager.SetName(const NewName: TComponentName);
|
|
var
|
|
I: Integer;
|
|
OldName, ItemName, NamePrefix: TComponentName;
|
|
Item: TdxBarItem;
|
|
begin
|
|
OldName := Name;
|
|
inherited SetName(NewName);
|
|
if FDesigning and (Name <> OldName) then
|
|
for I := 0 to FItems.Count - 1 do
|
|
begin
|
|
Item := Items[I];
|
|
if Item.Owner = Owner then
|
|
begin
|
|
ItemName := Item.Name;
|
|
NamePrefix := ItemName;
|
|
if Length(NamePrefix) > Length(OldName) then
|
|
begin
|
|
SetLength(NamePrefix, Length(OldName));
|
|
if CompareText(OldName, NamePrefix) = 0 then
|
|
begin
|
|
System.Delete(ItemName, 1, Length(OldName));
|
|
System.Insert(NewName, ItemName, 1);
|
|
try
|
|
Item.Name := ItemName;
|
|
except
|
|
on EComponentError do
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.ShowToolbars(Show, ForceHiding: Boolean; ActiveWindow: HWND);
|
|
var
|
|
I: Integer;
|
|
ProcessId1, ProcessId2: Longint;
|
|
|
|
function CanHideToolbars: Boolean;
|
|
begin
|
|
Result := FHideFloatingBarsWhenInactive or ForceHiding;
|
|
end;
|
|
|
|
procedure InvalidateBarsCaptions;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Bars.Count - 1 do
|
|
if (Bars[I].Control <> nil) and (Bars[I].DockingStyle = dsNone) then
|
|
Bars[I].Control.FrameChanged;
|
|
end;
|
|
|
|
function CanHideActiveBarControl: Boolean;
|
|
begin
|
|
Result :=
|
|
(ActiveBarControl.BarManager = Self) or
|
|
FIsCustomizing and (ActiveBarControl.BarManager.MainForm = dxBarCustomizingForm) and
|
|
(ActiveBarControl.Handle <> ActiveWindow) or
|
|
(TDummyForm(FMainForm).FormStyle = fsMDIForm) and
|
|
(TDummyForm(ActiveBarControl.BarManager.MainForm).FormStyle = fsMDIChild) and
|
|
(not (ActiveBarControl.SelectedItem is TdxBarWinControl) or
|
|
not TdxBarWinControl(ActiveBarControl.SelectedItem).FFocusing);
|
|
end;
|
|
|
|
begin
|
|
if FToolbarsVisibleChanging then Exit;
|
|
FToolbarsVisibleChanging := True;
|
|
try
|
|
if not CanHideToolbars then InvalidateBarsCaptions;
|
|
if not Show then
|
|
begin
|
|
if IsDestroying or (GetParent(ActiveWindow) = MainForm.Handle) {and IsWindowVisible(MainForm.Handle)} then
|
|
Exit; // !!!
|
|
//if not CanHideToolbars then Exit;
|
|
if (ActiveBarControl <> nil) and CanHideActiveBarControl then
|
|
ActiveBarControl.HideAll;
|
|
if not CanHideToolbars then
|
|
begin
|
|
if QuickCustBar <> nil then
|
|
QuickCustBar.CloseUp;
|
|
Exit;
|
|
end;
|
|
GetWindowThreadProcessId(FMainForm.Handle, @ProcessId1);
|
|
GetWindowThreadProcessId(ActiveWindow, @ProcessId2);
|
|
|
|
// if GetParent(ActiveWindow) = MainForm.Handle then
|
|
// Exit; // !!!
|
|
|
|
if (ActiveWindow = 0) or
|
|
(FindControl(ActiveWindow) is TCustomForm) and
|
|
((dxBarCustomizingForm = nil) or (ActiveWindow <> dxBarCustomizingForm.Handle) or
|
|
not FIsCustomizing) or
|
|
(ProcessId1 <> ProcessId2) or (ActiveWindow = Application.Handle) then
|
|
begin
|
|
for I := 0 to Bars.Count - 1 do
|
|
if (Bars[I].Control <> nil) and (Bars[I].DockingStyle = dsNone) then
|
|
SetWindowPos(Bars[I].Control.Handle, 0, 0, 0, 0, 0,
|
|
SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_HIDEWINDOW or SWP_NOACTIVATE);
|
|
SendMessage(FMainForm.Handle, WM_NCACTIVATE, 0, 0);
|
|
end;
|
|
end
|
|
else
|
|
if not IsIconic(FMainForm.Handle) then
|
|
begin
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
if (Control <> nil) and Visible and (DockingStyle = dsNone) then
|
|
with Control do
|
|
begin
|
|
ShowWindow(Handle, SW_SHOWNOACTIVATE);
|
|
//UpdateWindow(Handle);
|
|
end;
|
|
//if IsWindowVisible(FMainForm.Handle) then ProcessPaintMessages;
|
|
end;
|
|
finally
|
|
FToolbarsVisibleChanging := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.UpdateItems(Sender: TdxBarItem);
|
|
begin
|
|
if (Sender.Category > -1) and IsCustomizing and Designing and
|
|
not (IsLoading or IsDestroying) and not FCreatingBarItem then
|
|
UpdateCustomizingBarItems;
|
|
end;
|
|
|
|
function TdxBarManager.BorderSizeX: Integer;
|
|
begin
|
|
Result := PainterClass.BorderSizeX;
|
|
end;
|
|
|
|
function TdxBarManager.BorderSizeY: Integer;
|
|
begin
|
|
Result := PainterClass.BorderSizeY;
|
|
end;
|
|
|
|
function TdxBarManager.FingersSize(ABar: TdxBar): Integer;
|
|
begin
|
|
if ABar.CanMoving then
|
|
Result := FFingersSize
|
|
else
|
|
Result := PainterClass.EmptyFingersSize;
|
|
end;
|
|
|
|
function TdxBarManager.GetLightColor(ABtnFaceColorPart, AHighlightColorPart, AWindowColorPart: Integer): COLORREF;
|
|
begin
|
|
Result := dxOffice11.GetLightColor(ABtnFaceColorPart, AHighlightColorPart, AWindowColorPart);
|
|
end;
|
|
|
|
function TdxBarManager.BarByCaption(const ACaption: string): TdxBar;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to FBars.Count - 1 do
|
|
begin
|
|
Result := FBars[I];
|
|
if Result.Caption = ACaption then Exit;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
|
|
function TdxBarManager.BarByName(const AName: string): TdxBar;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to FBars.Count - 1 do
|
|
begin
|
|
Result := FBars[I];
|
|
if Result.Name = AName then Exit;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
|
|
function TdxBarManager.GetAllItemsByCategory(ACategory: Integer; List: TList): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
List.Clear;
|
|
if (0 <= ACategory) and (ACategory < Categories.Count) then
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I].Category = ACategory then List.Add(Items[I]);
|
|
Result := List.Count;
|
|
end;
|
|
|
|
function TdxBarManager.GetCountByCategory(ACategory: Integer): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
if (0 <= ACategory) and (ACategory < Categories.Count) then
|
|
for I := 0 to ItemCount - 1 do
|
|
with Items[I] do
|
|
if (Category = ACategory) and
|
|
(Designing or ActuallyVisible and not Hidden) then
|
|
Inc(Result);
|
|
end;
|
|
|
|
function TdxBarManager.GetItemByCategory(ACategory, AIndex: Integer): TdxBarItem;
|
|
var
|
|
List: TList;
|
|
begin
|
|
Result := nil;
|
|
List := TList.Create;
|
|
GetItemsByCategory(ACategory, List);
|
|
if (0 <= AIndex) and (AIndex < List.Count) then Result := TdxBarItem(List[AIndex]);
|
|
List.Free;
|
|
end;
|
|
|
|
function TdxBarManager.GetItemByName(const AName: string): TdxBarItem;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := nil;
|
|
for I := 0 to ItemCount - 1 do
|
|
if CompareText(Items[I].Name, AName) = 0 then
|
|
begin
|
|
Result := Items[I];
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarManager.GetItemsByCategory(ACategory: Integer; List: TList): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FDesigning then
|
|
Result := GetAllItemsByCategory(ACategory, List)
|
|
else
|
|
begin
|
|
List.Clear;
|
|
if (0 <= ACategory) and (ACategory < Categories.Count) then
|
|
for I := 0 to ItemCount - 1 do
|
|
with Items[I] do
|
|
if (Category = ACategory) and ActuallyVisible and not Hidden then
|
|
List.Add(Items[I]);
|
|
Result := List.Count;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.MoveItem(CurIndex, NewIndex: Integer);
|
|
begin
|
|
FItems.Move(CurIndex, NewIndex);
|
|
DesignerModified;
|
|
end;
|
|
|
|
procedure TdxBarManager.ExchangeItems(Index1, Index2: Integer);
|
|
begin
|
|
FItems.Exchange(Index1, Index2);
|
|
DesignerModified;
|
|
end;
|
|
|
|
procedure TdxBarManager.CreateToolbarsPopupList(ItemLinks: TdxBarItemLinks);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to FBars.Count - 1 do
|
|
if FBars[I].CanClose and not FBars[I].Hidden then
|
|
begin
|
|
InternalItemList.Add(TdxBarButton.Create(nil));
|
|
with TdxBarButton(InternalItemList.Last) do
|
|
begin
|
|
Caption := FBars[I].Caption;
|
|
Tag := I;
|
|
OnClick := ToolbarsPopupClick;
|
|
ButtonStyle := bsChecked;
|
|
Down := FBars[I].Visible;
|
|
end;
|
|
ItemLinks.Add.Item := TdxBarItem(InternalItemList.Last);
|
|
end;
|
|
AddCustomizeLink(ItemLinks, True, TdxBarButton);
|
|
DoShowToolbarsPopup(ItemLinks);
|
|
end;
|
|
|
|
procedure TdxBarManager.Customizing(Show: Boolean);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if (FIsCustomizing <> Show) and (not Show or (dxBarCustomizingForm = nil)) then
|
|
begin
|
|
for I := 0 to Bars.Count - 1 do
|
|
if Bars[I].Control <> nil then
|
|
with Bars[I].Control do
|
|
begin
|
|
HideAll;
|
|
DestroyControls;
|
|
end;
|
|
FIsCustomizing := Show;
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
begin
|
|
ItemLinks.RefreshVisibilityLists;
|
|
if Control <> nil then Control.CreateControls;
|
|
end;
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I] is TCustomdxBarSubItem then
|
|
TCustomdxBarSubItem(Items[I]).ItemLinks.RefreshVisibilityLists;
|
|
for I := 0 to FPopupMenus.Count - 1 do
|
|
TdxBarPopupMenu(FPopupMenus[I]).ItemLinks.RefreshVisibilityLists;
|
|
dxBarCustomizing(Self, Show);
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
if Control <> nil then
|
|
with Control do
|
|
begin
|
|
UpdateControlState;
|
|
RepaintBar;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.HideAll;
|
|
begin
|
|
if (ActiveBarControl <> nil) {and (ActiveBarControl.BarManager = Self) }then
|
|
ActiveBarControl.HideAll;
|
|
end;
|
|
|
|
procedure TdxBarManager.ResetUsageData;
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
TempForm: TForm;
|
|
TempBarManager: TdxBarManager;
|
|
I: Integer;
|
|
TempSubItem: TCustomdxBarSubItem;
|
|
TempBar: TdxBar;
|
|
begin
|
|
PrevLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
try
|
|
TempForm := LoadMainFormFromBin;
|
|
if TempForm <> nil then
|
|
try
|
|
TempBarManager := TdxBarManager(TempForm.FindComponent(Name));
|
|
if TempBarManager <> nil then
|
|
begin
|
|
for I := 0 to ItemCount - 1 do
|
|
with Items[I] do
|
|
if Items[I] is TCustomdxBarSubItem then
|
|
begin
|
|
TempSubItem := TCustomdxBarSubItem(TempForm.FindComponent(Name));
|
|
if TempSubItem <> nil then
|
|
TCustomdxBarSubItem(Items[I]).ItemLinks.AssignUsageData(TempSubItem.ItemLinks);
|
|
end;
|
|
for I := 0 to FBars.Count - 1 do
|
|
if I < TempBarManager.Bars.Count then
|
|
begin
|
|
TempBar := TempBarManager.Bars[I];
|
|
FBars[I].ItemLinks.AssignUsageData(TempBar.ItemLinks);
|
|
end;
|
|
end;
|
|
finally
|
|
TempForm.Free;
|
|
end;
|
|
finally
|
|
LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.ResetUsageDataWithConfirmation;
|
|
begin
|
|
if Application.MessageBox(PChar(cxGetResourceString(@dxSBAR_WANTTORESETUSAGEDATA)),
|
|
PChar(Application.Title), MB_YESNO or MB_DEFBUTTON2 or MB_ICONEXCLAMATION) = ID_YES then
|
|
ResetUsageData;
|
|
end;
|
|
{
|
|
var
|
|
WhatIsThisMode: Boolean;
|
|
WndProcRetHook: HHOOK;
|
|
|
|
function WndProcRetHookProc(Code: Integer; wParam: WParam; lParam: LParam): LRESULT; stdcall;
|
|
begin
|
|
with PCWPRetStruct(lParam)^ do
|
|
if message = WM_SETCURSOR then
|
|
SetCursor(Screen.Cursors[crHelp]);
|
|
Result := CallNextHookEx(WndProcRetHook, Code, wParam, lParam);
|
|
end;
|
|
|
|
procedure TdxBarManager.WhatIsThis;
|
|
var
|
|
Msg: TMsg;
|
|
P: TPoint;
|
|
begin
|
|
if WhatIsThisMode then Exit;
|
|
WhatIsThisMode := True;
|
|
WndProcRetHook :=
|
|
SetWindowsHookEx(WH_CALLWNDPROCRET, WndProcRetHookProc, HInstance, GetCurrentThreadId);
|
|
try
|
|
repeat
|
|
case Integer(GetMessage(Msg, 0, 0, 0)) of
|
|
-1: Break;
|
|
0: begin
|
|
PostQuitMessage(Msg.wParam);
|
|
Break;
|
|
end;
|
|
end;
|
|
case Msg.message of
|
|
WM_KEYDOWN, WM_KEYUP:
|
|
if Msg.wParam = VK_ESCAPE then Break;
|
|
WM_NCLBUTTONDOWN, WM_LBUTTONDOWN:
|
|
begin
|
|
P := SmallPointToPoint(TSmallPoint(Msg.lParam));
|
|
ClientToScreen(Msg.hwnd, P);
|
|
Application.MessageBox('Help!', '', 0);
|
|
Break;
|
|
end;
|
|
end;
|
|
TranslateMessage(Msg);
|
|
DispatchMessage(Msg);
|
|
until False;
|
|
finally
|
|
UnhookWindowsHookEx(WndProcRetHook);
|
|
WhatIsThisMode := False;
|
|
SetCursor(Screen.Cursors[Screen.Cursor]);
|
|
end;
|
|
end;
|
|
}
|
|
function GetComponentPath(AMainForm, AComponent: TComponent): string;
|
|
begin
|
|
Result := AComponent.Name;
|
|
if AComponent.Owner <> AMainForm then
|
|
while (AComponent.Owner <> nil) and (AComponent.Owner.Name <> '') do
|
|
begin
|
|
AComponent := AComponent.Owner;
|
|
Result := AComponent.Name + '.' + Result;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.LoadFromRegistry(ARegistryPath: string);
|
|
var
|
|
Stream: TMemoryStream;
|
|
Registry: TRegistry;
|
|
I: Integer;
|
|
AKey: string;
|
|
PrevBarManagerLockUpdate, PrevLockUpdate, PrevLoading: Boolean;
|
|
|
|
procedure ReadItemLinks(const AKey: string; AItemLinks: TdxBarItemLinks);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
AItemLinks.Clear;
|
|
with Registry do
|
|
begin
|
|
if ValueExists('ItemLinkCount') then I := ReadInteger('ItemLinkCount')
|
|
else I := 0;
|
|
CloseKey;
|
|
try
|
|
for I := 0 to I - 1 do
|
|
if OpenKey(AKey + '\ItemLink' + IntToStr(I), False) then
|
|
with AItemLinks.Add do
|
|
try
|
|
try
|
|
Item := GetItemByName(ReadString('ItemName'));
|
|
if Item = nil then Free
|
|
else
|
|
begin
|
|
BeginGroup := ReadBool('BeginGroup');
|
|
ReadBinaryData('UserDefine', FUserDefine, SizeOf(UserDefine));
|
|
if udCaption in UserDefine then
|
|
UserCaption := ReadString('UserCaption');
|
|
if udGlyph in UserDefine then
|
|
begin
|
|
Stream.SetSize(GetDataSize('UserGlyph'));
|
|
ReadBinaryData('UserGlyph', Stream.Memory^, Stream.Size);
|
|
UserGlyph.LoadFromStream(Stream);
|
|
Stream.Clear;
|
|
end;
|
|
if udPaintStyle in UserDefine then
|
|
UserPaintStyle := TdxBarPaintStyle(ReadInteger('UserPaintStyle'));
|
|
if udWidth in UserDefine then
|
|
UserWidth := ReadInteger('UserWidth');
|
|
if (AItemLinks.Owner is TdxBar) and ValueExists('Visible') then
|
|
FLoadedVisible := ReadBool('Visible');
|
|
if CanShowRecentItems and AItemLinks.FUseRecentItems then
|
|
begin
|
|
if ValueExists('UseCount') then
|
|
FLoadedUseCount := ReadInteger('UseCount');
|
|
if ValueExists('RecentIndex') then
|
|
FLoadedRecentIndex := ReadInteger('RecentIndex');
|
|
end;
|
|
end;
|
|
except
|
|
end;
|
|
finally
|
|
CloseKey;
|
|
end;
|
|
finally
|
|
AItemLinks.Loaded(True);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if ARegistryPath = '' then Exit;
|
|
if ARegistryPath[1] <> '\' then ARegistryPath := '\' + ARegistryPath;
|
|
if ARegistryPath[Length(ARegistryPath)] = '\' then
|
|
Delete(ARegistryPath, Length(ARegistryPath), 1);
|
|
Stream := TMemoryStream.Create;
|
|
Registry := TRegistry.Create;
|
|
try
|
|
with Registry do
|
|
if OpenKey(ARegistryPath, False) then
|
|
begin
|
|
PrevBarManagerLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
try
|
|
// read options
|
|
if CanShowRecentItems then
|
|
begin
|
|
if ValueExists('MenusShowRecentItemsFirst') then
|
|
MenusShowRecentItemsFirst := ReadBool('MenusShowRecentItemsFirst');
|
|
if ValueExists('ShowFullMenusAfterDelay') then
|
|
ShowFullMenusAfterDelay := ReadBool('ShowFullMenusAfterDelay');
|
|
end;
|
|
if ValueExists('LargeIcons') then LargeIcons := ReadBool('LargeIcons');
|
|
if ValueExists('MenuAnimations') then
|
|
MenuAnimations := TdxBarMenuAnimations(ReadInteger('MenuAnimations'));
|
|
if ValueExists('ShowHint') then ShowHint := ReadBool('ShowHint');
|
|
if ValueExists('ShowShortCutInHint') then
|
|
ShowShortCutInHint := ReadBool('ShowShortCutInHint');
|
|
|
|
// read (TdxBar)s
|
|
if ValueExists('BarCount') then
|
|
begin
|
|
for I := 0 to Bars.Count - 1 do Bars[I].Visible := False;
|
|
I := ReadInteger('BarCount');
|
|
CloseKey;
|
|
for I := 0 to I - 1 do
|
|
begin
|
|
AKey := ARegistryPath + '\Bar' + IntToStr(I);
|
|
if OpenKey(AKey, False) then
|
|
begin
|
|
if I > Bars.Count - 1 then Bars.Add;
|
|
with Bars[I] do
|
|
begin
|
|
PrevLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
try
|
|
ReadItemLinks(AKey, ItemLinks);
|
|
|
|
OpenKey(AKey, False);
|
|
try
|
|
try
|
|
Caption := ReadString('Caption');
|
|
|
|
DockedDockControl := FindDockControl(ReadString('DockedDockControl'));
|
|
DockedDockingStyle := TdxBarDockingStyle(ReadInteger('DockedDockingStyle'));
|
|
DockedLeft := ReadInteger('DockedLeft');
|
|
DockedTop := ReadInteger('DockedTop');
|
|
OneOnRow := ReadBool('OneOnRow');
|
|
Row := ReadInteger('Row');
|
|
|
|
FloatLeft := ReadInteger('FloatLeft');
|
|
FloatTop := ReadInteger('FloatTop');
|
|
FloatClientWidth := ReadInteger('FloatClientWidth');
|
|
FloatClientHeight := ReadInteger('FloatClientHeight');
|
|
|
|
DockControl := FindDockControl(ReadString('DockControl'));
|
|
DockingStyle := TdxBarDockingStyle(ReadInteger('DockingStyle'));
|
|
PrevLoading := FBars.FLoading;
|
|
FBars.FLoading := True;
|
|
try
|
|
Visible := ReadBool('Visible');
|
|
finally
|
|
FBars.FLoading := PrevLoading;
|
|
end;
|
|
except
|
|
Visible := True;
|
|
end;
|
|
finally
|
|
CloseKey;
|
|
end;
|
|
finally
|
|
LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
// read (TCustomdxBarSubItem)s
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I] is TCustomdxBarSubItem then
|
|
with TCustomdxBarSubItem(Items[I]) do
|
|
if Name <> '' then
|
|
begin
|
|
AKey := ARegistryPath + '\SubItem_' + Name;
|
|
if OpenKey(AKey, False) then ReadItemLinks(AKey, ItemLinks);
|
|
end;
|
|
finally
|
|
LockUpdate := PrevBarManagerLockUpdate;
|
|
end;
|
|
end;
|
|
finally
|
|
Registry.Free;
|
|
Stream.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SaveToRegistry(ARegistryPath: string);
|
|
var
|
|
Registry, SubRegistry: TRegistry;
|
|
Keys, SubKeys: TStringList;
|
|
I, J: Integer;
|
|
Stream: TMemoryStream;
|
|
AKey: string;
|
|
|
|
procedure WriteItemLinks(const AKey: string; AItemLinks: TdxBarItemLinks);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
with Registry do
|
|
begin
|
|
WriteInteger('ItemLinkCount', AItemLinks.Count);
|
|
CloseKey;
|
|
for I := 0 to AItemLinks.Count - 1 do
|
|
if (AItemLinks[I].Item <> nil) and (AItemLinks[I].Item.Name <> '') and
|
|
OpenKey(AKey + '\ItemLink' + IntToStr(I), True) then
|
|
with AItemLinks[I] do
|
|
begin
|
|
WriteString('ItemName', Item.Name);
|
|
WriteBool('BeginGroup', BeginGroup);
|
|
WriteBinaryData('UserDefine', FUserDefine, SizeOf(UserDefine));
|
|
if udCaption in UserDefine then
|
|
WriteString('UserCaption', UserCaption);
|
|
if udGlyph in UserDefine then
|
|
begin
|
|
UserGlyph.SaveToStream(Stream);
|
|
WriteBinaryData('UserGlyph', Stream.Memory^, Stream.Size);
|
|
Stream.Clear;
|
|
end;
|
|
if udPaintStyle in UserDefine then
|
|
WriteInteger('UserPaintStyle', Ord(UserPaintStyle));
|
|
if udWidth in UserDefine then
|
|
WriteInteger('UserWidth', UserWidth);
|
|
if AItemLinks.Owner is TdxBar then
|
|
WriteBool('Visible', Visible);
|
|
if CanShowRecentItems and AItemLinks.FUseRecentItems then
|
|
begin
|
|
WriteInteger('UseCount', FUseCount);
|
|
WriteInteger('RecentIndex', RecentIndex);
|
|
end;
|
|
CloseKey;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if ARegistryPath = '' then Exit;
|
|
if ARegistryPath[1] <> '\' then ARegistryPath := '\' + ARegistryPath;
|
|
if ARegistryPath[Length(ARegistryPath)] = '\' then
|
|
Delete(ARegistryPath, Length(ARegistryPath), 1);
|
|
Stream := TMemoryStream.Create;
|
|
Registry := TRegistry.Create;
|
|
with Registry do
|
|
if OpenKey(ARegistryPath, True) then
|
|
begin
|
|
// delete entire previous data from registry
|
|
Keys := TStringList.Create;
|
|
SubKeys := TStringList.Create;
|
|
SubRegistry := TRegistry.Create;
|
|
try
|
|
GetKeyNames(Keys);
|
|
for I := 0 to Keys.Count - 1 do
|
|
begin
|
|
with SubRegistry do
|
|
begin
|
|
OpenKey(ARegistryPath + '\' + Keys[I], False);
|
|
SubRegistry.GetKeyNames(SubKeys);
|
|
for J := 0 to SubKeys.Count - 1 do DeleteKey(SubKeys[J]);
|
|
CloseKey;
|
|
end;
|
|
DeleteKey(Keys[I]);
|
|
end;
|
|
finally
|
|
SubRegistry.Free;
|
|
SubKeys.Free;
|
|
Keys.Free;
|
|
end;
|
|
|
|
// write options
|
|
if CanShowRecentItems then
|
|
begin
|
|
WriteBool('MenusShowRecentItemsFirst', MenusShowRecentItemsFirst);
|
|
WriteBool('ShowFullMenusAfterDelay', ShowFullMenusAfterDelay);
|
|
end;
|
|
WriteBool('LargeIcons', LargeIcons);
|
|
WriteInteger('MenuAnimations', Ord(MenuAnimations));
|
|
WriteBool('ShowHint', ShowHint);
|
|
WriteBool('ShowShortCutInHint', ShowShortCutInHint);
|
|
|
|
// write (TdxBar)s
|
|
WriteInteger('BarCount', Bars.Count);
|
|
CloseKey;
|
|
for I := 0 to Bars.Count - 1 do
|
|
begin
|
|
AKey := ARegistryPath + '\Bar' + IntToStr(I);
|
|
if OpenKey(AKey, True) then
|
|
with Bars[I] do
|
|
begin
|
|
WriteString('Caption', Caption);
|
|
|
|
if DockedDockControl <> nil then
|
|
WriteString('DockedDockControl', GetComponentPath(MainForm, DockedDockControl));
|
|
WriteInteger('DockedDockingStyle', Ord(DockedDockingStyle));
|
|
WriteInteger('DockedLeft', DockedLeft);
|
|
WriteInteger('DockedTop', DockedTop);
|
|
WriteBool('OneOnRow', OneOnRow);
|
|
WriteInteger('Row', Row);
|
|
|
|
WriteInteger('FloatLeft', FloatLeft);
|
|
WriteInteger('FloatTop', FloatTop);
|
|
WriteInteger('FloatClientWidth', FloatClientWidth);
|
|
WriteInteger('FloatClientHeight', FloatClientHeight);
|
|
|
|
if DockControl <> nil then
|
|
WriteString('DockControl', GetComponentPath(MainForm, DockControl));
|
|
WriteInteger('DockingStyle', Ord(DockingStyle));
|
|
WriteBool('Visible', Visible);
|
|
|
|
WriteItemLinks(AKey, ItemLinks);
|
|
end;
|
|
end;
|
|
|
|
// write (TCustomdxBarSubItem)s
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I] is TCustomdxBarSubItem then
|
|
with TCustomdxBarSubItem(Items[I]) do
|
|
if Name <> '' then
|
|
begin
|
|
AKey := ARegistryPath + '\SubItem_' + Name;
|
|
if OpenKey(AKey, True) then WriteItemLinks(AKey, ItemLinks);
|
|
end;
|
|
end;
|
|
Registry.Free;
|
|
Stream.Free;
|
|
end;
|
|
|
|
procedure TdxBarManager.LoadFromIniFile(AFileName: string);
|
|
var
|
|
IniFile: TCurIniFile;
|
|
BaseName, Section: string;
|
|
I: Integer;
|
|
PrevBarManagerLockUpdate, PrevLockUpdate, PrevLoading: Boolean;
|
|
|
|
procedure ReadItemLinks(const ASection: string; AItemLinks: TdxBarItemLinks);
|
|
var
|
|
I: Integer;
|
|
Section: string;
|
|
begin
|
|
AItemLinks.Clear;
|
|
with IniFile do
|
|
begin
|
|
I := ReadInteger(ASection, 'ItemLinkCount', 0);
|
|
try
|
|
for I := 0 to I - 1 do
|
|
begin
|
|
Section := ASection + '.ItemLink' + IntToStr(I);
|
|
if ReadString(Section, 'ItemName', '') <> '' then
|
|
with AItemLinks.Add do
|
|
try
|
|
Item := GetItemByName(ReadString(Section, 'ItemName', ''));
|
|
if Item = nil then Free
|
|
else
|
|
begin
|
|
BeginGroup := ReadBool(Section, 'BeginGroup', False);
|
|
FUserDefine := TdxBarUserDefines(Byte(ReadInteger(Section, 'UserDefine', 0)));
|
|
if udCaption in UserDefine then
|
|
UserCaption := ReadString(Section, 'UserCaption', '');
|
|
if udPaintStyle in UserDefine then
|
|
UserPaintStyle := TdxBarPaintStyle(ReadInteger(Section, 'UserPaintStyle', 0));
|
|
if udWidth in UserDefine then
|
|
UserWidth := ReadInteger(Section, 'UserWidth', 100);
|
|
// don't load UserGlyph
|
|
if AItemLinks.Owner is TdxBar then
|
|
FLoadedVisible := ReadBool(Section, 'Visible', True);
|
|
if CanShowRecentItems and AItemLinks.FUseRecentItems then
|
|
begin
|
|
FLoadedUseCount := ReadInteger(Section, 'UseCount', 0);
|
|
FLoadedRecentIndex := ReadInteger(Section, 'RecentIndex', -1);
|
|
end;
|
|
end;
|
|
except
|
|
end;
|
|
end;
|
|
finally
|
|
AItemLinks.Loaded(True);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
ATempList: TStringList;
|
|
begin
|
|
if (AFileName = '') and (FIniFileStream = nil) then Exit;
|
|
BaseName := MainForm.Name + '.' + Name + '.';
|
|
IniFile := TCurIniFile.Create(AFileName);
|
|
try
|
|
if FIniFileStream <> nil then
|
|
begin
|
|
ATempList := TStringList.Create;
|
|
try
|
|
ATempList.LoadFromStream(FIniFileStream);
|
|
IniFile.SetStrings(ATempList);
|
|
finally
|
|
ATempList.Free;
|
|
end;
|
|
end;
|
|
with IniFile do
|
|
begin
|
|
PrevBarManagerLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
try
|
|
// read options
|
|
Section := BaseName + 'Main';
|
|
if CanShowRecentItems then
|
|
begin
|
|
MenusShowRecentItemsFirst :=
|
|
ReadBool(Section, 'MenusShowRecentItemsFirst', MenusShowRecentItemsFirst);
|
|
ShowFullMenusAfterDelay :=
|
|
ReadBool(Section, 'ShowFullMenusAfterDelay', ShowFullMenusAfterDelay);
|
|
end;
|
|
LargeIcons := ReadBool(Section, 'LargeIcons', LargeIcons);
|
|
MenuAnimations := TdxBarMenuAnimations(ReadInteger(Section, 'MenuAnimations', Byte(MenuAnimations)));
|
|
ShowHint := ReadBool(Section, 'ShowHint', ShowHint);
|
|
ShowShortCutInHint := ReadBool(Section, 'ShowShortCutInHint', ShowShortCutInHint);
|
|
|
|
// read (TdxBar)s
|
|
if ReadInteger(Section, 'BarCount', -1) > -1 then
|
|
begin
|
|
for I := 0 to Bars.Count - 1 do Bars[I].Visible := False;
|
|
I := ReadInteger(Section, 'BarCount', 0);
|
|
for I := 0 to I - 1 do
|
|
begin
|
|
Section := BaseName + 'Bar' + IntToStr(I);
|
|
if ReadInteger(Section, 'Row', -1000) > -1000 then
|
|
begin
|
|
if I > Bars.Count - 1 then Bars.Add;
|
|
with Bars[I] do
|
|
begin
|
|
PrevLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
try
|
|
ReadItemLinks(Section, ItemLinks);
|
|
|
|
try
|
|
Caption := ReadString(Section, 'Caption', Caption);
|
|
|
|
DockedDockControl := FindDockControl(ReadString(Section, 'DockedDockControl', ''));
|
|
DockedDockingStyle :=
|
|
TdxBarDockingStyle(ReadInteger(Section, 'DockedDockingStyle',
|
|
Integer(DockedDockingStyle)));
|
|
DockedLeft := ReadInteger(Section, 'DockedLeft', DockedLeft);
|
|
DockedTop := ReadInteger(Section, 'DockedTop', DockedTop);
|
|
OneOnRow := ReadBool(Section, 'OneOnRow', OneOnRow);
|
|
Row := ReadInteger(Section, 'Row', Row);
|
|
|
|
FloatLeft := ReadInteger(Section, 'FloatLeft', FloatLeft);
|
|
FloatTop := ReadInteger(Section, 'FloatTop', FloatTop);
|
|
FloatClientWidth := ReadInteger(Section, 'FloatClientWidth', FloatClientWidth);
|
|
FloatClientHeight := ReadInteger(Section, 'FloatClientHeight', FloatClientHeight);
|
|
|
|
DockControl := FindDockControl(ReadString(Section, 'DockControl', ''));;
|
|
DockingStyle :=
|
|
TdxBarDockingStyle(ReadInteger(Section, 'DockingStyle', Integer(DockingStyle)));
|
|
PrevLoading := FBars.FLoading;
|
|
FBars.FLoading := True;
|
|
try
|
|
Visible := ReadBool(Section, 'Visible', False);
|
|
finally
|
|
FBars.FLoading := PrevLoading;
|
|
end;
|
|
except
|
|
Visible := True;
|
|
end;
|
|
finally
|
|
LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
// read (TCustomdxBarSubItem)s
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I] is TCustomdxBarSubItem then
|
|
with TCustomdxBarSubItem(Items[I]) do
|
|
if Name <> '' then
|
|
begin
|
|
Section := BaseName + 'SubItem_' + Name;
|
|
if ReadInteger(Section, 'ItemLinkCount', -1) > -1 then
|
|
ReadItemLinks(Section, ItemLinks);
|
|
end;
|
|
finally
|
|
LockUpdate := PrevBarManagerLockUpdate;
|
|
end;
|
|
end;
|
|
finally
|
|
IniFile.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SaveToIniFile(AFileName: string);
|
|
var
|
|
IniFile: TCurIniFile;
|
|
Sections: TStringList;
|
|
BaseName, Section: string;
|
|
I: Integer;
|
|
|
|
procedure WriteItemLinks(const ASection: string; AItemLinks: TdxBarItemLinks);
|
|
var
|
|
I: Integer;
|
|
Section: string;
|
|
begin
|
|
with IniFile do
|
|
begin
|
|
WriteInteger(ASection, 'ItemLinkCount', AItemLinks.Count);
|
|
for I := 0 to AItemLinks.Count - 1 do
|
|
if (AItemLinks[I].Item <> nil) and (AItemLinks[I].Item.Name <> '') then
|
|
with AItemLinks[I] do
|
|
begin
|
|
Section := ASection + '.ItemLink' + IntToStr(I);
|
|
WriteString(Section, 'ItemName', Item.Name);
|
|
WriteBool(Section, 'BeginGroup', BeginGroup);
|
|
WriteInteger(Section, 'UserDefine', Byte(FUserDefine));
|
|
if udCaption in UserDefine then
|
|
WriteString(Section, 'UserCaption', UserCaption);
|
|
if udPaintStyle in UserDefine then
|
|
WriteInteger(Section, 'UserPaintStyle', Ord(UserPaintStyle));
|
|
if udWidth in UserDefine then
|
|
WriteInteger(Section, 'UserWidth', UserWidth);
|
|
// don't save UserGlyph
|
|
if AItemLinks.Owner is TdxBar then
|
|
WriteBool(Section, 'Visible', Visible);
|
|
if CanShowRecentItems and AItemLinks.FUseRecentItems then
|
|
begin
|
|
WriteInteger(Section, 'UseCount', FUseCount);
|
|
WriteInteger(Section, 'RecentIndex', RecentIndex);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
ATempList: TStringList;
|
|
begin
|
|
if (AFileName = '') and (FIniFileStream = nil) then Exit;
|
|
BaseName := MainForm.Name + '.' + Name + '.';
|
|
IniFile := TCurIniFile.Create(AFileName);
|
|
try
|
|
with IniFile do
|
|
begin
|
|
// delete entire previous data from inifile
|
|
Sections := TStringList.Create;
|
|
ReadSections(Sections);
|
|
for I := 0 to Sections.Count - 1 do
|
|
if Copy(Sections[I], 1, Length(BaseName)) = BaseName then
|
|
EraseSection(Sections[I]);
|
|
Sections.Free;
|
|
|
|
// write options
|
|
Section := BaseName + 'Main';
|
|
if CanShowRecentItems then
|
|
begin
|
|
WriteBool(Section, 'MenusShowRecentItemsFirst', MenusShowRecentItemsFirst);
|
|
WriteBool(Section, 'ShowFullMenusAfterDelay', ShowFullMenusAfterDelay);
|
|
end;
|
|
WriteBool(Section, 'LargeIcons', LargeIcons);
|
|
WriteInteger(Section, 'MenuAnimations', Ord(MenuAnimations));
|
|
WriteBool(Section, 'ShowHint', ShowHint);
|
|
WriteBool(Section, 'ShowShortCutInHint', ShowShortCutInHint);
|
|
|
|
// write (TdxBar)s
|
|
WriteInteger(Section, 'BarCount', Bars.Count);
|
|
for I := 0 to Bars.Count - 1 do
|
|
begin
|
|
Section := BaseName + 'Bar' + IntToStr(I);
|
|
with Bars[I] do
|
|
begin
|
|
WriteString(Section, 'Caption', Caption);
|
|
|
|
if DockedDockControl <> nil then
|
|
WriteString(Section, 'DockedDockControl', GetComponentPath(MainForm, DockedDockControl));
|
|
WriteInteger(Section, 'DockedDockingStyle', Ord(DockedDockingStyle));
|
|
WriteInteger(Section, 'DockedLeft', DockedLeft);
|
|
WriteInteger(Section, 'DockedTop', DockedTop);
|
|
WriteBool(Section, 'OneOnRow', OneOnRow);
|
|
WriteInteger(Section, 'Row', Row);
|
|
|
|
WriteInteger(Section, 'FloatLeft', FloatLeft);
|
|
WriteInteger(Section, 'FloatTop', FloatTop);
|
|
WriteInteger(Section, 'FloatClientWidth', FloatClientWidth);
|
|
WriteInteger(Section, 'FloatClientHeight', FloatClientHeight);
|
|
|
|
if DockControl <> nil then
|
|
WriteString(Section, 'DockControl', GetComponentPath(MainForm, DockControl));
|
|
WriteInteger(Section, 'DockingStyle', Ord(DockingStyle));
|
|
WriteBool(Section, 'Visible', Visible);
|
|
|
|
WriteItemLinks(Section, ItemLinks);
|
|
end;
|
|
end;
|
|
|
|
// write (TCustomdxBarSubItem)s
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I] is TCustomdxBarSubItem then
|
|
with TCustomdxBarSubItem(Items[I]) do
|
|
if Name <> '' then
|
|
begin
|
|
Section := BaseName + 'SubItem_' + Name;
|
|
WriteItemLinks(Section, ItemLinks);
|
|
end;
|
|
end;
|
|
finally
|
|
if FIniFileStream = nil then
|
|
IniFile.UpdateFile
|
|
else
|
|
begin
|
|
ATempList := TStringList.Create;
|
|
try
|
|
IniFile.GetStrings(ATempList);
|
|
ATempList.SaveToStream(FIniFileStream);
|
|
finally
|
|
ATempList.Free;
|
|
end;
|
|
end;
|
|
IniFile.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.LoadFromStream(AStream: TStream);
|
|
begin
|
|
FIniFileStream := AStream;
|
|
try
|
|
LoadFromIniFile('');
|
|
finally
|
|
FIniFileStream := nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarManager.SaveToStream(AStream: TStream);
|
|
begin
|
|
FIniFileStream := AStream;
|
|
try
|
|
SaveToIniFile('');
|
|
finally
|
|
FIniFileStream := nil;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarManager.CreateGroup: TdxBarGroup;
|
|
begin
|
|
Result := TdxBarGroup.Create(FMainForm);
|
|
AddGroup(Result);
|
|
end;
|
|
|
|
function TdxBarManager.CanShowRecentItems: Boolean;
|
|
begin
|
|
Result := GetPaintStyle <> bmsStandard;
|
|
end;
|
|
|
|
function TdxBarManager.GetPaintStyle: TdxBarManagerStyle;
|
|
const
|
|
AStyles: array[TcxLookAndFeelKind] of TdxBarManagerStyle = (
|
|
bmsEnhanced, bmsStandard, bmsFlat{$IFDEF DXVER500}, bmsOffice11{$ENDIF});
|
|
begin
|
|
if Style = bmsUseLookAndFeel then
|
|
begin
|
|
if LookAndFeel.NativeStyle and FThemeAvailable then
|
|
Result := bmsXP
|
|
else
|
|
Result := AStyles[LookAndFeel.Kind];
|
|
end
|
|
else
|
|
Result := Style;
|
|
end;
|
|
|
|
{ TdxDockControl }
|
|
|
|
constructor TdxDockControl.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FBackgroundBitmap := TBitmap.Create;
|
|
FBackgroundBitmap.OnChange := BitmapChanged;
|
|
FBackgroundTempBitmap := TBitmap.Create;
|
|
ParentColor := True;
|
|
FAllowDocking := True;
|
|
FRowMarginSize := InsertZone;
|
|
FRowList := TList.Create;
|
|
end;
|
|
|
|
constructor TdxDockControl.CreateEx(AOwner: TComponent;
|
|
ABarManager: TdxBarManager; ADockStyle: TdxBarDockingStyle);
|
|
const
|
|
Styles: array[dsLeft..dsBottom] of TAlign =
|
|
(alLeft, alTop, alRight, alBottom);
|
|
begin
|
|
Create(AOwner);
|
|
Align := Styles[ADockStyle];
|
|
ControlStyle := [csNoDesignVisible];
|
|
if ADockStyle = dsTop then
|
|
ControlStyle := ControlStyle + [csActionClient];
|
|
;
|
|
FDockingStyle := ADockStyle;
|
|
BarManager := ABarManager;
|
|
end;
|
|
|
|
destructor TdxDockControl.Destroy;
|
|
begin
|
|
Destroying;
|
|
BarManager := nil;
|
|
while FRowList.Count <> 0 do
|
|
begin
|
|
while TdxDockRow(FRowList[0]).ColList.Count <> 0 do
|
|
begin
|
|
TdxDockCol(TdxDockRow(FRowList[0]).ColList[0]).Free;
|
|
TdxDockRow(FRowList[0]).ColList.Delete(0);
|
|
end;
|
|
TdxDockRow(FRowList[0]).Free;
|
|
FRowList.Delete(0);
|
|
end;
|
|
FRowList.Free;
|
|
FBackgroundTempBitmap.Free;
|
|
FBackgroundBitmap.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TdxDockControl.BitmapChanged(Sender: TObject);
|
|
begin
|
|
Invalidate;
|
|
UpdateDoubleBuffered;
|
|
RepaintBarControls;
|
|
end;
|
|
|
|
function TdxDockControl.GetBars: TdxBars;
|
|
begin
|
|
if FBarManager = nil then
|
|
Result := nil
|
|
else
|
|
Result := FBarManager.Bars;
|
|
end;
|
|
|
|
function TdxDockControl.GetDockingStyle: TdxBarDockingStyle;
|
|
const
|
|
Styles: array[TAlign] of TdxBarDockingStyle =
|
|
(dsTop, dsTop, dsBottom, dsLeft, dsRight, dsTop{$IFDEF DELPHI6}, dsTop{$ENDIF});
|
|
begin
|
|
Result := Styles[Align];
|
|
end;
|
|
|
|
function TdxDockControl.GetHorizontal: Boolean;
|
|
begin
|
|
Result := DockingStyle in [dsTop, dsBottom];
|
|
end;
|
|
|
|
function TdxDockControl.GetIsDesigning: Boolean;
|
|
begin
|
|
Result := csDesigning in ComponentState;
|
|
end;
|
|
|
|
function TdxDockControl.GetIsLoading: Boolean;
|
|
begin
|
|
Result := csLoading in ComponentState;
|
|
end;
|
|
|
|
function TdxDockControl.GetMain: Boolean;
|
|
begin
|
|
Result := FDockingStyle <> dsNone;
|
|
end;
|
|
|
|
function TdxDockControl.GetRow(Index: Integer): TdxDockRow;
|
|
begin
|
|
Result := FRowList[Index];
|
|
end;
|
|
|
|
function TdxDockControl.GetRowCount: Integer;
|
|
begin
|
|
Result := FRowList.Count;
|
|
end;
|
|
|
|
function TdxDockControl.GetTopLeft: Boolean;
|
|
begin
|
|
Result := DockingStyle in [dsLeft, dsTop];
|
|
end;
|
|
|
|
function TdxDockControl.GetVertical: Boolean;
|
|
begin
|
|
Result := DockingStyle in [dsLeft, dsRight];
|
|
end;
|
|
|
|
procedure TdxDockControl.SetBarManager(Value: TdxBarManager);
|
|
begin
|
|
if FBarManager <> Value then
|
|
begin
|
|
if FBarManager <> nil then
|
|
FBarManager.RemoveDockControl(Self);
|
|
FBarManager := Value;
|
|
if FBarManager <> nil then
|
|
FBarManager.AddDockControl(Self);
|
|
BarManagerChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.SetBackgroundBitmap(Value: TBitmap);
|
|
var
|
|
AChanged: Boolean;
|
|
begin
|
|
AChanged := not ((Value = nil) and FBackgroundBitmap.Empty);
|
|
FBackgroundBitmap.Assign(Value);
|
|
if AChanged then
|
|
BitmapChanged(nil);
|
|
end;
|
|
|
|
procedure TdxDockControl.WMDestroy(var Message: TMessage);
|
|
begin
|
|
if FBarManager <> nil then
|
|
FBarManager.CreateBarRestoringList;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxDockControl.WMEraseBkgnd(var Message: TWMEraseBkgnd);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
R := ClientRect;
|
|
FillBackground(Message.DC, R, R, 0, Color);
|
|
Message.Result := 1;
|
|
end;
|
|
|
|
procedure TdxDockControl.WMMouseActivate(var Message: TWMMouseActivate);
|
|
begin
|
|
inherited;
|
|
if (FBarManager <> nil) and not IsDesigning then
|
|
begin
|
|
Message.Result := MA_NOACTIVATE;
|
|
SetWindowPos(GetMainForm.Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.WMNCCalcSize(var Message: TWMNCCalcSize);
|
|
begin
|
|
inherited;
|
|
if SunkenBorder then
|
|
InflateRect(Message.CalcSize_Params.rgrc[0], -1, -1);
|
|
end;
|
|
|
|
procedure TdxDockControl.WMNCPaint(var Message: TWMNCPaint);
|
|
var
|
|
R: TRect;
|
|
DC: HDC;
|
|
begin
|
|
inherited;
|
|
if SunkenBorder then
|
|
begin
|
|
GetWindowRect(Handle, R);
|
|
OffsetRect(R, -R.Left, -R.Top);
|
|
DC := GetWindowDC(Handle);
|
|
DrawEdge(DC, R, BDR_SUNKENOUTER, BF_RECT);
|
|
ReleaseDC(Handle, DC);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.WMSize(var Message: TWMSize);
|
|
begin
|
|
ResetBackground;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxDockControl.WMRButtonDown(var Message: TWMRButtonDown);
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
inherited;
|
|
if FBarManager <> nil then
|
|
begin
|
|
if FBarManager.IsCustomizing then Exit;
|
|
P.X := Message.XPos;
|
|
P.Y := Message.YPos;
|
|
P := ClientToScreen(P);
|
|
ShowToolbarsPopup(Self, FBarManager, P);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.WMWindowPosChanged(var Message: TWMWindowPosChanged);
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
I, J: Integer;
|
|
begin
|
|
inherited;
|
|
if (BarManager <> nil) and
|
|
(Message.WindowPos^.flags and (SWP_NOMOVE or SWP_NOSIZE) <> SWP_NOMOVE or SWP_NOSIZE) then
|
|
begin
|
|
PrevLockUpdate := BarManager.FLockUpdate;
|
|
BarManager.FLockUpdate := True;
|
|
try
|
|
if DockingStyle = dsBottom then
|
|
for I := 0 to RowCount - 1 do
|
|
for J := 0 to Rows[I].ColCount - 1 do
|
|
with Rows[I].Cols[J].BarControl do
|
|
if Bar.IsStatusBar then RebuildBar;
|
|
finally
|
|
BarManager.FLockUpdate := PrevLockUpdate;
|
|
end;
|
|
if IsTransparent then
|
|
RepaintBarControls;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.CMSysColorChange(var Message: TMessage);
|
|
begin
|
|
inherited;
|
|
if IsWin9X and Main and (DockingStyle = dsLeft) then
|
|
BarManager.MainFormWndProc(WM_SYSCOLORCHANGE, 0, 0);
|
|
end;
|
|
|
|
procedure TdxDockControl.AlignControls(AControl: TControl; var Rect: TRect);
|
|
begin
|
|
if (FBarManager <> nil) and not FBarManager.IsLoading then
|
|
begin
|
|
UpdateDock;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited CreateParams(Params);
|
|
with Params do
|
|
begin
|
|
Style := WS_CHILD or WS_CLIPCHILDREN or WS_CLIPSIBLINGS;
|
|
ExStyle := 0;
|
|
WindowClass.Style := CS_DBLCLKS;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.Notification(AComponent: TComponent;
|
|
Operation: TOperation);
|
|
begin
|
|
inherited;
|
|
if (Operation = opRemove) and (AComponent = BarManager) then
|
|
BarManager := nil;
|
|
end;
|
|
|
|
procedure TdxDockControl.RequestAlign;
|
|
begin
|
|
if not (csDestroyingHandle in ControlState) then
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxDockControl.WndProc(var Message: TMessage);
|
|
begin
|
|
if (FBarManager <> nil) and
|
|
(Message.Msg = WM_LBUTTONDBLCLK) and FBarManager.CanCustomize then
|
|
begin
|
|
FBarManager.Customizing(True);
|
|
Exit;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxDockControl.AddBarControl(ABarControl: TdxBarControl; APos: TPoint;
|
|
Update: Boolean);
|
|
var
|
|
Ins: Boolean;
|
|
ARow, ACol, I: Integer;
|
|
DockRow: TdxDockRow;
|
|
DockCol: TdxDockCol;
|
|
begin
|
|
if FBarManager = nil then Exit;
|
|
Ins := False;
|
|
ARow := 0;
|
|
if (ABarControl <> nil) and not ABarControl.InternallyLocked then
|
|
ARow := GetRowAtPos(APos, Ins)
|
|
else
|
|
if ABarControl.FBar <> nil then
|
|
begin
|
|
ARow := ABarControl.FBar.Row;
|
|
Ins := ABarControl.FBar.OneOnRow;
|
|
end;
|
|
|
|
if (ABarControl <> nil) and (ABarControl.Bar <> nil) and
|
|
ABarControl.Bar.WholeRow then Ins := True;
|
|
|
|
if ABarControl.InternallyLocked and (Bars.FLoading or BarManager.IsHandleCreating) and
|
|
(ARow > FRowList.Count - 1) then
|
|
for I := FRowList.Count to ARow do
|
|
FRowList.Insert(I, TdxDockRow.Create(Self))
|
|
else
|
|
begin
|
|
if ARow > FRowList.Count - 1 + Byte(Ins) then
|
|
begin
|
|
//Ins := True;
|
|
ARow := FRowList.Count - Byte(not Ins){!};
|
|
end;
|
|
if ARow < 0 then ARow := 0;
|
|
end;
|
|
if ARow >= FRowList.Count then Ins := True;
|
|
|
|
if not Ins then
|
|
with TdxDockRow(FRowList[ARow]) do
|
|
for I := 0 to ColList.Count - 1 do
|
|
with TdxDockCol(ColList[I]) do
|
|
if BarControl.Bar.WholeRow and (BarControl <> ABarControl) then
|
|
begin
|
|
Ins := True;
|
|
Break;
|
|
end;
|
|
|
|
if Ins then
|
|
begin
|
|
if ABarControl.InternallyLocked and (Bars.FLoading or BarManager.IsHandleCreating) then
|
|
DockRow := FRowList[ARow]
|
|
else
|
|
begin
|
|
DockRow := TdxDockRow.Create(Self);
|
|
FRowList.Insert(ARow, DockRow);
|
|
end;
|
|
DockCol := TdxDockCol.Create(DockRow, ABarControl);
|
|
DockRow.ColList.Add(DockCol);
|
|
end
|
|
else
|
|
begin
|
|
DockCol := TdxDockCol.Create(TdxDockRow(FRowList[ARow]), ABarControl);
|
|
ACol := GetColAtPos(ARow, APos);
|
|
GetColAtPos(ARow, APos);
|
|
TdxDockRow(FRowList[ARow]).ColList.Insert(ACol, DockCol);
|
|
end;
|
|
|
|
if not ABarControl.InternallyLocked then
|
|
begin
|
|
with Bars, FMovingOffset do
|
|
if FMoving then
|
|
begin
|
|
Dec(APos.X, X);
|
|
Dec(APos.Y, Y);
|
|
end;
|
|
with ABarControl, GetDragPointOffset(DockingStyle) do
|
|
begin
|
|
Dec(APos.X, X);
|
|
Dec(APos.Y, Y);
|
|
end;
|
|
end;
|
|
|
|
Windows.ScreenToClient(Handle, APos);
|
|
case Horizontal of
|
|
True:
|
|
if APos.X < 0 then APos.X := 0;
|
|
False:
|
|
if APos.Y < 0 then APos.Y := 0;
|
|
end;
|
|
|
|
DockCol.FPos := APos;
|
|
|
|
if Update then
|
|
begin
|
|
if not {Bars.}ABarControl.FMoving then
|
|
with ABarControl do
|
|
begin
|
|
Left := APos.X;
|
|
Top := APos.Y;
|
|
end;
|
|
UpdateDock;
|
|
if not BarManager.Bars.FLoading and not BarManager.IsHandleCreating then
|
|
DockCol.AssignPosition;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.DeleteBarControl(ABarControl: TdxBarControl; ADockCol: TObject;
|
|
Update: Boolean);
|
|
var
|
|
I, J: Integer;
|
|
|
|
procedure DeleteCol;
|
|
begin
|
|
with TdxDockRow(FRowList[I]) do
|
|
begin
|
|
TdxDockCol(ColList[J]).Free;
|
|
ColList.Delete(J);
|
|
if ColList.Count = 0 then
|
|
begin
|
|
Free;
|
|
FRowList.Delete(I);
|
|
end;
|
|
end;
|
|
if Update then UpdateDock;
|
|
end;
|
|
|
|
begin
|
|
if FBarManager = nil then Exit;
|
|
for I := 0 to FRowList.Count - 1 do
|
|
with TdxDockRow(FRowList[I]) do
|
|
if ADockCol <> nil then
|
|
begin
|
|
J := ColList.IndexOf(ADockCol);
|
|
if J > -1 then
|
|
begin
|
|
DeleteCol;
|
|
Exit;
|
|
end;
|
|
end
|
|
else
|
|
for J := 0 to ColList.Count - 1 do
|
|
if TdxDockCol(ColList[J]).BarControl = ABarControl then
|
|
begin
|
|
DeleteCol;
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.MoveBarControl(ABarControl: TdxBarControl; APos: TPoint);
|
|
var
|
|
DockCol: Pointer;
|
|
begin
|
|
if FBarManager = nil then Exit;
|
|
DockCol := TdxDockRow(FRowList[ABarControl.GetRow]).ColList[ABarControl.GetCol];
|
|
DeleteBarControl(ABarControl, DockCol, False);
|
|
AddBarControl(ABarControl, APos, True);
|
|
if IsTransparent then
|
|
begin
|
|
ResetBackground;
|
|
RepaintBarControls;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.AssignPositions;
|
|
var
|
|
I, J: Integer;
|
|
begin
|
|
for I := 0 to RowCount - 1 do
|
|
with Rows[I] do
|
|
for J := 0 to ColCount - 1 do
|
|
Cols[J].AssignPosition;
|
|
end;
|
|
|
|
procedure TdxDockControl.BarManagerChanged;
|
|
begin
|
|
ResetBackground;
|
|
end;
|
|
|
|
function TdxDockControl.CanDocking(Bar: TdxBar): Boolean;
|
|
begin
|
|
Result := FAllowDocking;
|
|
end;
|
|
|
|
procedure TdxDockControl.ColorChanged;
|
|
begin
|
|
if (FBarManager = nil) or FBarManager.AutoDockColor then
|
|
ParentColor := True
|
|
else
|
|
Color := FBarManager.DockColor;
|
|
end;
|
|
|
|
function TdxDockControl.GetDockZoneBounds: TRect;
|
|
begin
|
|
Result := BoundsRect;
|
|
InflateRect(Result, Bars.DockingZoneSize, Byte(Horizontal) * Bars.DockingZoneSize);
|
|
MapWindowPoints(GetParent(Handle), 0, Result, 2);
|
|
end;
|
|
|
|
procedure TdxDockControl.GetDockZoneMargins(Row, ZoneNumber: Integer; var M1, M2: Integer);
|
|
var
|
|
IM1, IM2: Integer;
|
|
begin
|
|
M1 := 0;
|
|
M2 := 0;
|
|
if Row = -1 then
|
|
if TopLeft then
|
|
begin
|
|
M1 := -Bars.DockingZoneSize;
|
|
M2 := 0;
|
|
end
|
|
else
|
|
begin
|
|
if DockingStyle = dsRight then
|
|
M1 := ClientWidth
|
|
else
|
|
M1 := ClientHeight;
|
|
M1 := M1 - GetClientSize - Bars.DockingZoneSize;
|
|
M2 := M1 + Bars.DockingZoneSize;
|
|
end
|
|
else
|
|
if Row = FRowList.Count then
|
|
if TopLeft then
|
|
begin
|
|
M1 := GetClientSize;
|
|
M2 := M1 + Bars.DockingZoneSize;
|
|
end
|
|
else
|
|
begin
|
|
if DockingStyle = dsRight then
|
|
M1 := ClientWidth
|
|
else
|
|
M1 := ClientHeight;
|
|
M2 := M1 + Bars.DockingZoneSize;
|
|
end
|
|
else
|
|
with GetRectForRow(Row) do
|
|
if Horizontal then
|
|
begin
|
|
M1 := Top;
|
|
M2 := Bottom;
|
|
end
|
|
else
|
|
begin
|
|
M1 := Left;
|
|
M2 := Right;
|
|
end;
|
|
case DockingStyle of
|
|
dsLeft, dsTop:
|
|
IM1 := M1 + (Bars.DockingZoneSize - InsertZone div 2) div 2;
|
|
dsRight, dsBottom:
|
|
IM1 := M2 - (Bars.DockingZoneSize - InsertZone div 2) div 2 - InsertZone div 2;
|
|
else
|
|
IM1 := 0;
|
|
end;
|
|
IM2 := IM1 + InsertZone div 2;
|
|
|
|
case ZoneNumber of
|
|
0: M2 := IM1;
|
|
1: begin
|
|
M1 := IM1;
|
|
M2 := IM2;
|
|
end;
|
|
2: M1 := IM2;
|
|
end;
|
|
end;
|
|
|
|
function TdxDockControl.GetRectForRow(ARow: Integer): TRect;
|
|
var
|
|
I: Integer;
|
|
Origin, Size: Integer;
|
|
|
|
function GetRowHeight(ARow: Integer): Integer;
|
|
var
|
|
J: Integer;
|
|
begin
|
|
Result := 0;
|
|
for J := 0 to TdxDockRow(FRowList[ARow]).ColList.Count - 1 do
|
|
with TdxDockCol(TdxDockRow(FRowList[ARow]).ColList[J]).BarControl do
|
|
case Self.DockingStyle of
|
|
dsLeft, dsRight: if Result < Width then Result := Width;
|
|
dsTop, dsBottom: if Result < Height then Result := Height;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
SetRectEmpty(Result);
|
|
if (ARow < 0) or (ARow > FRowList.Count - 1) then Exit;
|
|
Size := 0;
|
|
if not Bars.FMoving or (DockingStyle in [dsLeft, dsTop]) then
|
|
begin
|
|
Origin := 0;
|
|
for I := 0 to ARow do
|
|
begin
|
|
Inc(Origin, Size);
|
|
Size := GetRowHeight(I);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
if DockingStyle = dsRight then
|
|
Origin := ClientWidth
|
|
else
|
|
Origin := ClientHeight;
|
|
for I := FRowList.Count - 1 downto ARow do
|
|
begin
|
|
Size := GetRowHeight(I);
|
|
Dec(Origin, Size);
|
|
end;
|
|
end;
|
|
case DockingStyle of
|
|
dsLeft, dsRight:
|
|
Result := Bounds(Origin, 0, Size, ClientHeight);
|
|
dsTop, dsBottom:
|
|
Result := Bounds(0, Origin, ClientWidth, Size);
|
|
end;
|
|
end;
|
|
|
|
function TdxDockControl.GetClientSize: Integer;
|
|
var
|
|
I: Integer;
|
|
R: TRect;
|
|
begin
|
|
Result := 0;
|
|
case DockingStyle of
|
|
dsLeft, dsRight:
|
|
for I := 0 to FRowList.Count - 1 do
|
|
begin
|
|
R := GetRectForRow(I);
|
|
Inc(Result, R.Right - R.Left);
|
|
end;
|
|
dsTop, dsBottom:
|
|
for I := 0 to FRowList.Count - 1 do
|
|
begin
|
|
R := GetRectForRow(I);
|
|
Inc(Result, R.Bottom - R.Top);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxDockControl.GetSize: Integer;
|
|
begin
|
|
Result := GetClientSize;
|
|
if (Result > 0) and SunkenBorder then Inc(Result, 2);
|
|
end;
|
|
|
|
function TdxDockControl.GetRowAtPos(APos: TPoint; var Insert: Boolean): Integer;
|
|
var
|
|
I, J, Z, M1, M2: Integer;
|
|
Found: Boolean;
|
|
begin
|
|
if FRowList.Count = 0 then
|
|
begin
|
|
Result := 0;
|
|
Insert := True;
|
|
Exit;
|
|
end;
|
|
|
|
Result := -1;
|
|
Insert := False;
|
|
Windows.ScreenToClient(Handle, APos);
|
|
if Vertical then
|
|
Z := APos.X
|
|
else
|
|
Z := APos.Y;
|
|
Found := False;
|
|
for I := -1 to FRowList.Count - 1 do
|
|
begin
|
|
for J := 0 to 2 do
|
|
begin
|
|
GetDockZoneMargins(I, J, M1, M2);
|
|
if (M1 <= Z) and (Z < M2) then
|
|
begin
|
|
Result := I + Byte(J > 0);
|
|
Insert := J = 1;
|
|
Found := True;
|
|
Break;
|
|
end;
|
|
end;
|
|
if Found then Break;
|
|
end;
|
|
|
|
if Result = -1 then
|
|
begin
|
|
Insert := True;
|
|
if Z >= GetClientSize then
|
|
Result := FRowList.Count
|
|
else
|
|
Result := 0;
|
|
end
|
|
else
|
|
if Result >= FRowList.Count then Insert := True;
|
|
end;
|
|
|
|
function TdxDockControl.GetColAtPos(ARow: Integer; APos: TPoint): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
if (FRowList[ARow] = nil) or
|
|
(TdxDockRow(FRowList[ARow]).ColList.Count = 0) then Exit;
|
|
Windows.ScreenToClient(Handle, APos);
|
|
if Bars.FMoving and not Bars.FMovingBarControl.InternallyLocked then
|
|
with Bars.FMovingBarControl.GetDragPointOffset(DockingStyle) do
|
|
case DockingStyle of
|
|
dsLeft, dsRight:
|
|
Dec(APos.Y, Y);
|
|
dsTop, dsBottom:
|
|
Dec(APos.X, X);
|
|
end;
|
|
with TdxDockRow(FRowList[ARow]) do
|
|
begin
|
|
for I := 0 to ColList.Count - 1 do
|
|
with TdxDockCol(ColList[I]), BarControl.Bar do
|
|
case DockingStyle of
|
|
dsLeft, dsRight:
|
|
if APos.Y <= DockedTop then
|
|
begin
|
|
Result := I;
|
|
Exit;
|
|
end;
|
|
dsTop, dsBottom:
|
|
if APos.X <= DockedLeft then
|
|
begin
|
|
Result := I;
|
|
Exit;
|
|
end;
|
|
end;
|
|
Result := ColList.Count;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.GetPosForRow(Row: Integer; OneOnRow: Boolean; var P: TPoint);
|
|
var
|
|
M1, M2, Temp: Integer;
|
|
begin
|
|
if OneOnRow and (Row = FRowList.Count) then OneOnRow := False;
|
|
if OneOnRow then
|
|
GetDockZoneMargins(Row - 1, 1, M1, M2)
|
|
else
|
|
begin
|
|
GetDockZoneMargins(Row - 1, 2, M1, Temp);
|
|
GetDockZoneMargins(Row, 0, Temp, M2);
|
|
if Temp - M1 > M2 - Temp then M1 := Temp - (M2 - Temp);
|
|
end;
|
|
Temp := (M1 + M2) div 2;
|
|
Windows.ScreenToClient(Handle, P);
|
|
if Vertical then
|
|
P.X := Temp
|
|
else
|
|
P.Y := Temp;
|
|
Windows.ClientToScreen(Handle, P);
|
|
end;
|
|
|
|
function TdxDockControl.GetSunkenBorder: Boolean;
|
|
begin
|
|
if BarManager = nil then
|
|
Result := False
|
|
else
|
|
Result := BarManager.SunkenBorder;
|
|
end;
|
|
|
|
function TdxDockControl.GetMainForm: TCustomForm;
|
|
begin
|
|
Result := FBarManager.MainForm;
|
|
end;
|
|
|
|
procedure TdxDockControl.NCChanged;
|
|
var
|
|
I, J: Integer;
|
|
begin
|
|
if not HandleAllocated then Exit;
|
|
SetWindowPos(Handle, 0, 0, 0, 0, 0,
|
|
SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_FRAMECHANGED);
|
|
for I := 0 to RowCount - 1 do
|
|
for J := 0 to Rows[I].ColCount - 1 do
|
|
Rows[I].Cols[J].BarControl.FrameChanged{RebuildBar};
|
|
UpdateDock;
|
|
end;
|
|
|
|
procedure TdxDockControl.PaintBarControls;
|
|
var
|
|
AVertical: Boolean;
|
|
Temp, I, J, K, MarkSize, ClientSize, LenMax,
|
|
MinSize, MaxSize, MaxHeight, RowLen, RestSize, Margin, FixedSize, Size, APos: Integer;
|
|
R: TRect;
|
|
ASize: TPoint;
|
|
|
|
function GetMinSize(ABarControl: TdxBarControl): Integer;
|
|
begin
|
|
if Vertical then
|
|
Result := ABarControl.GetMinHeight(DockingStyle)
|
|
else
|
|
Result := ABarControl.GetMinWidth(DockingStyle);
|
|
end;
|
|
|
|
function GetMaxSizeX(ABarControl: TdxBarControl): Integer;
|
|
begin
|
|
if Vertical then
|
|
Result := ABarControl.GetMaxHeight(DockingStyle)
|
|
else
|
|
Result := ABarControl.GetMaxWidth(DockingStyle);
|
|
end;
|
|
|
|
function GetMaxSizeY(ABarControl: TdxBarControl): Integer;
|
|
begin
|
|
if Vertical then
|
|
Result := ABarControl.GetMaxWidth(DockingStyle)
|
|
else
|
|
Result := ABarControl.GetMaxHeight(DockingStyle);
|
|
end;
|
|
|
|
function NCSizeX(ABarControl: TdxBarControl): Integer;
|
|
begin
|
|
if Vertical then
|
|
Result := ABarControl.Bar.BarNCSizeY(DockingStyle)
|
|
else
|
|
Result := ABarControl.Bar.BarNCSizeX(DockingStyle);
|
|
end;
|
|
|
|
function NCSizeY(ABarControl: TdxBarControl): Integer;
|
|
begin
|
|
if Vertical then
|
|
Result := ABarControl.Bar.BarNCSizeX(DockingStyle)
|
|
else
|
|
Result := ABarControl.Bar.BarNCSizeY(DockingStyle);
|
|
end;
|
|
|
|
function GetFullSize(ABarControl: TdxBarControl; ASize: Integer): TPoint;
|
|
begin
|
|
Dec(ASize,
|
|
NCSizeX(ABarControl) +
|
|
Byte(ABarControl.FTruncated and not BarManager.PainterClass.BarAllowQuickCustomizing) * MarkSize);
|
|
if Vertical then
|
|
begin
|
|
Result := ABarControl.GetSizeForHeight(DockingStyle, ASize);
|
|
with Result do
|
|
begin
|
|
Temp := X;
|
|
X := Y;
|
|
Y := Temp;
|
|
end;
|
|
end
|
|
else
|
|
Result := ABarControl.GetSizeForWidth(DockingStyle, ASize);
|
|
end;
|
|
|
|
begin
|
|
if (FRowList = nil) or (FBarManager = nil) or
|
|
(csDestroying in FBarManager.MainForm.ComponentState) or
|
|
(Bars = nil) or Bars.FLoading then Exit;
|
|
|
|
if not BarManager.Designing and HandleAllocated then
|
|
SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0,
|
|
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
|
|
DisableAlign;
|
|
|
|
AVertical := Vertical;
|
|
MarkSize := MarkSizeX;
|
|
if AVertical then
|
|
ClientSize := ClientHeight
|
|
else
|
|
ClientSize := ClientWidth;
|
|
|
|
for I := 0 to FRowList.Count - 1 do
|
|
with TdxDockRow(FRowList[I]) do
|
|
if ColList.Count > 0 then
|
|
begin
|
|
LenMax := 0;
|
|
for J := 0 to ColList.Count - 1 do
|
|
with TdxDockCol(ColList[J]), BarControl do
|
|
begin
|
|
FTruncated := False;
|
|
ItemLinks.RecentItemCount := -1;
|
|
FMinSize := GetMinSize(BarControl) + NCSizeX(BarControl);
|
|
FMaxSize := GetMaxSizeX(BarControl) + NCSizeX(BarControl);
|
|
if not MarkExists and (FMinSize <> FMaxSize) then
|
|
Inc(FMinSize, MarkSize);
|
|
Inc(LenMax, FMaxSize);
|
|
end;
|
|
|
|
R := GetRectForRow(I);
|
|
if AVertical then
|
|
with R do
|
|
begin
|
|
Temp := Left;
|
|
Left := Top;
|
|
Top := Temp;
|
|
end;
|
|
RowLen := ClientSize;
|
|
MaxHeight := 0;
|
|
|
|
if TdxDockCol(ColList[0]).BarControl.Bar.WholeRow then
|
|
with TdxDockCol(ColList[0]), BarControl do
|
|
begin
|
|
NewLeft := R.Left;
|
|
NewTop := R.Top;
|
|
NewWidth := RowLen;
|
|
if NewWidth < FMinSize then NewWidth := FMinSize;
|
|
FTruncated := not MultiLine and (NewWidth < FMaxSize);
|
|
NewHeight := GetFullSize(BarControl, NewWidth).Y + NCSizeY(BarControl);
|
|
if NewHeight > MaxHeight then MaxHeight := NewHeight;
|
|
end
|
|
else
|
|
if LenMax <= RowLen then
|
|
begin
|
|
Margin := RowLen;
|
|
for J := ColList.Count - 1 downto 0 do
|
|
with TdxDockCol(ColList[J]), BarControl do
|
|
begin
|
|
NewTop := R.Top;
|
|
NewWidth := FMaxSize;
|
|
if MultiLine then
|
|
NewHeight := GetFullSize(BarControl, NewWidth).Y
|
|
else
|
|
NewHeight := GetMaxSizeY(BarControl);
|
|
Inc(NewHeight, NCSizeY(BarControl));
|
|
if NewHeight > MaxHeight then MaxHeight := NewHeight;
|
|
if AVertical then
|
|
APos := Pos.Y
|
|
else
|
|
APos := Pos.X;
|
|
if APos + NewWidth <= Margin then
|
|
NewLeft := APos
|
|
else
|
|
NewLeft := Margin - NewWidth;
|
|
FixedSize := 0;
|
|
for K := 0 to J - 1 do
|
|
Inc(FixedSize, TdxDockCol(ColList[K]).BarControl.FMaxSize);
|
|
if NewLeft < FixedSize then NewLeft := FixedSize;
|
|
Margin := NewLeft;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
Size := RowLen;
|
|
for J := ColList.Count - 1 downto 0 do
|
|
with TdxDockCol(ColList[J]), BarControl do
|
|
begin
|
|
if AVertical then
|
|
FixedSize := Pos.Y
|
|
else
|
|
FixedSize := Pos.X;
|
|
MinSize := 0;
|
|
MaxSize := 0;
|
|
for K := J - 1 downto 0 do
|
|
with TdxDockCol(ColList[K]).BarControl do
|
|
begin
|
|
Inc(MinSize, FMinSize);
|
|
Inc(MaxSize, FMaxSize);
|
|
end;
|
|
if FixedSize < MinSize then FixedSize := MinSize;
|
|
if FixedSize > MaxSize then FixedSize := MaxSize;
|
|
if (J > 0) and (TdxDockCol(ColList[J - 1]).BarControl = Bars.FMovingBarControl) then
|
|
begin
|
|
with TdxDockCol(ColList[J - 1]), BarControl, Bar do
|
|
begin
|
|
if AVertical then
|
|
K := Pos.Y
|
|
else
|
|
K := Pos.X;
|
|
if K < MinSize - FMinSize then K := MinSize - FMinSize;
|
|
Inc(K, FMaxSize);
|
|
end;
|
|
if K < FixedSize then
|
|
begin
|
|
if AVertical then
|
|
FPos.Y := K
|
|
else
|
|
FPos.X := K;
|
|
FixedSize := K;
|
|
end;
|
|
end;
|
|
RestSize := Size - FixedSize;
|
|
|
|
if RestSize >= FMaxSize then
|
|
begin
|
|
NewWidth := FMaxSize;
|
|
if MultiLine then
|
|
NewHeight := GetFullSize(BarControl, NewWidth).Y
|
|
else
|
|
NewHeight := GetMaxSizeY(BarControl);
|
|
end
|
|
else
|
|
begin
|
|
FTruncated := not MultiLine and (FMinSize <> FMaxSize);
|
|
if RestSize <= FMinSize then
|
|
NewWidth := FMinSize
|
|
else
|
|
NewWidth := RestSize;
|
|
NewHeight := GetFullSize(BarControl, NewWidth).Y;
|
|
end;
|
|
|
|
if (J = 0) and (Size > NewWidth) then NewWidth := Size;
|
|
NewLeft := Size - NewWidth;
|
|
if NewLeft < MinSize then NewLeft := MinSize;
|
|
if NewLeft > MaxSize then NewLeft := MaxSize;
|
|
NewTop := R.Top;
|
|
Inc(NewHeight, NCSizeY(BarControl));
|
|
if NewHeight > MaxHeight then MaxHeight := NewHeight;
|
|
|
|
Dec(Size, NewWidth);
|
|
end;
|
|
end;
|
|
|
|
for J := 0 to ColList.Count - 1 do
|
|
with TdxDockCol(ColList[J]).BarControl do
|
|
if Bar.UseRestSpace then
|
|
begin
|
|
if J = 0 then
|
|
NewLeft := 0
|
|
else
|
|
with TdxDockCol(ColList[J - 1]).BarControl do
|
|
TdxDockCol(ColList[J]).BarControl.NewLeft := NewLeft + NewWidth;
|
|
if J = ColList.Count - 1 then
|
|
NewWidth := ClientSize - NewLeft
|
|
else
|
|
NewWidth := TdxDockCol(ColList[J + 1]).BarControl.NewLeft - NewLeft;
|
|
if NewWidth < FMinSize then NewWidth := FMinSize;
|
|
end;
|
|
|
|
for J := 0 to ColList.Count - 1 do
|
|
with TdxDockCol(ColList[J]), BarControl do
|
|
begin
|
|
if FTruncated and (J = ColList.Count - 1) then
|
|
begin
|
|
NewWidth := ClientSize - NewLeft;
|
|
if NewWidth < FMinSize then NewWidth := FMinSize;
|
|
end;
|
|
NewHeight := MaxHeight;
|
|
// for the RecentItemCount calculating
|
|
GetFullSize(BarControl, NewWidth);
|
|
if AVertical then
|
|
begin
|
|
Temp := NewLeft;
|
|
NewLeft := NewTop;
|
|
NewTop := Temp;
|
|
Temp := NewWidth;
|
|
NewWidth := NewHeight;
|
|
NewHeight := Temp;
|
|
end;
|
|
if (Left <> NewLeft) or (Top <> NewTop) or
|
|
(Width <> NewWidth) or (Height <> NewHeight) then
|
|
SetWindowPos(Handle, 0, NewLeft, NewTop, NewWidth, NewHeight,
|
|
SWP_NOZORDER or SWP_NOACTIVATE);
|
|
CalcControlsPositions;
|
|
end;
|
|
end;
|
|
|
|
EnableAlign;
|
|
|
|
Repaint;
|
|
end;
|
|
|
|
procedure TdxDockControl.SetSize;
|
|
|
|
function IsCurrentDockControl(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := True;
|
|
ABarControl := GetParentBarForBar(ABarControl);
|
|
if ABarControl is TdxBarControl then
|
|
if (Self is TdxBarDockControl) and
|
|
not (TdxBarControl(ABarControl).DockControl is TdxBarDockControl) or
|
|
(ABarControl.BarManager <> BarManager) and
|
|
(GetParentForm(Self) <> GetParentForm(ABarControl)) then
|
|
Result := False;
|
|
end;
|
|
|
|
var
|
|
ASize, PrevSize: Integer;
|
|
begin
|
|
ASize := GetSize;
|
|
PrevSize := 0;
|
|
case DockingStyle of
|
|
dsLeft, dsRight:
|
|
begin
|
|
PrevSize := Width;
|
|
if DockingStyle = dsRight then
|
|
begin
|
|
Parent.DisableAlign;
|
|
Left := Left - (ASize - Width);
|
|
end;
|
|
Width := ASize;
|
|
if DockingStyle = dsRight then Parent.EnableAlign;
|
|
end;
|
|
dsTop, dsBottom:
|
|
begin
|
|
PrevSize := Height;
|
|
if DockingStyle = dsBottom then
|
|
begin
|
|
Parent.DisableAlign;
|
|
Top := Top - (ASize - Height);
|
|
end;
|
|
Height := ASize;
|
|
if DockingStyle = dsBottom then Parent.EnableAlign;
|
|
end;
|
|
end;
|
|
if (ASize <> PrevSize) and (ActiveBarControl <> nil) and
|
|
not (GetParentBarForBar(ActiveBarControl) is TdxBarQuickControl) and
|
|
(ActiveBarControl.Handle <> GetCapture) and
|
|
IsCurrentDockControl(ActiveBarControl) then
|
|
ActiveBarControl.HideAll;
|
|
end;
|
|
|
|
procedure TdxDockControl.UpdateDock;
|
|
begin
|
|
if (FBarManager <> nil) and
|
|
not (csDestroying in FBarManager.MainForm.ComponentState) and
|
|
not FBarManager.LockUpdate and not FBarManager.IsDestroying then
|
|
begin
|
|
PaintBarControls;
|
|
SetSize;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxDockControl.FillBackground(DC: HDC; ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
var
|
|
CR: TRect;
|
|
begin
|
|
if not BackgroundBitmap.Empty or (BarManager = nil) then
|
|
FillBackgroundRect(DC, ADestR, ASourceR, ABrush, AColor, BackgroundBitmap)
|
|
else
|
|
begin
|
|
if not BarManager.Backgrounds.Bar.Empty then
|
|
FillBackgroundRect(DC, ADestR, ASourceR, ABrush, AColor, BarManager.Backgrounds.Bar)
|
|
else
|
|
begin
|
|
CR := ClientRect;
|
|
if not IsRectEmpty(CR) then
|
|
BarManager.PainterClass.DockControlFillBackground(Self, DC, ADestR, ASourceR, CR, ABrush, AColor)
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxDockControl.IsBackgroundBitmap: Boolean;
|
|
begin
|
|
Result := not BackgroundBitmap.Empty;
|
|
end;
|
|
|
|
function TdxDockControl.IsTransparent: Boolean;
|
|
begin
|
|
Result := not BackgroundBitmap.Empty or
|
|
((BarManager <> nil) and (BarManager.PainterClass.IsNativeBackground or
|
|
not BarManager.Backgrounds.Bar.Empty));
|
|
end;
|
|
|
|
procedure TdxDockControl.RepaintBarControls;
|
|
var
|
|
I, J: Integer;
|
|
begin
|
|
for I := 0 to RowCount - 1 do
|
|
for J := 0 to Rows[I].ColCount - 1 do
|
|
Rows[I].Cols[J].BarControl.FullRepaint;
|
|
end;
|
|
|
|
procedure TdxDockControl.ResetBackground;
|
|
begin
|
|
FBackgroundTempBitmap.Assign(nil);
|
|
end;
|
|
|
|
procedure TdxDockControl.UpdateDoubleBuffered;
|
|
begin
|
|
DoubleBuffered := IsTransparent;
|
|
end;
|
|
|
|
procedure TdxDockControl.InitiateAction;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FBarManager <> nil then
|
|
with FBarManager do
|
|
for I := 0 to Bars.Count - 1 do
|
|
with Bars[I] do
|
|
if Visible then ItemLinks.InitiateActions;
|
|
end;
|
|
|
|
{ TdxBarDockControl }
|
|
|
|
constructor TdxBarDockControl.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
Align := dalTop;
|
|
end;
|
|
|
|
function TdxBarDockControl.GetAlign: TdxBarDockAlign;
|
|
begin
|
|
Result := TdxBarDockAlign(inherited Align);
|
|
end;
|
|
|
|
function TdxBarDockControl.GetColor: TColor;
|
|
begin
|
|
Result := inherited Color;
|
|
end;
|
|
|
|
function TdxBarDockControl.GetIsLoading: Boolean;
|
|
begin
|
|
Result := (csLoading in ComponentState) or
|
|
(BarManager <> nil) and BarManager.Bars.IsLoading;
|
|
end;
|
|
|
|
function TdxBarDockControl.GetParentColor: Boolean;
|
|
begin
|
|
Result := inherited ParentColor;
|
|
end;
|
|
|
|
procedure TdxBarDockControl.SetAlign(Value: TdxBarDockAlign);
|
|
const
|
|
Styles: array[TdxBarDockAlign] of TdxBarDockingStyle =
|
|
(dsTop, dsTop, dsBottom, dsLeft, dsRight);
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
I, J: Integer;
|
|
begin
|
|
if Align <> Value then
|
|
begin
|
|
if BarManager <> nil then
|
|
begin
|
|
PrevLockUpdate := BarManager.LockUpdate;
|
|
BarManager.LockUpdate := True;
|
|
end
|
|
else
|
|
PrevLockUpdate := False;
|
|
try
|
|
for I := 0 to RowCount - 1 do
|
|
for J := 0 to Rows[I].ColCount - 1 do
|
|
Rows[I].Cols[J].BarControl.DockingStyle := Styles[Value];
|
|
inherited Align := TAlign(Value);
|
|
finally
|
|
if BarManager <> nil then
|
|
begin
|
|
BarManager.LockUpdate := PrevLockUpdate;
|
|
for I := 0 to RowCount - 1 do
|
|
for J := 0 to Rows[I].ColCount - 1 do
|
|
Rows[I].Cols[J].BarControl.RepaintBar;
|
|
if Parent <> nil then Parent.Invalidate;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarDockControl.SetAllowZeroSizeInDesignTime(Value: Boolean);
|
|
begin
|
|
if FAllowZeroSizeInDesignTime <> Value then
|
|
begin
|
|
FAllowZeroSizeInDesignTime := Value;
|
|
Perform(WM_SIZE, 0, 0);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarDockControl.SetColor(Value: TColor);
|
|
begin
|
|
if Color <> Value then
|
|
begin
|
|
inherited Color := Value;
|
|
if not IsLoading then UseOwnColor := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarDockControl.SetParentColor(Value: Boolean);
|
|
begin
|
|
if ParentColor <> Value then
|
|
begin
|
|
inherited ParentColor := Value;
|
|
if not IsLoading then UseOwnColor := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarDockControl.SetSunkenBorder(Value: Boolean);
|
|
begin
|
|
if SunkenBorder <> Value then
|
|
begin
|
|
FSunkenBorder := Value;
|
|
FUseOwnSunkenBorder := True;
|
|
NCChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarDockControl.SetUseOwnColor(Value: Boolean);
|
|
begin
|
|
if FUseOwnColor <> Value then
|
|
begin
|
|
FUseOwnColor := Value;
|
|
if not Value then ColorChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarDockControl.SetUseOwnSunkenBorder(Value: Boolean);
|
|
var
|
|
PrevSunkenBorder: Boolean;
|
|
begin
|
|
if FUseOwnSunkenBorder <> Value then
|
|
begin
|
|
PrevSunkenBorder := SunkenBorder;
|
|
FUseOwnSunkenBorder := Value;
|
|
if Value then
|
|
FSunkenBorder := PrevSunkenBorder
|
|
else
|
|
if SunkenBorder <> PrevSunkenBorder then NCChanged;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarDockControl.IsColorStored: Boolean;
|
|
begin
|
|
Result := FUseOwnColor and not ParentColor;
|
|
end;
|
|
|
|
procedure TdxBarDockControl.WMCreate(var Message: TWMCreate);
|
|
begin
|
|
inherited;
|
|
if BarManager <> nil then
|
|
BarManager.ShowBarsFromRestoringList(Self);
|
|
end;
|
|
|
|
procedure TdxBarDockControl.WMSize(var Message: TWMSize);
|
|
begin
|
|
inherited;
|
|
if not IsLoading and (RowCount = 0) then
|
|
if Horizontal then
|
|
ClientHeight := GetMinSize
|
|
else
|
|
ClientWidth := GetMinSize;
|
|
end;
|
|
|
|
procedure TdxBarDockControl.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited;
|
|
if IsDesigning then
|
|
with Params do
|
|
WindowClass.Style := WindowClass.Style or CS_HREDRAW or CS_VREDRAW;
|
|
end;
|
|
|
|
procedure TdxBarDockControl.Paint;
|
|
begin
|
|
inherited;
|
|
if IsDesigning then
|
|
begin
|
|
Canvas.Brush.Style := bsClear;
|
|
Canvas.Pen.Style := psDot;
|
|
Canvas.Rectangle(0, 0, ClientWidth, ClientHeight);
|
|
Canvas.Pen.Style := psSolid;
|
|
Canvas.Brush.Style := bsSolid;
|
|
end;
|
|
{ if IsDesigning then
|
|
with Canvas do
|
|
begin
|
|
Brush := Self.Brush;
|
|
Pen.Style := psDot;
|
|
Rectangle(0, 0, ClientWidth, ClientHeight);
|
|
Pen.Style := psSolid;
|
|
end
|
|
else
|
|
inherited;}
|
|
end;
|
|
|
|
procedure TdxBarDockControl.BarManagerChanged;
|
|
begin
|
|
inherited;
|
|
if not (csDestroying in ComponentState) then
|
|
begin
|
|
ColorChanged;
|
|
NCChanged;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarDockControl.CanDocking(Bar: TdxBar): Boolean;
|
|
begin
|
|
Result := inherited CanDocking(Bar) and
|
|
((Bar.Control = nil) or not HasAsParent(Handle, Bar.Control.Handle));
|
|
end;
|
|
|
|
procedure TdxBarDockControl.ColorChanged;
|
|
begin
|
|
if not FUseOwnColor then
|
|
begin
|
|
inherited;
|
|
FUseOwnColor := False;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarDockControl.GetClientSize: Integer;
|
|
begin
|
|
if IsLoading then
|
|
if Horizontal then
|
|
Result := ClientHeight
|
|
else
|
|
Result := ClientWidth
|
|
else
|
|
begin
|
|
Result := inherited GetClientSize;
|
|
if Result = 0 then Result := GetMinSize;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarDockControl.GetMinSize: Integer;
|
|
begin
|
|
if IsDesigning and not AllowZeroSizeInDesignTime then
|
|
Result := MinDockSize
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TdxBarDockControl.GetSunkenBorder: Boolean;
|
|
begin
|
|
if FUseOwnSunkenBorder then
|
|
Result := FSunkenBorder
|
|
else
|
|
Result := inherited GetSunkenBorder;
|
|
end;
|
|
|
|
function TdxBarDockControl.GetMainForm: TCustomForm;
|
|
begin
|
|
Result := GetParentForm(Self);
|
|
if Result = nil then // Result.HandleAllocated?
|
|
Result := inherited GetMainForm;
|
|
end;
|
|
|
|
{ TdxBarPopupMenu }
|
|
|
|
constructor TdxBarPopupMenu.Create(AOwner: TComponent);
|
|
var
|
|
AForm: TCustomForm;
|
|
begin
|
|
inherited Create(AOwner);
|
|
if dxBarManagerList.Count = 0 then
|
|
raise Exception.Create(cxGetResourceString(@dxSBAR_NOBARMANAGERS));
|
|
FBackgroundBitmap := TBitmap.Create;
|
|
if AOwner is TCustomForm then
|
|
AForm := TCustomForm(AOwner)
|
|
else
|
|
AForm := nil;
|
|
if AForm <> nil then BarManager := GetBarManagerByForm(AForm);
|
|
if FBarManager = nil then
|
|
BarManager := TdxBarManager(dxBarManagerList[0]);
|
|
FFont := TFont.Create;
|
|
FFont.Assign(BarManager.Font);
|
|
FFont.OnChange := FontChanged;
|
|
FItemLinks := TdxBarItemLinks.Create(FBarManager);
|
|
FItemLinks.FOwner := Self;
|
|
FItemLinks.FUseRecentItems := False;
|
|
FShowAnimation := True;
|
|
end;
|
|
|
|
destructor TdxBarPopupMenu.Destroy;
|
|
begin
|
|
Destroying;
|
|
if FItemLinks <> nil then
|
|
begin
|
|
FItemLinks.Free;
|
|
FItemLinks := nil;
|
|
end;
|
|
FFont.Free;
|
|
if FEditFontHandle <> 0 then DeleteObject(FEditFontHandle);
|
|
BarManager := nil;
|
|
FBackgroundBitmap.Free;
|
|
FBackgroundBitmap := nil;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarPopupMenu.GetSubMenuControl: TdxBarSubMenuControl;
|
|
begin
|
|
Result := TdxBarSubMenuControl(FItemLinks.BarControl);
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.SetBackgroundBitmap(Value: TBitmap);
|
|
begin
|
|
FBackgroundBitmap.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.SetBarManager(Value: TdxBarManager);
|
|
begin
|
|
if FBarManager <> Value then
|
|
begin
|
|
if (Value = nil) and not (csDestroying in ComponentState) then Exit;
|
|
if FBarManager <> nil then FBarManager.FPopupMenus.Remove(Self);
|
|
FBarManager := Value;
|
|
if FItemLinks <> nil then FItemLinks.FBarManager := Value;
|
|
if FBarManager <> nil then FBarManager.FPopupMenus.Add(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.SetBarSize(Value: Integer);
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
FBarSize := Value;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.SetFont(Value: TFont);
|
|
begin
|
|
FFont.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.SetItemLinks(Value: TdxBarItemLinks);
|
|
begin
|
|
FItemLinks.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.SetUseOwnFont(Value: Boolean);
|
|
begin
|
|
if FUseOwnFont <> Value then
|
|
begin
|
|
FUseOwnFont := Value;
|
|
FInternalFontChange := True;
|
|
try
|
|
if FUseOwnFont then
|
|
FontChanged(nil)
|
|
else
|
|
begin
|
|
Font := BarManager.Font;
|
|
DeleteObject(FEditFontHandle);
|
|
FEditFontHandle := 0;
|
|
end;
|
|
finally
|
|
FInternalFontChange := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.SetUseRecentItems(Value: Boolean);
|
|
begin
|
|
if FUseRecentItems <> Value then
|
|
begin
|
|
FUseRecentItems := Value;
|
|
FItemLinks.FUseRecentItems := Value;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.FontChanged(Sender: TObject);
|
|
begin
|
|
if not FInternalFontChange then
|
|
FUseOwnFont := True;
|
|
if FUseOwnFont then
|
|
CreateEditFontHandle(FFont, FEditFontHandle, False);
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.SubMenuCloseUp(Sender: TObject);
|
|
begin
|
|
FPopupMenuVisible := False;
|
|
if Assigned(FOnCloseUp) then FOnCloseUp(Self);
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.SubMenuPopup(Sender: TObject);
|
|
begin
|
|
FPopupMenuVisible := True;
|
|
if Assigned(FOnPopup) then FOnPopup(Self);
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.OwnerDesignerModified;
|
|
begin
|
|
if (csDesigning in ComponentState) and
|
|
([csLoading, csDestroying, csUpdating] * ComponentState = []) then
|
|
begin
|
|
BarManager.DesignerModified;
|
|
{$IFDEF DELPHI5}
|
|
if FindRootDesigner(Self) <> nil then
|
|
FindRootDesigner(Self).Modified;
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.DoPaintBar(Canvas: TCanvas; const R: TRect);
|
|
begin
|
|
if Assigned(FOnPaintBar) then FOnPaintBar(Self, Canvas, R);
|
|
end;
|
|
|
|
function TdxBarPopupMenu.IsShortCut(AShortCut: TShortCut): Boolean;
|
|
begin
|
|
Result := FItemLinks.IsShortCut(AShortCut);
|
|
end;
|
|
|
|
function TdxBarPopupMenu.IsShortCutKey(var Message: TWMKey): Boolean;
|
|
const
|
|
AltMask = $20000000;
|
|
var
|
|
AShortCut: TShortCut;
|
|
begin
|
|
AShortCut := Byte(Message.CharCode);
|
|
if AShortCut = 0 then
|
|
Result := False
|
|
else
|
|
begin
|
|
if GetKeyState(VK_SHIFT) < 0 then Inc(AShortCut, scShift);
|
|
if GetKeyState(VK_CONTROL) < 0 then Inc(AShortCut, scCtrl);
|
|
if Message.KeyData and AltMask <> 0 then Inc(AShortCut, scAlt);
|
|
Result := IsShortCut(AShortCut);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.Loaded;
|
|
begin
|
|
inherited;
|
|
FItemLinks.Loaded(True);
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.Popup(X, Y: Integer);
|
|
var
|
|
Msg: TMsg;
|
|
begin
|
|
if FItemLinks.BarControl <> nil then Exit;
|
|
if Owner is TCustomForm then
|
|
TCustomForm(Owner).SendCancelMode(nil)
|
|
else
|
|
BarManager.MainForm.SendCancelMode(nil);
|
|
if GetCapture <> 0 then
|
|
begin
|
|
SendMessage(GetCapture, CM_CANCELMODE, 0, 0);
|
|
ReleaseCapture;
|
|
end;
|
|
FItemLinks.CreateBarControl;
|
|
FItemLinks.BarControl.Left := X;
|
|
FItemLinks.BarControl.Top := Y;
|
|
with TdxBarSubMenuControl(FItemLinks.BarControl) do
|
|
begin
|
|
if Self.FOwnerBounds <> nil then
|
|
OwnerBounds := Self.FOwnerBounds^;
|
|
FOwnerControl := Self.FOwnerControl;
|
|
OwnerWidth := Self.FOwnerWidth;
|
|
OwnerHeight := Self.FOwnerHeight;
|
|
if Self.Owner is TWinControl then
|
|
ParentWnd := TWinControl(Self.Owner).Handle;
|
|
OnCloseUp := SubMenuCloseUp;
|
|
OnPopup := SubMenuPopup;
|
|
FShowAnimation := Self.FShowAnimation;
|
|
try
|
|
Show;
|
|
except
|
|
HideAll;
|
|
raise;
|
|
end;
|
|
|
|
if DontUseMessageLoop then Exit;
|
|
|
|
repeat
|
|
case Integer(GetMessage(Msg, 0, 0, 0)) of
|
|
-1: Break;
|
|
0: begin
|
|
PostQuitMessage(Msg.wParam);
|
|
Break;
|
|
end;
|
|
end;
|
|
if not FPopupMenuVisible then
|
|
with Msg do
|
|
PostMessage(hwnd, message, wParam, lParam)
|
|
else
|
|
if Msg.message = WM_COMMAND then // do nothing
|
|
else
|
|
begin
|
|
TranslateMessage(Msg);
|
|
DispatchMessage(Msg);
|
|
end;
|
|
until not FPopupMenuVisible;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.PopupEx(X, Y, AOwnerWidth, AOwnerHeight: Integer;
|
|
AShowAnimation: Boolean; AOwnerBounds: PRect);
|
|
begin
|
|
FOwnerWidth := AOwnerWidth;
|
|
FOwnerHeight := AOwnerHeight;
|
|
FShowAnimation := AShowAnimation;
|
|
FOwnerBounds := AOwnerBounds;
|
|
Popup(X, Y);
|
|
FOwnerWidth := 0;
|
|
FOwnerHeight := 0;
|
|
FShowAnimation := True;
|
|
end;
|
|
|
|
procedure TdxBarPopupMenu.PopupFromCursorPos;
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
GetCursorPos(P);
|
|
Popup(P.X, P.Y);
|
|
end;
|
|
|
|
{ TCustomdxBarControl }
|
|
|
|
constructor TCustomdxBarControl.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
AddBarControl(Self);
|
|
ControlStyle := ControlStyle - [csCaptureMouse];
|
|
UpdateControlStyle;
|
|
Color := clBtnFace;
|
|
FLastMousePos := Point(-1, -1);
|
|
FShadow := TdxBarShadow.Create(Self);
|
|
Visible := False;
|
|
SetBounds(100, 100, 30, 50);
|
|
FBackgroundTempBitmap := TBitmap.Create;
|
|
end;
|
|
|
|
destructor TCustomdxBarControl.Destroy;
|
|
begin
|
|
if Self is TdxBarControl then
|
|
TdxBarControl(Self).HideAll//BarLostFocus
|
|
else
|
|
IsActive := False;
|
|
if (BarManager <> nil) and (BarManager.FSelectedItem <> nil) and
|
|
(BarManager.FSelectedItem.Parent = Self) then
|
|
BarManager.FSelectedItem := nil;
|
|
if FItemLinks <> nil then FItemLinks.FBarControl := nil;
|
|
if IsCustomizing and (Self is TdxBarSubMenuControl) then
|
|
begin
|
|
FSelectedItem := nil;
|
|
with TdxBarSubMenuControl(Self) do
|
|
if FSubItem <> nil then
|
|
with FSubItem do
|
|
begin
|
|
BarManager.FSelectedItem := FSubItem;
|
|
FIsActive := False;
|
|
Repaint;
|
|
end;
|
|
end;
|
|
RemoveBarControl(Self);
|
|
FShadow.Free;
|
|
FBackgroundTempBitmap.Free;
|
|
cxClearObjectLinks(Self);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetBarControlOwnerBrush: HBRUSH;
|
|
begin
|
|
Result := PainterClass.BarControlOwnerBrush(BarManager);
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetBarManager: TdxBarManager;
|
|
begin
|
|
Result := Owner as TdxBarManager;
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetFlat: Boolean;
|
|
begin
|
|
// TODO: obsolete
|
|
Result := BarManager.Flat;
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetIsDestroying: Boolean;
|
|
begin
|
|
Result := csDestroying in ComponentState;
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetOwnerLinkBounds(AOwnerPart: Boolean): TRect;
|
|
var
|
|
AOwnerBounds: TRect;
|
|
AFirstCase: Boolean;
|
|
|
|
procedure ConvertRects;
|
|
|
|
procedure ConvertRect(var R: TRect);
|
|
|
|
procedure ConvertPoint(var P: TPoint);
|
|
var
|
|
APrevX: Integer;
|
|
begin
|
|
with P do
|
|
begin
|
|
APrevX := X;
|
|
X := Y;
|
|
Y := APrevX;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
ConvertPoint(R.TopLeft);
|
|
ConvertPoint(R.BottomRight);
|
|
end;
|
|
|
|
begin
|
|
if not FShadow.Horizontal then
|
|
begin
|
|
ConvertRect(Result);
|
|
ConvertRect(AOwnerBounds);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if IsRectEmpty(FOwnerBounds) or not IsLinkedToOwner then
|
|
SetRectEmpty(Result)
|
|
else
|
|
begin
|
|
GetWindowRect(Result);
|
|
AOwnerBounds := FOwnerBounds;
|
|
with Result do
|
|
begin
|
|
OffsetRect(AOwnerBounds, -Left, -Top);
|
|
OffsetRect(Result, -Left, -Top);
|
|
ConvertRects;
|
|
|
|
AFirstCase := AOwnerBounds.Bottom = Top;
|
|
if AFirstCase then
|
|
Bottom := Top + 1
|
|
else
|
|
Top := Bottom - 1;
|
|
if AOwnerPart then
|
|
OffsetRect(Result, 0, -(2 * Ord(AFirstCase) - 1));
|
|
|
|
if Left < AOwnerBounds.Left + 1 then
|
|
Left := AOwnerBounds.Left + 1
|
|
else
|
|
Inc(Left);
|
|
if Right > AOwnerBounds.Right - 1 then
|
|
Right := AOwnerBounds.Right - 1
|
|
else
|
|
Dec(Right);
|
|
|
|
ConvertRects;
|
|
end;
|
|
if AOwnerPart then
|
|
OffsetRect(Result, Left, Top);
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetPainterClass: TdxBarItemControlPainterClass;
|
|
begin
|
|
Result := BarManager.PainterClass;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.SetDockControl(Value: TdxDockControl);
|
|
begin
|
|
FDockControl := Value;
|
|
UpdateDoubleBuffered; //!
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMCaptureChanged(var Message: TMessage);
|
|
begin
|
|
inherited;
|
|
if FDragDown then
|
|
begin
|
|
BarManager.FDraggingItem := nil;
|
|
BarManager.FDraggingItemLink := nil;
|
|
FDragDown := False;
|
|
end;
|
|
FClickedControl := nil;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMDestroy(var Message: TMessage);
|
|
begin
|
|
if not IsDestroying then
|
|
begin
|
|
FinishMouseTracking(Handle);
|
|
MarkState := msNone;
|
|
BeforeDestroyHandle;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMEraseBkgnd(var Message: TWMEraseBkgnd);
|
|
begin
|
|
// if FItemLinks.CanVisibleItemCount = 0 then // else Fill Rgn is called
|
|
// FillBackground(Message.DC, ClientRect, ToolbarBrush, clNone, True);
|
|
Message.Result := 1;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMKeyDown(var Message: TWMKeyDown);
|
|
var
|
|
Key: Word;
|
|
IsTabKey, Duplicate, Hidden: Boolean;
|
|
AItemLink, DuplicateItemLink: TdxBarItemLink;
|
|
ATabForward: Boolean;
|
|
begin
|
|
inherited;
|
|
if ActiveBarControl = nil then Exit;
|
|
|
|
Key := Message.CharCode;
|
|
|
|
if IsRealVertical(Self) then
|
|
begin
|
|
case Key of
|
|
VK_LEFT:
|
|
Key := VK_UP;
|
|
VK_RIGHT:
|
|
Key := VK_DOWN;
|
|
VK_UP:
|
|
Key := VK_LEFT;
|
|
VK_DOWN:
|
|
Key := VK_RIGHT;
|
|
end;
|
|
Message.CharCode := Key;
|
|
end;
|
|
|
|
if Self is TdxBarSubMenuControl then
|
|
case Key of
|
|
VK_LEFT, VK_RIGHT:
|
|
Key := 0;
|
|
VK_UP:
|
|
Key := VK_LEFT;
|
|
VK_DOWN:
|
|
Key := VK_RIGHT;
|
|
end;
|
|
IsTabKey := Key = VK_TAB;
|
|
ATabForward := False;
|
|
if IsTabKey then
|
|
begin
|
|
if GetKeyState(VK_CONTROL) < 0 then
|
|
ATabForward := not (GetKeyState(VK_SHIFT) < 0)
|
|
else
|
|
if GetKeyState(VK_SHIFT) < 0 then
|
|
Key := VK_LEFT
|
|
else
|
|
Key := VK_RIGHT;
|
|
end;
|
|
|
|
case Key of
|
|
VK_TAB: // + Ctrl
|
|
FocusNextBarControl(ATabForward);
|
|
VK_F10, VK_MENU:
|
|
if (Key = VK_MENU) or BarManager.UseF10ForMenu then
|
|
begin
|
|
Message.CharCode := 0;
|
|
HideAll;
|
|
end;
|
|
VK_LEFT:
|
|
begin
|
|
if FSelectedItem = nil then
|
|
AItemLink := ItemLinks.First
|
|
else
|
|
AItemLink := ItemLinks.Prev(FSelectedItem.ItemLink);
|
|
if AItemLink <> nil then SetKeySelectedItem(AItemLink.Control);
|
|
if IsTabKey and (SelectedItem is TdxBarWinControl) then
|
|
SelectedItem.Click(False);
|
|
end;
|
|
VK_RIGHT:
|
|
begin
|
|
if FSelectedItem = nil then
|
|
AItemLink := ItemLinks.First
|
|
else
|
|
AItemLink := ItemLinks.Next(FSelectedItem.ItemLink);
|
|
if AItemLink <> nil then SetKeySelectedItem(AItemLink.Control);
|
|
if IsTabKey and (SelectedItem is TdxBarWinControl) then
|
|
SelectedItem.Click(False);
|
|
end;
|
|
VK_HOME:
|
|
begin
|
|
AItemLink := ItemLinks.First;
|
|
if AItemLink <> nil then SetKeySelectedItem(AItemLink.Control);
|
|
end;
|
|
VK_END:
|
|
begin
|
|
AItemLink := ItemLinks.Last;
|
|
if AItemLink <> nil then SetKeySelectedItem(AItemLink.Control);
|
|
end;
|
|
else
|
|
begin
|
|
Key := MapVirtualKey(Key, 2);
|
|
if ((Ord('A') <= Key) and (Key <= Ord('Z'))) or (Ord('0') <= Key) and (Key <= Ord('9')) then
|
|
with ItemLinks do
|
|
begin
|
|
if SelectedItem = nil then AItemLink := nil
|
|
else AItemLink := SelectedItem.ItemLink;
|
|
AItemLink := FindItemWithAccel(Key, KeyDataToShiftState(Message.KeyData), AItemLink);
|
|
if (AItemLink <> nil) and AItemLink.Item.Enabled then
|
|
begin
|
|
Duplicate := False;
|
|
DuplicateItemLink := AItemLink;
|
|
repeat
|
|
Hidden := DuplicateItemLink.VisibleIndex = -1;
|
|
DuplicateItemLink :=
|
|
FindItemWithAccel(Key, KeyDataToShiftState(Message.KeyData), DuplicateItemLink);
|
|
if DuplicateItemLink = AItemLink then Break;
|
|
Duplicate := True;
|
|
until Hidden;
|
|
if (BarManager.GetPaintStyle <> bmsStandard) and (Self is TdxBarSubMenuControl) and // ???
|
|
(Duplicate and Hidden or
|
|
not Duplicate and not AItemLink.Control.IsDestroyOnClick and Hidden) then
|
|
MarkState := msPressed;
|
|
SetKeySelectedItem(AItemLink.Control);
|
|
if not Duplicate then SendMessage(Handle, WM_KEYDOWN, VK_RETURN, 0);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMLButtonDblClk(var Message: TWMLButtonDblClk);
|
|
var
|
|
P: TPoint;
|
|
Item: TdxBarItemControl;
|
|
begin
|
|
inherited;
|
|
if SelectedItem <> nil then
|
|
begin
|
|
P := SmallPointToPoint(Message.Pos);
|
|
if PtInRect(ClientRect, P) then
|
|
begin
|
|
Item := ItemAtPos(P);
|
|
if Item = SelectedItem then
|
|
begin
|
|
{if Item.HasWindow and not PtInRect(TdxBarWinControl(Item).WindowRect, P) then
|
|
begin
|
|
MapWindowPoints(Handle, TdxBarWinControl(Item).Handle, P, 1);
|
|
SendMessage(TdxBarWinControl(Item).Handle,
|
|
WM_LBUTTONDBLCLK, Message.Keys, MakeLParam(P.X, P.Y));
|
|
end;}
|
|
if Item.WantsDblClick then
|
|
DblClickOnItem(Item)
|
|
else
|
|
with TMessage(Message) do
|
|
Result := SendMessage(Handle, WM_LBUTTONDOWN, wParam, lParam);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMLButtonDown(var Message: TWMLButtonDown);
|
|
var
|
|
P: TPoint;
|
|
Item: TdxBarItemControl;
|
|
ABarButtonControl: TdxBarButtonControl;
|
|
begin
|
|
if FIgnoreMouseClick or (ItemLinks.VisibleItemCount = 0) then Exit;
|
|
|
|
inherited;
|
|
P.X := Message.XPos;
|
|
P.Y := Message.YPos;
|
|
Item := nil;
|
|
if PtInRect(ClientRect, P) then
|
|
begin
|
|
Item := ItemAtPos(P);
|
|
if (Item <> nil) and
|
|
(not IsCustomizing and (not Item.Enabled or not Item.WantMouse)) then
|
|
Item := nil;
|
|
end;
|
|
if IsCustomizing then
|
|
if (Item = nil) or Item.CanCustomize then {1}
|
|
begin
|
|
if not ((Item = nil) and PtInRect(ClientRect, P)) then
|
|
begin
|
|
if (Item <> nil) and (Item = SelectedItem) then
|
|
begin
|
|
if Item.IsActive then
|
|
Item.ControlInactivate(True)
|
|
else
|
|
Item.ControlActivate(True);
|
|
BarManager.SelectedItem := Item;
|
|
Item.Repaint;
|
|
end;
|
|
SetMouseSelectedItem(Item);
|
|
end;
|
|
|
|
if Item <> nil then
|
|
begin
|
|
FDragPoint := P;
|
|
BarManager.FDraggingItem := Item.ItemLink.Item;
|
|
BarManager.FDraggingItemLink := Item.ItemLink;
|
|
FDragDown := True;
|
|
SetCapture(Handle);
|
|
end;
|
|
end
|
|
else
|
|
else
|
|
if (Item <> nil) and Item.Enabled then
|
|
begin
|
|
SetKeySelectedItem(Item);
|
|
if FSelectedItem is TdxBarButtonControl then
|
|
TdxBarButtonControl(FSelectedItem).FShowAnimation := True;
|
|
if FSelectedItem is TdxBarSubItemControl then
|
|
TdxBarSubItemControl(FSelectedItem).FShowAnimation := True;
|
|
Item.ControlClick(True);
|
|
if not ItemExists(Item) then Exit;
|
|
if FSelectedItem is TdxBarButtonControl then
|
|
begin
|
|
ABarButtonControl := TdxBarButtonControl(FSelectedItem);
|
|
ABarButtonControl.FShowAnimation := False;
|
|
// ***
|
|
// if (ABarButtonControl.Item.FDropDownMenu <> nil) and
|
|
// (ABarButtonControl.Item.FDropDownMenu.SubMenuControl <> nil) then
|
|
// ABarButtonControl.Item.FDropDownMenu.SubMenuControl.ParentBar := Self;
|
|
end;
|
|
if (Self is TdxBarControl) and
|
|
(FSelectedItem <> nil) and FSelectedItem.NeedCaptureMouse then
|
|
begin
|
|
FClickedControl := Item;
|
|
FMouseOverClickedControl := True;
|
|
SetCapture(Handle);
|
|
Item.Repaint;
|
|
end;
|
|
if Item.HasWindow and not PtInRect(TdxBarWinControl(Item).WindowRect, P) then
|
|
begin
|
|
MapWindowPoints(Handle, TdxBarWinControl(Item).Handle, P, 1);
|
|
SendMessage(TdxBarWinControl(Item).Handle,
|
|
WM_LBUTTONDOWN, Message.Keys, MakeLParam(P.X, P.Y));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMLButtonUp(var Message: TWMLButtonUp);
|
|
var
|
|
P: TPoint;
|
|
Item, AClickedControl: TdxBarItemControl;
|
|
begin
|
|
if FIgnoreMouseClick then
|
|
begin
|
|
FIgnoreMouseClick := False;
|
|
Exit;
|
|
end;
|
|
|
|
inherited;
|
|
if FDragDown then
|
|
ReleaseCapture
|
|
else
|
|
begin
|
|
P.X := Message.XPos;
|
|
P.Y := Message.YPos;
|
|
AClickedControl := FClickedControl;
|
|
if AClickedControl <> nil then ReleaseCapture;
|
|
if PtInRect(ClientRect, P) and IsActive then
|
|
begin
|
|
Item := ItemAtPos(P);
|
|
if not IsCustomizing and (Item <> nil) and Item.WantMouse then
|
|
if Item.Enabled and (Item = SelectedItem) then
|
|
begin
|
|
if Item.HasWindow then
|
|
begin
|
|
MapWindowPoints(Handle, TdxBarWinControl(Item).Handle, P, 1);
|
|
SendMessage(TdxBarWinControl(Item).Handle,
|
|
WM_LBUTTONUP, Message.Keys, MakeLParam(P.X, P.Y));
|
|
end;
|
|
Item.ControlUnclick(True);
|
|
end
|
|
else
|
|
if not Item.Enabled and (Item <> SelectedItem) and (Self is TdxBarControl) and
|
|
not ((SelectedItem is TdxBarButtonControl) and
|
|
TdxBarButtonControl(SelectedItem).DroppedDown) then
|
|
TdxBarControl(Self).HideAll;//BarLostFocus;
|
|
end;
|
|
if (AClickedControl <> nil) and BarControlExists(Self) then
|
|
HideAll;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMMouseActivate(var Message: TWMMouseActivate);
|
|
begin
|
|
inherited;
|
|
Message.Result := MA_NOACTIVATE;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMMouseLeave(var Message: TMessage);
|
|
begin
|
|
if MarkState = msSelected then MarkState := msNone;
|
|
inherited;
|
|
if (ChildBar = nil) and not IsCustomizing and
|
|
not ((SelectedItem is TdxBarButtonControl) and
|
|
TdxBarButtonControl(SelectedItem).DroppedDown) then
|
|
SetMouseSelectedItem(nil);
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMMouseMove(var Message: TWMMouseMove);
|
|
const
|
|
dXY = 2;
|
|
var
|
|
P: TPoint;
|
|
Item: TdxBarItemControl;
|
|
PrevMouseOverClickedControl, FocusedControlExists: Boolean;
|
|
|
|
function WantClientMouse: Boolean;
|
|
begin
|
|
Result := PtInRect(ClientRect, SmallPointToPoint(Message.Pos));
|
|
end;
|
|
|
|
function DragRect: TRect;
|
|
begin
|
|
Result := Bounds(0, 0, GetSystemMetrics(SM_CXDRAG), GetSystemMetrics(SM_CYDRAG));
|
|
with Result, FDragPoint do
|
|
OffsetRect(Result, X - Right div 2, Y - Bottom div 2);
|
|
end;
|
|
|
|
begin
|
|
if FDestroyFlag then Exit;
|
|
|
|
with Message do P := Point(XPos, YPos);
|
|
|
|
if FClickedControl <> nil then
|
|
begin
|
|
Item := ItemAtPos(P);
|
|
PrevMouseOverClickedControl := FMouseOverClickedControl;
|
|
FMouseOverClickedControl := Item = FClickedControl;
|
|
if FMouseOverClickedControl <> PrevMouseOverClickedControl then
|
|
FClickedControl.Repaint;
|
|
end;
|
|
|
|
if FDragDown and not PtInRect(DragRect, P) then
|
|
begin
|
|
FDragDown := False;
|
|
ReleaseCapture;
|
|
with BarManager do
|
|
begin
|
|
DraggingItemLink.Control.ControlInactivate(True);
|
|
DragAndDrop(DraggingItem, DraggingItemLink);
|
|
end;
|
|
Exit;
|
|
end;
|
|
|
|
if WantClientMouse then
|
|
begin
|
|
inherited;
|
|
if NotHandleMouseMove(P) then Exit;
|
|
FLastMousePos := P;
|
|
Windows.ClientToScreen(Handle, FLastMousePos);
|
|
Item := ItemAtPos(P);
|
|
|
|
FocusedControlExists := (BarManager.SelectedItem <> nil) and
|
|
(BarManager.SelectedItem is TdxBarWinControl) and
|
|
TdxBarWinControl(BarManager.SelectedItem).Focused;
|
|
|
|
if (ActiveBarControl = nil) or (ActiveBarControl = Self) then
|
|
if (Item <> nil) and (Item is TdxBarWinControl) and
|
|
PtInRect(TdxBarWinControl(Item).WindowRect, P) and
|
|
(not FocusedControlExists or (Item = BarManager.SelectedItem)) then
|
|
Cursor := crIBeam
|
|
else
|
|
Cursor := crDefault;
|
|
|
|
if FocusedControlExists then Exit;
|
|
|
|
if not MouseTracking(Handle) then
|
|
begin
|
|
StartMouseTracking(Handle);
|
|
if (Item <> nil) and (Item = SelectedItem) and (Item is TdxBarButtonControl) then
|
|
Item.Repaint;
|
|
end;
|
|
|
|
if (Item <> nil) and not Item.CanMouseSelect then Item := nil;
|
|
if (Self is TdxBarControl) and IsActive and (Item = nil) then Exit;
|
|
if FClickedControl <> nil then Exit;
|
|
|
|
if not ((Item = nil) and (SelectedItem <> nil) and
|
|
(SelectedItem is TdxBarSubItemControl) and
|
|
(TdxBarSubItemControl(SelectedItem).SubMenuControl <> nil)) then
|
|
SetMouseSelectedItem(Item);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMNCHitTest(var Message: TWMNCHitTest);
|
|
begin
|
|
inherited;
|
|
if CanFinishMouseTracking(Message) then FinishMouseTracking(Handle);
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMRButtonDown(var Message: TWMRButtonDown);
|
|
var
|
|
P: TPoint;
|
|
Item: TdxBarItemControl;
|
|
AItemLink: TdxBarItemLink;
|
|
begin
|
|
inherited;
|
|
if not IsCustomizing then Exit;
|
|
if SelectedItem <> nil then SelectedItem.ControlInactivate(True);
|
|
P.X := Message.XPos;
|
|
P.Y := Message.YPos;
|
|
if PtInRect(ClientRect, P) then
|
|
begin
|
|
Item := ItemAtPos(P);
|
|
if Item <> nil then
|
|
begin
|
|
if Item = SelectedItem then
|
|
begin
|
|
BarManager.SelectedItem := Item;
|
|
Item.Repaint;
|
|
end;
|
|
SetKeySelectedItem(Item);
|
|
end;
|
|
if (Item <> nil) or BarManager.Designing then
|
|
begin
|
|
P := ClientToScreen(P);
|
|
if Item <> nil then
|
|
AItemLink := Item.ItemLink
|
|
else
|
|
AItemLink := nil;
|
|
CustomizedPopup := TdxBarCustomizingPopup.CreateEx(BarManager, ItemLinks, AItemLink);
|
|
with CustomizedPopup do
|
|
begin
|
|
Left := P.X;
|
|
Top := P.Y;
|
|
Show;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMRepaintBar(var Message: TMessage);
|
|
begin
|
|
RepaintBar;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMSetCursor(var Message: TWMSetCursor);
|
|
begin
|
|
with Message do
|
|
if (HitTest = HTCLIENT) and (CursorWnd = Handle) then
|
|
begin
|
|
Windows.SetCursor(Screen.Cursors[Cursor]);
|
|
Result := 1;
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMSize(var Message: TWMSize);
|
|
begin
|
|
// ResetBackground;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WMWindowPosChanged(var Message: TWMWindowPosChanged);
|
|
begin
|
|
inherited;
|
|
with Message.WindowPos^ do
|
|
if (flags and SWP_NOSIZE = 0) or (flags and SWP_NOMOVE = 0) then
|
|
ResizeShadow;
|
|
FShadow.Visible := IsShadowVisible;
|
|
ResetBackground;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.AdjustSize;
|
|
begin
|
|
// do nothing
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.CreateWindowHandle(const Params: TCreateParams);
|
|
begin
|
|
inherited;
|
|
CreateControls;
|
|
SetLayeredAttributes;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.CreateWnd;
|
|
begin
|
|
inherited;
|
|
SetFont;
|
|
CalcDrawingConsts;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.DestroyWindowHandle;
|
|
begin
|
|
if WindowHandle <> 0 then BeforeDestroyHandle;
|
|
DestroyControls;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.CreateControls;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FItemLinks <> nil then
|
|
for I := 0 to FItemLinks.CanVisibleItemCount - 1 do
|
|
FItemLinks.CanVisibleItems[I].CreateControl;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.DestroyControls;
|
|
var
|
|
I: Integer;
|
|
PrevDestroyFlag: Boolean;
|
|
begin
|
|
if FItemLinks <> nil then
|
|
begin
|
|
PrevDestroyFlag := FDestroyFlag;
|
|
FDestroyFlag := True;
|
|
for I := 0 to FItemLinks.CanVisibleItemCount - 1 do
|
|
FItemLinks.CanVisibleItems[I].DestroyControl;
|
|
FDestroyFlag := PrevDestroyFlag;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.WndProc(var Message: TMessage);
|
|
|
|
function ProcessMouseMessage: Boolean;
|
|
var
|
|
AControl: TCustomdxBarControl;
|
|
begin
|
|
Result := True;
|
|
AControl := ActiveBarControl;
|
|
while AControl <> nil do
|
|
begin
|
|
if AControl = Self then Exit;
|
|
AControl := AControl.ParentBar;
|
|
end;
|
|
Result := False;
|
|
end;
|
|
{
|
|
function IsEditAndReadOnly: Boolean;
|
|
begin
|
|
Result := (SelectedItem <> nil) and (SelectedItem is TdxBarEditControl) and
|
|
TdxBarEditControl(SelectedItem).ReadOnly;
|
|
end;
|
|
}
|
|
begin
|
|
if (Message.Msg = WM_CTLCOLOREDIT) or ((Message.Msg = WM_CTLCOLORSTATIC){ and IsEditAndReadOnly}) then
|
|
begin
|
|
SetTextColor(Message.wParam, GetSysColor(COLOR_WINDOWTEXT));
|
|
SetBkColor(Message.wParam, GetSysColor(COLOR_WINDOW));
|
|
Message.Result := GetSysColorBrush(COLOR_WINDOW);
|
|
Exit;
|
|
end;
|
|
|
|
if (Message.Msg = WM_KILLFOCUS) and (Message.wParam = 0) then
|
|
begin
|
|
inherited;
|
|
HideAll;
|
|
Exit;
|
|
end;
|
|
|
|
if Message.Msg = WM_NCACTIVATE then
|
|
begin
|
|
if (Message.wParam = Longint(True)) and not BarManager.IsCustomizing then
|
|
SendMessage(GetParent(Handle), WM_NCACTIVATE, Longint(True), 0);
|
|
Message.wParam := Longint(True);
|
|
end;
|
|
|
|
if (Message.Msg = WM_SETFOCUS) and not (SelectedItem is TdxBarWinControl) then
|
|
begin
|
|
if IsCustomizing and (dxBarCustomizingForm <> nil) then
|
|
begin
|
|
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
|
|
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
Windows.SetFocus(dxBarCustomizingForm.Handle);
|
|
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0,
|
|
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
end
|
|
else
|
|
if IsWindowVisible(BarManager.MainForm.Handle) then
|
|
Windows.SetFocus(BarManager.MainForm.Handle)
|
|
else
|
|
Windows.SetFocus(GetNextWindow(BarManager.MainForm.Handle, GW_HWNDNEXT));
|
|
Exit;
|
|
end;
|
|
|
|
with Message do
|
|
if ((Msg >= WM_MOUSEFIRST) and (Msg <= WM_MOUSELAST) or
|
|
(Msg >= WM_NCMOUSEMOVE) and (Msg <= WM_NCMBUTTONDBLCLK)) and
|
|
(ActiveBarControl <> nil) and not ProcessMouseMessage then
|
|
Exit;
|
|
|
|
inherited;
|
|
with Message do
|
|
case Msg of
|
|
WM_COMMAND:
|
|
if (Result = 0) and (HiWord(wParam) = EN_CHANGE) and (lParam <> 0) then
|
|
Result := SendMessage(lParam, Msg, wParam, lParam);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.BeforeDestroyHandle;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to ItemLinks.CanVisibleItemCount - 1 do
|
|
with ItemLinks.CanVisibleItems[I] do
|
|
if Control <> nil then Control.BeforeDestroyParentHandle;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.CalcDrawingConsts;
|
|
var
|
|
Size: TSize;
|
|
DC: HDC;
|
|
PrevFont: HFONT;
|
|
begin
|
|
GetTextExtentPoint32(Canvas.Handle, '0', 1, Size);
|
|
FTextSize := Size.cY + 6;
|
|
|
|
FMenuArrowHeight := FTextSize div 5;
|
|
if FMenuArrowHeight < 4 then FMenuArrowHeight := 4;
|
|
|
|
DC := GetDC(0);
|
|
PrevFont := SelectObject(DC, EditFontHandle);
|
|
GetTextExtentPoint32(DC, '0', 1, Size);
|
|
SelectObject(DC, PrevFont);
|
|
FEditTextSize := PainterClass.EditTextSize(Self, DC, Size.cy);
|
|
FComboBoxArrowWidth := PainterClass.ComboBoxArrowWidth(Self, DC, Size.cX);
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
function TCustomdxBarControl.CanAlignControl(AControl: TdxBarItemControl): Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TCustomdxBarControl.CanCallInheritedNCCalcSize: Boolean; // obsolete
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TCustomdxBarControl.CanCustomizing: Boolean;
|
|
begin
|
|
Result := BarManager.Designing;
|
|
end;
|
|
|
|
function TCustomdxBarControl.CanFinishMouseTracking(const Message: TWMNCHitTest): Boolean;
|
|
begin
|
|
Result := Message.Result <> HTCLIENT;
|
|
end;
|
|
|
|
function TCustomdxBarControl.ChildrenHaveShadows: Boolean;
|
|
begin
|
|
Result := PainterClass.BarChildrenHaveShadows(Self);
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.DblClickOnItem(Item: TdxBarItemControl);
|
|
begin
|
|
if BarManager.Designing then
|
|
dxBarDesigner.ShowDefaultEventHandler(Item.Item)
|
|
else
|
|
if Item.IsExpandable then
|
|
with TCustomdxBarSubItem(Item.Item).ItemLinks do
|
|
if (BarControl <> nil) and BarControl.MarkExists then
|
|
BarControl.MarkState := msPressed
|
|
else
|
|
else
|
|
Item.DblClick;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.DrawSelectedItem(AControl: TdxBarItemControl);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
if IsCustomizing and
|
|
(not BarManager.Dragging and (SelectedItem = AControl) and (BarManager.SelectedItem = AControl) or
|
|
BarManager.Dragging and (AControl.ItemLink = BarManager.DraggingItemLink)) then
|
|
with Canvas, R do
|
|
begin
|
|
R := AControl.ItemLink.ItemRect;
|
|
if (AControl is TdxBarSubItemControl) and (Self is TdxBarSubMenuControl) then
|
|
begin
|
|
Dec(Right);
|
|
Dec(Bottom);
|
|
Pen.Mode := pmNot;
|
|
Polyline([Point(Left, Top), Point(Right, Top), Point(Right, Bottom),
|
|
Point(Left, Bottom), Point(Left, Top)]);
|
|
InflateRect(R, -1, -1);
|
|
Polyline([Point(Left, Top), Point(Right, Top), Point(Right, Bottom),
|
|
Point(Left, Bottom), Point(Left, Top)]);
|
|
Pen.Mode := pmCopy;
|
|
end
|
|
else
|
|
begin
|
|
Windows.FrameRect(Handle, R, GetSysColorBrush(COLOR_WINDOWTEXT));
|
|
InflateRect(R, -1, -1);
|
|
Windows.FrameRect(Handle, R, GetSysColorBrush(COLOR_WINDOWTEXT));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.FocusNextBarControl(AForward: Boolean);
|
|
var
|
|
APrevBarControl: TCustomdxBarControl;
|
|
AIndex, APrevIndex: Integer;
|
|
ABar: TdxBar;
|
|
begin
|
|
APrevBarControl := GetParentBarForBar(Self);
|
|
if APrevBarControl is TdxBarControl then
|
|
begin
|
|
ABar := TdxBarControl(APrevBarControl).Bar;
|
|
APrevIndex := ABar.Index;
|
|
repeat
|
|
AIndex := ABar.Index;
|
|
if AForward then
|
|
begin
|
|
Inc(AIndex);
|
|
if AIndex >= ABar.Bars.Count then
|
|
AIndex := 0;
|
|
end
|
|
else
|
|
begin
|
|
Dec(AIndex);
|
|
if AIndex < 0 then
|
|
AIndex := ABar.Bars.Count - 1;
|
|
end;
|
|
if AIndex = APrevIndex then
|
|
Break;
|
|
ABar := ABar.Bars[AIndex];
|
|
if (ABar.Control <> nil) and (ABar.ItemLinks.First <> nil) then
|
|
begin
|
|
TdxBarControl(APrevBarControl).BarLostFocus;
|
|
ABar.Control.BarGetFocus(ABar.ItemLinks.First.Control);
|
|
Break;
|
|
end;
|
|
until False;
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetEditFontHandle: HFONT;
|
|
begin
|
|
Result := BarManager.FEditFontHandle;
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetFullItemRect(Item: TdxBarItemControl): TRect;
|
|
begin
|
|
Result := GetItemRect(Item);
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetIsCustomizing;
|
|
begin
|
|
Result := BarManager.IsCustomizing;
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetIsShadowVisible: Boolean;
|
|
begin
|
|
Result := HasShadow and IsWindowVisible(Handle);
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetItemRect(Item: TdxBarItemControl): TRect;
|
|
begin
|
|
if Item = nil then
|
|
SetRectEmpty(Result)
|
|
else
|
|
Result := Item.ItemLink.ItemRect;
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetItemRectEx(Item: TdxBarItemControl;
|
|
IsBeginGroup: Boolean): TRect;
|
|
begin
|
|
Result := GetItemRect(Item);
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetItemRegion(Item: TdxBarItemControl): HRGN;
|
|
begin
|
|
Result := CreateRectRgnIndirect(GetItemRectEx(Item, True));
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetItemScreenRect(Item: TdxBarItemControl): TRect;
|
|
begin
|
|
Result := GetItemRect(Item);
|
|
MapWindowPoints(Handle, 0, Result, 2);
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetOwnerControl: TWinControl;
|
|
begin
|
|
if not IsRectEmpty(FOwnerBounds) then
|
|
Result := FOwnerControl
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetToolbarBrush: HBRUSH;
|
|
begin
|
|
Result := PainterClass.BarToolbarBrush(Self);
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetToolbarDownedBrush: HBRUSH;
|
|
begin
|
|
Result := PainterClass.BarToolbarDownedBrush(Self);
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetToolbarDownedSelBrush: HBRUSH;
|
|
begin
|
|
Result := PainterClass.BarToolbarDownedSelBrush(Self);
|
|
end;
|
|
|
|
function TCustomdxBarControl.GetToolbarSelBrush: HBRUSH;
|
|
begin
|
|
Result := PainterClass.BarToolbarSelBrush(Self);
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.GetWindowRect(var R: TRect);
|
|
begin
|
|
Windows.GetWindowRect(Handle, R);
|
|
end;
|
|
|
|
function TCustomdxBarControl.HasShadow: Boolean;
|
|
begin
|
|
Result := PainterClass.BarHasShadow(Self);
|
|
end;
|
|
|
|
function TCustomdxBarControl.HideOnClick: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TCustomdxBarControl.IsChildBar(Value: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := False;
|
|
while Value.ParentBar <> nil do
|
|
begin
|
|
Value := Value.ParentBar;
|
|
if Self = Value then
|
|
begin
|
|
Result := True;
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxBarControl.IsLinkedToOwner: Boolean;
|
|
var
|
|
R1, R2: TRect;
|
|
begin
|
|
R1 := FOwnerBounds;
|
|
R2 := BoundsRect;
|
|
Result :=
|
|
((R1.Bottom = R2.Top) or (R1.Top = R2.Bottom)) and
|
|
(R1.Left < R2.Right) and (R1.Right > R2.Left) or
|
|
((R1.Right = R2.Left) or (R1.Left = R2.Right)) and
|
|
(R1.Top < R2.Bottom) and (R1.Bottom > R2.Top);
|
|
end;
|
|
|
|
function TCustomdxBarControl.ItemAtPos(Pos: TPoint): TdxBarItemControl;
|
|
var
|
|
I: Integer;
|
|
ItemLink: TdxBarItemLink;
|
|
begin
|
|
if IsCustomizing and not CanCustomizing then
|
|
Result := nil
|
|
else
|
|
begin
|
|
Result := nil;
|
|
for I := 0 to ItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
ItemLink := ItemLinks.VisibleItems[I];
|
|
if PtInRect(ItemLink.ItemRect, Pos) then
|
|
begin
|
|
//if ItemLink.Control.CanSelect then {1}
|
|
Result := ItemLink.Control;
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxBarControl.ItemAtPosEx(Pos: TPoint;
|
|
var IsBeginGroup, IsFirstPart, IsVerticalDirection: Boolean): TdxBarItemControl;
|
|
var
|
|
CalcVerticalDirection: Boolean;
|
|
I: Integer;
|
|
Control: TdxBarItemControl;
|
|
Rgn: HRGN;
|
|
R: TRect;
|
|
begin
|
|
Result := nil;
|
|
IsVerticalDirection :=
|
|
IsRealVertical(Self) or (Self is TdxBarSubMenuControl);
|
|
CalcVerticalDirection := IsVerticalDirection;
|
|
for I := 0 to FItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
Control := FItemLinks.VisibleItems[I].Control;
|
|
if Control.CanCustomize then
|
|
begin
|
|
Rgn := GetItemRegion(Control);
|
|
if PtInRegion(Rgn, Pos.X, Pos.Y) then
|
|
begin
|
|
Result := Control;
|
|
R := GetFullItemRect(Result);
|
|
IsBeginGroup := not PtInRect(R, Pos);
|
|
if IsBeginGroup then
|
|
begin
|
|
if Pos.Y < R.Top then CalcVerticalDirection := True;
|
|
R := Result.FBeginGroupRect;
|
|
end;
|
|
if CalcVerticalDirection then
|
|
IsFirstPart := (Pos.Y - R.Top) < (R.Bottom - Pos.Y)
|
|
else
|
|
IsFirstPart := (Pos.X - R.Left) < (R.Right - Pos.X);
|
|
DeleteObject(Rgn);
|
|
Break;
|
|
end;
|
|
DeleteObject(Rgn);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxBarControl.ItemExists(Item: TdxBarItemControl): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := True;
|
|
for I := 0 to ItemLinks.Count - 1 do
|
|
if ItemLinks[I].Control = Item then Exit;
|
|
Result := False;
|
|
end;
|
|
|
|
function TCustomdxBarControl.MarkExists: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TCustomdxBarControl.NotHandleMouseMove(P: TPoint): Boolean;
|
|
begin
|
|
Windows.ClientToScreen(Handle, P);
|
|
Result := IsCustomizing or (FLastMousePos.X = P.X) and (FLastMousePos.Y = P.Y);
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.PaintItem(AControl: TdxBarItemControl);
|
|
begin
|
|
FBkBrush := ToolbarBrush;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.PaintSelectedItem(OldSelectedItem: TdxBarItemControl);
|
|
begin
|
|
if FDestroyFlag then Exit;
|
|
FInRepaint := True;
|
|
try
|
|
if (OldSelectedItem <> nil) and (OldSelectedItem.ItemLink.Item <> nil) and
|
|
not OldSelectedItem.ItemLink.Item.IsDestroying then
|
|
PaintItem(OldSelectedItem);
|
|
// FInRepaint := True;
|
|
if FSelectedItem <> nil then PaintItem(FSelectedItem);
|
|
finally
|
|
FInRepaint := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.ResizeShadow;
|
|
var
|
|
R: TRect;
|
|
begin
|
|
if IsLinkedToOwner then
|
|
R := FOwnerBounds
|
|
else
|
|
SetRectEmpty(R);
|
|
FShadow.SetOwnerBounds(R, BoundsRect);
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.SetIsActive(Value: Boolean);
|
|
begin
|
|
BarManager.HintActivate(False, '');
|
|
if FIsActive <> Value then
|
|
begin
|
|
FIsActive := Value;
|
|
if FIsActive then
|
|
begin
|
|
if FActiveBarControl = nil then ShowFullMenus := IsCustomizing;
|
|
FPrevActiveBarControl := FActiveBarControl;
|
|
FActiveBarControl := Self;
|
|
if not IsCustomizing then ItemLinks.InitiateActions;
|
|
end
|
|
else
|
|
begin
|
|
if IsCustomizing then
|
|
FSelectedItem := nil
|
|
else
|
|
SetKeySelectedItem(nil);
|
|
if FActiveBarControl = Self then
|
|
FActiveBarControl := FPrevActiveBarControl;
|
|
if (FActiveBarControl <> nil) and
|
|
(not BarControlExists(FActiveBarControl) or not FActiveBarControl.IsActive) then
|
|
FActiveBarControl := nil;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxBarControl.SelectedItemWantsKey(Key: Word): Boolean;
|
|
begin
|
|
Result := (SelectedItem <> nil) and SelectedItem.Enabled and
|
|
SelectedItem.WantsKey(Key);
|
|
if Result then SelectedItem.KeyDown(Key);
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.SetCursorForMoving(AMoving: Boolean);
|
|
const
|
|
Cursors: array[Boolean] of TCursor = (crDefault, crSizeAll);
|
|
begin
|
|
Cursor := Cursors[AMoving];
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.SetDockingStyle(Value: TdxBarDockingStyle);
|
|
begin
|
|
if FDockingStyle <> Value then
|
|
begin
|
|
FDockingStyle := Value;
|
|
ResetBackground;
|
|
Perform(CM_FONTCHANGED, 0, 0);
|
|
SetLayeredAttributes;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.SetKeySelectedItem(Value: TdxBarItemControl);
|
|
begin
|
|
if FSelectedItem <> Value then
|
|
begin
|
|
if (FSelectedItem <> nil) and FSelectedItem.IsActive then
|
|
FSelectedItem.ControlInactivate(True);
|
|
if not BarControlExists(Self) then Exit;
|
|
if Value is TdxBarSubItemControl then
|
|
TdxBarSubItemControl(Value).FShowAnimation := False;
|
|
if Value <> nil then Value.FSelectedByMouse := False;
|
|
SelectedItem := Value;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.SetLayeredAttributes;
|
|
begin
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.SetMouseSelectedItem(Value: TdxBarItemControl);
|
|
begin
|
|
if not HandleAllocated then Exit;
|
|
if (FSelectedItem <> Value) and not ((FSelectedItem <> nil) and
|
|
FSelectedItem.HasWindow and TdxBarWinControl(FSelectedItem).Focused) then
|
|
begin
|
|
if (FSelectedItem <> nil) and FSelectedItem.IsActive then
|
|
FSelectedItem.ControlInactivate(False);
|
|
if Value <> nil then Value.FSelectedByMouse := True;
|
|
SelectedItem := Value;
|
|
if not BarControlExists(Self) then Exit;
|
|
if FSelectedItem <> nil then
|
|
begin
|
|
if FSelectedItem is TdxBarSubItemControl then
|
|
with TCustomdxBarSubItem(FSelectedItem.ItemLink.Item) do
|
|
if BarManager.Dragging and not CanContainItem(BarManager.DraggingItem) then
|
|
Exit
|
|
else
|
|
TdxBarSubItemControl(FSelectedItem).FShowAnimation := True;
|
|
FSelectedItem.ControlActivate(False);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.SetSelectedItem(Value: TdxBarItemControl);
|
|
var
|
|
OldSelectedItem: TdxBarItemControl;
|
|
AParentBar: TCustomdxBarControl;
|
|
begin
|
|
if FSelectedItem <> Value then
|
|
begin
|
|
if (QuickCustBar <> nil) and not QuickCustBar.IsActive and
|
|
(QuickCustBar <> Self) and (Value <> nil) then
|
|
StartHideQuickCustBar;
|
|
OldSelectedItem := FSelectedItem;
|
|
FSelectedItem := Value;
|
|
if IsCustomizing then
|
|
begin
|
|
BarManager.SelectedItem := Value;
|
|
if not BarControlExists(Self) then Exit;
|
|
end
|
|
else
|
|
if not BarManager.IsCustomizing then
|
|
BarManager.FSelectedItem := Value;
|
|
PaintSelectedItem(OldSelectedItem);
|
|
GetCursorPos(FLastMousePos);
|
|
if FSelectedItem = nil then Cursor := crDefault;
|
|
if (FSelectedItem <> nil) or
|
|
(Self is TdxBarSubMenuControl) or (TdxBarControl(Self).MarkState = msNone) then
|
|
BarManager.HintActivate(True, '');
|
|
// for Application.Hint:
|
|
if (FSelectedItem <> nil) and
|
|
(FSelectedItem.Enabled or BarManager.ShowHintForDisabledItems) then
|
|
Hint := GetLongHint(FSelectedItem.Hint)
|
|
else
|
|
Hint := '';
|
|
AParentBar := GetParentBarOrSubMenuForBar(Self);
|
|
if (AParentBar is TdxBarSubMenuControl) and
|
|
(AParentBar.ItemLinks.Owner is TdxBarPopupMenu) and
|
|
not TdxBarPopupMenu(AParentBar.ItemLinks.Owner).DontUseMessageLoop then
|
|
Application.Hint := Hint;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.UpdateControlStyle;
|
|
begin
|
|
if (BarManager.GetPaintStyle = bmsStandard) and not IsCustomizing then // ???
|
|
ControlStyle := ControlStyle - [csDoubleClicks]
|
|
else
|
|
ControlStyle := ControlStyle + [csDoubleClicks];
|
|
end;
|
|
|
|
function TCustomdxBarControl.WantMouse: Boolean;
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
GetCursorPos(P);
|
|
Result := WindowFromPointEx(P) = Handle;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.FillBackground(DC: HDC; ARect: TRect; ABrush: HBRUSH;
|
|
AColor: TColor; AIsClientArea: Boolean);
|
|
var
|
|
R: TRect;
|
|
ANCOffset: TPoint;
|
|
begin
|
|
// calc rect
|
|
R := ARect;
|
|
if AIsClientArea then
|
|
begin
|
|
ANCOffset := NCOffset;
|
|
OffsetRect(R, ANCOffset.X, ANCOffset.Y);
|
|
end;
|
|
// fill
|
|
if DockControl <> nil then
|
|
PainterClass.BarDrawDockedBackground(Self, DC, ARect, R, ABrush, AColor)
|
|
else
|
|
PainterClass.BarDrawFloatingBackground(Self, DC, ARect, R, ABrush, AColor)
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.FillBackgroundRgn(DC: HDC; ARgn: HRGN; ABrush: HBRUSH;
|
|
AIsClientArea: Boolean);
|
|
var
|
|
AClipRgn: HRGN;
|
|
AClipRgnExists: Boolean;
|
|
AWindowOrigin: TPoint;
|
|
R: TRect;
|
|
begin
|
|
SaveClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
|
|
GetWindowOrgEx(DC, AWindowOrigin);
|
|
OffsetRgn(ARgn, -AWindowOrigin.X, -AWindowOrigin.Y);
|
|
ExtSelectClipRgn(DC, ARgn, RGN_AND);
|
|
|
|
GetWindowRect(R);
|
|
OffsetRect(R, -R.Left, -R.Top);
|
|
FillBackground(DC, R, ABrush, clNone, AIsClientArea);
|
|
|
|
RestoreClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.FullInvalidate;
|
|
begin
|
|
if HandleAllocated then
|
|
SendMessage(Handle, WM_NCPAINT, 0, 0);
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.FullRepaint;
|
|
begin
|
|
if HandleAllocated then
|
|
SendMessage(Handle, WM_NCPAINT, 0, 0);
|
|
Repaint;
|
|
end;
|
|
|
|
function TCustomdxBarControl.IsInternal: Boolean;
|
|
begin
|
|
Result := ItemLinks.Owner is TdxBarQuickSubItem;
|
|
end;
|
|
|
|
function TCustomdxBarControl.IsBackgroundBitmap: Boolean;
|
|
begin
|
|
Result := (DockControl <> nil) and DockControl.IsBackgroundBitmap;
|
|
end;
|
|
|
|
function TCustomdxBarControl.IsTransparent: Boolean;
|
|
begin
|
|
Result := (DockControl <> nil) and DockControl.IsTransparent;
|
|
end;
|
|
|
|
function TCustomdxBarControl.NCOffset: TPoint;
|
|
begin
|
|
Result.X := 0;
|
|
Result.Y := 0;
|
|
end;
|
|
|
|
function TCustomdxBarControl.PointBarToDock(const APoint: TPoint): TPoint;
|
|
var
|
|
ABounds: TRect;
|
|
begin
|
|
ABounds := BoundsRect;
|
|
Result.X := APoint.X + ABounds.Left;
|
|
Result.Y := APoint.Y + ABounds.Top;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.ResetBackground;
|
|
begin
|
|
FBackgroundTempBitmap.Assign(nil);
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.UpdateDoubleBuffered;
|
|
begin
|
|
DoubleBuffered := IsTransparent;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.HideAll;
|
|
begin
|
|
IsActive := False;
|
|
if not BarControlExists(Self) then Exit;
|
|
if ParentBar <> nil then ParentBar.HideAll;
|
|
end;
|
|
|
|
procedure TCustomdxBarControl.RepaintBar;
|
|
begin
|
|
end;
|
|
|
|
{ TdxDockCol }
|
|
|
|
constructor TdxDockCol.Create(ADockRow: TdxDockRow; ABarControl: TdxBarControl);
|
|
begin
|
|
inherited Create;
|
|
FDockRow := ADockRow;
|
|
FBarControl := ABarControl;
|
|
end;
|
|
|
|
procedure TdxDockCol.AssignPosition;
|
|
begin
|
|
with FBarControl do
|
|
FPos := Point(Left, Top);
|
|
end;
|
|
|
|
{ TdxBarButton }
|
|
|
|
constructor TdxBarButton.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FCloseSubMenuOnClick := True;
|
|
FDropDownEnabled := True;
|
|
FUnclickAfterDoing := True;
|
|
end;
|
|
|
|
procedure TdxBarButton.SetAllowAllUp(Value: Boolean);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if FAllowAllUp <> Value then
|
|
begin
|
|
FAllowAllUp := Value;
|
|
if GroupIndex <> 0 then
|
|
with BarManager do
|
|
for I := 0 to ItemCount - 1 do
|
|
if (Items[I] is TdxBarButton) and (TdxBarButton(Items[I]).GroupIndex = GroupIndex) then
|
|
TdxBarButton(Items[I]).FAllowAllUp := FAllowAllUp;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarButton.SetButtonStyle;
|
|
begin
|
|
if FButtonStyle <> Value then
|
|
begin
|
|
FButtonStyle := Value;
|
|
Down := False;
|
|
if not IsLoading then ButtonStyleChanged;
|
|
BarManager.UpdateItems(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarButton.SetDown;
|
|
var
|
|
DownedButton: TdxBarButton;
|
|
|
|
function GetDownedButton: TdxBarButton;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
with BarManager do
|
|
for I := 0 to ItemCount - 1 do
|
|
if Items[I] is TdxBarButton then
|
|
begin
|
|
Result := TdxBarButton(Items[I]);
|
|
with Result do
|
|
if (ButtonStyle = bsChecked) and
|
|
(GroupIndex = Self.GroupIndex) and Down then Exit;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
|
|
function AnotherDownedButtonExists: Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := True;
|
|
with BarManager do
|
|
for I := 0 to ItemCount - 1 do
|
|
if (Items[I] <> Self) and (Items[I] is TdxBarButton) then
|
|
with TdxBarButton(Items[I]) do
|
|
if (ButtonStyle = bsChecked) and
|
|
(GroupIndex = Self.GroupIndex) and Down then Exit;
|
|
Result := False;
|
|
end;
|
|
|
|
begin
|
|
if (FDown <> Value) and ((ButtonStyle = bsChecked) or not Value) then
|
|
begin
|
|
if not IsLoading and (ButtonStyle = bsChecked) and (GroupIndex <> 0) then
|
|
if Value then
|
|
DownedButton := GetDownedButton
|
|
else
|
|
if not AllowAllUp and not AnotherDownedButtonExists then
|
|
Exit
|
|
else
|
|
DownedButton := nil
|
|
else
|
|
DownedButton := nil;
|
|
FDown := Value;
|
|
if not IsLoading then
|
|
begin
|
|
DownChanged;
|
|
if DownedButton <> nil then DownedButton.Down := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarButton.SetDropDownEnabled(Value: Boolean);
|
|
begin
|
|
if FDropDownEnabled <> Value then
|
|
begin
|
|
FDropDownEnabled := Value;
|
|
if not IsLoading then DropDownEnabledChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarButton.SetDropDownMenu(Value: TdxBarPopupMenu);
|
|
begin
|
|
FDropDownMenu := Value;
|
|
if Value <> nil then Value.FreeNotification(Self);
|
|
end;
|
|
|
|
procedure TdxBarButton.SetGroupIndex;
|
|
begin
|
|
if FGroupIndex <> Value then
|
|
begin
|
|
if ButtonStyle <> bsChecked then Value := 0;
|
|
FGroupIndex := Value;
|
|
Down := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarButton.SetLowered(Value: Boolean);
|
|
begin
|
|
if FLowered <> Value then
|
|
begin
|
|
FLowered := Value;
|
|
if not IsLoading then UpdateEx;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarButton.SetPaintStyle(Value: TdxBarPaintStyle);
|
|
begin
|
|
if FPaintStyle <> Value then
|
|
begin
|
|
FPaintStyle := Value;
|
|
if not IsLoading then PaintStyleChanged;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarButton.IsDownStored: Boolean;
|
|
begin
|
|
Result := (FActionLink = nil) or not FActionLink.IsCheckedLinked;
|
|
end;
|
|
|
|
procedure TdxBarButton.ButtonStyleChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if Links[I].Control <> nil then
|
|
TdxBarButtonControl(Links[I].Control).ButtonStyleChanged;
|
|
end;
|
|
|
|
function TdxBarButton.CanChangePaintStyle: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TdxBarButton.DownChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if Links[I].Control <> nil then
|
|
TdxBarButtonControl(Links[I].Control).DownChanged;
|
|
end;
|
|
|
|
procedure TdxBarButton.DoDropDown(AControl: TdxBarButtonControl; X, Y: Integer;
|
|
ByMouse: Boolean);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
if FDropDownMenu <> nil then
|
|
begin
|
|
if AControl.HasShadow then
|
|
R := AControl.Parent.GetItemScreenRect(AControl)
|
|
else
|
|
R := Rect(0, 0, 0, 0);
|
|
FDropDownMenu.DontUseMessageLoop := True;
|
|
FDropDownMenu.FOwnerControl := AControl.Parent;
|
|
try
|
|
with AControl, ItemLink.ItemRect do
|
|
if Parent is TdxBarSubMenuControl or IsRealVertical(Parent) then
|
|
FDropDownMenu.PopupEx(X, Y, Right - Left, 0, FShowAnimation, @R)
|
|
else
|
|
FDropDownMenu.PopupEx(X, Y, 0, Bottom - Top, FShowAnimation, @R);
|
|
finally
|
|
FDropDownMenu.FOwnerControl := nil;
|
|
FDropDownMenu.DontUseMessageLoop := False;
|
|
end;
|
|
with FDropDownMenu.SubMenuControl do
|
|
begin
|
|
FDropDownButton := AControl;
|
|
if not ByMouse and (ItemLinks.First <> nil) then
|
|
SetKeySelectedItem(ItemLinks.First.Control);
|
|
end;
|
|
if AControl.Parent is TdxBarSubMenuControl then
|
|
AControl.Parent.ChildBar := FDropDownMenu.SubMenuControl;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarButton.DropDownEnabledChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if Links[I].Control <> nil then
|
|
TdxBarButtonControl(Links[I].Control).DropDownEnabledChanged;
|
|
end;
|
|
|
|
function TdxBarButton.HasAccel(AItemLink: TdxBarItemLink): Boolean;
|
|
begin
|
|
Result := inherited HasAccel(AItemLink) and
|
|
(not (AItemLink.Owner.Owner is TdxBar) or
|
|
(AItemLink.PaintStyle in [psCaption, psCaptionGlyph]) or
|
|
(AItemLink.Control <> nil) and
|
|
(TdxBarButtonControl(AItemLink.Control).PaintStyle in [psCaption, psCaptionGlyph]));
|
|
end;
|
|
|
|
procedure TdxBarButton.Notification(AComponent: TComponent; Operation: TOperation);
|
|
begin
|
|
inherited;
|
|
if (Operation = opRemove) and (AComponent = DropDownMenu) then
|
|
DropDownMenu := nil;
|
|
end;
|
|
|
|
procedure TdxBarButton.PaintStyleChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if not (udPaintStyle in Links[I].UserDefine) and (Links[I].Control <> nil) then
|
|
TdxBarButtonControl(Links[I].Control).PaintStyleChanged;
|
|
end;
|
|
|
|
procedure TdxBarButton.Click;
|
|
begin
|
|
if Enabled and (ButtonStyle = bsChecked) then Down := not Down;
|
|
inherited;
|
|
end;
|
|
|
|
{ TdxBarEdit }
|
|
|
|
constructor TdxBarEdit.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FWidth := 100;
|
|
end;
|
|
|
|
procedure TdxBarEdit.SetMaxLength(Value: Integer);
|
|
begin
|
|
FMaxLength := Value;
|
|
if FMaxLength <= 0 then FMaxLength := 0;
|
|
end;
|
|
|
|
procedure TdxBarEdit.SetShowCaption(Value: Boolean);
|
|
begin
|
|
if FShowCaption <> Value then
|
|
begin
|
|
FShowCaption := Value;
|
|
if not IsLoading then UpdateEx;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarEdit.SetWidth(Value: Integer);
|
|
begin
|
|
CheckEditWidth(Value);
|
|
if FWidth <> Value then
|
|
begin
|
|
FWidth := Value;
|
|
if not IsLoading then WidthChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarEdit.DrawInterior(ABarEditControl: TdxBarEditControl; ACanvas: TCanvas;
|
|
R: TRect; ItemLink: TdxBarItemLink);
|
|
begin
|
|
PainterClass.EditDrawInterior(ABarEditControl, Self, ACanvas, R, ItemLink);
|
|
end;
|
|
|
|
function TdxBarEdit.HasAccel(AItemLink: TdxBarItemLink): Boolean;
|
|
begin
|
|
Result := inherited HasAccel(AItemLink) and
|
|
(FShowCaption or not (AItemLink.Owner.Owner is TdxBar));
|
|
end;
|
|
|
|
procedure TdxBarEdit.WidthChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if not (udWidth in Links[I].UserDefine) and
|
|
(Links[I].Control is TdxBarEditControl) then
|
|
TdxBarEditControl(Links[I].Control).WidthChanged;
|
|
end;
|
|
|
|
{ TdxBarItemControl }
|
|
|
|
constructor TdxBarItemControl.Create(AItemLink: TdxBarItemLink);
|
|
begin
|
|
inherited Create;
|
|
FItemLink := AItemLink;
|
|
FParent := AItemLink.BarControl;
|
|
end;
|
|
|
|
destructor TdxBarItemControl.Destroy;
|
|
begin
|
|
if (BarManager <> nil) and (BarManager.FSelectedItem = Self) then
|
|
BarManager.FSelectedItem := nil;
|
|
if FItemLink <> nil then FItemLink.FControl := nil;
|
|
if (FParent <> nil) and not BarManager.IsDestroying and
|
|
(FParent.SelectedItem = Self) and not BarManager.IsCustomizing then
|
|
if (FItemLink <> nil) and (FItemLink.VisibleIndex <> -1) then
|
|
FParent.SetMouseSelectedItem(nil)
|
|
else
|
|
FParent.FSelectedItem := nil;
|
|
cxClearObjectLinks(Self);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetAlign: TdxBarItemAlign;
|
|
begin
|
|
Result := Item.Align;
|
|
if (Result <> iaLeft) and not Parent.CanAlignControl(Self) then
|
|
Result := iaLeft;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetBarManager: TdxBarManager;
|
|
begin
|
|
if FItemLink <> nil then
|
|
Result := FItemLink.BarManager
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetFlat: Boolean;
|
|
begin
|
|
// TODO: obsolete
|
|
Result := Parent.Flat;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetIsSelected: Boolean;
|
|
begin
|
|
Result := (FParent <> nil) and (FParent.FSelectedItem = Self) and
|
|
(Enabled or not FSelectedByMouse);
|
|
end;
|
|
|
|
function TdxBarItemControl.GetItem: TdxBarItem;
|
|
begin
|
|
Result := FItemLink.Item;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetNormalItemHeightInSubMenu: Integer;
|
|
begin
|
|
Result := TdxBarSubMenuControl(Parent).NormalItemHeight;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetRealHeight: Integer;
|
|
begin
|
|
Result := GetHeight;
|
|
if (Align = iaClient) and TdxBarControl(Parent).Vertical then
|
|
if IsVertical(Parent) then
|
|
Result := MinWidth
|
|
else
|
|
Result := MinHeight;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetRealWidth: Integer;
|
|
begin
|
|
Result := GetWidth;
|
|
if (Align = iaClient) and not TdxBarControl(Parent).Vertical then
|
|
Result := MinWidth;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetUnclickAfterDoing: Boolean;
|
|
begin
|
|
if Item is TdxBarButton then
|
|
Result := Item.UnclickAfterDoing
|
|
else
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.SetPressed(Value: Boolean);
|
|
begin
|
|
if FPressed <> Value then
|
|
begin
|
|
FPressed := Value;
|
|
PressedChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.AlignChanged;
|
|
begin
|
|
FParent.RepaintBar;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.BeforeDestroyParentHandle;
|
|
begin
|
|
end;
|
|
|
|
procedure TdxBarItemControl.BeginGroupChanged;
|
|
begin
|
|
FParent.RepaintBar;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.CaptionChanged;
|
|
begin
|
|
if Align = iaClient then
|
|
Repaint
|
|
else
|
|
FParent.RepaintBar;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.EnabledChanged;
|
|
begin
|
|
if not Enabled and (Parent.FSelectedItem = Self) then
|
|
Parent.FSelectedItem := nil;
|
|
Repaint;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.GlyphChanged;
|
|
begin
|
|
Repaint;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.PressedChanged;
|
|
begin
|
|
if not FPressed then Repaint;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.RealVisibleChanging(AVisible: Boolean);
|
|
begin
|
|
end;
|
|
|
|
procedure TdxBarItemControl.ShortCutChanged;
|
|
begin
|
|
if (Parent <> nil) and (Parent is TdxBarSubMenuControl) then
|
|
FParent.RepaintBar;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.VisibleChanged;
|
|
begin
|
|
FParent.RepaintBar;
|
|
end;
|
|
|
|
function TdxBarItemControl.CanClicked: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TdxBarItemControl.CanCustomize: Boolean;
|
|
begin
|
|
Result :=
|
|
(BarManager = Item.BarManager) or
|
|
(csAncestor in BarManager.ComponentState);
|
|
end;
|
|
|
|
function TdxBarItemControl.CanMouseSelect: Boolean;
|
|
begin
|
|
Result := CanSelect;
|
|
end;
|
|
|
|
function TdxBarItemControl.CanSelect: Boolean;
|
|
begin
|
|
Result :=
|
|
not (Parent.IsCustomizing and (BarManager <> Item.BarManager) and
|
|
not (csAncestor in BarManager.ComponentState));
|
|
end;
|
|
|
|
function TdxBarItemControl.CanVisuallyPressed: Boolean;
|
|
begin
|
|
Result := not Parent.HideOnClick;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.Click(ByMouse: Boolean);
|
|
var
|
|
AParent: TCustomdxBarControl;
|
|
begin
|
|
if Enabled then
|
|
begin
|
|
AParent := Parent;
|
|
ControlClick(ByMouse);
|
|
if BarControlExists(AParent) and AParent.ItemExists(Self) then
|
|
ControlUnclick(ByMouse);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.ControlActivate(Immediately: Boolean);
|
|
begin
|
|
FIsActive := True;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.ControlInactivate(Immediately: Boolean);
|
|
begin
|
|
FIsActive := False;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.ControlClick(ByMouse: Boolean);
|
|
begin
|
|
end;
|
|
|
|
procedure TdxBarItemControl.ControlUnclick(ByMouse: Boolean);
|
|
var
|
|
AItem: TdxBarItem;
|
|
AItemLink: TdxBarItemLink;
|
|
AllowClick, AIsDestroyOnClick, AllowPressed: Boolean;
|
|
// AParent: TCustomdxBarControl;
|
|
ALinkSelf, ALinkItem: TcxObjectLink;
|
|
begin
|
|
if (Self is TdxBarButtonControl) and (Parent is TdxBarSubMenuControl) then
|
|
PlaySound(psMenuCommand);
|
|
AItemLink := FItemLink.RealItemLink;
|
|
AItem := FItemLink.Item;
|
|
AllowClick := CanClicked;
|
|
AIsDestroyOnClick := IsDestroyOnClick;
|
|
// AParent := Parent;
|
|
try
|
|
if AIsDestroyOnClick then
|
|
begin
|
|
AItemLink.BringToTopInRecentList(True);
|
|
// for TCustomdxBarContainerItem:
|
|
if AItemLink <> FItemLink then FItemLink.BringToTopInRecentList(True);
|
|
end;
|
|
except
|
|
end;
|
|
|
|
ALinkSelf := cxAddObjectLink(Self);
|
|
AllowPressed :=
|
|
UnclickAfterDoing and (not AIsDestroyOnClick or CanVisuallyPressed);
|
|
if AllowPressed then Pressed := True;
|
|
try
|
|
if AIsDestroyOnClick then Parent.HideAll
|
|
else
|
|
if AItemLink = nil then AItemLink := FItemLink;
|
|
if AllowClick then
|
|
begin
|
|
ALinkItem := cxAddObjectLink(AItem);
|
|
AItem.FClickItemLink := AItemLink;
|
|
try
|
|
AItem.DirectClick;
|
|
finally
|
|
if ALinkItem.Ref <> nil then
|
|
AItem.FClickItemLink := nil;
|
|
cxRemoveObjectLink(ALinkItem);
|
|
end;
|
|
end;
|
|
finally
|
|
if (ALinkSelf.Ref <> nil) and AllowPressed {and BarControlExists(AParent)} then
|
|
Pressed := False;
|
|
cxRemoveObjectLink(ALinkSelf);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.DblClick;
|
|
begin
|
|
end;
|
|
|
|
function TdxBarItemControl.DrawSelected: Boolean;
|
|
begin
|
|
Result := IsSelected;
|
|
end;
|
|
|
|
function TdxBarItemControl.WantsDblClick: Boolean;
|
|
begin
|
|
Result := BarManager.Designing or IsExpandable;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.KeyDown(Key: Word);
|
|
begin
|
|
end;
|
|
|
|
function TdxBarItemControl.WantsKey(Key: Word): Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.DrawLowered(DC: HDC; var R: TRect);
|
|
begin
|
|
PainterClass.DrawLowered(Self, DC, R);
|
|
end;
|
|
|
|
procedure TdxBarItemControl.DrawGlyph(R: TRect; FullBounds: PRect;
|
|
PaintType: TdxBarPaintType;
|
|
IsGlyphEmpty, Selected, Down, DrawDowned, Center, ForceUseBkBrush,
|
|
BarControlOwner, IsSplit: Boolean);
|
|
begin
|
|
PainterClass.DrawGlyph(Self, R, FullBounds, PaintType, IsGlyphEmpty, Selected,
|
|
Down, DrawDowned, Center, ForceUseBkBrush, BarControlOwner, IsSplit);
|
|
end;
|
|
|
|
procedure TdxBarItemControl.DrawGlyphAndBkgnd(R: TRect; const GlyphRect: TRect;
|
|
PaintType: TdxBarPaintType;
|
|
AGlyph: TBitmap; AImages: TCurImageList; AImageIndex: Integer;
|
|
IsGlyphEmpty, Selected, Down, DrawDowned, ForceUseBkBrush, GrayScale,
|
|
BarControlOwner, IsSplit: Boolean);
|
|
begin
|
|
PainterClass.DrawGlyphAndBkgnd(Self, R, GlyphRect, PaintType, AGlyph, AImages,
|
|
AImageIndex, IsGlyphEmpty, Selected, Down, DrawDowned, ForceUseBkBrush, GrayScale,
|
|
BarControlOwner, IsSplit);
|
|
end;
|
|
|
|
procedure TdxBarItemControl.DrawGlyphAndTextInSubMenu(DC: HDC; var R: TRect;
|
|
Selected, ShowGlyph, Down: Boolean);
|
|
begin
|
|
PainterClass.DrawGlyphAndTextInSubMenu(Self, DC, R, Selected, ShowGlyph, Down);
|
|
end;
|
|
|
|
procedure TdxBarItemControl.DrawItemText(DC: HDC; S: string; PaintRect: TRect;
|
|
Alignment: UINT; Enabled, Selected, Rotated, Clipped, FlatText: Boolean);
|
|
begin
|
|
PainterClass.DrawItemText(Self, DC, S, PaintRect, Alignment, Enabled, Selected,
|
|
Rotated, Clipped, FlatText);
|
|
end;
|
|
|
|
procedure TdxBarItemControl.FrameAndFillRect(DC: HDC; var R: TRect;
|
|
Enabled, Selected, Pressed: Boolean);
|
|
begin
|
|
PainterClass.FrameAndFillRect(Self, DC, R, Enabled, Selected, Pressed);
|
|
end;
|
|
|
|
procedure TdxBarItemControl.GetArrowParams(APaintType: TdxBarPaintType;
|
|
AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH; var AArrowColor: COLORREF);
|
|
begin
|
|
PainterClass.GetArrowParams(Self, APaintType, AEnabled, ASelected, ADroppedDown, ABrush, AArrowColor);
|
|
end;
|
|
|
|
function TdxBarItemControl.GetCaption: string;
|
|
begin
|
|
if FItemLink <> nil then
|
|
Result := FItemLink.Caption
|
|
else
|
|
Result := '';
|
|
end;
|
|
|
|
function TdxBarItemControl.GetEnabled: Boolean;
|
|
begin
|
|
if FItemLink <> nil then
|
|
Result := FItemLink.Item.Enabled
|
|
else
|
|
Result := False;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetGlyph: TBitmap;
|
|
begin
|
|
if FItemLink <> nil then
|
|
Result := FItemLink.Glyph
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetImageIndex: Integer;
|
|
begin
|
|
Result := FItemLink.Item.ImageIndex;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetImages(AInToolbar: Boolean): TCurImageList;
|
|
var
|
|
AUseLarge: Boolean;
|
|
begin
|
|
AUseLarge := AInToolbar and BarManager.LargeIcons and
|
|
BarManager.IsLargeImagesForLargeIcons;
|
|
if Enabled then
|
|
begin
|
|
if AUseLarge then
|
|
Result := BarManager.LargeImages
|
|
else
|
|
Result := BarManager.Images;
|
|
end
|
|
else
|
|
begin
|
|
if AUseLarge then
|
|
begin
|
|
Result := BarManager.DisabledLargeImages;
|
|
if Result = nil then
|
|
Result := BarManager.LargeImages;
|
|
end
|
|
else
|
|
begin
|
|
Result := BarManager.DisabledImages;
|
|
if Result = nil then
|
|
Result := BarManager.Images;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetHint;
|
|
begin
|
|
if (FItemLink <> nil) and (FItemLink.Item <> nil) then
|
|
Result := FItemLink.Item.Hint
|
|
else
|
|
Result := '';
|
|
end;
|
|
|
|
function TdxBarItemControl.GetHotImages: TCurImageList;
|
|
begin
|
|
Result := FItemLink.Item.BarManager.HotImages;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetImageEnabled(APaintType: TdxBarPaintType): Boolean;
|
|
begin
|
|
Result := Enabled or
|
|
((BarManager.DisabledImages <> nil) and ((Glyph = nil) or Glyph.Empty));
|
|
end;
|
|
|
|
function TdxBarItemControl.GetLargeImages: TCurImageList;
|
|
begin
|
|
if not Enabled and (BarManager.DisabledLargeImages <> nil) then
|
|
Result := BarManager.DisabledLargeImages
|
|
else
|
|
Result := BarManager.LargeImages;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetPainterClass: TdxBarItemControlPainterClass;
|
|
begin
|
|
Result := BarManager.PainterClass;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetShortCut;
|
|
begin
|
|
if FItemLink <> nil then
|
|
Result := FItemLink.Item.ShortCut
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetTextAreaOffset: Integer;
|
|
begin
|
|
Result := PainterClass.TextAreaOffset(Self);
|
|
end;
|
|
|
|
function TdxBarItemControl.GetHeight: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetMinHeight: Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetMinWidth: Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetOwnedBarControl: TCustomdxBarControl;
|
|
begin
|
|
Result := nil;
|
|
end;
|
|
|
|
function TdxBarItemControl.GetWidth: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
function TdxBarItemControl.HasHint: Boolean;
|
|
begin
|
|
Result := (Hint <> '') and (Parent is TdxBarControl);
|
|
end;
|
|
|
|
function TdxBarItemControl.HasShadow: Boolean;
|
|
begin
|
|
Result := FParent.ChildrenHaveShadows;
|
|
end;
|
|
|
|
function TdxBarItemControl.ImageExists: Boolean;
|
|
begin
|
|
Result := not Glyph.Empty or ImageIndexLinked;
|
|
end;
|
|
|
|
function TdxBarItemControl.ImageIndexLinked: Boolean;
|
|
begin
|
|
Result := (Images[False] <> nil) and
|
|
(0 <= ImageIndex) and (ImageIndex < Images[False].Count);
|
|
end;
|
|
|
|
function TdxBarItemControl.IsDestroyOnClick: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TdxBarItemControl.IsExpandable: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TdxBarItemControl.IsInvertTextColor: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TdxBarItemControl.MousePressed: Boolean;
|
|
var
|
|
R: TRect;
|
|
P: TPoint;
|
|
begin
|
|
R := Parent.GetItemRect(Self);
|
|
GetCursorPos(P);
|
|
ScreenToClient(Parent.Handle, P);
|
|
Result := Enabled and PtInRect(R, P);
|
|
if Result then
|
|
if InMouseHook then
|
|
Result := LeftButtonPressed
|
|
else
|
|
Result := GetKeyState(VK_LBUTTON) < 0;
|
|
end;
|
|
|
|
function TdxBarItemControl.NeedCaptureMouse: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.Paint(ARect: TRect; PaintType: TdxBarPaintType);
|
|
begin
|
|
end;
|
|
|
|
function TdxBarItemControl.ParentIsQuickCustControl: Boolean;
|
|
begin
|
|
Result := Parent is TdxBarQuickControl;
|
|
end;
|
|
|
|
function TdxBarItemControl.WantMouse: Boolean;
|
|
begin
|
|
Result := CanSelect or CanClicked;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.CheckNonRecent;
|
|
begin
|
|
if Parent is TdxBarSubMenuControl then
|
|
TdxBarSubMenuControl(Parent).FNonRecent := FNonRecent;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.UncheckNonRecent;
|
|
begin
|
|
if Parent is TdxBarSubMenuControl then
|
|
TdxBarSubMenuControl(Parent).FNonRecent := False;
|
|
end;
|
|
|
|
procedure TdxBarItemControl.Repaint;
|
|
begin
|
|
// if not Parent.IsDestroying then Parent.PaintItem(Self);
|
|
if not Parent.IsDestroying then
|
|
begin
|
|
Parent.FInRepaint := True;
|
|
try
|
|
Parent.PaintItem(Self);
|
|
finally
|
|
Parent.FInRepaint := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TCustomdxBarSubItem }
|
|
|
|
constructor TCustomdxBarSubItem.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FItemLinks := TdxBarItemLinks.Create(BarManager);
|
|
FItemLinks.FOwner := Self;
|
|
FShowCaption := True;
|
|
end;
|
|
|
|
destructor TCustomdxBarSubItem.Destroy;
|
|
begin
|
|
DetachingBar := -1;
|
|
FItemLinks.Free;
|
|
FItemLinks := nil;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TCustomdxBarSubItem.GetDetachingBarIndex: Integer;
|
|
begin
|
|
if FDetachingBar = nil then
|
|
Result := -1
|
|
else
|
|
Result := FDetachingBar.Index;
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.SetBarSize(Value: Integer);
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
FBarSize := Value;
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.SetDetachingBar(Value: Integer);
|
|
begin
|
|
if (BarManager.Bars = nil) or
|
|
(Value < -1) or (Value > BarManager.Bars.Count - 1) then Value := -1;
|
|
if DetachingBar <> Value then
|
|
begin
|
|
if FDetachingBar <> nil then
|
|
FDetachingBar.RemoveFreeNotification(Self);
|
|
if Value = -1 then
|
|
FDetachingBar := nil
|
|
else
|
|
FDetachingBar := BarManager.Bars[Value];
|
|
if FDetachingBar <> nil then
|
|
FDetachingBar.AddFreeNotification(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.SetItemLinks(Value: TdxBarItemLinks);
|
|
begin
|
|
FItemLinks.Assign(Value);
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.SetShowCaption(Value: Boolean);
|
|
begin
|
|
if FShowCaption <> Value then
|
|
begin
|
|
FShowCaption := Value;
|
|
if not IsLoading then UpdateEx;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.BarManagerChanged;
|
|
begin
|
|
if FItemLinks <> nil then
|
|
FItemLinks.FBarManager := BarManager;
|
|
end;
|
|
|
|
function TCustomdxBarSubItem.CanClicked: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.DoCloseUp;
|
|
begin
|
|
if Assigned(FOnCloseUp) then FOnCloseUp(Self);
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.DoDetaching;
|
|
begin
|
|
if Assigned(FOnDetaching) then FOnDetaching(Self);
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.DoPaintBar(Canvas: TCanvas; const R: TRect);
|
|
begin
|
|
if Assigned(FOnPaintBar) then FOnPaintBar(Self, Canvas, R);
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.DoPopup;
|
|
begin
|
|
if Assigned(FOnPopup) then FOnPopup(Self);
|
|
end;
|
|
|
|
function TCustomdxBarSubItem.HasDesignTimeLinks: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TCustomdxBarSubItem.IsShortCut(AShortCut: TShortCut): Boolean;
|
|
begin
|
|
Result := FItemLinks.IsShortCut(AShortCut);
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.ObjectNotification(AOperation: TOperation;
|
|
AObject: TObject);
|
|
begin
|
|
inherited;
|
|
if (AOperation = opRemove) and (AObject = FDetachingBar) then
|
|
DetachingBar := -1;
|
|
end;
|
|
|
|
function TCustomdxBarSubItem.CanContainItem(AItem: TdxBarItem): Boolean;
|
|
begin
|
|
Result := not
|
|
((AItem is TCustomdxBarSubItem) and
|
|
((Self = AItem) or TCustomdxBarSubItem(AItem).ItemLinks.HasItem(Self)) or
|
|
(AItem is TdxBarButton) and
|
|
(TdxBarButton(AItem).DropDownMenu <> nil) and
|
|
TdxBarButton(AItem).DropDownMenu.ItemLinks.HasItem(Self));
|
|
end;
|
|
|
|
function TCustomdxBarSubItem.GetDetachingBar: TdxBar;
|
|
begin
|
|
Result := FDetachingBar;
|
|
end;
|
|
|
|
procedure TCustomdxBarSubItem.DropDown;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
with Links[I] do
|
|
if Control is TdxBarSubItemControl and IsWindowVisible(BarControl.Handle) then
|
|
begin
|
|
(BarControl as TdxBarControl).BarGetFocus(Control);
|
|
TdxBarControl(BarControl).IsDowned := True;
|
|
Control.Click(False);
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarSubItem }
|
|
|
|
constructor TdxBarSubItem.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
FAllowCustomizing := True;
|
|
end;
|
|
|
|
function TdxBarSubItem.HasDesignTimeLinks: Boolean;
|
|
begin
|
|
Result := inherited HasDesignTimeLinks and not IsInternal;
|
|
end;
|
|
|
|
{ TCustomdxBarContainerItem }
|
|
|
|
destructor TCustomdxBarContainerItem.Destroy;
|
|
begin
|
|
if FNeedClearItemList then ClearItemList;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCustomdxBarContainerItem.AddListedItemLinks(AItemLinks: TdxBarItemLinks;
|
|
AIndex: Integer; FirstCall: Boolean; CallingItemLink: TdxBarItemLink);
|
|
begin
|
|
if FNeedClearItemList then ClearItemList;
|
|
if FirstCall and Assigned(FOnGetData) then
|
|
begin
|
|
FInOnGetData := True;
|
|
try
|
|
FOnGetData(Self);
|
|
except
|
|
FInOnGetData := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarContainerItem.DeleteListedItemLinks(AItemLinks: TdxBarItemLinks;
|
|
AIndex: Integer);
|
|
begin
|
|
end;
|
|
|
|
procedure TCustomdxBarContainerItem.ClearItemList;
|
|
begin
|
|
FNeedClearItemList := False;
|
|
end;
|
|
|
|
function TCustomdxBarContainerItem.HideWhenRun: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TCustomdxBarContainerItem.InternalActuallyVisible: Boolean;
|
|
begin
|
|
Result := Assigned(FOnGetData);
|
|
end;
|
|
|
|
procedure TCustomdxBarContainerItem.ItemLinksChanged;
|
|
begin
|
|
if not FInOnGetData and not ResettingToolbar then
|
|
VisibleChanged;
|
|
end;
|
|
|
|
procedure TCustomdxBarContainerItem.NeedClearItemList;
|
|
begin
|
|
FNeedClearItemList := True;
|
|
end;
|
|
|
|
{ TdxBarListItem }
|
|
|
|
constructor TdxBarListItem.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
FItems := TStringList.Create;
|
|
TStringList(FItems).OnChange := ItemsChanged;
|
|
FItemIndex := -1;
|
|
FItemList := TList.Create;
|
|
FShowNumbers := True;
|
|
end;
|
|
|
|
destructor TdxBarListItem.Destroy;
|
|
begin
|
|
FItemList.Free;
|
|
FItemList := nil;
|
|
FItems.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBarListItem.GetDataIndex: Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := -1;
|
|
if (0 <= FItemIndex) and (FItemIndex < Items.Count) then
|
|
for I := 0 to FItemIndex do
|
|
if Items[I] <> ListItemSeparator then Inc(Result);
|
|
end;
|
|
|
|
procedure TdxBarListItem.SetDataIndex(Value: Integer);
|
|
var
|
|
J, I: Integer;
|
|
begin
|
|
if Items.Count = 0 then
|
|
I := -1
|
|
else
|
|
begin
|
|
J := -1;
|
|
for I := 0 to Items.Count - 1 do
|
|
begin
|
|
if Items[I] <> ListItemSeparator then Inc(J);
|
|
if J = Value then Break;
|
|
end;
|
|
end;
|
|
ItemIndex := I;
|
|
end;
|
|
|
|
procedure TdxBarListItem.SetItems(Value: TStrings);
|
|
begin
|
|
FItems.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarListItem.ClickItem(Sender: TObject);
|
|
begin
|
|
FItemIndex := TComponent(Sender).Tag;
|
|
DirectClick;
|
|
end;
|
|
|
|
procedure TdxBarListItem.ItemsChanged(Sender: TObject);
|
|
begin
|
|
if not FInOnGetData then
|
|
VisibleChanged;
|
|
end;
|
|
|
|
procedure TdxBarListItem.AddListedItemLinks(AItemLinks: TdxBarItemLinks;
|
|
AIndex: Integer; FirstCall: Boolean; CallingItemLink: TdxBarItemLink);
|
|
var
|
|
I, CurIndex: Integer;
|
|
IsBeginGroup, ItemListExists: Boolean;
|
|
begin
|
|
inherited;
|
|
IsBeginGroup := False;
|
|
ItemListExists := FItemList.Count > 0;
|
|
CurIndex := 0;
|
|
for I := 0 to Items.Count - 1 do
|
|
if Items[I] = ListItemSeparator then
|
|
IsBeginGroup := True
|
|
else
|
|
begin
|
|
if not ItemListExists then
|
|
begin
|
|
FItemList.Add(TdxBarButton.Create(BarManager.MainForm));
|
|
with TdxBarButton(FItemList[CurIndex]) do
|
|
begin
|
|
Action := Self.Action;
|
|
if ShowCheck and (I{CurIndex} = FItemIndex) then
|
|
begin
|
|
ButtonStyle := bsChecked;
|
|
Down := True;
|
|
end;
|
|
if FShowNumbers then
|
|
begin
|
|
if CurIndex < 9 then
|
|
FCaption := IntToStr(CurIndex + 1)
|
|
else
|
|
FCaption := Chr(Ord('A') + CurIndex - 9);
|
|
FCaption := '&' + FCaption + ' ';
|
|
end
|
|
else
|
|
FCaption := '';
|
|
FCaption := FCaption + GetDisplayText(Items[I]);
|
|
Tag := I; //CurIndex;
|
|
OnClick := ClickItem;
|
|
Enabled := Self.Enabled;
|
|
end;
|
|
end;
|
|
with AItemLinks.Add do
|
|
begin
|
|
FOriginalItemLink := CallingItemLink;
|
|
Index := AIndex + CurIndex;
|
|
Item := TdxBarItem(FItemList[CurIndex]);
|
|
if (CurIndex = 0) or IsBeginGroup then BeginGroup := True;
|
|
Synchronize(CallingItemLink);
|
|
end;
|
|
IsBeginGroup := False;
|
|
Inc(CurIndex);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarListItem.ClearItemList;
|
|
begin
|
|
if (FItemList <> nil) and
|
|
(FItemList.Count > 0) and (TdxBarItem(FItemList.First).LinkCount = 0) then
|
|
while FItemList.Count > 0 do
|
|
begin
|
|
TdxBarItem(FItemList.Last).Free;
|
|
FItemList.Delete(FItemList.Count - 1);
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarListItem.DeleteListedItemLinks(AItemLinks: TdxBarItemLinks;
|
|
AIndex: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited;
|
|
for I := 0 to Items.Count - 1 do
|
|
if Items[I] <> ListItemSeparator then AItemLinks[AIndex].Free;
|
|
end;
|
|
|
|
function TdxBarListItem.GetDisplayText(const AText: string): string;
|
|
begin
|
|
Result := AText;
|
|
end;
|
|
|
|
function TdxBarListItem.InternalActuallyVisible: Boolean;
|
|
begin
|
|
Result := inherited InternalActuallyVisible or (Items.Count > 0);
|
|
end;
|
|
|
|
procedure TdxBarListItem.DirectClick;
|
|
begin
|
|
if CurItemLink = nil then inherited;
|
|
end;
|
|
|
|
{ TdxDockRow }
|
|
|
|
constructor TdxDockRow.Create(ADockControl: TdxDockControl);
|
|
begin
|
|
inherited Create;
|
|
FDockControl := ADockControl;
|
|
FColList := TList.Create;
|
|
end;
|
|
|
|
destructor TdxDockRow.Destroy;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := ColCount - 1 downto 0 do
|
|
Cols[I].Free;
|
|
FColList.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TdxDockRow.GetCol(Index: Integer): TdxDockCol;
|
|
begin
|
|
Result := FColList[Index];
|
|
end;
|
|
|
|
function TdxDockRow.GetColCount: Integer;
|
|
begin
|
|
Result := FColList.Count;
|
|
end;
|
|
|
|
{ TdxBarButtonControl }
|
|
|
|
function TdxBarButtonControl.GetButtonStyle: TdxBarButtonStyle;
|
|
begin
|
|
Result := Item.ButtonStyle;
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetDown: Boolean;
|
|
begin
|
|
if ItemLink.Item is TdxBarButton then
|
|
Result := Item.Down
|
|
else
|
|
Result := False;
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetDropDownEnabled: Boolean;
|
|
begin
|
|
Result := Item.DropDownEnabled;
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetDropDownMenuControl: TdxBarSubMenuControl;
|
|
begin
|
|
if Item.DropDownMenu <> nil then
|
|
Result := TdxBarSubMenuControl(Item.DropDownMenu.ItemLinks.BarControl)
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetDroppedDownFlat: Boolean;
|
|
begin
|
|
Result := PainterClass.IsFlatItemText and FDroppedDown and (DropDownMenuControl <> nil);
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetGroupIndex: Integer;
|
|
begin
|
|
Result := Item.GroupIndex;
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetItem: TdxBarButton;
|
|
begin
|
|
Result := TdxBarButton(FItemLink.Item);
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetLowered: Boolean;
|
|
begin
|
|
Result := Item.Lowered;
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetPaintStyle: TdxBarPaintStyle;
|
|
begin
|
|
if FItemLink <> nil then
|
|
Result := FItemLink.PaintStyle
|
|
else
|
|
Result := psStandard;
|
|
// if (Parent is TdxBarControl) and (Result = psStandard) and not ImageExists then
|
|
// Result := psCaption;
|
|
if (Parent is TdxBarControl) and (Result = psStandard) then
|
|
PreparePaintStyleOnBar(Result);
|
|
end;
|
|
|
|
function TdxBarButtonControl.MouseOverArrow: Boolean;
|
|
var
|
|
R: TRect;
|
|
P: TPoint;
|
|
begin
|
|
if ButtonStyle = bsDropDown then
|
|
begin
|
|
GetCursorPos(P);
|
|
ScreenToClient(Parent.Handle, P);
|
|
R := Parent.GetItemRect(Self);
|
|
R.Left := R.Right - ArrowWidth;
|
|
Result := PtInRect(R, P);
|
|
end
|
|
else Result := False;
|
|
end;
|
|
|
|
function TdxBarButtonControl.ArrowPressed: Boolean;
|
|
begin
|
|
Result := MousePressed and MouseOverArrow;
|
|
end;
|
|
|
|
function TdxBarButtonControl.ArrowWidth: Integer;
|
|
begin
|
|
if Parent is TdxBarSubMenuControl then
|
|
Result := Parent.MenuArrowWidth
|
|
else
|
|
Result := BarManager.RealButtonArrowWidth;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.ButtonStyleChanged;
|
|
begin
|
|
Parent.RepaintBar;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.ControlInactivate(Immediately: Boolean);
|
|
begin
|
|
inherited;
|
|
if (Item.ButtonStyle = bsDropDown) and DroppedDown and (DropDownMenuControl <> nil) then
|
|
DropDownMenuControl.Hide;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.ControlClick(ByMouse: Boolean);
|
|
begin
|
|
inherited;
|
|
if (ButtonStyle = bsDropDown) and ArrowPressed then
|
|
DoDropDown(True)
|
|
else
|
|
if (Parent is TdxBarControl) or (ButtonStyle = bsDropDown) then Repaint;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.ControlUnclick(ByMouse: Boolean);
|
|
begin
|
|
if not DroppedDown then
|
|
begin
|
|
with Item do
|
|
if ButtonStyle = bsChecked then Down := not Down;
|
|
ControlInactivate(True);
|
|
inherited;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.DoCloseUp;
|
|
begin
|
|
if FDroppedDown then
|
|
begin
|
|
FDroppedDown := False;
|
|
if (Parent is TdxBarControl) then TdxBarControl(Parent).IsDowned := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.DoDropDown(ByMouse: Boolean);
|
|
var
|
|
Rect: TRect;
|
|
P: TPoint;
|
|
begin
|
|
if not FDroppedDown and Enabled and DropDownEnabled and (Item.DropDownMenu <> nil) then
|
|
begin
|
|
FDroppedDown := True;
|
|
if not IsActive then ControlActivate(True);
|
|
Repaint;
|
|
Rect := Parent.GetItemRect(Self);
|
|
with Rect do
|
|
if Parent is TdxBarSubMenuControl or IsRealVertical(Parent) then
|
|
begin
|
|
P := Point(Right, Top);
|
|
if {not Flat or }(Parent is TdxBarSubMenuControl) then // fix
|
|
Dec(P.Y, TdxBarSubMenuControl(Parent).BorderSize);
|
|
end
|
|
else
|
|
P := Point(Left, Bottom);
|
|
P := Parent.ClientToScreen(P);
|
|
Item.DoDropDown(Self, P.X, P.Y, ByMouse);
|
|
if PainterClass.IsDropDownRepaintNeeded then Repaint;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.DownChanged;
|
|
begin
|
|
Repaint;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.DrawArrow(const ARect: TRect; Selected, DrawDowned: Boolean;
|
|
PaintType: TdxBarPaintType);
|
|
var
|
|
DC: HDC;
|
|
R1: TRect;
|
|
Brush: HBRUSH;
|
|
ArrowColor: COLORREF;
|
|
begin
|
|
DC := Parent.Canvas.Handle;
|
|
R1 := ARect;
|
|
R1.Left := R1.Right - ArrowWidth;
|
|
GetArrowParams(PaintType, Enabled, Selected, DroppedDown, Brush, ArrowColor);
|
|
PainterClass.DrawButtonControlArrow(Self, DC, R1, Brush, ArrowColor, Selected, DrawDowned,
|
|
Self.DroppedDown, Self.DropDownEnabled, Self.DropDownMenuControl <> nil, PaintType);
|
|
end;
|
|
|
|
function TdxBarButtonControl.DrawSelected: Boolean;
|
|
begin
|
|
Result := inherited DrawSelected and not FParent.IsCustomizing or Pressed;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.DropDownEnabledChanged;
|
|
begin
|
|
Repaint;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.GlyphChanged;
|
|
begin
|
|
if FItemLink.PaintStyle = psStandard then
|
|
Parent.RepaintBar
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetDefaultHeight: Integer;
|
|
begin
|
|
Result := Parent.TextSize;
|
|
if Parent is TdxBarControl then
|
|
if PaintStyle in [psStandard, psCaptionInMenu] then
|
|
Result := BarManager.ButtonHeight
|
|
else
|
|
if not IsVertical(Parent) then
|
|
if Result < BarManager.ButtonHeight then
|
|
Result := BarManager.ButtonHeight
|
|
else
|
|
else
|
|
if Result < BarManager.ButtonWidth then
|
|
Result := BarManager.ButtonWidth
|
|
else
|
|
else
|
|
PainterClass.CorrectButtonControlDefaultHeight(Result);
|
|
if Lowered then Inc(Result, 2 * PainterClass.LoweredBorderSize(Self));
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetDefaultWidth: Integer;
|
|
begin
|
|
with Parent.Canvas do
|
|
if Parent is TdxBarSubMenuControl then
|
|
begin
|
|
Result := 2 * Parent.TextSize + 3 + TextWidth(GetTextOf(Caption)) + 3;
|
|
if ShortCut <> 0 then
|
|
Inc(Result, Parent.TextSize - 6 + TextWidth(ShortCutToText(ShortCut)));
|
|
PainterClass.CorrectButtonControlDefaultWidth(Self, Result);
|
|
end
|
|
else
|
|
with BarManager, Parent.Canvas do
|
|
if PaintStyle in [psStandard, psCaptionInMenu] then
|
|
Result := ButtonWidth
|
|
else
|
|
begin
|
|
Result := TextWidth(GetTextOf(Caption));
|
|
if PaintStyle = psCaption then
|
|
Inc(Result, Font.Size)
|
|
else
|
|
if not IsVertical(Parent) then
|
|
Inc(Result, ButtonWidth + 4)
|
|
else
|
|
Inc(Result, ButtonHeight + 4);
|
|
end;
|
|
if Lowered then Inc(Result, 2 * PainterClass.LoweredBorderSize(Self));
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetHeight: Integer;
|
|
begin
|
|
if IsVertical(Parent) and (PaintStyle in [psCaption, psCaptionGlyph]) then
|
|
Result := GetDefaultWidth
|
|
else
|
|
Result := GetDefaultHeight;
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetOwnedBarControl: TCustomdxBarControl;
|
|
begin
|
|
Result := DropDownMenuControl;
|
|
end;
|
|
|
|
function TdxBarButtonControl.GetWidth: Integer;
|
|
begin
|
|
if IsVertical(Parent) and (PaintStyle in [psCaption, psCaptionGlyph]) then
|
|
Result := GetDefaultHeight
|
|
else
|
|
Result := GetDefaultWidth;
|
|
if (Parent is TdxBarControl) and (ButtonStyle = bsDropDown) then
|
|
Inc(Result, ArrowWidth);
|
|
end;
|
|
|
|
function TdxBarButtonControl.IsDestroyOnClick: Boolean;
|
|
begin
|
|
Result := Parent is TdxBarControl or Item.CloseSubMenuOnClick;
|
|
end;
|
|
|
|
function TdxBarButtonControl.IsFlatTextSelected(APressed: Boolean): Boolean;
|
|
begin
|
|
Result := PainterClass.IsFlatItemText and
|
|
(APressed or Down and DrawSelected) and PainterClass.IsItemTextSelectedInverted;
|
|
if IsHighContrastWhite and PainterClass.IsFlatItemText and
|
|
((APressed or Down) or DrawSelected) and not DroppedDown then
|
|
Result := True;
|
|
//!!! Result := False;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.KeyDown(Key: Word);
|
|
begin
|
|
inherited;
|
|
case Key of
|
|
VK_UP, VK_DOWN, VK_RIGHT: DoDropDown(False);
|
|
end;
|
|
end;
|
|
|
|
function TdxBarButtonControl.NeedCaptureMouse: Boolean;
|
|
begin
|
|
Result := not DroppedDown;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.Paint(ARect: TRect; PaintType: TdxBarPaintType);
|
|
var
|
|
DC: HDC;
|
|
R: TRect;
|
|
Selected, APressed: Boolean;
|
|
|
|
function GetFullBounds: PRect;
|
|
begin
|
|
if DroppedDownFlat then
|
|
Result := @ARect
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure PrepareCaptionBounds;
|
|
begin
|
|
with R do
|
|
if PaintStyle = psCaption then
|
|
if PaintType = ptHorz then
|
|
Inc(Left, Parent.Canvas.Font.Size div 2)
|
|
else
|
|
Inc(Top, Parent.Canvas.Font.Size div 2)
|
|
else
|
|
if PaintType = ptHorz then
|
|
Inc(Left, BarManager.ButtonWidth)
|
|
else
|
|
Inc(Top, BarManager.ButtonHeight);
|
|
PainterClass.OffsetCaptionBounds(Self, APressed, R);
|
|
end;
|
|
|
|
begin
|
|
if ARect.Left = ARect.Right then Exit;
|
|
DC := Parent.Canvas.Handle;
|
|
if Lowered then DrawLowered(DC, ARect);
|
|
R := ARect;
|
|
Selected := DrawSelected;
|
|
|
|
with R do
|
|
if PaintType = ptMenu then
|
|
begin
|
|
DrawGlyphAndTextInSubMenu(DC, R, Selected,
|
|
not (PaintStyle in [psCaption, psCaptionInMenu]), Down);
|
|
if ShortCut <> 0 then
|
|
begin
|
|
Dec(Right, 5 + Bottom - Top);
|
|
DrawItemText(DC, ShortCutToText(ShortCut), R, DT_RIGHT,
|
|
Enabled, Selected, False, False, PainterClass.IsFlatItemText and not IsHighContrastWhite);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
if ButtonStyle = bsDropDown then Dec(Right, ArrowWidth);
|
|
APressed := Selected and Parent.IsActive and
|
|
MousePressed and not ArrowPressed and not DroppedDown or
|
|
Pressed and (ButtonStyle <> bsChecked);
|
|
|
|
DrawGlyph(R, GetFullBounds, PaintType, PaintStyle = psCaption, Selected,
|
|
Down or DroppedDownFlat, APressed, False, False, ButtonStyle = bsDropDown,
|
|
ButtonStyle = bsDropDown);
|
|
|
|
if PaintStyle in [psCaption, psCaptionGlyph] then
|
|
begin
|
|
PrepareCaptionBounds;
|
|
DrawItemText(DC, Caption, R, DT_LEFT, Enabled, IsFlatTextSelected(APressed),
|
|
PaintType = ptVert, False, not IsFlatTextSelected(APressed));
|
|
end;
|
|
end;
|
|
|
|
if ButtonStyle = bsDropDown then DrawArrow(ARect, Selected, APressed, PaintType);
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.PaintStyleChanged;
|
|
begin
|
|
Parent.RepaintBar;
|
|
end;
|
|
|
|
procedure TdxBarButtonControl.PreparePaintStyleOnBar(var APaintStyle: TdxBarPaintStyle);
|
|
begin
|
|
if (APaintStyle = psStandard) and not ImageExists then
|
|
APaintStyle := psCaption;
|
|
end;
|
|
|
|
function TdxBarButtonControl.WantsKey(Key: Word): Boolean;
|
|
begin
|
|
Result :=
|
|
inherited WantsKey(Key) or
|
|
(ButtonStyle = bsDropDown) and
|
|
((Parent is TdxBarControl) and ((Key = VK_UP) or (Key = VK_DOWN)) or
|
|
(Parent is TdxBarSubMenuControl) and (Key = VK_RIGHT));
|
|
end;
|
|
|
|
{ TCustomdxBarComboControl }
|
|
|
|
function TCustomdxBarComboControl.GetDropDownWindow: HWND;
|
|
begin
|
|
Result := Item.DropDownWindow;
|
|
end;
|
|
|
|
function TCustomdxBarComboControl.GetItem: TCustomdxBarCombo;
|
|
begin
|
|
Result := TCustomdxBarCombo(ItemLink.Item);
|
|
end;
|
|
|
|
procedure TCustomdxBarComboControl.ControlInactivate(Immediately: Boolean);
|
|
begin
|
|
DroppedDown := False;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCustomdxBarComboControl.EnabledChanged;
|
|
begin
|
|
DroppedDown := False;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCustomdxBarComboControl.GetArrowParams(APaintType: TdxBarPaintType;
|
|
AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH; var AArrowColor: COLORREF);
|
|
begin
|
|
PainterClass.ComboControlGetArrowParams(Self, APaintType, AEnabled, ASelected, ADroppedDown,
|
|
ABrush, AArrowColor);
|
|
end;
|
|
|
|
procedure TCustomdxBarComboControl.Paint(ARect: TRect; PaintType: TdxBarPaintType);
|
|
const
|
|
Borders: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
|
|
var
|
|
Selected: Boolean;
|
|
R, R1: TRect;
|
|
DC: HDC;
|
|
|
|
procedure DrawArrow(ARect: TRect);
|
|
begin
|
|
PainterClass.ComboControlDrawArrow(Self, DC, ARect, Selected, PaintType);
|
|
end;
|
|
|
|
begin
|
|
if ARect.Left = ARect.Right then Exit;
|
|
Selected := DrawSelected;
|
|
R := ARect;
|
|
DC := Parent.Canvas.Handle;
|
|
DrawCaption(DC, R, PaintType, Selected);
|
|
DrawBorder(DC, R, PaintType, Selected);
|
|
R1 := R;
|
|
Dec(R1.Right, PainterClass.ComboControlArrowOffset + Parent.ComboBoxArrowWidth);
|
|
if Enabled then WindowRect := R1;
|
|
if not Enabled or not Focused or Item.EmptyWindow then
|
|
DrawTextField(DC, R1);
|
|
DrawArrow(R);
|
|
end;
|
|
|
|
procedure TCustomdxBarComboControl.SetDroppedDown(Value: Boolean);
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
if (FDroppedDown <> Value) and not Item.ReadOnly then
|
|
begin
|
|
FDroppedDown := Value;
|
|
Repaint;
|
|
if FDroppedDown then
|
|
begin
|
|
with Parent.GetItemRect(Self), P do
|
|
if Parent is TdxBarSubMenuControl or IsRealVertical(Parent) then
|
|
begin
|
|
X := Right;
|
|
Y := Top;
|
|
end
|
|
else
|
|
begin
|
|
X := Left + CaptionWidth;
|
|
Y := Bottom;
|
|
end;
|
|
ClientToScreen(Parent.Handle, P);
|
|
Item.DropDown(P.X, P.Y);
|
|
end
|
|
else
|
|
Item.CloseUp;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxBarComboControl.WndProc(var Message: TMessage);
|
|
var
|
|
Shift: TShiftState;
|
|
AHandle: HWND;
|
|
R: TRect;
|
|
|
|
function LButtonDowned: Boolean;
|
|
begin
|
|
with Message do
|
|
LButtonDowned := (Msg = WM_LBUTTONDOWN) or (Msg = WM_LBUTTONDBLCLK);
|
|
end;
|
|
|
|
begin
|
|
with Message do
|
|
case Msg of
|
|
WM_KEYDOWN, WM_KEYUP, WM_CHAR:
|
|
begin
|
|
Shift := KeyDataToShiftState(lParam);
|
|
if (Msg = WM_KEYDOWN) and (wParam = VK_F4) then
|
|
begin
|
|
DroppedDown := not DroppedDown;
|
|
Exit;
|
|
end
|
|
else
|
|
if DroppedDown and (DropDownWindow <> 0) and
|
|
Item.CheckKeyForDropDownWindow(wParam, Shift) then
|
|
begin
|
|
Result := SendMessage(DropDownWindow, Msg, wParam, lParam);
|
|
Exit;
|
|
end;
|
|
end;
|
|
WM_SYSKEYDOWN, WM_SYSKEYUP:
|
|
begin
|
|
Shift := KeyDataToShiftState(lParam);
|
|
if ((wParam = VK_UP) or (wParam = VK_DOWN)) and (ssAlt in Shift) then
|
|
begin
|
|
if Msg = WM_SYSKEYDOWN then DroppedDown := not DroppedDown;
|
|
Message.wParam := 0;
|
|
Exit;
|
|
end
|
|
end;
|
|
end;
|
|
AHandle := Handle;
|
|
inherited;
|
|
if not IsWindowVisible(AHandle) then Exit;
|
|
if LButtonDowned then FOnPressDroppedDown := DroppedDown;
|
|
if not FOnPressDroppedDown and LButtonDowned or
|
|
FOnPressDroppedDown and (Message.Msg = WM_LBUTTONUP) then
|
|
begin
|
|
R := DropDownButtonRect;
|
|
if not Item.ShowEditor then R.Left := WindowRect.Left;
|
|
MapWindowPoints(Parent.Handle, Handle, R, 2);
|
|
if PtInRect(R, SmallPointToPoint(TSmallPoint(Message.lParam))) then
|
|
DroppedDown := not DroppedDown;
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarComboControl }
|
|
|
|
function TdxBarComboControl.GetItem: TdxBarCustomCombo;
|
|
begin
|
|
Result := TdxBarCustomCombo(ItemLink.Item);
|
|
end;
|
|
|
|
function TdxBarComboControl.GetItemIndex: Integer;
|
|
begin
|
|
Result := Item.ItemIndex;
|
|
end;
|
|
|
|
function TdxBarComboControl.GetItems: TStrings;
|
|
begin
|
|
Result := Item.Items;
|
|
end;
|
|
|
|
function TdxBarComboControl.GetSorted: Boolean;
|
|
begin
|
|
Result := Item.Sorted;
|
|
end;
|
|
|
|
procedure TdxBarComboControl.SetLocalItemIndex(Value: Integer);
|
|
begin
|
|
FLocalItemIndex := Value;
|
|
if (0 <= FLocalItemIndex) and (FLocalItemIndex <= Items.Count - 1) then
|
|
Text := Items[FLocalItemIndex]
|
|
else
|
|
Text := Item.Text;
|
|
if Item.EmptyWindow then Repaint;
|
|
end;
|
|
|
|
procedure TdxBarComboControl.SetFocused(Value: Boolean);
|
|
begin
|
|
FFocusing := True;
|
|
try
|
|
if Value then LocalItemIndex := ItemIndex;
|
|
finally
|
|
FFocusing := False;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarComboControl.WndProc(var Message: TMessage);
|
|
var
|
|
Shift: TShiftState;
|
|
begin
|
|
if not ReadOnly then
|
|
begin
|
|
with Message do
|
|
case Msg of
|
|
WM_MOUSEWHEEL:
|
|
begin
|
|
if SmallInt(HIWORD(TWMMOuse(Message).Keys)) > 0 then
|
|
begin
|
|
if not DroppedDown then
|
|
begin
|
|
if LocalItemIndex > 0 then
|
|
LocalItemIndex := LocalItemIndex - 1;
|
|
end
|
|
else
|
|
SendMessage(DropDownWindow, WM_VScroll, SB_LINEUP, 0);
|
|
end
|
|
else
|
|
begin
|
|
if not DroppedDown then
|
|
begin
|
|
if LocalItemIndex < (Items.Count - 1) then
|
|
LocalItemIndex := LocalItemIndex + 1;
|
|
end
|
|
else
|
|
SendMessage(DropDownWindow, WM_VScroll, SB_LINEDOWN, 0);
|
|
end;
|
|
end;
|
|
WM_KEYDOWN:
|
|
begin
|
|
if (wParam = VK_RETURN) or (wParam = VK_TAB) then
|
|
begin
|
|
if (LocalItemIndex <> -1) and (Item.Items[LocalItemIndex] = Text) then
|
|
begin
|
|
Item.ItemIndex := LocalItemIndex;
|
|
if not IsWindowVisible(Handle) then Exit;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
Shift := KeyDataToShiftState(lParam);
|
|
if not DroppedDown and ((wParam = VK_UP) or (wParam = VK_DOWN)) and (Shift = []) then
|
|
begin
|
|
if (wParam = VK_UP) and (LocalItemIndex > 0) then
|
|
LocalItemIndex := LocalItemIndex - 1
|
|
else
|
|
if (wParam = VK_DOWN) and (LocalItemIndex < Items.Count - 1) then
|
|
LocalItemIndex := LocalItemIndex + 1;
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
inherited WndProc(Message);
|
|
end;
|
|
|
|
{ TdxBarItemActionLink }
|
|
|
|
procedure TdxBarItemActionLink.AssignClient(AClient: TObject);
|
|
begin
|
|
FClient := AClient as TdxBarItem;
|
|
end;
|
|
|
|
function TdxBarItemActionLink.IsCaptionLinked: Boolean;
|
|
begin
|
|
Result := inherited IsCaptionLinked and
|
|
(FClient.Caption = (Action as TCustomAction).Caption);
|
|
end;
|
|
|
|
function TdxBarItemActionLink.IsCheckedLinked: Boolean;
|
|
begin
|
|
Result := inherited IsCheckedLinked and (FClient is TdxBarButton) and
|
|
(TdxBarButton(FClient).Down = (Action as TCustomAction).Checked);
|
|
end;
|
|
|
|
function TdxBarItemActionLink.IsEnabledLinked: Boolean;
|
|
begin
|
|
Result := inherited IsEnabledLinked and
|
|
(FClient.Enabled = (Action as TCustomAction).Enabled);
|
|
end;
|
|
|
|
function TdxBarItemActionLink.IsHelpContextLinked: Boolean;
|
|
begin
|
|
Result := inherited IsHelpContextLinked and
|
|
(FClient.HelpContext = (Action as TCustomAction).HelpContext);
|
|
end;
|
|
|
|
function TdxBarItemActionLink.IsHintLinked: Boolean;
|
|
begin
|
|
Result := inherited IsHintLinked and
|
|
((FClient.Hint = (Action as TCustomAction).Hint) or FClient.IsHintFromCaption);
|
|
end;
|
|
|
|
function TdxBarItemActionLink.IsImageIndexLinked: Boolean;
|
|
begin
|
|
Result := inherited IsImageIndexLinked and
|
|
(FClient.ActionImageIndex = (Action as TCustomAction).ImageIndex);
|
|
end;
|
|
|
|
function TdxBarItemActionLink.IsShortCutLinked: Boolean;
|
|
begin
|
|
Result := inherited IsShortCutLinked and
|
|
(FClient.ShortCut = (Action as TCustomAction).ShortCut);
|
|
end;
|
|
|
|
function TdxBarItemActionLink.IsVisibleLinked: Boolean;
|
|
|
|
function GetClientVisible: TdxBarItemVisible;
|
|
begin
|
|
if FClient.IsLoading then
|
|
Result := FClient.FLoadedVisible
|
|
else
|
|
Result := FClient.Visible;
|
|
end;
|
|
|
|
begin
|
|
Result := inherited IsVisibleLinked and
|
|
(GetClientVisible = VisibleTodxBarVisible((Action as TCustomAction).Visible));
|
|
end;
|
|
|
|
function TdxBarItemActionLink.IsOnExecuteLinked: Boolean;
|
|
begin
|
|
Result := inherited IsOnExecuteLinked and
|
|
(@FClient.OnClick = @Action.OnExecute);
|
|
end;
|
|
|
|
procedure TdxBarItemActionLink.SetCaption(const Value: string);
|
|
begin
|
|
if IsCaptionLinked then FClient.Caption := Value;
|
|
end;
|
|
|
|
procedure TdxBarItemActionLink.SetChecked(Value: Boolean);
|
|
begin
|
|
if IsCheckedLinked and (FClient is TdxBarButton) then
|
|
TdxBarButton(FClient).Down := Value;
|
|
end;
|
|
|
|
procedure TdxBarItemActionLink.SetEnabled(Value: Boolean);
|
|
begin
|
|
if IsEnabledLinked then FClient.Enabled := Value;
|
|
end;
|
|
|
|
procedure TdxBarItemActionLink.SetHelpContext(Value: THelpContext);
|
|
begin
|
|
if IsHelpContextLinked then FClient.HelpContext := Value;
|
|
end;
|
|
|
|
procedure TdxBarItemActionLink.SetHint(const Value: string);
|
|
begin
|
|
if IsHintLinked then FClient.Hint := Value;
|
|
end;
|
|
|
|
procedure TdxBarItemActionLink.SetImageIndex(Value: Integer);
|
|
begin
|
|
if IsImageIndexLinked then FClient.ActionImageIndex := Value;
|
|
end;
|
|
|
|
procedure TdxBarItemActionLink.SetShortCut(Value: TShortCut);
|
|
begin
|
|
if IsShortCutLinked then FClient.ShortCut := Value;
|
|
end;
|
|
|
|
procedure TdxBarItemActionLink.SetVisible(Value: Boolean);
|
|
begin
|
|
if IsVisibleLinked then FClient.Visible := VisibleTodxBarVisible(Value);
|
|
end;
|
|
|
|
procedure TdxBarItemActionLink.SetOnExecute(Value: TNotifyEvent);
|
|
begin
|
|
if IsOnExecuteLinked then FClient.OnClick := Value;
|
|
end;
|
|
|
|
{ TdxBarSubItemControl }
|
|
|
|
var
|
|
ABarSubItemTimer: TdxBarSubItemControl;
|
|
ABarSubMenuTimerID: Integer;
|
|
|
|
procedure ActivateSubMenuTimerProc(Wnd: HWnd; Msg, TimerID, SysTime: Longint); stdcall;
|
|
begin
|
|
try
|
|
try
|
|
if ABarSubItemTimer <> nil then
|
|
ABarSubItemTimer.ControlActivate(True);
|
|
finally
|
|
KillTimer(0, ABarSubMenuTimerID);
|
|
ABarSubItemTimer := nil;
|
|
end;
|
|
except
|
|
end;
|
|
end;
|
|
|
|
procedure DeActivateSubMenuTimerProc(Wnd: HWnd; Msg, TimerID, SysTime: Longint); stdcall;
|
|
begin
|
|
try
|
|
try
|
|
if ABarSubItemTimer <> nil then
|
|
ABarSubItemTimer.ControlInActivate(True);
|
|
finally
|
|
KillTimer(0, ABarSubMenuTimerID);
|
|
ABarSubItemTimer := nil;
|
|
end;
|
|
except
|
|
end;
|
|
end;
|
|
|
|
destructor TdxBarSubItemControl.Destroy;
|
|
begin
|
|
if ABarSubItemTimer = Self then
|
|
begin
|
|
ABarSubItemTimer := nil;
|
|
KillTimer(0, ABarSubMenuTimerID);
|
|
end;
|
|
if (SubMenuControl <> nil) {and not ItemLink.Item.IsDestroying} then
|
|
SubMenuControl.Hide;
|
|
FIsActive := False;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarSubItemControl.GetCaptionOffset: Integer;
|
|
begin
|
|
Result := PainterClass.SubItemControlCaptionOffset(Self);
|
|
end;
|
|
|
|
function TdxBarSubItemControl.GetItem: TCustomdxBarSubItem;
|
|
begin
|
|
Result := TCustomdxBarSubItem(ItemLink.Item);
|
|
end;
|
|
|
|
procedure TdxBarSubItemControl.GlyphChanged;
|
|
begin
|
|
Parent.RepaintBar;
|
|
end;
|
|
|
|
function TdxBarSubItemControl.GetSubMenuControl: TdxBarSubMenuControl;
|
|
begin
|
|
if Item.ItemLinks = nil then
|
|
Result := nil
|
|
else
|
|
Result := TdxBarSubMenuControl(Item.ItemLinks.BarControl);
|
|
end;
|
|
|
|
function TdxBarSubItemControl.CanClicked: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarSubItemControl.ControlActivate(Immediately: Boolean);
|
|
var
|
|
R: TRect;
|
|
P: TPoint;
|
|
begin
|
|
// if AnimatingSubMenu <> nil then Exit;
|
|
if not HasSubMenu then Exit;
|
|
|
|
if SubMenuControl <> nil then
|
|
if (ItemLink.Item.CurItemLink = nil) or (Self = ItemLink.Item.CurItemLink.Control) then
|
|
begin
|
|
if ABarSubItemTimer = Self then
|
|
begin
|
|
ABarSubItemTimer := nil;
|
|
KillTimer(0, ABarSubMenuTimerID);
|
|
end;
|
|
Exit;
|
|
end
|
|
else
|
|
ItemLink.Item.CurItemLink.Control.ControlInActivate(True);
|
|
|
|
inherited;
|
|
if not Enabled and not BarManager.Designing then Exit;
|
|
if Parent is TdxBarControl then
|
|
if Parent.IsCustomizing or TdxBarControl(Parent).IsDowned then
|
|
Immediately := True
|
|
else
|
|
Exit;
|
|
if not Immediately and not BarManager.IsCustomizing then
|
|
begin
|
|
if ABarSubItemTimer <> nil then
|
|
begin
|
|
KillTimer(0, ABarSubMenuTimerID);
|
|
try
|
|
if ABarSubItemTimer.Parent <> Parent.ParentBar then
|
|
ABarSubItemTimer.ControlInActivate(True);
|
|
except
|
|
end;
|
|
end;
|
|
ABarSubItemTimer := Self;
|
|
ABarSubMenuTimerID := SetTimer(0, 0, dxBarWaitForSubMenuTime, @ActivateSubMenuTimerProc);
|
|
Exit;
|
|
end;
|
|
Item.DoPopup;
|
|
Item.DirectClick;
|
|
DoCreateSubMenuControl;
|
|
if SubMenuControl <> nil then
|
|
begin
|
|
R := FParent.GetItemRect(Self);
|
|
if Parent is TdxBarSubMenuControl then
|
|
begin
|
|
P := Point(R.Right, R.Top - TdxBarSubMenuControl(Parent).BorderSize);
|
|
SubMenuControl.OwnerWidth := R.Right - R.Left;
|
|
end
|
|
else
|
|
if IsRealVertical(Parent) then
|
|
begin
|
|
P := Point(R.Right, R.Top);
|
|
SubMenuControl.OwnerWidth := R.Right - R.Left;
|
|
end
|
|
else
|
|
begin
|
|
P := Point(R.Left, R.Bottom);
|
|
SubMenuControl.OwnerHeight := R.Bottom - R.Top;
|
|
end;
|
|
SubMenuControl.FSubItem := Self;
|
|
P := FParent.ClientToScreen(P);
|
|
SubMenuControl.Left := P.X;
|
|
SubMenuControl.Top := P.Y;
|
|
// ***
|
|
Parent.ChildBar := SubMenuControl;
|
|
SubMenuControl.ParentBar := Parent;
|
|
// ***
|
|
if not (Parent is TdxBarSubMenuControl) then Repaint;
|
|
SubMenuControl.FShowAnimation := FShowAnimation;
|
|
FShowAnimation := False;
|
|
SubMenuControl.Show;
|
|
if PainterClass.IsDropDownRepaintNeeded then Repaint;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubItemControl.ControlInactivate(Immediately: Boolean);
|
|
var
|
|
AHadSubMenuControl: Boolean;
|
|
begin
|
|
// if AnimatingSubMenu <> nil then Exit;
|
|
if not HasSubMenu then Exit;
|
|
|
|
if Parent is TdxBarControl then Immediately := True;
|
|
|
|
if not Immediately and (ABarSubItemTimer = nil) and (Parent <> nil) and
|
|
not Parent.IsDestroying and not BarManager.IsCustomizing then
|
|
begin
|
|
ABarSubItemTimer := Self;
|
|
ABarSubMenuTimerID := SetTimer(0, 0, dxBarWaitForSubMenuTime, @DeActivateSubMenuTimerProc);
|
|
Exit;
|
|
end;
|
|
if SubMenuControl <> nil then SubMenuControl.FSubItem := nil;
|
|
inherited;
|
|
if ABarSubItemTimer = Self then
|
|
begin
|
|
ABarSubItemTimer := nil;
|
|
KillTimer(0, ABarSubMenuTimerID);
|
|
end;
|
|
AHadSubMenuControl := SubMenuControl <> nil;
|
|
if AHadSubMenuControl then SubMenuControl.Hide;
|
|
if not (Parent is TdxBarSubMenuControl) then Repaint;
|
|
if AHadSubMenuControl then Item.DoCloseUp;
|
|
end;
|
|
|
|
procedure TdxBarSubItemControl.ControlClick(ByMouse: Boolean);
|
|
begin
|
|
if SubMenuControl = nil then
|
|
begin
|
|
ControlActivate(True);
|
|
if not ByMouse and (SubMenuControl <> nil) then
|
|
with SubMenuControl do
|
|
if ItemLinks.First <> nil then
|
|
SetKeySelectedItem(ItemLinks.First.Control);
|
|
end
|
|
else
|
|
if Parent.IsCustomizing or (BarManager.GetPaintStyle = bmsStandard) then // ???
|
|
ControlInactivate(True);
|
|
end;
|
|
|
|
procedure TdxBarSubItemControl.CreateSubMenuControl;
|
|
begin
|
|
Item.ItemLinks.CreateBarControl;
|
|
end;
|
|
|
|
procedure TdxBarSubItemControl.DoCreateSubMenuControl;
|
|
begin
|
|
CreateSubMenuControl;
|
|
if HasShadow and (SubMenuControl <> nil) then
|
|
begin
|
|
SubMenuControl.OwnerBounds := Parent.GetItemScreenRect(Self);
|
|
SubMenuControl.FOwnerControl := Parent;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarSubItemControl.GetDefaultHeight: Integer;
|
|
begin
|
|
Result := PainterClass.SubItemControlDefaultHeight(Self);
|
|
end;
|
|
|
|
function TdxBarSubItemControl.GetDefaultWidth: Integer;
|
|
begin
|
|
Result := PainterClass.SubItemControlDefaultWidth(Self);
|
|
end;
|
|
|
|
function TdxBarSubItemControl.GetHeight: Integer;
|
|
begin
|
|
if IsVertical(Parent) then
|
|
Result := GetDefaultWidth
|
|
else
|
|
Result := GetDefaultHeight;
|
|
end;
|
|
|
|
function TdxBarSubItemControl.GetOwnedBarControl: TCustomdxBarControl;
|
|
begin
|
|
Result := SubMenuControl;
|
|
end;
|
|
|
|
function TdxBarSubItemControl.GetWidth: Integer;
|
|
begin
|
|
if IsVertical(Parent) then
|
|
Result := GetDefaultHeight
|
|
else
|
|
Result := GetDefaultWidth;
|
|
end;
|
|
|
|
function TdxBarSubItemControl.HasSubMenu: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TdxBarSubItemControl.IsDestroyOnClick: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TdxBarSubItemControl.IsExpandable: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TdxBarSubItemControl.KeyDown(Key: Word);
|
|
begin
|
|
inherited;
|
|
case Key of
|
|
VK_RIGHT: Click(False);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubItemControl.Paint(ARect: TRect; PaintType: TdxBarPaintType);
|
|
const
|
|
Borders: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
|
|
var
|
|
R: TRect;
|
|
Selected, Down: Boolean;
|
|
DC: HDC;
|
|
begin
|
|
if ARect.Left = ARect.Right then Exit;
|
|
R := ARect;
|
|
Selected := DrawSelected;
|
|
Down := IsActive and (SubMenuControl <> nil);
|
|
DC := Parent.Canvas.Handle;
|
|
PainterClass.SubItemControlDraw(Self, DC, R, Selected, Down, PaintType);
|
|
end;
|
|
|
|
function TdxBarSubItemControl.WantsDblClick: Boolean;
|
|
begin
|
|
Result := inherited WantsDblClick and not BarManager.Designing;
|
|
end;
|
|
|
|
function TdxBarSubItemControl.WantsKey(Key: Word): Boolean;
|
|
begin
|
|
Result := inherited WantsKey(Key) or
|
|
(Parent is TdxBarSubMenuControl) and (Key = VK_RIGHT);
|
|
end;
|
|
|
|
{ TdxBarSubMenuControl }
|
|
|
|
type
|
|
TAnimationInfo = record
|
|
MenuAnimations: TdxBarMenuAnimations;
|
|
LeftDirection, TopDirection: Boolean;
|
|
RealLeft, RealTop, RealClientWidth, RealClientHeight,
|
|
BorderWidth, BorderHeight, FirstValue, Delta, Step: Integer;
|
|
OldClientRect: TRect;
|
|
end;
|
|
|
|
var
|
|
AnimationBitmap: HBITMAP;
|
|
AnimationBitmapDC: HDC;
|
|
AnimationInfo: TAnimationInfo;
|
|
AnimationThread: THandle;
|
|
KillingAnimation: Boolean;
|
|
|
|
procedure TerminateAnimation(ASubMenu: TdxBarSubMenuControl);
|
|
var
|
|
Msg: TMsg;
|
|
begin
|
|
if (AnimatingSubMenu = ASubMenu) and (AnimatingSubMenu <> nil) then
|
|
begin
|
|
KillingAnimation := True;
|
|
while MsgWaitForMultipleObjects(1, AnimationThread, False,
|
|
INFINITE, QS_SENDMESSAGE) = WAIT_OBJECT_0 + 1 do
|
|
begin
|
|
if AnimatingSubMenu <> nil then
|
|
PeekMessage(Msg, AnimatingSubMenu.Handle, 0, 0, PM_REMOVE);
|
|
if (AnimatingSubMenu <> nil) and not AnimatingSubMenu.FDestroyFlag then
|
|
DispatchMessage(Msg);
|
|
end;
|
|
ProcessPaintMessages;
|
|
end;
|
|
end;
|
|
|
|
constructor TdxBarSubMenuControl.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
Width := 0;
|
|
XDirection := xdRight;
|
|
YDirection := ydBottom;
|
|
end;
|
|
|
|
destructor TdxBarSubMenuControl.Destroy;
|
|
begin
|
|
if (ChildBar <> nil) and not ChildBar.FDestroyFlag then
|
|
ChildBar.Free;
|
|
if ParentBar <> nil then ParentBar.ChildBar := nil;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetBarSize: Integer;
|
|
begin
|
|
if ItemLinks.Owner is TdxBarPopupMenu then
|
|
Result := TdxBarPopupMenu(ItemLinks.Owner).BarSize
|
|
else
|
|
if ItemLinks.Owner is TCustomdxBarSubItem then
|
|
Result := TCustomdxBarSubItem(ItemLinks.Owner).BarSize
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetBorderSize: Integer;
|
|
begin
|
|
Result := PainterClass.SubMenuControlBorderSize;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetDetachCaptionSize: Integer;
|
|
begin
|
|
Result := Canvas.TextHeight('Qq') div 2;
|
|
if not Odd(Result) then Inc(Result);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetMaxVisibleCount: Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := TopIndex to ItemLinks.VisibleItemCount - 1 do
|
|
if ItemLinks.VisibleItems[I].ItemRect.Bottom = 0 then
|
|
begin
|
|
Result := I - TopIndex;
|
|
Exit;
|
|
end;
|
|
Result := ItemLinks.VisibleItemCount - TopIndex;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetToolbarItemsBrush: HBRUSH;
|
|
begin
|
|
Result := PainterClass.SubMenuControlToolbarItemsBrush(Self);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.SetDetachCaptionSelected(Value: Boolean);
|
|
begin
|
|
if IsCustomizing or (GetCapture <> 0) then Exit;
|
|
if FDetachCaptionSelected <> Value then
|
|
begin
|
|
if Value then FinishMouseTracking(Handle);
|
|
FDetachCaptionSelected := Value;
|
|
InvalidateDetachCaption;
|
|
if Value then StartMouseTracking(Handle);
|
|
SetCursorForMoving(Value);
|
|
if Value then
|
|
BarManager.HintActivate(True, cxGetResourceString(@dxSBAR_DRAGTOMAKEMENUFLOAT))
|
|
else
|
|
if SelectedItem = nil then
|
|
BarManager.HintActivate(False, '');
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.SetTopIndex(Value: Integer);
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
if FTopIndex <> Value then
|
|
begin
|
|
FTopIndex := Value;
|
|
Repaint;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.CalcControlsPositions(Size: PPoint);
|
|
var
|
|
ARecentItemCount: Integer;
|
|
AExtendedView: Boolean;
|
|
R: TRect;
|
|
I, AClientHeight, W: Integer;
|
|
LastWasRecentItem: Boolean;
|
|
AItemLink: TdxBarItemLink;
|
|
begin
|
|
ItemLinks.EmptyItemRects;
|
|
|
|
ARecentItemCount := ItemLinks.MostRecentItemCount;
|
|
if ARecentItemCount = -1 then
|
|
ARecentItemCount := ItemLinks.CanVisibleItemCount;
|
|
AExtendedView := ExtendedView;
|
|
|
|
PainterClass.SubMenuControlCalcRect(Self, Size, R, AClientHeight);
|
|
|
|
LastWasRecentItem := True;
|
|
for I := TopIndex to ItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := ItemLinks.VisibleItems[I];
|
|
|
|
AItemLink.Control.FNonRecent :=
|
|
AExtendedView and (AItemLink.RecentIndex >= ARecentItemCount);
|
|
AItemLink.Control.FChangeRecentGroup :=
|
|
AExtendedView and ((I > TopIndex) or Detachable) and
|
|
(AItemLink.Control.FNonRecent = LastWasRecentItem);
|
|
if AItemLink.Control.FChangeRecentGroup and
|
|
PainterClass.SubMenuControlIsOffsetRecentGroupNeeded then Inc(R.Top);
|
|
if AItemLink.BeginGroup and (I > TopIndex) and
|
|
not (UpArrowExists and (I = TopIndex + 1)) then
|
|
Inc(R.Top, BeginGroupSize);
|
|
R.Bottom := R.Top + AItemLink.Control.Height;
|
|
if R.Bottom > AClientHeight then Break;
|
|
if Size <> nil then
|
|
begin
|
|
W := AItemLink.Control.Width;
|
|
if W > Size^.X then Size^.X := W;
|
|
end;
|
|
|
|
LastWasRecentItem := not AItemLink.Control.FNonRecent;
|
|
|
|
AItemLink.ItemRect := R;
|
|
R.Top := R.Bottom;
|
|
end;
|
|
|
|
if Size <> nil then
|
|
PainterClass.SubMenuControlCalcSize(Self, Size, R);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.CreateLightBrush;
|
|
var
|
|
Color: COLORREF;
|
|
R, G, B: Integer;
|
|
DC: HDC;
|
|
LogPalette: TLogPalette;
|
|
begin
|
|
Color := GetSysColor(COLOR_BTNFACE);
|
|
R := GetRValue(Color) + dxBarNonrecentlyUsedItemsColorDelta;
|
|
if R > 255 then R := 255;
|
|
G := GetGValue(Color) + dxBarNonrecentlyUsedItemsColorDelta;
|
|
if G > 255 then G := 255;
|
|
B := GetBValue(Color) + dxBarNonrecentlyUsedItemsColorDelta;
|
|
if B > 255 then B := 255;
|
|
|
|
DC := GetDC(0);
|
|
if BarManager.ShowRecentItemsFirst and (GetDeviceCaps(DC, BITSPIXEL) <= 8) then
|
|
begin
|
|
with LogPalette do
|
|
begin
|
|
palVersion := $0300;
|
|
palNumEntries := 1;
|
|
with palPalEntry[0] do
|
|
begin
|
|
peRed := R;
|
|
peGreen := G;
|
|
peBlue := B;
|
|
peFlags := 0;
|
|
end;
|
|
end;
|
|
FLightPalette := CreatePalette(LogPalette);
|
|
FLightBrush := CreateSolidBrush(PaletteIndex(0));
|
|
end
|
|
else
|
|
begin
|
|
Color := RGB(R, G, B);
|
|
FLightBrush := CreateSolidBrush(Color);
|
|
end;
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.DestroyLightBrush;
|
|
begin
|
|
if FLightBrush <> 0 then
|
|
begin
|
|
DeleteObject(FLightBrush);
|
|
FLightBrush := 0;
|
|
end;
|
|
if FLightPalette <> 0 then
|
|
begin
|
|
DeleteObject(FLightPalette);
|
|
FLightPalette := 0;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.PreparePalette(DC: HDC);
|
|
begin
|
|
if FLightPalette <> 0 then
|
|
begin
|
|
SelectPalette(DC, FLightPalette, True);
|
|
RealizePalette(DC);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.UnpreparePalette(DC: HDC);
|
|
begin
|
|
if FLightPalette <> 0 then
|
|
begin
|
|
SelectPalette(DC, GetStockObject(DEFAULT_PALETTE), True);
|
|
RealizePalette(DC);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.ExpandMenu;
|
|
begin
|
|
if MarkExists then
|
|
begin
|
|
ShowFullMenus := True;
|
|
FShowAnimation := True;
|
|
FExpandingMenu := True;
|
|
try
|
|
DestroyWnd;
|
|
finally
|
|
FExpandingMenu := False;
|
|
end;
|
|
Left := FOnShowLeft;
|
|
Top := FOnShowTop;
|
|
Show;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.ExtendedView: Boolean;
|
|
begin
|
|
Result := BarManager.ShowRecentItemsFirst and ShowFullMenus;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.InvalidateDetachCaption;
|
|
var
|
|
DC: HDC;
|
|
begin
|
|
DC := GetWindowDC(Handle);
|
|
PainterClass.SubMenuControlDrawDetachCaption(Self, DC, DetachCaptionRect);
|
|
ReleaseDC(Handle, DC);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.MouseOnUpArrow: Boolean;
|
|
var
|
|
P: TPoint;
|
|
R: TRect;
|
|
begin
|
|
GetCursorPos(P);
|
|
Windows.ScreenToClient(Handle, P);
|
|
R := GetItemRect(ItemLinks.CanVisibleItems[TopIndex].Control);
|
|
Result := PtInRect(R, P);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.MouseOnDownArrow: Boolean;
|
|
var
|
|
P: TPoint;
|
|
R: TRect;
|
|
begin
|
|
GetCursorPos(P);
|
|
Windows.ScreenToClient(Handle, P);
|
|
R := GetItemRectEx(ItemLinks.VisibleItems[TopIndex + MaxVisibleCount - 1].Control, True);
|
|
R.Bottom := ClientHeight - 2;
|
|
if MarkExists then Dec(R.Bottom, TextSize);
|
|
Result := PtInRect(R, P);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.MouseOnMark: Boolean;
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
GetCursorPos(P);
|
|
Windows.ScreenToClient(Handle, P);
|
|
Result := PtInRect(MarkRect, P);
|
|
end;
|
|
|
|
procedure ExpandMenuTimerProc(Wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
|
|
begin
|
|
with TdxBarSubMenuControl(FindControl(Wnd)) do
|
|
begin
|
|
KillExpandMenuTimer;
|
|
if idEvent = 3 then
|
|
MarkState := msPressed
|
|
else
|
|
if ChildBar = nil then
|
|
MarkState := msSelected;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.SetExpandMenuTimer(Time: UINT; ExpandAfterDelay: Boolean);
|
|
begin
|
|
FExpandMenuTimer := SetTimer(Handle, 2 + Byte(ExpandAfterDelay), Time, @ExpandMenuTimerProc);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.KillExpandMenuTimer;
|
|
begin
|
|
if FExpandMenuTimer <> 0 then
|
|
begin
|
|
KillTimer(Handle, FExpandMenuTimer);
|
|
FExpandMenuTimer := 0;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMGetDlgCode;
|
|
begin
|
|
Message.Result := DLGC_WANTALLKEYS or DLGC_WANTARROWS or DLGC_WANTTAB;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMKeyDown(var Message: TWMKeyDown);
|
|
var
|
|
ALinkSelf: TcxObjectLink;
|
|
Shift: TShiftState;
|
|
ParentBarControl: TCustomdxBarControl;
|
|
begin
|
|
TerminateAnimation(Self);
|
|
|
|
Shift := KeyDataToShiftState(Message.KeyData);
|
|
if (Message.CharCode in [VK_DOWN, VK_TAB]) and MarkExists then
|
|
if (Message.CharCode = VK_DOWN) and (Shift = [ssCtrl]) then
|
|
begin
|
|
MarkState := msPressed;
|
|
Exit;
|
|
end
|
|
else
|
|
if (Shift = []) and (SelectedItem <> nil) then
|
|
with SelectedItem.ItemLink do
|
|
if VisibleIndex = Owner.VisibleItemCount - 1 then
|
|
begin
|
|
MarkState := msPressed;
|
|
SendMessage(Handle, WM_KEYDOWN, Message.CharCode, 1);
|
|
Exit;
|
|
end;
|
|
|
|
ALinkSelf := cxAddObjectLink(Self);
|
|
try
|
|
inherited;
|
|
if (ALinkSelf.Ref = nil) or (ActiveBarControl = nil) or SelectedItemWantsKey(Message.CharCode) then
|
|
Exit;
|
|
with Message do
|
|
begin
|
|
case CharCode of
|
|
VK_ESCAPE:
|
|
if (ParentBar <> nil) and (ParentBar.FSelectedItem <> nil) then
|
|
begin
|
|
ParentBarControl := ParentBar;
|
|
ParentBarControl.FSelectedItem.ControlInactivate(True);
|
|
if ParentBarControl is TdxBarControl then
|
|
TdxBarControl(ParentBarControl).IsDowned := False;
|
|
end
|
|
else
|
|
Hide;
|
|
VK_LEFT:
|
|
begin
|
|
if ParentBar <> nil then
|
|
ParentBarControl := ParentBar
|
|
else
|
|
if FDropDownButton <> nil then
|
|
ParentBarControl := FDropDownButton.Parent
|
|
else
|
|
ParentBarControl := nil;
|
|
if (ParentBarControl <> nil) and (ParentBarControl.SelectedItem <> nil) then
|
|
if ParentBarControl is TdxBarSubMenuControl then
|
|
ParentBarControl.SelectedItem.ControlInactivate(True)
|
|
else
|
|
begin
|
|
ParentBarControl := GetParentBarForBar(Self);
|
|
if ParentBarControl <> nil then
|
|
if IsRealVertical(ParentBarControl) then
|
|
Message.Result := SendMessage(Handle, WM_KEYDOWN, VK_ESCAPE, 0)
|
|
else
|
|
Message.Result := SendMessage(ParentBarControl.Handle,
|
|
WM_KEYDOWN, VK_LEFT, 0);
|
|
end;
|
|
end;
|
|
VK_RIGHT:
|
|
begin
|
|
ParentBarControl := GetParentBarForBar(Self);
|
|
if ParentBarControl <> nil then
|
|
Message.Result := SendMessage(ParentBarControl.Handle,
|
|
WM_KEYDOWN, VK_RIGHT, 0);
|
|
end;
|
|
VK_RETURN:
|
|
if SelectedItem <> nil then SelectedItem.Click(False);
|
|
end;
|
|
end;
|
|
finally
|
|
cxRemoveObjectLink(ALinkSelf);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMLButtonDown(var Message: TWMLButtonDown);
|
|
begin
|
|
if FScrollTimerId <> 0 then Exit;
|
|
inherited;
|
|
if not BarControlExists(Self) then Exit;
|
|
if FIgnoreMouseClick then Exit;
|
|
TerminateAnimation(Self);
|
|
if DetachCaptionSelected then
|
|
DoDetachMenu
|
|
else
|
|
if MarkExists and MouseOnMark then
|
|
if MarkState = msNone then
|
|
begin
|
|
SetKeySelectedItem(nil);
|
|
MarkState := msSelected;
|
|
end
|
|
else
|
|
begin
|
|
// FIgnoreMouseClick := True;
|
|
MarkState := msPressed;
|
|
end;
|
|
end;
|
|
|
|
procedure EndScrollingSubMenu(Wnd: HWND);
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
with TdxBarSubMenuControl(FindControl(Wnd)) do
|
|
begin
|
|
KillTimer(Handle, FScrollTimerId);
|
|
FScrollTimerId := 0;
|
|
FLastMousePos := Point(-1, -1);
|
|
GetCursorPos(P);
|
|
if BarManager.Dragging then
|
|
begin
|
|
Windows.ScreenToClient(BarManager.MainForm.Handle, P);
|
|
PostMessage(BarManager.MainForm.Handle, WM_MOUSEMOVE, 0, MakeLParam(P.X, P.Y));
|
|
end
|
|
else
|
|
begin
|
|
Windows.ScreenToClient(Handle, P);
|
|
SendMessage(Handle, WM_MOUSEMOVE, 0, MakeLParam(P.X, P.Y));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure UpArrowTimerProc(Wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
|
|
begin
|
|
with TdxBarSubMenuControl(FindControl(Wnd)) do
|
|
if UpArrowExists and MouseOnUpArrow then
|
|
TopIndex := TopIndex - 1
|
|
else
|
|
EndScrollingSubMenu(Wnd);
|
|
end;
|
|
|
|
procedure DownArrowTimerProc(Wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
|
|
begin
|
|
with TdxBarSubMenuControl(FindControl(Wnd)) do
|
|
if DownArrowExists and MouseOnDownArrow then
|
|
TopIndex := TopIndex + 1
|
|
else
|
|
EndScrollingSubMenu(Wnd);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMMouseLeave(var Message: TMessage);
|
|
begin
|
|
DetachCaptionSelected := False;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMMouseMove(var Message: TWMMouseMove);
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
P := SmallPointToPoint(Message.Pos);
|
|
if not NotHandleMouseMove(P) then
|
|
begin
|
|
TerminateAnimation(Self);
|
|
if not BarControlExists(Self) then Exit;
|
|
end
|
|
else
|
|
if AnimatingSubMenu = Self then Exit;
|
|
if WantMouse and (FSubItem <> nil) and (ParentBar <> nil) then
|
|
ParentBar.SetMouseSelectedItem(FSubItem);
|
|
if Detachable then
|
|
DetachCaptionSelected := MouseOnDetachCaption;
|
|
if MarkExists then
|
|
if MouseOnMark then
|
|
MarkState := msSelected
|
|
else
|
|
MarkState := msNone;
|
|
Windows.ClientToScreen(Handle, P);
|
|
if UpArrowExists and MouseOnUpArrow then
|
|
if (FScrollTimerId = 0) and ((FLastMousePos.X <> P.X) or (FLastMousePos.Y <> P.Y)) then
|
|
begin
|
|
if SelectedItem = BarManager.SelectedItem then
|
|
BarManager.FSelectedItem := nil; // otherwise BarManager will hide all
|
|
SetKeySelectedItem(nil);
|
|
FScrollTimerId := SetTimer(Handle, 1, dxBarScrollMenuTime, @UpArrowTimerProc);
|
|
end
|
|
else
|
|
else
|
|
if DownArrowExists and MouseOnDownArrow then
|
|
if (FScrollTimerId = 0) and ((FLastMousePos.X <> P.X) or (FLastMousePos.Y <> P.Y)) then
|
|
begin
|
|
if SelectedItem = BarManager.SelectedItem then
|
|
BarManager.FSelectedItem := nil; // otherwise BarManager will hide all
|
|
SetKeySelectedItem(nil);
|
|
FScrollTimerId := SetTimer(Handle, 1, dxBarScrollMenuTime, @DownArrowTimerProc);
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
if FScrollTimerId > 0 then
|
|
begin
|
|
KillTimer(Handle, FScrollTimerId);
|
|
FScrollTimerId := 0;
|
|
FLastMousePos := Point(-1, -1);
|
|
end;
|
|
inherited;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMNCCalcSize(var Message: TWMNCCalcSize);
|
|
begin
|
|
inherited;
|
|
with Message.CalcSize_Params^ do
|
|
begin
|
|
InflateRect(rgrc[0], -1, -1);
|
|
if Detachable then
|
|
Inc(rgrc[0].Top, DetachCaptionAreaSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMNCHitTest(var Message: TWMNCHitTest);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
if Detachable then
|
|
begin
|
|
R := DetachCaptionRect;
|
|
OffsetRect(R, Left, Top);
|
|
if PtInRect(R, SmallPointToPoint(Message.Pos)) then
|
|
Message.Result := HTCLIENT
|
|
else
|
|
inherited;
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMNCPaint(var Message: TWMNCPaint);
|
|
var
|
|
DC: HDC;
|
|
begin
|
|
inherited;
|
|
DC := GetWindowDC(Handle);
|
|
NCPaint(DC);
|
|
ReleaseDC(Handle, DC);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMPrint(var Message: TMessage);
|
|
begin
|
|
inherited;
|
|
NCPaint(Message.WParam);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMPrintClient(var Message: TMessage);
|
|
begin
|
|
inherited;
|
|
PaintWindow(Message.WParam);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMRButtonDown(var Message: TWMRButtonUp);
|
|
begin
|
|
inherited;
|
|
if IsContextMenu then
|
|
with TMessage(Message) do
|
|
SendMessage(Handle, WM_LBUTTONDOWN, WParam, LParam);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.WMRButtonUp(var Message: TWMRButtonUp);
|
|
begin
|
|
inherited;
|
|
if IsContextMenu then
|
|
with TMessage(Message) do
|
|
SendMessage(Handle, WM_LBUTTONUP, WParam, LParam);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.CMFontChanged(var Message: TMessage);
|
|
begin
|
|
inherited;
|
|
Canvas.Font := Font;
|
|
CalcDrawingConsts;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited CreateParams(Params);
|
|
with Params do
|
|
begin
|
|
Style := WS_CLIPCHILDREN or WS_CLIPSIBLINGS or WS_POPUP;
|
|
ExStyle := ExStyle or WS_EX_TOPMOST;
|
|
WindowClass.Style :=
|
|
CS_DBLCLKS or CS_HREDRAW or CS_VREDRAW or CS_OWNDC or CS_SAVEBITS;
|
|
if ParentWnd > 0 then
|
|
WndParent := ParentWnd
|
|
else
|
|
WndParent := BarManager.MainForm.Handle;
|
|
end;
|
|
end;
|
|
|
|
function AnimationThreadProc(lpParameter: Pointer): DWORD; stdcall;
|
|
var
|
|
I: Integer;
|
|
FirstTime: DWORD;
|
|
DC: HDC;
|
|
|
|
procedure DoOneStepOfAnimation;
|
|
var
|
|
NewLeft, NewTop, NewClientWidth, NewClientHeight: Integer;
|
|
R, R1, R2: TRect;
|
|
begin
|
|
with AnimatingSubMenu, AnimationInfo do
|
|
begin
|
|
begin
|
|
if FirstValue >= 0 then
|
|
begin
|
|
NewClientWidth := Step * I;
|
|
NewClientHeight := FirstValue + NewClientWidth;
|
|
if MenuAnimations = maSlide then NewClientWidth := ClientWidth;
|
|
end
|
|
else
|
|
begin
|
|
NewClientHeight := Step * I;
|
|
NewClientWidth := Abs(FirstValue) + NewClientHeight;
|
|
end;
|
|
|
|
if LeftDirection then
|
|
NewLeft := Left - (NewClientWidth - ClientWidth)
|
|
else
|
|
NewLeft := Left;
|
|
if TopDirection then
|
|
NewTop := Top - (NewClientHeight - ClientHeight)
|
|
else
|
|
NewTop := Top;
|
|
|
|
SetWindowPos(Handle, 0, NewLeft, NewTop,
|
|
BorderWidth + NewClientWidth, BorderHeight + NewClientHeight,
|
|
SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW);
|
|
DC := GetDC(Handle);
|
|
PreparePalette(DC);
|
|
|
|
R1 := OldClientRect;
|
|
if TopDirection then
|
|
begin
|
|
R := Rect(0, 0, NewClientWidth, NewClientHeight);
|
|
OffsetRect(R1, 0, NewClientHeight - R1.Bottom);
|
|
with OldClientRect do
|
|
BitBlt(DC, Left, Top, Right - Left, Bottom - Top,
|
|
DC, R1.Left, R1.Top, SRCCOPY);
|
|
R1 := OldClientRect;
|
|
BitBlt(DC, 0, R1.Bottom, ClientWidth, ClientHeight - R1.Bottom,
|
|
AnimationBitmapDC, R.Left, R.Top + R1.Bottom, SRCCOPY);
|
|
BitBlt(DC, R1.Right, R1.Top, ClientWidth - R1.Right, R1.Bottom - R1.Top,
|
|
AnimationBitmapDC, R.Left + R1.Right, R.Top, SRCCOPY);
|
|
end
|
|
else
|
|
if LeftDirection then
|
|
begin
|
|
R := Rect(RealClientWidth - ClientWidth, RealClientHeight - ClientHeight,
|
|
RealClientWidth, RealClientHeight);
|
|
OffsetRect(R1, ClientWidth - R1.Right, 0);
|
|
R2 := R1;
|
|
OffsetRect(R2, 0, ClientHeight - R1.Bottom);
|
|
with R2 do
|
|
BitBlt(DC, Left, Top, Right - Left, Bottom - Top,
|
|
DC, R1.Left, R1.Top, SRCCOPY);
|
|
R1 := R2;
|
|
BitBlt(DC, 0, 0, ClientWidth, R1.Top, AnimationBitmapDC, R.Left, R.Top, SRCCOPY);
|
|
BitBlt(DC, 0, R1.Top, R1.Left, ClientHeight - R1.Top,
|
|
AnimationBitmapDC, R.Left, R.Top + R1.Top, SRCCOPY);
|
|
end
|
|
else
|
|
begin
|
|
R := Rect(0, RealClientHeight - ClientHeight, ClientWidth, RealClientHeight);
|
|
OffsetRect(R1, 0, ClientHeight - R1.Bottom);
|
|
with R1 do
|
|
BitBlt(DC, Left, Top, Right - Left, Bottom - Top,
|
|
DC, OldClientRect.Left, OldClientRect.Top, SRCCOPY);
|
|
BitBlt(DC, 0, 0, ClientWidth, R1.Top, AnimationBitmapDC, R.Left, R.Top, SRCCOPY);
|
|
BitBlt(DC, R1.Right, R1.Top, ClientWidth - R1.Right, ClientHeight - R1.Top,
|
|
AnimationBitmapDC, R.Left + R1.Right, R.Top + R1.Top, SRCCOPY);
|
|
end;
|
|
OldClientRect := ClientRect;
|
|
|
|
UnpreparePalette(DC);
|
|
UpdateColors(DC);
|
|
ReleaseDC(Handle, DC);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Result := 0;
|
|
with AnimationInfo do
|
|
for I := 1 to Delta div Step do
|
|
begin
|
|
if KillingAnimation then Break;
|
|
FirstTime := GetTickCount;
|
|
DoOneStepOfAnimation;
|
|
Sleep(1);
|
|
while (GetTickCount - FirstTime < 1) and not KillingAnimation do;
|
|
end;
|
|
|
|
DeleteObject(SelectObject(AnimationBitmapDC, AnimationBitmap));
|
|
DeleteDC(AnimationBitmapDC);
|
|
|
|
with AnimatingSubMenu, AnimationInfo do
|
|
begin
|
|
FShowAnimation := False;
|
|
if not FDestroyFlag then
|
|
SetWindowPos(Handle, 0, RealLeft, RealTop,
|
|
BorderWidth + RealClientWidth, BorderHeight + RealClientHeight,
|
|
SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW or SWP_FRAMECHANGED {to enforce WM_WINDOWPOSCHANGED});
|
|
if not FDestroyFlag then Repaint;
|
|
end;
|
|
|
|
AnimatingSubMenu := nil;
|
|
AnimationThread := 0;
|
|
KillingAnimation := False;
|
|
CloseHandle(AnimationThread);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.CreateWnd;
|
|
var
|
|
ChangeXDirection, ChangeYDirection: Boolean;
|
|
AnimationThreadID: DWORD;
|
|
begin
|
|
//ProcessPaintMessages; - destroys submenu because of PeekMessage
|
|
CreateLightBrush;
|
|
inherited CreateWnd;
|
|
FOnShowLeft := Left;
|
|
FOnShowTop := Top;
|
|
IsActive := True;
|
|
SetRecentItemCount;
|
|
FTopIndex := -1;
|
|
TopIndex := 0;
|
|
SetSizeAndCheckBounds(ChangeXDirection, ChangeYDirection);
|
|
// PlaySound(psMenuPopup);
|
|
if FShowAnimation then
|
|
with AnimationInfo do
|
|
begin
|
|
//TerminateAnimation(AnimatingSubMenu); {1}
|
|
RealLeft := Left;
|
|
RealTop := Top;
|
|
RealClientWidth := ClientWidth;
|
|
RealClientHeight := ClientHeight;
|
|
BorderWidth := Width - ClientWidth;
|
|
BorderHeight := Height - ClientHeight;
|
|
LeftDirection := ((XDirection = xdLeft) and not ChangeXDirection) or
|
|
((XDirection = xdRight) and ChangeXDirection);
|
|
TopDirection := ((YDirection = ydTop) and not ChangeYDirection) or
|
|
((YDirection = ydBottom) and ChangeYDirection);
|
|
MenuAnimations := FMenuAnimations;
|
|
if MenuAnimations = maUnfold then
|
|
begin
|
|
FirstValue := ClientHeight - ClientWidth;
|
|
if FirstValue > 0 then
|
|
begin
|
|
OldClientRect := Rect(0, 0, 0, FirstValue);
|
|
Delta := ClientWidth;
|
|
end
|
|
else
|
|
begin
|
|
OldClientRect := Rect(0, 0, -FirstValue, 0);
|
|
Delta := ClientHeight;
|
|
end;
|
|
Step := 8;
|
|
end
|
|
else
|
|
if MenuAnimations = maSlide then
|
|
begin
|
|
FirstValue := 0;
|
|
OldClientRect := Rect(0, 0, ClientWidth, 0);
|
|
Delta := ClientHeight;
|
|
Step := 17;
|
|
end
|
|
else
|
|
begin
|
|
FirstValue := 0;
|
|
Delta := 128;
|
|
Step := 1;
|
|
end;
|
|
|
|
AnimationBitmap := CreateCompatibleBitmap(Canvas.Handle, RealClientWidth, RealClientHeight);
|
|
AnimationBitmapDC := CreateCompatibleDC(Canvas.Handle);
|
|
AnimationBitmap := SelectObject(AnimationBitmapDC, AnimationBitmap);
|
|
FShowAnimation := False;
|
|
PaintWindow(AnimationBitmapDC);
|
|
FShowAnimation := True;
|
|
DestroyLightBrush;
|
|
CreateLightBrush;
|
|
|
|
AnimatingSubMenu := Self;
|
|
AnimationThread := CreateThread(nil, 0, @AnimationThreadProc, nil, 0, AnimationThreadID);
|
|
end;
|
|
|
|
PlaySound(psMenuPopup);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.DestroyWindowHandle;
|
|
begin
|
|
if BarManager.Dragging and (BarManager.DraggingItemLink <> nil) and
|
|
(ItemLinks.IndexOf(BarManager.DraggingItemLink) > -1) and
|
|
(BarManager.FDraggingItemLinkParentHandle = 0) then
|
|
begin
|
|
BarManager.FDraggingItemLinkParentHandle := WindowHandle;
|
|
Perform(WM_DESTROY, 0, 0);
|
|
SetWindowLong(WindowHandle, GWL_WNDPROC, Longint(DefWndProc));
|
|
ShowWindow(WindowHandle, SW_HIDE);
|
|
DestroyControls;
|
|
WindowHandle := 0;
|
|
end
|
|
else inherited;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.DestroyWnd;
|
|
begin
|
|
TerminateAnimation(Self);
|
|
if FScrollTimerId > 0 then
|
|
begin
|
|
KillTimer(Handle, FScrollTimerId);
|
|
FScrollTimerId := 0;
|
|
end;
|
|
KillExpandMenuTimer;
|
|
if (ChildBar <> nil) and not ChildBar.FDestroyFlag and
|
|
ChildBar.HandleAllocated then ChildBar.DestroyWnd;
|
|
if not FExpandingMenu then
|
|
begin
|
|
IsActive := False;
|
|
if FDropDownButton <> nil then
|
|
with FDropDownButton do
|
|
if Parent.HandleAllocated then
|
|
begin
|
|
DoCloseUp;
|
|
Repaint;
|
|
if MousePressed then
|
|
begin
|
|
Parent.FIgnoreMouseClick := ArrowPressed;
|
|
if Parent is TdxBarControl then Parent.HideAll;
|
|
end
|
|
else
|
|
if (GetKeyState(VK_ESCAPE) >= 0) and
|
|
(GetKeyState(VK_LEFT) >= 0) and (GetKeyState(VK_RIGHT) >= 0) then
|
|
Parent.HideAll;
|
|
end;
|
|
end;
|
|
inherited DestroyWnd;
|
|
if Self = CustomizedPopup then CustomizedPopup := nil;
|
|
// ProcessPaintMessages;
|
|
DoCloseUp;
|
|
DestroyLightBrush;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.DoCloseUp;
|
|
begin
|
|
if Assigned(FOnCloseUp) then FOnCloseUp(Self);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.DoPopup;
|
|
begin
|
|
if Assigned(FOnPopup) then FOnPopup(Self);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.Paint;
|
|
var
|
|
R, CR, BarRect: TRect;
|
|
AMaxVisibleCount, I: Integer;
|
|
DC: HDC;
|
|
ABrush: HBRUSH;
|
|
AControl: TdxBarItemControl;
|
|
begin
|
|
if FShowAnimation or FDestroyFlag then Exit;
|
|
|
|
DC := Canvas.Handle;
|
|
ABrush := ToolbarBrush;
|
|
|
|
R := ClientRect;
|
|
PainterClass.SubMenuControlDrawClientBorder(Self, DC, R, ABrush);
|
|
|
|
InflateRect(R, -1, -1);
|
|
CR := R;
|
|
R.Right := R.Left + BarSize;
|
|
CR.Left := R.Right;
|
|
BarRect := R;
|
|
try
|
|
if ItemLinks.CanVisibleItemCount = 0 then
|
|
begin
|
|
FillBackground(DC, CR, ToolbarBrush, clNone, True);
|
|
Exit;
|
|
end;
|
|
|
|
CalcControlsPositions(nil);
|
|
AMaxVisibleCount := GetMaxVisibleCount;
|
|
if AMaxVisibleCount = 0 then AMaxVisibleCount := 1;
|
|
PainterClass.SubMenuControlDrawArrowsArea(Self, DC, ABrush, AMaxVisibleCount);
|
|
|
|
for I := 0 to ItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
AControl := ItemLinks.VisibleItems[I].Control;
|
|
AControl.RealVisibleChanging(((TopIndex + Byte(UpArrowExists)) <= I) and
|
|
(I <= (TopIndex + AMaxVisibleCount - 1 - Byte(DownArrowExists))));
|
|
end;
|
|
|
|
for I := TopIndex + Byte(UpArrowExists) to TopIndex + AMaxVisibleCount - 1 - Byte(DownArrowExists) do
|
|
begin
|
|
AControl := ItemLinks.VisibleItems[I].Control;
|
|
AControl.FLastInRow := False;
|
|
PaintItem(AControl);
|
|
end;
|
|
|
|
if DownArrowExists and (TopIndex + AMaxVisibleCount - 2 >= 0) then
|
|
ItemLinks.VisibleItems[TopIndex + AMaxVisibleCount - 2].Control.FLastInRow := True
|
|
else
|
|
ItemLinks.VisibleItems[ItemLinks.VisibleItemCount - 1].Control.FLastInRow := True;
|
|
finally
|
|
DrawBar(BarRect);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.NCPaint(DC: HDC);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
GetWindowRect(R);
|
|
OffsetRect(R, -R.Left, -R.Top);
|
|
PainterClass.SubMenuControlDrawBorder(Self, DC, R);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.CalcDrawingConsts;
|
|
begin
|
|
inherited;
|
|
PainterClass.SubMenuControlCalcDrawingConsts(Self, FTextSize, FMenuArrowWidth,
|
|
FMarkSize, FNormalItemHeight);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.CanCustomizing: Boolean;
|
|
begin
|
|
Result := inherited CanCustomizing or
|
|
(ItemLinks.Owner is TdxBarSubItem) and TdxBarSubItem(ItemLinks.Owner).AllowCustomizing or
|
|
(ItemLinks.Owner is TdxBarPopupMenu);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.ChildrenHaveShadows: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.CreateControls;
|
|
var
|
|
FDoneItems: TList;
|
|
I: Integer;
|
|
AItemLink: TdxBarItemLink;
|
|
FirstCall, HideWhenRun: Boolean;
|
|
begin
|
|
if (FItemLinks <> nil) and not IsCustomizing and not FDestroyingControls then
|
|
begin
|
|
FDoneItems := TList.Create;
|
|
try
|
|
I := 0;
|
|
while I <= FItemLinks.CanVisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := FItemLinks.CanVisibleItems[I];
|
|
if AItemLink.Item is TCustomdxBarContainerItem then
|
|
begin
|
|
if FSavedItemLinks = nil then
|
|
FSavedItemLinks := TList.Create;
|
|
FSavedItemLinks.Count := AItemLink.Index + 1;
|
|
FSavedItemLinks[AItemLink.Index] := AItemLink;
|
|
|
|
FirstCall := FDoneItems.IndexOf(AItemLink.Item) = -1;
|
|
if FirstCall then FDoneItems.Add(AItemLink.Item);
|
|
|
|
HideWhenRun := TCustomdxBarContainerItem(AItemLink.Item).HideWhenRun;
|
|
if HideWhenRun then AItemLink.SaveRecentIndex;
|
|
|
|
TCustomdxBarContainerItem(AItemLink.Item).AddListedItemLinks(FItemLinks,
|
|
AItemLink.Index + 1, FirstCall, AItemLink);
|
|
if HideWhenRun then
|
|
begin
|
|
AItemLink.SendToBottomInRecentList;
|
|
AItemLink.Collection := nil;
|
|
Dec(I);
|
|
end;
|
|
end;
|
|
Inc(I);
|
|
end;
|
|
finally
|
|
FDoneItems.Free;
|
|
end;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.DestroyControls;
|
|
var
|
|
I: Integer;
|
|
HideWhenRun: Boolean;
|
|
begin
|
|
inherited;
|
|
if not IsCustomizing and (FSavedItemLinks <> nil) and not FDestroyingControls then
|
|
begin
|
|
FDestroyingControls := True;
|
|
try
|
|
for I := FSavedItemLinks.Count - 1 downto 0 do
|
|
if FSavedItemLinks[I] <> nil then
|
|
with TdxBarItemLink(FSavedItemLinks[I]) do
|
|
begin
|
|
HideWhenRun := TCustomdxBarContainerItem(Item).HideWhenRun;
|
|
TCustomdxBarContainerItem(Item).DeleteListedItemLinks(FItemLinks, I + Byte(not HideWhenRun));
|
|
if HideWhenRun then
|
|
begin
|
|
Collection := FItemLinks;
|
|
Index := I;
|
|
RestoreRecentIndex;
|
|
end;
|
|
end;
|
|
|
|
for I := 0 to FSavedItemLinks.Count - 1 do
|
|
if FSavedItemLinks[I] <> nil then
|
|
TCustomdxBarContainerItem(TdxBarItemLink(FSavedItemLinks[I]).Item).NeedClearItemList;
|
|
finally
|
|
FSavedItemLinks.Free;
|
|
FSavedItemLinks := nil;
|
|
FDestroyingControls := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.DrawBar(const R: TRect);
|
|
begin
|
|
if BarManager.Designing then
|
|
DrawVerticalGradient(Canvas, R, 0, 0, 0, 0, 0, 255)
|
|
else
|
|
if ItemLinks.Owner is TdxBarPopupMenu then
|
|
TdxBarPopupMenu(ItemLinks.Owner).DoPaintBar(Canvas, R)
|
|
else
|
|
if ItemLinks.Owner is TCustomdxBarSubItem then
|
|
TCustomdxBarSubItem(ItemLinks.Owner).DoPaintBar(Canvas, R);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetBeginGroupSize: Integer;
|
|
begin
|
|
Result := PainterClass.SubMenuControlBeginGroupSize;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetEditFontHandle: HFONT;
|
|
begin
|
|
if ParentBar = nil then
|
|
if (ItemLinks.Owner is TdxBarPopupMenu) and
|
|
TdxBarPopupMenu(ItemLinks.Owner).UseOwnFont then
|
|
Result := TdxBarPopupMenu(ItemLinks.Owner).FEditFontHandle
|
|
else
|
|
Result := inherited GetEditFontHandle
|
|
else
|
|
Result := ParentBar.GetEditFontHandle;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetIsContextMenu: Boolean;
|
|
begin
|
|
Result :=
|
|
(OwnerWidth = 0) and (OwnerHeight = 0) or
|
|
(ParentBar is TdxBarSubMenuControl) and TdxBarSubMenuControl(ParentBar).IsContextMenu;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetIsCustomizing: Boolean;
|
|
begin
|
|
if (FSubItem <> nil) and (FSubItem.ItemLink.Item is TdxBarSubItem) and
|
|
TdxBarSubItem(FSubItem.ItemLink.Item).IsInternal then
|
|
Result := False
|
|
else
|
|
Result := inherited GetIsCustomizing;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetIsShadowVisible: Boolean;
|
|
begin
|
|
Result := inherited GetIsShadowVisible and not FShowAnimation;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetItemRectEx(Item: TdxBarItemControl;
|
|
IsBeginGroup: Boolean): TRect;
|
|
var
|
|
AIndex: Integer;
|
|
begin
|
|
Result := inherited GetItemRectEx(Item, IsBeginGroup);
|
|
if Item <> nil then
|
|
begin
|
|
if Item.FChangeRecentGroup and
|
|
PainterClass.SubMenuControlIsOffsetRecentGroupNeeded then
|
|
Dec(Result.Top);
|
|
if IsBeginGroup and Item.ItemLink.BeginGroup then
|
|
begin
|
|
AIndex := Item.ItemLink.VisibleIndex;
|
|
if (AIndex > TopIndex) and not (UpArrowExists and (AIndex = TopIndex + 1)) then
|
|
Dec(Result.Top, BeginGroupSize);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.HideOnClick: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.ItemAtPosEx(Pos: TPoint;
|
|
var IsBeginGroup, IsFirstPart, IsVerticalDirection: Boolean): TdxBarItemControl;
|
|
begin
|
|
if UpArrowExists and MouseOnUpArrow or DownArrowExists and MouseOnDownArrow or
|
|
MarkExists and MouseOnMark then
|
|
Result := nil
|
|
else
|
|
Result := inherited ItemAtPosEx(Pos, IsBeginGroup, IsFirstPart, IsVerticalDirection);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.PaintItem(AControl: TdxBarItemControl);
|
|
var
|
|
AIndex, LeftDelta: Integer;
|
|
AItemRect: TRect;
|
|
DC: HDC;
|
|
ANonRecent: Boolean;
|
|
begin
|
|
if FDestroyFlag or (AControl.ItemLink.Control = nil) then Exit;
|
|
inherited;
|
|
AItemRect := GetItemRect(AControl);
|
|
if IsRectEmpty(AItemRect) then
|
|
begin
|
|
SetRectEmpty(AControl.FBeginGroupRect);
|
|
Exit;
|
|
end;
|
|
DC := Canvas.Handle;
|
|
ANonRecent := not PainterClass.IgnoreNonRecentColor and AControl.FNonRecent;
|
|
if ANonRecent then
|
|
begin
|
|
PreparePalette(DC);
|
|
FBkBrush := FLightBrush;
|
|
end
|
|
else
|
|
PainterClass.SubMenuControlPrepareBkBrush(Self, FBkBrush);
|
|
AIndex := AControl.ItemLink.VisibleIndex;
|
|
LeftDelta := Ord(BarSize = 0);
|
|
|
|
if AControl.ItemLink.BeginGroup and (AIndex > TopIndex) and
|
|
not (UpArrowExists and (AIndex = TopIndex + 1)) then
|
|
PainterClass.SubMenuControlDrawBeginGroup(Self, AControl, DC, AItemRect, LeftDelta)
|
|
else
|
|
SetRectEmpty(AControl.FBeginGroupRect);
|
|
|
|
PainterClass.SubMenuControlDrawItemFrame(Self, AControl, DC, AItemRect, AIndex, LeftDelta);
|
|
|
|
AControl.Paint(AItemRect, ptMenu);
|
|
DrawSelectedItem(AControl);
|
|
|
|
if ANonRecent then
|
|
UnpreparePalette(DC);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.SetFont;
|
|
begin
|
|
if ParentBar = nil then
|
|
if ItemLinks.Owner is TdxBarPopupMenu then
|
|
Font := TdxBarPopupMenu(ItemLinks.Owner).Font
|
|
else
|
|
Font := BarManager.Font
|
|
else
|
|
Font := ParentBar.Font;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.SetIsActive(Value: Boolean);
|
|
var
|
|
PrevIsActive: Boolean;
|
|
begin
|
|
PrevIsActive := IsActive;
|
|
inherited;
|
|
if not BarControlExists(Self) then Exit;
|
|
if IsActive and not PrevIsActive and
|
|
BarManager.ShowRecentItemsFirst and not ShowFullMenus and
|
|
BarManager.ShowFullMenusAfterDelay then
|
|
SetExpandMenuTimer(dxBarSlowExpandMenuTime, True);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.SetLayeredAttributes;
|
|
begin
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.SetMarkState(Value: TdxBarMarkState);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
if IsCustomizing or not BarManager.ShowRecentItemsFirst then Exit;
|
|
if (Value = msSelected) and (SelectedItem is TdxBarWinControl) and
|
|
TdxBarWinControl(SelectedItem).Focused then Value := msNone;
|
|
if FMarkState <> Value then
|
|
begin
|
|
FMarkState := Value;
|
|
if Value = msPressed then ExpandMenu
|
|
else
|
|
begin
|
|
R := MarkRect;
|
|
InvalidateRect(Handle, @R, False);
|
|
end;
|
|
if BarManager.ShowFullMenusAfterDelay then
|
|
begin
|
|
KillExpandMenuTimer;
|
|
if (FMarkState = msSelected) and MouseOnMark then
|
|
SetExpandMenuTimer(dxBarWaitForShowHintTime, True);
|
|
end
|
|
else
|
|
if FMarkState = msSelected then
|
|
BarManager.HintActivate(True, cxGetResourceString(@dxSBAR_EXPAND))
|
|
else
|
|
BarManager.HintActivate(False, '');
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.SetRecentItemCount;
|
|
begin
|
|
with ItemLinks do
|
|
if BarManager.ShowRecentItemsFirst and not ShowFullMenus then
|
|
RecentItemCount := MostRecentItemCount
|
|
else
|
|
RecentItemCount := -1;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.SetSelectedItem(Value: TdxBarItemControl);
|
|
var
|
|
AIndex: Integer;
|
|
begin
|
|
if MarkState = msNone then
|
|
begin
|
|
KillExpandMenuTimer;
|
|
if IsActive and BarManager.ShowRecentItemsFirst and
|
|
not ShowFullMenus and BarManager.ShowFullMenusAfterDelay then
|
|
SetExpandMenuTimer(dxBarSlowExpandMenuTime, False);
|
|
end;
|
|
if Value <> nil then
|
|
begin
|
|
AIndex := Value.ItemLink.VisibleIndex;
|
|
if UpArrowExists and (AIndex <= TopIndex) then
|
|
TopIndex := AIndex - 1
|
|
else
|
|
if DownArrowExists and (AIndex >= TopIndex + MaxVisibleCount - 1) then
|
|
begin
|
|
repeat
|
|
Inc(FTopIndex);
|
|
CalcControlsPositions(nil);
|
|
until AIndex <= TopIndex + MaxVisibleCount - 1 - Byte(DownArrowExists);
|
|
Repaint;
|
|
end;
|
|
end;
|
|
inherited SetSelectedItem(Value);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.SetSizeAndCheckBounds(var ChangeXDirection, ChangeYDirection: Boolean);
|
|
var
|
|
Size: TPoint;
|
|
R: TRect;
|
|
begin
|
|
CalcControlsPositions(@Size);
|
|
|
|
R := GetWorkArea(Point(Left, Top));
|
|
ChangeXDirection := False;
|
|
ChangeYDirection := False;
|
|
|
|
if Left + Size.X > R.Right then
|
|
if OwnerWidth = 0 then
|
|
Left := R.Right - Size.X
|
|
else
|
|
if Left - OwnerWidth - R.Left > R.Right - Left then
|
|
begin
|
|
Left := Left - OwnerWidth - Size.X;
|
|
ChangeXDirection := True;
|
|
end;
|
|
if Left < R.Left then
|
|
if OwnerWidth = 0 then
|
|
Left := R.Left
|
|
else
|
|
if (XDirection = xdLeft) and
|
|
(R.Right - (Left + Size.X + OwnerWidth) > Left + Size.X - R.Left) then
|
|
begin
|
|
Left := Left + Size.X + OwnerWidth;
|
|
ChangeXDirection := True;
|
|
end;
|
|
if Left + Size.X > R.Right then Left := R.Right - Size.X;
|
|
if Left < R.Left then Left := R.Left;
|
|
|
|
if Top + Size.Y > R.Bottom then
|
|
if OwnerHeight = 0 then
|
|
if (OwnerWidth = 0) and (Top - Size.Y >= R.Top) then // for popupmenu
|
|
begin
|
|
Top := Top - Size.Y;
|
|
ChangeYDirection := True;
|
|
end
|
|
else
|
|
Top := R.Bottom - Size.Y
|
|
else
|
|
if Top - OwnerHeight - R.Top > R.Bottom - Top then
|
|
begin
|
|
Top := Top - OwnerHeight - Size.Y;
|
|
ChangeYDirection := True;
|
|
end
|
|
else
|
|
Size.Y := R.Bottom - Top;
|
|
if Top < R.Top then
|
|
if YDirection = ydBottom then
|
|
if ChangeYDirection and (OwnerHeight <> 0) then
|
|
begin
|
|
Size.Y := Size.Y - (R.Top - Top);
|
|
Top := R.Top;
|
|
end
|
|
else
|
|
begin
|
|
Top := R.Top;
|
|
if Top + Size.Y > R.Bottom then
|
|
Size.Y := R.Bottom - Top;
|
|
end
|
|
else
|
|
if (OwnerHeight <> 0) and
|
|
(R.Bottom - (Top + Size.Y + OwnerHeight) > Top + Size.Y - R.Top) then
|
|
begin
|
|
Top := Top + Size.Y + OwnerHeight;
|
|
if Top + Size.Y > R.Bottom then Size.Y := R.Bottom - Top;
|
|
ChangeYDirection := True;
|
|
end;
|
|
|
|
SetBounds(Left, Top, Size.X, Size.Y);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.CanDetach: Boolean;
|
|
begin
|
|
Result := Detachable and
|
|
(FSubItem.Item.GetDetachingBar <> nil) and
|
|
((GetParentBarForBar(FSubItem.Parent) = nil) or
|
|
(GetParentBarForBar(FSubItem.Parent) <> FSubItem.Item.GetDetachingBar.Control));
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.Detachable: Boolean;
|
|
begin
|
|
Result := (FSubItem <> nil) and FSubItem.Item.Detachable;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.DetachCaptionAreaSize: Integer;
|
|
begin
|
|
Result := PainterClass.SubMenuControlDetachCaptionAreaSize(Self);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.DetachCaptionRect: TRect;
|
|
begin
|
|
GetWindowRect(Result);
|
|
with Result do
|
|
OffsetRect(Result, -Left, -Top);
|
|
PainterClass.SubMenuControlOffsetDetachCaptionRect(Self, Result);
|
|
with Result do
|
|
Bottom := Top + DetachCaptionSize;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.MouseOnDetachCaption: Boolean;
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
GetCursorPos(P);
|
|
with P do
|
|
begin
|
|
Dec(X, Left);
|
|
Dec(Y, Top);
|
|
end;
|
|
Result := PtInRect(DetachCaptionRect, P);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.DoDetachMenu;
|
|
var
|
|
ADetachingBar: TdxBar;
|
|
ASubItem: TdxBarSubItemControl;
|
|
NonDetachableArea: TRect;
|
|
Success, Started: Boolean;
|
|
PrevP, P: TPoint;
|
|
CaptureWnd: HWND;
|
|
Msg: TMsg;
|
|
ABarManager: TdxBarManager;
|
|
begin
|
|
FSubItem.Item.DoDetaching;
|
|
if not CanDetach then Exit;
|
|
ADetachingBar := FSubItem.Item.GetDetachingBar;
|
|
ASubItem := FSubItem;
|
|
|
|
NonDetachableArea := DetachCaptionRect;
|
|
OffsetRect(NonDetachableArea, Left, Top);
|
|
InflateRect(NonDetachableArea, DetachAreaDelta, DetachAreaDelta);
|
|
|
|
Success := False;
|
|
Started := False;
|
|
GetCursorPos(PrevP);
|
|
|
|
ABarManager := BarManager; // if self is will destroyed
|
|
ABarManager.FDetachingSubMenu := True;
|
|
CaptureWnd := ParentBar.Handle;
|
|
SetCapture(CaptureWnd);
|
|
try
|
|
while GetCapture = CaptureWnd do
|
|
begin
|
|
case Integer(GetMessage(Msg, 0, 0, 0)) of
|
|
-1: Break;
|
|
0: begin
|
|
PostQuitMessage(Msg.wParam);
|
|
Break;
|
|
end;
|
|
end;
|
|
case Msg.message of
|
|
WM_KEYDOWN, WM_KEYUP:
|
|
if Msg.wParam = VK_ESCAPE then
|
|
begin
|
|
ASubItem.ControlActivate(True);
|
|
Break;
|
|
end;
|
|
WM_MOUSEMOVE:
|
|
begin
|
|
P := SmallPointToPoint(TSmallPoint(Msg.lParam));
|
|
Windows.ClientToScreen(Msg.hwnd, P);
|
|
if (P.X <> PrevP.X) or (P.Y <> PrevP.Y) then
|
|
begin
|
|
if not Started and not PtInRect(NonDetachableArea, P) then
|
|
begin
|
|
ASubItem.ControlInactivate(True);
|
|
if ADetachingBar.DockingStyle <> dsNone then
|
|
begin
|
|
ADetachingBar.Visible := False;
|
|
ADetachingBar.DockingStyle := dsNone;
|
|
end;
|
|
if not ADetachingBar.Visible then
|
|
begin
|
|
ADetachingBar.FloatLeft := P.X - 100;
|
|
ADetachingBar.FloatTop := P.Y - ABarManager.PainterClass.BarCaptionAreaSize div 2;
|
|
ADetachingBar.Visible := True;
|
|
end;
|
|
Started := True;
|
|
end;
|
|
if Started then
|
|
if PtInRect(NonDetachableArea, P) then
|
|
begin
|
|
ADetachingBar.Visible := False;
|
|
ASubItem.ControlActivate(True);
|
|
Break;
|
|
end
|
|
else
|
|
with ADetachingBar.Control do
|
|
SetWindowPos(Handle,
|
|
0, P.X - Width div 2, P.Y - ABarManager.PainterClass.BarCaptionAreaSize div 2, 0, 0,
|
|
SWP_NOZORDER or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
PrevP := P;
|
|
end;
|
|
end;
|
|
WM_LBUTTONUP:
|
|
begin
|
|
Success := True;
|
|
Break;
|
|
end;
|
|
else
|
|
TranslateMessage(Msg);
|
|
DispatchMessage(Msg);
|
|
end;
|
|
end;
|
|
finally
|
|
if GetCapture = CaptureWnd then ReleaseCapture;
|
|
if Started then
|
|
if Success then
|
|
ADetachingBar.BarManager.HideAll
|
|
else
|
|
ADetachingBar.Visible := False;
|
|
ADetachingBar.BarManager.FDetachingSubMenu := False;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.MarkArrowSize: Integer;
|
|
begin
|
|
Result := PainterClass.SubMenuControlMarkArrowSize(Self, FMarkSize);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.MarkExists: Boolean;
|
|
begin
|
|
Result := BarManager.ShowRecentItemsFirst and
|
|
(ItemLinks.VisibleItemCount < ItemLinks.CanVisibleItemCount);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.MarkRect: TRect;
|
|
var
|
|
AOffset: Integer;
|
|
begin
|
|
Result := ClientRect;
|
|
AOffset := PainterClass.SubMenuControlMarkRectOffset(Self);
|
|
with Result do
|
|
begin
|
|
Inc(Left, AOffset + BarSize);
|
|
Dec(Right, AOffset);
|
|
Dec(Bottom, AOffset);
|
|
Top := Bottom - MarkSize;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.DownArrowExists: Boolean;
|
|
begin
|
|
Result := ItemLinks.VisibleItemCount - TopIndex > MaxVisibleCount;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.UpArrowExists: Boolean;
|
|
begin
|
|
Result := TopIndex > 0;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.VisibleCount: Integer;
|
|
begin
|
|
Result := MaxVisibleCount - Byte(UpArrowExists) - Byte(DownArrowExists);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.FillBackground(DC: HDC; ARect: TRect;
|
|
ABrush: HBRUSH; AColor: TColor; AIsClientArea: Boolean);
|
|
begin
|
|
PainterClass.SubMenuControlDrawBackground(Self, DC, ARect, ABrush, AColor);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := BarManager.Backgrounds.SubMenu;
|
|
if (ItemLinks.Owner is TdxBarPopupMenu) and
|
|
not TdxBarPopupMenu(ItemLinks.Owner).BackgroundBitmap.Empty then
|
|
Result := TdxBarPopupMenu(ItemLinks.Owner).BackgroundBitmap;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetIndent1: Integer;
|
|
begin
|
|
// WARNING: sync with TdxBarButtonControl.GetDefaultHeight
|
|
Result := TextSize + BarSize + 2;
|
|
PainterClass.CorrectButtonControlDefaultHeight(Result);
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.GetIndent2: Integer;
|
|
begin
|
|
// WARNING: sync with TdxBarButtonControl.GetDefaultHeight
|
|
if IsInternal then
|
|
begin
|
|
Result := TextSize;
|
|
PainterClass.CorrectButtonControlDefaultHeight(Result);
|
|
end
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TdxBarSubMenuControl.IsTransparent: Boolean;
|
|
begin
|
|
if (ItemLinks.Owner is TdxBarPopupMenu) and
|
|
not TdxBarPopupMenu(ItemLinks.Owner).BackgroundBitmap.Empty then
|
|
Result := True
|
|
else
|
|
Result := not BarManager.Backgrounds.SubMenu.Empty;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.Hide;
|
|
begin
|
|
if not FDestroyFlag then
|
|
begin
|
|
FDestroyFlag := True;
|
|
if HandleAllocated then DestroyWnd;
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.HideAll;
|
|
begin
|
|
if ParentBar = nil then
|
|
begin
|
|
ChildBar := nil;
|
|
Hide;
|
|
ProcessPaintMessages;
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.RepaintBar;
|
|
var
|
|
PrevSelectedItemLink: TdxBarItemLink;
|
|
WasVisible, ChangeXDirection, ChangeYDirection, NeedRepaint: Boolean;
|
|
PrevTopIndex: Integer;
|
|
begin
|
|
if FDestroyFlag or FDestroyingControls or not HandleAllocated then Exit;
|
|
WasVisible := IsWindowVisible(Handle);
|
|
PrevSelectedItemLink := nil;
|
|
if IsCustomizing then
|
|
begin
|
|
if (BarManager.SelectedItem <> nil) and
|
|
(BarManager.SelectedItem.Parent = Self) then
|
|
begin
|
|
PrevSelectedItemLink := BarManager.SelectedItem.ItemLink;
|
|
BarManager.FSelectedItem := nil;
|
|
end;
|
|
FSelectedItem := nil;
|
|
end;
|
|
DestroyControls;
|
|
CreateControls;
|
|
SetRecentItemCount;
|
|
if (Left <> FOnShowLeft) or (Top <> FOnShowTop) then
|
|
begin
|
|
ShowWindow(Handle, SW_HIDE);
|
|
Left := FOnShowLeft;
|
|
Top := FOnShowTop;
|
|
NeedRepaint := False;
|
|
end
|
|
else
|
|
NeedRepaint := True;
|
|
SetSizeAndCheckBounds(ChangeXDirection, ChangeYDirection);
|
|
CalcControlsPositions(nil);
|
|
|
|
if UpArrowExists and not DownArrowExists then
|
|
begin
|
|
PrevTopIndex := FTopIndex;
|
|
repeat
|
|
Dec(FTopIndex);
|
|
CalcControlsPositions(nil);
|
|
until DownArrowExists or (FTopIndex = 0);
|
|
if DownArrowExists then Inc(FTopIndex);
|
|
NeedRepaint := NeedRepaint or (FTopIndex <> PrevTopIndex);
|
|
end;
|
|
|
|
if WasVisible then Show;
|
|
if NeedRepaint then
|
|
begin
|
|
CalcControlsPositions(nil);
|
|
Invalidate;
|
|
end;
|
|
if IsCustomizing and (PrevSelectedItemLink <> nil) then
|
|
SetKeySelectedItem(PrevSelectedItemLink.Control);
|
|
end;
|
|
|
|
procedure TdxBarSubMenuControl.Show;
|
|
const
|
|
Shows: array[Boolean] of Integer = (0, SWP_SHOWWINDOW);
|
|
var
|
|
AParentBar: TCustomdxBarControl;
|
|
ARandom: Double;
|
|
begin
|
|
DoPopup;
|
|
AParentBar := GetParentBarForBar(Self);
|
|
if AParentBar <> nil then
|
|
FMenuAnimations := AParentBar.BarManager.MenuAnimations
|
|
else
|
|
FMenuAnimations := BarManager.MenuAnimations;
|
|
// prepare AMenuAnimations
|
|
if FMenuAnimations = maRandom then
|
|
begin
|
|
ARandom := Random(100);
|
|
if ARandom < 33 then
|
|
FMenuAnimations := maUnfold
|
|
else
|
|
if ARandom < 66 then
|
|
FMenuAnimations := maSlide
|
|
else
|
|
FMenuAnimations := maFade;
|
|
end;
|
|
FShowAnimation := FShowAnimation and not (FMenuAnimations in [maNone, maFade]) and
|
|
not ((ItemLinks.CanVisibleItemCount = 0) or BarManager.IsCustomizing);
|
|
if (FMenuAnimations = maFade) and Assigned(AnimateWindowProc) and not IsWin9X then
|
|
begin
|
|
ProcessPaintMessages;
|
|
AnimateWindowProc(Handle, 150, AW_BLEND);
|
|
end
|
|
else
|
|
begin
|
|
SetWindowPos(Handle, 0, 0, 0, 0, 0,
|
|
SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or
|
|
Shows[not FShowAnimation]);
|
|
ProcessPaintMessages;
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarItemLink }
|
|
|
|
constructor TdxBarItemLink.Create(Collection: TCollection);
|
|
begin
|
|
inherited Create(Collection);
|
|
FLoadedRecentIndex := -1;
|
|
FUseCount := BarManager.FMostRecentlyUsedUseCount;
|
|
FMostRecentlyUsed := True;
|
|
FUserGlyph := TBitmap.Create;
|
|
FVisible := True;
|
|
FLoadedVisible := True;
|
|
AddToRecentList;
|
|
if not BarManager.IsLoading and Assigned(BarManager.FOnItemLinkAdd) then
|
|
BarManager.FOnItemLinkAdd(BarManager, Self);
|
|
end;
|
|
|
|
destructor TdxBarItemLink.Destroy;
|
|
var
|
|
AItemLinks: TdxBarItemLinks;
|
|
ABarControl: TCustomdxBarControl;
|
|
ItemLinkWithBeginGroup: TdxBarItemLink;
|
|
begin
|
|
if not BarManager.IsDestroying and
|
|
Assigned(BarManager.FOnItemLinkDelete) then
|
|
BarManager.FOnItemLinkDelete(BarManager, Self);
|
|
AItemLinks := Owner;
|
|
ABarControl := BarControl;
|
|
|
|
if (Item <> nil) and (Self = BarManager.DraggingItemLink) and
|
|
not BarManager.IsDestroying and
|
|
(CanVisibleIndex < AItemLinks.CanVisibleItemCount - 1) and
|
|
((CanVisibleIndex = 0) and AItemLinks.CanVisibleItems[CanVisibleIndex + 1].BeginGroup or
|
|
BeginGroup and not AItemLinks.CanVisibleItems[CanVisibleIndex + 1].BeginGroup) then
|
|
ItemLinkWithBeginGroup := AItemLinks.CanVisibleItems[CanVisibleIndex + 1]
|
|
else
|
|
ItemLinkWithBeginGroup := nil;
|
|
if FControl <> nil then
|
|
begin
|
|
if (ABarControl <> nil) and not ABarControl.IsDestroying and
|
|
(ABarControl.SelectedItem = FControl) then
|
|
begin
|
|
BarManager.FSelectedItem := nil;
|
|
ABarControl.SelectedItem := nil;
|
|
end;
|
|
FControl.Free;
|
|
end;
|
|
if FItem <> nil then FItem.FLinks.Remove(Self);
|
|
FUserGlyph.Free;
|
|
|
|
RemoveFromRecentList;
|
|
inherited Destroy;
|
|
|
|
if ItemLinkWithBeginGroup <> nil then
|
|
with ItemLinkWithBeginGroup do
|
|
BeginGroup := not FBeginGroup;
|
|
if (ABarControl <> nil) and ABarControl.HandleAllocated and
|
|
not ABarControl.IsDestroying then
|
|
begin
|
|
ABarControl.RepaintBar;
|
|
if Assigned(AItemLinks.FOnChange) then AItemLinks.FOnChange(AItemLinks);
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItemLink.GetAvailableIndex: Integer;
|
|
begin
|
|
if Owner = nil then
|
|
Result := -1
|
|
else
|
|
Result := Owner.AvailableIndexOf(Self);
|
|
end;
|
|
|
|
function TdxBarItemLink.GetBarControl: TCustomdxBarControl;
|
|
begin
|
|
Result := Owner.FBarControl;
|
|
end;
|
|
|
|
function TdxBarItemLink.GetBarManager: TdxBarManager;
|
|
begin
|
|
Result := Owner.BarManager;
|
|
end;
|
|
|
|
function TdxBarItemLink.GetBeginGroup: Boolean;
|
|
var
|
|
AVisibleIndex: Integer;
|
|
|
|
function HiddenBeginGroupExists: Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := Owner.VisibleItems[AVisibleIndex - 1].Index + 1 to Index - 1 do
|
|
begin
|
|
Result := Owner[I].BeginGroup;
|
|
if Result then Exit;
|
|
end;
|
|
Result := False;
|
|
end;
|
|
|
|
begin
|
|
AVisibleIndex := VisibleIndex;
|
|
Result := FBeginGroup and (AVisibleIndex <> 0) or
|
|
(AVisibleIndex > 0) and HiddenBeginGroupExists;
|
|
end;
|
|
|
|
function TdxBarItemLink.GetCanVisibleIndex: Integer;
|
|
begin
|
|
if Owner = nil then
|
|
Result := -1
|
|
else
|
|
Result := Owner.CanVisibleIndexOf(Self);
|
|
end;
|
|
|
|
function TdxBarItemLink.GetCaption: string;
|
|
begin
|
|
if not (udCaption in FUserDefine) and (FItem <> nil) then
|
|
Result := FItem.Caption
|
|
else
|
|
Result := FUserCaption;
|
|
end;
|
|
|
|
function TdxBarItemLink.GetGlyph: TBitmap;
|
|
begin
|
|
if not (udGlyph in FUserDefine) and (FItem <> nil) then
|
|
Result := FItem.Glyph
|
|
else
|
|
Result := FUserGlyph;
|
|
end;
|
|
|
|
function TdxBarItemLink.GetOwnerValue: TdxBarItemLinks;
|
|
begin
|
|
Result := TdxBarItemLinks(Collection);
|
|
end;
|
|
|
|
function TdxBarItemLink.GetPaintStyle: TdxBarPaintStyle;
|
|
begin
|
|
if not (udPaintStyle in FUserDefine) and (FItem <> nil) then
|
|
if FItem is TdxBarButton then
|
|
Result := TdxBarButton(FItem).PaintStyle
|
|
else
|
|
Result := psStandard
|
|
else
|
|
Result := FUserPaintStyle;
|
|
end;
|
|
|
|
function TdxBarItemLink.GetVisibleIndex: Integer;
|
|
begin
|
|
if Owner = nil then
|
|
Result := -1
|
|
else
|
|
Result := Owner.VisibleIndexOf(Self);
|
|
end;
|
|
|
|
function TdxBarItemLink.GetWidth: Integer;
|
|
begin
|
|
if udWidth in FUserDefine then
|
|
Result := FUserWidth
|
|
else
|
|
if Item is TdxBarEdit then
|
|
Result := TdxBarEdit(Item).Width
|
|
else
|
|
Result := 0
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SetBeginGroup(Value: Boolean);
|
|
begin
|
|
if FBeginGroup <> Value then
|
|
begin
|
|
FBeginGroup := Value;
|
|
if Control <> nil then Control.BeginGroupChanged;
|
|
ItemLinkChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SetItem(Value: TdxBarItem);
|
|
begin
|
|
if FItem <> Value then
|
|
begin
|
|
if FItem <> nil then FItem.FLinks.Remove(Self);
|
|
FItem := Value;
|
|
if FItem <> nil then
|
|
try
|
|
if (Owner.Owner is TCustomdxBarSubItem) and
|
|
not TCustomdxBarSubItem(Owner.Owner).CanContainItem(FItem) then
|
|
begin
|
|
FItem := nil;
|
|
raise Exception.Create(cxGetResourceString(@dxSBAR_RECURSIVESUBITEMS));
|
|
end
|
|
else
|
|
begin
|
|
FItem.FLinks.Add(Self);
|
|
Owner.RefreshVisibilityLists;
|
|
end;
|
|
|
|
if (Owner.Owner is TComponent) and
|
|
not (csLoading in TComponent(Owner.Owner).ComponentState) then
|
|
CheckMostRecentlyUsed;
|
|
finally
|
|
ItemLinkChanged;
|
|
end
|
|
else
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SetMostRecentlyUsed(Value: Boolean);
|
|
begin
|
|
if FMostRecentlyUsed <> Value then
|
|
begin
|
|
FMostRecentlyUsed := Value;
|
|
CheckMostRecentlyUsed;
|
|
if BarControl <> nil then BarControl.RepaintBar;
|
|
ItemLinkChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SetUserCaption(Value: string);
|
|
begin
|
|
if FUserCaption <> Value then
|
|
begin
|
|
FUserCaption := Value;
|
|
FUserDefine := FUserDefine + [udCaption];
|
|
if Control <> nil then Control.CaptionChanged;
|
|
ItemLinkChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SetUserDefine(Value: TdxBarUserDefines);
|
|
begin
|
|
if FUserDefine <> Value then
|
|
begin
|
|
FUserDefine := Value;
|
|
if not (udCaption in FUserDefine) then FUserCaption := '';
|
|
if not (udGlyph in FUserDefine) then FUserGlyph.Assign(nil);
|
|
if not (udPaintStyle in FUserDefine) then FUserPaintStyle := psStandard;
|
|
if not (udWidth in FUserDefine) then FUserWidth := 0;
|
|
if Control <> nil then
|
|
begin
|
|
Control.CaptionChanged;
|
|
Control.GlyphChanged;
|
|
end;
|
|
ItemLinkChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SetUserGlyph(Value: TBitmap);
|
|
begin
|
|
FUserGlyph.Assign(Value);
|
|
FUserDefine := FUserDefine + [udGlyph];
|
|
if Control <> nil then Control.GlyphChanged;
|
|
ItemLinkChanged;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SetUserPaintStyle(Value: TdxBarPaintStyle);
|
|
begin
|
|
if PaintStyle <> Value then
|
|
begin
|
|
FUserPaintStyle := Value;
|
|
FUserDefine := FUserDefine + [udPaintStyle];
|
|
if Control is TdxBarButtonControl then
|
|
TdxBarButtonControl(Control).PaintStyleChanged;
|
|
ItemLinkChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SetUserWidth(Value: Integer);
|
|
begin
|
|
CheckEditWidth(Value);
|
|
if Width <> Value then
|
|
begin
|
|
FUserWidth := Value;
|
|
FUserDefine := FUserDefine + [udWidth];
|
|
if Control is TdxBarEditControl then
|
|
TdxBarEditControl(Control).WidthChanged;
|
|
ItemLinkChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SetVisible(Value: Boolean);
|
|
begin
|
|
if BarManager.IsLoading or Owner.FAssigning then
|
|
begin
|
|
FLoadedVisible := Value;
|
|
Exit;
|
|
end;
|
|
if FVisible <> Value then
|
|
begin
|
|
FVisible := Value;
|
|
if not BarManager.Designing then
|
|
begin
|
|
Owner.RefreshVisibilityLists;
|
|
if Value then
|
|
begin
|
|
BringToTopInRecentList(False);
|
|
if BarControl <> nil then
|
|
begin
|
|
CreateControl;
|
|
Control.VisibleChanged;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
SendToBottomInRecentList;
|
|
if Control <> nil then
|
|
begin
|
|
Control.VisibleChanged;
|
|
DestroyControl;
|
|
end;
|
|
end;
|
|
end;
|
|
ItemLinkChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.AddToRecentList;
|
|
begin
|
|
Owner.FRecentItems.Add(Self);
|
|
end;
|
|
|
|
procedure TdxBarItemLink.RemoveFromRecentList;
|
|
begin
|
|
with Owner do
|
|
if FRecentItems <> nil then FRecentItems.Remove(Self);
|
|
end;
|
|
|
|
procedure TdxBarItemLink.RestoreRecentIndex;
|
|
begin
|
|
RecentIndex := FPrevRecentIndex;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SaveRecentIndex;
|
|
begin
|
|
FPrevRecentIndex := RecentIndex;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.InternalBringToTopInRecentList(IncCount: Boolean);
|
|
begin
|
|
if (Owner <> nil) and not Owner.CanUseRecentItems then Exit;
|
|
RecentIndex := 0;
|
|
if IncCount then Inc(FUseCount);
|
|
end;
|
|
|
|
procedure TdxBarItemLink.Synchronize(AItemLink: TdxBarItemLink);
|
|
begin
|
|
FUseCount := AItemLink.FUseCount;
|
|
RecentIndex := AItemLink.RecentIndex;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.CheckMostRecentlyUsed;
|
|
begin
|
|
if MostRecentlyUsed then
|
|
begin
|
|
FUseCount := BarManager.FMostRecentlyUsedUseCount;
|
|
BringToTopInRecentList(False);
|
|
end
|
|
else
|
|
begin
|
|
FUseCount := 0;
|
|
SendToBottomInRecentList;
|
|
end
|
|
end;
|
|
|
|
function TdxBarItemLink.GetRecentIndex: Integer;
|
|
begin
|
|
Result := Owner.FRecentItems.IndexOf(Self);
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SetRecentIndex(Value: Integer);
|
|
begin
|
|
if Owner = nil then
|
|
FPrevRecentIndex := Value
|
|
else
|
|
with Owner, FRecentItems do
|
|
begin
|
|
if Value >= Count then Value := Count - 1;
|
|
Move(IndexOf(Self), Value);
|
|
RefreshVisibilityLists;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItemLink.CanVisible: Boolean;
|
|
begin
|
|
Result := Item.ActuallyVisible and Visible;
|
|
end;
|
|
|
|
function TdxBarItemLink.GetRealItemLink: TdxBarItemLink;
|
|
begin
|
|
if FOriginalItemLink <> nil then
|
|
Result := FOriginalItemLink
|
|
else
|
|
Result := Self
|
|
end;
|
|
|
|
function TdxBarItemLink.HasItem(AItem: TdxBarItem): Boolean;
|
|
begin
|
|
Result := FItem = AItem;
|
|
if not Result and (FItem is TCustomdxBarSubItem) then
|
|
Result := TCustomdxBarSubItem(FItem).ItemLinks.HasItem(AItem);
|
|
end;
|
|
|
|
procedure TdxBarItemLink.InitiateAction;
|
|
begin
|
|
if (Item <> nil) and (Item.ActionLink <> nil) then Item.ActionLink.Update;
|
|
end;
|
|
|
|
function TdxBarItemLink.IsAccel(Key: Word; Shift: TShiftState): Boolean;
|
|
var
|
|
Accel: Char;
|
|
VK: SHORT;
|
|
AShift: TShiftState;
|
|
|
|
function GetAccel(const S: string): Char;
|
|
var
|
|
P, I, L: Integer;
|
|
begin
|
|
P := 0;
|
|
I := 1;
|
|
L := Length(S);
|
|
while I < L do
|
|
begin
|
|
if S[I] = '&' then
|
|
begin
|
|
Inc(I);
|
|
if S[I] <> '&' then P := I;
|
|
end;
|
|
Inc(I);
|
|
end;
|
|
if P = 0 then Result := #0
|
|
else
|
|
begin
|
|
Result := AnsiLowerCase(S[P])[1];
|
|
if Result <> S[P] then Shift := Shift - [ssShift];
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Accel := GetAccel(Caption);
|
|
if Accel = #0 then
|
|
Result := False
|
|
else
|
|
if (Accel in ['0'..'9']) and (Key = Ord(Accel)) and (Shift = []) then
|
|
Result := True
|
|
else
|
|
begin
|
|
VK := VkKeyScan(Accel);
|
|
if Lo(VK) = Key then
|
|
begin
|
|
VK := Hi(VK);
|
|
AShift := [];
|
|
if VK and 1 = 1 then Include(AShift, ssShift);
|
|
if VK and 2 = 2 then Include(AShift, ssCtrl);
|
|
Result := AShift = Shift;
|
|
end
|
|
else
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.ItemLinkChanged;
|
|
begin
|
|
if (BarControl <> nil) and BarControl.IsCustomizing then
|
|
with Owner do
|
|
if Owner is TdxBarPopupMenu then
|
|
TdxBarPopupMenu(Owner).OwnerDesignerModified
|
|
else
|
|
BarManager.DesignerModified;
|
|
if not BarManager.IsLoading and Assigned(BarManager.FOnItemLinkChange) then
|
|
BarManager.FOnItemLinkChange(BarManager, Self);
|
|
end;
|
|
|
|
procedure TdxBarItemLink.Assign(Source: TPersistent);
|
|
|
|
function IsInheritanceUpdating: Boolean;
|
|
begin
|
|
Result := (csUpdating in BarManager.ComponentState) or
|
|
((Owner.FOwner is TdxBarPopupMenu) and (csUpdating in TdxBarPopupMenu(Owner.FOwner).ComponentState)) or
|
|
((Owner.FOwner is TCustomdxBarSubItem) and (csUpdating in TCustomdxBarSubItem(Owner.FOwner).ComponentState));
|
|
end;
|
|
|
|
var
|
|
Link: TdxBarItemLink;
|
|
begin
|
|
if Source is TdxBarItemLink then
|
|
begin
|
|
Link := TdxBarItemLink(Source);
|
|
Data := Link.Data;
|
|
FUserCaption := Link.FUserCaption;
|
|
FUserGlyph.Assign(Link.FUserGlyph);
|
|
FUserPaintStyle := Link.FUserPaintStyle;
|
|
FUserWidth := Link.FUserWidth;
|
|
if ResettingToolbar then
|
|
Item := TdxBarItem(BarManager.MainForm.FindComponent(Link.Item.Name))
|
|
else
|
|
begin
|
|
if Assigned(Link.Item) and IsInheritanceUpdating then
|
|
Item := BarManager.GetItemByName(Link.Item.Name)
|
|
else
|
|
Item := Link.Item;
|
|
end;
|
|
UserDefine := Link.UserDefine;
|
|
BeginGroup := Link.BeginGroup;
|
|
Visible := Link.Visible;
|
|
// do not assign MostRecentlyUsed property
|
|
end
|
|
else inherited Assign(Source);
|
|
end;
|
|
|
|
procedure TdxBarItemLink.BringToTopInRecentList(IncCount: Boolean);
|
|
var
|
|
PrevVisibleIndex: Integer;
|
|
AParentItem: TdxBarItem;
|
|
begin
|
|
if not CanVisible then Exit;
|
|
|
|
PrevVisibleIndex := VisibleIndex;
|
|
InternalBringToTopInRecentList(IncCount);
|
|
if CanVisibleIndex > -1 then
|
|
begin
|
|
if (BarControl is TdxBarControl) and (PrevVisibleIndex = -1) and
|
|
(BarControl.DockingStyle <> dsNone) and
|
|
BarControl.BarManager.CanShowRecentItems then
|
|
PostMessage(BarControl.Handle, WM_REPAINTBAR, 0, 0);
|
|
|
|
AParentItem := nil;
|
|
with Owner do
|
|
if Owner is TCustomdxBarSubItem then
|
|
AParentItem := TCustomdxBarSubItem(Owner)
|
|
else
|
|
if Owner is TdxBarPopupMenu then
|
|
if (BarControl <> nil) and (TdxBarSubMenuControl(BarControl).FDropDownButton <> nil) then
|
|
AParentItem := TdxBarSubMenuControl(BarControl).FDropDownButton.Item;
|
|
if AParentItem <> nil then
|
|
with AParentItem do
|
|
if (CurItemLink <> nil) and (CurItemLink.RealItemLink <> nil) then
|
|
CurItemLink.RealItemLink.BringToTopInRecentList(IncCount);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.CreateControl;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if (FControl = nil) and (BarControl <> nil) and not BarControl.FDestroyFlag and
|
|
(Item <> nil) then
|
|
if (Item is TdxBarWindowItem) and IsVertical(BarControl) then
|
|
FControl := TdxBarButtonControl.Create(Self)
|
|
else
|
|
with FRegItemList do
|
|
for I := 0 to Count - 1 do
|
|
with TRegItemRecord(Items[I]) do
|
|
if Item.ClassInfo = ItemClass.ClassInfo then
|
|
begin
|
|
FControl := ItemControlClass.Create(Self);
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.DestroyControl;
|
|
begin
|
|
if FControl <> nil then
|
|
begin
|
|
FControl.Free;
|
|
FControl := nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLink.SendToBottomInRecentList;
|
|
var
|
|
PrevVisibleIndex: Integer;
|
|
begin
|
|
PrevVisibleIndex := VisibleIndex;
|
|
RecentIndex := Owner.FRecentItems.Count - 1;
|
|
if (BarControl is TdxBarControl) and (PrevVisibleIndex > -1) and
|
|
BarControl.BarManager.CanShowRecentItems then
|
|
PostMessage(BarControl.Handle, WM_REPAINTBAR, 0, 0);
|
|
end;
|
|
|
|
{ TdxBarItemLinks }
|
|
|
|
constructor TdxBarItemLinks.Create(ABarManager: TdxBarManager);
|
|
begin
|
|
inherited Create(TdxBarItemLink);
|
|
FBarManager := ABarManager;
|
|
FAvailableItems := TList.Create;
|
|
FCanVisibleItems := TList.Create;
|
|
FVisibleItems := TList.Create;
|
|
FRecentItems := TList.Create;
|
|
FRecentItemCount := -1;
|
|
FUseRecentItems := True;
|
|
end;
|
|
|
|
destructor TdxBarItemLinks.Destroy;
|
|
begin
|
|
if (FBarControl <> nil) and not FBarControl.IsDestroying then
|
|
FBarControl.Free;
|
|
FRecentItems.Free;
|
|
FRecentItems := nil;
|
|
FVisibleItems.Free;
|
|
FVisibleItems := nil;
|
|
FCanVisibleItems.Free;
|
|
FCanVisibleItems := nil;
|
|
FAvailableItems.Free;
|
|
FAvailableItems := nil;
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBarItemLinks.GetAvailableItem(Index: Integer): TdxBarItemLink;
|
|
begin
|
|
Result := TdxBarItemLink(FAvailableItems[Index]);
|
|
end;
|
|
|
|
function TdxBarItemLinks.GetAvailableItemCount: Integer;
|
|
begin
|
|
Result := FAvailableItems.Count;
|
|
end;
|
|
|
|
function TdxBarItemLinks.GetCanVisibleItem(Index: Integer): TdxBarItemLink;
|
|
begin
|
|
Result := TdxBarItemLink(FCanVisibleItems[Index]);
|
|
end;
|
|
|
|
function TdxBarItemLinks.GetCanVisibleItemCount: Integer;
|
|
begin
|
|
Result := FCanVisibleItems.Count;
|
|
end;
|
|
|
|
function TdxBarItemLinks.GetItem(Index: Integer): TdxBarItemLink;
|
|
begin
|
|
Result := TdxBarItemLink(inherited Items[Index]);
|
|
end;
|
|
|
|
function TdxBarItemLinks.GetMostRecentItemCount: Integer;
|
|
var
|
|
MinCount, MaxCount, I, Level: Integer;
|
|
begin
|
|
if CanUseRecentItems then
|
|
begin
|
|
MinCount := MaxInt;
|
|
MaxCount := 0;
|
|
for I := 0 to CanVisibleItemCount - 1 do
|
|
with CanVisibleItems[I] do
|
|
begin
|
|
if FUseCount < MinCount then MinCount := FUseCount;
|
|
if FUseCount > MaxCount then MaxCount := FUseCount;
|
|
end;
|
|
Level := MinCount +
|
|
MulDiv(MaxCount - MinCount, 100 - BarManager.MostRecentItemsPercents, 100);
|
|
Result := 0;
|
|
for I := CanVisibleItemCount - 1 downto 0 do
|
|
with TdxBarItemLink(FRecentItems[I]) do
|
|
if (FUseCount >= Level) and (Owner = Self) then
|
|
begin
|
|
Result := I + 1;
|
|
Break;
|
|
end;
|
|
if Result = CanVisibleItemCount then Result := -1;
|
|
end
|
|
else
|
|
Result := -1;
|
|
end;
|
|
|
|
function TdxBarItemLinks.GetRealVisibleItemCount: Integer;
|
|
var
|
|
R, AItemRect, ResultR: TRect;
|
|
I: Integer;
|
|
begin
|
|
Result := VisibleItemCount;
|
|
if Owner is TdxBar then
|
|
begin
|
|
R := BarControl.ClientRect;
|
|
for I := 0 to Result - 1 do
|
|
begin
|
|
AItemRect := VisibleItems[I].ItemRect;
|
|
IntersectRect(ResultR, R, AItemRect);
|
|
if not EqualRect(AItemRect, ResultR) or IsRectEmpty(AItemRect) then
|
|
begin
|
|
Result := I;
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItemLinks.GetVisibleItem(Index: Integer): TdxBarItemLink;
|
|
begin
|
|
Result := TdxBarItemLink(FVisibleItems[Index]);
|
|
end;
|
|
|
|
function TdxBarItemLinks.GetVisibleItemCount: Integer;
|
|
begin
|
|
Result := FVisibleItems.Count;
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.SetItem(Index: Integer; Value: TdxBarItemLink);
|
|
begin
|
|
Items[Index].Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.SetRecentItemCount(Value: Integer);
|
|
begin
|
|
FPrevRecentItemCount := FRecentItemCount;
|
|
if not CanUseRecentItems then Value := -1;
|
|
FRecentItemCount := Value;
|
|
RefreshVisibilityLists;
|
|
end;
|
|
|
|
function VisibleItemsCompare(Item1, Item2: Pointer): Integer;
|
|
begin
|
|
if TdxBarItemLink(Item1).CanVisibleIndex < TdxBarItemLink(Item2).CanVisibleIndex then
|
|
Result := -1
|
|
else
|
|
if TdxBarItemLink(Item1).CanVisibleIndex > TdxBarItemLink(Item2).CanVisibleIndex then
|
|
Result := 1
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.RefreshVisibilityLists;
|
|
var
|
|
IsDesignTime: Boolean;
|
|
I: Integer;
|
|
ItemLink: TdxBarItemLink;
|
|
Item: TdxBarItem;
|
|
begin
|
|
if FAvailableItems = nil then Exit;
|
|
FAvailableItems.Clear;
|
|
FCanVisibleItems.Clear;
|
|
FVisibleItems.Clear;
|
|
IsDesignTime := BarManager.Designing;
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
ItemLink := Items[I];
|
|
Item := ItemLink.Item;
|
|
if (Item <> nil) and
|
|
({Item.AlwaysVisible or }IsDesignTime or Item.ActuallyVisible) then
|
|
begin
|
|
FAvailableItems.Add(ItemLink);
|
|
if {Item.AlwaysVisible or }IsDesignTime or ItemLink.Visible then
|
|
begin
|
|
FCanVisibleItems.Add(ItemLink);
|
|
if {Item.AlwaysVisible or }IsDesignTime or (RecentItemCount = -1) then
|
|
FVisibleItems.Add(ItemLink);
|
|
end;
|
|
end;
|
|
end;
|
|
if not IsDesignTime and (RecentItemCount > 0) then
|
|
begin
|
|
for I := 0 to FRecentItems.Count - 1 do
|
|
if CanVisibleIndexOf(FRecentItems[I]) <> -1 then
|
|
begin
|
|
FVisibleItems.Add(FRecentItems[I]);
|
|
if FVisibleItems.Count = RecentItemCount then Break;
|
|
end;
|
|
FVisibleItems.Sort(VisibleItemsCompare);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.RestoreRecentItemCount;
|
|
begin
|
|
FRecentItemCount := FPrevRecentItemCount;
|
|
RefreshVisibilityLists;
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.EmptyItemRects;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
SetRectEmpty(Items[I].FItemRect);
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.Loaded(CheckVisible: Boolean);
|
|
var
|
|
J, I: Integer;
|
|
begin
|
|
for J := Count - 1 downto 0 do
|
|
with Items[J] do
|
|
if Item = nil then
|
|
//Free
|
|
else
|
|
CheckMostRecentlyUsed;
|
|
if CheckVisible then
|
|
for J := Count - 1 downto 0 do
|
|
with Items[J] do
|
|
Visible := FLoadedVisible;
|
|
for I := 0 to Count - 1 do
|
|
for J := 0 to Count - 1 do
|
|
with Items[J] do
|
|
if FLoadedRecentIndex = I then
|
|
begin
|
|
FUseCount := FLoadedUseCount;
|
|
RecentIndex := FLoadedRecentIndex;
|
|
FLoadedRecentIndex := -1;
|
|
end;
|
|
if FBarControl <> nil then
|
|
FBarControl.CreateControls;
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.CheckVisibleIntegrity;
|
|
var
|
|
I, J: Integer;
|
|
ItemLink: TdxBarItemLink;
|
|
begin
|
|
for I := 0 to FRecentItems.Count - 1 do
|
|
begin
|
|
ItemLink := TdxBarItemLink(FRecentItems[I]);
|
|
if ItemLink.CanVisibleIndex = -1 then Break;
|
|
end;
|
|
for J := I + 1 to FRecentItems.Count - 1 do
|
|
begin
|
|
ItemLink := TdxBarItemLink(FRecentItems[J]);
|
|
if ItemLink.CanVisibleIndex > -1 then
|
|
begin
|
|
ItemLink.RecentIndex := I;
|
|
Inc(I);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.AssignUsageData(AItemLinks: TdxBarItemLinks);
|
|
var
|
|
J: Integer;
|
|
begin
|
|
for J := 0 to Count - 1 do
|
|
if J < AItemLinks.Count then
|
|
Items[J].FMostRecentlyUsed := AItemLinks[J].FMostRecentlyUsed;
|
|
Loaded(False);
|
|
CheckVisibleIntegrity;
|
|
end;
|
|
|
|
function TdxBarItemLinks.CanUseRecentItems: Boolean;
|
|
var
|
|
AItemLinks: TdxBarItemLinks;
|
|
begin
|
|
Result := BarManager.CanShowRecentItems;
|
|
if Result then
|
|
begin
|
|
AItemLinks := Self;
|
|
repeat
|
|
Result := AItemLinks.FUseRecentItems;
|
|
if (AItemLinks.Owner is TdxBar) or
|
|
(AItemLinks.Owner is TdxBarPopupMenu) or
|
|
(AItemLinks.BarControl = nil) or (AItemLinks.BarControl.ParentBar = nil) then
|
|
Break;
|
|
AItemLinks := AItemLinks.BarControl.ParentBar.ItemLinks;
|
|
until False;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.InitiateActions;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do Items[I].InitiateAction;
|
|
end;
|
|
|
|
function TdxBarItemLinks.IsDesignTimeLinks: Boolean;
|
|
begin
|
|
Result :=
|
|
not (Owner is TdxBarToolbarsPopup) and not (Owner is TdxBarCustomizingPopup) and
|
|
(not (Owner is TCustomdxBarSubItem) or TCustomdxBarSubItem(Owner).HasDesignTimeLinks);
|
|
end;
|
|
|
|
function TdxBarItemLinks.IsShortCut(AShortCut: TShortCut): Boolean;
|
|
var
|
|
I: Integer;
|
|
AItemLink: TdxBarItemLink;
|
|
begin
|
|
Result := False;
|
|
if AShortCut = 0 then Exit;
|
|
InitiateActions;
|
|
for I := 0 to AvailableItemCount - 1 do
|
|
begin
|
|
AItemLink := AvailableItems[I];
|
|
if not AItemLink.Item.Enabled then Continue;
|
|
if AItemLink.Item is TCustomdxBarSubItem then
|
|
Result := TCustomdxBarSubItem(AItemLink.Item).IsShortCut(AShortCut)
|
|
else
|
|
begin
|
|
if not AItemLink.Item.CanClicked then Continue;
|
|
Result := (AItemLink.Item.ShortCut = AShortCut);
|
|
if Result then
|
|
AItemLink.Item.Click
|
|
else
|
|
if AItemLink.Item is TdxBarButton then
|
|
with TdxBarButton(AItemLink.Item) do
|
|
if (ButtonStyle = bsDropDown) and (DropDownMenu <> nil) then
|
|
Result := DropDownMenu.IsShortCut(AShortCut);
|
|
end;
|
|
if Result then Break;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItemLinks.FindItemWithAccel(Key: Word; Shift: TShiftState;
|
|
Current: TdxBarItemLink): TdxBarItemLink;
|
|
begin
|
|
Shift := Shift - [ssAlt];
|
|
if BarControl is TdxBarControl then
|
|
begin
|
|
if IsWindowVisible(BarControl.Handle) then
|
|
begin
|
|
Result := Current;
|
|
repeat
|
|
Result := Next(Result);
|
|
if Result = nil then Break;
|
|
if Result.Item.HasAccel(Result) and Result.IsAccel(Key, Shift) then Exit;
|
|
if Result = Current then Break;
|
|
if Current = nil then Current := Result;
|
|
until False;
|
|
end;
|
|
Result := nil;
|
|
end
|
|
else
|
|
begin
|
|
if CanVisibleItemCount = 0 then
|
|
begin
|
|
Result := nil;
|
|
Exit;
|
|
end;
|
|
if Current = nil then Current := CanVisibleItems[0];
|
|
Result := Current;
|
|
repeat
|
|
if Result = CanVisibleItems[CanVisibleItemCount - 1] then
|
|
Result := CanVisibleItems[0]
|
|
else
|
|
Result := CanVisibleItems[Result.CanVisibleIndex + 1];
|
|
if Result.Item.HasAccel(Result) and Result.IsAccel(Key, Shift) then Exit;
|
|
until Result = Current;
|
|
Result := nil;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItemLinks.First: TdxBarItemLink;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to RealVisibleItemCount - 1 do
|
|
begin
|
|
Result := VisibleItems[I];
|
|
if Result.Control.CanSelect then Exit;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
|
|
function TdxBarItemLinks.Last: TdxBarItemLink;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := RealVisibleItemCount - 1 downto 0 do
|
|
begin
|
|
Result := VisibleItems[I];
|
|
if Result.Control.CanSelect then Exit;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
|
|
function TdxBarItemLinks.Next(Current: TdxBarItemLink): TdxBarItemLink;
|
|
var
|
|
CurrentIndex, I, ACount: Integer;
|
|
begin
|
|
if Current = nil then Result := First
|
|
else
|
|
begin
|
|
CurrentIndex := Current.VisibleIndex;
|
|
I := CurrentIndex;
|
|
ACount := RealVisibleItemCount;
|
|
repeat
|
|
Inc(I);
|
|
if I > ACount - 1 then I := 0;
|
|
Result := VisibleItems[I];
|
|
if Result.Control.CanSelect then Exit;
|
|
until I = CurrentIndex;
|
|
Result := nil;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItemLinks.Prev(Current: TdxBarItemLink): TdxBarItemLink;
|
|
var
|
|
CurrentIndex, I: Integer;
|
|
begin
|
|
if Current = nil then Result := Last
|
|
else
|
|
begin
|
|
CurrentIndex := Current.VisibleIndex;
|
|
I := CurrentIndex;
|
|
repeat
|
|
Dec(I);
|
|
if I = -1 then I := RealVisibleItemCount - 1;
|
|
Result := VisibleItems[I];
|
|
if Result.Control.CanSelect then Exit;
|
|
until I = CurrentIndex;
|
|
Result := nil;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItemLinks.GetOwner: TPersistent;
|
|
begin
|
|
if FOwner is TPersistent then
|
|
Result := TPersistent(FOwner)
|
|
else
|
|
Result := FBarManager;
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.Update(Item: TCollectionItem);
|
|
begin
|
|
if (Owner is TComponent) and
|
|
(csDestroying in TComponent(Owner).ComponentState) then
|
|
Exit;
|
|
if IsDesignTimeLinks then
|
|
if Owner is TdxBarPopupMenu then
|
|
TdxBarPopupMenu(Owner).OwnerDesignerModified
|
|
else
|
|
BarManager.DesignerModified;
|
|
inherited Update(Item);
|
|
RefreshVisibilityLists;
|
|
if Owner is TdxBarContainerItem then
|
|
TdxBarContainerItem(Owner).ItemLinksChanged; // TODO: virtual
|
|
if Assigned(FOnChange) then FOnChange(Self);
|
|
end;
|
|
|
|
function TdxBarItemLinks.Add: TdxBarItemLink;
|
|
begin
|
|
Result := TdxBarItemLink(inherited Add);
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.Assign(Source: TPersistent);
|
|
var
|
|
ContainsMDISystemMenu: Boolean;
|
|
SystemMenuSubItem: TSystemMenuSubItem;
|
|
I: Integer;
|
|
begin
|
|
ContainsMDISystemMenu :=
|
|
(Count <> 0) and (Items[0].Item is TSystemMenuSubItem);
|
|
if ContainsMDISystemMenu then
|
|
SystemMenuSubItem := TSystemMenuSubItem(Items[0].Item)
|
|
else
|
|
SystemMenuSubItem := nil;
|
|
FAssigning := True;
|
|
try
|
|
inherited;
|
|
finally
|
|
FAssigning := False;
|
|
for I := 0 to Count - 1 do
|
|
with Items[I] do
|
|
Visible := FLoadedVisible;
|
|
if ContainsMDISystemMenu then
|
|
with Add do
|
|
begin
|
|
Item := SystemMenuSubItem;
|
|
Index := 0;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItemLinks.AvailableIndexOf(Value: TdxBarItemLink): Integer;
|
|
begin
|
|
Result := FAvailableItems.IndexOf(Value);
|
|
end;
|
|
|
|
function TdxBarItemLinks.CanVisibleIndexOf(Value: TdxBarItemLink): Integer;
|
|
begin
|
|
Result := FCanVisibleItems.IndexOf(Value);
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.CreateBarControl;
|
|
begin
|
|
if Owner is TdxBar then
|
|
FBarControl := TdxBarControl.CreateEx(BarManager, TdxBar(Owner))
|
|
else
|
|
if (Owner is TCustomdxBarSubItem) and (TCustomdxBarSubItem(Owner).CurItemLink <> nil) then
|
|
FBarControl := TdxBarSubMenuControl.Create(TCustomdxBarSubItem(Owner).CurItemLink.BarManager)
|
|
else
|
|
FBarControl := TdxBarSubMenuControl.Create(BarManager);
|
|
FBarControl.FItemLinks := Self;
|
|
end;
|
|
|
|
procedure TdxBarItemLinks.FreeForeignItems(ForeignBarManager: TdxBarManager);
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
I: Integer;
|
|
begin
|
|
if Owner is TdxBar then
|
|
begin
|
|
PrevLockUpdate := TdxBar(Owner).LockUpdate;
|
|
TdxBar(Owner).LockUpdate := True;
|
|
end
|
|
else
|
|
PrevLockUpdate := False;
|
|
for I := 0 to Count - 1 do
|
|
if (ForeignBarManager <> nil) and (Items[I].BarManager = ForeignBarManager) or
|
|
(ForeignBarManager = nil) and (Items[I].BarManager <> BarManager) then
|
|
Items[I].Free;
|
|
if Owner is TdxBar then
|
|
TdxBar(Owner).LockUpdate := PrevLockUpdate;
|
|
end;
|
|
|
|
function TdxBarItemLinks.HasItem(AItem: TdxBarItem): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := False;
|
|
for I := 0 to Count - 1 do
|
|
if Items[I].HasItem(AItem) then
|
|
begin
|
|
Result := True;
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItemLinks.IndexOf(Value: TdxBarItemLink): Integer;
|
|
begin
|
|
Result := Value.Index;
|
|
end;
|
|
|
|
function TdxBarItemLinks.VisibleIndexOf(Value: TdxBarItemLink): Integer;
|
|
begin
|
|
Result := FVisibleItems.IndexOf(Value);
|
|
end;
|
|
|
|
{ TdxBarShadowPart }
|
|
|
|
constructor TdxBarShadowPart.CreateEx(AOwner: TdxBarShadow;
|
|
AKind: TdxBarShadowPartKind; ACorners: TdxBarShadowCorners);
|
|
begin
|
|
Create(nil);
|
|
FOwner := AOwner;
|
|
FKind := AKind;
|
|
FCorners := ACorners;
|
|
FImage := TBitmap.Create;
|
|
end;
|
|
|
|
destructor TdxBarShadowPart.Destroy;
|
|
begin
|
|
FImage.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBarShadowPart.GetControl: TWinControl;
|
|
begin
|
|
Result := FOwner.Owner;
|
|
end;
|
|
|
|
function TdxBarShadowPart.GetShadowSize: Integer;
|
|
begin
|
|
Result := FOwner.ShadowSize;
|
|
end;
|
|
|
|
function TdxBarShadowPart.GetTransparent: Boolean;
|
|
begin
|
|
Result := FOwner.Transparent;
|
|
end;
|
|
|
|
procedure TdxBarShadowPart.WMNCHitTest(var Message: TWMNCHitTest);
|
|
begin
|
|
inherited;
|
|
Message.Result := HTTRANSPARENT;
|
|
end;
|
|
|
|
function TdxBarShadowPart.CanShow: Boolean;
|
|
begin
|
|
Result := (FCorners = []) or (Width >= ShadowSize) and (Height >= ShadowSize);
|
|
end;
|
|
|
|
procedure TdxBarShadowPart.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited;
|
|
with Params do
|
|
begin
|
|
Style := WS_POPUP;
|
|
if Transparent then
|
|
ExStyle := WS_EX_LAYERED
|
|
else
|
|
ExStyle := 0;
|
|
if GetWindowLong(Control.Handle, GWL_EXSTYLE) and WS_EX_TOPMOST <> 0 then
|
|
ExStyle := ExStyle or WS_EX_TOPMOST;
|
|
WndParent := Control.Handle;
|
|
WindowClass.style := 0;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarShadowPart.Paint;
|
|
begin
|
|
with Canvas do
|
|
begin
|
|
Brush.Color := clBtnShadow;
|
|
FillRect(ClientRect);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarShadowPart.UpdateImage;
|
|
type
|
|
PColors = ^TColors;
|
|
TColors = array[0..MaxInt - 1] of Byte;
|
|
var
|
|
BI: TBitmapInfo;
|
|
Colors: PColors;
|
|
|
|
function GetAlphaIndex(X, Y: Integer): Integer;
|
|
begin
|
|
Result := (Y * Width + X) * 4 + 3;
|
|
end;
|
|
|
|
function GetAlpha(X, Y: Integer): Byte;
|
|
begin
|
|
Result := Colors^[GetAlphaIndex(X, Y)];
|
|
end;
|
|
|
|
procedure SetAlpha(X, Y: Integer; Value: Byte);
|
|
begin
|
|
Colors^[GetAlphaIndex(X, Y)] := Value;
|
|
end;
|
|
|
|
procedure ProcessMainContent;
|
|
const
|
|
AlphaStep = 15;
|
|
var
|
|
X, Y: Integer;
|
|
begin
|
|
for X := 0 to Width - 1 do
|
|
for Y := 0 to Height - 1 do
|
|
if FKind = spHorizontal then
|
|
SetAlpha(X, Y, (Height - Y) * AlphaStep)
|
|
else
|
|
SetAlpha(X, Y, (Width - X) * AlphaStep);
|
|
end;
|
|
|
|
procedure ProcessCorners;
|
|
type
|
|
TCornerKind = (ckLeft, ckRight, ckTop);
|
|
|
|
procedure ProcessCorner(ACornerKind: TCornerKind);
|
|
var
|
|
I, J, X, Y: Integer;
|
|
|
|
procedure ConvertCoordinates;
|
|
begin
|
|
case ACornerKind of
|
|
ckLeft:
|
|
begin
|
|
X := I;
|
|
Y := J;
|
|
end;
|
|
ckRight:
|
|
begin
|
|
X := Width - 1 - I;
|
|
Y := J;
|
|
end;
|
|
ckTop:
|
|
begin
|
|
X := J;
|
|
Y := I;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
for I := 0 to ShadowSize - 1 do
|
|
for J := 0 to ShadowSize - 1 do
|
|
begin
|
|
ConvertCoordinates;
|
|
SetAlpha(X, Y, MulDiv(GetAlpha(X, Y), 1 + I, 1 + ShadowSize));
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if FKind = spHorizontal then
|
|
begin
|
|
if scLeft in FCorners then
|
|
ProcessCorner(ckLeft);
|
|
if scRight in FCorners then
|
|
ProcessCorner(ckRight);
|
|
end
|
|
else
|
|
if scTop in FCorners then
|
|
ProcessCorner(ckTop);
|
|
end;
|
|
|
|
begin
|
|
if not CanShow then Exit;
|
|
FImage.PixelFormat := pf32bit;
|
|
FImage.Width := Width;
|
|
FImage.Height := Height;
|
|
with BI.bmiHeader do
|
|
begin
|
|
biSize := SizeOf(BI.bmiHeader);
|
|
biWidth := Width;
|
|
biHeight := -Height;
|
|
biPlanes := 1;
|
|
biBitCount := 32;
|
|
biCompression := BI_RGB;
|
|
end;
|
|
GetMem(Colors, 4 * Width * Height);
|
|
try
|
|
FillChar(Colors^, 4 * Width * Height, 0);
|
|
ProcessMainContent;
|
|
ProcessCorners;
|
|
SetDIBits(FImage.Canvas.Handle, FImage.Handle, 0, Height, Colors, BI, DIB_RGB_COLORS);
|
|
finally
|
|
FreeMem(Colors);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarShadowPart.Hide;
|
|
begin
|
|
ShowWindow(Handle, SW_HIDE);
|
|
DestroyHandle;
|
|
end;
|
|
|
|
procedure TdxBarShadowPart.Show;
|
|
|
|
procedure MakeAlphaBlended;
|
|
var
|
|
ASize: TSize;
|
|
P: TPoint;
|
|
ABlend: TBlendFunction;
|
|
begin
|
|
ASize := TSize(ClientRect.BottomRight);
|
|
P := Point(0, 0);
|
|
with ABlend do
|
|
begin
|
|
BlendOp := AC_SRC_OVER;
|
|
BlendFlags := 0;
|
|
SourceConstantAlpha := 255;
|
|
AlphaFormat := AC_SRC_ALPHA;
|
|
end;
|
|
UpdateLayeredWindow(Handle, 0, nil, @ASize, FImage.Canvas.Handle, @P, 0,
|
|
@ABlend, LWA_ALPHA);
|
|
end;
|
|
|
|
begin
|
|
if not CanShow then Exit;
|
|
if Transparent then MakeAlphaBlended;
|
|
SetWindowPos(Handle, Control.Handle, 0, 0, 0, 0,
|
|
SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW or SWP_NOACTIVATE);
|
|
end;
|
|
|
|
procedure TdxBarShadowPart.UpdateBounds(const ABounds: TRect);
|
|
begin
|
|
BoundsRect := ABounds;
|
|
UpdateImage;
|
|
if FOwner.Visible then Show;
|
|
end;
|
|
|
|
{ TdxBarShadow }
|
|
|
|
constructor TdxBarShadow.Create(AOwner: TWinControl);
|
|
begin
|
|
inherited Create;
|
|
FOwner := AOwner;
|
|
end;
|
|
|
|
destructor TdxBarShadow.Destroy;
|
|
begin
|
|
DestroyParts;
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBarShadow.GetShadowSize: Integer;
|
|
begin
|
|
if Transparent then
|
|
Result := dxBarTransparentShadowSize
|
|
else
|
|
Result := dxBarOpaqueShadowSize;
|
|
end;
|
|
|
|
function TdxBarShadow.GetTransparent: Boolean;
|
|
begin
|
|
Result := (@UpdateLayeredWindow <> nil) and (BitsPerPixel > 8);
|
|
end;
|
|
|
|
procedure TdxBarShadow.SetVisible(Value: Boolean);
|
|
begin
|
|
if FVisible <> Value then
|
|
begin
|
|
FVisible := Value;
|
|
if FVisible then
|
|
Show
|
|
else
|
|
Hide;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarShadow.CreateParts;
|
|
var
|
|
APartCount: Integer;
|
|
|
|
procedure CreatePart(AKind: TdxBarShadowPartKind; ACorners: TdxBarShadowCorners;
|
|
const ABounds: TRect);
|
|
begin
|
|
if IsRectEmpty(ABounds) then Exit;
|
|
FParts[APartCount] := TdxBarShadowPart.CreateEx(Self, AKind, ACorners);
|
|
FParts[APartCount].UpdateBounds(ABounds);
|
|
Inc(APartCount);
|
|
end;
|
|
|
|
procedure CreatePartsForHorizontalMode;
|
|
begin
|
|
if not IsRectEmpty(R1) then
|
|
CreatePart(spVertical, [scTop],
|
|
Rect(R1.Right, R1.Top + ShadowSize, R1.Right + ShadowSize, R1.Bottom));
|
|
CreatePart(spHorizontal, [scLeft, scRight],
|
|
Rect(R2.Left + ShadowSize, R2.Bottom, R2.Right + ShadowSize, R2.Bottom + ShadowSize));
|
|
|
|
if not IsRectEmpty(R1) then
|
|
begin
|
|
if R1.Left + ShadowSize < R2.Left then
|
|
CreatePart(spHorizontal, [scLeft],
|
|
Rect(R1.Left + ShadowSize, R1.Bottom, R2.Left, R1.Bottom + ShadowSize));
|
|
if R1.Right > R2.Right then
|
|
CreatePart(spHorizontal, [scRight],
|
|
Rect(R2.Right, R1.Bottom, R1.Right + ShadowSize, R1.Bottom + ShadowSize));
|
|
end;
|
|
|
|
if IsRectEmpty(R1) or (R1.Right < R2.Right) then
|
|
CreatePart(spVertical, [scTop],
|
|
Rect(R2.Right, R2.Top + ShadowSize, R2.Right + ShadowSize, R2.Bottom))
|
|
else
|
|
CreatePart(spVertical, [],
|
|
Rect(R2.Right, R2.Top, R2.Right + ShadowSize, R2.Bottom));
|
|
end;
|
|
|
|
procedure CreatePartsForVerticalMode;
|
|
begin
|
|
CreatePart(spVertical, [scTop],
|
|
Rect(R2.Right, R2.Top + ShadowSize, R2.Right + ShadowSize, R2.Bottom));
|
|
|
|
if R1.Top + ShadowSize < R2.Top then
|
|
CreatePart(spVertical, [scTop],
|
|
Rect(R1.Right, R1.Top + ShadowSize, R1.Right + ShadowSize, R2.Top));
|
|
|
|
if R1.Bottom > R2.Bottom then
|
|
begin
|
|
CreatePart(spHorizontal, [scLeft, scRight],
|
|
Rect(R1.Left + ShadowSize, R1.Bottom, R1.Right + ShadowSize, R1.Bottom + ShadowSize));
|
|
CreatePart(spVertical, [],
|
|
Rect(R1.Right, R2.Bottom, R1.Right + ShadowSize, R1.Bottom));
|
|
end
|
|
else
|
|
CreatePart(spHorizontal, [scLeft],
|
|
Rect(R1.Left + ShadowSize, R1.Bottom, R1.Right, R1.Bottom + ShadowSize));
|
|
|
|
if R1.Bottom >= R2.Bottom then
|
|
CreatePart(spHorizontal, [scRight],
|
|
Rect(R2.Left, R2.Bottom, R2.Right + ShadowSize, R2.Bottom + ShadowSize))
|
|
else
|
|
CreatePart(spHorizontal, [scLeft, scRight],
|
|
Rect(R2.Left + ShadowSize, R2.Bottom, R2.Right + ShadowSize, R2.Bottom + ShadowSize));
|
|
end;
|
|
|
|
begin
|
|
APartCount := 0;
|
|
if FHorizontal then
|
|
CreatePartsForHorizontalMode
|
|
else
|
|
CreatePartsForVerticalMode;
|
|
end;
|
|
|
|
procedure TdxBarShadow.DestroyParts;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := Low(FParts) to High(FParts) do
|
|
begin
|
|
FParts[I].Free;
|
|
FParts[I] := nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarShadow.Hide;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := Low(FParts) to High(FParts) do
|
|
if FParts[I] <> nil then FParts[I].Hide;
|
|
end;
|
|
|
|
procedure TdxBarShadow.Show;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := Low(FParts) to High(FParts) do
|
|
if FParts[I] <> nil then FParts[I].Show;
|
|
end;
|
|
|
|
procedure TdxBarShadow.Refresh;
|
|
begin
|
|
DestroyParts;
|
|
CreateParts;
|
|
end;
|
|
|
|
procedure TdxBarShadow.SetOwnerBounds(AR1, AR2: TRect);
|
|
|
|
procedure SwapRects;
|
|
var
|
|
R: TRect;
|
|
begin
|
|
R := R1;
|
|
R1 := R2;
|
|
R2 := R;
|
|
end;
|
|
|
|
begin
|
|
R1 := AR1;
|
|
R2 := AR2;
|
|
FHorizontal := IsRectEmpty(R1) or (R1.Bottom = R2.Top) or (R1.Top = R2.Bottom);
|
|
if FHorizontal and (R1.Top = R2.Bottom) or
|
|
not FHorizontal and (R1.Left = R2.Right) then
|
|
SwapRects;
|
|
Refresh;
|
|
end;
|
|
|
|
{ TCustomdxBarCombo }
|
|
|
|
function TCustomdxBarCombo.GetDroppedDown: Boolean;
|
|
begin
|
|
if CurItemLink = nil then
|
|
Result := False
|
|
else
|
|
if CurItemLink.Control is TCustomdxBarComboControl then
|
|
Result := TCustomdxBarComboControl(CurItemLink.Control).DroppedDown
|
|
else
|
|
Result := False;
|
|
end;
|
|
|
|
function TCustomdxBarCombo.GetShowEditor: Boolean;
|
|
begin
|
|
Result := not EmptyWindow;
|
|
end;
|
|
|
|
procedure TCustomdxBarCombo.SetDroppedDown(Value: Boolean);
|
|
begin
|
|
if (CurItemLink <> nil) and (CurItemLink.Control is TCustomdxBarComboControl) then
|
|
TCustomdxBarComboControl(CurItemLink.Control).DroppedDown := Value;
|
|
end;
|
|
|
|
procedure TCustomdxBarCombo.SetShowEditor(Value: Boolean);
|
|
begin
|
|
EmptyWindow := not Value;
|
|
end;
|
|
|
|
procedure TCustomdxBarCombo.AfterDropDown;
|
|
begin
|
|
end;
|
|
|
|
procedure TCustomdxBarCombo.CheckDropDownPoint(var X, Y: Integer);
|
|
var
|
|
R: TRect;
|
|
ControlWidth, ControlHeight, DropDownWindowWidth, DropDownWindowHeight: Integer;
|
|
begin
|
|
if DropDownWindow > 0 then
|
|
with R do
|
|
begin
|
|
with CurItemLink.ItemRect do
|
|
begin
|
|
ControlWidth := Right - Left;
|
|
ControlHeight := Bottom - Top;
|
|
end;
|
|
GetWindowRect(DropDownWindow, R);
|
|
DropDownWindowWidth := Right - Left;
|
|
DropDownWindowHeight := Bottom - Top;
|
|
R := GetWorkArea(Point(X, Y));
|
|
if (CurItemLink.BarControl is TdxBarSubMenuControl) or
|
|
IsRealVertical(CurItemLink.BarControl) then
|
|
begin
|
|
if (X + DropDownWindowWidth > Right) and
|
|
(X - ControlWidth - Left > Right - X) then
|
|
Dec(X, ControlWidth + DropDownWindowWidth);
|
|
if Y + DropDownWindowHeight > Bottom then
|
|
Y := Bottom - DropDownWindowHeight;
|
|
end
|
|
else
|
|
begin
|
|
if X + DropDownWindowWidth > Right then
|
|
X := Right - DropDownWindowWidth;
|
|
if (Y + DropDownWindowHeight > Bottom) and
|
|
(Y - ControlHeight - Top > Bottom - Y) then
|
|
Dec(Y, ControlHeight + DropDownWindowHeight);
|
|
end;
|
|
if X < Left then X := Left;
|
|
if Y < Top then Y := Top;
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxBarCombo.CheckKeyForDropDownWindow(Key: Word;
|
|
Shift: TShiftState): Boolean;
|
|
begin
|
|
Result := (Key <> VK_ESCAPE) and (Key <> VK_RETURN) and (Key <> VK_TAB);
|
|
if Assigned(FOnCheckKeyForDropDownWindow) then
|
|
FOnCheckKeyForDropDownWindow(Self, Key, Shift, Result);
|
|
end;
|
|
|
|
procedure TCustomdxBarCombo.CloseUp;
|
|
begin
|
|
if DropDownWindow <> 0 then ShowWindow(DropDownWindow, SW_HIDE);
|
|
if Assigned(FOnCloseUp) then FOnCloseUp(Self);
|
|
end;
|
|
|
|
procedure TCustomdxBarCombo.DropDown(X, Y: Integer);
|
|
begin
|
|
if Assigned(FOnDropDown) then FOnDropDown(Self);
|
|
if DropDownWindow <> 0 then
|
|
begin
|
|
InitDropDownWindow;
|
|
CheckDropDownPoint(X, Y);
|
|
SetWindowPos(DropDownWindow, 0, X, Y, 0, 0,
|
|
SWP_NOZORDER or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
SetWindowPos(DropDownWindow, HWND_TOP, 0, 0, 0, 0,
|
|
SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_FRAMECHANGED);
|
|
AfterDropDown;
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxBarCombo.GetDropDownWindow: HWND;
|
|
begin
|
|
Result := 0;
|
|
if Assigned(FOnGetDropDownWindow) then FOnGetDropDownWindow(Self, Result);
|
|
end;
|
|
|
|
procedure TCustomdxBarCombo.InitDropDownWindow;
|
|
begin
|
|
end;
|
|
|
|
{ TdxBarCustomCombo }
|
|
|
|
constructor TdxBarCustomCombo.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FDropDownCount := 8;
|
|
FItemIndex := -1;
|
|
FItems := TStringList.Create;
|
|
TStringList(FItems).OnChange := ItemsChanged;
|
|
FListBox := TdxBarDropDownListBox.Create(Self);
|
|
with TdxBarDropDownListBox(FListBox) do
|
|
begin
|
|
FCombo := Self;
|
|
OnDrawItem := ListBoxDrawItem;
|
|
OnMeasureItem := ListBoxMeasureItem;
|
|
end;
|
|
end;
|
|
|
|
destructor TdxBarCustomCombo.Destroy;
|
|
begin
|
|
FListBox.Free;
|
|
FItems.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarCustomCombo.GetCurItemIndex: Integer;
|
|
begin
|
|
if FocusedItemLink = nil then
|
|
Result := ItemIndex
|
|
else
|
|
Result := TdxBarComboControl(FocusedItemLink.Control).LocalItemIndex;
|
|
end;
|
|
|
|
function TdxBarCustomCombo.GetItemsHeight(Index: Integer): Integer;
|
|
begin
|
|
MeasureItem(Index, Result);
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.SetCurItemIndex(Value: Integer);
|
|
begin
|
|
if FocusedItemLink = nil then
|
|
ItemIndex := Value
|
|
else
|
|
TdxBarComboControl(FocusedItemLink.Control).LocalItemIndex := Value;
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.SetItemIndex(Value: Integer);
|
|
var
|
|
AText: string;
|
|
begin
|
|
if FItemIndex <> Value then
|
|
begin
|
|
FItemIndex := Value;
|
|
if (FItemIndex < 0) or (FItemIndex > Items.Count - 1) then
|
|
FItemIndex := -1;
|
|
if FItemIndex = -1 then AText := ''
|
|
else AText := Items[FItemIndex];
|
|
if Text = AText then
|
|
begin
|
|
Update;
|
|
Change;
|
|
Update;
|
|
end
|
|
else
|
|
Text := AText;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.SetItems(Value: TStrings);
|
|
begin
|
|
FItems.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.SetSorted(Value: Boolean);
|
|
begin
|
|
if FSorted <> Value then
|
|
begin
|
|
FSorted := Value;
|
|
TStringList(FItems).Sorted := FSorted;
|
|
FItemIndex := FItems.IndexOf(Text);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.CheckLocalPos;
|
|
var
|
|
AText: string;
|
|
AItemIndex: Integer;
|
|
begin
|
|
if (CurItemLink = nil) or not (CurItemLink.Control is TdxBarComboControl) then
|
|
Exit;
|
|
AText := TdxBarComboControl(CurItemLink.Control).Text;
|
|
AItemIndex := TdxBarComboControl(CurItemLink.Control).LocalItemIndex;
|
|
if not ((0 <= AItemIndex) and (AItemIndex < Items.Count) and (Items[AItemIndex] = AText)) then
|
|
AItemIndex := GetNearestItemIndex(AText);
|
|
TdxBarComboControl(CurItemLink.Control).FLocalItemIndex := AItemIndex;
|
|
if DroppedDown then
|
|
if (AItemIndex > -1) and (AnsiCompareText(AText, Items[AItemIndex]) = 0) then
|
|
ListBox.ItemIndex := AItemIndex
|
|
else
|
|
begin
|
|
ListBox.ItemIndex := -1;
|
|
ListBox.TopIndex := AItemIndex;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.ItemsChanged(Sender: TObject);
|
|
begin
|
|
if ItemIndex > Items.Count - 1 then ItemIndex := -1
|
|
else Update;
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.ListBoxDrawItem(Control: TWinControl; Index: Integer;
|
|
Rect: TRect; State: TOwnerDrawState);
|
|
begin
|
|
DrawItem(Index, Rect, State);
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.ListBoxMeasureItem(Control: TWinControl; Index: Integer;
|
|
var Height: Integer);
|
|
begin
|
|
MeasureItem(Index, Height);
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.AfterDropDown;
|
|
begin
|
|
with TdxBarDropDownListBox(ListBox) do
|
|
if LeftButtonPressed then
|
|
begin
|
|
SetCapture(Handle);
|
|
WaitForCapture := True;
|
|
end
|
|
else
|
|
WaitForCapture := False;
|
|
end;
|
|
|
|
function TdxBarCustomCombo.CheckKeyForDropDownWindow(Key: Word;
|
|
Shift: TShiftState): Boolean;
|
|
begin
|
|
Result := (Shift = []) and
|
|
((Key = VK_UP) or (Key = VK_DOWN) or (Key = VK_PRIOR) or (Key = VK_NEXT));
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.CloseUp;
|
|
begin
|
|
inherited;
|
|
FListBox.Parent := nil;
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.CurChange;
|
|
begin
|
|
inherited;
|
|
CheckLocalPos;
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.DrawInterior(ABarEditControl: TdxBarEditControl; ACanvas: TCanvas;
|
|
R: TRect; ItemLink: TdxBarItemLink);
|
|
var
|
|
AIndex: Integer;
|
|
begin
|
|
FCanvas := ACanvas;
|
|
try
|
|
if FocusedItemLink = ItemLink then
|
|
AIndex := TdxBarComboControl(CurItemLink.Control).LocalItemIndex
|
|
else
|
|
AIndex := ItemIndex;
|
|
FInteriorIsDrawing := True;
|
|
try
|
|
DrawItem(AIndex, R, []);
|
|
finally
|
|
FInteriorIsDrawing := False;
|
|
end;
|
|
finally
|
|
FCanvas := nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.DrawItem(AIndex: Integer; ARect: TRect; AState: TOwnerDrawState);
|
|
begin
|
|
if Assigned(FOnDrawItem) then
|
|
FOnDrawItem(Self, AIndex, ARect, AState)
|
|
else
|
|
PainterClass.CustomComboDrawItem(Self, Canvas, AIndex, ARect, AState, FInteriorIsDrawing);
|
|
if odFocused in AState then DrawFocusRect(Canvas.Handle, ARect); // for hiding focus rect
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.DropDown(X, Y: Integer);
|
|
begin
|
|
FListBox.Parent := CurItemLink.Control.Parent; //BarManager.MainForm;
|
|
inherited;
|
|
CheckLocalPos;
|
|
end;
|
|
|
|
function TdxBarCustomCombo.GetCanvas: TCanvas;
|
|
begin
|
|
if FCanvas <> nil then
|
|
Result := FCanvas
|
|
else
|
|
Result := FListBox.Canvas;
|
|
end;
|
|
|
|
function TdxBarCustomCombo.GetDropDownWidth: Integer;
|
|
var
|
|
I, ItemWidth: Integer;
|
|
begin
|
|
Result := DropDownWidth;
|
|
if Result <= 0 then
|
|
begin
|
|
if CurItemLink <> nil then
|
|
with CurItemLink.ItemRect do
|
|
Result := Right - Left -
|
|
TdxBarComboControl(CurItemLink.Control).CaptionWidth - 2 * 2;
|
|
if DropDownCount < Items.Count then
|
|
Dec(Result, GetSystemMetrics(SM_CXVSCROLL));
|
|
for I := 0 to Items.Count - 1 do
|
|
begin
|
|
MeasureItemWidth(I, ItemWidth);
|
|
if ItemWidth > Result then Result := ItemWidth;
|
|
end;
|
|
end;
|
|
Inc(Result, 2 + 2);
|
|
if DropDownCount < Items.Count then
|
|
Inc(Result, GetSystemMetrics(SM_CXVSCROLL));
|
|
end;
|
|
|
|
function TdxBarCustomCombo.GetDropDownWindow: HWND;
|
|
begin
|
|
Result := inherited GetDropDownWindow;
|
|
if Result = 0 then Result := FListBox.Handle;
|
|
end;
|
|
|
|
function TdxBarCustomCombo.GetNearestItemIndex(AText: string): Integer;
|
|
var
|
|
AItem: string;
|
|
FoundChars, I, J: Integer;
|
|
begin
|
|
AText := AnsiUpperCase(AText);
|
|
FoundChars := 0;
|
|
Result := -1;
|
|
for I := 0 to Items.Count - 1 do
|
|
begin
|
|
AItem := AnsiUpperCase(Items[I]);
|
|
if Copy(AItem, 1, FoundChars) = Copy(AText, 1, FoundChars) then
|
|
for J := FoundChars + 1 to Length(AText) do
|
|
if (J <= Length(AItem)) and (AItem[J] = AText[J]) then
|
|
begin
|
|
FoundChars := J;
|
|
Result := I;
|
|
if J = Length(AText) then Exit;
|
|
end
|
|
else Break;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.InitDropDownWindow;
|
|
var
|
|
AWidth, AHeight, I: Integer;
|
|
begin
|
|
FListBox.Items.Assign(Items);
|
|
|
|
AWidth := GetDropDownWidth;
|
|
if DropDownCount > Items.Count then
|
|
I := Items.Count
|
|
else
|
|
I := DropDownCount;
|
|
AHeight := 2 * 2;
|
|
for I := 0 to I - 1 do Inc(AHeight, ItemsHeight[I]);
|
|
|
|
SetWindowPos(FListBox.Handle, 0, 0, 0, AWidth, AHeight,
|
|
SWP_NOZORDER or SWP_NOMOVE or SWP_NOACTIVATE);
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.MeasureItem(AIndex: Integer; var AHeight: Integer);
|
|
begin
|
|
if ItemHeight <= 0 then AHeight := Canvas.TextHeight('Qq')
|
|
else AHeight := ItemHeight;
|
|
if Assigned(FOnMeasureItem) then FOnMeasureItem(Self, AIndex, AHeight);
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.MeasureItemWidth(AIndex: Integer; var AWidth: Integer);
|
|
begin
|
|
AWidth := 1 + Canvas.TextWidth(Items[AIndex]) + 1;
|
|
end;
|
|
|
|
procedure TdxBarCustomCombo.SetText(Value: string);
|
|
begin
|
|
if (FItemIndex = -1) or (Items[FItemIndex] <> Value) then
|
|
FItemIndex := Items.IndexOf(Value);
|
|
inherited;
|
|
end;
|
|
|
|
{ TdxBarContainerItem }
|
|
|
|
procedure TdxBarContainerItem.AddListedItemLinks(AItemLinks: TdxBarItemLinks;
|
|
AIndex: Integer; FirstCall: Boolean; CallingItemLink: TdxBarItemLink);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited;
|
|
if AItemLinks = ItemLinks then Exit;
|
|
for I := 0 to FItemLinks.CanVisibleItemCount - 1 do
|
|
with AItemLinks.Add do
|
|
begin
|
|
FOriginalItemLink := CallingItemLink;
|
|
Assign(FItemLinks.CanVisibleItems[I]);
|
|
Index := AIndex + I;
|
|
if (I = 0) and HideWhenRun then BeginGroup := True;
|
|
Synchronize(FOriginalItemLink);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarContainerItem.DeleteListedItemLinks(AItemLinks: TdxBarItemLinks;
|
|
AIndex: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited;
|
|
if AItemLinks = ItemLinks then Exit;
|
|
for I := 0 to FItemLinks.CanVisibleItemCount - 1 do AItemLinks[AIndex].Free;
|
|
end;
|
|
|
|
function TdxBarContainerItem.InternalActuallyVisible: Boolean;
|
|
begin
|
|
Result := inherited InternalActuallyVisible or IsItemsExist;
|
|
end;
|
|
|
|
function TdxBarContainerItem.IsItemsExist: Boolean;
|
|
var
|
|
I: Integer;
|
|
AItemExists: Boolean;
|
|
begin
|
|
Result := ItemLinks.Count > 0;
|
|
if Result then // check empty items
|
|
begin
|
|
AItemExists := False;
|
|
for I := 0 to ItemLinks.Count - 1 do
|
|
if ItemLinks[I].Item <> nil then
|
|
begin
|
|
AItemExists := True;
|
|
Break;
|
|
end;
|
|
if AItemExists then
|
|
begin
|
|
Result := False;
|
|
for I := 0 to ItemLinks.Count - 1 do
|
|
if (ItemLinks[I].Item <> nil) and
|
|
ItemLinks[I].Item.ActuallyVisible then
|
|
begin
|
|
Result := True;
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TContainerItemSubMenuControl }
|
|
|
|
type
|
|
TContainerItemSubMenuControl = class(TdxBarSubMenuControl)
|
|
private
|
|
FContainerItem: TCustomdxBarContainerItem;
|
|
protected
|
|
procedure DoCloseUp; override;
|
|
function GetIsCustomizing: Boolean; override;
|
|
public
|
|
destructor Destroy; override;
|
|
end;
|
|
|
|
destructor TContainerItemSubMenuControl.Destroy;
|
|
var
|
|
AContainerItem: TCustomdxBarContainerItem;
|
|
begin
|
|
AContainerItem := FContainerItem;
|
|
inherited;
|
|
AContainerItem.NeedClearItemList;
|
|
end;
|
|
|
|
procedure TContainerItemSubMenuControl.DoCloseUp;
|
|
begin
|
|
with FContainerItem do
|
|
DeleteListedItemLinks(ItemLinks, 0);
|
|
inherited;
|
|
end;
|
|
|
|
function TContainerItemSubMenuControl.GetIsCustomizing: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
{ TdxBarContainerItemControl }
|
|
|
|
function TdxBarContainerItemControl.GetItem: TCustomdxBarContainerItem;
|
|
begin
|
|
Result := TCustomdxBarContainerItem(ItemLink.Item);
|
|
end;
|
|
|
|
procedure TdxBarContainerItemControl.CreateSubMenuControl;
|
|
begin
|
|
if BarManager.IsCustomizing then Exit;
|
|
Item.ItemLinks.FBarControl := TContainerItemSubMenuControl.Create(BarManager);
|
|
SubMenuControl.FItemLinks := Item.ItemLinks;
|
|
TContainerItemSubMenuControl(SubMenuControl).FContainerItem := Item;
|
|
with Item do AddListedItemLinks(ItemLinks, 0, True, ItemLink);
|
|
end;
|
|
|
|
function TdxBarContainerItemControl.GetCaption: string;
|
|
begin
|
|
Result := inherited GetCaption;
|
|
if not ShowRealCaption then
|
|
Result := '(' + Result + ')';
|
|
end;
|
|
|
|
function TdxBarContainerItemControl.IsExpandable: Boolean;
|
|
begin
|
|
Result := not BarManager.IsCustomizing;
|
|
end;
|
|
|
|
procedure TdxBarContainerItemControl.Paint(ARect: TRect; PaintType: TdxBarPaintType);
|
|
var
|
|
DC: HDC;
|
|
begin
|
|
if PaintType = ptMenu then
|
|
begin
|
|
if ARect.Left = ARect.Right then Exit;
|
|
DC := Parent.Canvas.Handle;
|
|
DrawGlyphAndTextInSubMenu(DC, ARect, False, True, False);
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBarContainerItemControl.ShowRealCaption: Boolean;
|
|
begin
|
|
Result := (Parent is TdxBarControl) or not Item.HideWhenRun;
|
|
end;
|
|
|
|
{ TdxBarWinControl }
|
|
|
|
constructor TdxBarWinControl.Create(AItemLink: TdxBarItemLink);
|
|
begin
|
|
inherited Create(AItemLink);
|
|
FHasWindow := True;
|
|
if not (Parent is TdxBarControl and TdxBarControl(Parent).Moving) then
|
|
CreateWindowHandle;
|
|
end;
|
|
|
|
destructor TdxBarWinControl.Destroy;
|
|
begin
|
|
if not (Parent is TdxBarControl and TdxBarControl(Parent).Moving) then
|
|
DestroyWindowHandle;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarWinControl.GetItem: TdxBarWindowItem;
|
|
begin
|
|
Result := TdxBarWindowItem(ItemLink.Item);
|
|
end;
|
|
|
|
function TdxBarWinControl.GetWindowRect: TRect;
|
|
begin
|
|
if Enabled then
|
|
begin
|
|
Result := FWindowRect;
|
|
if Item.EmptyWindow then
|
|
with Result do Right := Left;
|
|
end
|
|
else
|
|
SetRectEmpty(Result);
|
|
end;
|
|
|
|
procedure TdxBarWinControl.SetWindowRect(const Value: TRect);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
FWindowRect := Value;
|
|
if IsWindowVisible(Handle) then
|
|
begin
|
|
Windows.GetWindowRect(Handle, R);
|
|
if not EqualRect(R, FWindowRect) then
|
|
begin
|
|
with WindowRect do
|
|
SetWindowPos(Handle, 0, Left, Top,
|
|
Right - Left, Bottom - Top, SWP_NOZORDER or SWP_NOACTIVATE {SWP_SHOWWINDOW});
|
|
if (Self is TdxBarEditControl) then
|
|
PainterClass.EditControlPrepareEditWnd(TdxBarEditControl(Self), Handle);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarWinControl.CanClicked: Boolean;
|
|
begin
|
|
Result := IsVertical(FParent);
|
|
end;
|
|
|
|
procedure TdxBarWinControl.ControlInactivate(Immediately: Boolean);
|
|
begin
|
|
inherited;
|
|
Focused := False;
|
|
end;
|
|
|
|
procedure TdxBarWinControl.ControlClick(ByMouse: Boolean);
|
|
begin
|
|
Focused := True;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarWinControl.CreateWindowHandle;
|
|
begin
|
|
FDefWndProc := MakeObjectInstance(WndProc);
|
|
FPrevDefWndProc := Pointer(GetWindowLong(FHandle, GWL_WNDPROC));
|
|
SetWindowLong(FHandle, GWL_WNDPROC, Longint(FDefWndProc));
|
|
end;
|
|
|
|
procedure TdxBarWinControl.DestroyWindowHandle;
|
|
begin
|
|
if FHandle <> 0 then
|
|
begin
|
|
Focused := False;
|
|
SetWindowLong(FHandle, GWL_WNDPROC, Longint(FPrevDefWndProc));
|
|
FreeObjectInstance(FDefWndProc);
|
|
FDefWndProc := nil;
|
|
DestroyWindow(FHandle);
|
|
FHandle := 0;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarWinControl.DoKeyDown(var Message: TWMKey): Boolean;
|
|
begin
|
|
with Message do
|
|
TdxBarWindowItem(ItemLink.Item).KeyDown(CharCode,
|
|
KeyDataToShiftState(KeyData));
|
|
Result := (Message.CharCode = 0);
|
|
end;
|
|
|
|
function TdxBarWinControl.DoKeyPress(var Message: TWMKey): Boolean;
|
|
var
|
|
Ch: Char;
|
|
begin
|
|
with Message do
|
|
begin
|
|
Ch := Char(CharCode);
|
|
TdxBarWindowItem(ItemLink.Item).KeyPress(Ch);
|
|
CharCode := Word(Ch);
|
|
end;
|
|
Result := (Char(Message.CharCode) = #0);
|
|
end;
|
|
|
|
function TdxBarWinControl.DoKeyUp(var Message: TWMKey): Boolean;
|
|
begin
|
|
with Message do
|
|
TdxBarWindowItem(ItemLink.Item).KeyUp(CharCode,
|
|
KeyDataToShiftState(KeyData));
|
|
Result := (Message.CharCode = 0);
|
|
end;
|
|
|
|
procedure TdxBarWinControl.EnabledChanged;
|
|
begin
|
|
Focused := False;
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBarWinControl.GetText: string;
|
|
var
|
|
S: PChar;
|
|
Len: Integer;
|
|
begin
|
|
if Handle <> 0 then
|
|
begin
|
|
S := StrAlloc(256);
|
|
Len := SendMessage(Handle, WM_GETTEXT, 255, Longint(S));
|
|
if Len = 0 then Result := ''
|
|
else Result := S;
|
|
StrDispose(S);
|
|
end;
|
|
end;
|
|
|
|
function TdxBarWinControl.IsDestroyOnClick: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarWinControl.SetFocused(Value: Boolean);
|
|
var
|
|
IsDesignForm: Boolean;
|
|
|
|
procedure SetTopMosts(AShow: Boolean);
|
|
const
|
|
TopMosts: array[Boolean] of HWND = (HWND_NOTOPMOST, HWND_TOPMOST);
|
|
var
|
|
PrevBarControl, ABarControl: TCustomdxBarControl;
|
|
begin
|
|
if dxBarCustomizingPopup <> nil then
|
|
if AShow then
|
|
begin
|
|
SetWindowPos(dxBarCustomizingPopup.Handle, TopMosts[AShow],
|
|
0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
PrevBarControl := dxBarCustomizingPopup;
|
|
if dxBarCustomizingPopupItemLink.Control <> nil then
|
|
begin
|
|
ABarControl := dxBarCustomizingPopupItemLink.Control.Parent;
|
|
repeat
|
|
SetWindowPos(ABarControl.Handle, PrevBarControl.Handle,
|
|
0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
PrevBarControl := ABarControl;
|
|
ABarControl := ABarControl.ParentBar;
|
|
until ABarControl = nil;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
if dxBarCustomizingPopupItemLink.Control <> nil then
|
|
begin
|
|
ABarControl := dxBarCustomizingPopupItemLink.Control.Parent;
|
|
while ABarControl.ParentBar <> nil do
|
|
ABarControl := ABarControl.ParentBar;
|
|
repeat
|
|
SetWindowPos(ABarControl.Handle, TopMosts[AShow],
|
|
0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
ABarControl := ABarControl.ChildBar;
|
|
until ABarControl = nil;
|
|
end;
|
|
SetWindowPos(dxBarCustomizingPopup.Handle, TopMosts[AShow],
|
|
0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if FFocused <> Value then
|
|
begin
|
|
FFocused := Value;
|
|
if FFocused then
|
|
begin
|
|
FPrevFocusedControl := Windows.GetFocus;
|
|
if not IsWindowVisible(FPrevFocusedControl) then
|
|
FPrevFocusedControl := BarManager.MainForm.Handle;
|
|
SendMessage(Handle, WM_SETFONT, Parent.EditFontHandle, 0);
|
|
if not IsActive then ControlActivate(True);
|
|
|
|
with WindowRect do
|
|
SetWindowPos(Handle, 0, Left, Top,
|
|
Right - Left, Bottom - Top, SWP_SHOWWINDOW);
|
|
if (Self is TdxBarEditControl) then
|
|
PainterClass.EditControlPrepareEditWnd(TdxBarEditControl(Self), Handle);
|
|
|
|
FFocusing := True;
|
|
try
|
|
Text := TdxBarWindowItem(FItemLink.Item).Text;
|
|
// SetFocus(Handle);
|
|
finally
|
|
FFocusing := False;
|
|
end;
|
|
SetFocus(Handle);
|
|
end
|
|
else
|
|
begin
|
|
{ if FHandle <> 0 then
|
|
SetWindowPos(Handle, 0, 0, 0, 0, 0,
|
|
SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_HIDEWINDOW or SWP_NOACTIVATE);}
|
|
if FHandle <> 0 then ShowWindow(Handle, SW_HIDE);
|
|
if not BarManager.FToolbarsVisibleChanging then
|
|
begin
|
|
IsDesignForm := (dxBarCustomizingForm <> nil) and
|
|
(GetParentForm(FindControl(FPrevFocusedControl)) = dxBarCustomizingForm);
|
|
if IsDesignForm then SetTopMosts(True);
|
|
if (FPrevFocusedControl > 0) and IsWindowVisible(FPrevFocusedControl) then
|
|
SetFocus(FPrevFocusedControl)
|
|
else
|
|
if IsWindowVisible(BarManager.MainForm.Handle) then
|
|
Windows.SetFocus(BarManager.MainForm.Handle)
|
|
else
|
|
Windows.SetFocus(GetNextWindow(BarManager.MainForm.Handle, GW_HWNDNEXT));
|
|
if IsDesignForm then SetTopMosts(False);
|
|
FPrevFocusedControl := 0;
|
|
end;
|
|
if BarManager.AlwaysSaveText and
|
|
((GetAsyncKeyState(VK_ESCAPE) >= 0) or
|
|
(GetAsyncKeyState(VK_CONTROL) < 0) or (GetAsyncKeyState(VK_MENU) < 0)) then
|
|
TdxBarWindowItem(FItemLink.Item).Text := Text;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarWinControl.SetText(Value: string);
|
|
begin
|
|
SetWindowText(Handle, PChar(Value));
|
|
if Item.EmptyWindow then Repaint;
|
|
end;
|
|
|
|
procedure TdxBarWinControl.WndProc(var Message: TMessage);
|
|
var
|
|
ASelfLink: TcxObjectLink;
|
|
AMsg: TMsg;
|
|
P: TPoint;
|
|
FocusedParent: HWND;
|
|
AItem: TdxBarWindowItem;
|
|
|
|
procedure KillBeep;
|
|
begin
|
|
while PeekMessage(AMsg, Handle, WM_CHAR, WM_CHAR, PM_REMOVE) do;
|
|
end;
|
|
|
|
procedure DefaultHandler;
|
|
begin
|
|
with Message do
|
|
Result := CallWindowProc(FPrevDefWndProc, FHandle, Msg, wParam, lParam);
|
|
end;
|
|
|
|
begin
|
|
ASelfLink := cxAddObjectLink(Self);
|
|
try
|
|
with Message do
|
|
begin
|
|
case Msg of
|
|
WM_SETFOCUS:
|
|
Item.DoEnter;
|
|
WM_KILLFOCUS:
|
|
begin
|
|
AItem := Item;
|
|
try
|
|
if Focused then
|
|
begin
|
|
DefaultHandler;
|
|
//KillBeep;
|
|
Parent.HideAll;
|
|
Exit;
|
|
end;
|
|
if Parent is TdxBarControl then
|
|
begin
|
|
if GetFocus = Parent.Handle then
|
|
FocusedParent := Parent.Handle
|
|
else
|
|
FocusedParent := GetParent(GetFocus);
|
|
if not (FindControl(FocusedParent) is TdxBarControl) then
|
|
FocusedParent := GetParent(FocusedParent);
|
|
if FocusedParent <> Parent.Handle then
|
|
begin
|
|
DefaultHandler;
|
|
KillBeep;
|
|
Parent.HideAll;
|
|
Exit;
|
|
end;
|
|
end;
|
|
finally
|
|
AItem.DoExit;
|
|
end;
|
|
end;
|
|
WM_RBUTTONDOWN:
|
|
begin
|
|
P := SmallPointToPoint(TSmallPoint(lParam));
|
|
MapWindowPoints(Handle, Parent.Handle, P, 1);
|
|
Result := SendMessage(Parent.Handle, Msg, wParam, MakeLParam(P.X, P.Y));
|
|
Exit;
|
|
end;
|
|
WM_CHAR: if DoKeyPress(TWMKey(Message)) then Exit;
|
|
WM_KEYDOWN: if DoKeyDown(TWMKey(Message)) then Exit;
|
|
WM_KEYUP: if DoKeyUp(TWMKey(Message)) then Exit;
|
|
WM_SYSKEYDOWN, WM_SYSKEYUP:
|
|
begin
|
|
if Msg = WM_SYSKEYDOWN then
|
|
Inc(FKeyPressedInside)
|
|
else
|
|
if FKeyPressedInside <> 0 then
|
|
Dec(FKeyPressedInside)
|
|
else
|
|
Exit;
|
|
if not (GetAsyncKeyState(VK_MENU) < 0) {Alt is not pressed} and
|
|
((wParam <> VK_MENU) or (Msg = WM_SYSKEYUP)) then
|
|
begin
|
|
FKeyPressedInside := 0;
|
|
Parent.HideAll;
|
|
if (wParam = VK_F10) and (GetAsyncKeyState(VK_SHIFT) < 0) then Exit;
|
|
if wParam = VK_MENU then WaitForMenu := True;
|
|
DontCallNextKeybHook := True;
|
|
try
|
|
if dxBarKeyboardHook(0, wParam, lParam) = 1 then Exit;
|
|
finally
|
|
DontCallNextKeybHook := False;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
if ASelfLink.Ref = nil then Exit;
|
|
if Msg = WM_KEYDOWN then
|
|
case wParam of
|
|
VK_ESCAPE, VK_RETURN:
|
|
begin
|
|
Parent.SetKeySelectedItem(nil);
|
|
KillBeep;
|
|
if wParam = VK_ESCAPE then
|
|
Parent.SelectedItem := Self
|
|
else
|
|
Parent.HideAll;
|
|
end;
|
|
VK_TAB:
|
|
begin
|
|
KillBeep;
|
|
Result := SendMessage(Parent.Handle, Msg, wParam, lParam);
|
|
end;
|
|
else
|
|
DefaultHandler;
|
|
end
|
|
else
|
|
begin
|
|
if (WM_MOUSEFIRST <= Msg) and (Msg <= WM_MOUSELAST) then
|
|
begin
|
|
P := SmallPointToPoint(TSmallPoint(lParam));
|
|
MapWindowPoints(Handle, Parent.Handle, P, 1);
|
|
if (GetCapture <> Handle) and
|
|
not PtInRect(WindowRect, P) and PtInRect(Parent.GetItemRect(Self), P) then Exit;
|
|
end;
|
|
if Msg = WM_DESTROY then Focused := False;
|
|
if not ((Msg = WM_SYSKEYDOWN) and (WParam = VK_MENU)) then // to prevent SysMenu calling
|
|
DefaultHandler;
|
|
if Msg = WM_DESTROY then
|
|
begin
|
|
SetWindowLong(FHandle, GWL_WNDPROC, Longint(FPrevDefWndProc));
|
|
FreeObjectInstance(FDefWndProc);
|
|
FDefWndProc := nil;
|
|
FHandle := 0;
|
|
end;
|
|
end;
|
|
end;
|
|
finally
|
|
cxRemoveObjectLink(ASelfLink);
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarEditControl }
|
|
|
|
function TdxBarEditControl.GetCaptionWidth: Integer;
|
|
begin
|
|
if ShowCaption then
|
|
begin
|
|
Result := Parent.Canvas.TextWidth(GetTextOf(Caption));
|
|
Result := PainterClass.EditControlCaptionWidth(Self, Result);
|
|
end
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TdxBarEditControl.GetItem: TdxBarEdit;
|
|
begin
|
|
Result := TdxBarEdit(ItemLink.Item);
|
|
end;
|
|
|
|
function TdxBarEditControl.GetMaxLength: Integer;
|
|
begin
|
|
Result := Item.MaxLength;
|
|
end;
|
|
|
|
function TdxBarEditControl.GetReadOnly: Boolean;
|
|
begin
|
|
Result := Item.ReadOnly;
|
|
end;
|
|
|
|
function TdxBarEditControl.GetShowCaption: Boolean;
|
|
begin
|
|
Result := (Parent is TdxBarSubMenuControl) or Item.ShowCaption;
|
|
end;
|
|
|
|
procedure TdxBarEditControl.ControlClick(ByMouse: Boolean);
|
|
begin
|
|
inherited;
|
|
if Focused then SendMessage(FHandle, EM_SETSEL, 0, -1);
|
|
end;
|
|
|
|
procedure TdxBarEditControl.CreateWindowHandle;
|
|
begin
|
|
FHandle := CreateWindowEx(0, 'EDIT', '',
|
|
WS_CHILD or PainterClass.EditControlES_Style,
|
|
0, 0, 100, 100, Parent.Handle, 0, HInstance, nil);
|
|
|
|
Text := Item.Text;
|
|
SendMessage(FHandle, EM_SETLIMITTEXT, MaxLength, 0);
|
|
|
|
inherited CreateWindowHandle;
|
|
end;
|
|
|
|
procedure TdxBarEditControl.DrawBorder(DC: HDC; var ARect: TRect;
|
|
PaintType: TdxBarPaintType; Selected: Boolean);
|
|
begin
|
|
PainterClass.EditControlDrawBorder(Self, DC, ARect, PaintType, Selected);
|
|
end;
|
|
|
|
procedure TdxBarEditControl.DrawCaption(DC: HDC; var ARect: TRect;
|
|
PaintType: TdxBarPaintType; Selected: Boolean);
|
|
begin
|
|
if not ShowCaption then Exit;
|
|
PainterClass.EditControlDrawCaption(Self, DC, ARect, PaintType, Selected);
|
|
end;
|
|
|
|
function TdxBarEditControl.DrawSelected: Boolean;
|
|
begin
|
|
Result := inherited DrawSelected and not FParent.IsCustomizing;
|
|
end;
|
|
|
|
procedure TdxBarEditControl.DrawTextField(DC: HDC; const ARect: TRect);
|
|
begin
|
|
PainterClass.EditControlDrawTextField(Self, DC, ARect, False);
|
|
end;
|
|
|
|
function TdxBarEditControl.GetHeight: Integer;
|
|
begin
|
|
Result := Parent.EditTextSize;
|
|
if ShowCaption and (Result < Parent.TextSize) then
|
|
Result := Parent.TextSize;
|
|
end;
|
|
|
|
function TdxBarEditControl.GetMinWidth: Integer;
|
|
begin
|
|
Result := CaptionWidth + MinEditWidth;
|
|
end;
|
|
|
|
function TdxBarEditControl.GetWidth: Integer;
|
|
begin
|
|
Result := CaptionWidth + ItemLink.Width;
|
|
end;
|
|
|
|
procedure TdxBarEditControl.Paint(ARect: TRect; PaintType: TdxBarPaintType);
|
|
var
|
|
Selected: Boolean;
|
|
R: TRect;
|
|
DC: HDC;
|
|
begin
|
|
if ARect.Left = ARect.Right then Exit;
|
|
Selected := DrawSelected;
|
|
R := ARect;
|
|
DC := Parent.Canvas.Handle;
|
|
DrawCaption(DC, R, PaintType, Selected);
|
|
DrawBorder(DC, R, PaintType, Selected);
|
|
if Enabled then WindowRect := R;
|
|
if not Focused or not Enabled then
|
|
DrawTextField(DC, R);
|
|
end;
|
|
|
|
procedure TdxBarEditControl.SetFocused(Value: Boolean);
|
|
begin
|
|
if Value{Focused} then
|
|
SendMessage(Handle, EM_SETREADONLY, WPARAM(ReadOnly or Item.EmptyWindow), 0);
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarEditControl.SetText(Value: string);
|
|
var
|
|
ANotEqual: Boolean;
|
|
begin
|
|
ANotEqual := Text <> Value;
|
|
inherited;
|
|
PainterClass.EditControlUpdateWndText(Self, Handle, ANotEqual);
|
|
end;
|
|
|
|
procedure TdxBarEditControl.WidthChanged;
|
|
begin
|
|
FParent.RepaintBar;
|
|
end;
|
|
|
|
procedure TdxBarEditControl.WndProc(var Message: TMessage);
|
|
var
|
|
AHandle: HWND;
|
|
RealItemLink: TdxBarItemLink;
|
|
begin
|
|
with Message do
|
|
begin
|
|
if (Msg = WM_KEYDOWN) and ((wParam = VK_RETURN) or (wParam = VK_TAB)) then
|
|
begin
|
|
AHandle := Handle;
|
|
RealItemLink := ItemLink.RealItemLink;
|
|
if (RealItemLink <> nil) and (wParam = VK_RETURN) then
|
|
RealItemLink.BringToTopInRecentList(True);
|
|
Item.Text := Text;
|
|
if not IsWindowVisible(AHandle) then Exit;
|
|
end;
|
|
if (Msg = WM_COMMAND) and (HiWord(wParam) = EN_CHANGE) and not FFocusing then
|
|
Item.CurChange;
|
|
end;
|
|
inherited WndProc(Message);
|
|
end;
|
|
|
|
{ TdxBarManagerList }
|
|
|
|
constructor TdxBarManagerList.Create;
|
|
begin
|
|
inherited Create;
|
|
FList := TList.Create;
|
|
end;
|
|
|
|
destructor TdxBarManagerList.Destroy;
|
|
begin
|
|
while Count <> 0 do BarManagers[0].Free;
|
|
FList.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarManagerList.GetBarManager(Index: Integer): TdxBarManager;
|
|
begin
|
|
Result := nil;
|
|
if (Index > -1) and (Index < Count) then
|
|
Result := TdxBarManager(FList[Index]);
|
|
end;
|
|
|
|
function TdxBarManagerList.GetCount: Integer;
|
|
begin
|
|
Result := FList.Count;
|
|
end;
|
|
|
|
function TdxBarManagerList.GetCustomizingBarManager: TdxBarManager;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := nil;
|
|
for I := 0 to Count - 1 do
|
|
if BarManagers[I].IsCustomizing then
|
|
begin
|
|
Result := BarManagers[I];
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarItemControlPainter }
|
|
|
|
class procedure TdxBarItemControlPainter.DrawBackground(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R: TRect; ABrush: HBRUSH; AOpaque: Boolean);
|
|
begin
|
|
if AOpaque then
|
|
FillRect(DC, R, ABrush)
|
|
else
|
|
begin
|
|
ABarItemControl.CheckNonRecent;
|
|
try
|
|
ABarItemControl.Parent.FillBackground(DC, R, ABrush, clNone, True);
|
|
finally
|
|
ABarItemControl.UncheckNonRecent;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawBackgroundFrameRect(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R: TRect; ABrush: HBRUSH; AOpaque: Boolean);
|
|
var
|
|
AClipRgn: HRGN;
|
|
AClipRgnExists: Boolean;
|
|
begin
|
|
if AOpaque then
|
|
FrameRect(DC, R, ABrush)
|
|
else
|
|
begin
|
|
SaveClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
InflateRect(R, -1, -1);
|
|
with R do
|
|
ExcludeClipRect(DC, Left, Top, Right, Bottom);
|
|
InflateRect(R, 1, 1);
|
|
DrawBackground(ABarItemControl, DC, R, ABrush, False);
|
|
RestoreClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawDisabledShadowRect(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
FillRect(DC, R, COLOR_BTNSHADOW + 1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawGlyph(ABarItemControl: TdxBarItemControl;
|
|
R: TRect; FullBounds: PRect; PaintType: TdxBarPaintType; IsGlyphEmpty, Selected,
|
|
Down, DrawDowned, Center, ForceUseBkBrush, BarControlOwner, IsSplit: Boolean);
|
|
var
|
|
AWidth, AHeight, AImageWidth, AImageHeight: Integer;
|
|
GlyphRect: TRect;
|
|
|
|
procedure GetDimensions(var AWidth, AHeight: Integer);
|
|
begin
|
|
with R do
|
|
begin
|
|
AWidth := Right - Left;
|
|
AHeight := Bottom - Top;
|
|
if not Center then
|
|
case PaintType of
|
|
ptHorz:
|
|
AWidth := ABarItemControl.BarManager.ButtonWidth;
|
|
ptVert:
|
|
AHeight := ABarItemControl.BarManager.ButtonHeight;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure GetImageDimensions(var AWidth, AHeight: Integer);
|
|
begin
|
|
if (ABarItemControl.Glyph = nil) or ABarItemControl.Glyph.Empty then
|
|
with ABarItemControl.Images[PaintType <> ptMenu] do
|
|
begin
|
|
AWidth := Width;
|
|
AHeight := Height;
|
|
end
|
|
else
|
|
with ABarItemControl.Glyph do
|
|
begin
|
|
AWidth := Width;
|
|
AHeight := Height;
|
|
end;
|
|
end;
|
|
|
|
procedure GetRealImageDimensions(var AImageWidth, AImageHeight: Integer);
|
|
begin
|
|
if PaintType = ptMenu then
|
|
if ABarItemControl.BarManager.StretchGlyphs then
|
|
begin
|
|
if Center then
|
|
AImageWidth := MulDiv(AImageWidth, AHeight, ABarItemControl.NormalItemHeightInSubMenu)
|
|
else
|
|
AImageWidth := MulDiv(AImageWidth, AWidth, ABarItemControl.NormalItemHeightInSubMenu);
|
|
AImageHeight := MulDiv(AImageHeight, AHeight, ABarItemControl.NormalItemHeightInSubMenu);
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
if ABarItemControl.BarManager.LargeIcons then
|
|
begin
|
|
if ABarItemControl.BarManager.IsLargeImagesForLargeIcons then
|
|
begin
|
|
AImageWidth := ABarItemControl.BarManager.LargeImages.Width;
|
|
AImageHeight := ABarItemControl.BarManager.LargeImages.Height;
|
|
end
|
|
else
|
|
begin
|
|
AImageWidth := 2 * AImageWidth;
|
|
AImageHeight := 2 * AImageHeight;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function GetImageBounds: TRect;
|
|
begin
|
|
Result := Bounds(
|
|
R.Left + (AWidth - AImageWidth) div 2,
|
|
R.Top + (AHeight - AImageHeight) div 2,
|
|
AImageWidth, AImageHeight);
|
|
if Down then
|
|
OffsetRect(Result, GlyphDownShift(ABarItemControl), GlyphDownShift(ABarItemControl));
|
|
if DrawDowned then
|
|
OffsetRect(Result, GlyphDrawDownedShift(ABarItemControl, Down), GlyphDrawDownedShift(ABarItemControl, Down));
|
|
end;
|
|
|
|
begin
|
|
GlyphRect := R;
|
|
GetDimensions(AWidth, AHeight);
|
|
|
|
IsGlyphEmpty := IsGlyphEmpty or not ABarItemControl.ImageExists;
|
|
if not IsGlyphEmpty then
|
|
begin
|
|
GetImageDimensions(AImageWidth, AImageHeight);
|
|
GetRealImageDimensions(AImageWidth, AImageHeight);
|
|
GlyphRect := GetImageBounds;
|
|
end;
|
|
|
|
if FullBounds <> nil then
|
|
R := FullBounds^;
|
|
DrawGlyphAndBkgnd(ABarItemControl, R, GlyphRect, PaintType, ABarItemControl.Glyph,
|
|
ABarItemControl.Images[PaintType <> ptMenu], ABarItemControl.ImageIndex,
|
|
IsGlyphEmpty or not ABarItemControl.ImageExists, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, False, BarControlOwner, IsSplit);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawGlyphAndBkgnd(ABarItemControl: TdxBarItemControl;
|
|
R: TRect; const GlyphRect: TRect; PaintType: TdxBarPaintType; AGlyph: TBitmap;
|
|
AImages: TCurImageList; AImageIndex: Integer; IsGlyphEmpty, Selected, Down,
|
|
DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner, IsSplit: Boolean);
|
|
var
|
|
DC: HDC;
|
|
ABrush: HBRUSH;
|
|
AWidth, AHeight, AImageWidth, AImageHeight: Integer;
|
|
NeedBorder: Boolean;
|
|
|
|
procedure GetDimensions(var AWidth, AHeight: Integer);
|
|
begin
|
|
with R do
|
|
begin
|
|
AWidth := Right - Left;
|
|
AHeight := Bottom - Top;
|
|
end;
|
|
end;
|
|
|
|
procedure GetImageDimensions(var AWidth, AHeight: Integer);
|
|
begin
|
|
with GlyphRect do
|
|
begin
|
|
AWidth := Right - Left;
|
|
AHeight := Bottom - Top;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
DC := ABarItemControl.Parent.Canvas.Handle;
|
|
GetDimensions(AWidth, AHeight);
|
|
ABrush := GlyphBkgndBrush(ABarItemControl, PaintType, IsGlyphEmpty, Selected,
|
|
Down, DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner);
|
|
|
|
if IsGlyphEmpty then
|
|
begin
|
|
NeedBorder :=
|
|
(ABarItemControl.BarManager.GlyphSize + 2 <= AWidth) and
|
|
(ABarItemControl.BarManager.GlyphSize + 2 <= AHeight);
|
|
end
|
|
else
|
|
begin
|
|
GetImageDimensions(AImageWidth, AImageHeight);
|
|
NeedBorder :=
|
|
(AImageWidth + 2 <= AWidth) and (AImageHeight + 2 <= AHeight);
|
|
end;
|
|
|
|
if IsNativeBackground then
|
|
DrawGlyphBorder(ABarItemControl, DC, ABrush, NeedBorder, R, PaintType, IsGlyphEmpty,
|
|
Selected, Down, DrawDowned, BarControlOwner, IsSplit);
|
|
|
|
if IsGlyphEmpty then
|
|
begin
|
|
DrawGlyphEmptyImage(ABarItemControl, DC, R, ABrush, NeedBorder, PaintType,
|
|
Selected, Down, DrawDowned);
|
|
end
|
|
else
|
|
begin
|
|
DrawGlyphImage(ABarItemControl, DC, ABrush, NeedBorder, R, GlyphRect, AGlyph, AImages,
|
|
AImageIndex, Selected, Down, DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner,
|
|
PaintType);
|
|
end;
|
|
|
|
if not IsNativeBackground then
|
|
DrawGlyphBorder(ABarItemControl, DC, ABrush, NeedBorder, R, PaintType, IsGlyphEmpty,
|
|
Selected, Down, DrawDowned, BarControlOwner, IsSplit);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawGlyphAndTextInSubMenu(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Selected, ShowGlyph, Down: Boolean);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawItemText(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; S: string; PaintRect: TRect; Alignment: UINT; Enabled, Selected, Rotated,
|
|
Clipped, FlatText: Boolean);
|
|
var
|
|
R: TRect;
|
|
Format: UINT;
|
|
ClipRgn: HRGN;
|
|
TM: TTextMetric;
|
|
AccelPos, OffsetY: Integer;
|
|
Size, Size1: TSize;
|
|
AFlat: Boolean;
|
|
AColor1, AColor2: TColor;
|
|
|
|
function GetAccelPos(S: string): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
I := 1;
|
|
while I < Length(S) do
|
|
begin
|
|
if S[I] = '&' then
|
|
begin
|
|
Delete(S, I, 1);
|
|
if S[I] <> '&' then Result := I;
|
|
end;
|
|
Inc(I);
|
|
end;
|
|
end;
|
|
|
|
procedure UnderlineAccel;
|
|
var
|
|
X, Y: Integer;
|
|
Pen, PrevPen: HPEN;
|
|
begin
|
|
if AccelPos > 0 then
|
|
begin
|
|
Pen := CreatePen(PS_SOLID, 1, GetTextColor(DC));
|
|
PrevPen := SelectObject(DC, Pen);
|
|
with R do
|
|
begin
|
|
X := (Left + Right - Size.cy) div 2 + TM.tmDescent - 2;
|
|
Y := Top + OffsetY;
|
|
MoveToEx(DC, X, Y, nil);
|
|
LineTo(DC, X, Y + Size1.cx);
|
|
end;
|
|
SelectObject(DC, PrevPen);
|
|
DeleteObject(Pen);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
R := PaintRect;
|
|
SetBkMode(DC, TRANSPARENT);
|
|
Format := DT_SINGLELINE;
|
|
ClipRgn := 0;
|
|
if not Clipped then
|
|
Format := Format or DT_NOCLIP
|
|
else
|
|
if Rotated then
|
|
begin
|
|
Format := Format or DT_NOCLIP;
|
|
ClipRgn := CreateRectRgn(0, 0, 0, 0);
|
|
GetClipRgn(DC, ClipRgn);
|
|
with PaintRect do
|
|
IntersectClipRect(DC, Left, Top, Right, Bottom);
|
|
end;
|
|
if Rotated then
|
|
begin
|
|
GetTextMetrics(DC, TM);
|
|
AccelPos := GetAccelPos(S);
|
|
if AccelPos > 0 then
|
|
begin
|
|
S := GetTextOf(S);
|
|
Format := Format or DT_NOPREFIX;
|
|
end;
|
|
with PaintRect do
|
|
begin
|
|
GetTextExtentPoint32(DC, PChar(S), Length(S), Size);
|
|
case Alignment of
|
|
DT_CENTER:
|
|
OffsetY := (Bottom - Top - Size.cx) div 2;
|
|
DT_LEFT:
|
|
OffsetY := 0;
|
|
DT_RIGHT:
|
|
OffsetY := Bottom - Top - Size.cx;
|
|
end;
|
|
OffsetRect(PaintRect, (Right - Left + Size.cy) div 2, OffsetY);
|
|
if AccelPos > 0 then
|
|
begin
|
|
GetTextExtentPoint32(DC, PChar(Copy(S, 1, AccelPos - 1)), AccelPos - 1, Size1);
|
|
Inc(OffsetY, Size1.cx);
|
|
GetTextExtentPoint32(DC, PChar(string(S[AccelPos])), 1, Size1);
|
|
end;
|
|
end;
|
|
end
|
|
else
|
|
Format := Format or Alignment or DT_VCENTER;
|
|
|
|
AFlat := IsFlatItemText and FlatText; // TODO and ...
|
|
GetTextColors(ABarItemControl, Enabled, Selected, AFlat, AColor1, AColor2);
|
|
SetTextColor(DC, ColorToRGB(AColor1));
|
|
if AColor2 <> AColor1 then
|
|
begin
|
|
OffsetRect(PaintRect, 1, 1);
|
|
DrawText(DC, PChar(S), Length(S), PaintRect, Format);
|
|
if Rotated then
|
|
begin
|
|
OffsetRect(R, 1, 1);
|
|
UnderlineAccel;
|
|
OffsetRect(R, -1, -1);
|
|
end;
|
|
OffsetRect(PaintRect, -1, -1);
|
|
SetTextColor(DC, ColorToRGB(AColor2));
|
|
end;
|
|
DrawText(DC, PChar(S), Length(S), PaintRect, Format);
|
|
if Rotated then UnderlineAccel;
|
|
if ClipRgn <> 0 then
|
|
begin
|
|
GetRgnBox(ClipRgn, R);
|
|
if IsRectEmpty(R) then
|
|
SelectClipRgn(DC, 0)
|
|
else
|
|
SelectClipRgn(DC, ClipRgn);
|
|
DeleteObject(ClipRgn);
|
|
end;
|
|
SetBkMode(DC, OPAQUE);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawLowered(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawStaticBorder(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var ARect: TRect; ABorderWidth: Integer; ABorderStyle: TdxBarStaticBorderStyle);
|
|
const
|
|
Borders: array[TdxBarStaticBorderStyle] of Integer =
|
|
(0, BDR_SUNKENOUTER, BDR_RAISEDINNER, EDGE_ETCHED, 0);
|
|
begin
|
|
if ABorderStyle = sbsNone then Exit;
|
|
if ABorderStyle = sbsBump then
|
|
begin
|
|
DrawEdge(DC, ARect, BDR_RAISEDINNER, BF_RECT);
|
|
InflateRect(ARect, -1, -1);
|
|
DrawEdge(DC, ARect, BDR_SUNKENOUTER, BF_RECT);
|
|
InflateRect(ARect, -1, -1);
|
|
end
|
|
else
|
|
begin
|
|
DrawEdge(DC, ARect, Borders[ABorderStyle], BF_RECT);
|
|
InflateRect(ARect, -ABorderWidth, -ABorderWidth);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.FrameAndFillRect(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Enabled, Selected, Pressed: Boolean);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.GetArrowParams(ABarItemControl: TdxBarItemControl;
|
|
APaintType: TdxBarPaintType; AEnabled, ASelected, ADroppedDown: Boolean;
|
|
var ABrush: HBRUSH; var AArrowColor: COLORREF);
|
|
begin
|
|
AArrowColor := COLOR_BTNTEXT;
|
|
ABrush := ABarItemControl.Parent.BkBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.GlyphBkgndBrush(ABarItemControl: TdxBarItemControl;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, GrayScale, BarControlOwner: Boolean): HBRUSH;
|
|
begin
|
|
Result := ABarItemControl.Parent.BkBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.GlyphDownShift(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.GlyphDrawDownedShift(ABarItemControl: TdxBarItemControl;
|
|
ADown: Boolean): Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.IsFlatItemText: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.IsItemTextSelectedInverted: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.LoweredBorderSize(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.TextAreaOffset(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
if ABarItemControl.Parent is TdxBarSubMenuControl then
|
|
Result := ABarItemControl.Parent.TextSize + 1
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BeforeFingersSize: Integer;
|
|
begin
|
|
// Required
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BorderSizeX: Integer;
|
|
begin
|
|
Result := GetSystemMetrics(SM_CXFRAME);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BorderSizeY: Integer;
|
|
begin
|
|
Result := GetSystemMetrics(SM_CYFRAME);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.EmptyFingersSize: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.FingersSize: Integer;
|
|
begin
|
|
// Required
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.GripperSize: Integer;
|
|
begin
|
|
Result := dxBarFingerSize;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.RealButtonArrowWidth(ABarManager: TdxBarManager): Integer;
|
|
begin
|
|
Result := (1 + Byte(ABarManager.FLargeIcons)) * ABarManager.FButtonArrowWidth;
|
|
if not Odd(Result) then Inc(Result);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.RealLargeButtonArrowWidth(ABarManager: TdxBarManager): Integer;
|
|
begin
|
|
Result := ABarManager.FLargeButtonArrowWidth;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubMenuBeginGroupIndent: Integer;
|
|
begin
|
|
// Required
|
|
Result := 0;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DockControlFillBackground(ADockControl: TdxDockControl;
|
|
DC: HDC; ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
begin
|
|
FillBackgroundRect(DC, ADestR, ASourceR, ABrush, AColor, nil);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.IsNativeBackground: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarChildrenHaveShadows(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawDockedBackground(ABarControl: TCustomdxBarControl;
|
|
DC: HDC; ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
var
|
|
ABounds: TRect;
|
|
begin
|
|
ABounds := ABarControl.BoundsRect;
|
|
OffsetRect(ASourceR, ABounds.Left, ABounds.Top);
|
|
ABarControl.DockControl.FillBackground(DC, ADestR, ASourceR, ABrush, AColor);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarControlOwnerBrush(ABarManager: TdxBarManager): HBRUSH;
|
|
begin
|
|
Result := ABarManager.FlatToolbarsBrush;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawFloatingBackground(ABarControl: TCustomdxBarControl;
|
|
DC: HDC; ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
begin
|
|
FillBackgroundRect(DC, ADestR, ASourceR, ABrush, AColor, ABarControl.BarManager.Backgrounds.Bar);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawOwnerLink(ABarControl: TCustomdxBarControl; DC: HDC);
|
|
begin
|
|
if not IsRectEmpty(ABarControl.OwnerLinkBounds[False]) then
|
|
FillRect(DC, ABarControl.OwnerLinkBounds[False], ABarControl.BarControlOwnerBrush);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarHasShadow(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarToolbarBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := GetSysColorBrush(COLOR_BTNFACE);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarToolbarBrushEx(ABarControl: TdxBarControl): HBRUSH;
|
|
begin
|
|
Result := BarToolbarBrush(ABarControl);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarToolbarDownedBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := PatternBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarToolbarDownedSelBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := GetSysColorBrush(COLOR_BTNFACE);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarToolbarSelBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := GetSysColorBrush(COLOR_HIGHLIGHT);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.ComboBoxArrowWidth(ABarControl: TCustomdxBarControl;
|
|
DC: HDC; cX: Integer): Integer;
|
|
begin
|
|
Result := 2 * cX - 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.EditBorderSize(DC: HDC): Integer;
|
|
begin
|
|
Result := (2 + 1) * 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.EditTextSize(ABarControl: TCustomdxBarControl;
|
|
DC: HDC; cY: Integer): Integer;
|
|
begin
|
|
Result := cY + EditBorderSize(DC);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarAllowHotTrack: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarAllowQuickCustomizing: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarBeginGroupSideSize: Integer;
|
|
begin
|
|
Result := (BarBeginGroupSize - (1 + 1){|}) div 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarBeginGroupSize: Integer;
|
|
begin
|
|
Result := 2 + (1 + 1){|} + 2;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarBorderPaintSizes(ABarControl: TdxBarControl;
|
|
var R: TRect);
|
|
begin
|
|
R := Rect(BarBorderSize, BarBorderSize, BarBorderSize, BarBorderSize);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarBorderSize: Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarBorderSizes(ABar: TdxBar; AStyle: TdxBarDockingStyle;
|
|
var R: TRect);
|
|
begin
|
|
R := Rect(2, 2, 2, 2);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarCaptionAreaSize: Integer;
|
|
begin
|
|
Result := BarCaptionSize + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarCaptionFillBackground(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
FillRect(DC, R, AToolbarBrush);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarCaptionSize: Integer;
|
|
var
|
|
NonClientMetrics: TNonClientMetrics;
|
|
begin
|
|
NonClientMetrics.cbSize := SizeOf(NonClientMetrics);
|
|
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0);
|
|
Result := NonClientMetrics.iSmCaptionHeight;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarCaptionTransparent: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarCloseButtonSize: TSize;
|
|
begin
|
|
Result.cx := BarCaptionSize;
|
|
Result.cy := Result.cx;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawBeginGroup(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH; AHorz: Boolean);
|
|
begin
|
|
if AHorz then
|
|
begin
|
|
with ItemRect do
|
|
begin
|
|
ABarControl.FillBackground(DC,
|
|
Rect(Left, Top, Right, Top + BarBeginGroupSideSize),
|
|
AToolbarBrush, clNone, True);
|
|
ABarControl.FillBackground(DC,
|
|
Rect(Left, Bottom - BarBeginGroupSideSize, Right, Bottom),
|
|
AToolbarBrush, clNone, True);
|
|
end;
|
|
InflateRect(ItemRect, 0, -BarBeginGroupSideSize);
|
|
DrawEdge(DC, ItemRect, EDGE_ETCHED, BF_TOP)
|
|
end
|
|
else
|
|
begin
|
|
with ItemRect do
|
|
begin
|
|
ABarControl.FillBackground(DC,
|
|
Rect(Left, Top, Left + BarBeginGroupSideSize, Bottom),
|
|
AToolbarBrush, clNone, True);
|
|
ABarControl.FillBackground(DC,
|
|
Rect(Right - BarBeginGroupSideSize, Top, Right, Bottom),
|
|
AToolbarBrush, clNone, True);
|
|
end;
|
|
InflateRect(ItemRect, -BarBeginGroupSideSize, 0);
|
|
DrawEdge(DC, ItemRect, EDGE_ETCHED, BF_LEFT);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawCaptionElement(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AState: TdxBarMarkState);
|
|
var
|
|
ABrush: HBRUSH;
|
|
begin
|
|
if AState <> msNone then
|
|
begin
|
|
FrameFlatSelRect(DC, R);
|
|
InflateRect(R, -1, -1);
|
|
if AState = msSelected then
|
|
ABrush := ABarControl.ToolbarSelBrush
|
|
else
|
|
ABrush := ABarControl.ToolbarDownedSelBrush;
|
|
FillRect(DC, R, ABrush);
|
|
end
|
|
else
|
|
begin
|
|
ABrush := CreateSolidBrush(ABarControl.CaptionBkColor);
|
|
FillRect(DC, R, ABrush);
|
|
DeleteObject(ABrush);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawCloseButton(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawDockedBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawFloatingBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; var R, CR: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawFloatingBarCaption(ABarControl: TdxBarControl;
|
|
DC: HDC; var R, CR: TRect; AToolbarBrush: HBRUSH);
|
|
var
|
|
NonClientMetrics: TNonClientMetrics;
|
|
R1: TRect;
|
|
X: Integer;
|
|
ATransparent: Boolean;
|
|
|
|
procedure DrawCaption;
|
|
var
|
|
S: string;
|
|
AFont: HFONT;
|
|
Size: TSize;
|
|
APrevBkMode: Integer;
|
|
AFlags: Integer;
|
|
begin
|
|
if R.Right - R.Left <= 0 then Exit;
|
|
S := ABarControl.Bar.Caption;
|
|
if not ABarControl.BarManager.UseSystemFont then
|
|
with NonClientMetrics.lfSmCaptionFont, ABarControl.Bar.Font do
|
|
begin
|
|
if lfHeight > -11 then lfHeight := -11;
|
|
Move(Name[1], lfFaceName, Length(Name));
|
|
lfFaceName[Length(Name)] := #0;
|
|
end;
|
|
AFont := SelectObject(DC, CreateFontIndirect(NonClientMetrics.lfSmCaptionFont));
|
|
// SetTextColor(DC, GetSysColor(COLOR_CAPTIONTEXT));
|
|
SetTextColor(DC, ABarControl.CaptionColor);
|
|
SetBkColor(DC, ABarControl.CaptionBkColor);
|
|
AFlags := ETO_CLIPPED;
|
|
if ATransparent then
|
|
APrevBkMode := SetBkMode(DC, TRANSPARENT)
|
|
else
|
|
begin
|
|
AFlags := AFlags or ETO_OPAQUE;
|
|
APrevBkMode := 0; // WARN OFF
|
|
end;
|
|
GetTextExtentPoint32(DC, PChar(S), Length(S), Size);
|
|
ExtTextOut(DC, X, (R.Top + R.Bottom - Size.cy) div 2, AFlags,
|
|
@R, PChar(S), Length(S), nil);
|
|
if ATransparent then
|
|
SetBkMode(DC, APrevBkMode);
|
|
DeleteObject(SelectObject(DC, AFont));
|
|
end;
|
|
|
|
begin
|
|
NonClientMetrics.cbSize := SizeOf(NonClientMetrics);
|
|
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0);
|
|
R1 := R;
|
|
R1.Top := R.Bottom;
|
|
R1.Bottom := R1.Top + 1;
|
|
FillRect(DC, R1, AToolbarBrush);
|
|
|
|
ATransparent := BarCaptionTransparent;
|
|
if ATransparent then
|
|
BarCaptionFillBackground(ABarControl, DC, R, AToolbarBrush);
|
|
if ABarControl.Bar.CanClose then
|
|
begin
|
|
Dec(R.Right, BarCaptionSize);
|
|
ABarControl.DrawCloseButton(DC);
|
|
end;
|
|
X := R.Left;
|
|
if ABarControl.MarkExists then
|
|
BarOffsetFloatingBarCaption(ABarControl, X, R)
|
|
else
|
|
Inc(X, 2);
|
|
|
|
DrawCaption;
|
|
if ABarControl.MarkExists then ABarControl.DrawMark(DC);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawMark(ABarControl: TdxBarControl; DC: HDC; MarkR: TRect);
|
|
begin
|
|
BarDrawMarkArrow(ABarControl, DC, MarkR);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawMarks(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
BarDrawMarkBackground(ABarControl, DC, ItemRect, AToolbarBrush);
|
|
BarDrawMarkElements(ABarControl, DC, ItemRect);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawMDIButton(ABarControl: TdxBarControl;
|
|
AButton: TdxBarMDIButton; ASelected, APressed: Boolean; DC: HDC; R: TRect);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawStatusBarGrip(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
var
|
|
R1: TRect;
|
|
begin
|
|
R1 := R;
|
|
R1.Top := R1.Bottom - StatusBarGripSize(ABarControl.BarManager).cy;
|
|
BarDrawGrip(ABarControl, DC, R1, AToolbarBrush);
|
|
R1.Bottom := R1.Top;
|
|
R1.Top := R.Top;
|
|
ABarControl.FillBackground(DC, R1, AToolbarBrush, clNone, False);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawStatusBarTopBorder(ABarControl: TdxBarControl; DC: HDC;
|
|
R: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
ABarControl.FillBackground(DC, R, AToolbarBrush, clNone, False);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarHorSize: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarMarkRect(ABarControl: TdxBarControl): TRect;
|
|
begin
|
|
Result := BarMarkItemRect(ABarControl);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarMarkItemRect(ABarControl: TdxBarControl): TRect;
|
|
begin
|
|
// TODO: Required
|
|
SetRectEmpty(Result);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarMarkRectInvalidate(ABarControl: TdxBarControl);
|
|
var
|
|
DC: HDC;
|
|
R: TRect;
|
|
begin
|
|
if ABarControl.DockingStyle = dsNone then
|
|
begin
|
|
DC := GetWindowDC(ABarControl.Handle);
|
|
ABarControl.DrawMark(DC);
|
|
ReleaseDC(ABarControl.Handle, DC);
|
|
end
|
|
else
|
|
begin
|
|
R := BarMarkItemRect(ABarControl);
|
|
InvalidateRect(ABarControl.Handle, @R, False);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarTopSize: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarBottomSize: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarUseSystemClose: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarUseSystemNCBorder: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.StatusBarFillBackground(ABarControl: TdxBarControl; DC: HDC;
|
|
ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
begin
|
|
FillBackgroundRect(DC, ADestR, ASourceR, ABrush, AColor, nil);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.StatusBarGripSize(ABarManager: TdxBarManager): TSize;
|
|
begin
|
|
Result.cx := GetSystemMetrics(SM_CXHSCROLL);
|
|
Result.cy := GetSystemMetrics(SM_CYHSCROLL);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.StatusBarTopBorderSize(ABarManager: TdxBarManager): Integer;
|
|
begin
|
|
Result := 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarToolbarBrushEx2(ABarControl: TdxBarControl): HBRUSH;
|
|
begin
|
|
Result := BarToolbarBrushEx(ABarControl);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawQuickCustItemFrame(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R, ARect: TRect; Selected: Boolean);
|
|
begin
|
|
with R do
|
|
Right := Left + Bottom - Top;
|
|
ARect.Left := R.Right;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawQuickCustItemFrameSelected(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; WholeR, R: TRect; Selected: Boolean);
|
|
begin
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.IsQuickControlPopupOnRight: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.ButtonBorderHeight: Integer;
|
|
begin
|
|
Result := dxBarButtonBorderHeight;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.ButtonBorderWidth: Integer;
|
|
begin
|
|
Result := dxBarButtonBorderWidth;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.CorrectButtonControlDefaultHeight(var DefaultHeight: Integer);
|
|
begin
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.CorrectButtonControlDefaultWidth(ABarItemControl: TdxBarItemControl;
|
|
var DefaultWidth: Integer);
|
|
begin
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawButtonControlArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R1: TRect; Brush: HBRUSH; ArrowColor: COLORREF; Selected, DrawDowned, DroppedDown,
|
|
DropDownEnabled, IsDropDownMenuControlExist: Boolean; PaintType: TdxBarPaintType);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.IsDropDownRepaintNeeded: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.OffsetCaptionBounds(ABarButtonControl: TdxBarButtonControl;
|
|
APressed: Boolean; var R: TRect);
|
|
begin
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.OffsetEllipsisBounds(ABarItemControl: TdxBarItemControl;
|
|
APressed: Boolean; var R: TRect);
|
|
begin
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.ComboControlArrowOffset: Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.ComboControlDrawArrow(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; Selected: Boolean; PaintType: TdxBarPaintType);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.ComboControlGetArrowParams(ABarItemControl: TdxBarItemControl;
|
|
APaintType: TdxBarPaintType; AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH;
|
|
var AArrowColor: COLORREF);
|
|
begin
|
|
GetArrowParams(ABarItemControl, APaintType, AEnabled, ASelected, ADroppedDown, ABrush, AArrowColor);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.DropDownListBoxBorderSize: Integer;
|
|
begin
|
|
// Required
|
|
Result := 0;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DropDownListBoxDrawBorder(ABarManager: TdxBarManager;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubItemControlCaptionOffset(ABarSubItemControl: TdxBarSubItemControl): Integer;
|
|
begin
|
|
Result := -ABarSubItemControl.Parent.Canvas.Font.Height div 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubItemControlDefaultHeight(ABarSubItemControl: TdxBarSubItemControl): Integer;
|
|
begin
|
|
if ABarSubItemControl.Parent is TdxBarControl then
|
|
begin
|
|
if ABarSubItemControl.ImageExists or not ABarSubItemControl.Item.ShowCaption then
|
|
if not IsVertical(ABarSubItemControl.Parent) then
|
|
Result := ABarSubItemControl.BarManager.ButtonHeight
|
|
else
|
|
Result := ABarSubItemControl.BarManager.ButtonWidth
|
|
else
|
|
Result := 0;
|
|
if (Result = 0) or ABarSubItemControl.Item.ShowCaption and
|
|
(Result < ABarSubItemControl.Parent.TextSize) then
|
|
Result := ABarSubItemControl.Parent.TextSize;
|
|
end
|
|
else
|
|
Result := ABarSubItemControl.Parent.TextSize;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubItemControlDefaultWidth(ABarSubItemControl: TdxBarSubItemControl): Integer;
|
|
begin
|
|
with ABarSubItemControl.Parent.Canvas do
|
|
if ABarSubItemControl.Parent is TdxBarSubMenuControl then
|
|
Result := 2 * ABarSubItemControl.Parent.TextSize + 3 + TextWidth(GetTextOf(ABarSubItemControl.Caption))
|
|
else
|
|
begin
|
|
if ABarSubItemControl.Item.ShowCaption then
|
|
Result := TextWidth(GetTextOf(ABarSubItemControl.Caption))
|
|
else
|
|
Result := 0;
|
|
if ABarSubItemControl.ImageExists or not ABarSubItemControl.Item.ShowCaption then
|
|
begin
|
|
if not IsVertical(ABarSubItemControl.Parent) then
|
|
Inc(Result, ABarSubItemControl.BarManager.ButtonWidth)
|
|
else
|
|
Inc(Result, ABarSubItemControl.BarManager.ButtonHeight);
|
|
if ABarSubItemControl.Item.ShowCaption then Inc(Result, 4);
|
|
end
|
|
else
|
|
Inc(Result, 2 * ABarSubItemControl.CaptionOffset);
|
|
if not TdxBarControl(ABarSubItemControl.Parent).Bar.IsMainMenu then
|
|
Inc(Result, ABarSubItemControl.Parent.TextSize div 2);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubItemControlDraw(ABarSubItemControl: TdxBarSubItemControl;
|
|
DC: HDC; R: TRect; Selected, Down: Boolean; PaintType: TdxBarPaintType);
|
|
|
|
procedure DrawArrow;
|
|
var
|
|
Size: Integer;
|
|
begin
|
|
if PaintType = ptMenu then
|
|
Size := ABarSubItemControl.Parent.MenuArrowHeight
|
|
else
|
|
Size := ABarSubItemControl.Parent.MenuArrowHeight - 1;
|
|
with R do
|
|
case PaintType of
|
|
ptMenu:
|
|
begin
|
|
Left := Right - ABarSubItemControl.Parent.TextSize + Size;
|
|
DrawLargeItemArrow(DC, R, atRight, Size, Selected, ABarSubItemControl.Enabled, False{Flat});
|
|
end;
|
|
ptHorz:
|
|
begin
|
|
Left := Right - ABarSubItemControl.Parent.TextSize div 2 + ABarSubItemControl.Parent.Canvas.Font.Height div 2;
|
|
DrawLargeItemArrow(DC, R, atDown, Size, False, ABarSubItemControl.Enabled, False{Flat});
|
|
end;
|
|
ptVert:
|
|
begin
|
|
Top := Bottom - ABarSubItemControl.Parent.TextSize div 2 + ABarSubItemControl.Parent.Canvas.Font.Height div 2;
|
|
DrawLargeItemArrow(DC, R, atRight, Size, False, ABarSubItemControl.Enabled, False{Flat});
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
with R do
|
|
if PaintType = ptMenu then
|
|
begin
|
|
DrawGlyphAndTextInSubMenu(ABarSubItemControl, DC, R, Selected, True, False);
|
|
DrawArrow;
|
|
end
|
|
else
|
|
begin
|
|
DrawGlyph(ABarSubItemControl, R, nil, PaintType, False, Selected, Down,
|
|
False, False, False, True, False);
|
|
|
|
if ABarSubItemControl.ImageExists or not ABarSubItemControl.Item.ShowCaption then
|
|
if PaintType = ptHorz then
|
|
Inc(Left, ABarSubItemControl.BarManager.ButtonWidth)
|
|
else
|
|
Inc(Top, ABarSubItemControl.BarManager.ButtonHeight)
|
|
else
|
|
if PaintType = ptHorz then
|
|
Inc(Left, ABarSubItemControl.CaptionOffset)
|
|
else
|
|
Inc(Top, ABarSubItemControl.CaptionOffset);
|
|
if Down and not (IsMenuItem(ABarSubItemControl)) then
|
|
OffsetRect(R, 1, 1); // ***
|
|
|
|
if ABarSubItemControl.Item.ShowCaption then
|
|
DrawItemText(ABarSubItemControl, DC, ABarSubItemControl.Caption, R, DT_LEFT,
|
|
ABarSubItemControl.Enabled, IsMenuItem(ABarSubItemControl) and Selected{***},
|
|
PaintType = ptVert, False, False);
|
|
if not TdxBarControl(ABarSubItemControl.Parent).Bar.IsMainMenu then DrawArrow;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubMenuControlArrowsOffset: Integer;
|
|
begin
|
|
Result := 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubMenuControlBeginGroupSize: Integer;
|
|
begin
|
|
Result := 4 + 2 + 4;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubMenuControlBorderSize: Integer;
|
|
begin
|
|
Result := 3;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlCalcDrawingConsts(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ATextSize, AMenuArrowWidth, AMarkSize, ANormalItemHeight: Integer);
|
|
var
|
|
Size: Integer;
|
|
begin
|
|
AMenuArrowWidth := ATextSize div 4 * 3 + 1;
|
|
AMarkSize := ABarSubMenuControl.Canvas.TextHeight('0') + 1;
|
|
Size := SubMenuControlMarkArrowSize(ABarSubMenuControl, AMarkSize);
|
|
if Odd(Size) then AMarkSize := (Size - 1) * 2 + 2 * 3;
|
|
ANormalItemHeight := 19;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlCalcRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect; var AClientHeight: Integer);
|
|
begin
|
|
with ABarSubMenuControl do
|
|
begin
|
|
R := Rect(2 + BarSize, 2 * Byte(not Detachable), ClientWidth - 2, 2 * Byte(not Detachable));
|
|
if Size = nil then
|
|
AClientHeight := ClientHeight - 1 - 1 - TextSize * Byte(MarkExists)
|
|
else
|
|
begin
|
|
Size^.X := 0;
|
|
AClientHeight := MaxInt;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlCalcSize(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect);
|
|
begin
|
|
with ABarSubMenuControl do
|
|
begin
|
|
if Size^.X = 0 then
|
|
Size^.X := 100
|
|
else
|
|
Inc(Size^.X, 2 * 3 + BarSize);
|
|
if (R.Top <= 2) or MarkExists then
|
|
Inc(R.Top, TextSize);
|
|
Size^.Y := 1 + R.Top + 3;
|
|
if Detachable then
|
|
Inc(Size^.Y, DetachCaptionAreaSize);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubMenuControlIsOffsetRecentGroupNeeded: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubMenuControlDetachCaptionAreaSize(ABarSubMenuControl: TdxBarSubMenuControl): Integer;
|
|
begin
|
|
Result := 2 + ABarSubMenuControl.DetachCaptionSize + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlDrawArrowsArea(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; ABrush: HBRUSH; AMaxVisibleCount: Integer);
|
|
const
|
|
BrushColors: array[Boolean] of COLORREF = (COLOR_BTNHIGHLIGHT, COLOR_BTNSHADOW);
|
|
var
|
|
R: TRect;
|
|
AControl: TdxBarItemControl;
|
|
begin
|
|
with ABarSubMenuControl do
|
|
begin
|
|
if UpArrowExists then
|
|
begin
|
|
R := ItemLinks.VisibleItems[TopIndex].ItemRect;
|
|
SubMenuControlDrawArrow(ABarSubMenuControl, DC, R, True);
|
|
DrawBackground(ItemLinks.VisibleItems[TopIndex].Control, DC, R, ToolbarItemsBrush, False);
|
|
SelectClipRgn(DC, 0);
|
|
end;
|
|
AControl := ItemLinks.VisibleItems[TopIndex + AMaxVisibleCount - 1].Control;
|
|
R := GetItemRectEx(AControl, True);
|
|
if DownArrowExists then
|
|
begin
|
|
SubMenuControlDrawArrow(ABarSubMenuControl, DC, R, False);
|
|
if AControl.FChangeRecentGroup then
|
|
begin
|
|
with R do
|
|
DrawBackground(AControl, DC, Rect(Left - 1, Top, Right + 1, Top + 1),
|
|
BrushColors[AControl.FNonRecent] + 1, False);
|
|
Inc(R.Top);
|
|
end;
|
|
DrawBackground(AControl, DC, R, ToolbarItemsBrush, False);
|
|
end;
|
|
R.Top := R.Bottom;
|
|
R.Bottom := ClientHeight - SubMenuControlArrowsOffset;
|
|
if MarkExists then Dec(R.Bottom, TextSize);
|
|
DrawBackground(AControl, DC, R, ToolbarItemsBrush, False);
|
|
if DownArrowExists then SelectClipRgn(DC, 0);
|
|
if MarkExists then
|
|
begin
|
|
R.Top := R.Bottom;
|
|
R.Bottom := R.Top + TextSize;
|
|
Dec(R.Bottom, MarkSize);
|
|
DrawBackground(AControl, DC, R, ToolbarItemsBrush, False);
|
|
R.Top := R.Bottom;
|
|
Inc(R.Bottom, MarkSize);
|
|
if MarkState = msSelected then
|
|
begin
|
|
DrawEdge(DC, R, BDR_RAISEDINNER, BF_RECT);
|
|
ABrush := FLightBrush;
|
|
InflateRect(R, -1, -1);
|
|
PreparePalette(DC);
|
|
DrawBackground(AControl, DC, R, ABrush, False);
|
|
UnpreparePalette(DC);
|
|
InflateRect(R, 1, 1);
|
|
end
|
|
else
|
|
DrawBackground(AControl, DC, R, ToolbarItemsBrush, False);
|
|
SubMenuControlDrawMark(ABarSubMenuControl, DC, R, False);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlDrawBackground(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; ARect: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
begin
|
|
FillBackgroundRect(DC, ARect, ARect, ABrush, AColor, ABarSubMenuControl.GetBackgroundBitmap);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlDrawBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
with R do
|
|
begin
|
|
FillRect(DC, Rect(Left, Top, Left + 1, Bottom - 1), COLOR_BTNFACE + 1);
|
|
FillRect(DC, Rect(Left + 1, Top, Right - 1, Top + 1), COLOR_BTNFACE + 1);
|
|
end;
|
|
DrawEdge(DC, R, BDR_RAISEDOUTER, BF_BOTTOMRIGHT);
|
|
if ABarSubMenuControl.Detachable then
|
|
begin
|
|
InflateRect(R, -1, -1);
|
|
DrawEdge(DC, R, BDR_RAISEDINNER, BF_RECT - BF_BOTTOM);
|
|
InflateRect(R, -1, -1);
|
|
R.Bottom := R.Top + ABarSubMenuControl.DetachCaptionAreaSize - 1;
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
|
|
SubMenuControlDrawDetachCaption(ABarSubMenuControl, DC, ABarSubMenuControl.DetachCaptionRect);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlDrawClientBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; var R: TRect; ABrush: HBRUSH);
|
|
begin
|
|
if ABarSubMenuControl.Detachable then Dec(R.Top, 2);
|
|
DrawEdge(DC, R, BDR_RAISEDINNER, BF_RECT);
|
|
InflateRect(R, -1, -1);
|
|
FrameRect(DC, R, ABrush);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlDrawDetachCaption(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect);
|
|
const
|
|
Colors: array[Boolean] of COLORREF = (COLOR_INACTIVECAPTION, COLOR_ACTIVECAPTION);
|
|
begin
|
|
FillRect(DC, R, Colors[ABarSubMenuControl.DetachCaptionSelected] + 1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlDrawBeginGroup(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AControl: TdxBarItemControl; DC: HDC; AItemRect: TRect; LeftDelta: Integer);
|
|
var
|
|
R: TRect;
|
|
ABrush: HBRUSH;
|
|
LD, RD: Integer;
|
|
AOpaque: Boolean;
|
|
begin
|
|
RD := Byte(AControl.FNonRecent);
|
|
R := AItemRect;
|
|
if AControl.FChangeRecentGroup and AControl.FNonRecent then
|
|
begin
|
|
Dec(R.Top);
|
|
RD := 0;
|
|
ABrush := ABarSubMenuControl.ToolbarBrush;
|
|
end
|
|
else
|
|
ABrush := ABarSubMenuControl.BkBrush;
|
|
LD := RD * LeftDelta;
|
|
R.Bottom := R.Top;
|
|
Dec(R.Top, ABarSubMenuControl.BeginGroupSize);
|
|
AControl.FBeginGroupRect := R;
|
|
AOpaque := AControl.FNonRecent and not AControl.FChangeRecentGroup;
|
|
with R do
|
|
begin
|
|
DrawBackground(AControl, DC, Rect(Left - LD, Top, Right + 2 * RD, Top + 4), ABrush, AOpaque);
|
|
DrawBackground(AControl, DC, Rect(Left - LD, Bottom - 4, Right + 2 * RD, Bottom), ABrush, AOpaque);
|
|
DrawBackground(AControl, DC,
|
|
Rect(Left - LD, Top + 4, Left + ABarSubMenuControl.BarManager.SubMenuBeginGroupIndent, Bottom - 4),
|
|
ABrush, AOpaque);
|
|
DrawBackground(AControl, DC,
|
|
Rect(Right - ABarSubMenuControl.BarManager.SubMenuBeginGroupIndent, Top + 4, Right + 2 * RD, Bottom - 4),
|
|
ABrush, AOpaque);
|
|
InflateRect(R, -ABarSubMenuControl.BarManager.SubMenuBeginGroupIndent, -4);
|
|
DrawEdge(DC, R, EDGE_ETCHED, BF_TOP);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlDrawItemFrame(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AControl: TdxBarItemControl; DC: HDC; AItemRect: TRect; AIndex, LeftDelta: Integer);
|
|
begin
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubMenuControlMarkArrowSize(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AMarkSize: Integer): Integer;
|
|
begin
|
|
Result := (AMarkSize - 2 * (2 + 1)) div 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubMenuControlMarkRectOffset(ABarSubMenuControl: TdxBarSubMenuControl): Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlOffsetDetachCaptionRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var R: TRect);
|
|
begin
|
|
InflateRect(R, -3, -3);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlPrepareBkBrush(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ABkBrush: HBRUSH);
|
|
begin
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SubMenuControlToolbarItemsBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH;
|
|
begin
|
|
Result := COLOR_BTNFACE + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.EditDrawInterior(ABarEditControl: TdxBarEditControl;
|
|
ABarEdit: TdxBarEdit; ACanvas: TCanvas; R: TRect; ItemLink: TdxBarItemLink);
|
|
var
|
|
DC: HDC;
|
|
S: string;
|
|
begin
|
|
DC := ACanvas.Handle;
|
|
FillRect(DC, R, ACanvas.Brush.Handle); // draw only client area
|
|
Inc(R.Left, 2);
|
|
Dec(R.Right, 2);
|
|
EditOffsetInteriorRect(R);
|
|
if ABarEdit.FocusedItemLink = ItemLink then
|
|
S := ABarEdit.CurText
|
|
else
|
|
S := ABarEdit.Text;
|
|
SetBkMode(DC, TRANSPARENT);
|
|
DrawText(DC, PChar(S), Length(S), R, DT_NOPREFIX);
|
|
SetBkMode(DC, OPAQUE);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.CustomComboDrawItem(ABarCustomCombo: TdxBarCustomCombo;
|
|
ACanvas: TCanvas; AIndex: Integer; ARect: TRect; AState: TOwnerDrawState; AInteriorIsDrawing: Boolean);
|
|
var
|
|
S: string;
|
|
begin
|
|
with ACanvas, ARect do
|
|
begin
|
|
if AIndex = -1 then
|
|
S := ABarCustomCombo.Text
|
|
else
|
|
S := ABarCustomCombo.Items[AIndex];
|
|
FillRect(ARect);
|
|
TextOut(Left + 2, Top, S);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.EditControlCaptionWidth(ABarEditControl: TdxBarEditControl;
|
|
ATextWidth: Integer): Integer;
|
|
begin
|
|
Result := 2 + ATextWidth + 4;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.EditControlDrawBorder(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean);
|
|
var
|
|
Brush: HBRUSH;
|
|
begin
|
|
if Selected then
|
|
DrawEdge(DC, ARect, BDR_SUNKENOUTER, BF_RECT)
|
|
else
|
|
DrawBackgroundFrameRect(ABarEditControl, DC, ARect, ABarEditControl.Parent.BkBrush, ABarEditControl.FNonRecent);
|
|
InflateRect(ARect, -1, -1);
|
|
if ABarEditControl.Enabled then
|
|
Brush := ABarEditControl.Parent.BkBrush
|
|
else
|
|
Brush := GetSysColorBrush(COLOR_BTNHIGHLIGHT);
|
|
DrawBackgroundFrameRect(ABarEditControl, DC, ARect, Brush, (Selected or ABarEditControl.FNonRecent) or not ABarEditControl.Enabled);
|
|
InflateRect(ARect, -1, -1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.EditControlDrawCaption(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean);
|
|
var
|
|
S: string;
|
|
Size: TSize;
|
|
R: TRect;
|
|
Brush: HBRUSH;
|
|
begin
|
|
S := GetTextOf(ABarEditControl.Caption);
|
|
GetTextExtentPoint32(DC, PChar(S), Length(S), Size);
|
|
R := ARect;
|
|
R.Right := R.Left + 2 + Size.cX;
|
|
ARect.Left := R.Right + 4;
|
|
if Selected and (PaintType = ptMenu) then
|
|
Brush := ABarEditControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := ABarEditControl.Parent.BkBrush;
|
|
DrawBackground(ABarEditControl, DC, R, Brush, (PaintType = ptMenu) and (Selected or ABarEditControl.FNonRecent));
|
|
DrawItemText(ABarEditControl, DC, ABarEditControl.Caption, R, DT_RIGHT,
|
|
ABarEditControl.Enabled, Selected and (PaintType = ptMenu), False, False, False);
|
|
R.Left := R.Right;
|
|
R.Right := ARect.Left;
|
|
DrawBackground(ABarEditControl, DC, R, ABarEditControl.Parent.BkBrush, (PaintType = ptMenu) and ABarEditControl.FNonRecent);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.EditControlDrawTextField(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; const ARect: TRect; AIgnoreEnabled: Boolean);
|
|
var
|
|
ATextColor, ABkColor: COLORREF;
|
|
PrevClipRgn: HRGN;
|
|
ClipRgnExists: Boolean;
|
|
PrevFont: HFONT;
|
|
begin
|
|
// if ABarEditControl.Enabled or AIgnoreEnabled then
|
|
if True then
|
|
begin
|
|
GetEditColors(ABarEditControl, ATextColor, ABkColor);
|
|
|
|
SetTextColor(DC, ATextColor);
|
|
SaveClipRgn(DC, PrevClipRgn, ClipRgnExists);
|
|
with ARect do
|
|
IntersectClipRect(DC, Left, Top, Right, Bottom);
|
|
try
|
|
with ABarEditControl.Parent.Canvas do
|
|
begin
|
|
Font.Color := ATextColor;
|
|
Brush.Color := ABkColor;
|
|
Handle; // RequiredState(csAllValid)
|
|
end;
|
|
PrevFont := SelectObject(DC, ABarEditControl.Parent.EditFontHandle);
|
|
try
|
|
ABarEditControl.Item.DrawInterior(ABarEditControl, ABarEditControl.Parent.Canvas,
|
|
ARect, ABarEditControl.ItemLink);
|
|
finally
|
|
if GetObjectType(PrevFont) = OBJ_FONT then
|
|
SelectObject(DC, PrevFont);
|
|
end;
|
|
finally
|
|
RestoreClipRgn(DC, PrevClipRgn, ClipRgnExists);
|
|
end;
|
|
end
|
|
else
|
|
FillRect(DC, ARect, ABarEditControl.Parent.BkBrush);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.EditControlES_Style: Integer;
|
|
begin
|
|
Result := ES_AUTOHSCROLL;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.EditControlPrepareEditWnd(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND);
|
|
begin
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.ColorComboDrawCustomButton(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; var ACustomColorButtonRect: TRect; Selected, Pressed: Boolean);
|
|
var
|
|
DotSize, I: Integer;
|
|
begin
|
|
with ARect do
|
|
begin
|
|
DrawBackgroundFrameRect(ABarComboControl, DC, ARect, ABarComboControl.Parent.BkBrush, False);
|
|
InflateRect(ARect, 0, -1);
|
|
DrawBackgroundFrameRect(ABarComboControl, DC, ARect, ABarComboControl.Parent.BkBrush, False);
|
|
InflateRect(ARect, -1, -1);
|
|
ACustomColorButtonRect := ARect;
|
|
FrameAndFillRect(ABarComboControl, DC, ARect, ABarComboControl.Enabled, Selected, Pressed);
|
|
// draw dots
|
|
DotSize := (Right - Left) div 7;
|
|
Right := Left;
|
|
Dec(Bottom, DotSize);
|
|
Top := Bottom - DotSize;
|
|
OffsetEllipsisBounds(ABarComboControl, Pressed, ARect);
|
|
for I := 0 to 2 do
|
|
begin
|
|
Left := Right + DotSize;
|
|
Right := Left + DotSize;
|
|
if ABarComboControl.Enabled then
|
|
begin
|
|
if IsHighContrastWhite and Selected then
|
|
FillRect(DC, ARect, COLOR_BTNFACE + 1)
|
|
else
|
|
FillRect(DC, ARect, COLOR_BTNTEXT + 1);
|
|
end
|
|
else
|
|
DrawDisabledShadowRect(ABarComboControl, DC, ARect);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SysPanelCalcSize(AHandle: HWND; var ARect: TRect;
|
|
var Corner: TdxCorner; Combo: TdxBarItem; AllowResizing: Boolean);
|
|
var
|
|
R: TRect;
|
|
AControl: TdxBarWinControl;
|
|
begin
|
|
InflateRect(ARect, -1, -1);
|
|
if AllowResizing and
|
|
(Combo.CurItemLink <> nil) and (Combo.CurItemLink.Control <> nil) then
|
|
begin
|
|
GetWindowRect(AHandle, R);
|
|
AControl := TdxBarWinControl(Combo.CurItemLink.Control);
|
|
MapWindowPoints(0, AControl.Parent.Handle, R, 2);
|
|
Corner := GetCornerForRects(AControl.WindowRect, R);
|
|
with ARect do
|
|
if Corner in [coBottomLeft, coBottomRight] then
|
|
Dec(Bottom, SysPanelSize)
|
|
else
|
|
Inc(Top, SysPanelSize);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SysPanelDraw(AHandle: HWND; AllowResizing,
|
|
MouseAboveCloseButton, CloseButtonIsTracking: Boolean; var CloseButtonRect,
|
|
GripRect: TRect; Corner: TdxCorner);
|
|
begin
|
|
dxBarPopupNCPaint(AHandle, AllowResizing, False, MouseAboveCloseButton,
|
|
CloseButtonIsTracking, CloseButtonRect, GripRect, Corner);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.SysPanelSize: Integer;
|
|
begin
|
|
Result := dxDropDownNCHeight;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.IsDateNavigatorFlat: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DateNavigatorDrawButton(ABarItem: TdxBarItem;
|
|
DC: HDC; R: TRect; const ACaption: string; APressed: Boolean);
|
|
var
|
|
Offset: Integer;
|
|
APrevPen: HPEN;
|
|
begin
|
|
Offset := 0;
|
|
with R do
|
|
begin
|
|
if APressed then
|
|
begin
|
|
DrawFrameControl(DC, R, DFC_BUTTON, DFCS_BUTTONPUSH or DFCS_PUSHED);
|
|
Offset := 1;
|
|
end
|
|
else
|
|
begin
|
|
APrevPen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNTEXT)));
|
|
MoveToEx(DC, Left, Bottom - 1, nil);
|
|
LineTo(DC, Right - 1, Bottom - 1);
|
|
LineTo(DC, Right - 1, Top);
|
|
DeleteObject(SelectObject(DC, APrevPen));
|
|
|
|
APrevPen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE)));
|
|
LineTo(DC, Left, Top);
|
|
LineTo(DC, Left, Bottom - 1);
|
|
DeleteObject(SelectObject(DC, APrevPen));
|
|
|
|
APrevPen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)));
|
|
MoveToEx(DC, Left + 1, Bottom - 2, nil);
|
|
LineTo(DC, Right - 2, Bottom - 2);
|
|
LineTo(DC, Right - 2, Top + 1);
|
|
DeleteObject(SelectObject(DC, APrevPen));
|
|
|
|
APrevPen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT)));
|
|
MoveToEx(DC, Left + 1, Bottom - 3, nil);
|
|
LineTo(DC, Left + 1, Top + 1);
|
|
LineTo(DC, Right - 2, Top + 1);
|
|
DeleteObject(SelectObject(DC, APrevPen));
|
|
|
|
SetPixel(DC, Right - 2, Top + 1, GetSysColor(COLOR_BTNFACE));
|
|
end;
|
|
InflateRect(R, -2, -2);
|
|
end;
|
|
// draw button's caption
|
|
DateNavigatorDrawButtonCaption(DC, R, Offset, ACaption, True);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.DateNavigatorHeaderColor: TColor;
|
|
begin
|
|
Result := clBtnFace;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SpinEditControlDrawButton(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; ARect: TRect; XSize, YSize, Size: Integer; Selected: Boolean;
|
|
AButton, AActiveButton: TdxBarSpinEditButton; AButtonPressed: Boolean);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
R := ARect;
|
|
with R do
|
|
begin
|
|
if AButton = sbUp then
|
|
Bottom := Top + Size
|
|
else
|
|
Inc(Top, Size);
|
|
FrameAndFillRect(ABarEditControl, DC, R, ABarEditControl.Enabled, Selected,
|
|
(AActiveButton = AButton) and AButtonPressed);
|
|
Inc(Left, YSize);
|
|
Top := (Top + Bottom - YSize) div 2 + Byte(AButton = sbUp) * (YSize - 1);
|
|
if (AActiveButton = AButton) and AButtonPressed then
|
|
begin
|
|
Inc(Left);
|
|
Inc(Top);
|
|
end;
|
|
if ABarEditControl.Enabled then
|
|
SpinEditControlDrawOneArrow(DC, Left, Top, XSize, YSize, COLOR_BTNTEXT, AButton)
|
|
else
|
|
begin
|
|
SpinEditControlDrawOneArrow(DC, Left + 1, Top + 1, XSize, YSize, COLOR_BTNHIGHLIGHT, AButton);
|
|
SpinEditControlDrawOneArrow(DC, Left, Top, XSize, YSize, COLOR_BTNSHADOW, AButton);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SpinEditControlDrawFrame(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect);
|
|
begin
|
|
with ARect do
|
|
begin
|
|
DrawBackground(ABarEditControl, DC, Rect(Left, Top, Left + 1, Bottom),
|
|
ABarEditControl.Parent.BkBrush, False);
|
|
DrawBackground(ABarEditControl, DC, Rect(Right - 1, Top, Right, Bottom),
|
|
ABarEditControl.Parent.BkBrush, False);
|
|
Inc(Left);
|
|
Dec(Right);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.ProgressControlBarBrushColor: TColorRef;
|
|
begin
|
|
Result := GetSysColor(COLOR_HIGHLIGHT);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.ProgressControlBarHeight(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
Result := 12;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.ProgressControlDrawBar(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; BarR: TRect; ABarBrushColor: TColorRef; PaintType: TdxBarPaintType;
|
|
ASmooth: Boolean; Position, Min, Max: Integer);
|
|
var
|
|
R: TRect;
|
|
Limit, Step: Integer;
|
|
ALeft, ARight: ^Integer;
|
|
ABarBrush: HBRUSH;
|
|
begin
|
|
R := BarR;
|
|
with R do
|
|
if PaintType = ptVert then
|
|
begin
|
|
ALeft := @Top;
|
|
ARight := @Bottom;
|
|
end
|
|
else
|
|
begin
|
|
ALeft := @Left;
|
|
ARight := @Right;
|
|
end;
|
|
ARight^ := ALeft^ + MulDiv(ARight^ - ALeft^, Position - Min, Max - Min);
|
|
Limit := ARight^;
|
|
ABarBrush := CreateSolidBrush(ABarBrushColor);
|
|
if ASmooth then
|
|
FillRect(DC, R, ABarBrush)
|
|
else
|
|
begin
|
|
with R do
|
|
if PaintType = ptVert then
|
|
Step := MulDiv(Right - Left, 2, 3)
|
|
else
|
|
Step := MulDiv(Bottom - Top, 2, 3);
|
|
repeat
|
|
ARight^ := ALeft^ + Step;
|
|
if ARight^ > Limit then ARight^ := Limit;
|
|
FillRect(DC, R, ABarBrush);
|
|
ALeft^ := ARight^;
|
|
Inc(ARight^, 2);
|
|
if ARight^ > Limit then ARight^ := Limit;
|
|
DrawBackground(ABarItemControl, DC, R, ABarItemControl.Parent.BkBrush, False);
|
|
ALeft^ := ARight^;
|
|
until ARight^ = Limit;
|
|
end;
|
|
if PaintType = ptVert then
|
|
BarR.Top := Limit
|
|
else
|
|
BarR.Left := Limit;
|
|
DrawBackground(ABarItemControl, DC, BarR, ABarItemControl.Parent.BkBrush, False);
|
|
DeleteObject(ABarBrush);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.ProgressControlIndent(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.ContainerControlSubMenuOffset: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.InPlaceSubItemControlBrush: HBRUSH;
|
|
begin
|
|
Result := GetSysColorBrush(COLOR_BTNSHADOW);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.InPlaceSubItemControlDrawInMenu(ABarContainerItemControl: TdxBarContainerItemControl;
|
|
DC: HDC; Selected, AItemExpanded: Boolean; ARect: TRect);
|
|
const
|
|
Arrows: array[Boolean] of TdxArrowType = (atRight, atDown);
|
|
var
|
|
R: TRect;
|
|
Brush: HBRUSH;
|
|
Size: Integer;
|
|
begin
|
|
R := ARect;
|
|
R.Top := R.Bottom - 1;
|
|
FillRect(DC, R, ABarContainerItemControl.Parent.BkBrush);
|
|
|
|
R.Bottom := R.Top;
|
|
R.Top := ARect.Top;
|
|
if Selected then
|
|
Brush := ABarContainerItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := InPlaceSubItemControlBrush;
|
|
FillRect(DC, R, Brush);
|
|
|
|
Inc(R.Left, 5);
|
|
DrawItemText(ABarContainerItemControl, DC, ABarContainerItemControl.Caption,
|
|
R, DT_LEFT, True, True, False, False, Selected);
|
|
|
|
if ABarContainerItemControl.Enabled then
|
|
begin
|
|
Size := ABarContainerItemControl.Parent.MenuArrowHeight;
|
|
with R do
|
|
Left := Right - ABarContainerItemControl.Parent.TextSize + Byte(not AItemExpanded) * Size;
|
|
DrawLargeItemArrow(DC, R, Arrows[AItemExpanded], Size, True, True, False{Flat});
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.EditControlUpdateWndText(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND; ANotEqual: Boolean);
|
|
begin
|
|
SendMessage(AHandle, EM_SETSEL, 0, -1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawGlyphBorder(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; PaintType: TdxBarPaintType;
|
|
IsGlyphEmpty, Selected, Down, DrawDowned, BarControlOwner, IsSplit: Boolean);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawGlyphCheckMark(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; X, Y, DoubleSize: Integer);
|
|
begin
|
|
// Required
|
|
// TODO: make default from Flat?
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawGlyphEmptyImage(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R: TRect; ABrush: HBRUSH; NeedBorder: Boolean; PaintType: TdxBarPaintType;
|
|
Selected, Down, DrawDowned: Boolean);
|
|
var
|
|
DoubleSize: Integer;
|
|
begin
|
|
if NeedBorder then InflateRect(R, -1, -1);
|
|
if not IsNativeBackground then
|
|
DrawBackground(ABarItemControl, DC, R, ABrush,
|
|
({not IgnoreGlyphOpaque and }(Down or DrawDowned or Selected)) or ABarItemControl.FNonRecent); // A1865
|
|
if NeedBorder then InflateRect(R, 1, 1);
|
|
if (PaintType = ptMenu) and Down then
|
|
with R do
|
|
begin
|
|
DoubleSize := 1 + Byte(ABarItemControl.Parent.Canvas.Font.Size >= 16);
|
|
DrawGlyphCheckMark(ABarItemControl, DC,
|
|
(Left + Right - DoubleSize * 9) div 2,
|
|
(Top + Bottom - DoubleSize * 7) div 2, DoubleSize);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawGlyphImage(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; const GlyphRect: TRect;
|
|
AGlyph: TBitmap; AImages: TCurImageList; AImageIndex: Integer;
|
|
Selected, Down, DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner: Boolean;
|
|
PaintType: TdxBarPaintType);
|
|
var
|
|
ATransparent: Boolean;
|
|
begin
|
|
if NeedBorder then InflateRect(R, -1, -1);
|
|
ATransparent := not ABarItemControl.FNonRecent and ABarItemControl.Parent.IsTransparent;
|
|
if ATransparent then
|
|
DrawBackground(ABarItemControl, DC, R, ABrush,
|
|
(not IgnoreGlyphOpaque and (Down or DrawDowned or Selected)) or ABarItemControl.FNonRecent);
|
|
TransparentDraw(DC, ABrush, R, GlyphRect,
|
|
AGlyph, AImages, AImageIndex,
|
|
ABarItemControl.GetImageEnabled(PaintType), GrayScale, False{Flat}, Selected, Down, DrawDowned,
|
|
False{Shadow}, ATransparent, GetFadedColor(ABarItemControl.Parent){Faded},
|
|
ABarItemControl.Item.BarManager.ImageListBkColor);
|
|
if NeedBorder then InflateRect(R, 1, 1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawItemArrow(DC: HDC; R: TRect;
|
|
ArrowType: TdxArrowType; Enabled, Selected, Flat: Boolean);
|
|
begin
|
|
dxBar.DrawItemArrow(DC, R, ArrowType, Enabled, Selected, Flat);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DrawLargeItemArrow(DC: HDC; R: TRect;
|
|
ArrowType: TdxArrowType; Size: Integer; Selected, Enabled, Flat: Boolean);
|
|
begin
|
|
dxBar.DrawLargeItemArrow(DC, R, ArrowType, Size, Selected, Enabled, Flat);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.GetEditColors(ABarItemControl: TdxBarItemControl;
|
|
var ATextColor, ABkColor: COLORREF);
|
|
var
|
|
ALogBrush: TLogBrush;
|
|
begin
|
|
if ABarItemControl.Enabled then
|
|
begin
|
|
ATextColor := GetSysColor(COLOR_WINDOWTEXT);
|
|
ABkColor := GetSysColor(COLOR_WINDOW);
|
|
end
|
|
else
|
|
begin
|
|
ATextColor := GetSysColor(COLOR_GRAYTEXT);
|
|
GetObject(ABarItemControl.Parent.BkBrush, SizeOf(ALogBrush), @ALogBrush);
|
|
ABkColor := ALogBrush.lbColor;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.GetFadedColor(ABarControl: TCustomdxBarControl): TColor;
|
|
begin
|
|
if ABarControl.BarManager.MakeDisabledImagesFaded then
|
|
Result := GetMiddleRGB(clBtnShadow, clWhite, 70) //clBtnFace
|
|
else
|
|
Result := clNone;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.GetTextColors(ABarItemControl: TdxBarItemControl;
|
|
AEnabled, ASelected, AFlat: Boolean; var AColor1, AColor2: TColor);
|
|
begin
|
|
if AEnabled then
|
|
begin
|
|
if ASelected and not AFlat then
|
|
AColor1 := GetSysColor(COLOR_HIGHLIGHTTEXT)
|
|
else
|
|
AColor1 := GetSysColor(COLOR_BTNTEXT);
|
|
AColor2 := AColor1;
|
|
end
|
|
else
|
|
begin
|
|
if ASelected or AFlat then
|
|
begin
|
|
AColor1 := GetSysColor(COLOR_GRAYTEXT);
|
|
AColor2 := AColor1;
|
|
end
|
|
else
|
|
begin
|
|
AColor1 := GetSysColor(COLOR_BTNHIGHLIGHT);
|
|
AColor2 := GetSysColor(COLOR_BTNSHADOW);
|
|
end;
|
|
end;
|
|
// AColor1 := clRed;
|
|
// AColor2 := AColor2;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.IgnoreGlyphOpaque: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.IgnoreNonRecentColor: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.IsMenuItem(ABarItemControl: TdxBarItemControl): Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarIsBarSmall(ABarControl: TdxBarControl;
|
|
const R: TRect): Boolean;
|
|
begin
|
|
with R do
|
|
Result := Bottom - Top <= 1 + 3 + 5 + 3 + 3 + 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarCaptionBkColor(ABarControl: TdxBarControl;
|
|
AMainFormActive: Boolean): COLORREF;
|
|
const
|
|
CaptionBkColors: array[Boolean] of Integer =
|
|
(COLOR_INACTIVECAPTION, COLOR_ACTIVECAPTION);
|
|
begin
|
|
Result := GetSysColor(CaptionBkColors[AMainFormActive]);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarCaptionColor(ABarControl: TdxBarControl): COLORREF;
|
|
begin
|
|
Result := GetSysColor(COLOR_CAPTIONTEXT);
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.BarMarkArrowColor(ABarControl: TdxBarControl;
|
|
AState: TdxBarMarkState): COLORREF;
|
|
begin
|
|
Result := GetSysColor(COLOR_CAPTIONTEXT);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawGrip(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
ABarControl.FillBackground(DC, R, AToolbarBrush, clNone, True);
|
|
// DrawFrameControl(DC, R, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
|
|
DrawSizeGrip(DC, R);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawMarkArrow(ABarControl: TdxBarControl;
|
|
DC: HDC; MarkR: TRect);
|
|
var
|
|
P: array[1..3] of TPoint;
|
|
ABrush: HBRUSH;
|
|
APen: HPEN;
|
|
begin
|
|
with MarkR, P[1] do
|
|
begin
|
|
P[1] :=
|
|
Point((Left + Right - MarkSizeArrowX) div 2,
|
|
(Top + Bottom - MarkSizeArrowY) div 2 + (Top + Bottom - MarkSizeArrowY) mod 2);
|
|
P[2] := Point(X + MarkSizeArrowX - 1, Y);
|
|
P[3] := Point(X + MarkSizeArrowX div 2, Y + MarkSizeArrowY - 1);
|
|
end;
|
|
APen := SelectObject(DC, CreatePen(PS_SOLID, 1, BarMarkArrowColor(ABarControl, ABarControl.MarkState)));
|
|
ABrush := SelectObject(DC, CreateSolidBrush(BarMarkArrowColor(ABarControl, ABarControl.MarkState)));
|
|
Polygon(DC, P, 3);
|
|
DeleteObject(SelectObject(DC, ABrush));
|
|
DeleteObject(SelectObject(DC, APen));
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawMarkAtPos(ABarControl: TdxBarControl;
|
|
DC: HDC; const ItemRect: TRect; Offset: Integer);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawMarkBackground(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
// Required
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarDrawMarkElements(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect);
|
|
begin
|
|
with ItemRect do
|
|
begin
|
|
if ABarControl.FTruncated then
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
BarDrawMarkAtPos(ABarControl, DC, ItemRect, Left + 2);
|
|
BarDrawMarkAtPos(ABarControl, DC, ItemRect, Left + 6);
|
|
end
|
|
else
|
|
begin
|
|
BarDrawMarkAtPos(ABarControl, DC, ItemRect, Bottom - MarkSizeY);
|
|
BarDrawMarkAtPos(ABarControl, DC, ItemRect, Bottom - MarkSizeY + 4);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.BarOffsetFloatingBarCaption(ABarControl: TdxBarControl;
|
|
var X: Integer; var R: TRect);
|
|
begin
|
|
X := ABarControl.MarkNCRect.Right + 3 * FloatToolbarMarkIndent;
|
|
end;
|
|
|
|
class function TdxBarItemControlPainter.GetDrawMarkElementColor(ABarControl: TdxBarControl): Integer;
|
|
begin
|
|
Result := COLOR_BTNTEXT;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.ComboControlDrawOneArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; X, Y, Size: Integer; Color: COLORREF);
|
|
var
|
|
Brush: HBRUSH;
|
|
P: array[1..3] of TPoint;
|
|
Pen: HPEN;
|
|
begin
|
|
P[1] := Point(X, Y);
|
|
P[2] := Point(X + Size - 1, Y);
|
|
P[3] := Point(X + Size div 2, Y + Size div 2);
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(Color)));
|
|
Brush := SelectObject(DC, GetSysColorBrush(Color));
|
|
Polygon(DC, P, 3);
|
|
SelectObject(DC, Brush);
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlDrawArrow(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect; UpArrow: Boolean);
|
|
var
|
|
X, Y, Size: Integer;
|
|
P: array[1..3] of TPoint;
|
|
APen: HPEN;
|
|
ABrush: HBRUSH;
|
|
Rgn: HRGN;
|
|
begin
|
|
with ABarSubMenuControl do
|
|
begin
|
|
Size := TextSize div 3 - 1;
|
|
X := (ClientWidth - BarSize) div 2;
|
|
if UpArrow then
|
|
Y := (TextSize - Size) div 2 + Size - 1
|
|
else
|
|
if MarkExists then
|
|
Y := R.Bottom - (TextSize - Size) div 2 - Size
|
|
else
|
|
Y := ClientHeight - (TextSize - Size) div 2 - Size;
|
|
P[1] := Point(X - (Size - 1), Y);
|
|
P[2] := Point(X + (Size - 1), Y);
|
|
P[3] := Point(X, Y - (2 * Byte(UpArrow) - 1) * (Size - 1));
|
|
|
|
APen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNTEXT)));
|
|
ABrush := SelectObject(DC, GetSysColorBrush(COLOR_BTNTEXT));
|
|
Polygon(DC, P, 3);
|
|
SelectObject(DC, ABrush);
|
|
DeleteObject(SelectObject(DC, APen));
|
|
|
|
if UpArrow then
|
|
begin
|
|
Dec(P[1].X);
|
|
Inc(P[1].Y);
|
|
Inc(P[2].X, 2);
|
|
Inc(P[2].Y);
|
|
Dec(P[3].Y);
|
|
end
|
|
else
|
|
begin
|
|
Inc(P[2].X);
|
|
Inc(P[3].Y);
|
|
end;
|
|
Rgn := CreatePolygonRgn(P, 3, WINDING);
|
|
ExtSelectClipRgn(DC, Rgn, RGN_DIFF);
|
|
DeleteObject(Rgn);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SubMenuControlDrawMark(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect; ASelected: Boolean);
|
|
var
|
|
APen: HPEN;
|
|
Size, X, Y, I: Integer;
|
|
|
|
procedure DrawOneMark(const Y: Integer);
|
|
begin
|
|
MoveToEx(DC, X, Y, nil);
|
|
LineTo(DC, X + Size div 2, Y + Size div 2);
|
|
LineTo(DC, X + Size + 1, Y - 1);
|
|
end;
|
|
|
|
var
|
|
AColor: COLORREF;
|
|
begin
|
|
Size := ABarSubMenuControl.MarkArrowSize;
|
|
if IsHighContrastWhite and ASelected then
|
|
AColor := GetSysColor(COLOR_BTNFACE)
|
|
else
|
|
AColor := GetSysColor(COLOR_BTNTEXT);
|
|
APen := SelectObject(DC, CreatePen(PS_SOLID, 1, AColor));
|
|
with R do
|
|
begin
|
|
X := (Left + Right - (Size + 1)) div 2;
|
|
Y := Top + (ABarSubMenuControl.MarkSize - 2 * Size) div 2;
|
|
for I := Y to Y + Size - 1 do
|
|
DrawOneMark(I + Byte(I >= Y + Size div 2) * Size div 2);
|
|
end;
|
|
DeleteObject(SelectObject(DC, APen));
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.EditOffsetInteriorRect(var R: TRect);
|
|
begin
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.SpinEditControlDrawOneArrow(DC: HDC;
|
|
X, Y, XSize, YSize, Color: Integer; AButton: TdxBarSpinEditButton);
|
|
var
|
|
P: array[1..3] of TPoint;
|
|
Pen: HPEN;
|
|
Brush: HBRUSH;
|
|
begin
|
|
P[1] := Point(X, Y);
|
|
P[2] := Point(X + XSize - 1, Y);
|
|
P[3] := Point(X + XSize div 2, Y - (2 * Byte(AButton = sbUp) - 1) * XSize div 2);
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(Color)));
|
|
Brush := SelectObject(DC, GetSysColorBrush(Color));
|
|
Polygon(DC, P, 3);
|
|
SelectObject(DC, Brush);
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
end;
|
|
|
|
class procedure TdxBarItemControlPainter.DateNavigatorDrawButtonCaption(DC: HDC; R: TRect;
|
|
Offset: Integer; const ACaption: string; AOpaque: Boolean);
|
|
var
|
|
Flags: Integer;
|
|
Size: TSize;
|
|
APrevBkMode: Integer;
|
|
begin
|
|
with R do
|
|
begin
|
|
GetTextExtentPoint32(DC, PChar(ACaption), Length(ACaption), Size);
|
|
SetTextColor(DC, GetSysColor(COLOR_BTNTEXT));
|
|
SetBkColor(DC, GetSysColor(COLOR_BTNFACE));
|
|
Flags := ETO_CLIPPED;
|
|
APrevBkMode := GetBkMode(DC);
|
|
if AOpaque then
|
|
Flags := Flags or ETO_OPAQUE
|
|
else
|
|
SetBkMode(DC, TRANSPARENT);
|
|
ExtTextOut(DC, (Left + Right - Size.cX) div 2 + Offset,
|
|
(Top + Bottom - Size.cY) div 2 + Offset, Flags, @R,
|
|
PChar(ACaption), Length(ACaption), nil);
|
|
SetBkMode(DC, APrevBkMode);
|
|
end;
|
|
end;
|
|
|
|
{ TdxBarItemControlStandardPainter }
|
|
|
|
class procedure TdxBarItemControlStandardPainter.DrawDisabledShadowRect(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
OffsetRect(R, 1, 1);
|
|
FillRect(DC, R, COLOR_BTNHIGHLIGHT + 1);
|
|
OffsetRect(R, -1, -1);
|
|
inherited DrawDisabledShadowRect(ABarItemControl, DC, R);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.DrawGlyphAndTextInSubMenu(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Selected, ShowGlyph, Down: Boolean);
|
|
var
|
|
IconRect: TRect;
|
|
IsGlyphEmpty, AOpaque: Boolean;
|
|
Brush: HBRUSH;
|
|
begin
|
|
with R do
|
|
begin
|
|
IconRect := R;
|
|
IconRect.Right := IconRect.Left + Bottom - Top;
|
|
IsGlyphEmpty := not ABarItemControl.ImageExists or not ShowGlyph;
|
|
|
|
DrawGlyph(ABarItemControl, IconRect, nil, ptMenu, IsGlyphEmpty, Selected,
|
|
Down, False, False, False, False, False);
|
|
if Selected and (IsGlyphEmpty and not Down) then
|
|
Brush := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := ABarItemControl.Parent.BkBrush;
|
|
Left := IconRect.Right + 1;
|
|
AOpaque := Selected or ABarItemControl.FNonRecent;
|
|
with IconRect do
|
|
DrawBackground(ABarItemControl, DC, Rect(Right, Top, R.Left, Bottom), Brush, AOpaque);
|
|
|
|
if Selected then
|
|
Brush := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := ABarItemControl.Parent.BkBrush;
|
|
DrawBackground(ABarItemControl, DC, R, Brush, AOpaque);
|
|
Inc(Left, 2);
|
|
DrawItemText(ABarItemControl, DC, ABarItemControl.Caption, R, DT_LEFT,
|
|
ABarItemControl.Enabled, Selected, False, False, False);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.DrawLowered(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect);
|
|
begin DrawEdge(DC, R, BDR_SUNKENOUTER, BF_RECT);
|
|
InflateRect(R, -1, -1); // LoweredBorderSize(ABarItemControl) = 1
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.FrameAndFillRect(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Enabled, Selected, Pressed: Boolean);
|
|
const
|
|
Borders: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
|
|
var
|
|
Brush: HBRUSH;
|
|
begin
|
|
Brush := ABarItemControl.Parent.BkBrush;
|
|
if Selected then
|
|
DrawEdge(DC, R, Borders[Pressed], BF_RECT)
|
|
else
|
|
FrameRect(DC, R, ABarItemControl.Parent.BkBrush);
|
|
InflateRect(R, -1, -1);
|
|
FillRect(DC, R, Brush);
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.GlyphBkgndBrush(ABarItemControl: TdxBarItemControl;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, GrayScale, BarControlOwner: Boolean): HBRUSH;
|
|
begin
|
|
if Down and ABarItemControl.Enabled then
|
|
if Selected then
|
|
Result := ABarItemControl.Parent.ToolbarDownedSelBrush
|
|
else
|
|
Result := ABarItemControl.Parent.ToolbarDownedBrush
|
|
else
|
|
if Selected and (PaintType = ptMenu) and IsGlyphEmpty and not Down then
|
|
Result := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
Result := ABarItemControl.Parent.BkBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.GlyphDownShift(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.GlyphDrawDownedShift(ABarItemControl: TdxBarItemControl;
|
|
ADown: Boolean): Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.LoweredBorderSize(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.BeforeFingersSize: Integer;
|
|
begin
|
|
Result := 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.FingersSize: Integer;
|
|
begin
|
|
Result := BeforeFingersSize + 2 * GripperSize + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.BarDrawCloseButton(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect);
|
|
const
|
|
Pushes: array[Boolean] of Integer = (0, DFCS_PUSHED);
|
|
var
|
|
ABrush: HBRUSH;
|
|
begin
|
|
ABrush := CreateSolidBrush(ABarControl.CaptionBkColor);
|
|
FrameRect(DC, R, ABrush);
|
|
DeleteObject(ABrush);
|
|
InflateRect(R, -1, -1);
|
|
DrawFrameControl(DC, R, DFC_CAPTION,
|
|
DFCS_CAPTIONCLOSE or Pushes[ABarControl.CloseButtonState = msPressed]);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.BarDrawDockedBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
|
|
procedure DrawFinger;
|
|
begin
|
|
with R do
|
|
begin
|
|
DrawEdge(DC, R, BDR_RAISEDINNER, BF_RECT);
|
|
if ABarControl.Horizontal then
|
|
SetPixel(DC, Left, Bottom - 1, GetSysColor(COLOR_BTNHIGHLIGHT))
|
|
else
|
|
SetPixel(DC, Right - 1, Top, GetSysColor(COLOR_BTNHIGHLIGHT));
|
|
InflateRect(R, -1, -1);
|
|
FillRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
|
|
InflateRect(R, 1, 1);
|
|
ExcludeClipRect(DC, Left, Top, Right, Bottom);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
with R do
|
|
begin
|
|
DrawEdge(DC, R, BDR_RAISEDINNER, BF_RECT);
|
|
InflateRect(R, -2, -2);
|
|
if ABarControl.Bar.CanMoving then
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
Inc(Left, ABarControl.BarManager.BeforeFingersSize);
|
|
Right := Left + ABarControl.PainterClass.GripperSize;
|
|
end
|
|
else
|
|
begin
|
|
Inc(Top, ABarControl.BarManager.BeforeFingersSize);
|
|
Bottom := Top + ABarControl.PainterClass.GripperSize;
|
|
end;
|
|
DrawFinger;
|
|
if ABarControl.Horizontal then
|
|
OffsetRect(R, ABarControl.PainterClass.GripperSize, 0)
|
|
else
|
|
OffsetRect(R, 0, ABarControl.PainterClass.GripperSize);
|
|
DrawFinger;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.BarDrawFloatingBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; var R, CR: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
DrawEdge(DC, R, EDGE_RAISED, BF_RECT);
|
|
InflateRect(R, -2, -2);
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
|
|
InflateRect(R, -1, -1);
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.BarDrawMDIButton(ABarControl: TdxBarControl;
|
|
AButton: TdxBarMDIButton; ASelected, APressed: Boolean; DC: HDC; R: TRect);
|
|
const
|
|
Borders: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
|
|
var
|
|
AFlat, ClipRgnExists: Boolean;
|
|
Rgn1, Rgn2: HRGN;
|
|
AFlags: Integer;
|
|
begin
|
|
AFlat :=
|
|
(AButton = mdibClose) and ABarControl.BarManager.FlatCloseButton and
|
|
ABarControl.MDIButtonsOnBar and not ABarControl.RealMDIButtonsOnBar;
|
|
Rgn1 := 0;
|
|
ClipRgnExists := False;
|
|
if AFlat then
|
|
begin
|
|
SaveClipRgn(DC, Rgn1, ClipRgnExists);
|
|
InflateRect(R, -1, -1);
|
|
Rgn2 := CreateRectRgnIndirect(R);
|
|
SelectClipRgn(DC, Rgn2);
|
|
DeleteObject(Rgn2);
|
|
InflateRect(R, 1, 1);
|
|
end;
|
|
|
|
AFlags := 0;
|
|
if not ABarControl.MDIButtonEnabled(AButton, MF_GRAYED) then
|
|
AFlags := AFlags or DFCS_INACTIVE
|
|
else
|
|
if ASelected and APressed then
|
|
AFlags := AFlags or DFCS_PUSHED;
|
|
DrawFrameControl(DC, R, DFC_CAPTION,
|
|
MDIButtonStyles[AButton] or AFlags or Byte(AFlat) * DFCS_FLAT);
|
|
|
|
if AFlat then
|
|
begin
|
|
RestoreClipRgn(DC, Rgn1, ClipRgnExists);
|
|
DrawEdge(DC, R, Borders[ASelected and APressed], BF_RECT);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.BarHorSize: Integer;
|
|
begin
|
|
Result := dxBarHorSize;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.BarMarkItemRect(ABarControl: TdxBarControl): TRect;
|
|
begin
|
|
case ABarControl.DockingStyle of
|
|
dsTop, dsBottom:
|
|
with Result do
|
|
begin
|
|
Left := ABarControl.ClientWidth - MarkSizeX;
|
|
Top := 0;
|
|
Right := Left + MarkSizeX;
|
|
Bottom := MarkSizeY;
|
|
end;
|
|
dsLeft, dsRight:
|
|
with Result do
|
|
begin
|
|
Left := ABarControl.ClientWidth - MarkSizeY;
|
|
Top := ABarControl.ClientHeight - MarkSizeX;
|
|
Right := ABarControl.ClientWidth;
|
|
Bottom := Top + MarkSizeX;
|
|
end;
|
|
else
|
|
Result := ABarControl.GetCaptionRect;
|
|
with Result do
|
|
Right := Left + 3 + 7 + 3;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.BarTopSize: Integer;
|
|
begin
|
|
Result := dxBarTopSize;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.BarBottomSize: Integer;
|
|
begin
|
|
Result := dxBarBottomSize;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.BarUseSystemClose: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.BarUseSystemNCBorder: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.SubMenuBeginGroupIndent: Integer;
|
|
begin
|
|
Result := 2;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.DrawButtonControlArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R1: TRect; Brush: HBRUSH; ArrowColor: COLORREF; Selected, DrawDowned, DroppedDown,
|
|
DropDownEnabled, IsDropDownMenuControlExist: Boolean; PaintType: TdxBarPaintType);
|
|
const
|
|
Borders: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
|
|
Enables: array[Boolean] of Integer = (DFCS_INACTIVE, 0);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
DrawBackground(ABarItemControl, DC, R1, Brush,
|
|
(not IgnoreGlyphOpaque and (DroppedDown or DrawDowned or Selected)) or ABarItemControl.FNonRecent);
|
|
if Selected then
|
|
DrawEdge(DC, R1, Borders[DroppedDown], BF_RECT)
|
|
else
|
|
if PaintType = ptMenu then
|
|
begin
|
|
R := R1;
|
|
Dec(R.Left);
|
|
R.Right := R.Left + 2;
|
|
DrawEdge(DC, R, EDGE_ETCHED, BF_LEFT or BF_RIGHT);
|
|
end;
|
|
|
|
if PaintType = ptMenu then
|
|
begin
|
|
if DroppedDown then OffsetRect(R1, 1, 1);
|
|
DrawLargeItemArrow(DC, R1, atRight, ABarItemControl.Parent.MenuArrowHeight,
|
|
False, ABarItemControl.Enabled and DropDownEnabled, False{Flat});
|
|
end
|
|
else
|
|
begin
|
|
if DroppedDown and (R1.Right - R1.Left > 9) then
|
|
OffsetRect(R1, 1, 1);
|
|
DrawItemArrow(DC, R1, atDown, ABarItemControl.Enabled and DropDownEnabled, False, False{Flat});
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.OffsetCaptionBounds(ABarButtonControl: TdxBarButtonControl;
|
|
APressed: Boolean; var R: TRect);
|
|
begin
|
|
if ABarButtonControl.Down then OffsetRect(R, 1, 1);
|
|
if APressed then OffsetRect(R, 1, 1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.OffsetEllipsisBounds(ABarItemControl: TdxBarItemControl;
|
|
APressed: Boolean; var R: TRect);
|
|
begin
|
|
if APressed then OffsetRect(R, 1, 1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.ComboControlDrawArrow(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; Selected: Boolean; PaintType: TdxBarPaintType);
|
|
const
|
|
Borders: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
|
|
var
|
|
Brush, SpaceBrush: HBRUSH;
|
|
ArrowColor: COLORREF;
|
|
X, Y, Size: Integer;
|
|
begin
|
|
with ARect do
|
|
begin
|
|
Left := Right - ABarComboControl.Parent.ComboBoxArrowWidth;
|
|
ABarComboControl.FDropDownButtonRect := ARect;
|
|
|
|
ComboControlGetArrowParams(ABarComboControl, PaintType,
|
|
ABarComboControl.Enabled, Selected, ABarComboControl.DroppedDown, Brush, ArrowColor);
|
|
|
|
if Selected and ABarComboControl.Enabled then
|
|
begin
|
|
DrawEdge(DC, ARect, Borders[ABarComboControl.DroppedDown], BF_RECT);
|
|
SpaceBrush := ABarComboControl.Parent.BkBrush;
|
|
end
|
|
else
|
|
begin
|
|
if ABarComboControl.Enabled then
|
|
SpaceBrush := GetSysColorBrush(COLOR_BTNHIGHLIGHT)
|
|
else
|
|
SpaceBrush := ABarComboControl.Parent.BkBrush;
|
|
FrameRect(DC, ARect, SpaceBrush);
|
|
end;
|
|
FillRect(DC, Rect(Left - 1, Top, Left, Bottom), SpaceBrush);
|
|
InflateRect(ARect, -1, -1);
|
|
FillRect(DC, ARect, Brush);
|
|
if ABarComboControl.DroppedDown then OffsetRect(ARect, 1, 1);
|
|
|
|
with ARect do
|
|
begin
|
|
Size := (Right - Left) div 2;
|
|
if not Odd(Size) then Inc(Size);
|
|
X := (Left + Right - Size) div 2;
|
|
Y := (Top + Bottom - Size div 2) div 2;
|
|
if ABarComboControl.Enabled then
|
|
ComboControlDrawOneArrow(ABarComboControl, DC, X, Y, Size, ArrowColor)
|
|
else
|
|
begin
|
|
ComboControlDrawOneArrow(ABarComboControl, DC, X + 1, Y + 1, Size, COLOR_BTNHIGHLIGHT);
|
|
ComboControlDrawOneArrow(ABarComboControl, DC, X, Y, Size, COLOR_BTNSHADOW);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.DropDownListBoxBorderSize: Integer;
|
|
begin
|
|
Result := 2;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.DropDownListBoxDrawBorder(ABarManager: TdxBarManager;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
DrawEdge(DC, R, EDGE_RAISED, BF_RECT);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.SubMenuControlDrawItemFrame(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AControl: TdxBarItemControl; DC: HDC; AItemRect: TRect; AIndex, LeftDelta: Integer);
|
|
const
|
|
BrushColors: array[Boolean] of COLORREF = (COLOR_BTNHIGHLIGHT, COLOR_BTNSHADOW);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
if AControl.FChangeRecentGroup then
|
|
begin
|
|
R := AItemRect;
|
|
if not AControl.FNonRecent and not IsRectEmpty(AControl.FBeginGroupRect) then
|
|
R.Top := AControl.FBeginGroupRect.Top;
|
|
with R do
|
|
begin
|
|
Bottom := Top;
|
|
Dec(Top);
|
|
Dec(Left, LeftDelta);
|
|
Inc(Right);
|
|
end;
|
|
FillRect(DC, R, BrushColors[AControl.FNonRecent] + 1);
|
|
end;
|
|
if AControl.FNonRecent then
|
|
with AItemRect do
|
|
begin
|
|
if (AIndex = 0) and not ABarSubMenuControl.Detachable then
|
|
begin
|
|
FillRect(DC, Rect(Left - LeftDelta, Top - 1, Right + 2, Top), ABarSubMenuControl.BkBrush);
|
|
SetPixel(DC, Right + 1, Top - 2, GetSysColor(COLOR_BTNHIGHLIGHT));
|
|
end;
|
|
FillRect(DC, Rect(Left - LeftDelta, Top, Left, Bottom), ABarSubMenuControl.BkBrush);
|
|
FillRect(DC, Rect(Right, Top, Right + 2, Bottom), ABarSubMenuControl.BkBrush);
|
|
if AIndex = AControl.ItemLink.Owner.VisibleItemCount - 1 then
|
|
begin
|
|
FillRect(DC, Rect(Left - LeftDelta, Bottom, Right + 2, ABarSubMenuControl.ClientHeight), ABarSubMenuControl.BkBrush);
|
|
if LeftDelta <> 0 then
|
|
SetPixel(DC, Left - 2, ABarSubMenuControl.ClientHeight - 1, GetSysColor(COLOR_BTNHIGHLIGHT));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.SubMenuControlIsOffsetRecentGroupNeeded: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.SubMenuControlMarkRectOffset(ABarSubMenuControl: TdxBarSubMenuControl): Integer;
|
|
begin
|
|
Result := inherited SubMenuControlMarkRectOffset(ABarSubMenuControl) + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.EditControlPrepareEditWnd(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND);
|
|
begin
|
|
SendMessage(AHandle, EM_SETMARGINS, EC_LEFTMARGIN or EC_RIGHTMARGIN, MakeLParam(2, 2));
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.DrawGlyphBorder(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; PaintType: TdxBarPaintType;
|
|
IsGlyphEmpty, Selected, Down, DrawDowned, BarControlOwner, IsSplit: Boolean);
|
|
const
|
|
Borders: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
|
|
begin
|
|
if Down or (Selected and ((PaintType <> ptMenu) or not IsGlyphEmpty)) then
|
|
DrawEdge(DC, R, Borders[Down or DrawDowned], BF_RECT)
|
|
else
|
|
if NeedBorder then
|
|
DrawBackgroundFrameRect(ABarItemControl, DC, R, ABrush, Selected or Down or
|
|
DrawDowned or ABarItemControl.FNonRecent);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.DrawGlyphCheckMark(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; X, Y, DoubleSize: Integer);
|
|
const
|
|
Colors: array[Boolean] of TColor = (clBlack, clWhite);
|
|
var
|
|
OffsetY, I: Integer;
|
|
|
|
procedure DrawOneMark;
|
|
begin
|
|
with ABarItemControl.Parent.Canvas do
|
|
begin
|
|
MoveTo(X + DoubleSize * 1, Y + OffsetY + DoubleSize * 2);
|
|
LineTo(X + DoubleSize * 3, Y + OffsetY + DoubleSize * 4);
|
|
LineTo(X + DoubleSize * 8, Y + OffsetY - DoubleSize * 1);
|
|
end;
|
|
Inc(OffsetY);
|
|
end;
|
|
|
|
begin
|
|
with ABarItemControl.Parent.Canvas do
|
|
if ABarItemControl.Enabled then
|
|
begin
|
|
OffsetY := 0;
|
|
Pen.Color := clSilver;
|
|
for I := 1 to DoubleSize do DrawOneMark;
|
|
Pen.Color := Colors[GetSysColor(COLOR_BTNFACE) = 0];
|
|
for I := 1 to 2 * DoubleSize do DrawOneMark;
|
|
Pen.Color := Colors[GetSysColor(COLOR_BTNFACE) <> 0];
|
|
for I := 1 to DoubleSize do DrawOneMark;
|
|
MoveTo(X + DoubleSize - 1, Y + DoubleSize * 3 - (DoubleSize - 1));
|
|
LineTo(X + DoubleSize - 1, Y + DoubleSize * 5 + (DoubleSize - 1));
|
|
MoveTo(X + DoubleSize * 8, Y - DoubleSize * 1 + 2);
|
|
LineTo(X + DoubleSize * 8, Y + DoubleSize * 3);
|
|
end
|
|
else
|
|
begin
|
|
OffsetY := 1;
|
|
Pen.Color := GetSysColor(COLOR_BTNSHADOW);
|
|
for I := 1 to 2 * DoubleSize do DrawOneMark;
|
|
Pen.Color := GetSysColor(COLOR_BTNHIGHLIGHT);
|
|
for I := 0 to DoubleSize - 1 do
|
|
begin
|
|
MoveTo(X + DoubleSize * 4 - (DoubleSize - 1),
|
|
Y + DoubleSize * 6 + (DoubleSize - 1 - I));
|
|
LineTo(X + DoubleSize * 9, Y + DoubleSize * 1 - I);
|
|
MoveTo(X + DoubleSize * 4, Y + DoubleSize * 7 - I);
|
|
LineTo(X + DoubleSize * 9, Y + DoubleSize * 2 - I);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.IgnoreGlyphOpaque: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlStandardPainter.BarIsBarSmall(ABarControl: TdxBarControl;
|
|
const R: TRect): Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.BarDrawMarkAtPos(ABarControl: TdxBarControl;
|
|
DC: HDC; const ItemRect: TRect; Offset: Integer);
|
|
var
|
|
Pen: HPEN;
|
|
X: Integer;
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT)));
|
|
X := Offset;
|
|
MoveToEx(DC, X - 1, 1, nil);
|
|
LineTo(DC, X + 2, 4);
|
|
MoveToEx(DC, X + 3, 4, nil);
|
|
LineTo(DC, X - 1, 8);
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)));
|
|
MoveToEx(DC, X, 1, nil);
|
|
LineTo(DC, X + 2, 3);
|
|
LineTo(DC, X + 2, 4);
|
|
LineTo(DC, X - 1, 7);
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
end
|
|
else
|
|
begin
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)));
|
|
X := ABarControl.ClientWidth - 8;
|
|
MoveToEx(DC, X, Offset, nil);
|
|
LineTo(DC, X + 4, Offset + 4);
|
|
MoveToEx(DC, X + 4, Offset + 1, nil);
|
|
LineTo(DC, X + 6, Offset - 1);
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT)));
|
|
MoveToEx(DC, X + 1, Offset, nil);
|
|
LineTo(DC, X + 3, Offset + 2);
|
|
LineTo(DC, X + 4, Offset + 2);
|
|
LineTo(DC, X + 7, Offset - 1);
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlStandardPainter.BarDrawMarkBackground(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
ABarControl.FillBackground(DC, ItemRect, AToolbarBrush, clNone, True);
|
|
end;
|
|
|
|
{ TdxBarItemControlEnhancedPainter }
|
|
|
|
class function TdxBarItemControlEnhancedPainter.BeforeFingersSize: Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlEnhancedPainter.FingersSize: Integer;
|
|
begin
|
|
Result := BeforeFingersSize + GripperSize + 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlEnhancedPainter.SubMenuBeginGroupIndent: Integer;
|
|
begin
|
|
Result := 12;
|
|
end;
|
|
|
|
class function TdxBarItemControlEnhancedPainter.BarAllowQuickCustomizing: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlEnhancedPainter.BarDrawDockedBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
|
|
procedure DrawFinger;
|
|
begin
|
|
with R do
|
|
begin
|
|
DrawEdge(DC, R, BDR_RAISEDINNER, BF_RECT);
|
|
InflateRect(R, -1, -1);
|
|
FillRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
|
|
InflateRect(R, 1, 1);
|
|
ExcludeClipRect(DC, Left, Top, Right, Bottom);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
with R do
|
|
begin
|
|
DrawEdge(DC, R, BDR_RAISEDINNER, BF_RECT);
|
|
InflateRect(R, -2, -2);
|
|
if ABarControl.Bar.CanMoving then
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
Inc(Left, ABarControl.BarManager.BeforeFingersSize);
|
|
Right := Left + ABarControl.PainterClass.GripperSize;
|
|
InflateRect(R, 0, -1);
|
|
end
|
|
else
|
|
begin
|
|
Inc(Top, ABarControl.BarManager.BeforeFingersSize);
|
|
Bottom := Top + ABarControl.PainterClass.GripperSize;
|
|
InflateRect(R, -1, 0);
|
|
end;
|
|
DrawFinger;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlEnhancedPainter.BarMarkItemRect(ABarControl: TdxBarControl): TRect;
|
|
begin
|
|
case ABarControl.DockingStyle of
|
|
dsTop, dsBottom:
|
|
with Result do
|
|
begin
|
|
Left := ABarControl.ClientWidth - MarkSizeX;
|
|
Top := 0;
|
|
Right := Left + MarkSizeX;
|
|
Bottom := ABarControl.ClientHeight;
|
|
end;
|
|
dsLeft, dsRight:
|
|
with Result do
|
|
begin
|
|
Left := 0;
|
|
Top := ABarControl.ClientHeight - MarkSizeX;
|
|
Right := ABarControl.ClientWidth;
|
|
Bottom := Top + MarkSizeX;
|
|
end;
|
|
else
|
|
Result := ABarControl.GetCaptionRect;
|
|
with Result do
|
|
Right := Left + 3 + 7 + 3;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlEnhancedPainter.BarDrawMarkAtPos(ABarControl: TdxBarControl;
|
|
DC: HDC; const ItemRect: TRect; Offset: Integer);
|
|
var
|
|
Pen: HPEN;
|
|
X, Y: Integer;
|
|
begin
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNTEXT)));
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
X := Offset;
|
|
Y := 4 - Byte(BarIsBarSmall(ABarControl, ItemRect));
|
|
MoveToEx(DC, X, Y, nil);
|
|
LineTo(DC, X + 2, Y + 2);
|
|
LineTo(DC, X - 1, Y + 5);
|
|
MoveToEx(DC, X + 1, Y, nil);
|
|
LineTo(DC, X + 3, Y + 2);
|
|
LineTo(DC, X, Y + 5);
|
|
end
|
|
else
|
|
begin
|
|
X := ABarControl.ClientWidth - 8;
|
|
MoveToEx(DC, X, Offset, nil);
|
|
LineTo(DC, X + 2, Offset + 2);
|
|
LineTo(DC, X + 5, Offset - 1);
|
|
MoveToEx(DC, X, Offset + 1, nil);
|
|
LineTo(DC, X + 2, Offset + 3);
|
|
LineTo(DC, X + 5, Offset);
|
|
end;
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
end;
|
|
|
|
class procedure TdxBarItemControlEnhancedPainter.BarDrawMarkBackground(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH);
|
|
const
|
|
MarkEdges: array[msSelected..msPressed] of UINT = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
|
|
begin
|
|
if ABarControl.MarkState = msNone then
|
|
FrameRect(DC, ItemRect, AToolbarBrush)
|
|
else
|
|
DrawEdge(DC, ItemRect, MarkEdges[ABarControl.MarkState], BF_RECT);
|
|
InflateRect(ItemRect, -1, -1);
|
|
ABarControl.FillBackground(DC, ItemRect, AToolbarBrush, clNone, True);
|
|
InflateRect(ItemRect, 1, 1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlEnhancedPainter.BarDrawMarkElements(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect);
|
|
|
|
procedure DrawArrow(X, Y: Integer; Vertical: Boolean);
|
|
var
|
|
P: array[1..3] of TPoint;
|
|
Pen: HPEN;
|
|
Brush: HBRUSH;
|
|
AColor: Integer;
|
|
begin
|
|
if Vertical then
|
|
begin
|
|
P[1] := Point(X, Y);
|
|
P[2] := Point(X, Y + 4);
|
|
P[3] := Point(X - 2, Y + 2);
|
|
end
|
|
else
|
|
begin
|
|
P[1] := Point(X, Y);
|
|
P[2] := Point(X + 4, Y);
|
|
P[3] := Point(X + 2, Y + 2);
|
|
end;
|
|
AColor := ABarControl.PainterClass.GetDrawMarkElementColor(ABarControl);
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, GetSysColor(AColor)));
|
|
Brush := SelectObject(DC, GetSysColorBrush(AColor));
|
|
Polygon(DC, P, 3);
|
|
SelectObject(DC, Brush);
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
end;
|
|
|
|
begin
|
|
with ItemRect do
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
DrawArrow(Left + 3, Bottom - 7 + Byte(BarIsBarSmall(ABarControl, ItemRect)), False)
|
|
else
|
|
DrawArrow(Left + 5, Top + 3, True);
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
{ TdxBarItemControlFlatPainter }
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DrawGlyphAndTextInSubMenu(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Selected, ShowGlyph, Down: Boolean);
|
|
var
|
|
I: Integer;
|
|
IconRect: TRect;
|
|
IsGlyphEmpty, AOpaque: Boolean;
|
|
Brush: HBRUSH;
|
|
begin
|
|
with R do
|
|
begin
|
|
AOpaque := Selected or ABarItemControl.FNonRecent;
|
|
if Selected then
|
|
FrameFlatSelRect(DC, R)
|
|
else
|
|
begin
|
|
I := Left + Bottom - Top + 1;
|
|
|
|
DrawBackground(ABarItemControl, DC, Rect(Left, Top, I, Top + 1), ABarItemControl.BarManager.FlatToolbarsBrush, AOpaque);
|
|
DrawBackground(ABarItemControl, DC, Rect(Left, Bottom - 1, I, Bottom), ABarItemControl.BarManager.FlatToolbarsBrush, AOpaque);
|
|
DrawBackground(ABarItemControl, DC, Rect(Left, Top + 1, Left + 1, Bottom - 1), ABarItemControl.BarManager.FlatToolbarsBrush, AOpaque);
|
|
|
|
DrawBackground(ABarItemControl, DC, Rect(I, Top, Right, Top + 1), ABarItemControl.Parent.BkBrush, AOpaque);
|
|
DrawBackground(ABarItemControl, DC, Rect(I, Bottom - 1, Right, Bottom), ABarItemControl.Parent.BkBrush, AOpaque);
|
|
DrawBackground(ABarItemControl, DC, Rect(Right - 1, Top + 1, Right, Bottom - 1), ABarItemControl.Parent.BkBrush, AOpaque);
|
|
end;
|
|
InflateRect(R, -1, -1);
|
|
IconRect := R;
|
|
IconRect.Right := IconRect.Left + Bottom - Top;
|
|
IsGlyphEmpty := not ABarItemControl.ImageExists or not ShowGlyph;
|
|
|
|
DrawGlyph(ABarItemControl, IconRect, nil, ptMenu, IsGlyphEmpty, Selected,
|
|
Down, False, False, False, False, False);
|
|
if Selected then
|
|
Brush := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := ABarItemControl.BarManager.FlatToolbarsBrush;
|
|
Left := IconRect.Right + 2;
|
|
with IconRect do
|
|
DrawBackground(ABarItemControl, DC, Rect(Right, Top, R.Left, Bottom), Brush, AOpaque);
|
|
|
|
if Selected then
|
|
Brush := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := ABarItemControl.Parent.BkBrush;
|
|
DrawBackground(ABarItemControl, DC, R, Brush, AOpaque);
|
|
Inc(Left, 8);
|
|
DrawItemText(ABarItemControl, DC, ABarItemControl.Caption, R, DT_LEFT,
|
|
ABarItemControl.Enabled, Selected, False, False, not IsHighContrastWhite);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DrawLowered(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect);
|
|
begin
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_BTNSHADOW));
|
|
InflateRect(R, -1, -1); // LoweredBorderSize(ABarItemControl) = 1
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DrawStaticBorder(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var ARect: TRect; ABorderWidth: Integer; ABorderStyle: TdxBarStaticBorderStyle);
|
|
var
|
|
I: Integer;
|
|
ABrush: HBRUSH;
|
|
begin
|
|
ABrush := StaticBorderBrush(ABarItemControl, ABorderStyle);
|
|
for I := 1 to ABorderWidth do
|
|
begin
|
|
FrameRect(DC, ARect, ABrush);
|
|
InflateRect(ARect, -1, -1);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.FrameAndFillRect(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Enabled, Selected, Pressed: Boolean);
|
|
var
|
|
Brush: HBRUSH;
|
|
begin
|
|
Brush := ABarItemControl.Parent.BkBrush;
|
|
if Selected then
|
|
begin
|
|
FrameFlatSelRect(DC, R);
|
|
if Pressed then
|
|
Brush := ABarItemControl.Parent.ToolbarDownedSelBrush
|
|
else
|
|
Brush := ABarItemControl.Parent.ToolbarSelBrush;
|
|
end
|
|
else
|
|
FrameRect(DC, R, ABarItemControl.Parent.BkBrush);
|
|
InflateRect(R, -1, -1);
|
|
FillRect(DC, R, Brush);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.GetArrowParams(ABarItemControl: TdxBarItemControl;
|
|
APaintType: TdxBarPaintType; AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH;
|
|
var AArrowColor: COLORREF);
|
|
begin
|
|
AArrowColor := COLOR_BTNTEXT;
|
|
if ASelected then
|
|
if ADroppedDown or IsHighContrastWhite then
|
|
begin
|
|
ABrush := ABarItemControl.Parent.ToolbarDownedSelBrush;
|
|
AArrowColor := COLOR_HIGHLIGHTTEXT;
|
|
end
|
|
else
|
|
ABrush := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
ABrush := ABarItemControl.Parent.BkBrush
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.GlyphBkgndBrush(ABarItemControl: TdxBarItemControl;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, GrayScale, BarControlOwner: Boolean): HBRUSH;
|
|
begin
|
|
if Selected then
|
|
if Down or DrawDowned then
|
|
if Down and BarControlOwner then
|
|
Result := ABarItemControl.Parent.BarControlOwnerBrush
|
|
else
|
|
Result := ABarItemControl.Parent.ToolbarDownedSelBrush
|
|
else
|
|
Result := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
if Down then
|
|
Result := ABarItemControl.Parent.ToolbarDownedBrush
|
|
else
|
|
if (PaintType = ptMenu) and not ForceUseBkBrush then
|
|
Result := ABarItemControl.BarManager.FlatToolbarsBrush
|
|
else
|
|
Result := ABarItemControl.Parent.BkBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.IsFlatItemText: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.LoweredBorderSize(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.StaticBorderBrush(ABarItemControl: TdxBarItemControl;
|
|
ABorderStyle: TdxBarStaticBorderStyle): HBRUSH;
|
|
begin
|
|
Result := GetSysColorBrush(COLOR_BTNSHADOW);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.TextAreaOffset(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
// WARNING!!! sync with Indent
|
|
if ABarItemControl.Parent is TdxBarSubMenuControl then
|
|
Result := 1 + ABarItemControl.Parent.TextSize + 2
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BeforeFingersSize: Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.FingersSize: Integer;
|
|
begin
|
|
Result := BeforeFingersSize + GripperSize + 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.RealButtonArrowWidth(ABarManager: TdxBarManager): Integer;
|
|
begin
|
|
Result := inherited RealButtonArrowWidth(ABarManager);
|
|
Dec(Result);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.RealLargeButtonArrowWidth(ABarManager: TdxBarManager): Integer;
|
|
begin
|
|
Result := inherited RealLargeButtonArrowWidth(ABarManager) - 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.SubMenuBeginGroupIndent: Integer;
|
|
begin
|
|
Result := 8;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarChildrenHaveShadows(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawBarControlOwner(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R: TRect; ABarControl: TCustomdxBarControl);
|
|
begin
|
|
BarDrawBarControlOwnerBorder(ACustomBarControl, DC, R, nil, ABarControl);
|
|
InflateRect(R, -1, -1);
|
|
FillRect(DC, R, ACustomBarControl.BarControlOwnerBrush);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawBarControlOwnerBorder(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R: TRect; ABarItemControl: TdxBarItemControl; ABarControl: TCustomdxBarControl);
|
|
|
|
procedure DrawBarControlOwnerLink;
|
|
var
|
|
ALinkR, ATempRect, CR, WR: TRect;
|
|
AOrigin: TPoint;
|
|
AHandle: HWND;
|
|
begin
|
|
ALinkR := ABarControl.OwnerLinkBounds[True];
|
|
|
|
if ABarControl.OwnerControl = nil then // !!!
|
|
begin
|
|
GetDCOrgEx(DC, AOrigin);
|
|
OffsetRect(ALinkR, -AOrigin.X, -AOrigin.Y);
|
|
end
|
|
else
|
|
begin
|
|
AHandle := ABarControl.OwnerControl.Handle;
|
|
GetClientRect(AHandle, CR);
|
|
MapWindowPoints(AHandle, 0, CR, 2);
|
|
if IntersectRect(ATempRect, CR, ALinkR) then // client area
|
|
OffsetRect(ALinkR, -CR.Left, -CR.Top)
|
|
else
|
|
begin
|
|
GetWindowRect(AHandle, WR); // NC
|
|
OffsetRect(ALinkR, -WR.Left, -WR.Top);
|
|
end;
|
|
end;
|
|
BarDrawBarControlOwnerLink(ACustomBarControl, DC, R, ALinkR, ABarItemControl);
|
|
|
|
with ALinkR do
|
|
ExcludeClipRect(DC, Left, Top, Right, Bottom);
|
|
end;
|
|
|
|
var
|
|
AClipRgn: HRGN;
|
|
AClipRgnExists: Boolean;
|
|
begin
|
|
AClipRgn := 0;
|
|
if ABarControl.HandleAllocated then
|
|
begin
|
|
SaveClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
DrawBarControlOwnerLink;
|
|
end;
|
|
BarDrawBarControlOwnerFrame(ACustomBarControl, DC, R);
|
|
if AClipRgn <> 0 then
|
|
RestoreClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawBarControlOwnerFrame(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
FrameRect(DC, R, ACustomBarControl.BarManager.FlatToolbarsBorderBrush);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawBarControlOwnerLink(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R, ALinkR: TRect; ABarItemControl: TdxBarItemControl);
|
|
begin
|
|
FillRect(DC, ALinkR, ACustomBarControl.BarControlOwnerBrush);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarHasShadow(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := ABarControl.DockingStyle = dsNone;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarToolbarBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := ABarControl.BarManager.FlatToolbarsBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarToolbarBrushEx(ABarControl: TdxBarControl): HBRUSH;
|
|
begin
|
|
if not (ABarControl.Bar.IsMainMenu or ABarControl.Bar.IsStatusBar) then
|
|
Result := inherited BarToolbarBrushEx(ABarControl)
|
|
else
|
|
Result := GetSysColorBrush(COLOR_BTNFACE);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarToolbarDownedBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := ABarControl.BarManager.FlatToolbarsDownedBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarToolbarDownedSelBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := ABarControl.BarManager.FlatToolbarsDownedSelBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarToolbarSelBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := ABarControl.BarManager.FlatToolbarsSelBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.EditBorderSize(DC: HDC): Integer;
|
|
begin
|
|
Result := (1 + 2) * 2 + 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarAllowHotTrack: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarAllowQuickCustomizing: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarBeginGroupSideSize: Integer;
|
|
begin
|
|
Result := (BarBeginGroupSize - 1{|}) div 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarBeginGroupSize: Integer;
|
|
begin
|
|
Result := 2 + 1{|} + 2;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawBeginGroup(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH; AHorz: Boolean);
|
|
begin
|
|
with ItemRect do
|
|
if AHorz then
|
|
begin
|
|
ABarControl.FillBackground(DC,
|
|
Rect(Left, Top, Right, Top + BarBeginGroupSideSize),
|
|
AToolbarBrush, clNone, True);
|
|
ABarControl.FillBackground(DC,
|
|
Rect(Left, Bottom - BarBeginGroupSideSize, Right, Bottom),
|
|
AToolbarBrush, clNone, True);
|
|
InflateRect(ItemRect, 0, -BarBeginGroupSideSize);
|
|
FillRect(DC, Rect(Left, Top, Right, Top + 1), COLOR_BTNSHADOW + 1);
|
|
end
|
|
else
|
|
begin
|
|
ABarControl.FillBackground(DC,
|
|
Rect(Left, Top, Left + BarBeginGroupSideSize, Bottom),
|
|
AToolbarBrush, clNone, True);
|
|
ABarControl.FillBackground(DC,
|
|
Rect(Right - BarBeginGroupSideSize, Top, Right, Bottom),
|
|
AToolbarBrush, clNone, True);
|
|
InflateRect(ItemRect, -BarBeginGroupSideSize, 0);
|
|
FillRect(DC, Rect(Left, Top, Left + 1, Bottom), COLOR_BTNSHADOW + 1);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawCloseButton(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect);
|
|
|
|
procedure DrawCross(var R: TRect);
|
|
// const
|
|
// CrossColors: array[Boolean] of Integer = (COLOR_CAPTIONTEXT, COLOR_BTNTEXT);
|
|
var
|
|
APen: HPEN;
|
|
begin
|
|
InflateRect(R, -3, -4);
|
|
with R do
|
|
begin
|
|
if Odd(Right - Left) then Dec(Right);
|
|
Bottom := Top + (Right - Left - 1);
|
|
end;
|
|
with R do
|
|
begin
|
|
// APen := SelectObject(DC, CreatePen(PS_SOLID, 1,
|
|
// GetSysColor(CrossColors[ABarControl.CloseButtonState = msSelected])));
|
|
APen := SelectObject(DC, CreatePen(PS_SOLID, 1,
|
|
BarMarkArrowColor(ABarControl, ABarControl.CloseButtonState)));
|
|
|
|
MoveToEx(DC, Left, Top, nil);
|
|
LineTo(DC, Right - 1, Bottom);
|
|
MoveToEx(DC, Left + 1, Top, nil);
|
|
LineTo(DC, Right, Bottom);
|
|
|
|
MoveToEx(DC, Left, Bottom - 1, nil);
|
|
LineTo(DC, Right - 1, Top - 1);
|
|
MoveToEx(DC, Left + 1, Bottom - 1, nil);
|
|
LineTo(DC, Right, Top - 1);
|
|
|
|
DeleteObject(SelectObject(DC, APen));
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
BarDrawCaptionElement(ABarControl, DC, R, ABarControl.CloseButtonState);
|
|
DrawCross(R);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawDockedBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
|
|
procedure DrawFinger;
|
|
var
|
|
I: Integer;
|
|
Brush: HBRUSH;
|
|
begin
|
|
with R do
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
for I := Top to Bottom - 1 do
|
|
begin
|
|
if Odd(I - Top) then
|
|
Brush := AToolbarBrush
|
|
else
|
|
Brush := COLOR_BTNSHADOW + 1;
|
|
FillRect(DC, Rect(Left, I, Right, I + 1), Brush);
|
|
end
|
|
else
|
|
for I := Left to Right - 1 do
|
|
begin
|
|
if Odd(I - Left) then
|
|
Brush := AToolbarBrush
|
|
else
|
|
Brush := COLOR_BTNSHADOW + 1;
|
|
FillRect(DC, Rect(I, Top, I + 1, Bottom), Brush);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
with R do
|
|
begin
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
|
|
InflateRect(R, -1, -1);
|
|
FillRect(DC, Rect(Left, Top, Left + 1, Top + 1), COLOR_BTNFACE + 1);
|
|
FillRect(DC, Rect(Right - 1, Top, Right, Top + 1), COLOR_BTNFACE + 1);
|
|
FillRect(DC, Rect(Left, Bottom - 1, Left + 1, Bottom), COLOR_BTNFACE + 1);
|
|
FillRect(DC, Rect(Right - 1, Bottom - 1, Right, Bottom), COLOR_BTNFACE + 1);
|
|
InflateRect(R, -1, -1);
|
|
if ABarControl.Bar.CanMoving then
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
Inc(Left, ABarControl.BarManager.BeforeFingersSize);
|
|
Right := Left + ABarControl.PainterClass.GripperSize;
|
|
InflateRect(R, 0, -3);
|
|
end
|
|
else
|
|
begin
|
|
Inc(Top, ABarControl.BarManager.BeforeFingersSize);
|
|
Bottom := Top + ABarControl.PainterClass.GripperSize;
|
|
InflateRect(R, -3, 0);
|
|
end;
|
|
DrawFinger;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawFloatingBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; var R, CR: TRect; AToolbarBrush: HBRUSH);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
FrameRect(DC, R, ABarControl.BarManager.FlatToolbarsBorderBrush);
|
|
InflateRect(R, -1, -1);
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_BTNHIGHLIGHT));
|
|
for I := R.Left + 1 to CR.Left - 1 do
|
|
begin
|
|
InflateRect(R, -1, -1);
|
|
FrameRect(DC, R, AToolbarBrush);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawMark(ABarControl: TdxBarControl;
|
|
DC: HDC; MarkR: TRect);
|
|
|
|
procedure DrawBackground;
|
|
var
|
|
R: TRect;
|
|
ABrush: HBRUSH;
|
|
begin
|
|
if ABarControl.Bar.CanClose then
|
|
begin
|
|
R := MarkR;
|
|
with R do
|
|
begin
|
|
Left := Right;
|
|
Right := Left + FloatToolbarMarkIndent;
|
|
end;
|
|
ABrush := CreateSolidBrush(ABarControl.CaptionBkColor);
|
|
FillRect(DC, R, ABrush);
|
|
DeleteObject(ABrush);
|
|
end;
|
|
if ABarControl.MarkState = msPressed then
|
|
BarDrawBarControlOwner(ABarControl, DC, MarkR, ABarControl.FQuickPopup)
|
|
else
|
|
BarDrawCaptionElement(ABarControl, DC, MarkR, ABarControl.MarkState);
|
|
end;
|
|
|
|
begin
|
|
DrawBackground;
|
|
inherited BarDrawMark(ABarControl, DC, MarkR);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawMDIButton(ABarControl: TdxBarControl;
|
|
AButton: TdxBarMDIButton; ASelected, APressed: Boolean; DC: HDC; R: TRect);
|
|
const
|
|
Enables: array[Boolean] of Integer = (DFCS_INACTIVE, 0);
|
|
var
|
|
ABitmap: TBitmap;
|
|
ABrush: HBRUSH;
|
|
begin
|
|
ABitmap := TBitmap.Create;
|
|
try
|
|
InflateRect(R, -1, -1);
|
|
ABitmap.Width := R.Right - R.Left;
|
|
ABitmap.Height := R.Bottom - R.Top;
|
|
DrawFrameControl(ABitmap.Canvas.Handle,
|
|
Rect(-1, -1, ABitmap.Width + 1, ABitmap.Height + 1),
|
|
DFC_CAPTION, MDIButtonStyles[AButton] or DFCS_FLAT or
|
|
Enables[ABarControl.MDIButtonEnabled(AButton, MF_GRAYED)]);
|
|
|
|
if not ASelected and not APressed then
|
|
begin
|
|
InflateRect(R, 1, 1);
|
|
ABarControl.FillBackground(DC, R, ABarControl.BkBrush, clNone, True);
|
|
InflateRect(R, -1, -1);
|
|
end
|
|
else
|
|
begin
|
|
if APressed then
|
|
begin
|
|
if ASelected then
|
|
ABrush := ABarControl.ToolbarDownedSelBrush
|
|
else
|
|
ABrush := ABarControl.ToolbarDownedBrush;
|
|
end
|
|
else
|
|
if ASelected then
|
|
ABrush := ABarControl.ToolbarSelBrush
|
|
else
|
|
ABrush := ABarControl.ToolbarBrush;
|
|
FillRect(DC, R, ABrush);
|
|
end;
|
|
|
|
TransparentDraw(DC, ABarControl.BkBrush, R, R, ABitmap, nil, -1, True, False,
|
|
False{Flat}, False, False, False, False{Shadow}, True{Transparent}, clNone{Faded}, clNone);
|
|
|
|
if ASelected or APressed then
|
|
begin
|
|
InflateRect(R, 1, 1);
|
|
FrameFlatSelRect(DC, R);
|
|
end;
|
|
finally
|
|
ABitmap.Free;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarMarkItemRect(ABarControl: TdxBarControl): TRect;
|
|
begin
|
|
case ABarControl.DockingStyle of
|
|
dsTop, dsBottom:
|
|
with Result do
|
|
begin
|
|
Left := ABarControl.ClientWidth - MarkSizeX;
|
|
Top := 0;
|
|
Right := Left + MarkSizeX;
|
|
Bottom := ABarControl.ClientHeight;
|
|
end;
|
|
dsLeft, dsRight:
|
|
with Result do
|
|
begin
|
|
Left := 0;
|
|
Top := ABarControl.ClientHeight - MarkSizeX;
|
|
Right := ABarControl.ClientWidth;
|
|
Bottom := Top + MarkSizeX;
|
|
end;
|
|
else
|
|
Result := ABarControl.GetCaptionRect;
|
|
with Result do
|
|
begin
|
|
Left := Right - (Bottom - Top);
|
|
if ABarControl.Bar.CanClose then
|
|
with ABarControl.CloseButtonRect do
|
|
OffsetRect(Result, -(Right - Left + FloatToolbarMarkIndent), 0);
|
|
with ABarControl.GetCaptionRect do
|
|
if Result.Left < Left{ - 3} then
|
|
Result.Left := Left{ - 3};
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarToolbarBrushEx2(ABarControl: TdxBarControl): HBRUSH;
|
|
begin
|
|
Result := GetSysColorBrush(COLOR_WINDOW);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DrawQuickCustItemFrame(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R, ARect: TRect; Selected: Boolean);
|
|
begin
|
|
with R do
|
|
begin
|
|
if not Selected then
|
|
DrawBackgroundFrameRect(ABarItemControl, DC,
|
|
Rect(Left, Top, Left + (Bottom - Top), Bottom),
|
|
ABarItemControl.BarManager.FlatToolbarsBrush, False);
|
|
InflateRect(R, -1, -1);
|
|
// inherited?
|
|
Right := Left + Bottom - Top;
|
|
end;
|
|
ARect.Left := R.Right + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DrawQuickCustItemFrameSelected(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; WholeR, R: TRect; Selected: Boolean);
|
|
begin
|
|
if Selected then
|
|
begin
|
|
FrameFlatSelRect(DC, WholeR);
|
|
with R do
|
|
begin
|
|
Left := Right;
|
|
Right := Left + 2; // paint over!
|
|
end;
|
|
FillRect(DC, R, ABarItemControl.Parent.ToolbarSelBrush);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.IsQuickControlPopupOnRight: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.CorrectButtonControlDefaultHeight(var DefaultHeight: Integer);
|
|
begin
|
|
Inc(DefaultHeight, 2);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.CorrectButtonControlDefaultWidth(ABarItemControl: TdxBarItemControl;
|
|
var DefaultWidth: Integer);
|
|
begin
|
|
Inc(DefaultWidth, 2 + 1 + 6);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DrawButtonControlArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R1: TRect; Brush: HBRUSH; ArrowColor: COLORREF; Selected, DrawDowned, DroppedDown,
|
|
DropDownEnabled, IsDropDownMenuControlExist: Boolean; PaintType: TdxBarPaintType);
|
|
begin
|
|
if PaintType <> ptMenu then Dec(R1.Left);
|
|
if (PaintType = ptMenu) or
|
|
not (DroppedDown and IsDropDownMenuControlExist) {not DroppedDownFlat} then
|
|
begin
|
|
if (PaintType = ptMenu) or Selected then
|
|
if Selected then
|
|
FrameFlatSelRect(DC, R1)
|
|
else
|
|
FrameRect(DC, R1, GetSysColorBrush(COLOR_BTNSHADOW))
|
|
else
|
|
FrameRect(DC, R1, ABarItemControl.Parent.BkBrush);
|
|
InflateRect(R1, -1, -1);
|
|
DrawBackground(ABarItemControl, DC, R1, Brush, DroppedDown or DrawDowned or Selected or ABarItemControl.FNonRecent);
|
|
InflateRect(R1, 1, 1);
|
|
end;
|
|
|
|
if PaintType = ptMenu then
|
|
DrawLargeItemArrow(DC, R1, atRight, ABarItemControl.Parent.MenuArrowHeight,
|
|
(IsHighContrastWhite and Selected) or DroppedDown, ABarItemControl.Enabled and DropDownEnabled, True{Flat})
|
|
else
|
|
DrawItemArrow(DC, R1, atDown, ABarItemControl.Enabled and DropDownEnabled,
|
|
Selected and not DroppedDown and IsHighContrastWhite, True{Flat});
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.IsDropDownRepaintNeeded: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.ComboControlDrawArrow(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; Selected: Boolean; PaintType: TdxBarPaintType);
|
|
const
|
|
Borders: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
|
|
var
|
|
Brush, SpaceBrush: HBRUSH;
|
|
ArrowColor: COLORREF;
|
|
X, Y, Size: Integer;
|
|
begin
|
|
with ARect do
|
|
begin
|
|
Left := Right - ABarComboControl.Parent.ComboBoxArrowWidth;
|
|
ABarComboControl.FDropDownButtonRect := ARect;
|
|
|
|
ComboControlGetArrowParams(ABarComboControl, PaintType, ABarComboControl.Enabled, Selected,
|
|
ABarComboControl.DroppedDown, Brush, ArrowColor);
|
|
|
|
if Selected then
|
|
begin
|
|
InflateRect(ARect, 1, 1);
|
|
FrameFlatSelRect(DC, ARect);
|
|
InflateRect(ARect, -1, -1);
|
|
FillRect(DC, ARect, Brush);
|
|
end
|
|
else
|
|
begin
|
|
if Selected and ABarComboControl.Enabled then
|
|
begin
|
|
DrawEdge(DC, ARect, Borders[ABarComboControl.DroppedDown], BF_RECT);
|
|
SpaceBrush := ABarComboControl.Parent.BkBrush;
|
|
end
|
|
else
|
|
begin
|
|
if ABarComboControl.Enabled then
|
|
SpaceBrush := GetSysColorBrush(COLOR_BTNHIGHLIGHT)
|
|
else
|
|
SpaceBrush := ABarComboControl.Parent.BkBrush;
|
|
FrameRect(DC, ARect, SpaceBrush);
|
|
end;
|
|
FillRect(DC, Rect(Left - 1, Top, Left, Bottom), SpaceBrush);
|
|
InflateRect(ARect, -1, -1);
|
|
FillRect(DC, ARect, Brush);
|
|
if ABarComboControl.DroppedDown then OffsetRect(ARect, 1, 1);
|
|
end;
|
|
|
|
with ARect do
|
|
begin
|
|
Size := (Right - Left) div 2;
|
|
if not Odd(Size) then Inc(Size);
|
|
X := (Left + Right - Size) div 2;
|
|
Y := (Top + Bottom - Size div 2) div 2;
|
|
ComboControlDrawOneArrow(ABarComboControl, DC, X, Y, Size, ArrowColor);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.ComboControlGetArrowParams(ABarItemControl: TdxBarItemControl;
|
|
APaintType: TdxBarPaintType; AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH;
|
|
var AArrowColor: COLORREF);
|
|
begin
|
|
inherited;
|
|
if (APaintType = ptMenu) and not ASelected then
|
|
ABrush := ABarItemControl.Parent.ToolbarBrush;
|
|
if not AEnabled then
|
|
AArrowColor := COLOR_BTNSHADOW;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.DropDownListBoxBorderSize: Integer;
|
|
begin
|
|
Result := 2;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DropDownListBoxDrawBorder(ABarManager: TdxBarManager;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_BTNSHADOW));
|
|
InflateRect(R, -1, -1);
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_WINDOW));
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.SubItemControlCaptionOffset(ABarSubItemControl: TdxBarSubItemControl): Integer;
|
|
begin
|
|
if (ABarSubItemControl.Parent as TdxBarControl).Bar.IsMainMenu then
|
|
Result := 8
|
|
else
|
|
Result := inherited SubItemControlCaptionOffset(ABarSubItemControl);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.SubItemControlDefaultHeight(ABarSubItemControl: TdxBarSubItemControl): Integer;
|
|
begin
|
|
Result := inherited SubItemControlDefaultHeight(ABarSubItemControl);
|
|
if not (ABarSubItemControl.Parent is TdxBarControl) then
|
|
Inc(Result, 2);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.SubItemControlDefaultWidth(ABarSubItemControl: TdxBarSubItemControl): Integer;
|
|
begin
|
|
Result := inherited SubItemControlDefaultWidth(ABarSubItemControl);
|
|
if ABarSubItemControl.Parent is TdxBarSubMenuControl then
|
|
Inc(Result, 2 + 1 + 6);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubItemControlDraw(ABarSubItemControl: TdxBarSubItemControl;
|
|
DC: HDC; R: TRect; Selected, Down: Boolean; PaintType: TdxBarPaintType);
|
|
|
|
procedure DrawArrow;
|
|
var
|
|
Size: Integer;
|
|
begin
|
|
if PaintType = ptMenu then
|
|
Size := ABarSubItemControl.Parent.MenuArrowHeight
|
|
else
|
|
Size := ABarSubItemControl.Parent.MenuArrowHeight - 1;
|
|
with R do
|
|
case PaintType of
|
|
ptMenu:
|
|
begin
|
|
Left := Right - ABarSubItemControl.Parent.TextSize + Size;
|
|
DrawLargeItemArrow(DC, R, atRight, Size, Selected and IsHighContrastWhite,
|
|
ABarSubItemControl.Enabled, True{Flat});
|
|
end;
|
|
ptHorz:
|
|
begin
|
|
Left := Right - ABarSubItemControl.Parent.TextSize div 2 + ABarSubItemControl.Parent.Canvas.Font.Height div 2;
|
|
DrawLargeItemArrow(DC, R, atDown, Size, Selected and not Down and IsHighContrastWhite,
|
|
ABarSubItemControl.Enabled, True{Flat});
|
|
end;
|
|
ptVert:
|
|
begin
|
|
Top := Bottom - ABarSubItemControl.Parent.TextSize div 2 + ABarSubItemControl.Parent.Canvas.Font.Height div 2;
|
|
DrawLargeItemArrow(DC, R, atRight, Size, Selected and not Down and IsHighContrastWhite,
|
|
ABarSubItemControl.Enabled, True{Flat});
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
with R do
|
|
if PaintType = ptMenu then
|
|
begin
|
|
DrawGlyphAndTextInSubMenu(ABarSubItemControl, DC, R, Selected, True, False);
|
|
DrawArrow;
|
|
end
|
|
else
|
|
begin
|
|
DrawGlyph(ABarSubItemControl, R, nil, PaintType, False, Selected, Down,
|
|
False, False, False, True, False);
|
|
|
|
if ABarSubItemControl.ImageExists or not ABarSubItemControl.Item.ShowCaption then
|
|
if PaintType = ptHorz then
|
|
Inc(Left, ABarSubItemControl.BarManager.ButtonWidth)
|
|
else
|
|
Inc(Top, ABarSubItemControl.BarManager.ButtonHeight)
|
|
else
|
|
if PaintType = ptHorz then
|
|
Inc(Left, ABarSubItemControl.CaptionOffset)
|
|
else
|
|
Inc(Top, ABarSubItemControl.CaptionOffset);
|
|
|
|
if ABarSubItemControl.Item.ShowCaption then
|
|
DrawItemText(ABarSubItemControl, DC, ABarSubItemControl.Caption, R, DT_LEFT,
|
|
ABarSubItemControl.Enabled, Selected and not Down and IsHighContrastWhite{False}, PaintType = ptVert, False, not IsHighContrastWhite{True});
|
|
if not TdxBarControl(ABarSubItemControl.Parent).Bar.IsMainMenu then DrawArrow;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.SubMenuControlBeginGroupSize: Integer;
|
|
begin
|
|
Result := 2 + 1 + 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.SubMenuControlBorderSize: Integer;
|
|
begin
|
|
Result := 2;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubMenuControlCalcDrawingConsts(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ATextSize, AMenuArrowWidth, AMarkSize, ANormalItemHeight: Integer);
|
|
var
|
|
Size: Integer;
|
|
begin
|
|
Inc(ATextSize);
|
|
AMenuArrowWidth := ATextSize div 4 * 3 + 1;
|
|
AMarkSize := ABarSubMenuControl.Canvas.TextHeight('0') + 1 {- 2};
|
|
Size := SubMenuControlMarkArrowSize(ABarSubMenuControl, AMarkSize - 2);
|
|
if Odd(Size) then AMarkSize := (Size - 1) * 2 + 2 * 3;
|
|
ANormalItemHeight := 19 + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubMenuControlCalcRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect; var AClientHeight: Integer);
|
|
begin
|
|
with ABarSubMenuControl do
|
|
begin
|
|
R := Rect(1 + BarSize, 1, ClientWidth - 1, 1);
|
|
if Size = nil then
|
|
AClientHeight := ClientHeight - 1 - TextSize * Byte(MarkExists)
|
|
else
|
|
begin
|
|
Size^.X := 0;
|
|
AClientHeight := MaxInt;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubMenuControlCalcSize(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect);
|
|
begin
|
|
with ABarSubMenuControl do
|
|
begin
|
|
if Size^.X = 0 then
|
|
Size^.X := 100
|
|
else
|
|
Inc(Size^.X, 2 * 2 + BarSize);
|
|
if (R.Top <= 2) or MarkExists then
|
|
Inc(R.Top, TextSize);
|
|
Size^.Y := 1 + R.Top + 2;
|
|
if Detachable then
|
|
Inc(Size^.Y, DetachCaptionAreaSize);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.SubMenuControlDetachCaptionAreaSize(ABarSubMenuControl: TdxBarSubMenuControl): Integer;
|
|
begin
|
|
Result := ABarSubMenuControl.DetachCaptionSize + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubMenuControlDrawArrowsArea(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; ABrush: HBRUSH; AMaxVisibleCount: Integer);
|
|
var
|
|
R: TRect;
|
|
AControl: TdxBarItemControl;
|
|
begin
|
|
with ABarSubMenuControl do
|
|
begin
|
|
if UpArrowExists then
|
|
begin
|
|
R := ItemLinks.VisibleItems[TopIndex].ItemRect;
|
|
SubMenuControlDrawArrow(ABarSubMenuControl, DC, R, True);
|
|
DrawBackground(ItemLinks.VisibleItems[TopIndex].Control, DC, R, ToolbarItemsBrush, False);
|
|
SelectClipRgn(DC, 0);
|
|
end;
|
|
AControl := ItemLinks.VisibleItems[TopIndex + AMaxVisibleCount - 1].Control;
|
|
R := GetItemRectEx(AControl, True);
|
|
if DownArrowExists then
|
|
begin
|
|
SubMenuControlDrawArrow(ABarSubMenuControl, DC, R, False);
|
|
DrawBackground(AControl, DC, R, ToolbarItemsBrush, False);
|
|
end;
|
|
R.Top := R.Bottom;
|
|
R.Bottom := ClientHeight - 1;
|
|
if MarkExists then Dec(R.Bottom, TextSize);
|
|
DrawBackground(AControl, DC, R, ToolbarItemsBrush, False);
|
|
if DownArrowExists then SelectClipRgn(DC, 0);
|
|
if MarkExists then
|
|
begin
|
|
R.Top := R.Bottom;
|
|
R.Bottom := R.Top + TextSize;
|
|
Dec(R.Bottom, MarkSize);
|
|
DrawBackground(AControl, DC, R, ToolbarItemsBrush, False);
|
|
R.Top := R.Bottom;
|
|
Inc(R.Bottom, MarkSize);
|
|
with R do
|
|
DrawBackground(AControl, DC, Rect(Left, Top, Left + 1, Bottom), ToolbarItemsBrush, False);
|
|
if MarkState = msSelected then
|
|
begin
|
|
FrameFlatSelRect(DC, R);
|
|
ABrush := ToolbarSelBrush;
|
|
InflateRect(R, -1, -1);
|
|
DrawBackground(AControl, DC, R, ABrush, True);
|
|
InflateRect(R, 1, 1);
|
|
end
|
|
else
|
|
DrawBackground(AControl, DC, R, ToolbarItemsBrush, False);
|
|
SubMenuControlDrawMark(ABarSubMenuControl, DC, R, MarkState = msSelected);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubMenuControlDrawBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect);
|
|
|
|
procedure DrawFlatBorder;
|
|
begin
|
|
FrameRect(DC, R, ABarSubMenuControl.BarManager.FlatToolbarsBorderBrush);
|
|
BarDrawOwnerLink(ABarSubMenuControl, DC);
|
|
end;
|
|
|
|
begin
|
|
with R do
|
|
begin
|
|
DrawFlatBorder;
|
|
if ABarSubMenuControl.Detachable then
|
|
begin
|
|
InflateRect(R, -1, -1);
|
|
Bottom := Top + 1;
|
|
FillRect(DC, R, COLOR_WINDOW + 1);
|
|
Top := Bottom;
|
|
Bottom := Top + ABarSubMenuControl.DetachCaptionSize;
|
|
FillRect(DC, Rect(Left, Top, Left + 1, Bottom), COLOR_WINDOW + 1);
|
|
FillRect(DC, Rect(Right - 1, Top, Right, Bottom), COLOR_WINDOW + 1);
|
|
SubMenuControlDrawDetachCaption(ABarSubMenuControl, DC, ABarSubMenuControl.DetachCaptionRect);
|
|
end;
|
|
end
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubMenuControlDrawClientBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; var R: TRect; ABrush: HBRUSH);
|
|
begin
|
|
FrameRect(DC, R, ABarSubMenuControl.ToolbarItemsBrush);
|
|
with R do
|
|
FillRect(DC, Rect(Left, Top + 1, Left + 1, Bottom - 1), ABrush);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubMenuControlDrawDetachCaption(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect);
|
|
const
|
|
MarkSize = 33;
|
|
Colors: array[Boolean] of COLORREF = (COLOR_BTNSHADOW, COLOR_BTNTEXT);
|
|
var
|
|
Brush: HBRUSH;
|
|
I: Integer;
|
|
begin
|
|
if ABarSubMenuControl.DetachCaptionSelected then
|
|
begin
|
|
FrameFlatSelRect(DC, R);
|
|
InflateRect(R, -1, -1);
|
|
Brush := ABarSubMenuControl.ToolbarSelBrush;
|
|
end
|
|
else
|
|
Brush := ABarSubMenuControl.BarManager.FlatToolbarsBrush;
|
|
FillRect(DC, R, Brush);
|
|
Brush := Colors[ABarSubMenuControl.DetachCaptionSelected] + 1;
|
|
with R do
|
|
begin
|
|
InflateRect(R, -(Right - Left - MarkSize) div 2, -1);
|
|
Right := Left + MarkSize;
|
|
for I := Top to Bottom - 1 do
|
|
if not Odd(I - Top) then
|
|
FillRect(DC, Rect(Left, I, Right, I + 1), Brush);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubMenuControlDrawBeginGroup(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AControl: TdxBarItemControl; DC: HDC; AItemRect: TRect; LeftDelta: Integer);
|
|
var
|
|
R: TRect;
|
|
ABrush: HBRUSH;
|
|
LD, RD: Integer;
|
|
AOpaque: Boolean;
|
|
begin
|
|
R := AItemRect;
|
|
if not IgnoreNonRecentColor and AControl.FChangeRecentGroup and AControl.FNonRecent then
|
|
ABrush := SubMenuControlToolbarItemsBrush(ABarSubMenuControl)
|
|
else
|
|
ABrush := ABarSubMenuControl.BkBrush;
|
|
AOpaque := not IgnoreNonRecentColor and AControl.FNonRecent and not AControl.FChangeRecentGroup;
|
|
with R do
|
|
begin
|
|
Bottom := Top;
|
|
Dec(R.Top, ABarSubMenuControl.BeginGroupSize);
|
|
AControl.FBeginGroupRect := R;
|
|
LD := Left + AControl.TextAreaOffset;
|
|
DrawBackground(AControl, DC, Rect(Left, Top, LD, Bottom), ABarSubMenuControl.BarManager.FlatToolbarsBrush, AOpaque);
|
|
DrawBackground(AControl, DC, Rect(LD, Top, Right, Bottom), ABrush, AOpaque);
|
|
RD := (Top + Bottom) div 2;
|
|
FillRect(DC,
|
|
Rect(LD + ABarSubMenuControl.BarManager.SubMenuBeginGroupIndent, RD, Right + 1, RD + 1),
|
|
SubMenuControlGroupSeparatorBrush(ABarSubMenuControl));
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.SubMenuControlGroupSeparatorBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH;
|
|
begin
|
|
Result := GetSysColorBrush(COLOR_BTNSHADOW);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.SubMenuControlMarkArrowSize(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AMarkSize: Integer): Integer;
|
|
begin
|
|
Result := (AMarkSize - 2 * 2) div 2;
|
|
if (Result > 4) and Odd(Result) then
|
|
Dec(Result);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubMenuControlOffsetDetachCaptionRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var R: TRect);
|
|
begin
|
|
InflateRect(R, -2, -2);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SubMenuControlPrepareBkBrush(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ABkBrush: HBRUSH);
|
|
begin
|
|
ABkBrush := SubMenuControlToolbarItemsBrush(ABarSubMenuControl);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.SubMenuControlToolbarItemsBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH;
|
|
begin
|
|
Result := GetSysColorBrush(COLOR_WINDOW);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.CustomComboDrawItem(ABarCustomCombo: TdxBarCustomCombo;
|
|
ACanvas: TCanvas; AIndex: Integer; ARect: TRect; AState: TOwnerDrawState;
|
|
AInteriorIsDrawing: Boolean);
|
|
var
|
|
S: string;
|
|
begin
|
|
with ACanvas, ARect do
|
|
begin
|
|
if AIndex = -1 then
|
|
S := ABarCustomCombo.Text
|
|
else
|
|
S := ABarCustomCombo.Items[AIndex];
|
|
FillRect(ARect);
|
|
TextOut(Left + 2, Top + Byte(AInteriorIsDrawing) * 2, S);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.EditControlCaptionWidth(ABarEditControl: TdxBarEditControl;
|
|
ATextWidth: Integer): Integer;
|
|
begin
|
|
Result := 1 + 5 + ATextWidth + 5;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.EditControlDrawBorder(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean);
|
|
begin
|
|
if Selected then
|
|
FrameFlatSelRect(DC, ARect)
|
|
else
|
|
if (PaintType = ptMenu) or not ABarEditControl.Enabled then
|
|
if PaintType = ptMenu then
|
|
FrameRect(DC, ARect, ABarEditControl.Parent.ToolbarBrush)
|
|
else
|
|
FrameRect(DC, ARect, GetSysColorBrush(COLOR_BTNSHADOW))
|
|
else
|
|
DrawBackgroundFrameRect(ABarEditControl, DC, ARect, ABarEditControl.Parent.BkBrush, False);
|
|
InflateRect(ARect, -1, -1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.EditControlDrawCaption(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean);
|
|
var
|
|
S: string;
|
|
Size: TSize;
|
|
R: TRect;
|
|
Brush: HBRUSH;
|
|
begin
|
|
S := GetTextOf(ABarEditControl.Caption);
|
|
GetTextExtentPoint32(DC, PChar(S), Length(S), Size);
|
|
R := ARect;
|
|
R.Right := R.Left + EditControlCaptionWidth(ABarEditControl, Size.cX);
|
|
ARect.Left := R.Right;
|
|
if Selected and (PaintType = ptMenu) then
|
|
begin
|
|
Inc(R.Right);
|
|
FrameFlatSelRect(DC, R);
|
|
InflateRect(R, -1, -1);
|
|
end;
|
|
if Selected and (PaintType = ptMenu) then
|
|
Brush := ABarEditControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := ABarEditControl.Parent.BkBrush;
|
|
DrawBackground(ABarEditControl, DC, R, Brush, (PaintType = ptMenu) and (Selected or ABarEditControl.FNonRecent));
|
|
Dec(R.Right, 5);
|
|
DrawItemText(ABarEditControl, DC, ABarEditControl.Caption, R, DT_RIGHT,
|
|
ABarEditControl.Enabled, Selected and (PaintType = ptMenu), False, False, not IsHighContrastWhite);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.EditControlDrawTextField(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; const ARect: TRect; AIgnoreEnabled: Boolean);
|
|
begin
|
|
inherited EditControlDrawTextField(ABarEditControl, DC, ARect, True);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.EditControlES_Style: Integer;
|
|
begin
|
|
Result := inherited EditControlES_Style or ES_MULTILINE;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.EditControlPrepareEditWnd(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
R := ABarEditControl.WindowRect;
|
|
with R do
|
|
begin
|
|
OffsetRect(R, -Left, -Top);
|
|
InflateRect(R, -2, -2);
|
|
end;
|
|
SendMessage(AHandle, EM_SETRECTNP, 0, LPARAM(@R));
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.EditControlUpdateWndText(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND; ANotEqual: Boolean);
|
|
begin
|
|
if ANotEqual then
|
|
SendMessage(AHandle, WM_COMMAND, MAKEWPARAM(0, EN_CHANGE), AHandle);
|
|
inherited EditControlUpdateWndText(ABarEditControl, AHandle, ANotEqual);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SysPanelDraw(AHandle: HWND; AllowResizing,
|
|
MouseAboveCloseButton, CloseButtonIsTracking: Boolean; var CloseButtonRect,
|
|
GripRect: TRect; Corner: TdxCorner);
|
|
begin
|
|
dxBarPopupNCPaint(AHandle, AllowResizing, True, MouseAboveCloseButton,
|
|
CloseButtonIsTracking, CloseButtonRect, GripRect, Corner);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.IsDateNavigatorFlat: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DateNavigatorDrawButton(ABarItem: TdxBarItem;
|
|
DC: HDC; R: TRect; const ACaption: string; APressed: Boolean);
|
|
begin
|
|
with R do
|
|
begin
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_BTNSHADOW));
|
|
InflateRect(R, -1, -1);
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
|
|
InflateRect(R, -1, -1);
|
|
end;
|
|
DateNavigatorDrawButtonCaption(DC, R, 0, ACaption, True);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.SpinEditControlDrawButton(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; ARect: TRect; XSize, YSize, Size: Integer; Selected: Boolean;
|
|
AButton, AActiveButton: TdxBarSpinEditButton; AButtonPressed: Boolean);
|
|
var
|
|
R: TRect;
|
|
AColor: Integer;
|
|
begin
|
|
R := ARect;
|
|
with R do
|
|
begin
|
|
if AButton = sbUp then
|
|
Bottom := Top + Size + 1
|
|
else
|
|
Inc(Top, Size);
|
|
FrameAndFillRect(ABarEditControl, DC, R, ABarEditControl.Enabled, Selected,
|
|
(AActiveButton = AButton) and AButtonPressed);
|
|
Inc(Left, YSize);
|
|
Top := (Top + Bottom - YSize) div 2 + Byte(AButton = sbUp) * (YSize - 1);
|
|
if ABarEditControl.Enabled then
|
|
begin
|
|
if IsHighContrastWhite and Selected then
|
|
AColor := COLOR_BTNFACE
|
|
else
|
|
AColor := COLOR_BTNTEXT;
|
|
SpinEditControlDrawOneArrow(DC, Left, Top, XSize, YSize, AColor, AButton);
|
|
end
|
|
else
|
|
SpinEditControlDrawOneArrow(DC, Left, Top, XSize, YSize, COLOR_BTNSHADOW, AButton);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.ContainerControlSubMenuOffset: Integer;
|
|
begin
|
|
Result := 2 + 1 + 6;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.InPlaceSubItemControlDrawInMenu(ABarContainerItemControl: TdxBarContainerItemControl;
|
|
DC: HDC; Selected, AItemExpanded: Boolean; ARect: TRect);
|
|
const
|
|
Arrows: array[Boolean] of TdxArrowType = (atRight, atDown);
|
|
var
|
|
R: TRect;
|
|
Brush: HBRUSH;
|
|
Size: Integer;
|
|
begin
|
|
R := ARect;
|
|
R.Top := R.Bottom - 1;
|
|
FillRect(DC, R, ABarContainerItemControl.Parent.BkBrush);
|
|
|
|
R.Bottom := R.Top;
|
|
R.Top := ARect.Top;
|
|
if Selected then
|
|
Brush := ABarContainerItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := InPlaceSubItemControlBrush;
|
|
if Selected then
|
|
FrameFlatSelRect(DC, R)
|
|
else
|
|
FrameRect(DC, R, InPlaceSubItemControlBrush);
|
|
InflateRect(R, -1, -1);
|
|
FillRect(DC, R, Brush);
|
|
|
|
Inc(R.Left, 5);
|
|
DrawItemText(ABarContainerItemControl, DC, ABarContainerItemControl.Caption, R,
|
|
DT_LEFT, True, True, False, False, Selected and not IsHighContrastWhite);
|
|
|
|
if ABarContainerItemControl.Enabled then
|
|
begin
|
|
Size := ABarContainerItemControl.Parent.MenuArrowHeight;
|
|
with R do
|
|
Left := Right - ABarContainerItemControl.Parent.TextSize + Byte(not AItemExpanded) * Size;
|
|
DrawLargeItemArrow(DC, R, Arrows[AItemExpanded], Size,
|
|
not Selected or IsHighContrastWhite, True, True{Flat});
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DrawGlyphBorder(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; PaintType: TdxBarPaintType;
|
|
IsGlyphEmpty, Selected, Down, DrawDowned, BarControlOwner, IsSplit: Boolean);
|
|
begin
|
|
if Down or (Selected and (PaintType <> ptMenu)) then
|
|
begin
|
|
if Down and BarControlOwner then
|
|
BarDrawBarControlOwnerBorder(ABarItemControl.Parent, DC, R, ABarItemControl, ABarItemControl.OwnedBarControl)
|
|
else
|
|
FrameFlatSelRect(DC, R);
|
|
end
|
|
else
|
|
if NeedBorder then
|
|
DrawBackgroundFrameRect(ABarItemControl, DC, R, ABrush, Selected or Down or
|
|
DrawDowned or ABarItemControl.FNonRecent);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DrawGlyphCheckMark(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; X, Y, DoubleSize: Integer);
|
|
//const
|
|
// Colors: array[Boolean] of TColor = (clBlack, clWhite);
|
|
var
|
|
OffsetY, I: Integer;
|
|
|
|
procedure DrawOneMark;
|
|
begin
|
|
with ABarItemControl.Parent.Canvas do
|
|
begin
|
|
MoveTo(X + DoubleSize * 1, Y + OffsetY + DoubleSize * 2);
|
|
LineTo(X + DoubleSize * 3, Y + OffsetY + DoubleSize * 4);
|
|
LineTo(X + DoubleSize * 8, Y + OffsetY - DoubleSize * 1);
|
|
end;
|
|
Inc(OffsetY);
|
|
end;
|
|
|
|
begin
|
|
with ABarItemControl.Parent.Canvas do
|
|
if ABarItemControl.Enabled then
|
|
begin
|
|
OffsetY := 0;
|
|
if IsHighContrastWhite or IsHighContrast2 then
|
|
Pen.Color := clWhite
|
|
else{
|
|
if IsHighContrast2 then
|
|
Pen.Color := clBlack
|
|
else}
|
|
Pen.Color := clBlack;
|
|
// Pen.Color := Colors[GetSysColor(COLOR_BTNFACE) = 0];
|
|
for I := 1 to 2 * DoubleSize do DrawOneMark;
|
|
end
|
|
else
|
|
begin
|
|
OffsetY := 1;
|
|
Pen.Color := GetSysColor(COLOR_BTNSHADOW);
|
|
for I := 1 to 2 * DoubleSize do DrawOneMark;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.DrawGlyphImage(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; const GlyphRect: TRect;
|
|
AGlyph: TBitmap; AImages: TCurImageList; AImageIndex: Integer;
|
|
Selected, Down, DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner: Boolean;
|
|
PaintType: TdxBarPaintType);
|
|
var
|
|
ATransparent: Boolean;
|
|
begin
|
|
if NeedBorder then InflateRect(R, -1, -1);
|
|
ATransparent := not ABarItemControl.FNonRecent and ABarItemControl.Parent.IsTransparent;
|
|
if ATransparent then
|
|
DrawBackground(ABarItemControl, DC, R, ABrush, Down or DrawDowned or Selected or
|
|
ABarItemControl.FNonRecent);
|
|
TransparentDraw(DC, ABrush, R, GlyphRect,
|
|
AGlyph, AImages, AImageIndex,
|
|
ABarItemControl.GetImageEnabled(PaintType), GrayScale, True{Flat}, Selected, Down, DrawDowned,
|
|
True{Shadow}, ATransparent, GetFadedColor(ABarItemControl.Parent){Faded},
|
|
ABarItemControl.Item.BarManager.ImageListBkColor);
|
|
if NeedBorder then InflateRect(R, 1, 1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.FrameFlatSelRect(DC: HDC; const R: TRect);
|
|
begin
|
|
if IsHighContrastBlack or IsHighContrast2 then
|
|
FrameRectByColor(DC, R, clHighlightText)
|
|
else
|
|
dxBar.FrameFlatSelRect(DC, R);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarCaptionBkColor(ABarControl: TdxBarControl;
|
|
AMainFormActive: Boolean): COLORREF;
|
|
begin
|
|
Result := inherited BarCaptionBkColor(ABarControl, False);
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.BarMarkArrowColor(ABarControl: TdxBarControl;
|
|
AState: TdxBarMarkState): COLORREF;
|
|
begin
|
|
if AState <> msNone then
|
|
Result := GetSysColor(COLOR_BTNTEXT)
|
|
else
|
|
Result := inherited BarMarkArrowColor(ABarControl, AState);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawMarkBackground(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
if ABarControl.MarkState = msPressed then
|
|
BarDrawBarControlOwner(ABarControl, DC, ItemRect, ABarControl.FQuickPopup)
|
|
else
|
|
begin
|
|
if ABarControl.MarkState = msNone then
|
|
FrameRect(DC, ItemRect, AToolbarBrush)
|
|
else
|
|
FrameFlatSelRect(DC, ItemRect);
|
|
InflateRect(ItemRect, -1, -1);
|
|
if ABarControl.MarkState = msSelected then
|
|
begin
|
|
AToolbarBrush := ABarControl.ToolbarSelBrush;
|
|
FillRect(DC, ItemRect, AToolbarBrush);
|
|
end
|
|
else
|
|
ABarControl.FillBackground(DC, ItemRect, AToolbarBrush, clNone, True);
|
|
InflateRect(ItemRect, 1, 1);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarDrawMarkElements(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect);
|
|
begin
|
|
TdxBarItemControlEnhancedPainter.BarDrawMarkElements(ABarControl, DC, ItemRect);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.BarOffsetFloatingBarCaption(ABarControl: TdxBarControl;
|
|
var X: Integer; var R: TRect);
|
|
begin
|
|
Inc(X, 2);
|
|
R.Right := ABarControl.MarkNCRect.Left;
|
|
end;
|
|
|
|
class function TdxBarItemControlFlatPainter.GetDrawMarkElementColor(ABarControl: TdxBarControl): Integer;
|
|
begin
|
|
if IsHighContrastWhite and (ABarControl.MarkState = msSelected) then
|
|
Result := COLOR_BTNFACE
|
|
else
|
|
Result := inherited GetDrawMarkElementColor(ABarControl);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlFlatPainter.EditOffsetInteriorRect(var R: TRect);
|
|
begin
|
|
Inc(R.Top, 2);
|
|
end;
|
|
|
|
{ TdxBarItemControlOffice11Painter }
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DrawGlyphAndTextInSubMenu(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Selected, ShowGlyph, Down: Boolean);
|
|
var
|
|
I: Integer;
|
|
IconRect: TRect;
|
|
IsGlyphEmpty, AOpaque: Boolean;
|
|
ABrush: HBRUSH;
|
|
begin
|
|
with R do
|
|
begin
|
|
if Selected then
|
|
begin
|
|
AOpaque := True;
|
|
Office11FrameSelectedRect(DC, R)
|
|
end
|
|
else
|
|
begin
|
|
AOpaque := False;
|
|
I := Left + Bottom - Top + 1;
|
|
|
|
ABrush := ABarItemControl.Parent.BkBrush;
|
|
DrawBackground(ABarItemControl, DC, Rect(Left, Top, I, Top + 1), ABrush, AOpaque);
|
|
DrawBackground(ABarItemControl, DC, Rect(Left, Bottom - 1, I, Bottom), ABrush, AOpaque);
|
|
DrawBackground(ABarItemControl, DC, Rect(Left, Top + 1, Left + 1, Bottom - 1), ABrush, AOpaque);
|
|
|
|
ABrush := ABarItemControl.Parent.BkBrush;
|
|
DrawBackground(ABarItemControl, DC, Rect(I, Top, Right, Top + 1), ABrush, AOpaque);
|
|
DrawBackground(ABarItemControl, DC, Rect(I, Bottom - 1, Right, Bottom), ABrush, AOpaque);
|
|
DrawBackground(ABarItemControl, DC, Rect(Right - 1, Top + 1, Right, Bottom - 1), ABrush, AOpaque);
|
|
end;
|
|
InflateRect(R, -1, -1);
|
|
IconRect := R;
|
|
IconRect.Right := IconRect.Left + Bottom - Top;
|
|
IsGlyphEmpty := not ABarItemControl.ImageExists or not ShowGlyph;
|
|
|
|
DrawGlyph(ABarItemControl, IconRect, nil, ptMenu, IsGlyphEmpty, Selected,
|
|
Down, False, False, False, False, False);
|
|
if Selected then
|
|
ABrush := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
ABrush := ABarItemControl.Parent.BkBrush;
|
|
Left := IconRect.Right + 2;
|
|
with IconRect do
|
|
DrawBackground(ABarItemControl, DC, Rect(Right, Top, R.Left, Bottom), ABrush, AOpaque);
|
|
|
|
if Selected then
|
|
ABrush := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
ABrush := ABarItemControl.Parent.BkBrush;
|
|
DrawBackground(ABarItemControl, DC, R, ABrush, AOpaque);
|
|
Inc(Left, 8);
|
|
DrawItemText(ABarItemControl, DC, ABarItemControl.Caption, R, DT_LEFT,
|
|
ABarItemControl.Enabled, Selected, False, False, not IsHighContrastWhite);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.FrameAndFillRect(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Enabled, Selected, Pressed: Boolean);
|
|
var
|
|
Brush: HBRUSH;
|
|
begin
|
|
if Selected then
|
|
begin
|
|
FrameFlatSelRect(DC, R);
|
|
if Pressed then
|
|
Brush := ABarItemControl.Parent.ToolbarDownedSelBrush
|
|
else
|
|
Brush := ABarItemControl.Parent.ToolbarSelBrush;
|
|
end
|
|
else
|
|
begin
|
|
if Enabled then
|
|
begin
|
|
FrameRect(DC, R, ABarItemControl.Parent.BkBrush);
|
|
Brush := dxOffice11OwnerControlDownedBrush;
|
|
end
|
|
else
|
|
begin
|
|
FrameRectByColor(DC, R, dxOffice11TextDisabledColor);
|
|
Brush := GetSysColorBrush(COLOR_BTNFACE);
|
|
end;
|
|
end;
|
|
InflateRect(R, -1, -1);
|
|
FillRect(DC, R, Brush);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.GetArrowParams(ABarItemControl: TdxBarItemControl;
|
|
APaintType: TdxBarPaintType; AEnabled, ASelected, ADroppedDown: Boolean;
|
|
var ABrush: HBRUSH; var AArrowColor: COLORREF);
|
|
begin
|
|
if AEnabled then
|
|
begin
|
|
AArrowColor := dxOffice11TextEnabledColor;
|
|
// TODO: XP?
|
|
if ASelected then
|
|
begin
|
|
if IsHighContrastWhite then
|
|
AArrowColor := clWhite
|
|
else
|
|
if ADroppedDown and not IsXPStandardScheme then
|
|
AArrowColor := ColorToRGB(clHighlightText);
|
|
if ADroppedDown then
|
|
ABrush := ABarItemControl.Parent.ToolbarDownedSelBrush
|
|
else
|
|
ABrush := ABarItemControl.Parent.ToolbarSelBrush;
|
|
end
|
|
else
|
|
ABrush := ABarItemControl.Parent.BkBrush
|
|
end
|
|
else
|
|
begin
|
|
AArrowColor := dxOffice11TextDisabledColor;
|
|
ABrush := GetSysColorBrush(COLOR_BTNFACE);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.GlyphBkgndBrush(ABarItemControl: TdxBarItemControl;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, GrayScale, BarControlOwner: Boolean): HBRUSH;
|
|
begin
|
|
if Selected then
|
|
if Down or DrawDowned then
|
|
if Down and BarControlOwner then
|
|
Result := ABarItemControl.Parent.BarControlOwnerBrush
|
|
else
|
|
Result := ABarItemControl.Parent.ToolbarDownedSelBrush
|
|
else
|
|
Result := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
if Down then
|
|
Result := ABarItemControl.Parent.ToolbarDownedBrush
|
|
else
|
|
if (PaintType = ptMenu) and not ForceUseBkBrush then
|
|
Result := ABarItemControl.Parent.ToolbarBrush
|
|
else
|
|
Result := ABarItemControl.Parent.BkBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.IsItemTextSelectedInverted: Boolean;
|
|
begin
|
|
if IsXPStandardScheme then
|
|
Result := False
|
|
else
|
|
Result := inherited IsItemTextSelectedInverted;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.StaticBorderBrush(ABarItemControl: TdxBarItemControl;
|
|
ABorderStyle: TdxBarStaticBorderStyle): HBRUSH;
|
|
begin
|
|
Result := dxOffice11StaticBorderBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BeforeFingersSize: Integer;
|
|
begin
|
|
Result := inherited BeforeFingersSize + BarBeforeFingersIndent;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BorderSizeX: Integer;
|
|
begin
|
|
Result := 3;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BorderSizeY: Integer;
|
|
begin
|
|
Result := 3;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.EmptyFingersSize: Integer;
|
|
begin
|
|
Result := 2;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DockControlFillBackground(ADockControl: TdxDockControl;
|
|
DC: HDC; ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
|
|
procedure FillBackgroundTempBitmap(ABitmap: TBitmap);
|
|
var
|
|
AColor1, AColor2: TColor;
|
|
begin
|
|
with AWholeR do
|
|
begin
|
|
ABitmap.Width := Right - Left;
|
|
ABitmap.Height := Bottom - Top;
|
|
end;
|
|
GetDockColors(ADockControl, AColor1, AColor2);
|
|
FillGradientRect(ABitmap.Canvas.Handle, AWholeR, AColor1, AColor2, True);
|
|
end;
|
|
|
|
begin
|
|
if ADockControl.BackgroundTempBitmap.Empty then
|
|
FillBackgroundTempBitmap(ADockControl.BackgroundTempBitmap);
|
|
with ADestR do
|
|
BitBlt(DC, Left, Top, Right - Left, Bottom - Top,
|
|
ADockControl.BackgroundTempBitmap.Canvas.Handle, ASourceR.Left, ASourceR.Top, SRCCOPY);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.IsNativeBackground: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarControlOwnerBrush(ABarManager: TdxBarManager): HBRUSH;
|
|
begin
|
|
Result := dxOffice11OwnerControlDownedBrush;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawBarControlOwnerFrame(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
FrameRect(DC, R, dxOffice11DropDownBorderBrush1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawBarControlOwnerLink(ACustomBarControl: TCustomdxBarControl;
|
|
DC: HDC; R, ALinkR: TRect; ABarItemControl: TdxBarItemControl);
|
|
var
|
|
AColor: TColor;
|
|
begin
|
|
if (ABarItemControl = nil) or not IsMenuGradient(ABarItemControl) then
|
|
inherited
|
|
else
|
|
begin
|
|
if (ALinkR.Right - ALinkR.Left) > (ALinkR.Bottom - ALinkR.Top) then // Horz
|
|
begin
|
|
if ALinkR.Top > ((R.Bottom + R.Top) div 2) then // bottom
|
|
AColor := dxOffice11MenuDownedColor2
|
|
else
|
|
AColor := dxOffice11MenuDownedColor1;
|
|
end
|
|
else
|
|
begin
|
|
if ALinkR.Left > ((R.Right + R.Left) div 2) then // right
|
|
AColor := dxOffice11MenuDownedColor2
|
|
else
|
|
AColor := dxOffice11MenuDownedColor1;
|
|
end;
|
|
FillRectByColor(DC, ALinkR, AColor);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawDockedBackground(ABarControl: TCustomdxBarControl;
|
|
DC: HDC; ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
var
|
|
AWholeR: TRect;
|
|
AClipRgn: HRGN;
|
|
AClipRgnExists: Boolean;
|
|
begin
|
|
if (ABarControl is TdxBarControl) and
|
|
((TdxBarControl(ABarControl).Bar.BorderStyle = bbsNone) or
|
|
TdxBarControl(ABarControl).Bar.IsMainMenu or
|
|
ABarControl.IsBackgroundBitmap) then
|
|
inherited
|
|
else
|
|
begin
|
|
SaveClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
with ADestR do
|
|
IntersectClipRect(DC, Left, Top, Right, Bottom);
|
|
|
|
AWholeR := GetBarGradientRect(ABarControl);
|
|
OffsetRect(AWholeR, -(ASourceR.Left - ADestR.Left), -(ASourceR.Top - ADestR.Top)); // NC offset
|
|
|
|
FillTubeGradientRect(DC, AWholeR, dxOffice11ToolbarsColor1, dxOffice11ToolbarsColor2,
|
|
(ABarControl is TdxBarControl) and TdxBarControl(ABarControl).Vertical);
|
|
RestoreClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawFloatingBackground(ABarControl: TCustomdxBarControl;
|
|
DC: HDC; ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
var
|
|
R: TRect;
|
|
AClipRgn: HRGN;
|
|
AClipRgnExists: Boolean;
|
|
begin
|
|
if ABarControl.IsInternal or ABarControl.IsBackgroundBitmap then
|
|
inherited
|
|
else
|
|
begin
|
|
R := ABarControl.ClientRect;
|
|
SaveClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
with ADestR do
|
|
IntersectClipRect(DC, Left, Top, Right, Bottom);
|
|
FillGradientRect(DC, R, dxOffice11ToolbarsColor1,
|
|
dxOffice11ToolbarsColor2, False);
|
|
RestoreClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawOwnerLink(ABarControl: TCustomdxBarControl;
|
|
DC: HDC);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
R := ABarControl.OwnerLinkBounds[False];
|
|
if not IsRectEmpty(R) then
|
|
FillRect(DC, R, dxOffice11DropDownBorderBrush2);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarHasShadow(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
if (ABarControl is TdxBarControl) and not (ABarControl is TdxBarQuickControl) then // TODO: !!! IsInternal ?
|
|
Result := False
|
|
else
|
|
Result := inherited BarHasShadow(ABarControl);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarToolbarBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
// TODO: ?
|
|
Result := dxOffice11MenuBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarToolbarBrushEx(ABarControl: TdxBarControl): HBRUSH;
|
|
begin
|
|
// TODO
|
|
if not (ABarControl.Bar.IsMainMenu or ABarControl.Bar.IsStatusBar) then
|
|
Result := inherited BarToolbarBrushEx(ABarControl)
|
|
else
|
|
Result := GetSysColorBrush(COLOR_BTNFACE);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarToolbarDownedBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := dxOffice11DownedBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarToolbarDownedSelBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := dxOffice11DownedSelectedBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarToolbarSelBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := dxOffice11ToolbarSelectedBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.ComboBoxArrowWidth(ABarControl: TCustomdxBarControl;
|
|
DC: HDC; cX: Integer): Integer;
|
|
begin
|
|
Result := 13;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarBeforeFingersIndent: Integer;
|
|
begin
|
|
Result := 2;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarBorderPaintSizes(ABarControl: TdxBarControl;
|
|
var R: TRect);
|
|
begin
|
|
BarBorderSizes(ABarControl.Bar, ABarControl.DockingStyle, R);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarBorderSizes(ABar: TdxBar; AStyle: TdxBarDockingStyle;
|
|
var R: TRect);
|
|
begin
|
|
if ABar.IsMainMenu then
|
|
// SetRectEmpty(R)
|
|
begin
|
|
if AStyle in [dsTop, dsBottom] then
|
|
R := Rect(0, 2, 0, 2)
|
|
else
|
|
R := Rect(2, 0, 2, 0);
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawBeginGroup(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH; AHorz: Boolean);
|
|
begin
|
|
ABarControl.FillBackground(DC, ItemRect, AToolbarBrush, clNone, True);
|
|
with ItemRect do
|
|
if AHorz then
|
|
begin
|
|
InflateRect(ItemRect, 0, -BarBeginGroupSideSize);
|
|
FillRect(DC, Rect(Left + 3, Top, Right - 4, Top + 1),
|
|
dxOffice11BarSeparatorBrush1);
|
|
FillRect(DC, Rect(Left + 3 + 1, Top + 1, Right - 4 + 1, Top + 2),
|
|
dxOffice11BarSeparatorBrush2);
|
|
end
|
|
else
|
|
begin
|
|
InflateRect(ItemRect, -BarBeginGroupSideSize, 0);
|
|
FillRect(DC, Rect(Left, Top + 3, Left + 1, Bottom - 4),
|
|
dxOffice11BarSeparatorBrush1);
|
|
FillRect(DC, Rect(Left + 1, Top + 3 + 1, Left + 1 + 1, Bottom - 4 + 1),
|
|
dxOffice11BarSeparatorBrush2);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawCaptionElement(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AState: TdxBarMarkState);
|
|
var
|
|
AColor: TColor;
|
|
begin
|
|
if AState <> msNone then
|
|
begin
|
|
Office11FrameSelectedRect(DC, R);
|
|
InflateRect(R, -1, -1);
|
|
if AState = msSelected then
|
|
AColor := dxOffice11SelectedColor1
|
|
else
|
|
AColor := dxOffice11SelectedColor2;
|
|
FillRectByColor(DC, R, AColor);
|
|
end
|
|
else
|
|
FillRectByColor(DC, R, ABarControl.CaptionBkColor);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawDockedBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
var
|
|
B1: HBRUSH;
|
|
AMarkColor1, AMarkColor2, AColor6, AColor9: TColor;
|
|
|
|
procedure DrawFinger(ARect: TRect);
|
|
begin
|
|
// TODO: !
|
|
// if ABarControl.Bar.NotDocking = [Low(TdxBarDockingStyle)..High(TdxBarDockingStyle)] then Exit;
|
|
InflateRect(ARect, -2, -2);
|
|
with ARect do
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
Inc(Left, ABarControl.BarManager.BeforeFingersSize);
|
|
Right := Left + ABarControl.PainterClass.GripperSize;
|
|
InflateRect(ARect, 0, -3);
|
|
end
|
|
else
|
|
begin
|
|
Inc(Top, ABarControl.BarManager.BeforeFingersSize);
|
|
Bottom := Top + ABarControl.PainterClass.GripperSize;
|
|
InflateRect(ARect, -3, 0);
|
|
end;
|
|
BarDrawFingerElements(ABarControl, DC, ARect, ABarControl.Horizontal);
|
|
end;
|
|
|
|
procedure FillParentBackground(DC: HDC; const R: TRect);
|
|
begin
|
|
TdxBarItemControlPainter.BarDrawDockedBackground(ABarControl, DC, R, R, AToolbarBrush, clNone);
|
|
end;
|
|
|
|
procedure FillBackground(DC: HDC; const R: TRect);
|
|
begin
|
|
BarDrawDockedBackground(ABarControl, DC, R, R, AToolbarBrush, clNone);
|
|
end;
|
|
|
|
procedure DrawLeftBorder(var ARect: TRect);
|
|
var
|
|
ADockColor, AC11pxColor, AColor1, AColor2, AColor: TColor;
|
|
R: TRect;
|
|
begin
|
|
GetDockColors(ABarControl.DockControl, AColor1, AColor2);
|
|
with ARect do
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
FillParentBackground(DC, Rect(Left, Top, Left + BarBeforeFingersIndent, Bottom));
|
|
Inc(ARect.Left, BarBeforeFingersIndent);
|
|
FillParentBackground(DC, Rect(Left, Top, Right, Top + 1));
|
|
Inc(ARect.Top);
|
|
// only for Horizontal
|
|
FillParentBackground(DC, Rect(Left, Bottom - 2, Left + 1, Bottom - 1));
|
|
FillParentBackground(DC, Rect(Left + 1, Bottom - 1, Left + 2, Bottom));
|
|
// left
|
|
FillBackground(DC, Rect(Left, Top + 2, Left + 1, Bottom - 3));
|
|
// edge pixels
|
|
SetPixel(DC, Left + 1, Bottom - 3, dxOffice11BarBorderColors[2]);
|
|
// #3 = (Dock, #2, 50%)
|
|
ADockColor := GetGradientColorRect(ABarControl.DockControl.ClientRect,
|
|
ABarControl.PointBarToDock(Point(Left, Top)).X, AColor1, AColor2, True);
|
|
AColor := GetMiddleRGB(ADockColor, dxOffice11BarBorderColors[2], 50);
|
|
SetPixel(DC, Left, Bottom - 3, ColorToRGB(AColor));
|
|
SetPixel(DC, Left + 1, Bottom - 2, ColorToRGB(AColor));
|
|
// #4 = Dock, C1 + 1px
|
|
ADockColor := GetGradientColorRect(ABarControl.DockControl.ClientRect,
|
|
ABarControl.PointBarToDock(Point(Left, Top)).X, AColor1, AColor2, True);
|
|
AC11pxColor := GetGradientColorRect(GetBarGradientRect(ABarControl),
|
|
Top + 1, dxOffice11ToolbarsColor1,
|
|
dxOffice11ToolbarsColor2, False);
|
|
AColor := GetMiddleRGB(ADockColor, AC11pxColor, 50);
|
|
SetPixel(DC, Left, Top + 1, AColor);
|
|
SetPixel(DC, Left + 1, Top, AColor);
|
|
end
|
|
else
|
|
begin
|
|
FillParentBackground(DC, Rect(Left, Top, Right, Top + BarBeforeFingersIndent));
|
|
Inc(ARect.Top, BarBeforeFingersIndent);
|
|
FillParentBackground(DC, Rect(Left, Top, Left + 1, Bottom));
|
|
Inc(ARect.Left);
|
|
|
|
R := Rect(Left, Top + 2, Left + 1, Bottom - 2);
|
|
if ABarControl.MarkExists then
|
|
Dec(R.Bottom, MarkSizeX);
|
|
FillBackground(DC, R);
|
|
|
|
FillBackground(DC, Rect(Left + 2, Top, Right - 2, Top + 1));
|
|
// edge pixels
|
|
SetPixel(DC, Right - 2, Top + 1, dxOffice11BarBorderColors[2]);
|
|
// #3 = (Dock, #2, 50%)
|
|
ADockColor := GetGradientColorRect(ABarControl.DockControl.ClientRect,
|
|
ABarControl.PointBarToDock(Point(Left, Top)).X, AColor1, AColor2, True);
|
|
AColor := GetMiddleRGB(ADockColor, dxOffice11BarBorderColors[2], 50);
|
|
SetPixel(DC, Right - 2, Top, ColorToRGB(AColor));
|
|
SetPixel(DC, Right - 1, Top + 1, ColorToRGB(AColor));
|
|
// #4 = Dock, C1 + 1px
|
|
ADockColor := GetGradientColorRect(ABarControl.DockControl.ClientRect,
|
|
ABarControl.PointBarToDock(Point(Left, Top)).X, AColor1, AColor2, True);
|
|
AC11pxColor := GetGradientColorRect(GetBarGradientRect(ABarControl),
|
|
Left, dxOffice11ToolbarsColor1,
|
|
dxOffice11ToolbarsColor2, True);
|
|
AColor := GetMiddleRGB(ADockColor, AC11pxColor, 50);
|
|
SetPixel(DC, Left, Top + 1, AColor);
|
|
SetPixel(DC, Left + 1, Top, AColor);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure DrawTopBorder(ARect: TRect);
|
|
var
|
|
ADockColor, AC11pxColor, AColor1, AColor2, AColor: TColor;
|
|
R: TRect;
|
|
begin
|
|
GetDockColors(ABarControl.DockControl, AColor1, AColor2);
|
|
with ARect do
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
R := Rect(Left + 2, Top, Right - 2, Top + 1);
|
|
if ABarControl.MarkExists then
|
|
Dec(R.Right, MarkSizeX);
|
|
FillBackground(DC, R);
|
|
|
|
ADockColor := GetGradientColorRect(ABarControl.DockControl.ClientRect,
|
|
ABarControl.PointBarToDock(Point(Right, Top)).X, AColor1, AColor2, True);
|
|
if ABarControl.MarkExists then
|
|
begin
|
|
// #6
|
|
SetPixel(DC, Right - MarkSizeX - 1, Top, AColor6);
|
|
SetPixel(DC, Right - 2, Top + 1, AColor6);
|
|
// #5 = #6, C1+1px
|
|
AC11pxColor := GetGradientColorRect(GetBarGradientRect(ABarControl),
|
|
Top + 1, dxOffice11ToolbarsColor1,
|
|
dxOffice11ToolbarsColor2, False);
|
|
AColor := GetMiddleRGB(AColor6, AC11pxColor, 50);
|
|
SetPixel(DC, Right - MarkSizeX - 2, Top, AColor);
|
|
// #7 = #6, Dock
|
|
AColor := GetMiddleRGB(AColor6, ADockColor, 50);
|
|
SetPixel(DC, Right - 2, Top, AColor);
|
|
SetPixel(DC, Right - 1, Top + 1, AColor);
|
|
end
|
|
else
|
|
begin
|
|
// #5 = Dock, C1 + 1px
|
|
AC11pxColor := GetGradientColorRect(GetBarGradientRect(ABarControl),
|
|
Top + 1, dxOffice11ToolbarsColor1,
|
|
dxOffice11ToolbarsColor2, False);
|
|
AColor := GetMiddleRGB(ADockColor, AC11pxColor, 50);
|
|
SetPixel(DC, Right - 2, Top, AColor);
|
|
SetPixel(DC, Right - 1, Top + 1, AColor);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
ADockColor := GetGradientColorRect(ABarControl.DockControl.ClientRect,
|
|
ABarControl.PointBarToDock(Point(Left, Bottom)).X, AColor1, AColor2, True);
|
|
if ABarControl.MarkExists then
|
|
begin
|
|
// #5 = #6, C1+1px
|
|
AC11pxColor := GetGradientColorRect(GetBarGradientRect(ABarControl),
|
|
Left + 1, dxOffice11ToolbarsColor1,
|
|
dxOffice11ToolbarsColor2, True);
|
|
AColor := GetMiddleRGB(AColor6, AC11pxColor, 50);
|
|
SetPixel(DC, Left, Bottom - MarkSizeX - 2, AColor);
|
|
// #6
|
|
SetPixel(DC, Left, Bottom - MarkSizeX - 1, AColor6);
|
|
SetPixel(DC, Left + 1, Bottom - 2, AColor6);
|
|
// #7 = #6, Dock
|
|
AColor := GetMiddleRGB(AColor6, ADockColor, 50);
|
|
SetPixel(DC, Left, Bottom - 2, AColor);
|
|
SetPixel(DC, Left + 1, Bottom - 1, AColor);
|
|
end
|
|
else
|
|
begin
|
|
// #5 = Dock, C1 + 1px
|
|
AC11pxColor := GetGradientColorRect(GetBarGradientRect(ABarControl),
|
|
Left + 1, dxOffice11ToolbarsColor1,
|
|
dxOffice11ToolbarsColor2, True);
|
|
AColor := GetMiddleRGB(ADockColor, AC11pxColor, 50);
|
|
SetPixel(DC, Left, Bottom - 2, AColor);
|
|
SetPixel(DC, Left + 1, Bottom - 1, AColor);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure DrawRightBorder(ARect: TRect);
|
|
var
|
|
R: TRect;
|
|
AClipRgn: HRGN;
|
|
AClipRgnExists: Boolean;
|
|
ADockColor, AColor1, AColor2, AColor: TColor;
|
|
begin
|
|
with ARect do
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
if not ABarControl.MarkExists then
|
|
begin
|
|
R := Rect(Right - 2, Top + 1, Right - 1, Bottom - 2);
|
|
FillBackground(DC, R);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
R := Rect(Right - 2, Top + 2, Right - 1, Bottom - 2);
|
|
if ABarControl.MarkExists then
|
|
Dec(R.Bottom, MarkSizeX);
|
|
FillBackground(DC, R);
|
|
end;
|
|
|
|
if ABarControl.MarkExists then
|
|
begin
|
|
SaveClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
IntersectClipRect(DC, Right - MarkSizeX - 2 + 2, Top, Right - 2, Top + 1);
|
|
AddClipRect(DC, Rect(Right - 2, Top + 2, Right, Bottom - 2));
|
|
AddClipRect(DC, Rect(Right - MarkSizeX - 1, Bottom - 1, Right - 2, Bottom));
|
|
AddClipRect(DC, Rect(Right - MarkSizeX, Bottom - 2, Right - 1, Bottom - 1));
|
|
R := Rect(Right - MarkSizeX - 1, Top, Right, Bottom);
|
|
end
|
|
else
|
|
begin
|
|
IntersectClipRect(DC, Left, Bottom - MarkSizeX, Left + 1, Bottom - 2);
|
|
AddClipRect(DC, Rect(Left + 2, Bottom - 2, Right - 2, Bottom));
|
|
AddClipRect(DC, Rect(Right - 2, Bottom - MarkSizeX, Right - 1, Bottom - 1));
|
|
AddClipRect(DC, Rect(Right - 1, Bottom - MarkSizeX - 1, Right, Bottom - 2));
|
|
R := Rect(Left, Bottom - MarkSizeX - 1, Right, Bottom);
|
|
end;
|
|
FillTubeGradientRect(DC, R, AMarkColor1, AMarkColor2, not ABarControl.Horizontal);
|
|
RestoreClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
// #8 = B, Dock
|
|
GetDockColors(ABarControl.DockControl, AColor1, AColor2);
|
|
ADockColor := GetGradientColorRect(ABarControl.DockControl.ClientRect,
|
|
ABarControl.PointBarToDock(Point(Right, Bottom)).X, AColor1, AColor2, True);
|
|
AColor := GetMiddleRGB(AMarkColor2, ADockColor, 50);
|
|
SetPixel(DC, Right - 1, Bottom - 2, AColor);
|
|
SetPixel(DC, Right - 2, Bottom - 1, AColor);
|
|
end
|
|
else
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
FillBackground(DC, Rect(Right - 1, Top + 2, Right, Bottom - 1))
|
|
else
|
|
FillBackground(DC, Rect(Left + 2, Bottom - 1, Right - 1, Bottom));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure DrawBottomBorder(ARect: TRect);
|
|
var
|
|
ADockColor, AColor1, AColor2, AColor: TColor;
|
|
R: TRect;
|
|
begin
|
|
with ARect do
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
R := Rect(Left + 2, Bottom - 2, Right - 2, Bottom - 1);
|
|
if ABarControl.MarkExists then
|
|
Dec(R.Right, MarkSizeX);
|
|
FillBackground(DC, R);
|
|
end
|
|
else
|
|
begin
|
|
if not ABarControl.MarkExists then
|
|
begin
|
|
R := Rect(Left + 1, Bottom - 2, Right - 2, Bottom - 1);
|
|
FillBackground(DC, R);
|
|
end;
|
|
end;
|
|
|
|
if ABarControl.MarkExists then
|
|
begin
|
|
// #9 = B, #2
|
|
AColor := GetMiddleRGB(AMarkColor2, dxOffice11BarBorderColors[2], 50);
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
SetPixel(DC, Right - 2 - MarkSizeX, Bottom - 1, AColor);
|
|
SetPixel(DC, Right - 1 - MarkSizeX, Bottom - 2, AColor);
|
|
SetPixel(DC, Right - 2 - MarkSizeX, Bottom - 2, dxOffice11BarBorderColors[2]);
|
|
FillRect(DC, Rect(Left + 2, Bottom - 1, Right - 2 - MarkSizeX, Bottom), B1);
|
|
end
|
|
else
|
|
begin
|
|
SetPixel(DC, Right - 2, Bottom - 1 - MarkSizeX, AColor);
|
|
SetPixel(DC, Right - 1, Bottom - 2 - MarkSizeX, AColor);
|
|
SetPixel(DC, Right - 2, Bottom - 2 - MarkSizeX, dxOffice11BarBorderColors[2]);
|
|
FillRect(DC, Rect(Right - 1, Top + 2, Right, Bottom - MarkSizeX - 2), B1);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
// #9 = Dock, #2
|
|
GetDockColors(ABarControl.DockControl, AColor1, AColor2);
|
|
ADockColor := GetGradientColorRect(ABarControl.DockControl.ClientRect,
|
|
ABarControl.PointBarToDock(Point(Right, Bottom)).X, AColor1, AColor2, True);
|
|
AColor := GetMiddleRGB(dxOffice11BarBorderColors[2], ADockColor, 50);
|
|
SetPixel(DC, Right - 2, Bottom - 1, AColor);
|
|
SetPixel(DC, Right - 1, Bottom - 2, AColor);
|
|
|
|
SetPixel(DC, Right - 2, Bottom - 2, dxOffice11BarBorderColors[2]);
|
|
if ABarControl.Horizontal then
|
|
FillRect(DC, Rect(Left + 2, Bottom - 1, Right - 2, Bottom), B1)
|
|
else
|
|
FillRect(DC, Rect(Right - 1, Top + 2, Right, Bottom - 2), B1);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure DrawBorder(ARect: TRect);
|
|
begin
|
|
DrawLeftBorder(ARect);
|
|
DrawTopBorder(ARect);
|
|
DrawRightBorder(ARect);
|
|
DrawBottomBorder(ARect);
|
|
with ARect do
|
|
begin
|
|
FillParentBackground(DC, Rect(Left, Top, Left + 1, Top + 1));
|
|
FillParentBackground(DC, Rect(Right - 1, Top, Right, Top + 1));
|
|
FillParentBackground(DC, Rect(Left, Bottom - 1, Left + 1, Bottom));
|
|
FillParentBackground(DC, Rect(Right - 1, Bottom - 1, Right, Bottom));
|
|
end;
|
|
end;
|
|
|
|
procedure DrawMainMenuBorder(ARect: TRect);
|
|
begin
|
|
with ARect do
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
FillParentBackground(DC, Rect(Left, Top, Right, Top + 2));
|
|
FillParentBackground(DC, Rect(Left, Bottom - 2, Right, Bottom));
|
|
end
|
|
else
|
|
begin
|
|
FillParentBackground(DC, Rect(Left, Top, Left + 2, Bottom));
|
|
FillParentBackground(DC, Rect(Right - 2, Top, Right, Bottom));
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
B1 := CreateSolidBrush(dxOffice11BarBorderColors[1]);
|
|
GetMarkColors(ABarControl, AMarkColor1, AMarkColor2, AColor6, AColor9);
|
|
if ABarControl.Bar.IsMainMenu then
|
|
DrawMainMenuBorder(R)
|
|
else
|
|
if ABarControl.Bar.BorderStyle = bbsSingle then
|
|
DrawBorder(R);
|
|
if ABarControl.Bar.CanMoving then
|
|
DrawFinger(R);
|
|
DeleteObject(B1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawFloatingBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; var R, CR: TRect; AToolbarBrush: HBRUSH);
|
|
var
|
|
I: Integer;
|
|
B1, B2: HBRUSH;
|
|
begin
|
|
if not ABarControl.IsInternal then
|
|
begin
|
|
B1 := CreateSolidBrush(dxOffice11BarFloatingBorderColor1);
|
|
B2 := CreateSolidBrush(dxOffice11BarFloatingBorderColor2);
|
|
FrameRect(DC, R, B1);
|
|
InflateRect(R, -1, -1);
|
|
FrameRect(DC, R, B1);
|
|
InflateRect(R, -1, -1);
|
|
FrameRect(DC, R, B2);
|
|
with R do
|
|
begin
|
|
FillRect(DC, Rect(Left, Top, Left + 1, Top + 1), B1);
|
|
FillRect(DC, Rect(Right - 1, Top, Right, Top + 1), B1);
|
|
FillRect(DC, Rect(Right - 1, Bottom - 1, Right, Bottom), B1);
|
|
FillRect(DC, Rect(Left, Bottom - 1, Left + 1, Bottom), B1);
|
|
end;
|
|
DeleteObject(B2);
|
|
DeleteObject(B1);
|
|
end
|
|
else
|
|
begin
|
|
FrameRect(DC, R, dxOffice11DropDownBorderBrush1);
|
|
for I := R.Left + 1 to CR.Left - 1 do
|
|
begin
|
|
InflateRect(R, -1, -1);
|
|
FrameRect(DC, R, AToolbarBrush);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawFloatingBarCaption(ABarControl: TdxBarControl;
|
|
DC: HDC; var R, CR: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
AToolbarBrush := CreateSolidBrush(dxOffice11BarFloatingBorderColor3);
|
|
TdxBarItemControlFlatPainter.BarDrawFloatingBarCaption(ABarControl, DC, R, CR, AToolbarBrush);
|
|
DeleteObject(AToolbarBrush);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawStatusBarGrip(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
if not ABarControl.BarManager.FThemeAvailable then
|
|
inherited
|
|
else
|
|
TdxBarItemControlXPPainter.BarDrawStatusBarGrip(ABarControl, DC, R, AToolbarBrush);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawStatusBarTopBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
if not ABarControl.BarManager.FThemeAvailable then
|
|
inherited
|
|
else
|
|
TdxBarItemControlXPPainter.BarDrawStatusBarTopBorder(ABarControl, DC, R, AToolbarBrush);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarMarkRect(ABarControl: TdxBarControl): TRect;
|
|
begin
|
|
Result := inherited BarMarkRect(ABarControl);
|
|
if not IsSimpleMark(ABarControl) then
|
|
case ABarControl.DockingStyle of
|
|
dsTop, dsBottom:
|
|
begin
|
|
Dec(Result.Top, 1);
|
|
Inc(Result.Right, 2);
|
|
Inc(Result.Bottom, 1);
|
|
end;
|
|
dsLeft, dsRight:
|
|
begin
|
|
Dec(Result.Left, 1);
|
|
Inc(Result.Right, 1);
|
|
Inc(Result.Bottom, 2);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarMarkRectInvalidate(ABarControl: TdxBarControl);
|
|
begin
|
|
inherited;
|
|
if ABarControl.DockingStyle <> dsNone then
|
|
SendMessage(ABarControl.Handle, WM_NCPAINT, 0, 0);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.StatusBarFillBackground(ABarControl: TdxBarControl;
|
|
DC: HDC; ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
begin
|
|
if not ABarControl.BarManager.FThemeAvailable then
|
|
inherited
|
|
else
|
|
TdxBarItemControlXPPainter.StatusBarFillBackground(ABarControl, DC, ADestR,
|
|
ASourceR, AWholeR, ABrush, AColor);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.StatusBarGripSize(ABarManager: TdxBarManager): TSize;
|
|
begin
|
|
if not ABarManager.FThemeAvailable then
|
|
Result := inherited StatusBarGripSize(ABarManager)
|
|
else
|
|
Result := TdxBarItemControlXPPainter.StatusBarGripSize(ABarManager);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.StatusBarTopBorderSize(ABarManager: TdxBarManager): Integer;
|
|
begin
|
|
if not ABarManager.FThemeAvailable then
|
|
Result := inherited StatusBarTopBorderSize(ABarManager)
|
|
else
|
|
Result := TdxBarItemControlXPPainter.StatusBarTopBorderSize(ABarManager);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.IsSingleMenuBorder(ABarSubMenuControl: TdxBarSubMenuControl): Boolean;
|
|
begin
|
|
Result := not ABarSubMenuControl.GetBackgroundBitmap.Empty or
|
|
(ABarSubMenuControl.BarSize <> 0);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.SubMenuControlCalcDrawingConsts(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ATextSize, AMenuArrowWidth, AMarkSize, ANormalItemHeight: Integer);
|
|
begin
|
|
inherited;
|
|
AMarkSize := dxOffice11SubMenuExpandBitmap.Height + 2;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.SubMenuControlDrawBackground(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; ARect: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
var
|
|
W1: Integer;
|
|
W2: Integer;
|
|
AColor1, AColor2: TColor;
|
|
AClipRgn: HRGN;
|
|
AClipRgnExists: Boolean;
|
|
begin
|
|
if not ABarSubMenuControl.GetBackgroundBitmap.Empty then
|
|
inherited
|
|
else
|
|
begin
|
|
W1 := ABarSubMenuControl.GetIndent1;
|
|
W2 := ABarSubMenuControl.GetIndent2;
|
|
SaveClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
with ARect do
|
|
begin
|
|
IntersectClipRect(DC, Left, Top, Right, Bottom);
|
|
// fill
|
|
if ABarSubMenuControl.FNonRecent then
|
|
begin
|
|
AColor1 := dxOffice11MenuNonRecentIndentColor1;
|
|
AColor2 := dxOffice11MenuNonRecentIndentColor2;
|
|
end
|
|
else
|
|
begin
|
|
AColor1 := dxOffice11MenuIndentColor1;
|
|
AColor2 := dxOffice11MenuIndentColor2;
|
|
end;
|
|
FillTubeGradientRect(DC, Rect(0, Top, W1, Bottom), AColor1, AColor2, True);
|
|
if W2 <> 0 then
|
|
FillRectByColor(DC, Rect(W1, Top, W1 + W2, Bottom), AColor2);
|
|
if Right > (W1 + W2) then
|
|
FillRect(DC, Rect(W1 + W2, Top, Right, Bottom), ABrush);
|
|
end;
|
|
RestoreClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.SubMenuControlDrawClientBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; var R: TRect; ABrush: HBRUSH);
|
|
begin
|
|
if IsSingleMenuBorder(ABarSubMenuControl) then
|
|
FrameRect(DC, R, dxOffice11MenuBrush)
|
|
else
|
|
with R do
|
|
begin
|
|
FillRect(DC, Rect(Left, Top, Right, Top + 1), dxOffice11MenuBrush);
|
|
FillRect(DC, Rect(Right - 1, Top, Right, Bottom), dxOffice11MenuBrush);
|
|
FillRect(DC, Rect(Left, Bottom - 1, Right, Bottom), dxOffice11MenuBrush);
|
|
// Indent
|
|
FillRectByColor(DC, Rect(Left, Top + 1, Left + 1, Bottom - 1), dxOffice11MenuIndentColor1);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.SubMenuControlDetachCaptionAreaSize(ABarSubMenuControl: TdxBarSubMenuControl): Integer;
|
|
begin
|
|
Result := ABarSubMenuControl.DetachCaptionSize + 5;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.SubMenuControlDrawBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect);
|
|
|
|
procedure DrawFlatBorder;
|
|
var
|
|
ARect: TRect;
|
|
begin
|
|
FrameRect(DC, R, dxOffice11DropDownBorderBrush1);
|
|
ARect := ABarSubMenuControl.OwnerLinkBounds[False];
|
|
if not IsRectEmpty(ARect) then
|
|
FillRect(DC, ARect, dxOffice11MenuBrush);
|
|
end;
|
|
|
|
begin
|
|
with R do
|
|
begin
|
|
DrawFlatBorder;
|
|
if ABarSubMenuControl.Detachable then
|
|
begin
|
|
InflateRect(R, -1, -1);
|
|
Bottom := Top + ABarSubMenuControl.DetachCaptionSize + 3 + 2;
|
|
FrameRect(DC, R, dxOffice11MenuBrush);
|
|
InflateRect(R, 0, -1);
|
|
FillRect(DC, Rect(Left, Top, Right, Top + 2), dxOffice11MenuBrush);
|
|
FillRect(DC, Rect(Left, Bottom - 1, Right, Bottom), dxOffice11MenuBrush);
|
|
SubMenuControlDrawDetachCaption(ABarSubMenuControl, DC, ABarSubMenuControl.DetachCaptionRect);
|
|
end;
|
|
end
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.SubMenuControlDrawDetachCaption(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect);
|
|
var
|
|
ABrush: HBRUSH;
|
|
DXY: Integer;
|
|
begin
|
|
if ABarSubMenuControl.DetachCaptionSelected then
|
|
begin
|
|
Office11FrameSelectedRect(DC, R);
|
|
InflateRect(R, -1, -1);
|
|
ABrush := dxOffice11DetachableSelectedBrush;
|
|
DXY := 0;
|
|
end
|
|
else
|
|
begin
|
|
ABrush := dxOffice11DetachableBrush;
|
|
DXY := 1;
|
|
end;
|
|
FillRect(DC, R, ABrush);
|
|
// draw marks
|
|
InflateRect(R, -(((R.Right - R.Left + DXY * 2) div 4)), -(DXY + 1));
|
|
BarDrawFingerElements(ABarSubMenuControl, DC, R, False);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.SubMenuControlGroupSeparatorBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH;
|
|
begin
|
|
Result := dxOffice11BarSeparatorBrush1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.SubMenuControlOffsetDetachCaptionRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var R: TRect);
|
|
begin
|
|
InflateRect(R, -2, -4);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.SubMenuControlToolbarItemsBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH;
|
|
begin
|
|
Result := dxOffice11MenuBrush;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DropDownListBoxDrawBorder(ABarManager: TdxBarManager;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
FrameRect(DC, R, dxOffice11DropDownBorderBrush1);
|
|
InflateRect(R, -1, -1);
|
|
FrameRect(DC, R, dxOffice11DropDownBorderBrush2);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarToolbarBrushEx2(ABarControl: TdxBarControl): HBRUSH;
|
|
begin
|
|
Result := dxOffice11MenuBrush;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DrawQuickCustItemFrame(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R, ARect: TRect; Selected: Boolean);
|
|
begin
|
|
with R do
|
|
begin
|
|
if not Selected then
|
|
DrawBackgroundFrameRect(ABarItemControl, DC,
|
|
Rect(Left, Top, Left + (Bottom - Top), Bottom),
|
|
BarToolbarBrush(ABarItemControl.Parent), False);
|
|
InflateRect(R, -1, -1);
|
|
// inherited?
|
|
Right := Left + Bottom - Top;
|
|
end;
|
|
ARect.Left := R.Right + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DrawQuickCustItemFrameSelected(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; WholeR, R: TRect; Selected: Boolean);
|
|
begin
|
|
if Selected then
|
|
begin
|
|
Office11FrameSelectedRect(DC, WholeR);
|
|
with R do
|
|
begin
|
|
Left := Right;
|
|
Right := Left + 2; // paint over!
|
|
end;
|
|
FillRect(DC, R, ABarItemControl.Parent.ToolbarSelBrush);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.EditControlCaptionWidth(ABarEditControl: TdxBarEditControl;
|
|
ATextWidth: Integer): Integer;
|
|
begin
|
|
Result := inherited EditControlCaptionWidth(ABarEditControl, ATextWidth);
|
|
if ABarEditControl.Parent is TdxBarSubMenuControl then
|
|
Result := Result + TdxBarSubMenuControl(ABarEditControl.Parent).GetIndent1 + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.EditControlDrawBorder(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean);
|
|
begin
|
|
if Selected then
|
|
Office11FrameSelectedRect(DC, ARect)
|
|
else
|
|
if not ABarEditControl.Enabled then
|
|
FrameRectByColor(DC, ARect, dxOffice11TextDisabledColor)
|
|
else
|
|
if PaintType = ptMenu then
|
|
FrameRect(DC, ARect, dxOffice11OwnerControlDownedBrush)
|
|
else
|
|
DrawBackgroundFrameRect(ABarEditControl, DC, ARect, ABarEditControl.Parent.BkBrush, False);
|
|
InflateRect(ARect, -1, -1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.EditControlDrawCaption(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean);
|
|
var
|
|
S: string;
|
|
Size: TSize;
|
|
R: TRect;
|
|
Brush: HBRUSH;
|
|
begin
|
|
// TODO
|
|
S := GetTextOf(ABarEditControl.Caption);
|
|
GetTextExtentPoint32(DC, PChar(S), Length(S), Size);
|
|
R := ARect;
|
|
R.Right := R.Left + EditControlCaptionWidth(ABarEditControl, Size.cX);
|
|
ARect.Left := R.Right;
|
|
if Selected and (PaintType = ptMenu) then
|
|
begin
|
|
Inc(R.Right);
|
|
Office11FrameSelectedRect(DC, R);
|
|
InflateRect(R, -1, -1);
|
|
end;
|
|
if Selected and (PaintType = ptMenu) then
|
|
Brush := ABarEditControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := ABarEditControl.Parent.BkBrush;
|
|
DrawBackground(ABarEditControl, DC, R, Brush, (PaintType = ptMenu) and Selected);
|
|
Dec(R.Right, 5);
|
|
DrawItemText(ABarEditControl, DC, ABarEditControl.Caption, R, DT_RIGHT,
|
|
ABarEditControl.Enabled, Selected and (PaintType = ptMenu), False, False, not IsHighContrastWhite);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DrawButtonControlArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R1: TRect; Brush: HBRUSH; ArrowColor: COLORREF; Selected, DrawDowned, DroppedDown,
|
|
DropDownEnabled, IsDropDownMenuControlExist: Boolean; PaintType: TdxBarPaintType);
|
|
begin
|
|
if PaintType <> ptMenu then Dec(R1.Left);
|
|
if (PaintType = ptMenu) or not (DroppedDown and IsDropDownMenuControlExist) then
|
|
begin
|
|
if (PaintType = ptMenu) or Selected then
|
|
if Selected then
|
|
Office11FrameSelectedRect(DC, R1)
|
|
else
|
|
FrameRect(DC, R1, dxOffice11BarSeparatorBrush1)
|
|
else
|
|
DrawBackgroundFrameRect(ABarItemControl, DC, R1, Brush, False);
|
|
InflateRect(R1, -1, -1);
|
|
DrawBackground(ABarItemControl, DC, R1, Brush,
|
|
DroppedDown or DrawDowned or Selected or ABarItemControl.FNonRecent);
|
|
InflateRect(R1, 1, 1);
|
|
end;
|
|
|
|
if PaintType = ptMenu then
|
|
DrawLargeItemArrow(DC, R1, atRight, ABarItemControl.Parent.MenuArrowHeight,
|
|
(IsHighContrastWhite and Selected) or DroppedDown,
|
|
ABarItemControl.Enabled and DropDownEnabled, True{Flat})
|
|
else
|
|
DrawItemArrow(DC, R1, atDown, ABarItemControl.Enabled and DropDownEnabled,
|
|
Selected and not DroppedDown and IsHighContrastWhite, True{Flat});
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.ComboControlDrawArrow(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; Selected: Boolean; PaintType: TdxBarPaintType);
|
|
const
|
|
Borders: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);
|
|
var
|
|
Brush, SpaceBrush: HBRUSH;
|
|
ArrowColor: COLORREF;
|
|
X, Y, Size: Integer;
|
|
AColor1, AColor2: TColor;
|
|
begin
|
|
with ARect do
|
|
begin
|
|
Left := Right - ABarComboControl.Parent.ComboBoxArrowWidth;
|
|
ABarComboControl.FDropDownButtonRect := ARect;
|
|
|
|
ComboControlGetArrowParams(ABarComboControl, PaintType, ABarComboControl.Enabled,
|
|
Selected, ABarComboControl.DroppedDown, Brush, ArrowColor);
|
|
|
|
if Selected then
|
|
begin
|
|
InflateRect(ARect, 1, 1);
|
|
Office11FrameSelectedRect(DC, ARect);
|
|
InflateRect(ARect, -1, -1);
|
|
GetSelectedColors(ABarComboControl, ABarComboControl.DroppedDown, Selected, AColor1, AColor2);
|
|
FillGradientRect(DC, ARect, AColor1, AColor2, False);
|
|
end
|
|
else
|
|
begin
|
|
if ABarComboControl.Enabled then
|
|
SpaceBrush := GetSysColorBrush(COLOR_WINDOW)
|
|
else
|
|
SpaceBrush := Brush;
|
|
FrameRect(DC, ARect, SpaceBrush);
|
|
FillRect(DC, Rect(Left - 1, Top, Left, Bottom), SpaceBrush);
|
|
InflateRect(ARect, -1, -1);
|
|
if (PaintType = ptMenu) and ABarComboControl.Enabled then
|
|
FillRect(DC, ARect, dxOffice11OwnerControlDownedBrush)
|
|
else
|
|
DrawBackground(ABarComboControl, DC, ARect, Brush, not ABarComboControl.Enabled);
|
|
if ABarComboControl.DroppedDown then OffsetRect(ARect, 1, 1);
|
|
end;
|
|
|
|
if Selected then
|
|
InflateRect(ARect, -1, -1);
|
|
with ARect do
|
|
begin
|
|
Size := (Right - Left) div 2;
|
|
if not Odd(Size) then Inc(Size);
|
|
X := (Left + Right - Size) div 2;
|
|
Y := (Top + Bottom - Size div 2) div 2;
|
|
ComboControlDrawOneArrow(ABarComboControl, DC, X, Y, Size, ArrowColor);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.ComboControlGetArrowParams(ABarItemControl: TdxBarItemControl;
|
|
APaintType: TdxBarPaintType; AEnabled, ASelected, ADroppedDown: Boolean; var ABrush: HBRUSH;
|
|
var AArrowColor: COLORREF);
|
|
begin
|
|
GetArrowParams(ABarItemControl, APaintType, AEnabled, ASelected, ADroppedDown, ABrush, AArrowColor);
|
|
if AEnabled then
|
|
begin
|
|
if ASelected then
|
|
ABrush := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
if ADroppedDown then
|
|
ABrush := ABarItemControl.Parent.ToolbarDownedSelBrush;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.ProgressControlIndent(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
Result := 0;
|
|
if not ABarItemControl.ImageExists then
|
|
begin
|
|
if ABarItemControl.Parent is TdxBarSubMenuControl then
|
|
Inc(Result, TdxBarSubMenuControl(ABarItemControl.Parent).GetIndent1);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DateNavigatorDrawButton(ABarItem: TdxBarItem;
|
|
DC: HDC; R: TRect; const ACaption: string; APressed: Boolean);
|
|
begin
|
|
if not ABarItem.BarManager.FThemeAvailable then
|
|
inherited
|
|
else
|
|
TdxBarItemControlXPPainter.DateNavigatorDrawButton(ABarItem, DC, R, ACaption, APressed);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.DateNavigatorHeaderColor: TColor;
|
|
begin
|
|
Result := dxOffice11DateHeaderColor;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.InPlaceSubItemControlBrush: HBRUSH;
|
|
begin
|
|
Result := dxOffice11InPlaceSubItemBrush;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DrawGlyphBorder(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; PaintType: TdxBarPaintType; IsGlyphEmpty,
|
|
Selected, Down, DrawDowned, BarControlOwner, IsSplit: Boolean);
|
|
var
|
|
AOpaque, AVertical: Boolean;
|
|
AColor1, AColor2: TColor;
|
|
begin
|
|
if (PaintType = ptMenu) and Selected and IsGlyphEmpty and not Down then
|
|
FillRect(DC, R, ABrush)
|
|
else
|
|
begin
|
|
AOpaque := Selected or Down or DrawDowned;
|
|
AVertical := IsRealVertical(ABarItemControl.Parent);
|
|
if Down and IsMenuGradient(ABarItemControl) then
|
|
FillGradientRect(DC, R, dxOffice11MenuDownedColor1,
|
|
dxOffice11MenuDownedColor2, AVertical)
|
|
else
|
|
begin
|
|
if (PaintType <> ptMenu) and (Selected or Down or DrawDowned) then
|
|
begin
|
|
GetSelectedColors(ABarItemControl, Down or DrawDowned, Selected, AColor1, AColor2);
|
|
FillGradientRect(DC, R, AColor1, AColor2, AVertical);
|
|
end
|
|
else
|
|
DrawBackground(ABarItemControl, DC, R, ABrush, AOpaque);
|
|
end;
|
|
|
|
if Down or (Selected and (PaintType <> ptMenu)) then
|
|
begin
|
|
if Down and BarControlOwner then
|
|
BarDrawBarControlOwnerBorder(ABarItemControl.Parent, DC, R, ABarItemControl, ABarItemControl.OwnedBarControl)
|
|
else
|
|
if Selected or
|
|
(Down and (ABarItemControl is TdxBarButtonControl) and TdxBarButtonControl(ABarItemControl).Down) then
|
|
Office11FrameSelectedRect(DC, R)
|
|
else
|
|
FrameRect(DC, R, dxOffice11DropDownBorderBrush1);
|
|
end
|
|
else
|
|
if NeedBorder then
|
|
DrawBackgroundFrameRect(ABarItemControl, DC, R, ABrush, AOpaque);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DrawGlyphImage(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; const GlyphRect: TRect;
|
|
AGlyph: TBitmap; AImages: TCurImageList; AImageIndex: Integer; Selected, Down,
|
|
DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner: Boolean;
|
|
PaintType: TdxBarPaintType);
|
|
begin
|
|
if NeedBorder then InflateRect(R, -1, -1);
|
|
TransparentDraw(DC, ABrush, R, GlyphRect,
|
|
AGlyph, AImages, AImageIndex,
|
|
ABarItemControl.GetImageEnabled(PaintType), GrayScale, False{Flat}, Selected, Down, DrawDowned,
|
|
False{Shadow}, True{Transparent}, GetFadedColor(ABarItemControl.Parent){Faded}, ABarItemControl.Item.BarManager.ImageListBkColor);
|
|
if NeedBorder then InflateRect(R, 1, 1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DrawItemArrow(DC: HDC; R: TRect;
|
|
ArrowType: TdxArrowType; Enabled, Selected, Flat: Boolean);
|
|
begin
|
|
Office11DrawItemArrow(DC, R, ArrowType = atDown, Enabled, Selected, Flat);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.DrawLargeItemArrow(DC: HDC; R: TRect;
|
|
ArrowType: TdxArrowType; Size: Integer; Selected, Enabled, Flat: Boolean);
|
|
begin
|
|
Office11DrawLargeItemArrow(DC, R, ArrowType = atDown, Size, Selected, Enabled, Flat);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.FrameFlatSelRect(DC: HDC; const R: TRect);
|
|
begin
|
|
Office11FrameSelectedRect(DC, R);
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.GetBarGradientRect(ABarControl: TCustomdxBarControl): TRect;
|
|
begin
|
|
Result := Rect(0, 0, ABarControl.Width, ABarControl.Height);
|
|
if ABarControl is TdxBarControl then
|
|
begin
|
|
if TdxBarControl(ABarControl).Horizontal then
|
|
InflateRect(Result, 0, -1)
|
|
else
|
|
InflateRect(Result, -1, 0);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.GetDockColors(ADockControl: TdxDockControl; var AColor1, AColor2: TColor);
|
|
begin
|
|
AColor1 := dxOffice11DockColor1;
|
|
AColor2 := dxOffice11DockColor2;
|
|
if ADockControl.Align = alLeft then
|
|
AColor2 := AColor1
|
|
else
|
|
if ADockControl.Align = alRight then
|
|
AColor1 := AColor2;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.GetMarkColors(ABarControl: TdxBarControl;
|
|
var AMarkColor1, AMarkColor2, AColor6, AColor9: TColor);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
I := Integer(ABarControl.MarkState) + 1;
|
|
AMarkColor1 := dxOffice11BarMarkColors1[I];
|
|
AMarkColor2 := dxOffice11BarMarkColors2[I];
|
|
AColor6 := dxOffice11BarBorderMarkColors[1, I];
|
|
AColor9 := dxOffice11BarBorderMarkColors[2, I];
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.GetSelectedColors(ABarItemControl: TdxBarItemControl;
|
|
ADown, ASelected: Boolean; var AColor1, AColor2: TColor);
|
|
begin
|
|
if ABarItemControl.Parent.IsInternal then
|
|
begin
|
|
if ADown then
|
|
AColor1 := dxOffice11OwnerControlDownedColor
|
|
else
|
|
AColor1 := dxOffice11SelectedColor1;
|
|
AColor2 := AColor1;
|
|
end
|
|
else
|
|
begin
|
|
if ADown then
|
|
begin
|
|
if not ASelected then
|
|
begin
|
|
AColor1 := dxOffice11SelectedDownColor1;
|
|
AColor2 := dxOffice11SelectedDownColor2;
|
|
if AColor1 = AColor2 then
|
|
begin
|
|
AColor1 := dxOffice11DownedColor; //dxOffice11SelectedColor1;
|
|
AColor2 := AColor1;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
AColor1 := dxOffice11SelectedDownColor2;
|
|
AColor2 := dxOffice11SelectedDownColor1;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
AColor1 := dxOffice11SelectedColor1;
|
|
AColor2 := dxOffice11SelectedColor2;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.GetEditColors(ABarItemControl: TdxBarItemControl;
|
|
var ATextColor, ABkColor: COLORREF);
|
|
begin
|
|
if ABarItemControl.Enabled then
|
|
begin
|
|
ATextColor := dxOffice11TextEnabledColor;
|
|
ABkColor := GetSysColor(COLOR_WINDOW);
|
|
end
|
|
else
|
|
begin
|
|
ATextColor := dxOffice11TextDisabledColor;
|
|
ABkColor := GetSysColor(COLOR_BTNFACE);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.GetFadedColor(ABarControl: TCustomdxBarControl): TColor;
|
|
begin
|
|
Result := dxOffice11BarMarkColors1[1];
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.GetTextColors(ABarItemControl: TdxBarItemControl;
|
|
AEnabled, ASelected, AFlat: Boolean; var AColor1, AColor2: TColor);
|
|
begin
|
|
if AEnabled then
|
|
begin
|
|
if (ABarItemControl.IsInvertTextColor or True) and ASelected and not AFlat then
|
|
begin
|
|
AColor1 := dxOffice11InPlaceSubItemTextColor; // GetSysColor(COLOR_HIGHLIGHTTEXT)
|
|
if IsHighContrastWhite then
|
|
AColor1 := clWhite;
|
|
end
|
|
else
|
|
AColor1 := dxOffice11TextEnabledColor;
|
|
end
|
|
else
|
|
AColor1 := dxOffice11TextDisabledColor;
|
|
AColor2 := AColor1;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.IgnoreNonRecentColor: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.IsMenuGradient(ABarItemControl: TdxBarItemControl): Boolean;
|
|
begin
|
|
Result := not ABarItemControl.Parent.IsInternal and ((ABarItemControl is TdxBarSubItemControl) or
|
|
((ABarItemControl is TdxBarButtonControl) and TdxBarButtonControl(ABarItemControl).DroppedDownFlat));
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.IsSimpleMark(ABarControl: TdxBarControl): Boolean;
|
|
begin
|
|
Result := (ABarControl.Bar.BorderStyle = bbsNone) or ABarControl.Bar.IsMainMenu;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarCaptionBkColor(ABarControl: TdxBarControl; AMainFormActive: Boolean): COLORREF;
|
|
begin
|
|
Result := dxOffice11BarFloatingCaptionColor;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarCaptionColor(ABarControl: TdxBarControl): COLORREF;
|
|
begin
|
|
Result := dxOffice11BarFloatingCaptionTextColor1;
|
|
end;
|
|
|
|
class function TdxBarItemControlOffice11Painter.BarMarkArrowColor(ABarControl: TdxBarControl;
|
|
AState: TdxBarMarkState): COLORREF;
|
|
begin
|
|
case AState of
|
|
msSelected:
|
|
Result := dxOffice11BarFloatingCaptionTextColor2;
|
|
msPressed:
|
|
Result := dxOffice11BarFloatingCaptionTextColor3;
|
|
else // msNone
|
|
Result := dxOffice11BarFloatingCaptionTextColor1;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawFingerElements(ABarControl: TCustomdxBarControl;
|
|
DC: HDC; ARect: TRect; AHorizontal: Boolean);
|
|
begin
|
|
Office11DrawFingerElements(DC, ARect, AHorizontal);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawMarkBackground(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH);
|
|
var
|
|
R1, R2, R3: TRect;
|
|
C1, C2, AColor6, C4: TColor;
|
|
AC11pxColor, AColor: TColor;
|
|
begin
|
|
// TODO: states and colors
|
|
GetMarkColors(ABarControl, C1, C2, AColor6, C4);
|
|
if (ABarControl.Bar.BorderStyle = bbsNone) or
|
|
ABarControl.Bar.IsMainMenu then
|
|
begin
|
|
R2 := ItemRect;
|
|
{ if ABarControl.Bar.IsMainMenu then
|
|
begin
|
|
InflateRect(R2, 0, -1);
|
|
with R2 do
|
|
begin
|
|
ABarControl.FillBackground(DC, Rect(Left, Top - 1, Right, Top), AToolbarBrush, clNone, True);
|
|
ABarControl.FillBackground(DC, Rect(Left, Bottom, Right, Bottom + 1), AToolbarBrush, clNone, True);
|
|
end;
|
|
end;}
|
|
end
|
|
else
|
|
begin
|
|
R1 := ItemRect;
|
|
R2 := ItemRect;
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
R1.Right := R1.Left + 2;
|
|
Inc(R2.Left, 2);
|
|
InflateRect(R2, 0, 2);
|
|
with R1 do
|
|
R3 := Rect(Right - 1, Top, Right, Top + 1);
|
|
AC11pxColor := GetGradientColorRect(GetBarGradientRect(ABarControl),
|
|
R3.Top + 2, dxOffice11ToolbarsColor1,
|
|
dxOffice11ToolbarsColor2, False);
|
|
end
|
|
else
|
|
begin
|
|
R1.Bottom := R1.Top + 2;
|
|
Inc(R2.Top, 2);
|
|
InflateRect(R2, 2, 0);
|
|
with R1 do
|
|
R3 := Rect(Left, Bottom - 1, Left + 1, Bottom);
|
|
AC11pxColor := GetGradientColorRect(GetBarGradientRect(ABarControl),
|
|
R3.Left + 2, dxOffice11ToolbarsColor1,
|
|
dxOffice11ToolbarsColor2, True);
|
|
end;
|
|
ABarControl.FillBackground(DC, R1, AToolbarBrush, clNone, True);
|
|
|
|
AColor := GetMiddleRGB(AColor6, AC11pxColor, 50);
|
|
SetPixel(DC, R3.Left, R3.Top, AColor);
|
|
end;
|
|
FillTubeGradientRect(DC, R2, C1, C2, not ABarControl.Horizontal);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.BarDrawMarkElements(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect);
|
|
|
|
procedure DrawArrow(X, Y: Integer; AVertical: Boolean; AColor: COLORREF);
|
|
const
|
|
YOffset = 3;
|
|
var
|
|
P: array[1..3] of TPoint;
|
|
APrevPen: HPEN;
|
|
APrevBrush, ABrush: HBRUSH;
|
|
begin
|
|
ABrush := CreateSolidBrush(AColor);
|
|
if AVertical then
|
|
begin
|
|
FillRect(DC, Rect(X, Y, X + 1, Y + 5), ABrush);
|
|
P[1] := Point(X + YOffset, Y);
|
|
P[2] := Point(X + YOffset, Y + 4);
|
|
P[3] := Point(X + YOffset + 2, Y + 2);
|
|
end
|
|
else
|
|
begin
|
|
FillRect(DC, Rect(X, Y, X + 5, Y + 1), ABrush);
|
|
P[1] := Point(X, Y + YOffset);
|
|
P[2] := Point(X + 4, Y + YOffset);
|
|
P[3] := Point(X + 2, Y + 2 + YOffset);
|
|
end;
|
|
APrevPen := SelectObject(DC, CreatePen(PS_SOLID, 1, AColor));
|
|
APrevBrush := SelectObject(DC, ABrush);
|
|
Polygon(DC, P, 3);
|
|
SelectObject(DC, APrevBrush);
|
|
DeleteObject(SelectObject(DC, APrevPen));
|
|
DeleteObject(ABrush);
|
|
end;
|
|
|
|
procedure DrawArrows(X, Y: Integer; Vertical: Boolean);
|
|
begin
|
|
DrawArrow(X + 1, Y + 1, Vertical, dxOffice11BarMarkArrowColor2);
|
|
DrawArrow(X, Y, Vertical, dxOffice11BarMarkArrowColor1);
|
|
end;
|
|
|
|
procedure DrawMark(X, Y: Integer; AVertical: Boolean; AColor: COLORREF);
|
|
var
|
|
P: array[1..3] of TPoint;
|
|
APrevPen: HPEN;
|
|
APrevBrush: HBRUSH;
|
|
begin
|
|
if AVertical then
|
|
begin
|
|
P[1] := Point(X, Y);
|
|
P[2] := Point(X + 1, Y + 1);
|
|
P[3] := Point(X + 2, Y);
|
|
end
|
|
else
|
|
begin
|
|
P[1] := Point(X, Y);
|
|
P[2] := Point(X + 1, Y + 1);
|
|
P[3] := Point(X, Y + 2);
|
|
end;
|
|
APrevPen := SelectObject(DC, CreatePen(PS_SOLID, 1, AColor));
|
|
APrevBrush := SelectObject(DC, CreateSolidBrush(AColor));
|
|
Polygon(DC, P, 3);
|
|
DeleteObject(SelectObject(DC, APrevBrush));
|
|
DeleteObject(SelectObject(DC, APrevPen));
|
|
end;
|
|
|
|
procedure DrawMarks(X, Y: Integer; Vertical: Boolean);
|
|
var
|
|
AOffsetX, AOffsetY: Integer;
|
|
begin
|
|
DrawMark(X + 1, Y + 1, Vertical, dxOffice11BarMarkArrowColor2);
|
|
DrawMark(X, Y, Vertical, dxOffice11BarMarkArrowColor1);
|
|
if Vertical then
|
|
begin
|
|
AOffsetX := 0;
|
|
AOffsetY := 4;
|
|
end
|
|
else
|
|
begin
|
|
AOffsetX := 4;
|
|
AOffsetY := 0;
|
|
end;
|
|
DrawMark(X + 1 + AOffsetX, Y + 1 + AOffsetY, Vertical, dxOffice11BarMarkArrowColor2);
|
|
DrawMark(X + AOffsetX, Y + AOffsetY, Vertical, dxOffice11BarMarkArrowColor1);
|
|
end;
|
|
|
|
var
|
|
AOffsetX, AOffsetY: Integer;
|
|
begin
|
|
with ItemRect do
|
|
begin
|
|
if (ABarControl.Bar.BorderStyle = bbsNone) or
|
|
ABarControl.Bar.IsMainMenu then
|
|
begin
|
|
AOffsetX := 2;
|
|
AOffsetY := 1;
|
|
end
|
|
else
|
|
begin
|
|
AOffsetX := 0;
|
|
AOffsetY := 0;
|
|
end;
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
DrawArrows(Right - 6 - AOffsetX, Bottom - 8 - AOffsetY, False);
|
|
if ABarControl.FTruncated then
|
|
DrawMarks(Right - 7 - AOffsetX, Top + 3 - AOffsetY, False); // TODO
|
|
end
|
|
else
|
|
begin
|
|
DrawArrows(Right - 8 - AOffsetY, Bottom - 6 - AOffsetX, True);
|
|
if ABarControl.FTruncated then
|
|
DrawMarks(Left + 3 - AOffsetX, Bottom - 7 - AOffsetY, True); // TODO
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.SubMenuControlDrawMark(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect; ASelected: Boolean);
|
|
begin
|
|
InflateRect(R, -1, -1);
|
|
R.Left := (R.Right + R.Left) div 2 - dxOffice11SubMenuExpandBitmap.Width div 2;
|
|
R.Right := R.Left + dxOffice11SubMenuExpandBitmap.Width;
|
|
TransparentDraw(DC, ABarSubMenuControl.BkBrush, R, R, dxOffice11SubMenuExpandBitmap,
|
|
nil, -1, True, False, False{Flat}, False, False, False, False{Shadow}, True{Transparent},
|
|
clNone{Faded}, clNone);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlOffice11Painter.ComboControlDrawOneArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; X, Y, Size: Integer; Color: COLORREF);
|
|
var
|
|
Brush: HBRUSH;
|
|
P: array[1..3] of TPoint;
|
|
Pen: HPEN;
|
|
begin
|
|
P[1] := Point(X, Y);
|
|
P[2] := Point(X + Size - 1, Y);
|
|
P[3] := Point(X + Size div 2, Y + Size div 2);
|
|
Pen := SelectObject(DC, CreatePen(PS_SOLID, 1, Color));
|
|
Brush := SelectObject(DC, CreateSolidBrush(Color));
|
|
Polygon(DC, P, 3);
|
|
DeleteObject(SelectObject(DC, Brush));
|
|
DeleteObject(SelectObject(DC, Pen));
|
|
end;
|
|
|
|
{ TdxBarItemControlXPPainter }
|
|
|
|
class procedure TdxBarItemControlXPPainter.DrawGlyphAndTextInSubMenu(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect; Selected, ShowGlyph, Down: Boolean);
|
|
var
|
|
IconRect: TRect;
|
|
IsGlyphEmpty, AOpaque: Boolean;
|
|
Brush: HBRUSH;
|
|
begin
|
|
// TODO: !!!
|
|
with R do
|
|
begin
|
|
IconRect := R;
|
|
IconRect.Right := IconRect.Left + Bottom - Top;
|
|
IsGlyphEmpty := not ABarItemControl.ImageExists or not ShowGlyph;
|
|
|
|
DrawGlyph(ABarItemControl, IconRect, nil, ptMenu, IsGlyphEmpty, Selected,
|
|
Down, False, False, False, False, False);
|
|
if Selected and (IsGlyphEmpty and not Down) then
|
|
Brush := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := ABarItemControl.Parent.BkBrush;
|
|
Left := IconRect.Right + 1;
|
|
AOpaque := Selected or ABarItemControl.FNonRecent;
|
|
with IconRect do
|
|
DrawBackground(ABarItemControl, DC, Rect(Right, Top, R.Left, Bottom), Brush, AOpaque);
|
|
|
|
if Selected then
|
|
Brush := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := ABarItemControl.Parent.BkBrush;
|
|
DrawBackground(ABarItemControl, DC, R, Brush, AOpaque);
|
|
Inc(Left, 2);
|
|
DrawItemText(ABarItemControl, DC, ABarItemControl.Caption, R, DT_LEFT,
|
|
ABarItemControl.Enabled, Selected, False, False, False);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.DrawLowered(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; var R: TRect);
|
|
begin
|
|
TdxBarItemControlStandardPainter.DrawLowered(ABarItemControl, DC, R);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.GlyphBkgndBrush(ABarItemControl: TdxBarItemControl;
|
|
PaintType: TdxBarPaintType; IsGlyphEmpty, Selected, Down, DrawDowned,
|
|
ForceUseBkBrush, GrayScale, BarControlOwner: Boolean): HBRUSH;
|
|
begin
|
|
if Selected and (PaintType = ptMenu) and IsGlyphEmpty and not Down then // TODO: ref func
|
|
Result := ABarItemControl.Parent.ToolbarSelBrush
|
|
else
|
|
Result := ABarItemControl.Parent.BkBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.GlyphDownShift(ABarItemControl: TdxBarItemControl): Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.GlyphDrawDownedShift(ABarItemControl: TdxBarItemControl;
|
|
ADown: Boolean): Integer;
|
|
begin
|
|
if not ADown then
|
|
Result := 1
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BeforeFingersSize: Integer;
|
|
begin
|
|
// Result := 3;
|
|
Result := 0;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.FingersSize: Integer;
|
|
begin
|
|
Result := BeforeFingersSize + GripperSize + 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.GripperSize: Integer;
|
|
var
|
|
ATheme: TdxTheme;
|
|
DC: HDC;
|
|
ASize: TSize;
|
|
begin
|
|
ATheme := OpenTheme(totRebar);
|
|
DC := GetDC(0);
|
|
GetThemePartSize(ATheme, DC, RP_GRIPPER, CHEVS_NORMAL, nil, TS_TRUE, @ASize);
|
|
Result := ASize.cx;
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.RealButtonArrowWidth(ABarManager: TdxBarManager): Integer;
|
|
begin
|
|
Result := inherited RealButtonArrowWidth(ABarManager);
|
|
Inc(Result, 3);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.RealLargeButtonArrowWidth(ABarManager: TdxBarManager): Integer;
|
|
begin
|
|
Result := inherited RealLargeButtonArrowWidth(ABarManager);
|
|
Inc(Result, 3);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.DockControlFillBackground(ADockControl: TdxDockControl;
|
|
DC: HDC; ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
|
|
procedure FillBackgroundTempBitmap(ABitmap: TBitmap);
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
ATheme := OpenTheme(totRebar);
|
|
with AWholeR do
|
|
begin
|
|
ABitmap.Width := Right - Left;
|
|
ABitmap.Height := Bottom - Top;
|
|
end;
|
|
DrawThemeBackground(ATheme, ABitmap.Canvas.Handle, 0, CHEVS_NORMAL, @AWholeR);
|
|
end;
|
|
|
|
procedure DrawBarSeparators(DC: HDC);
|
|
|
|
function GetRowBar(ARow: TdxDockRow): TdxBar;
|
|
var
|
|
I: Integer;
|
|
ABar: TdxBar;
|
|
begin
|
|
if ARow.ColCount = 0 then
|
|
begin
|
|
Result := nil;
|
|
Exit;
|
|
end;
|
|
Result := ARow.Cols[0].BarControl.Bar;
|
|
if Result.BorderStyle = bbsNone then
|
|
for I := 1 to ARow.ColCount - 1 do
|
|
begin
|
|
ABar := ARow.Cols[I].BarControl.Bar;
|
|
if ABar.BorderStyle <> bbsNone then
|
|
begin
|
|
Result := ABar;
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function IsNoBorder(ARow: TdxDockRow): Boolean;
|
|
var
|
|
ABar: TdxBar;
|
|
begin
|
|
ABar := GetRowBar(ARow);
|
|
Result := (ABar <> nil) and ((ABar.BorderStyle = bbsNone) or ABar.IsStatusBar);
|
|
end;
|
|
|
|
procedure CalcLines(ARow: TdxDockRow; AHorz: Boolean;
|
|
var AIsFirstLineNeeded, AIsLastLineNeeded: Boolean);
|
|
var
|
|
AIsTop, AIsBottom, AIsTopBottom, AIsLeft, AIsRight: Boolean;
|
|
begin
|
|
if IsNoBorder(ARow) then
|
|
begin
|
|
AIsFirstLineNeeded := False;
|
|
AIsLastLineNeeded := False;
|
|
end
|
|
else
|
|
begin
|
|
AIsFirstLineNeeded := True;
|
|
AIsLastLineNeeded := True;
|
|
if AHorz then
|
|
begin
|
|
AIsTop := (ADockControl.DockingStyle = dsTop) and (ARow = ADockControl.Rows[0]);
|
|
AIsBottom := (ADockControl.DockingStyle = dsBottom) and
|
|
(ARow = ADockControl.Rows[ADockControl.RowCount - 1]);
|
|
AIsTopBottom := (ADockControl.DockingStyle = dsTop) and
|
|
(ARow = ADockControl.Rows[ADockControl.RowCount - 1]);
|
|
if AIsTop then AIsFirstLineNeeded := False;
|
|
if AIsBottom or AIsTopBottom then AIsLastLineNeeded := False;
|
|
end
|
|
else
|
|
begin
|
|
AIsLeft := (ADockControl.DockingStyle = dsLeft) and (ARow = ADockControl.Rows[0]);
|
|
AIsRight := (ADockControl.DockingStyle = dsRight) and
|
|
(ARow = ADockControl.Rows[ADockControl.RowCount - 1]);
|
|
if AIsLeft then AIsFirstLineNeeded := False;
|
|
if AIsRight then AIsLastLineNeeded := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
I: Integer;
|
|
R, R1, R2: TRect;
|
|
AHorz: Boolean;
|
|
AIsFirstLineNeeded, AIsLastLineNeeded: Boolean;
|
|
begin
|
|
AHorz := ADockControl.DockingStyle in [dsTop, dsBottom];
|
|
for I := 0 to ADockControl.RowCount - 1 do
|
|
begin
|
|
// rects
|
|
R := ADockControl.GetRectForRow(I);
|
|
if AHorz then
|
|
begin
|
|
R1 := Rect(R.Left, R.Top, R.Right, R.Top + 1);
|
|
R2 := Rect(R.Left, R.Bottom - 1, R.Right, R.Bottom);
|
|
end
|
|
else
|
|
begin
|
|
R1 := Rect(R.Left, R.Top, R.Left + 1, R.Bottom);
|
|
R2 := Rect(R.Right - 1, R.Top, R.Right, R.Bottom);
|
|
end;
|
|
// draw
|
|
CalcLines(ADockControl.Rows[I], AHorz, AIsFirstLineNeeded, AIsLastLineNeeded);
|
|
if AIsFirstLineNeeded then
|
|
FillRect(DC, R1, GetSysColorBrush(COLOR_BTNHIGHLIGHT));
|
|
if AIsLastLineNeeded then
|
|
FillRect(DC, R2, GetSysColorBrush(COLOR_BTNSHADOW)); // TODO: color?
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if ADockControl.BackgroundTempBitmap.Empty then
|
|
begin
|
|
FillBackgroundTempBitmap(ADockControl.BackgroundTempBitmap);
|
|
DrawBarSeparators(ADockControl.BackgroundTempBitmap.Canvas.Handle);
|
|
end;
|
|
with ADestR do
|
|
BitBlt(DC, Left, Top, Right - Left, Bottom - Top,
|
|
ADockControl.BackgroundTempBitmap.Canvas.Handle, ASourceR.Left, ASourceR.Top, SRCCOPY);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.IsNativeBackground: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
{class function TdxBarItemControlXPPainter.BarChildrenHaveShadows(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := False;
|
|
end;}
|
|
|
|
class function TdxBarItemControlXPPainter.BarHasShadow(ABarControl: TCustomdxBarControl): Boolean;
|
|
begin
|
|
Result := ABarControl.DockingStyle = dsNone;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarToolbarBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
Result := ABarControl.BarManager.ThemeToolbarsBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarToolbarBrushEx(ABarControl: TdxBarControl): HBRUSH;
|
|
begin
|
|
Result := BarToolbarBrush(ABarControl);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarToolbarDownedBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
// TODO
|
|
Result := PatternBrush;
|
|
// Result := ABarControl.BarManager.FlatToolbarsDownedBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarToolbarDownedSelBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
// TODO
|
|
Result := GetSysColorBrush(COLOR_BTNFACE);
|
|
// Result := ABarControl.BarManager.FlatToolbarsDownedSelBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarToolbarSelBrush(ABarControl: TCustomdxBarControl): HBRUSH;
|
|
begin
|
|
// TODO
|
|
Result := GetSysColorBrush(COLOR_HIGHLIGHT);
|
|
// Result := ABarControl.BarManager.FlatToolbarsSelBrush;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.ComboBoxArrowWidth(ABarControl: TCustomdxBarControl;
|
|
DC: HDC; cX: Integer): Integer;
|
|
var
|
|
ATheme: TdxTheme;
|
|
ASize: TSize;
|
|
begin
|
|
ATheme := OpenTheme(totComboBox);
|
|
GetThemePartSize(ATheme, DC, CP_DROPDOWNBUTTON, CBXS_NORMAL, nil, TS_TRUE, @ASize);
|
|
Result := ASize.cx;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.EditBorderSize(DC: HDC): Integer;
|
|
var
|
|
ATheme: TdxTheme;
|
|
R, CR: TRect;
|
|
begin
|
|
ATheme := OpenTheme(totEdit);
|
|
R := Rect(0, 0, 100, 100);
|
|
GetThemeBackgroundContentRect(ATheme, DC, EP_EDITTEXT, ETS_NORMAL, R, CR);
|
|
Result := (R.Right - R.Left) - (CR.Right - CR.Left) + 2 * 2 + 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarAllowHotTrack: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarAllowQuickCustomizing: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarBeginGroupSideSize: Integer;
|
|
begin
|
|
// don't use in xp painter
|
|
Result := (BarBeginGroupSize - 1{|}) div 2;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarBeginGroupSize: Integer;
|
|
var
|
|
ATheme: TdxTheme;
|
|
DC: HDC;
|
|
ASize: TSize;
|
|
begin
|
|
ATheme := OpenTheme(totToolBar);
|
|
DC := GetDC(0);
|
|
GetThemePartSize(ATheme, DC, TP_SEPARATOR, TS_NORMAL, nil, TS_MIN, @ASize);
|
|
Result := ASize.cx;
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarBorderSize: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.BarCaptionFillBackground(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
const
|
|
CaptionBkColors: array[Boolean] of Integer =
|
|
(COLOR_INACTIVECAPTION, COLOR_ACTIVECAPTION);
|
|
//const
|
|
// CaptionStates: array[Boolean] of Integer = (CS_INACTIVE, CS_ACTIVE);
|
|
//var
|
|
// ATheme: TdxTheme;
|
|
begin
|
|
// ATheme := OpenTheme(totWindow);
|
|
// DrawThemeBackground(ATheme, DC, WP_SMALLCAPTION,
|
|
// CaptionStates[ABarControl.BarManager.MainFormActive], @R);
|
|
FillRect(DC, R, GetSysColorBrush(CaptionBkColors[ABarControl.BarManager.MainFormActive]));
|
|
end;
|
|
|
|
{class function TdxBarItemControlXPPainter.BarCaptionSize: Integer;
|
|
var
|
|
ATheme: TdxTheme;
|
|
DC: HDC;
|
|
ASize: TSize;
|
|
begin
|
|
ATheme := OpenTheme(totWindow);
|
|
DC := GetDC(0);
|
|
GetThemePartSize(ATheme, DC, WP_SMALLCAPTION, CS_ACTIVE, nil, TS_TRUE, @ASize);
|
|
Result := ASize.cy;
|
|
ReleaseDC(0, DC);
|
|
end;}
|
|
|
|
class function TdxBarItemControlXPPainter.BarCaptionTransparent: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarCloseButtonSize: TSize;
|
|
var
|
|
ATheme: TdxTheme;
|
|
DC: HDC;
|
|
begin
|
|
ATheme := OpenTheme(totWindow);
|
|
DC := GetDC(0);
|
|
GetThemePartSize(ATheme, DC, WP_SMALLCLOSEBUTTON, CBS_NORMAL, nil, TS_TRUE, @Result);
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.BarDrawBeginGroup(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH; AHorz: Boolean);
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
ATheme := OpenTheme(totToolBar);
|
|
// * IsThemeBackgroundPartiallyTransparent
|
|
ABarControl.FillBackground(DC, ItemRect, AToolbarBrush, clNone, True);
|
|
if AHorz then
|
|
DrawThemeBackground(ATheme, DC, TP_SEPARATORVERT, TS_NORMAL, @ItemRect)
|
|
else
|
|
DrawThemeBackground(ATheme, DC, TP_SEPARATOR, TS_NORMAL, @ItemRect);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.BarDrawCloseButton(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect);
|
|
const
|
|
ButtonStates: array [TdxBarMarkState] of Integer = (CBS_NORMAL, CBS_HOT, CBS_PUSHED);
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
ATheme := OpenTheme(totWindow);
|
|
// FillTransparent is not needed (BarCaptionTransparent)
|
|
DrawThemeBackground(ATheme, DC, WP_SMALLCLOSEBUTTON, ButtonStates[ABarControl.CloseButtonState], @R);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.BarDrawDockedBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
const
|
|
Grippers: array[Boolean] of Integer = (RP_GRIPPER, RP_GRIPPERVERT);
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
InflateRect(R, -2, -2);
|
|
if not ABarControl.Bar.CanMoving then Exit;
|
|
ATheme := OpenTheme(totRebar);
|
|
with R do
|
|
if ABarControl.Horizontal then
|
|
begin
|
|
Inc(Left, ABarControl.BarManager.BeforeFingersSize);
|
|
Right := Left + ABarControl.PainterClass.GripperSize;
|
|
InflateRect(R, 0, -0);
|
|
end
|
|
else
|
|
begin
|
|
Inc(Top, ABarControl.BarManager.BeforeFingersSize);
|
|
Bottom := Top + ABarControl.PainterClass.GripperSize;
|
|
InflateRect(R, -0, 0);
|
|
end;
|
|
// FillTransparent is not needed (FillBackgroundRgn)
|
|
DrawThemeBackground(ATheme, DC, Grippers[ABarControl.Vertical], CHEVS_NORMAL, @R);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.BarDrawFloatingBarBorder(ABarControl: TdxBarControl;
|
|
DC: HDC; var R, CR: TRect; AToolbarBrush: HBRUSH);
|
|
begin
|
|
TdxBarItemControlFlatPainter.BarDrawFloatingBarBorder(ABarControl, DC, R, CR, AToolbarBrush);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.StatusBarGripSize(ABarManager: TdxBarManager): TSize;
|
|
var
|
|
ATheme: TdxTheme;
|
|
DC: HDC;
|
|
begin
|
|
ATheme := OpenTheme(totStatus);
|
|
DC := GetDC(0);
|
|
GetThemePartSize(ATheme, DC, SP_GRIPPER, 0, nil, TS_TRUE, @Result);
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.BarDrawMDIButton(ABarControl: TdxBarControl;
|
|
AButton: TdxBarMDIButton; ASelected, APressed: Boolean; DC: HDC; R: TRect);
|
|
const
|
|
Buttons: array[TdxBarMDIButton] of Integer =
|
|
(WP_MDIMINBUTTON, WP_MDIRESTOREBUTTON, WP_MDICLOSEBUTTON);
|
|
States: array[TdxBarMDIButton, 1..4] of Integer = (
|
|
(MINBS_DISABLED, MINBS_HOT, MINBS_NORMAL, MINBS_PUSHED),
|
|
(RBS_DISABLED, RBS_HOT, RBS_NORMAL, RBS_PUSHED),
|
|
(CBS_DISABLED, CBS_HOT, CBS_NORMAL, CBS_PUSHED));
|
|
var
|
|
ATheme: TdxTheme;
|
|
AState: Integer;
|
|
begin
|
|
ATheme := OpenTheme(totWindow);
|
|
// * IsThemeBackgroundPartiallyTransparent
|
|
// ABarControl.MDIButtonEnabled(AButton, MF_GRAYED)
|
|
// MINBS_DISABLED, MINBS_HOT, MINBS_NORMAL, MINBS_PUSHED
|
|
AState := 3;
|
|
if not ABarControl.MDIButtonEnabled(AButton, MF_GRAYED) then
|
|
AState := 1
|
|
else
|
|
if ASelected then
|
|
begin
|
|
if APressed then
|
|
AState := 4
|
|
else
|
|
AState := 2;
|
|
end;
|
|
ABarControl.FillBackground(DC, R, ABarControl.ToolbarBrush, clNone, True);
|
|
DrawThemeBackground(ATheme, DC, Buttons[AButton], States[AButton, AState], @R);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.BarMarkItemRect(ABarControl: TdxBarControl): TRect;
|
|
begin
|
|
Result := TdxBarItemControlFlatPainter.BarMarkItemRect(ABarControl);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.StatusBarFillBackground(ABarControl: TdxBarControl;
|
|
DC: HDC; ADestR, ASourceR, AWholeR: TRect; ABrush: HBRUSH; AColor: TColor);
|
|
|
|
procedure FillBackgroundTempBitmap(ABitmap: TBitmap);
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
ATheme := OpenTheme(totStatus);
|
|
with AWholeR do
|
|
begin
|
|
ABitmap.Width := Right - Left;
|
|
ABitmap.Height := Bottom - Top;
|
|
end;
|
|
DrawThemeBackground(ATheme, ABitmap.Canvas.Handle, 0, 0, @AWholeR);
|
|
end;
|
|
|
|
begin
|
|
if ABarControl.BackgroundTempBitmap.Empty then
|
|
FillBackgroundTempBitmap(ABarControl.BackgroundTempBitmap);
|
|
with ADestR do
|
|
BitBlt(DC, Left, Top, Right - Left, Bottom - Top,
|
|
ABarControl.BackgroundTempBitmap.Canvas.Handle, ASourceR.Left, ASourceR.Top, SRCCOPY);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.SubMenuControlArrowsOffset: Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.SubMenuControlBeginGroupSize: Integer;
|
|
var
|
|
ATheme: TdxTheme;
|
|
DC: HDC;
|
|
ASize: TSize;
|
|
begin
|
|
ATheme := OpenTheme(totToolBar);
|
|
DC := GetDC(0);
|
|
GetThemePartSize(ATheme, DC, TP_SEPARATORVERT, TS_NORMAL, nil, TS_TRUE, @ASize);
|
|
Result := ASize.cy;
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.SubMenuControlBorderSize: Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.SubMenuControlCalcRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect; var AClientHeight: Integer);
|
|
begin
|
|
with ABarSubMenuControl do
|
|
begin
|
|
R := Rect(1 + BarSize, 1, ClientWidth - 1, 1);
|
|
if Size = nil then
|
|
AClientHeight := ClientHeight - 1 - TextSize * Byte(MarkExists)
|
|
else
|
|
begin
|
|
Size^.X := 0;
|
|
AClientHeight := MaxInt;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.SubMenuControlCalcSize(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
Size: PPoint; var R: TRect);
|
|
begin
|
|
with ABarSubMenuControl do
|
|
begin
|
|
if Size^.X = 0 then
|
|
Size^.X := 100
|
|
else
|
|
Inc(Size^.X, 2 * 2 + BarSize); // 2?
|
|
if (R.Top <= 2) or MarkExists then
|
|
Inc(R.Top, TextSize);
|
|
Size^.Y := 1 + R.Top + 2;
|
|
if Detachable then
|
|
Inc(Size^.Y, DetachCaptionAreaSize);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.SubMenuControlDetachCaptionAreaSize(ABarSubMenuControl: TdxBarSubMenuControl): Integer;
|
|
begin
|
|
Result := ABarSubMenuControl.DetachCaptionSize + 1;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.SubMenuControlDrawBeginGroup(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
AControl: TdxBarItemControl; DC: HDC; AItemRect: TRect; LeftDelta: Integer);
|
|
var
|
|
R: TRect;
|
|
ABrush: HBRUSH;
|
|
ATheme: TdxTheme;
|
|
begin
|
|
R := AItemRect;
|
|
ABrush := ABarSubMenuControl.BkBrush;
|
|
R.Bottom := R.Top;
|
|
Dec(R.Top, ABarSubMenuControl.BeginGroupSize);
|
|
AControl.FBeginGroupRect := R;
|
|
ATheme := OpenTheme(totToolBar);
|
|
// * IsThemeBackgroundPartiallyTransparent
|
|
DrawBackground(AControl, DC, R, ABrush, AControl.FNonRecent and not AControl.FChangeRecentGroup);
|
|
DrawThemeBackground(ATheme, DC, TP_SEPARATORVERT, TS_NORMAL, @R);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.SubMenuControlDrawBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
FrameRect(DC, R, GetSysColorBrush(COLOR_BTNSHADOW));
|
|
if ABarSubMenuControl.Detachable then
|
|
begin
|
|
InflateRect(R, -1, -1);
|
|
R.Bottom := R.Top + ABarSubMenuControl.DetachCaptionAreaSize + 1;
|
|
FrameRect(DC, R, ABarSubMenuControl.ToolbarItemsBrush);
|
|
SubMenuControlDrawDetachCaption(ABarSubMenuControl, DC, ABarSubMenuControl.DetachCaptionRect);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.SubMenuControlDrawClientBorder(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
DC: HDC; var R: TRect; ABrush: HBRUSH);
|
|
begin
|
|
FrameRect(DC, R, ABarSubMenuControl.ToolbarItemsBrush);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.SubMenuControlOffsetDetachCaptionRect(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var R: TRect);
|
|
begin
|
|
InflateRect(R, -2, -2);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.SubMenuControlPrepareBkBrush(ABarSubMenuControl: TdxBarSubMenuControl;
|
|
var ABkBrush: HBRUSH);
|
|
begin
|
|
ABkBrush := SubMenuControlToolbarItemsBrush(ABarSubMenuControl);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.SubMenuControlToolbarItemsBrush(ABarSubMenuControl: TdxBarSubMenuControl): HBRUSH;
|
|
begin
|
|
Result := GetSysColorBrush(COLOR_MENU);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.DropDownListBoxBorderSize: Integer;
|
|
begin
|
|
Result := TdxBarItemControlFlatPainter.DropDownListBoxBorderSize;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.DropDownListBoxDrawBorder(ABarManager: TdxBarManager;
|
|
DC: HDC; R: TRect);
|
|
begin
|
|
TdxBarItemControlFlatPainter.DropDownListBoxDrawBorder(ABarManager, DC, R);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.ColorComboDrawCustomButton(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; var ACustomColorButtonRect: TRect; Selected, Pressed: Boolean);
|
|
var
|
|
DotSize, I: Integer;
|
|
begin
|
|
with ARect do
|
|
begin
|
|
DrawBackgroundFrameRect(ABarComboControl, DC, ARect, ABarComboControl.Parent.BkBrush, False);
|
|
InflateRect(ARect, -1, -1);
|
|
ACustomColorButtonRect := ARect;
|
|
DrawGlyphBorder(ABarComboControl, DC, ABarComboControl.Parent.BkBrush, True,
|
|
ARect, ptHorz, True, Selected, False, Pressed, False, False);
|
|
// draw dots
|
|
DotSize := (Right - Left) div 7;
|
|
Right := Left;
|
|
Dec(Bottom, 2 * DotSize);
|
|
Top := Bottom - DotSize;
|
|
OffsetEllipsisBounds(ABarComboControl, Pressed, ARect);
|
|
for I := 0 to 2 do
|
|
begin
|
|
Left := Right + DotSize;
|
|
Right := Left + DotSize;
|
|
if ABarComboControl.Enabled then
|
|
FillRect(DC, ARect, COLOR_BTNTEXT + 1)
|
|
else
|
|
DrawDisabledShadowRect(ABarComboControl, DC, ARect);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.IsDateNavigatorFlat: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.DateNavigatorDrawButton(ABarItem: TdxBarItem;
|
|
DC: HDC; R: TRect; const ACaption: string; APressed: Boolean);
|
|
var
|
|
ATheme: TdxTheme;
|
|
AState: Integer;
|
|
AOffset: Integer;
|
|
begin
|
|
ATheme := OpenTheme(totToolbar);
|
|
FillRect(DC, R, GetSysColorBrush(COLOR_WINDOW));
|
|
if APressed then
|
|
begin
|
|
AState := TS_PRESSED;
|
|
AOffset := 1;
|
|
end
|
|
else
|
|
begin
|
|
AState := TS_HOT;
|
|
AOffset := 0;
|
|
end;
|
|
DrawThemeBackground(ATheme, DC, TP_BUTTON, AState, @R);
|
|
DateNavigatorDrawButtonCaption(DC, R, AOffset, ACaption, False);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.SysPanelDraw(AHandle: HWND;
|
|
AllowResizing, MouseAboveCloseButton, CloseButtonIsTracking: Boolean;
|
|
var CloseButtonRect, GripRect: TRect; Corner: TdxCorner);
|
|
var
|
|
R, CR: TRect;
|
|
B: Integer;
|
|
BorderBrush: HBRUSH;
|
|
DC: HDC;
|
|
AStyle: Longint;
|
|
begin
|
|
DC := GetWindowDC(AHandle);
|
|
try
|
|
GetWindowRect(AHandle, R);
|
|
CloseButtonRect := R;
|
|
GripRect := R;
|
|
GetClientRect(AHandle, CR);
|
|
MapWindowPoints(0, AHandle, R, 2);
|
|
B := -R.Left;
|
|
OffsetRect(CR, -R.Left, -R.Top);
|
|
OffsetRect(R, -R.Left, -R.Top);
|
|
|
|
BorderBrush := GetSysColorBrush(COLOR_BTNSHADOW);
|
|
FrameRect(DC, R, BorderBrush);
|
|
|
|
if not AllowResizing then
|
|
begin
|
|
SetRectEmpty(CloseButtonRect);
|
|
SetRectEmpty(GripRect);
|
|
Exit;
|
|
end;
|
|
|
|
InflateRect(R, -B, -B);
|
|
if Corner in [coBottomLeft, coBottomRight] then
|
|
begin
|
|
R.Top := R.Bottom - SysPanelSize + 1;
|
|
FillRect(DC, Rect(R.Left, R.Top - 1, R.Right, R.Top), BorderBrush);
|
|
end
|
|
else
|
|
begin
|
|
R.Bottom := R.Top + SysPanelSize - 1;
|
|
FillRect(DC, Rect(R.Left, R.Bottom, R.Right, R.Bottom + 1), BorderBrush);
|
|
end;
|
|
|
|
CR := R;
|
|
ThemeDrawSizeGrip(DC, CR, Corner); // TODO:
|
|
with CR do
|
|
ExcludeClipRect(DC, Left, Top, Right, Bottom);
|
|
InflateRect(CR, 2, 2);
|
|
if CR.Top < R.Top then CR.Top := R.Top;
|
|
if CR.Bottom > R.Bottom then CR.Bottom := R.Bottom;
|
|
OffsetRect(CR, GripRect.Left, GripRect.Top);
|
|
GripRect := CR;
|
|
|
|
CR := R;
|
|
ThemeDrawCloseButton(DC, CR, MouseAboveCloseButton or CloseButtonIsTracking,
|
|
MouseAboveCloseButton and CloseButtonIsTracking, Corner);
|
|
|
|
with CR do
|
|
ExcludeClipRect(DC, Left, Top, Right, Bottom);
|
|
with CloseButtonRect do OffsetRect(CR, Left, Top);
|
|
CloseButtonRect := CR;
|
|
|
|
FillRect(DC, R, COLOR_BTNFACE + 1);
|
|
if Corner in [coBottomLeft, coBottomRight] then
|
|
begin
|
|
AStyle := GetWindowLong(AHandle, GWL_STYLE);
|
|
if (AStyle and WS_HSCROLL <> 0) and (AStyle and WS_VSCROLL <> 0) then
|
|
with R do
|
|
begin
|
|
Left := Right - GetSystemMetrics(SM_CXVSCROLL);
|
|
Bottom := Top - 1;
|
|
Top := Bottom - GetSystemMetrics(SM_CYHSCROLL);
|
|
FillRect(DC, R, GetSysColorBrush(COLOR_BTNFACE));
|
|
end;
|
|
end;
|
|
finally
|
|
ReleaseDC(AHandle, DC);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.SysPanelSize: Integer;
|
|
var
|
|
DC: HDC;
|
|
ASizeGripSize: Integer;
|
|
begin
|
|
DC := GetDC(0);
|
|
Result := ThemeCloseButtonSize(DC).cy + 2 * 2;
|
|
ASizeGripSize := ThemeSizeGripSize(DC).cy + 1;
|
|
if Result < ASizeGripSize then
|
|
Result := ASizeGripSize;
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.SpinEditControlDrawButton(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; ARect: TRect; XSize, YSize, Size: Integer; Selected: Boolean;
|
|
AButton, AActiveButton: TdxBarSpinEditButton; AButtonPressed: Boolean);
|
|
var
|
|
ATheme: TdxTheme;
|
|
APartId, AState: Integer;
|
|
R: TRect;
|
|
begin
|
|
R := ARect;
|
|
with R do
|
|
begin
|
|
if AButton = sbUp then
|
|
Bottom := Top + Size + 1
|
|
else
|
|
Inc(Top, Size);
|
|
ATheme := OpenTheme(totSpin);
|
|
// * IsThemeBackgroundPartiallyTransparent
|
|
DrawBackground(ABarEditControl, DC, R, ABarEditControl.Parent.BkBrush, False);
|
|
if AButton = sbUp then
|
|
begin
|
|
APartId := SPNP_UP;
|
|
if not ABarEditControl.Enabled then
|
|
AState := UPS_DISABLED
|
|
else
|
|
if AActiveButton = AButton then
|
|
begin
|
|
if AButtonPressed then
|
|
AState := UPS_PRESSED
|
|
else
|
|
AState := UPS_HOT;
|
|
end
|
|
else
|
|
AState := UPS_NORMAL;
|
|
end
|
|
else
|
|
begin
|
|
APartId := SPNP_DOWN;
|
|
if not ABarEditControl.Enabled then
|
|
AState := DNS_DISABLED
|
|
else
|
|
if AActiveButton = AButton then
|
|
begin
|
|
if AButtonPressed then
|
|
AState := DNS_PRESSED
|
|
else
|
|
AState := DNS_HOT;
|
|
end
|
|
else
|
|
AState := DNS_NORMAL;
|
|
end;
|
|
DrawThemeBackground(ATheme, DC, APartId, AState, @R);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.SpinEditControlDrawFrame(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect);
|
|
begin
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.ProgressControlBarBrushColor: TColorRef;
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
ATheme := OpenTheme(totProgress);
|
|
if FAILED(GetThemeColor(ATheme, PP_CHUNK, 0, TMT_FILLCOLOR, Result)) then
|
|
Result := inherited ProgressControlBarBrushColor;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.ProgressControlBarHeight(ABarItemControl: TdxBarItemControl): Integer;
|
|
var
|
|
ATheme: TdxTheme;
|
|
ASize: TSize;
|
|
DC: HDC;
|
|
R, CR: TRect;
|
|
begin
|
|
ATheme := OpenTheme(totProgress);
|
|
DC := GetDC(0);
|
|
GetThemePartSize(ATheme, DC, PP_CHUNK, 0, nil, TS_TRUE, @ASize);
|
|
ReleaseDC(0, DC);
|
|
GetThemeBackgroundContentRect(ATheme, DC, PP_BAR, 0, R, CR);
|
|
Result := ASize.cy + (R.Right - R.Left) - (CR.Right - CR.Left);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.ProgressControlDrawBar(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; BarR: TRect; ABarBrushColor: TColorRef; PaintType: TdxBarPaintType;
|
|
ASmooth: Boolean; Position, Min, Max: Integer);
|
|
const
|
|
BarParts: array[Boolean] of Integer = (PP_BAR, PP_BARVERT);
|
|
ChunkParts: array[Boolean] of Integer = (PP_CHUNK, PP_CHUNKVERT);
|
|
var
|
|
ATheme: TdxTheme;
|
|
ABarPartId, AChunkPartId: Integer;
|
|
CR: TRect;
|
|
ALeft, ARight: ^Integer;
|
|
|
|
procedure DrawChunk;
|
|
var
|
|
ABarBrush: HBRUSH;
|
|
begin
|
|
if ASmooth then
|
|
begin
|
|
ABarBrush := CreateSolidBrush(ABarBrushColor);
|
|
FillRect(DC, CR, ABarBrush);
|
|
DeleteObject(ABarBrush);
|
|
end
|
|
else
|
|
DrawThemeBackground(ATheme, DC, AChunkPartId, 0, @CR);
|
|
end;
|
|
|
|
begin
|
|
ATheme := OpenTheme(totProgress);
|
|
// * IsThemeBackgroundPartiallyTransparent
|
|
ABarPartId := BarParts[PaintType = ptVert];
|
|
AChunkPartId := ChunkParts[PaintType = ptVert];
|
|
if IsThemeBackgroundPartiallyTransparent(ATheme, ABarPartId, 0) then
|
|
DrawBackground(ABarItemControl, DC, BarR, ABarItemControl.Parent.BkBrush, False);
|
|
GetThemeBackgroundContentRect(ATheme, DC, ABarPartId, 0, BarR, CR);
|
|
// calc rect
|
|
with CR do
|
|
if PaintType = ptVert then
|
|
begin
|
|
ALeft := @Top;
|
|
ARight := @Bottom;
|
|
end
|
|
else
|
|
begin
|
|
ALeft := @Left;
|
|
ARight := @Right;
|
|
end;
|
|
ARight^ := ALeft^ + MulDiv(ARight^ - ALeft^, Position - Min, Max - Min);
|
|
// draw chunk
|
|
DrawThemeBackground(ATheme, DC, ABarPartId, 0, @BarR);
|
|
DrawChunk;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.IsQuickControlPopupOnRight: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.ButtonBorderHeight: Integer;
|
|
var
|
|
ATheme: TdxTheme;
|
|
DC: HDC;
|
|
R, RC: TRect;
|
|
begin
|
|
ATheme := OpenTheme(totToolBar);
|
|
DC := GetDC(0);
|
|
R := Rect(0, 0, 100, 100);
|
|
GetThemeBackgroundContentRect(ATheme, DC, TP_SPLITBUTTON, TS_NORMAL, R, RC); // ?
|
|
Result := (R.Bottom - R.Top) - (RC.Bottom - RC.Top);
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.ButtonBorderWidth: Integer;
|
|
begin
|
|
Result := ButtonBorderHeight;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.CorrectButtonControlDefaultHeight(var DefaultHeight: Integer);
|
|
begin
|
|
// Inc(DefaultHeight, 2); // TODO: check!!!
|
|
Inc(DefaultHeight, 1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.DrawButtonControlArrow(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; R1: TRect; Brush: HBRUSH; ArrowColor: COLORREF; Selected, DrawDowned, DroppedDown,
|
|
DropDownEnabled, IsDropDownMenuControlExist: Boolean; PaintType: TdxBarPaintType);
|
|
var
|
|
ATheme: TdxTheme;
|
|
AState: Integer;
|
|
begin
|
|
ATheme := OpenTheme(totToolBar);
|
|
// * IsThemeBackgroundPartiallyTransparent
|
|
DrawBackground(ABarItemControl, DC, R1, Brush, ABarItemControl.FNonRecent);
|
|
if not (ABarItemControl.Enabled and DropDownEnabled) then
|
|
AState := TS_DISABLED
|
|
else
|
|
if DroppedDown or DrawDowned then
|
|
AState := TS_PRESSED
|
|
else
|
|
if Selected then
|
|
AState := TS_HOT
|
|
else
|
|
AState := TS_NORMAL;
|
|
if PaintType = ptMenu then
|
|
begin
|
|
DrawThemeBackground(ATheme, DC, TP_BUTTON, AState, @R1);
|
|
DrawLargeItemArrow(DC, R1, atRight, ABarItemControl.Parent.MenuArrowHeight,
|
|
DroppedDown, ABarItemControl.Enabled and DropDownEnabled, True{Flat})
|
|
end
|
|
else
|
|
DrawThemeBackground(ATheme, DC, TP_SPLITBUTTONDROPDOWN, AState, @R1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.OffsetCaptionBounds(ABarButtonControl: TdxBarButtonControl;
|
|
APressed: Boolean; var R: TRect);
|
|
begin
|
|
if ABarButtonControl.Down or APressed then OffsetRect(R, 1, 1);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.OffsetEllipsisBounds(ABarItemControl: TdxBarItemControl;
|
|
APressed: Boolean; var R: TRect);
|
|
begin
|
|
if APressed then OffsetRect(R, 1, 1);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.EditControlCaptionWidth(ABarEditControl: TdxBarEditControl;
|
|
ATextWidth: Integer): Integer;
|
|
begin
|
|
Result := 1 + 5 + ATextWidth + 5;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.EditControlDrawBorder(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean);
|
|
var
|
|
ATheme: TdxTheme;
|
|
AClipRgn: HRGN;
|
|
AClipRgnExists: Boolean;
|
|
AEditState: Integer;
|
|
R: TRect;
|
|
begin
|
|
ATheme := OpenTheme(totEdit);
|
|
AEditState := ThemeEditState(ABarEditControl);
|
|
R := ARect;
|
|
GetThemeBackgroundContentRect(ATheme, DC, EP_EDITTEXT, AEditState, R, ARect);
|
|
SaveClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
with ARect do
|
|
ExcludeClipRect(DC, Left, Top, Right, Bottom);
|
|
if not ABarEditControl.Enabled or Selected or (PaintType = ptMenu) then
|
|
DrawThemeBackground(ATheme, DC, EP_EDITTEXT, AEditState, @R)
|
|
else
|
|
DrawBackground(ABarEditControl, DC, R, ABarEditControl.Parent.BkBrush, ABarEditControl.FNonRecent);
|
|
RestoreClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.EditControlDrawCaption(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; var ARect: TRect; PaintType: TdxBarPaintType; Selected: Boolean);
|
|
var
|
|
S: string;
|
|
Size: TSize;
|
|
R: TRect;
|
|
Brush: HBRUSH;
|
|
begin
|
|
S := GetTextOf(ABarEditControl.Caption);
|
|
GetTextExtentPoint32(DC, PChar(S), Length(S), Size);
|
|
R := ARect;
|
|
R.Right := R.Left + EditControlCaptionWidth(ABarEditControl, Size.cX);
|
|
ARect.Left := R.Right;
|
|
if Selected and (PaintType = ptMenu) then
|
|
Brush := ABarEditControl.Parent.ToolbarSelBrush
|
|
else
|
|
Brush := ABarEditControl.Parent.BkBrush;
|
|
DrawBackground(ABarEditControl, DC, R, Brush, (PaintType = ptMenu) and (Selected or ABarEditControl.FNonRecent));
|
|
Dec(R.Right, 5);
|
|
DrawItemText(ABarEditControl, DC, ABarEditControl.Caption, R, DT_RIGHT,
|
|
ABarEditControl.Enabled, Selected and (PaintType = ptMenu), False, False, False);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.EditControlDrawTextField(ABarEditControl: TdxBarEditControl;
|
|
DC: HDC; const ARect: TRect; AIgnoreEnabled: Boolean);
|
|
var
|
|
ATheme: TdxTheme;
|
|
AEditState: Integer;
|
|
ATextColor, ABkColor: COLORREF;
|
|
AClipRgn: HRGN;
|
|
AClipRgnExists: Boolean;
|
|
APrevFont: HFONT;
|
|
begin
|
|
ATheme := OpenTheme(totEdit);
|
|
AEditState := ThemeEditState(ABarEditControl);
|
|
ABkColor := ThemeEditColor(ATheme, AEditState);
|
|
ATextColor := ThemeEditTextColor(ATheme, AEditState);
|
|
SaveClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
try
|
|
with ARect do
|
|
IntersectClipRect(DC, Left, Top, Right, Bottom);
|
|
SetTextColor(DC, ATextColor);
|
|
with ABarEditControl.Parent.Canvas do
|
|
begin
|
|
Font.Color := ATextColor;
|
|
Brush.Color := ABkColor;
|
|
Handle; // RequiredState(csAllValid)
|
|
end;
|
|
APrevFont := SelectObject(DC, ABarEditControl.Parent.EditFontHandle);
|
|
try
|
|
ABarEditControl.Item.DrawInterior(ABarEditControl, ABarEditControl.Parent.Canvas,
|
|
ARect, ABarEditControl.ItemLink);
|
|
finally
|
|
if GetObjectType(APrevFont) = OBJ_FONT then
|
|
SelectObject(DC, APrevFont);
|
|
end;
|
|
finally
|
|
RestoreClipRgn(DC, AClipRgn, AClipRgnExists);
|
|
end;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.EditControlES_Style: Integer;
|
|
begin
|
|
Result := TdxBarItemControlFlatPainter.EditControlES_Style;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.EditControlPrepareEditWnd(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND);
|
|
begin
|
|
TdxBarItemControlFlatPainter.EditControlPrepareEditWnd(ABarEditControl, AHandle);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.EditControlUpdateWndText(ABarEditControl: TdxBarEditControl;
|
|
AHandle: HWND; ANotEqual: Boolean);
|
|
begin
|
|
TdxBarItemControlFlatPainter.EditControlUpdateWndText(ABarEditControl, AHandle, ANotEqual);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.CustomComboDrawItem(ABarCustomCombo: TdxBarCustomCombo;
|
|
ACanvas: TCanvas; AIndex: Integer; ARect: TRect; AState: TOwnerDrawState;
|
|
AInteriorIsDrawing: Boolean);
|
|
begin
|
|
TdxBarItemControlFlatPainter.CustomComboDrawItem(ABarCustomCombo, ACanvas,
|
|
AIndex, ARect, AState, AInteriorIsDrawing);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.ComboControlArrowOffset: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.ComboControlDrawArrow(ABarComboControl: TCustomdxBarComboControl;
|
|
DC: HDC; ARect: TRect; Selected: Boolean; PaintType: TdxBarPaintType);
|
|
var
|
|
ATheme: TdxTheme;
|
|
AState: Integer;
|
|
begin
|
|
with ARect do
|
|
begin
|
|
Left := Right - ABarComboControl.Parent.ComboBoxArrowWidth;
|
|
ATheme := OpenTheme(totComboBox);
|
|
ABarComboControl.FDropDownButtonRect := ARect;
|
|
// * IsThemeBackgroundPartiallyTransparent
|
|
if not ABarComboControl.Enabled then
|
|
AState := CBXS_DISABLED
|
|
else
|
|
if ABarComboControl.DroppedDown then
|
|
AState := CBXS_PRESSED
|
|
else
|
|
if Selected then
|
|
AState := CBXS_HOT
|
|
else
|
|
AState := CBXS_NORMAL;
|
|
DrawThemeBackground(ATheme, DC, CP_DROPDOWNBUTTON, AState, @ARect);
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.DrawGlyphBorder(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; PaintType: TdxBarPaintType; IsGlyphEmpty,
|
|
Selected, Down, DrawDowned, BarControlOwner, IsSplit: Boolean);
|
|
var
|
|
ATheme: TdxTheme;
|
|
AState: Integer;
|
|
begin
|
|
ATheme := OpenTheme(totToolBar);
|
|
// * IsThemeBackgroundPartiallyTransparent
|
|
if (PaintType = ptMenu) and (Selected or ABarItemControl.FNonRecent) and IsGlyphEmpty and not Down then
|
|
FillRect(DC, R, ABrush)
|
|
else
|
|
begin
|
|
DrawBackground(ABarItemControl, DC, R, ABrush, False);
|
|
if IsMenuItem(ABarItemControl) and (PaintType <> ptMenu) and
|
|
(Selected or DrawDowned or Down) then
|
|
FillRect(DC, R, GetSysColorBrush(COLOR_HIGHLIGHT)) // ***
|
|
else
|
|
begin
|
|
if not ABarItemControl.Enabled then
|
|
AState := TS_DISABLED
|
|
else
|
|
if DrawDowned then
|
|
AState := TS_PRESSED
|
|
else
|
|
if Down then
|
|
AState := TS_CHECKED
|
|
else
|
|
if Selected then
|
|
AState := TS_HOT
|
|
else
|
|
AState := TS_NORMAL;
|
|
|
|
if IsSplit then
|
|
DrawThemeBackground(ATheme, DC, TP_SPLITBUTTON, AState, @R)
|
|
else
|
|
DrawThemeBackground(ATheme, DC, TP_BUTTON, AState, @R);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.DrawGlyphCheckMark(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; X, Y, DoubleSize: Integer);
|
|
begin
|
|
TdxBarItemControlFlatPainter.DrawGlyphCheckMark(ABarItemControl, DC, X, Y, DoubleSize);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.DrawGlyphImage(ABarItemControl: TdxBarItemControl;
|
|
DC: HDC; ABrush: HBRUSH; NeedBorder: Boolean; R: TRect; const GlyphRect: TRect;
|
|
AGlyph: TBitmap; AImages: TCurImageList; AImageIndex: Integer; Selected, Down,
|
|
DrawDowned, ForceUseBkBrush, GrayScale, BarControlOwner: Boolean;
|
|
PaintType: TdxBarPaintType);
|
|
begin
|
|
if NeedBorder then InflateRect(R, -1, -1);
|
|
TransparentDraw(DC, ABrush, R, GlyphRect,
|
|
AGlyph, AImages, AImageIndex,
|
|
ABarItemControl.GetImageEnabled(PaintType), GrayScale, True{Flat}, Selected, Down, DrawDowned,
|
|
False{Shadow}, True{Transparent}, GetFadedColor(ABarItemControl.Parent){Faded},
|
|
ABarItemControl.Item.BarManager.ImageListBkColor);
|
|
if NeedBorder then InflateRect(R, 1, 1);
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.GetFadedColor(ABarControl: TCustomdxBarControl): TColor;
|
|
begin
|
|
Result := GetMiddleRGB(ThemeToolbarColor, clBtnShadow, 70); //ThemeToolbarColor;
|
|
end;
|
|
|
|
class function TdxBarItemControlXPPainter.IsMenuItem(ABarItemControl: TdxBarItemControl): Boolean;
|
|
begin
|
|
Result := (ABarItemControl.Parent is TdxBarControl) and
|
|
TdxBarControl(ABarItemControl.Parent).Bar.IsMainMenu and
|
|
(ABarItemControl is TdxBarSubItemControl);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.BarDrawGrip(ABarControl: TdxBarControl;
|
|
DC: HDC; R: TRect; AToolbarBrush: HBRUSH);
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
ATheme := OpenTheme(totStatus);
|
|
// * IsThemeBackgroundPartiallyTransparent
|
|
ABarControl.FillBackground(DC, R, AToolbarBrush, clNone, False);
|
|
DrawThemeBackground(ATheme, DC, SP_GRIPPER, 0, @R);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.BarDrawMarkBackground(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect; AToolbarBrush: HBRUSH);
|
|
const
|
|
States: array[TdxBarMarkState] of Integer =
|
|
(TS_NORMAL, TS_HOT, TS_PRESSED);
|
|
var
|
|
ATheme: TdxTheme;
|
|
begin
|
|
ATheme := OpenTheme(totToolbar);
|
|
// * IsThemeBackgroundPartiallyTransparent
|
|
ABarControl.FillBackground(DC, ItemRect, AToolbarBrush, clNone, True);
|
|
if ABarControl.Bar.BorderStyle = bbsNone then
|
|
begin
|
|
if ABarControl.Horizontal then
|
|
InflateRect(ItemRect, 0, -2)
|
|
else
|
|
InflateRect(ItemRect, -2, 0);
|
|
end;
|
|
DrawThemeBackground(ATheme, DC, TP_BUTTON, States[ABarControl.MarkState], @ItemRect);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.BarDrawMarkElements(ABarControl: TdxBarControl;
|
|
DC: HDC; ItemRect: TRect);
|
|
begin
|
|
TdxBarItemControlFlatPainter.BarDrawMarkElements(ABarControl, DC, ItemRect);
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.BarOffsetFloatingBarCaption(ABarControl: TdxBarControl;
|
|
var X: Integer; var R: TRect);
|
|
begin
|
|
Inc(X, 2);
|
|
R.Right := ABarControl.MarkNCRect.Left;
|
|
end;
|
|
|
|
class procedure TdxBarItemControlXPPainter.EditOffsetInteriorRect(var R: TRect);
|
|
begin
|
|
Inc(R.Top, 2);
|
|
end;
|
|
|
|
{ TdxBarItem }
|
|
|
|
constructor TdxBarItem.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
if AOwner is TCustomForm then
|
|
FBarManager := GetBarManagerByForm(TCustomForm(AOwner));
|
|
if (FBarManager = nil) and (dxBarManagerList.Count > 0) then
|
|
FBarManager := TdxBarManager(dxBarManagerList[0]);
|
|
if BarManager <> nil then BarManager.FItems.Add(Self);
|
|
FLinks := TList.Create;
|
|
FEnabled := True;
|
|
FGlyph := TBitmap.Create;
|
|
FGlyph.OnChange := OnGlyphChanged;
|
|
FImageIndex := -1;
|
|
FCategory := -1;
|
|
FVisible := ivAlways;
|
|
FLoadedVisible := ivAlways;
|
|
end;
|
|
|
|
destructor TdxBarItem.Destroy;
|
|
begin
|
|
if BarManager <> nil then
|
|
begin
|
|
BarManager.FItems.Remove(Self);
|
|
if BarManager.FIsCustomizing and (Category > -1) then FullUpdateCustomizingBarItems;
|
|
end;
|
|
FLinks.Free;
|
|
if FActionLink <> nil then
|
|
begin
|
|
FActionLink.Free;
|
|
FActionLink := nil;
|
|
end;
|
|
FGlyph.Free;
|
|
cxClearObjectLinks(Self);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarItem.GetAction: TBasicAction;
|
|
begin
|
|
if FActionLink = nil then Result := nil
|
|
else Result := FActionLink.Action;
|
|
end;
|
|
|
|
function TdxBarItem.GetActuallyVisible: Boolean;
|
|
begin
|
|
Result :=
|
|
((Visible = ivAlways) and (InternalActuallyVisible or BarManager.IsCustomizing) or
|
|
(Visible = ivInCustomizing) and BarManager.IsCustomizing);
|
|
end;
|
|
|
|
function TdxBarItem.GetCurItemLink: TdxBarItemLink;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := nil;
|
|
for I := 0 to LinkCount - 1 do
|
|
if (Links[I].Control <> nil) and Links[I].Control.IsActive then
|
|
begin
|
|
Result := Links[I];
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItem.GetEnabled: Boolean;
|
|
begin
|
|
if not BarManager.Designing and BarManager.IsCustomizing and (Category > -1) then
|
|
Result := True
|
|
else
|
|
Result := FEnabled;
|
|
end;
|
|
|
|
function TdxBarItem.GetFlat: Boolean;
|
|
begin
|
|
// TODO: obsolete
|
|
Result := BarManager.Flat;
|
|
end;
|
|
|
|
function TdxBarItem.GetIndex: Integer;
|
|
begin
|
|
Result := BarManager.FItems.IndexOf(Self);
|
|
end;
|
|
|
|
function TdxBarItem.GetIsDesigning: Boolean;
|
|
begin
|
|
Result := csDesigning in ComponentState;
|
|
end;
|
|
|
|
function TdxBarItem.GetIsDestroying: Boolean;
|
|
begin
|
|
Result := csDestroying in ComponentState;
|
|
end;
|
|
|
|
function TdxBarItem.GetIsLoading: Boolean;
|
|
begin
|
|
Result := csLoading in ComponentState;
|
|
end;
|
|
|
|
function TdxBarItem.GetLinkCount: Integer;
|
|
begin
|
|
Result := FLinks.Count;
|
|
end;
|
|
|
|
function TdxBarItem.GetLinks(Index: Integer): TdxBarItemLink;
|
|
begin
|
|
Result := nil;
|
|
if (Index > -1) and (Index < LinkCount) then
|
|
Result := TdxBarItemLink(FLinks[Index]);
|
|
end;
|
|
|
|
function TdxBarItem.GetPainterClass: TdxBarItemControlPainterClass;
|
|
begin
|
|
Result := BarManager.PainterClass;
|
|
end;
|
|
|
|
function TdxBarItem.GetVisibleForUser: Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := True;
|
|
for I := 0 to LinkCount - 1 do
|
|
if Links[I].CanVisibleIndex <> -1 then Exit;
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetAction(Value: TBasicAction);
|
|
var
|
|
APrevCanModifyDesigner: Boolean;
|
|
begin
|
|
if Action <> Value then
|
|
if Value = nil then
|
|
begin
|
|
FActionLink.Free;
|
|
FActionLink := nil;
|
|
end
|
|
else
|
|
begin
|
|
APrevCanModifyDesigner := BarManager.CanModifyDesigner;
|
|
BarManager.CanModifyDesigner := not (csLoading in Value.ComponentState);
|
|
if FActionLink = nil then
|
|
FActionLink := GetActionLinkClass.Create(Self);
|
|
FActionLink.Action := Value;
|
|
FActionLink.OnChange := DoActionChange;
|
|
ActionChange(Value, csLoading in Value.ComponentState);
|
|
Value.FreeNotification(Self);
|
|
BarManager.CanModifyDesigner := APrevCanModifyDesigner;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetAlign(Value: TdxBarItemAlign);
|
|
begin
|
|
if FAlign <> Value then
|
|
begin
|
|
FAlign := Value;
|
|
AlignChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetCaption(Value: string);
|
|
var
|
|
MakeHint: Boolean;
|
|
S: string;
|
|
begin
|
|
if FCaption <> Value then
|
|
begin
|
|
MakeHint := not FCheckDefaults and not (Self is TCustomdxBarSubItem) and
|
|
((Hint = '') or IsHintFromCaption);
|
|
FCaption := Value;
|
|
if not IsLoading then
|
|
begin
|
|
if MakeHint then
|
|
begin
|
|
S := GetHintFromCaption;
|
|
if Pos('|', Hint) = 0 then
|
|
Hint := S
|
|
else
|
|
Hint := S + '|' + GetLongHint(Hint);
|
|
end;
|
|
CaptionChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetCategory(Value: Integer);
|
|
begin
|
|
if IsLoading then
|
|
FCategory := Value
|
|
else
|
|
if (BarManager <> nil) and (Value > -1) and
|
|
(Value < BarManager.Categories.Count) then
|
|
begin
|
|
FCategory := Value;
|
|
if BarManager.IsCustomizing and
|
|
IsDesigning and not (IsLoading or IsDestroying) and
|
|
not FCreatingBarItem then
|
|
UpdateCustomizingBarItemsEx(Self, True);
|
|
BarManager.DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetDescription(Value: string);
|
|
begin
|
|
if FDescription <> Value then
|
|
begin
|
|
FDescription := Value;
|
|
BarManager.UpdateItems(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetEnabled(Value: Boolean);
|
|
begin
|
|
if FEnabled <> Value then
|
|
begin
|
|
FEnabled := Value;
|
|
if not IsLoading then EnabledChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetGlyph(Value: TBitmap);
|
|
begin
|
|
FGlyph.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBarItem.SetShortCut(Value: TShortCut);
|
|
begin
|
|
if FShortCut <> Value then
|
|
begin
|
|
FShortCut := Value;
|
|
if not IsLoading then ShortCutChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetVisible(Value: TdxBarItemVisible);
|
|
begin
|
|
if IsLoading then
|
|
FLoadedVisible := Value
|
|
else
|
|
if FVisible <> Value then
|
|
begin
|
|
FVisible := Value;
|
|
VisibleChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.DestroyLinks;
|
|
|
|
function HasItemLinkOnUnlockedBar: Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := False;
|
|
for I := 0 to LinkCount - 1 do
|
|
if (Links[I].BarControl is TdxBarControl) and
|
|
not TdxBarControl(Links[I].BarControl).Bar.LockUpdate then
|
|
begin
|
|
Result := True;
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
Item: TdxBarItemLink;
|
|
APrevLockUpdate, ALock: Boolean;
|
|
begin
|
|
APrevLockUpdate := BarManager.LockUpdate;
|
|
ALock := not BarManager.IsDestroying and HasItemLinkOnUnlockedBar;
|
|
if ALock then
|
|
BarManager.LockUpdate := True;
|
|
try
|
|
while LinkCount > 0 do
|
|
begin
|
|
Item := TdxBarItemLink(FLinks.Last);
|
|
FLinks.Remove(Item);
|
|
if Item <> nil then Item.Free;
|
|
end;
|
|
finally
|
|
if ALock then
|
|
BarManager.LockUpdate := APrevLockUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.DoActionChange(Sender: TObject);
|
|
begin
|
|
if Sender = Action then ActionChange(Sender, False);
|
|
end;
|
|
|
|
function TdxBarItem.IsCaptionStored: Boolean;
|
|
begin
|
|
Result := (FActionLink = nil) or not FActionLink.IsCaptionLinked;
|
|
end;
|
|
|
|
function TdxBarItem.IsEnabledStored: Boolean;
|
|
begin
|
|
Result := (FActionLink = nil) or not FActionLink.IsEnabledLinked;
|
|
end;
|
|
|
|
function TdxBarItem.IsHelpContextStored: Boolean;
|
|
begin
|
|
Result := (ActionLink = nil) or not FActionLink.IsHelpContextLinked;
|
|
end;
|
|
|
|
function TdxBarItem.IsHintStored: Boolean;
|
|
begin
|
|
Result := (FActionLink = nil) or not FActionLink.IsHintLinked;
|
|
end;
|
|
|
|
function TdxBarItem.IsImageIndexStored: Boolean;
|
|
begin
|
|
Result := (FActionLink = nil) or not FActionLink.IsImageIndexLinked;
|
|
end;
|
|
|
|
function TdxBarItem.IsShortCutStored: Boolean;
|
|
begin
|
|
Result := (FActionLink = nil) or not FActionLink.IsShortCutLinked;
|
|
end;
|
|
|
|
function TdxBarItem.IsVisibleStored: Boolean;
|
|
begin
|
|
Result := (FActionLink = nil) or not FActionLink.IsVisibleLinked;
|
|
end;
|
|
|
|
function TdxBarItem.IsOnClickStored: Boolean;
|
|
begin
|
|
Result := (FActionLink = nil) or not FActionLink.IsOnExecuteLinked;
|
|
end;
|
|
|
|
function TdxBarItem.GetHintFromCaption: string;
|
|
var
|
|
P: Integer;
|
|
begin
|
|
Result := Caption;
|
|
P := Pos('&', Result);
|
|
if P > 0 then Delete(Result, P, 1);
|
|
P := Pos('...', Result);
|
|
if P > 0 then Delete(Result, P, 3);
|
|
end;
|
|
|
|
procedure TdxBarItem.OnGlyphChanged(Sender: TObject);
|
|
begin
|
|
GlyphChanged;
|
|
end;
|
|
|
|
procedure TdxBarItem.AssignTo(Dest: TPersistent);
|
|
begin
|
|
if Dest is TCustomAction then
|
|
with TCustomAction(Dest) do
|
|
begin
|
|
Caption := Self.Caption;
|
|
if Self is TdxBarButton then
|
|
Checked := TdxBarButton(Self).Down;
|
|
Enabled := Self.Enabled;
|
|
HelpContext := Self.HelpContext;
|
|
Hint := Self.Hint;
|
|
ImageIndex := Self.ImageIndex;
|
|
ShortCut := Self.ShortCut;
|
|
case Self.Visible of
|
|
ivNever: Visible := False;
|
|
ivAlways: Visible := True;
|
|
end;
|
|
OnExecute := Self.OnClick;
|
|
end
|
|
else inherited AssignTo(Dest);
|
|
end;
|
|
|
|
procedure TdxBarItem.Loaded;
|
|
begin
|
|
inherited;
|
|
if Action <> nil then ActionChange(Action, True);
|
|
if Assigned(FOnCreate) then FOnCreate(Self);
|
|
end;
|
|
|
|
procedure TdxBarItem.Notification(AComponent: TComponent; Operation: TOperation);
|
|
begin
|
|
inherited;
|
|
if (Operation = opRemove) and (AComponent = Action) then Action := nil;
|
|
end;
|
|
|
|
procedure TdxBarItem.ReadState(Reader: TReader);
|
|
begin
|
|
inherited ReadState(Reader);
|
|
if Reader.Parent is TdxBarManager then
|
|
begin
|
|
FBarManager := TdxBarManager(Reader.Parent);
|
|
BarManagerChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetName(const NewName: TComponentName);
|
|
begin
|
|
inherited;
|
|
UpdateCustomizingAllCommands;
|
|
UpdateGroupItems;
|
|
end;
|
|
|
|
procedure TdxBarItem.ActionChange(Sender: TObject; CheckDefaults: Boolean);
|
|
begin
|
|
if Action is TCustomAction then
|
|
with TCustomAction(Sender) do
|
|
begin
|
|
FCheckDefaults := CheckDefaults;
|
|
try
|
|
if not CheckDefaults or (Self.Caption = '') then
|
|
Self.Caption := Caption;
|
|
finally
|
|
FCheckDefaults := False;
|
|
end;
|
|
if (Self is TdxBarButton) and
|
|
(not CheckDefaults or (TdxBarButton(Self).Down = False)) then
|
|
TdxBarButton(Self).Down := Checked;
|
|
if not CheckDefaults or (Self.Enabled = True) then
|
|
Self.Enabled := Enabled;
|
|
if not CheckDefaults or (Self.HelpContext = 0) then
|
|
Self.HelpContext := HelpContext;
|
|
if not CheckDefaults or (Self.Hint = '') then
|
|
Self.Hint := Hint;
|
|
if not CheckDefaults or (Self.ActionImageIndex = -1) then
|
|
Self.ActionImageIndex := ImageIndex;
|
|
if not CheckDefaults or (Self.ShortCut = scNone) then
|
|
Self.ShortCut := ShortCut;
|
|
if not CheckDefaults or (Self.Visible = ivAlways) then
|
|
Self.Visible := VisibleTodxBarVisible(Visible);
|
|
if not CheckDefaults or not Assigned(Self.OnClick) then
|
|
Self.OnClick := OnExecute;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.AlignChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if IsLoading then Exit;
|
|
for I := 0 to LinkCount - 1 do
|
|
with Links[I] do
|
|
if Control <> nil then Control.AlignChanged;
|
|
end;
|
|
|
|
procedure TdxBarItem.BarManagerChanged;
|
|
begin
|
|
end;
|
|
|
|
function TdxBarItem.CanClicked: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TdxBarItem.CaptionChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if not (udCaption in Links[I].UserDefine) and (Links[I].Control <> nil) then
|
|
Links[I].Control.CaptionChanged;
|
|
BarManager.UpdateItems(Self);
|
|
end;
|
|
|
|
procedure TdxBarItem.EnabledChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if Links[I].Control <> nil then
|
|
Links[I].Control.EnabledChanged;
|
|
end;
|
|
|
|
function TdxBarItem.GetActionLinkClass: TdxBarItemActionLinkClass;
|
|
begin
|
|
Result := TdxBarItemActionLink;
|
|
end;
|
|
|
|
function TdxBarItem.GetActionImageIndex: Integer;
|
|
begin
|
|
Result := ImageIndex;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetActionImageIndex(Value: Integer);
|
|
begin
|
|
ImageIndex := Value;
|
|
end;
|
|
|
|
function TdxBarItem.GetHidden: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarItem.GlyphChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if not (udGlyph in Links[I].UserDefine) and (Links[I].Control <> nil) then
|
|
Links[I].Control.GlyphChanged;
|
|
BarManager.UpdateItems(Self);
|
|
end;
|
|
|
|
function TdxBarItem.HasAccel(AItemLink: TdxBarItemLink): Boolean;
|
|
begin
|
|
Result := Enabled;//True
|
|
end;
|
|
|
|
function TdxBarItem.HasControls: Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := True;
|
|
for I := 0 to LinkCount - 1 do
|
|
if Links[I].Control <> nil then Exit;
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarItem.HideControl(AControl: TdxBarItemControl);
|
|
begin
|
|
end;
|
|
|
|
procedure TdxBarItem.HotGlyphChanged;
|
|
begin
|
|
end;
|
|
|
|
function TdxBarItem.ImageIndexLinked: Boolean;
|
|
begin
|
|
with BarManager do
|
|
Result := (GetCurImages{Images} <> nil) and
|
|
(0 <= ImageIndex) and (ImageIndex < GetCurImages{Images}.Count);
|
|
end;
|
|
|
|
function TdxBarItem.InternalActuallyVisible: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TdxBarItem.IsHintFromCaption: Boolean;
|
|
begin
|
|
Result := GetShortHint(Hint) = GetHintFromCaption;
|
|
end;
|
|
|
|
procedure TdxBarItem.LargeGlyphChanged;
|
|
begin
|
|
end;
|
|
|
|
function TdxBarItem.NeedToBeHidden: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarItem.ObjectNotification(AOperation: TOperation; AObject: TObject);
|
|
begin
|
|
end;
|
|
|
|
procedure TdxBarItem.SetImageIndex(Value: Integer);
|
|
begin
|
|
if FImageIndex <> Value then
|
|
begin
|
|
FImageIndex := Value;
|
|
GlyphChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.ShortCutChanged;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if Links[I].Control <> nil then
|
|
Links[I].Control.ShortCutChanged;
|
|
BarManager.UpdateItems(Self);
|
|
end;
|
|
|
|
procedure TdxBarItem.Update;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if Links[I].Control <> nil then
|
|
with Links[I].Control do
|
|
if not IsSelected or not Parent.IsActive then Repaint;
|
|
end;
|
|
|
|
procedure TdxBarItem.UpdateEx;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
if Links[I].Control <> nil then
|
|
with Links[I].Control do
|
|
if not IsSelected or not Parent.IsActive then Parent.RepaintBar;
|
|
end;
|
|
|
|
function TdxBarItem.UseHotImages: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TdxBarItem.UseLargeImages: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarItem.VisibleChanged;
|
|
var
|
|
I: Integer;
|
|
PrevLockUpdate: Boolean;
|
|
begin
|
|
if IsDesigning then Exit;
|
|
PrevLockUpdate := BarManager.LockUpdate;
|
|
BarManager.LockUpdate := True;
|
|
try
|
|
for I := 0 to LinkCount - 1 do
|
|
begin
|
|
Links[I].Owner.RefreshVisibilityLists;
|
|
if ActuallyVisible then
|
|
begin
|
|
Links[I].BringToTopInRecentList(False);
|
|
if Links[I].Control = nil then Links[I].CreateControl;
|
|
if Links[I].Control <> nil then
|
|
Links[I].Control.VisibleChanged;
|
|
end
|
|
else
|
|
begin
|
|
Links[I].SendToBottomInRecentList;
|
|
if Links[I].Control <> nil then
|
|
begin
|
|
Links[I].Control.VisibleChanged;
|
|
Links[I].DestroyControl;
|
|
end;
|
|
end;
|
|
end;
|
|
finally
|
|
BarManager.LockUpdate := PrevLockUpdate;
|
|
BarManager.UpdateItems(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.BeforeDestruction;
|
|
begin
|
|
inherited;
|
|
if Assigned(FOnDestroy) then FOnDestroy(Self);
|
|
InternalItemList.Remove(Self);
|
|
DestroyLinks;
|
|
end;
|
|
|
|
procedure TdxBarItem.Click;
|
|
begin
|
|
if CanClicked then DirectClick;
|
|
end;
|
|
|
|
procedure TdxBarItem.DirectClick;
|
|
begin
|
|
if Enabled then
|
|
try
|
|
BarManager.DoClickItem(Self);
|
|
DoClick;
|
|
except
|
|
Application.HandleException(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarItem.DoClick;
|
|
begin
|
|
if Assigned(FOnClick) and ((Action = nil) or (@FOnClick <> @Action.OnExecute)) then
|
|
FOnClick(Self)
|
|
else
|
|
if not IsDesigning and (FActionLink <> nil) then
|
|
FActionLink.Execute{$IFDEF DELPHI6}(Self){$ENDIF};
|
|
end;
|
|
|
|
function TdxBarItem.GetParentComponent: TComponent;
|
|
begin
|
|
if HasParent then Result := FBarManager
|
|
else Result := nil;
|
|
end;
|
|
|
|
function TdxBarItem.HasParent: Boolean;
|
|
begin
|
|
Result := FCategory > -1;
|
|
end;
|
|
|
|
procedure TdxBarItem.SetParentComponent(AParent: TComponent);
|
|
begin
|
|
if not IsLoading then
|
|
begin
|
|
FBarManager := AParent as TdxBarManager;
|
|
BarManagerChanged;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarItem.GetCurImages: TCurImageList;
|
|
begin
|
|
Result := BarManager.Images;
|
|
end;
|
|
|
|
{ TdxBarWindowItem }
|
|
|
|
function TdxBarWindowItem.GetCurText: string;
|
|
begin
|
|
if CurItemLink = nil then Result := Text
|
|
else
|
|
if CurItemLink.Control is TdxBarWinControl then
|
|
Result := TdxBarWinControl(CurItemLink.Control).Text;
|
|
end;
|
|
|
|
function TdxBarWindowItem.GetFocusedItemLink: TdxBarItemLink;
|
|
begin
|
|
if (CurItemLink <> nil) and (CurItemLink.Control is TdxBarWinControl) and
|
|
TdxBarWinControl(CurItemLink.Control).Focused then
|
|
Result := CurItemLink
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure TdxBarWindowItem.SetCurText(Value: string);
|
|
begin
|
|
if CurItemLink = nil then Text := Value
|
|
else
|
|
if CurItemLink.Control is TdxBarWinControl then
|
|
TdxBarWinControl(CurItemLink.Control).Text := Value;
|
|
end;
|
|
|
|
function TdxBarWindowItem.CanClicked: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TdxBarWindowItem.Change;
|
|
begin
|
|
if not IsLoading and Assigned(FOnChange) then FOnChange(Self);
|
|
end;
|
|
|
|
procedure TdxBarWindowItem.CurChange;
|
|
begin
|
|
if Assigned(FOnCurChange) then FOnCurChange(Self);
|
|
end;
|
|
|
|
procedure TdxBarWindowItem.DoEnter;
|
|
begin
|
|
if Assigned(FOnEnter) then FOnEnter(Self);
|
|
end;
|
|
|
|
procedure TdxBarWindowItem.DoExit;
|
|
begin
|
|
if Assigned(FOnExit) then FOnExit(Self);
|
|
end;
|
|
|
|
procedure TdxBarWindowItem.KeyDown(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
if Assigned(FOnKeyDown) then FOnKeyDown(Self, Key, Shift);
|
|
end;
|
|
|
|
procedure TdxBarWindowItem.KeyPress(var Key: Char);
|
|
begin
|
|
if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key);
|
|
end;
|
|
|
|
procedure TdxBarWindowItem.KeyUp(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
if Assigned(FOnKeyUp) then FOnKeyUp(Self, Key, Shift);
|
|
end;
|
|
|
|
procedure TdxBarWindowItem.SetText(Value: string);
|
|
begin
|
|
if FText <> Value then
|
|
begin
|
|
FText := Value;
|
|
{ if (CurItemLink <> nil) and (CurItemLink.Control is TdxBarWinControl) then
|
|
TdxBarWinControl(CurItemLink.Control).Text := FText;}
|
|
Update;
|
|
Change;
|
|
Update;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarWindowItem.SetFocus(ACheckBarControlVisibility: Boolean = False);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to LinkCount - 1 do
|
|
with Links[I] do
|
|
if Control is TdxBarWinControl and
|
|
(not ACheckBarControlVisibility or IsWindowVisible(BarControl.Handle)) then
|
|
begin
|
|
(BarControl as TdxBarControl).BarGetFocus(Control);
|
|
Control.Click(False);
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
{ TdxBar }
|
|
|
|
constructor TdxBar.Create(Collection: TCollection);
|
|
begin
|
|
inherited Create(Collection);
|
|
FAlphaBlendValue := 255;
|
|
FBackgroundBitmap := TBitmap.Create;
|
|
FBackgroundBitmap.OnChange := BitmapChanged;
|
|
FAllowClose := True;
|
|
FAllowCustomizing := True;
|
|
FAllowQuickCustomizing := True;
|
|
FAllowReset := True;
|
|
FBorderStyle := bbsSingle;
|
|
FBars := TdxBars(Collection);
|
|
FDockedDockingStyle := dsTop;
|
|
FColor := clDefault;
|
|
FFont := TFont.Create;
|
|
FFont.Assign(BarManager.Font);
|
|
FFont.OnChange := FontChanged;
|
|
FFreeNotificationItems := TList.Create;
|
|
FItemLinks := TdxBarItemLinks.Create(BarManager);
|
|
FItemLinks.FOwner := Self;
|
|
FItemLinks.OnChange := ItemLinksChanged;
|
|
FRotateWhenVertical := True;
|
|
FShowMark := True;
|
|
FSizeGrip := True;
|
|
FUseRecentItems := True;
|
|
if not BarManager.IsLoading then
|
|
begin
|
|
if Assigned(BarManager.FOnBarAdd) then
|
|
BarManager.FOnBarAdd(BarManager, Self);
|
|
BarManager.DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
destructor TdxBar.Destroy;
|
|
begin
|
|
if not BarManager.IsDestroying then
|
|
begin
|
|
BarManager.DesignerModified;
|
|
if Assigned(BarManager.FOnBarDelete) then
|
|
BarManager.FOnBarDelete(BarManager, Self);
|
|
end;
|
|
Visible := False;
|
|
MakeFreeNotification;
|
|
FFreeNotificationItems.Free;
|
|
with BarManager do
|
|
if MainMenuBar = Self then FMainMenuBar := nil;
|
|
FItemLinks.Destroy;
|
|
FFont.Free;
|
|
if FEditFontHandle <> 0 then DeleteObject(FEditFontHandle);
|
|
FBackgroundBitmap.Free;
|
|
FBackgroundBitmap := nil;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TdxBar.BitmapChanged(Sender: TObject);
|
|
begin
|
|
if Control <> nil then
|
|
Control.RebuildBar;
|
|
end;
|
|
|
|
function TdxBar.GetBarManager: TdxBarManager;
|
|
begin
|
|
Result := TdxBars(Collection).BarManager;
|
|
end;
|
|
|
|
function TdxBar.GetControl: TdxBarControl;
|
|
begin
|
|
Result := TdxBarControl(ItemLinks.FBarControl);
|
|
end;
|
|
|
|
function TdxBar.GetDockedDockingStyle: TdxBarDockingStyle;
|
|
begin
|
|
if FDockedDockControl = nil then
|
|
Result := FDockedDockingStyle
|
|
else
|
|
Result := FDockedDockControl.DockingStyle;
|
|
end;
|
|
|
|
function TdxBar.GetDockingStyle: TdxBarDockingStyle;
|
|
begin
|
|
if FDockControl = nil then
|
|
Result := FDockingStyle
|
|
else
|
|
Result := FDockControl.DockingStyle;
|
|
end;
|
|
|
|
function TdxBar.GetRealDockControl: TdxDockControl;
|
|
begin
|
|
Result := FDockControl;
|
|
if (Result = nil) and (FDockingStyle <> dsNone) then
|
|
Result := FBars.FDockControls[FDockingStyle];
|
|
end;
|
|
|
|
procedure TdxBar.SetAllowClose(Value: Boolean);
|
|
begin
|
|
if FAllowClose <> Value then
|
|
begin
|
|
FAllowClose := Value;
|
|
if (DockingStyle = dsNone) and (Control <> nil) then
|
|
Control.CaptionChanged;
|
|
UpdateCustomizingBars(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetAllowQuickCustomizing(Value: Boolean);
|
|
begin
|
|
if FAllowQuickCustomizing <> Value then
|
|
begin
|
|
FAllowQuickCustomizing := Value;
|
|
if Control <> nil then
|
|
if DockingStyle = dsNone then
|
|
Control.CaptionChanged
|
|
else
|
|
if BarManager.CanShowRecentItems then
|
|
Control.RepaintBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetAlphaBlendValue(Value: Byte);
|
|
begin
|
|
if FAlphaBlendValue <> Value then
|
|
begin
|
|
FAlphaBlendValue := Value;
|
|
if (Control <> nil) and (Control.DockingStyle = dsNone) then
|
|
Control.SetLayeredAttributes;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetBackgroundBitmap(Value: TBitmap);
|
|
var
|
|
AChanged: Boolean;
|
|
begin
|
|
AChanged := not ((Value = nil) and FBackgroundBitmap.Empty);
|
|
FBackgroundBitmap.Assign(Value);
|
|
if AChanged then
|
|
BitmapChanged(nil);
|
|
end;
|
|
|
|
procedure TdxBar.SetBorderStyle(Value: TdxBarBorderStyle);
|
|
begin
|
|
if FBorderStyle <> Value then
|
|
begin
|
|
FBorderStyle := Value;
|
|
if Control <> nil then Control.RebuildBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetCaption(Value: string);
|
|
begin
|
|
if FCaption <> Value then
|
|
begin
|
|
if BarManager.BarByCaption(Value) <> nil then Exit;
|
|
FCaption := Value;
|
|
if Control <> nil then Control.CaptionChanged;
|
|
if (FName = '') and not BarManager.IsLoading then
|
|
CheckBarName(Value);
|
|
UpdateCustomizingBars(Self);
|
|
BarManager.DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetColor(Value: TColor);
|
|
begin
|
|
if FColor <> Value then
|
|
begin
|
|
FColor := Value;
|
|
if Control <> nil then
|
|
Control.RebuildBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetDockControl(Value: TdxBarDockControl);
|
|
var
|
|
PrevDockingStyle: TdxBarDockingStyle;
|
|
NeedHiding: Boolean;
|
|
begin
|
|
if (Value <> nil) and (Value.BarManager <> BarManager) then Exit;
|
|
if FDockControl <> Value then
|
|
begin
|
|
if BarManager.IsLoading then
|
|
begin
|
|
FLoadedDockControl := Value;
|
|
Exit;
|
|
end;
|
|
PrevDockingStyle := DockingStyle;
|
|
NeedHiding := not FChangingDockingStyle and (Control <> nil);
|
|
if NeedHiding then
|
|
if Value = nil then
|
|
// NeedHiding := (DockingStyle <> dsNone) and (Control.DockControl <> Value)
|
|
NeedHiding :=
|
|
(DockingStyle <> dsNone) and
|
|
not ((Control.DockControl <> nil) and Control.DockControl.Main)
|
|
else
|
|
NeedHiding := Control.DockControl <> Value;
|
|
if NeedHiding then Visible := False;
|
|
FDockControl := Value;
|
|
ItemLinks.RecentItemCount := -1;
|
|
if not FChangingDockingStyle then
|
|
begin
|
|
FChangingDockingStyle := True;
|
|
try
|
|
if Value = nil then
|
|
DockingStyle := PrevDockingStyle//dsNone
|
|
else
|
|
DockingStyle := Value.DockingStyle;
|
|
finally
|
|
FChangingDockingStyle := False;
|
|
end;
|
|
end;
|
|
if NeedHiding then Visible := True;
|
|
if Control <> nil then
|
|
Control.DockControl := RealDockControl;
|
|
if not FChangingDockingStyle then
|
|
BarManager.DoBarDockingStyleChanged(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetDockedDockControl(Value: TdxBarDockControl);
|
|
begin
|
|
if (Value <> nil) and (Value.BarManager <> BarManager) then Exit;
|
|
if FDockedDockControl <> Value then
|
|
begin
|
|
FDockedDockControl := Value;
|
|
BarManager.DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetDockedValue(Index: Integer; Value: Integer);
|
|
var
|
|
PrevValue: Integer;
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
PrevValue := 0;
|
|
case Index of
|
|
1: PrevValue := FDockedLeft;
|
|
2: PrevValue := FDockedTop;
|
|
end;
|
|
if PrevValue <> Value then
|
|
begin
|
|
case Index of
|
|
1: FDockedLeft := Value;
|
|
2: FDockedTop := Value;
|
|
end;
|
|
BarManager.DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetDockingStyle(Value: TdxBarDockingStyle);
|
|
var
|
|
ControlExists: Boolean;
|
|
begin
|
|
if FDockingStyle <> Value then
|
|
begin
|
|
if BarManager.IsLoading then
|
|
begin
|
|
FLoadedDockingStyle := Value;
|
|
Exit;
|
|
end;
|
|
ControlExists :=
|
|
not FChangingDockingStyle and
|
|
(Control <> nil) and (Control.DockingStyle <> Value);
|
|
if ControlExists then Visible := False;
|
|
FDockingStyle := Value;
|
|
if not FChangingDockingStyle then
|
|
begin
|
|
FChangingDockingStyle := True;
|
|
try
|
|
DockControl := nil;
|
|
finally
|
|
FChangingDockingStyle := False;
|
|
end;
|
|
end;
|
|
ItemLinks.RecentItemCount := -1;
|
|
if ControlExists then
|
|
begin
|
|
Visible := True;
|
|
Control.DockingStyle := Value;
|
|
end;
|
|
if not FChangingDockingStyle then
|
|
BarManager.DoBarDockingStyleChanged(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetFloatValue(Index: Integer; Value: Integer);
|
|
var
|
|
PrevValue: Integer;
|
|
begin
|
|
PrevValue := 0;
|
|
case Index of
|
|
1: PrevValue := FFloatLeft;
|
|
2: PrevValue := FFloatTop;
|
|
3: PrevValue := FFloatClientWidth;
|
|
4: PrevValue := FFloatClientHeight;
|
|
end;
|
|
if PrevValue <> Value then
|
|
begin
|
|
case Index of
|
|
1: FFloatLeft := Value;
|
|
2: FFloatTop := Value;
|
|
3: FFloatClientWidth := Value;
|
|
4: FFloatClientHeight := Value;
|
|
end;
|
|
BarManager.DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetFont(Value: TFont);
|
|
begin
|
|
FFont.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBar.SetHidden(Value: Boolean);
|
|
begin
|
|
if FHidden <> Value then
|
|
begin
|
|
FHidden := Value;
|
|
BarManager.DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetIsMainMenu(Value: Boolean);
|
|
var
|
|
PrevLockUpdate: Boolean;
|
|
begin
|
|
if FIsMainMenu <> Value then
|
|
begin
|
|
PrevLockUpdate := BarManager.LockUpdate;
|
|
BarManager.LockUpdate := True;
|
|
try
|
|
if Value and (BarManager.MainMenuBar <> nil) then
|
|
BarManager.MainMenuBar.IsMainMenu := False;
|
|
FIsMainMenu := Value;
|
|
if Value then
|
|
begin
|
|
BarManager.FMainMenuBar := Self;
|
|
WholeRow := True;
|
|
MultiLine := True;
|
|
end
|
|
else
|
|
begin
|
|
BarManager.FMainMenuBar := nil;
|
|
MultiLine := False;
|
|
WholeRow := False;
|
|
end;
|
|
if BarManager.IsLoading then Exit;
|
|
if Control <> nil then
|
|
if FDockingStyle = dsNone then
|
|
Control.CaptionChanged
|
|
else
|
|
Control.RepaintBar;
|
|
UpdateCustomizingBars(Self);
|
|
finally
|
|
BarManager.LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetItemLinks(Value: TdxBarItemLinks);
|
|
begin
|
|
FItemLinks.Assign(Value);
|
|
end;
|
|
|
|
procedure TdxBar.SetLockUpdate(Value: Boolean);
|
|
begin
|
|
if FLockUpdate <> Value then
|
|
begin
|
|
FLockUpdate := Value;
|
|
if not FLockUpdate and (Control <> nil) then Control.RepaintBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetMultiLine(Value: Boolean);
|
|
begin
|
|
if (FMultiLine <> Value) and (Value or not IsMainMenu) then
|
|
begin
|
|
FMultiLine := Value;
|
|
if (Control <> nil) and (DockingStyle <> dsNone) then
|
|
Control.RepaintBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetNotDocking(Value: TdxBarDockingStyles);
|
|
begin
|
|
if FNotDocking <> Value then
|
|
begin
|
|
FNotDocking := Value;
|
|
if Control <> nil then Control.RepaintBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetRotateWhenVertical(Value: Boolean);
|
|
begin
|
|
if FRotateWhenVertical <> Value then
|
|
begin
|
|
FRotateWhenVertical := Value;
|
|
if Control <> nil then Control.Perform(CM_FONTCHANGED, 0, 0);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetRow(Value: Integer);
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
FRow := Value;
|
|
end;
|
|
|
|
procedure TdxBar.SetShowMark(Value: Boolean);
|
|
begin
|
|
if FShowMark <> Value then
|
|
begin
|
|
FShowMark := Value;
|
|
if Control <> nil then Control.RepaintBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetSizeGrip(Value: Boolean);
|
|
begin
|
|
if FSizeGrip <> Value then
|
|
begin
|
|
FSizeGrip := Value;
|
|
if IsStatusBar and (Control <> nil) then
|
|
Control.RebuildBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetUseOwnFont(Value: Boolean);
|
|
begin
|
|
if FUseOwnFont <> Value then
|
|
begin
|
|
FUseOwnFont := Value;
|
|
FInternalFontChange := True;
|
|
try
|
|
if FUseOwnFont then
|
|
FontChanged(nil)
|
|
else
|
|
begin
|
|
Font := BarManager.Font;
|
|
DeleteObject(FEditFontHandle);
|
|
FEditFontHandle := 0;
|
|
end;
|
|
finally
|
|
FInternalFontChange := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetUseRecentItems(Value: Boolean);
|
|
begin
|
|
if FUseRecentItems <> Value then
|
|
begin
|
|
FUseRecentItems := Value;
|
|
FItemLinks.FUseRecentItems := FUseRecentItems;
|
|
if Control <> nil then Control.RepaintBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetUseRestSpace(Value: Boolean);
|
|
begin
|
|
if FUseRestSpace <> Value then
|
|
begin
|
|
FUseRestSpace := Value;
|
|
if Control <> nil then Control.RepaintBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetVisible(Value: Boolean);
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
if Value and BarManager.IsDestroying then Exit;
|
|
if not FVisible and not Value then
|
|
BarManager.RemoveBarFromRestoringList(Self);
|
|
|
|
if FVisible <> Value then
|
|
begin
|
|
FInternallyHidden := False;
|
|
if BarManager.IsLoading then
|
|
begin
|
|
FLoadedVisible := Value;
|
|
Exit;
|
|
end;
|
|
if not Value and (Control <> nil) then Control.SavePos;
|
|
FVisible := Value;
|
|
if FVisible then
|
|
begin
|
|
FItemLinks.CreateBarControl;
|
|
if DockingStyle <> dsNone then
|
|
begin
|
|
Control.BeginInternal;
|
|
try
|
|
Control.ChangeStyleWinTo(DockingStyle, RealDockControl);
|
|
P := Point(DockedLeft, DockedTop);
|
|
Windows.ClientToScreen(RealDockControl.Handle, P);
|
|
FBars.RegInDock(DockingStyle, RealDockControl, Control, P);
|
|
finally
|
|
Control.EndInternal;
|
|
end;
|
|
ShowWindow(Control.Handle, SW_SHOWNA);
|
|
end
|
|
else
|
|
begin
|
|
Control.BeginInternal;
|
|
try
|
|
Control.ChangeStyleWinTo(DockingStyle, nil);
|
|
finally
|
|
Control.EndInternal;
|
|
end;
|
|
P := Control.GetTrackSize(DockingStyle);
|
|
Control.SetBounds(FloatLeft, FloatTop, P.X, P.Y);
|
|
with BarManager do
|
|
if IsWindowVisible(MainForm.Handle) and
|
|
(not HideFloatingBarsWhenInactive or (MainForm.Handle = GetActiveWindow) or
|
|
(TDummyForm(MainForm).FormStyle = fsMDIChild) and
|
|
(Application.MainForm.Handle = GetActiveWindow) and
|
|
(HWND(SendMessage(TDummyForm(Application.MainForm).ClientHandle,
|
|
WM_MDIGETACTIVE, 0, 0)) = MainForm.Handle) or FIsCustomizing) then
|
|
ShowWindow(Control.Handle, SW_SHOWNA);
|
|
end;
|
|
BarManager.RemoveBarFromRestoringList(Self);
|
|
end
|
|
else // Visible = False
|
|
Control.Free;
|
|
|
|
if not BarManager.IsDestroying then
|
|
begin
|
|
if BarManager.FIsCustomizing and not BarManager.FChangingStyle then
|
|
UpdateCustomizingBars(Self);
|
|
if Assigned(BarManager.FOnBarVisibleChange) then
|
|
BarManager.FOnBarVisibleChange(BarManager, Self);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.SetWholeRow(Value: Boolean);
|
|
begin
|
|
if FWholeRow <> Value then
|
|
begin
|
|
FWholeRow := Value;
|
|
if (Control <> nil) and (DockingStyle <> dsNone) then
|
|
begin
|
|
Visible := False;
|
|
Visible := True;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.FontChanged(Sender: TObject);
|
|
begin
|
|
if not FInternalFontChange then
|
|
FUseOwnFont := True;
|
|
if FUseOwnFont then
|
|
CreateEditFontHandle(FFont, FEditFontHandle, False);
|
|
if Control <> nil then
|
|
begin
|
|
Control.Font := FFont;
|
|
Control.Perform(CM_FONTCHANGED, 0, 0);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.ItemLinksChanged(Sender: TObject);
|
|
begin
|
|
BarManager.DesignerModified;
|
|
end;
|
|
|
|
procedure TdxBar.ResetToolbarClick(Sender: TObject);
|
|
begin
|
|
ResetWithConfirmation;
|
|
end;
|
|
|
|
function TdxBar.IsDockedDockingStyleStored: Boolean;
|
|
begin
|
|
Result := FDockedDockControl = nil;
|
|
end;
|
|
|
|
function TdxBar.IsDockingStyleStored: Boolean;
|
|
begin
|
|
Result := FDockControl = nil;
|
|
end;
|
|
|
|
procedure TdxBar.AddFreeNotification(AItem: TdxBarItem);
|
|
begin
|
|
FFreeNotificationItems.Add(AItem);
|
|
end;
|
|
|
|
procedure TdxBar.RemoveFreeNotification(AItem: TdxBarItem);
|
|
begin
|
|
FFreeNotificationItems.Remove(AItem);
|
|
end;
|
|
|
|
procedure TdxBar.MakeFreeNotification;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := FFreeNotificationItems.Count - 1 downto 0 do
|
|
TdxBarItem(FFreeNotificationItems[I]).ObjectNotification(opRemove, Self);
|
|
end;
|
|
|
|
procedure TdxBar.CheckBarName(const AName: string);
|
|
|
|
function IsNameValid: Boolean;
|
|
var
|
|
ABar: TdxBar;
|
|
begin
|
|
Result := AName = '';
|
|
if not Result then
|
|
begin
|
|
ABar := BarManager.BarByName(AName);
|
|
Result := (ABar = nil) or (ABar = Self);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if IsNameValid then
|
|
FName := AName
|
|
else
|
|
FName := Bars.GetUniqueToolbarName(AName);
|
|
end;
|
|
|
|
function TdxBar.BarNCSizeX(AStyle: TdxBarDockingStyle): Integer;
|
|
var
|
|
R: TRect;
|
|
begin
|
|
if AStyle = dsNone then
|
|
begin
|
|
Result := 2 * BarManager.BorderSizeX;
|
|
Inc(Result, 2 * BarManager.PainterClass.BarHorSize);
|
|
end
|
|
else
|
|
if FBorderStyle = bbsSingle then
|
|
begin
|
|
BarManager.PainterClass.BarBorderSizes(Self, AStyle, R);
|
|
Result := R.Left + R.Right;
|
|
if AStyle in [dsTop, dsBottom] then
|
|
Inc(Result, BarManager.FingersSize(Self));
|
|
end
|
|
else
|
|
begin
|
|
Result := 0;
|
|
if HasSizeGrip then
|
|
Inc(Result, BarManager.PainterClass.StatusBarGripSize(BarManager).cx);
|
|
end;
|
|
end;
|
|
|
|
function TdxBar.BarNCSizeY(AStyle: TdxBarDockingStyle): Integer;
|
|
var
|
|
R: TRect;
|
|
begin
|
|
if AStyle = dsNone then
|
|
begin
|
|
Result := 2 * BarManager.BorderSizeY + BarManager.PainterClass.BarCaptionAreaSize;
|
|
Inc(Result, BarManager.PainterClass.BarTopSize);
|
|
Inc(Result, BarManager.PainterClass.BarBottomSize);
|
|
end
|
|
else
|
|
if FBorderStyle = bbsSingle then
|
|
begin
|
|
BarManager.PainterClass.BarBorderSizes(Self, AStyle, R);
|
|
Result := R.Top + R.Bottom;
|
|
if AStyle in [dsLeft, dsRight] then
|
|
Inc(Result, BarManager.FingersSize(Self));
|
|
end
|
|
else
|
|
begin
|
|
Result := 0;
|
|
if IsStatusBar then Inc(Result, BarManager.PainterClass.StatusBarTopBorderSize(BarManager));
|
|
end;
|
|
end;
|
|
|
|
function TdxBar.CanClose: Boolean;
|
|
begin
|
|
Result := FAllowClose and not FIsMainMenu and
|
|
((Control = nil) or Control.FHasCaption);
|
|
end;
|
|
|
|
function TdxBar.CanMoving: Boolean;
|
|
const
|
|
AllDockingStyles = [Low(TdxBarDockingStyle)..High(TdxBarDockingStyle)];
|
|
begin
|
|
Result := (NotDocking <> AllDockingStyles) and
|
|
(BarManager.NotDocking <> AllDockingStyles);
|
|
end;
|
|
|
|
function TdxBar.CanReset: Boolean;
|
|
begin
|
|
Result := FIsPredefined and FAllowReset;
|
|
end;
|
|
|
|
function TdxBar.HasSizeGrip: Boolean;
|
|
var
|
|
Parent: HWND;
|
|
R, CR: TRect;
|
|
|
|
function IsBottom(Control: HWND): Boolean;
|
|
begin
|
|
Parent := GetParent(Control);
|
|
Result := (Parent = 0) or
|
|
(FindControl(Control) is TCustomForm) and
|
|
(TDummyForm(FindControl(Control)).FormStyle = fsMDIChild);
|
|
if not Result then
|
|
begin
|
|
GetWindowRect(Control, R);
|
|
MapWindowPoints(0, Parent, R, 2);
|
|
GetClientRect(Parent, CR);
|
|
Result := (R.Bottom = CR.Bottom) and IsBottom(Parent);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Result :=
|
|
IsStatusBar and FSizeGrip and
|
|
not IsZoomed(BarManager.MainForm.Handle) and
|
|
((Control = nil) or IsBottom(Control.Handle));
|
|
end;
|
|
|
|
function TdxBar.IsShortCut(AShortCut: TShortCut): Boolean;
|
|
begin
|
|
Result := FItemLinks.IsShortCut(AShortCut);
|
|
end;
|
|
|
|
function TdxBar.IsStatusBar: Boolean;
|
|
begin
|
|
Result := (FBorderStyle = bbsNone) and (DockingStyle = dsBottom) and
|
|
WholeRow; // !!!
|
|
end;
|
|
|
|
procedure TdxBar.Assign(Source: TPersistent);
|
|
var
|
|
Bar: TdxBar;
|
|
begin
|
|
if Source is TdxBar then
|
|
begin
|
|
Bar := TdxBar(Source);
|
|
|
|
AllowClose := Bar.AllowClose;
|
|
AllowCustomizing := Bar.AllowCustomizing;
|
|
AllowQuickCustomizing := Bar.AllowQuickCustomizing;
|
|
AllowReset := Bar.AllowReset;
|
|
BorderStyle := Bar.BorderStyle;
|
|
Caption := Bar.Caption;
|
|
if csUpdating in BarManager.ComponentState then
|
|
CheckBarName(Bar.Name);
|
|
DockedDockControl := Bar.DockedDockControl;
|
|
DockedDockingStyle := Bar.DockedDockingStyle;
|
|
DockedLeft := Bar.DockedLeft;
|
|
DockedTop := Bar.DockedTop;
|
|
FloatLeft := Bar.FloatLeft;
|
|
FloatTop := Bar.FloatTop;
|
|
FloatClientWidth := Bar.FloatClientWidth;
|
|
FloatClientHeight := Bar.FloatClientHeight;
|
|
Hidden := Bar.Hidden;
|
|
IsMainMenu := Bar.IsMainMenu;
|
|
ItemLinks := Bar.ItemLinks;
|
|
NotDocking := Bar.NotDocking;
|
|
OneOnRow := Bar.OneOnRow;
|
|
RotateWhenVertical := Bar.RotateWhenVertical;
|
|
Row := Bar.Row;
|
|
ShowMark := Bar.ShowMark;
|
|
SizeGrip := Bar.SizeGrip;
|
|
WholeRow := Bar.WholeRow;
|
|
ChangeDockingStyle(Bar.DockingStyle, Bar.DockControl);
|
|
UseRecentItems := Bar.UseRecentItems;
|
|
UseRestSpace := Bar.UseRestSpace;
|
|
Color := Bar.Color;
|
|
Font := Bar.Font;
|
|
UseOwnFont := Bar.UseOwnFont;
|
|
Visible := Bar.Visible;
|
|
end
|
|
else inherited Assign(Source);
|
|
end;
|
|
|
|
procedure TdxBar.ChangeDockingStyle(AStyle: TdxBarDockingStyle;
|
|
ADockControl: TdxDockControl);
|
|
begin
|
|
if (ADockControl <> nil) and ADockControl.Main then
|
|
ADockControl := nil;
|
|
if DockingStyle = AStyle then
|
|
DockControl := TdxBarDockControl(ADockControl)
|
|
else
|
|
if DockControl = ADockControl then
|
|
DockingStyle := AStyle
|
|
else
|
|
if ADockControl = nil then
|
|
DockingStyle := AStyle
|
|
else
|
|
DockControl := TdxBarDockControl(ADockControl);
|
|
end;
|
|
|
|
procedure TdxBar.Reset;
|
|
var
|
|
PrevLockUpdate, PrevVisible: Boolean;
|
|
TempForm: TForm;
|
|
TempBarManager: TdxBarManager;
|
|
|
|
procedure CheckItemLinks(AItemLinks: TdxBarItemLinks);
|
|
var
|
|
I: Integer;
|
|
Item: TCustomdxBarSubItem;
|
|
TempItem: TdxBarItem;
|
|
begin
|
|
for I := 0 to AItemLinks.Count - 1 do
|
|
if AItemLinks[I].Item is TCustomdxBarSubItem then
|
|
begin
|
|
Item := TCustomdxBarSubItem(AItemLinks[I].Item);
|
|
TempItem := TempBarManager.GetItemByName(Item.Name);
|
|
if TempItem is TCustomdxBarSubItem then
|
|
begin
|
|
Item.ItemLinks.Assign(TCustomdxBarSubItem(TempItem).ItemLinks);
|
|
Item.ItemLinks.AssignUsageData(TCustomdxBarSubItem(TempItem).ItemLinks);
|
|
CheckItemLinks(Item.ItemLinks);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
TempForm := BarManager.LoadMainFormFromBin;
|
|
if TempForm <> nil then
|
|
try
|
|
TempBarManager := TdxBarManager(TempForm.FindComponent(BarManager.Name));
|
|
if (TempBarManager <> nil) and (Index < TempBarManager.Bars.Count) then
|
|
begin
|
|
BarManager.DoBarBeforeReset(Self);
|
|
if BarManager.UseFullReset then
|
|
begin
|
|
PrevLockUpdate := BarManager.LockUpdate;
|
|
BarManager.LockUpdate := True;
|
|
PrevVisible := Visible;
|
|
Visible := False;
|
|
ResettingToolbar := True;
|
|
try
|
|
Assign(TempBarManager.Bars[Index]);
|
|
ItemLinks.AssignUsageData(TempBarManager.Bars[Index].ItemLinks);
|
|
CheckItemLinks(ItemLinks);
|
|
finally
|
|
ResettingToolbar := False;
|
|
Visible := PrevVisible;
|
|
BarManager.LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
PrevLockUpdate := LockUpdate;
|
|
LockUpdate := True;
|
|
ResettingToolbar := True;
|
|
try
|
|
ItemLinks.Assign(TempBarManager.Bars[Index].ItemLinks);
|
|
ItemLinks.AssignUsageData(TempBarManager.Bars[Index].ItemLinks);
|
|
CheckItemLinks(ItemLinks);
|
|
finally
|
|
ResettingToolbar := False;
|
|
LockUpdate := PrevLockUpdate;
|
|
end;
|
|
end;
|
|
BarManager.DoBarAfterReset(Self);
|
|
end;
|
|
finally
|
|
TempForm.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBar.ResetWithConfirmation;
|
|
begin
|
|
if Application.MessageBox(PChar(Format(cxGetResourceString(@dxSBAR_WANTTORESETTOOLBAR), [Caption])),
|
|
PChar(Application.Title), MB_OKCANCEL or MB_ICONEXCLAMATION) = ID_OK then
|
|
Reset;
|
|
end;
|
|
|
|
{ TdxBars }
|
|
|
|
constructor TdxBars.Create(ABarManager: TdxBarManager);
|
|
var
|
|
ADockingStyle: TdxBarDockingStyle;
|
|
begin
|
|
inherited Create(TdxBar);
|
|
FBarManager := ABarManager;
|
|
FDockingZoneSize := MinToolbarSize;
|
|
for ADockingStyle := dsLeft to dsBottom do
|
|
begin
|
|
FDockControls[ADockingStyle] :=
|
|
TdxDockControl.CreateEx(nil, FBarManager, ADockingStyle);
|
|
FDockControls[ADockingStyle].Parent := FBarManager.MainForm;
|
|
end;
|
|
end;
|
|
|
|
destructor TdxBars.Destroy;
|
|
var
|
|
I: TdxBarDockingStyle;
|
|
begin
|
|
for I := dsLeft to dsBottom do
|
|
if FDockControls[I] <> nil then FDockControls[I].Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBars.GetDockControl(Index: TdxBarDockingStyle): TdxDockControl;
|
|
begin
|
|
Result := FDockControls[Index];
|
|
end;
|
|
|
|
function TdxBars.GetItem(Index: Integer): TdxBar;
|
|
begin
|
|
Result := TdxBar(inherited Items[Index]);
|
|
end;
|
|
|
|
procedure TdxBars.SetItem(Index: Integer; Value: TdxBar);
|
|
begin
|
|
Items[Index].Assign(Value);
|
|
end;
|
|
|
|
function TdxBars.GetOwner: TPersistent;
|
|
begin
|
|
Result := FBarManager;
|
|
end;
|
|
|
|
procedure TdxBars.RegInDock(AStyle: TdxBarDockingStyle; ADockControl: TdxDockControl;
|
|
ABarControl: TdxBarControl; APos: TPoint);
|
|
begin
|
|
if ADockControl <> nil then
|
|
ADockControl.AddBarControl(ABarControl, APos, True)
|
|
else
|
|
if (AStyle <> dsNone) and (FDockControls[AStyle] <> nil) then
|
|
FDockControls[AStyle].AddBarControl(ABarControl, APos, True);
|
|
end;
|
|
|
|
procedure TdxBars.UnregFromDock(AStyle: TdxBarDockingStyle;
|
|
ADockControl: TdxDockControl; ABarControl: TdxBarControl);
|
|
begin
|
|
if ADockControl <> nil then
|
|
ADockControl.DeleteBarControl(ABarControl, nil, True)
|
|
else
|
|
if (AStyle <> dsNone) and (FDockControls[AStyle] <> nil) then
|
|
FDockControls[AStyle].DeleteBarControl(ABarControl, nil, True);
|
|
end;
|
|
|
|
procedure DockTimerProc(Wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
KillTimer(0, FDockTimerID);
|
|
FDockTimerID := 0;
|
|
if FDockBarManager <> nil then
|
|
with FDockBarManager.Bars do
|
|
begin
|
|
GetCursorPos(P);
|
|
Inc(P.X, FMovingOffset.X);
|
|
Inc(P.Y, FMovingOffset.Y);
|
|
FDocking := True;
|
|
ChangeBarControlPos(FMovingBarControl, P);
|
|
FDocking := False;
|
|
FDockBarManager := nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBars.ChangeBarControlPos(ABarControl: TdxBarControl; APos: TPoint);
|
|
var
|
|
AStyle: TdxBarDockingStyle;
|
|
ADockControl: TdxDockControl;
|
|
ASize: TPoint;
|
|
begin
|
|
AStyle := GetDockingStyleAtPos(ABarControl.Bar, APos, ADockControl);
|
|
if not FBarManager.DoDocking(ABarControl.Bar, AStyle, ADockControl) then Exit;
|
|
|
|
if not FDocking and (ABarControl.DockingStyle = dsNone) and (AStyle <> dsNone) then
|
|
begin
|
|
if FDockTimerID > 0 then KillTimer(0, FDockTimerID);
|
|
FDockBarManager := BarManager;
|
|
FDockTimerID := SetTimer(0, 0, BarManager.WaitForDockingTime, @DockTimerProc);
|
|
ADockControl := nil;
|
|
AStyle := dsNone;
|
|
end;
|
|
|
|
if AStyle = dsNone then
|
|
begin
|
|
Dec(APos.X, FMovingOffset.X);
|
|
Dec(APos.Y, FMovingOffset.Y);
|
|
end;
|
|
if (ABarControl.DockingStyle <> AStyle) or
|
|
(ABarControl.DockControl <> ADockControl) then
|
|
begin
|
|
SetWindowPos(ABarControl.Handle, 0, 0, 0, 0, 0,
|
|
SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_HIDEWINDOW or SWP_NOACTIVATE);
|
|
if ABarControl.DockingStyle <> dsNone then
|
|
begin
|
|
UnregFromDock(ABarControl.DockingStyle, ABarControl.DockControl, ABarControl);
|
|
ABarControl.ItemLinks.RecentItemCount := -1;
|
|
end;
|
|
if AStyle <> dsNone then
|
|
begin
|
|
with ABarControl do
|
|
begin
|
|
BeginInternal; //!!!
|
|
try
|
|
ChangeStyleWinTo(AStyle, ADockControl);
|
|
finally
|
|
EndInternal;
|
|
end;
|
|
end;
|
|
RegInDock(AStyle, ADockControl, ABarControl, APos);
|
|
end
|
|
else
|
|
with ABarControl do
|
|
begin
|
|
BeginInternal; // for WMSize
|
|
try
|
|
ChangeStyleWinTo(AStyle, nil);
|
|
finally
|
|
EndInternal;
|
|
end;
|
|
ASize := GetTrackSize(AStyle);
|
|
with GetDragPointOffset(AStyle) do
|
|
SetWindowPos(Handle, 0, APos.X - X, APos.Y - Y, ASize.X, ASize.Y,
|
|
SWP_NOZORDER or SWP_NOACTIVATE);
|
|
end;
|
|
Windows.ShowWindow(ABarControl.Handle, SW_SHOWNA);
|
|
end
|
|
else
|
|
if ABarControl.DockingStyle <> dsNone then
|
|
ADockControl.MoveBarControl(ABarControl, APos)
|
|
else
|
|
with ABarControl, GetDragPointOffset(AStyle) do
|
|
SetWindowPos(Handle, 0, APos.X - X, APos.Y - Y, 0, 0,
|
|
SWP_NOZORDER or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
end;
|
|
|
|
function TdxBars.GetDockingStyleAtPos(Bar: TdxBar; Pos: TPoint;
|
|
var DockControl: TdxDockControl): TdxBarDockingStyle;
|
|
var
|
|
ADockControl: TdxDockControl;
|
|
|
|
function PtInControlRect(ADockControl: TWinControl; const R: TRect; P: TPoint): Boolean;
|
|
var
|
|
AParent: TWinControl;
|
|
begin
|
|
Result := PtInRect(R, P);
|
|
if Result and ADockControl.HandleAllocated and
|
|
(ADockControl.Parent <> nil) and (ADockControl.Parent.Parent <> nil) then
|
|
begin
|
|
AParent := ADockControl.Parent.Parent;
|
|
P := AParent.ScreenToClient(P);
|
|
Result := ADockControl.Parent.Handle =
|
|
ChildWindowFromPointEx(AParent.Handle, P, CWP_SKIPINVISIBLE);
|
|
end;
|
|
end;
|
|
|
|
function CheckDockZone(ADockingStyle: TdxBarDockingStyle): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := False;
|
|
for I := 0 to FBarManager.DockControlCount - 1 do
|
|
begin
|
|
ADockControl := FBarManager.DockControls[I];
|
|
with ADockControl do
|
|
if (DockingStyle = ADockingStyle) and (CanFocus or BarManager.Designing) then
|
|
begin
|
|
Result :=
|
|
FBarManager.DoDocking(Bar, ADockingStyle, ADockControl) and
|
|
PtInControlRect(ADockControl, GetDockZoneBounds, Pos);
|
|
if Result then Break;
|
|
end;
|
|
end;
|
|
if Result then
|
|
begin
|
|
DockControl := ADockControl;
|
|
GetDockingStyleAtPos := ADockingStyle;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
DockControl := nil;
|
|
Result := dsNone;
|
|
|
|
if FMoving and (GetAsyncKeyState(VK_CONTROL) < 0) then Exit;
|
|
|
|
if CheckDockZone(dsLeft) then Exit;
|
|
if CheckDockZone(dsRight) then Exit;
|
|
if CheckDockZone(dsTop) then Exit;
|
|
if CheckDockZone(dsBottom) then Exit;
|
|
|
|
if FMoving then
|
|
begin
|
|
Dec(Pos.X, FMovingOffset.X);
|
|
Dec(Pos.Y, FMovingOffset.Y);
|
|
end;
|
|
if CheckDockZone(dsLeft) then Exit;
|
|
if CheckDockZone(dsRight) then Exit;
|
|
if CheckDockZone(dsTop) then Exit;
|
|
if CheckDockZone(dsBottom) then Exit;
|
|
end;
|
|
|
|
procedure TdxBars.Moving(AMovingBarControl: TdxBarControl);
|
|
var
|
|
CaptureWnd: HWND;
|
|
Msg: TMsg;
|
|
PrevP, CalcP, P: TPoint;
|
|
begin
|
|
// ---
|
|
if not AMovingBarControl.Bar.CanMoving then Exit;
|
|
|
|
with AMovingBarControl, Bar do
|
|
if DockingStyle <> dsNone then
|
|
GetDockCol.FPos := Point(DockedLeft, DockedTop);
|
|
|
|
FMoving := True;
|
|
AMovingBarControl.Moving := True;
|
|
|
|
GetCursorPos(PrevP);
|
|
|
|
FMovingBarOriginalDockingStyle := FMovingBarControl.DockingStyle;
|
|
FMovingOffset := Point(0, 0);
|
|
FMovingStaticOffset := Point(0, 0);
|
|
with FMovingBarControl, FBar do
|
|
if DockingStyle <> dsNone then
|
|
begin
|
|
P := GetDockCol.Pos;
|
|
Windows.ClientToScreen(RealDockControl.Handle, P);
|
|
|
|
RealDockControl.DeleteBarControl(Control, nil, False);
|
|
CalcP := PrevP;
|
|
RealDockControl.GetPosForRow(Row, OneOnRow, CalcP);
|
|
if Control.Vertical then
|
|
FMovingOffset.X := CalcP.X - PrevP.X
|
|
else
|
|
FMovingOffset.Y := CalcP.Y - PrevP.Y;
|
|
Control.BeginInternal;
|
|
try
|
|
RealDockControl.AddBarControl(Control, P, False);
|
|
finally
|
|
Control.EndInternal;
|
|
end;
|
|
|
|
FMovingStaticOffset := Point(Left, Top);
|
|
Windows.ClientToScreen(RealDockControl.Handle, FMovingStaticOffset);
|
|
with FMovingStaticOffset do
|
|
begin
|
|
X := PrevP.X - X;
|
|
Y := PrevP.Y - Y;
|
|
end;
|
|
end;
|
|
|
|
ProcessPaintMessages;
|
|
|
|
CaptureWnd := BarManager.GetWindowForMouseCapturing;
|
|
SetCapture(CaptureWnd);
|
|
try
|
|
while GetCapture = CaptureWnd do
|
|
begin
|
|
case Integer(GetMessage(Msg, 0, 0, 0)) of
|
|
-1: Break;
|
|
0: begin
|
|
PostQuitMessage(Msg.wParam);
|
|
Break;
|
|
end;
|
|
end;
|
|
with Msg do
|
|
if ((message = WM_KEYDOWN) or (message = WM_KEYUP)) and
|
|
(wParam = VK_CONTROL) then
|
|
begin
|
|
message := WM_MOUSEMOVE;
|
|
hwnd := 0;
|
|
GetCursorPos(P);
|
|
lParam := Windows.LPARAM(PointToSmallPoint(P));
|
|
PrevP := Point(-1, -1);
|
|
end;
|
|
case Msg.message of
|
|
WM_KEYDOWN, WM_KEYUP:
|
|
if Msg.wParam = VK_ESCAPE then Break;
|
|
WM_MOUSEMOVE:
|
|
begin
|
|
P := SmallPointToPoint(TSmallPoint(Msg.lParam));
|
|
ClientToScreen(Msg.hwnd, P);
|
|
if (P.X <> PrevP.X) or (P.Y <> PrevP.Y) then
|
|
begin
|
|
CalcP := P;
|
|
Inc(CalcP.X, FMovingOffset.X);
|
|
Inc(CalcP.Y, FMovingOffset.Y);
|
|
ChangeBarControlPos(FMovingBarControl, CalcP);
|
|
//ProcessPaintMessages;
|
|
PrevP := P;
|
|
end;
|
|
end;
|
|
WM_LBUTTONUP:
|
|
Break;
|
|
else
|
|
TranslateMessage(Msg);
|
|
DispatchMessage(Msg);
|
|
end;
|
|
end;
|
|
finally
|
|
if FDockTimerID > 0 then
|
|
begin
|
|
KillTimer(0, FDockTimerID);
|
|
FDockTimerID := 0;
|
|
FDockBarManager := nil;
|
|
end;
|
|
if GetCapture = CaptureWnd then ReleaseCapture;
|
|
AMovingBarControl := FMovingBarControl;
|
|
FMovingBarControl.Moving := False;
|
|
if AMovingBarControl.DockingStyle <> dsNone then
|
|
AMovingBarControl.DockControl.AssignPositions;
|
|
FMoving := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBars.Update(Item: TCollectionItem);
|
|
begin
|
|
// BarManager.DesignerModified; <-
|
|
end;
|
|
|
|
function TdxBars.Add: TdxBar;
|
|
begin
|
|
Result := TdxBar(inherited Add);
|
|
end;
|
|
|
|
function TdxBars.GetUniqueToolbarName(const BaseName: string): string;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
I := 0;
|
|
repeat
|
|
Inc(I);
|
|
Result := BaseName + IntToStr(I);
|
|
until BarManager.BarByName(Result) = nil;
|
|
end;
|
|
|
|
{ TdxBarControl }
|
|
|
|
constructor TdxBarControl.CreateEx(AOwner: TComponent; ABar: TdxBar);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FBar := ABar;
|
|
FHasCaption := True;
|
|
end;
|
|
|
|
destructor TdxBarControl.Destroy;
|
|
begin
|
|
Destroying;
|
|
if (FBar <> nil) and (FBar.FBars <> nil) and (DockingStyle <> dsNone) then
|
|
FBar.FBars.UnregFromDock(FDockingStyle, FDockControl, Self);
|
|
if WindowHandle = 0 then
|
|
DestroyControls
|
|
else
|
|
DestroyHandle;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TdxBarControl.GetCaptionBkColor: COLORREF;
|
|
begin
|
|
Result := PainterClass.BarCaptionBkColor(Self, BarManager.MainFormActive);
|
|
end;
|
|
|
|
function TdxBarControl.GetCaptionColor: COLORREF;
|
|
begin
|
|
Result := PainterClass.BarCaptionColor(Self);
|
|
end;
|
|
|
|
function TdxBarControl.GetHorizontal: Boolean;
|
|
begin
|
|
Result := DockingStyle in [dsTop, dsBottom];
|
|
end;
|
|
|
|
function TdxBarControl.GetInternallyLocked: Boolean;
|
|
begin
|
|
Result := FInternalLockCount <> 0;
|
|
end;
|
|
|
|
function TdxBarControl.GetMultiLine: Boolean;
|
|
begin
|
|
Result := (DockingStyle = dsNone) or FBar.MultiLine;
|
|
end;
|
|
|
|
function TdxBarControl.GetVertical: Boolean;
|
|
begin
|
|
Result := DockingStyle in [dsLeft, dsRight];
|
|
end;
|
|
|
|
procedure TdxBarControl.SetCloseButtonState(Value: TdxBarMarkState);
|
|
var
|
|
DC: HDC;
|
|
begin
|
|
if FCloseButtonState <> Value then
|
|
begin
|
|
FCloseButtonState := Value;
|
|
if HandleAllocated then
|
|
begin
|
|
DC := GetWindowDC(Handle);
|
|
DrawCloseButton(DC);
|
|
ReleaseDC(Handle, DC);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.SetMoving(Value: Boolean);
|
|
var
|
|
I: Integer;
|
|
KillingHandle: HWND;
|
|
begin
|
|
if FMoving <> Value then
|
|
begin
|
|
FMovingChanging := True;
|
|
try
|
|
FMoving := Value;
|
|
if Value then
|
|
FBar.Bars.FMovingBarControl := Self
|
|
else
|
|
FBar.Bars.FMovingBarControl := nil;
|
|
// SetCursorForMoving(Value);
|
|
for I := 0 to ItemLinks.CanVisibleItemCount - 1 do
|
|
if ItemLinks.CanVisibleItems[I].Control.HasWindow then
|
|
with TdxBarWinControl(ItemLinks.CanVisibleItems[I].Control) do
|
|
if FMoving then
|
|
DestroyWindowHandle
|
|
else
|
|
CreateWindowHandle;
|
|
if FMoving then
|
|
begin
|
|
if FDockingStyle = dsNone then
|
|
begin
|
|
FFloatingHandle := Handle;
|
|
FDockingStyle := dsLeft;
|
|
FDockControl := FBar.FBars.FDockControls[dsLeft];
|
|
DestroyControls;
|
|
WindowHandle := 0;
|
|
CreateHandle;
|
|
FDockedHandle := Handle;
|
|
WindowHandle := 0;
|
|
FDockingStyle := Bar.DockingStyle;
|
|
FDockControl := nil;
|
|
BeginInternal;
|
|
try
|
|
CreateHandle;
|
|
finally
|
|
EndInternal;
|
|
end;
|
|
Windows.SetParent(FDockedHandle, 0);
|
|
end
|
|
else
|
|
begin
|
|
FDockedHandle := Handle;
|
|
FDockingStyle := dsNone;
|
|
DestroyControls;
|
|
WindowHandle := 0;
|
|
CreateHandle;
|
|
FFloatingHandle := Handle;
|
|
WindowHandle := 0;
|
|
FDockingStyle := Bar.DockingStyle;
|
|
BeginInternal;
|
|
try
|
|
CreateHandle;
|
|
finally
|
|
EndInternal;
|
|
end;
|
|
end;
|
|
// this code creates problems with other relative popups
|
|
// SetWindowPos(FFloatingHandle, HWND_TOPMOST, 0, 0, 0, 0,
|
|
// SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
end
|
|
else
|
|
begin
|
|
// this code makes top-most windows normal
|
|
//SetWindowPos(FFloatingHandle, HWND_NOTOPMOST, 0, 0, 0, 0,
|
|
// SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
if FDockingStyle = dsNone then
|
|
KillingHandle := FDockedHandle
|
|
else
|
|
KillingHandle := FFloatingHandle;
|
|
SetWindowLong(KillingHandle, GWL_WNDPROC, Longint(DefWndProc));
|
|
DestroyWindow(KillingHandle);
|
|
SavePos;
|
|
end;
|
|
SetCursorForMoving(Value);
|
|
Perform(WM_SIZE, 0, 0); // to store normal size
|
|
RepaintBar;
|
|
finally
|
|
FMovingChanging := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.CalcControlsPositions;
|
|
var
|
|
I, FirstInRow, X, Y, ARowHeight, ABeginGroupSize, Size, VerSize, AWidth, AHeight: Integer;
|
|
AMultiLine, AVertical, ItemControlAlignApplied: Boolean;
|
|
AItemLink: TdxBarItemLink;
|
|
|
|
procedure InitValues;
|
|
begin
|
|
ItemLinks.EmptyItemRects;
|
|
X := 0;
|
|
Y := 0;
|
|
VerSize := 0;
|
|
AItemLink := nil;
|
|
AMultiLine := MultiLine;
|
|
AVertical := Vertical;
|
|
|
|
if AMultiLine then
|
|
begin
|
|
if AVertical then
|
|
begin
|
|
Size := ClientHeight;
|
|
VerSize := ClientWidth;
|
|
end
|
|
else
|
|
Size := ClientWidth;
|
|
if MarkExists and (DockingStyle <> dsNone) then Dec(Size, MarkSizeX);
|
|
ARowHeight := 0;
|
|
FirstInRow := 0;
|
|
end
|
|
else
|
|
if AVertical then
|
|
begin
|
|
Size := ClientHeight - Byte(MarkExists) * MarkSizeX -
|
|
Byte(MDIButtonsOnBar) * GetMDIHeight;
|
|
ARowHeight := ClientWidth;
|
|
end
|
|
else
|
|
begin
|
|
Size := ClientWidth - Byte(MarkExists) * MarkSizeX -
|
|
Byte(MDIButtonsOnBar) * GetMDIWidth;
|
|
ARowHeight := ClientHeight;
|
|
end;
|
|
end;
|
|
|
|
procedure InitItemControlValues;
|
|
begin
|
|
with AItemLink.Control do
|
|
begin
|
|
FLastInRow := False;
|
|
if AVertical then
|
|
begin
|
|
AWidth := Height;
|
|
AHeight := Width;
|
|
end
|
|
else
|
|
begin
|
|
AWidth := Width;
|
|
AHeight := Height;
|
|
end;
|
|
end;
|
|
if AItemLink.BeginGroup and (X > 0) then
|
|
ABeginGroupSize := BeginGroupSize
|
|
else
|
|
ABeginGroupSize := 0;
|
|
end;
|
|
|
|
function ItemControlBreaksRow: Boolean;
|
|
begin
|
|
Result :=
|
|
(X > 0) and (X + ABeginGroupSize + AWidth > Size) or
|
|
AMultiLine and AItemLink.Control.FBreakingRow;
|
|
end;
|
|
|
|
procedure ArrangeControlsOnRow(const LastInRow: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := FirstInRow to LastInRow do
|
|
with ItemLinks.VisibleItems[I], ItemRect do
|
|
begin
|
|
if AVertical then
|
|
OffsetRect(FItemRect, -(ARowHeight - (Right - Left)) div 2, 0)
|
|
else
|
|
OffsetRect(FItemRect, 0, (ARowHeight - (Bottom - Top)) div 2);
|
|
RowHeight := ARowHeight;
|
|
end;
|
|
FirstInRow := LastInRow + 1;
|
|
end;
|
|
|
|
function GetItemControlRect: TRect;
|
|
|
|
procedure ApplyAlign;
|
|
|
|
procedure CheckSize;
|
|
var
|
|
AMDISize: Integer;
|
|
begin
|
|
if AMultiLine and (AItemLink.Control.Align <> iaLeft) and MDIButtonsOnBar then
|
|
begin
|
|
if AVertical then
|
|
AMDISize := GetMDIHeight
|
|
else
|
|
AMDISize := GetMDIWidth;
|
|
if Result.Right + AMDISize <= Size then
|
|
Dec(Size, AMDISize);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
CheckSize;
|
|
ItemControlAlignApplied := True;
|
|
case AItemLink.Control.Align of
|
|
iaLeft:
|
|
ItemControlAlignApplied := False;
|
|
iaCenter:
|
|
if AVertical then
|
|
OffsetRect(Result, 0, (Size - Result.Bottom) div 2)
|
|
else
|
|
OffsetRect(Result, (Size - Result.Right) div 2, 0);
|
|
iaRight:
|
|
if AVertical then
|
|
OffsetRect(Result, 0, Size - Result.Bottom)
|
|
else
|
|
OffsetRect(Result, Size - Result.Right, 0);
|
|
iaClient:
|
|
with Result do
|
|
if AVertical then
|
|
begin
|
|
Bottom := Size;
|
|
if Bottom - Top < AItemLink.Control.MinWidth then
|
|
Bottom := Top + AItemLink.Control.MinWidth;
|
|
end
|
|
else
|
|
begin
|
|
Right := Size;
|
|
if Right - Left < AItemLink.Control.MinWidth then
|
|
Right := Left + AItemLink.Control.MinWidth;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if AMultiLine then
|
|
if AVertical then
|
|
Result := Bounds(VerSize - Y - AHeight, X + ABeginGroupSize, AHeight, AWidth)
|
|
else
|
|
Result := Bounds(X + ABeginGroupSize, Y, AWidth, AHeight)
|
|
else
|
|
case DockingStyle of
|
|
dsTop, dsBottom:
|
|
Result :=
|
|
Bounds(X + ABeginGroupSize, (ARowHeight - AHeight) div 2, AWidth, AHeight);
|
|
dsLeft, dsRight:
|
|
Result :=
|
|
Bounds((ARowHeight - AHeight) div 2, X + ABeginGroupSize, AHeight, AWidth);
|
|
end;
|
|
ApplyAlign;
|
|
end;
|
|
|
|
procedure CalcX;
|
|
begin
|
|
if ItemControlAlignApplied then
|
|
begin
|
|
X := Size;
|
|
if I < ItemLinks.VisibleItemCount - 1 then
|
|
FTruncated := True;
|
|
end
|
|
else
|
|
Inc(X, ABeginGroupSize + AWidth);
|
|
end;
|
|
|
|
begin
|
|
InitValues;
|
|
for I := 0 to ItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := ItemLinks.VisibleItems[I];
|
|
if AItemLink.Control = nil then AItemLink.CreateControl;
|
|
InitItemControlValues;
|
|
if ItemControlBreaksRow then
|
|
if AMultiLine then
|
|
begin
|
|
ItemLinks.VisibleItems[I - 1].Control.FLastInRow := True;
|
|
ArrangeControlsOnRow(I - 1);
|
|
Inc(Y, ARowHeight + ABeginGroupSize);
|
|
X := 0;
|
|
ABeginGroupSize := 0;
|
|
ARowHeight := 0;
|
|
end
|
|
else
|
|
begin
|
|
AItemLink := ItemLinks.VisibleItems[I - 1];
|
|
Break;
|
|
end;
|
|
AItemLink.ItemRect := GetItemControlRect;
|
|
AItemLink.RowHeight := ARowHeight;
|
|
CalcX;
|
|
if ARowHeight < AHeight then ARowHeight := AHeight;
|
|
end;
|
|
if AItemLink <> nil then
|
|
AItemLink.Control.FLastInRow := True;
|
|
if AMultiLine then
|
|
ArrangeControlsOnRow(ItemLinks.VisibleItemCount - 1);
|
|
end;
|
|
|
|
procedure TdxBarControl.ChangeStyleWinTo(AStyle: TdxBarDockingStyle;
|
|
ADockControl: TdxDockControl);
|
|
begin
|
|
if (FBar = nil) or (FBar.FBars = nil) or IsDestroying then Exit;
|
|
if FMoving then
|
|
begin
|
|
DockControl := ADockControl;
|
|
DockingStyle := AStyle;
|
|
WindowHandle := 0;
|
|
BeginInternal;
|
|
try
|
|
CreateHandle;
|
|
finally
|
|
EndInternal;
|
|
end;
|
|
if FDockingStyle = dsNone then
|
|
Windows.SetParent(FDockedHandle, 0)
|
|
else
|
|
Windows.SetParent(Handle, FDockControl.Handle);
|
|
RepaintBar;
|
|
end
|
|
else
|
|
begin
|
|
BeginInternal;
|
|
try
|
|
DestroyHandle;
|
|
finally
|
|
EndInternal;
|
|
end;
|
|
DockControl := ADockControl;
|
|
DockingStyle := AStyle;
|
|
CreateHandle;
|
|
FrameChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.DrawEditSizingFrame(AWidth: Integer);
|
|
var
|
|
DC: HDC;
|
|
R: TRect;
|
|
begin
|
|
Inc(AWidth, TdxBarEditControl(SelectedItem).CaptionWidth);
|
|
R := SelectedItem.ItemLink.ItemRect;
|
|
DC := GetDC(0);
|
|
if FRightBorderSizing then
|
|
R.Right := R.Left + AWidth
|
|
else
|
|
R.Left := R.Right - AWidth;
|
|
MapWindowPoints(Handle, 0, R, 2);
|
|
with R do
|
|
begin
|
|
BitBlt(DC, Left, Top, Right - Left, 2, 0, 0, 0, DSTINVERT);
|
|
BitBlt(DC, Left, Bottom - 2, Right - Left, 2, 0, 0, 0, DSTINVERT);
|
|
BitBlt(DC, Left, Top + 2, 2, Bottom - Top - 4, 0, 0, 0, DSTINVERT);
|
|
BitBlt(DC, Right - 2, Top + 2, 2, Bottom - Top - 4, 0, 0, 0, DSTINVERT);
|
|
end;
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
|
|
function TdxBarControl.GetDragPointOffset(Style: TdxBarDockingStyle): TPoint;
|
|
begin
|
|
if (Style <> dsNone) and (Self = Bar.Bars.FMovingBarControl) and
|
|
(Style = Bar.Bars.FMovingBarOriginalDockingStyle) then
|
|
with Bar.Bars do
|
|
if Vertical then
|
|
Result := Point(-FMovingOffset.X, FMovingStaticOffset.Y)
|
|
else
|
|
Result := Point(FMovingStaticOffset.X, -FMovingOffset.Y)
|
|
else
|
|
with GetTrackSize(Style) do
|
|
begin
|
|
Result.X := MulDiv(X, RX.X, RX.Y);
|
|
Result.Y := MulDiv(Y, RY.X, RY.Y);
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.GetCaptionNCRect: TRect;
|
|
begin
|
|
GetWindowRect(Result);
|
|
with Result do
|
|
begin
|
|
OffsetRect(Result, -Left, -Top);
|
|
InflateRect(Result, -BarManager.BorderSizeX, -BarManager.BorderSizeY);
|
|
Bottom := Top + PainterClass.BarCaptionSize;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.GetCaptionRect: TRect;
|
|
var
|
|
R: TRect;
|
|
begin
|
|
Result := GetCaptionNCRect;
|
|
GetWindowRect(R);
|
|
with R do
|
|
OffsetRect(Result, Left, Top);
|
|
MapWindowPoints(0, Handle, Result, 2);
|
|
end;
|
|
|
|
procedure TdxBarControl.DrawCloseButton(DC: HDC);
|
|
begin
|
|
PainterClass.BarDrawCloseButton(Self, DC, CloseButtonRectNC);
|
|
end;
|
|
|
|
procedure TdxBarControl.DrawMark(DC: HDC);
|
|
begin
|
|
PainterClass.BarDrawMark(Self, DC, MarkNCRect);
|
|
end;
|
|
|
|
procedure TdxBarControl.DrawMDIButton(AButton: TdxBarMDIButton; ASelected, APressed: Boolean);
|
|
var
|
|
R: TRect;
|
|
DC: HDC;
|
|
begin
|
|
R := RectMDI(AButton);
|
|
DC := Canvas.Handle;
|
|
PainterClass.BarDrawMDIButton(Self, AButton, ASelected, APressed, DC, R);
|
|
end;
|
|
|
|
function TdxBarControl.GetMDIWidth: Integer;
|
|
begin
|
|
if RealMDIButtonsOnBar then
|
|
if IsRealVertical(Self) then
|
|
Result := MDIButtonWidth
|
|
else
|
|
Result := 3 * MDIButtonWidth + 2
|
|
else
|
|
Result := MDIButtonWidth;
|
|
end;
|
|
|
|
function TdxBarControl.GetMDIHeight: Integer;
|
|
begin
|
|
if RealMDIButtonsOnBar then
|
|
if IsRealVertical(Self) then
|
|
Result := 3 * MDIButtonHeight + 2
|
|
else
|
|
Result := MDIButtonHeight
|
|
else
|
|
Result := MDIButtonHeight;
|
|
end;
|
|
|
|
function TdxBarControl.RectMDI(Button: TdxBarMDIButton): TRect;
|
|
var
|
|
AVertical: Boolean;
|
|
AWidth, AHeight, W, H, MDISize, Offset: Integer;
|
|
|
|
function MDIButtonsHaveOwnRow: Boolean;
|
|
var
|
|
I, L: Integer;
|
|
begin
|
|
Result := False;
|
|
L := ItemLinks.VisibleItemCount - 1;
|
|
for I := L downto 0 do
|
|
with ItemLinks.VisibleItems[I] do
|
|
begin
|
|
if Control.FLastInRow and (I <> L) then
|
|
begin
|
|
Result := True;
|
|
Break;
|
|
end;
|
|
if AVertical then
|
|
if ItemRect.Left < Offset then Break
|
|
else
|
|
else
|
|
if ItemRect.Bottom > Offset then Break;
|
|
if I = 0 then Result := True;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
SetRectEmpty(Result);
|
|
|
|
AVertical := Vertical;
|
|
if AVertical then
|
|
begin
|
|
AWidth := ClientHeight;
|
|
AHeight := ClientWidth;
|
|
W := MDIButtonHeight;
|
|
H := MDIButtonWidth;
|
|
MDISize := GetMDIHeight;
|
|
end
|
|
else
|
|
begin
|
|
AWidth := ClientWidth;
|
|
AHeight := ClientHeight;
|
|
W := MDIButtonWidth;
|
|
H := MDIButtonHeight;
|
|
MDISize := GetMDIWidth;
|
|
end;
|
|
if (DockingStyle <> dsNone) and MarkExists then Dec(AWidth, MarkSizeX);
|
|
|
|
if MultiLine then
|
|
begin
|
|
if AVertical then
|
|
Offset := H
|
|
else
|
|
Offset := AHeight - H;
|
|
if not MDIButtonsHaveOwnRow then
|
|
if ItemLinks.VisibleItemCount = 0 then
|
|
Offset := (AHeight - H) div 2
|
|
else
|
|
Offset := AHeight -
|
|
(ItemLinks.VisibleItems[ItemLinks.VisibleItemCount - 1].RowHeight - H) div 2 - H
|
|
else
|
|
if AVertical then Offset := AHeight - Offset;
|
|
end
|
|
else
|
|
Offset := (AHeight - H) div 2;
|
|
|
|
if RealMDIButtonsOnBar then
|
|
begin
|
|
Result := Bounds(AWidth - MDISize + W * Ord(Button), Offset, W, H);
|
|
if Button = mdibClose then OffsetRect(Result, 2, 0);
|
|
end
|
|
else
|
|
Result := Bounds(AWidth - W, Offset, W, H);
|
|
if AVertical then
|
|
with Result do
|
|
begin
|
|
W := Left;
|
|
Left := AHeight - Bottom;
|
|
Bottom := Right;
|
|
Right := AHeight - Top;
|
|
Top := W;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.RealMDIButtonsOnBar: Boolean;
|
|
begin
|
|
Result := (FBar <> nil) and FBar.IsMainMenu and BarManager.IsMDIMaximized and
|
|
(GetSystemMenu(BarManager.ActiveMDIChild, False) <> 0);
|
|
end;
|
|
|
|
function TdxBarControl.MDIButtonsOnBar: Boolean;
|
|
begin
|
|
Result := RealMDIButtonsOnBar or
|
|
(FBar <> nil) and FBar.IsMainMenu and BarManager.ShowCloseButton;
|
|
end;
|
|
|
|
function TdxBarControl.MDIButtonEnabled(AButton: TdxBarMDIButton; State: Integer): Boolean;
|
|
begin
|
|
Result :=
|
|
(AButton = mdibRestore) or
|
|
(AButton = mdibClose) and not RealMDIButtonsOnBar and MDIButtonsOnBar or
|
|
(GetMenuState(GetSystemMenu(BarManager.ActiveMDIChild, False),
|
|
MDIButtonCommands[AButton], MF_BYCOMMAND) and State = 0);
|
|
end;
|
|
|
|
procedure MoreButtonsHintTimerProc(Wnd: HWND; Msg: UINT; idEvent: UINT; Time: DWORD); stdcall;
|
|
var
|
|
BarControl: TdxBarControl;
|
|
P: TPoint;
|
|
begin
|
|
BarControl := TdxBarControl(FindControl(Wnd));
|
|
GetCursorPos(P);
|
|
ScreenToClient(Wnd, P);
|
|
with BarControl do
|
|
if not IsWindowVisible(Handle) or not PtInRect(MarkRect, P) then
|
|
FinishMoreButtonsHintTimer;
|
|
end;
|
|
|
|
procedure TdxBarControl.StartMoreButtonsHintTimer;
|
|
begin
|
|
FMoreButtonsHintTimer := SetTimer(Handle, 1, 50, @MoreButtonsHintTimerProc);
|
|
end;
|
|
|
|
procedure TdxBarControl.FinishMoreButtonsHintTimer;
|
|
begin
|
|
if FMoreButtonsHintTimer <> 0 then
|
|
begin
|
|
KillTimer(0, FMoreButtonsHintTimer);
|
|
FMoreButtonsHintTimer := 0;
|
|
if MarkState = msSelected then MarkState := msNone;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.CheckMarkState(const P: TPoint);
|
|
begin
|
|
if BarManager.PainterClass.BarAllowQuickCustomizing and MarkExists and PtInRect(MarkRect, P) then
|
|
if MarkState = msPressed then
|
|
MarkState := msSelected
|
|
else
|
|
MarkState := msPressed;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMCaptureChanged(var Message: TMessage);
|
|
begin
|
|
inherited;
|
|
if FEditSizingCursor then
|
|
begin
|
|
FEditSizingCursor := False;
|
|
if FSizingEditWidth > 0 then
|
|
begin
|
|
DrawEditSizingFrame(FSizingEditWidth);
|
|
if SelectedItem <> nil then SelectedItem.Repaint;
|
|
end;
|
|
FSizingEditWidth := 0;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMDestroy(var Message: TMessage);
|
|
var
|
|
ADockControl: TdxDockControl;
|
|
begin
|
|
ADockControl := DockControl;
|
|
if ADockControl <> nil then
|
|
ADockControl.IsBarHandleDestroying := True;
|
|
try
|
|
FinishMoreButtonsHintTimer;
|
|
inherited;
|
|
if (FBar <> nil) and not InternallyLocked and not IsInternal and FBar.Visible and
|
|
not (csDestroying in BarManager.MainForm.ComponentState) then
|
|
begin
|
|
BarManager.AddBarToRestoringList(Bar);
|
|
FBar.Visible := False;
|
|
end;
|
|
finally
|
|
if ADockControl <> nil then
|
|
ADockControl.IsBarHandleDestroying := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMGetDlgCode(var Message: TWMGetDlgCode);
|
|
begin
|
|
Message.Result := DLGC_WANTALLKEYS or DLGC_WANTARROWS or DLGC_WANTTAB;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMGetMinMaxInfo(var Message: TWMGetMinmaxInfo);
|
|
begin
|
|
inherited;
|
|
with Message.MinMaxInfo^ do
|
|
begin
|
|
ptMinTrackSize := Point(10, 10);
|
|
ptMaxTrackSize := Point(30000, 30000); // because of Win95/98
|
|
ptMaxSize := ptMaxTrackSize;
|
|
ptMaxPosition := ptMaxSize;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMKeyDown(var Message: TWMKeyDown);
|
|
begin
|
|
inherited;
|
|
if (ActiveBarControl = nil) or SelectedItemWantsKey(Message.CharCode) then
|
|
Exit;
|
|
with Message do
|
|
case CharCode of
|
|
VK_ESCAPE:
|
|
begin
|
|
CharCode := 0;
|
|
HideAll;
|
|
end;
|
|
VK_RETURN, VK_UP, VK_DOWN:
|
|
begin
|
|
if not IsDowned and (SelectedItem is TdxBarSubItemControl) and
|
|
SelectedItem.Enabled then IsDowned := True;
|
|
if (SelectedItem is TdxBarSubItemControl) or (CharCode = VK_RETURN) then
|
|
SelectedItem.Click(False);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMLButtonDblClk(var Message: TWMLButtonDblClk);
|
|
begin
|
|
CheckMarkState(Point(Message.XPos, Message.YPos));
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMLButtonDown(var Message: TWMLButtonDown);
|
|
var
|
|
P: TPoint;
|
|
AButton: TdxBarMDIButton;
|
|
Item: TdxBarItemControl;
|
|
R: TRect;
|
|
|
|
function CheckMDIButton(AButton: TdxBarMDIButton): Boolean;
|
|
begin
|
|
Result := PtInRect(RectMDI(AButton), P);
|
|
if Result then
|
|
begin
|
|
FIsMDIButtonPressed := True;
|
|
FIsMouseOverMDIButton := True;
|
|
FPressedMDIButton := AButton;
|
|
FSelectedMDIButton := FPressedMDIButton;
|
|
DrawMDIButtons(0, [AButton]);
|
|
SetCapture(Handle);
|
|
end
|
|
end;
|
|
|
|
begin
|
|
if FIgnoreMouseClick then Exit;
|
|
|
|
// !!!
|
|
if not BarManager.HideFloatingBarsWhenInactive and (not IsInternal and (DockingStyle = dsNone)) then
|
|
SetActiveWindow(BarManager.MainForm.Handle);
|
|
|
|
P := Point(Message.XPos, Message.YPos);
|
|
|
|
Item := ItemAtPos(P);
|
|
if (Item <> nil) and
|
|
(Item.Enabled and Item.WantMouse or BarManager.Designing) then
|
|
if IsCustomizing then
|
|
if not IsActive then BarGetFocus(Item)
|
|
else
|
|
else
|
|
begin
|
|
if IsActive and
|
|
((Item <> SelectedItem) or ((Item is TdxBarWinControl) and
|
|
not TdxBarWinControl(Item).Focused)) then
|
|
begin
|
|
IsDowned := False;
|
|
SetKeySelectedItem(Item);
|
|
end
|
|
else
|
|
if IsActive and (SelectedItem is TdxBarWinControl) and
|
|
TdxBarWinControl(SelectedItem).Focused then
|
|
with TdxBarWinControl(SelectedItem) do
|
|
begin
|
|
P := SmallPointToPoint(Message.Pos);
|
|
if not PtInRect(WindowRect, P) then
|
|
begin
|
|
MapWindowPoints(Parent.Handle, Handle, P, 1);
|
|
Message.Result := SendMessage(Handle, WM_LBUTTONDOWN,
|
|
Message.Keys, MakeLParam(P.X, P.Y));
|
|
end;
|
|
Exit;
|
|
end
|
|
else
|
|
if not (IsActive and ((Item is TdxBarButtonControl) or not IsDowned)) then
|
|
if not IsActive then BarGetFocus(Item)
|
|
else BarLostFocus;
|
|
if IsActive and not Item.HasWindow then IsDowned := True;
|
|
end
|
|
else
|
|
IsActive := False;
|
|
|
|
if FEditSizingCursor then
|
|
begin
|
|
SetCapture(Handle);
|
|
Exit;
|
|
end;
|
|
|
|
inherited;
|
|
if not BarControlExists(Self) then Exit;
|
|
|
|
if MDIButtonsOnBar and not BarManager.IsCustomizing then
|
|
if RealMDIButtonsOnBar then
|
|
for AButton := Low(TdxBarMDIButton) to High(TdxBarMDIButton) do
|
|
if MDIButtonEnabled(AButton, MF_DISABLED or MF_GRAYED) and
|
|
CheckMDIButton(AButton) then Exit
|
|
else
|
|
else
|
|
if CheckMDIButton(mdibClose) then Exit;
|
|
|
|
if FHitTest = HTCAPTION then
|
|
begin
|
|
P := SmallPointToPoint(Message.Pos);
|
|
Windows.ClientToScreen(Handle, P);
|
|
GetWindowRect(R);
|
|
RX.X := P.X - R.Left;
|
|
RY.X := P.Y - R.Top;
|
|
{ P := GetTrackSize(DockingStyle);
|
|
RX.Y := P.X;
|
|
RY.Y := P.Y;}
|
|
RX.Y := R.Right - R.Left;
|
|
RY.Y := R.Bottom - R.Top;
|
|
FBar.Bars.Moving(Self);
|
|
end
|
|
else
|
|
begin
|
|
CheckMarkState(P);
|
|
if not IsCustomizing and not PtInRect(ClientRect, P) then
|
|
begin
|
|
Windows.ClientToScreen(Handle, P);
|
|
SendMessage(Handle, WM_NCLBUTTONDOWN, FHitTest, LPARAM(PointToSmallPoint(P)));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMLButtonUp(var Message: TWMLButtonUp);
|
|
var
|
|
P: TPoint;
|
|
AButton: TdxBarMDIButton;
|
|
begin
|
|
if FIgnoreMouseClick then
|
|
begin
|
|
FIgnoreMouseClick := False;
|
|
Exit;
|
|
end;
|
|
|
|
if FEditSizingCursor then
|
|
begin
|
|
if FSizingEditWidth > 0 then
|
|
begin
|
|
DrawEditSizingFrame(FSizingEditWidth);
|
|
with TdxBarEditControl(SelectedItem).ItemLink do
|
|
if Width <> FSizingEditWidth then
|
|
UserWidth := FSizingEditWidth
|
|
else
|
|
SelectedItem.Repaint;
|
|
FSizingEditWidth := 0;
|
|
end;
|
|
ReleaseCapture;
|
|
Exit;
|
|
end;
|
|
|
|
P := Point(Message.XPos, Message.YPos);
|
|
if MDIButtonsOnBar and FIsMDIButtonPressed then
|
|
begin
|
|
ReleaseCapture;
|
|
FIsMDIButtonPressed := False;
|
|
FIsMouseOverMDIButton := False;
|
|
RepaintMDIButtons;
|
|
if not RealMDIButtonsOnBar then
|
|
begin
|
|
if PtInRect(RectMDI(mdibClose), P) then
|
|
BarManager.DoCloseButtonClick;
|
|
end
|
|
else
|
|
begin
|
|
for AButton := Low(TdxBarMDIButton) to High(TdxBarMDIButton) do
|
|
if PtInRect(RectMDI(AButton), P) then
|
|
begin
|
|
if AButton = FPressedMDIButton then
|
|
SendMessage(BarManager.ActiveMDIChild, WM_SYSCOMMAND, MDIButtonCommands[AButton], 0);
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMMouseActivate(var Message: TWMMouseActivate);
|
|
begin
|
|
inherited;
|
|
if not IsActive and (DockingStyle = dsNone) then
|
|
SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0,
|
|
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
|
|
//ProcessPaintMessages;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMMouseLeave(var Message: TMessage);
|
|
begin
|
|
if not IsActive then
|
|
begin
|
|
inherited;
|
|
CloseButtonState := msNone;
|
|
// MDI
|
|
if MDIButtonsOnBar then
|
|
begin
|
|
FIsMouseOverMDIButton := False;
|
|
RepaintMDIButtons;
|
|
end;
|
|
end
|
|
else
|
|
if SelectedItem is TdxBarButtonControl then SelectedItem.Repaint;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMMouseMove(var Message: TWMMouseMove);
|
|
var
|
|
PrevIsMouseOverMDIButton: Boolean;
|
|
PrevSelectedMDIButton: TdxBarMDIButton;
|
|
AButton: TdxBarMDIButton;
|
|
AButtons: TdxBarMDIButtons;
|
|
P: TPoint;
|
|
R: TRect;
|
|
PrevSizingEditWidth: Integer;
|
|
ChangeMark: Boolean;
|
|
begin
|
|
if FIsMDIButtonPressed then
|
|
with Message do
|
|
begin
|
|
PrevIsMouseOverMDIButton := FIsMouseOverMDIButton;
|
|
FIsMouseOverMDIButton := PtInRect(RectMDI(FPressedMDIButton), Point(XPos, YPos));
|
|
if FIsMouseOverMDIButton <> PrevIsMouseOverMDIButton then
|
|
DrawMDIButtons(0, [FPressedMDIButton]);
|
|
end
|
|
else
|
|
begin
|
|
P := SmallPointToPoint(Message.Pos);
|
|
// check MDI
|
|
if MDIButtonsOnBar then
|
|
begin
|
|
PrevIsMouseOverMDIButton := FIsMouseOverMDIButton;
|
|
PrevSelectedMDIButton := FSelectedMDIButton;
|
|
FIsMouseOverMDIButton := False;
|
|
if not RealMDIButtonsOnBar then
|
|
begin
|
|
if MDIButtonEnabled(mdibClose, MF_GRAYED) and
|
|
PtInRect(RectMDI(mdibClose), P) then
|
|
begin
|
|
FIsMouseOverMDIButton := True;
|
|
FSelectedMDIButton := mdibClose;
|
|
end
|
|
end
|
|
else
|
|
begin
|
|
for AButton := Low(TdxBarMDIButton) to High(TdxBarMDIButton) do
|
|
if MDIButtonEnabled(AButton, MF_GRAYED) and
|
|
PtInRect(RectMDI(AButton), P) then
|
|
begin
|
|
FIsMouseOverMDIButton := True;
|
|
FSelectedMDIButton := AButton;
|
|
Break;
|
|
end;
|
|
end;
|
|
if (FIsMouseOverMDIButton <> PrevIsMouseOverMDIButton) or
|
|
(FSelectedMDIButton <> PrevSelectedMDIButton) then
|
|
begin
|
|
AButtons := [PrevSelectedMDIButton];
|
|
if FSelectedMDIButton <> PrevSelectedMDIButton then
|
|
AButtons := AButtons + [FSelectedMDIButton];
|
|
DrawMDIButtons(0, AButtons);
|
|
end;
|
|
end;
|
|
|
|
if IsCustomizing and FEditSizingCursor and (GetCapture = Handle) then
|
|
begin
|
|
R := SelectedItem.ItemLink.ItemRect;
|
|
|
|
PrevSizingEditWidth := FSizingEditWidth;
|
|
if FRightBorderSizing then
|
|
FSizingEditWidth := P.X - R.Left
|
|
else
|
|
FSizingEditWidth := R.Right - P.X;
|
|
Dec(FSizingEditWidth, TdxBarEditControl(SelectedItem).CaptionWidth);
|
|
CheckEditWidth(FSizingEditWidth);
|
|
|
|
if FSizingEditWidth <> PrevSizingEditWidth then
|
|
begin
|
|
if PrevSizingEditWidth > 0 then
|
|
DrawEditSizingFrame(PrevSizingEditWidth)
|
|
else
|
|
SelectedItem.Paint(GetItemRect(SelectedItem), ptHorz);
|
|
DrawEditSizingFrame(FSizingEditWidth);
|
|
end;
|
|
end;
|
|
|
|
ChangeMark := False;
|
|
if not NotHandleMouseMove(P) and (ActiveBarControl = nil) then
|
|
begin
|
|
if BarManager.PainterClass.BarAllowQuickCustomizing and MarkExists and (MarkState <> msPressed) then
|
|
if PtInRect(MarkRect, P) then
|
|
MarkState := msSelected
|
|
else
|
|
ChangeMark := True;
|
|
if (DockingStyle = dsNone) and Bar.CanClose and BarManager.PainterClass.BarAllowHotTrack then
|
|
if PtInRect(CloseButtonRect, P) then
|
|
if CloseButtonState <> msSelected then
|
|
begin
|
|
if not MouseTracking(Handle) then
|
|
StartMouseTracking(Handle);
|
|
CloseButtonState := msSelected;
|
|
end
|
|
else
|
|
else
|
|
CloseButtonState := msNone;
|
|
end;
|
|
inherited;
|
|
if ChangeMark then MarkState := msNone;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMNCCalcSize(var Message: TWMNCCalcSize);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
if not FMovingChanging then
|
|
FHasSizeGrip := FBar.HasSizeGrip;
|
|
if DockingStyle = dsNone then
|
|
begin
|
|
if PainterClass.BarUseSystemNCBorder then
|
|
inherited
|
|
else
|
|
InflateRect(Message.CalcSize_Params^.rgrc[0], -BarManager.BorderSizeX, -BarManager.BorderSizeY);
|
|
if FHasCaption then
|
|
with Message.CalcSize_Params^.rgrc[0] do
|
|
begin
|
|
Inc(Top, BarManager.PainterClass.BarCaptionAreaSize);
|
|
Inc(Left, BarManager.PainterClass.BarHorSize);
|
|
Dec(Right, BarManager.PainterClass.BarHorSize);
|
|
Inc(Top, BarManager.PainterClass.BarTopSize);
|
|
Dec(Bottom, BarManager.PainterClass.BarBottomSize);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
inherited;
|
|
if FBar.BorderStyle = bbsSingle then
|
|
with Message.CalcSize_Params^ do
|
|
begin
|
|
PainterClass.BarBorderSizes(FBar, DockingStyle, R);
|
|
Inc(rgrc[0].Left, R.Left);
|
|
Dec(rgrc[0].Right, R.Right);
|
|
Inc(rgrc[0].Top, R.Top);
|
|
Dec(rgrc[0].Bottom, R.Bottom);
|
|
if Horizontal then
|
|
Inc(rgrc[0].Left, BarManager.FingersSize(FBar))
|
|
else
|
|
Inc(rgrc[0].Top, BarManager.FingersSize(FBar));
|
|
end
|
|
else
|
|
begin
|
|
if FBar.IsStatusBar then
|
|
with Message.CalcSize_Params^.rgrc[0] do
|
|
begin
|
|
Inc(Top, PainterClass.StatusBarTopBorderSize(BarManager));
|
|
if FHasSizeGrip then
|
|
Dec(Right, PainterClass.StatusBarGripSize(BarManager).cx);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMNCHitTest(var Message: TWMNCHitTest);
|
|
var
|
|
R: TRect;
|
|
P: TPoint;
|
|
AControl: TdxBarItemControl;
|
|
NoControl: Boolean;
|
|
|
|
function MouseAboveMDIButtons: Boolean;
|
|
begin
|
|
Result := MDIButtonsOnBar and
|
|
(RealMDIButtonsOnBar and
|
|
(PtInRect(RectMDI(mdibMinimize), P) or PtInRect(RectMDI(mdibRestore), P)) or
|
|
PtInRect(RectMDI(mdibClose), P));
|
|
end;
|
|
|
|
begin
|
|
inherited;
|
|
FHitTest := 0;
|
|
GetWindowRect(R);
|
|
P := SmallPointToPoint(Message.Pos);
|
|
Windows.ScreenToClient(Handle, P);
|
|
with Message do
|
|
if DockingStyle = dsNone then
|
|
case Result of
|
|
HTTOPLEFT, HTTOPRIGHT:
|
|
if YPos < R.Top + BarManager.BorderSizeY then
|
|
begin
|
|
FHitTest := HTTOP;
|
|
Result := HTTOP;
|
|
end
|
|
else
|
|
if Result = HTTOPLEFT then
|
|
begin
|
|
FHitTest := HTLEFT;
|
|
Result := HTLEFT;
|
|
end
|
|
else
|
|
begin
|
|
FHitTest := HTRIGHT;
|
|
Result := HTRIGHT;
|
|
end;
|
|
HTBOTTOMLEFT, HTBOTTOMRIGHT:
|
|
if YPos > R.Bottom - BarManager.BorderSizeY then
|
|
begin
|
|
FHitTest := HTBOTTOM;
|
|
Result := HTBOTTOM;
|
|
end
|
|
else
|
|
if Result = HTBOTTOMLEFT then
|
|
begin
|
|
FHitTest := HTLEFT;
|
|
Result := HTLEFT;
|
|
end
|
|
else
|
|
begin
|
|
FHitTest := HTRIGHT;
|
|
Result := HTRIGHT;
|
|
end;
|
|
HTCLIENT:
|
|
begin
|
|
AControl := ItemAtPos(P);
|
|
if ((AControl = nil) or not IsCustomizing and not AControl.WantMouse) and
|
|
not MouseAboveMDIButtons then
|
|
begin
|
|
FHitTest := HTCAPTION;
|
|
Result := HTCLIENT;
|
|
end;
|
|
end;
|
|
HTNOWHERE:
|
|
begin
|
|
if not IsCustomizing and MarkExists and PtInRect(MarkRect, P) then
|
|
FHitTest := HTCLIENT
|
|
else
|
|
if Bar.CanClose and PtInRect(CloseButtonRect, P) then
|
|
if not PainterClass.BarUseSystemClose then
|
|
FHitTest := HTCLOSE
|
|
else
|
|
begin
|
|
FHitTest := HTCLIENT;
|
|
Result := HTCLOSE;
|
|
Exit;
|
|
end
|
|
else
|
|
FHitTest := HTCAPTION;
|
|
Result := HTCLIENT;
|
|
end;
|
|
else
|
|
FHitTest := Result;
|
|
end
|
|
else // DockingStyle <> dsNone
|
|
begin
|
|
if Result = HTCLIENT then
|
|
AControl := ItemAtPos(P)
|
|
else
|
|
AControl := nil;
|
|
NoControl := (AControl = nil) or not IsCustomizing and not AControl.WantMouse;
|
|
if (Result = HTCLIENT) and NoControl or (Result = HTNOWHERE) then
|
|
begin
|
|
if not Vertical and (P.X < 0) or Vertical and (P.Y < 0) or
|
|
NoControl and not MouseAboveMDIButtons and (not MarkExists or not PtInRect(MarkRect, P)) then
|
|
if FHasSizeGrip and PtInRect(SizeGripRect, P) then
|
|
begin
|
|
FHitTest := HTBOTTOMRIGHT;
|
|
Result := HTBOTTOMRIGHT;
|
|
end
|
|
else
|
|
begin
|
|
FHitTest := HTCAPTION;
|
|
Result := HTCLIENT;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
FHitTest := Result;
|
|
Result := HTCLIENT;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMNCLButtonDown(var Message: TWMNCLButtonDown);
|
|
var
|
|
SuccessfulDragging: Boolean;
|
|
CaptureWnd: HWND;
|
|
Msg: TMsg;
|
|
P: TPoint;
|
|
ABar: TdxBar;
|
|
begin
|
|
HideAll;
|
|
if not BarControlExists(Self) then Exit;
|
|
if Message.HitTest = HTCLOSE then
|
|
begin
|
|
if not BarManager.HideFloatingBarsWhenInactive then
|
|
SetActiveWindow(BarManager.MainForm.Handle);
|
|
|
|
CloseButtonState := msPressed;
|
|
SuccessfulDragging := False;
|
|
|
|
CaptureWnd := Handle;
|
|
SetCapture(CaptureWnd);
|
|
try
|
|
while GetCapture = CaptureWnd do
|
|
begin
|
|
case Integer(GetMessage(Msg, 0, 0, 0)) of
|
|
-1: Break;
|
|
0: begin
|
|
PostQuitMessage(Msg.wParam);
|
|
Break;
|
|
end;
|
|
end;
|
|
with Msg do
|
|
case message of
|
|
WM_LBUTTONUP:
|
|
begin
|
|
SuccessfulDragging := CloseButtonState = msPressed;
|
|
Break;
|
|
end;
|
|
WM_MOUSEMOVE:
|
|
begin
|
|
GetCursorPos(P);
|
|
Windows.ScreenToClient(Handle, P);
|
|
if PtInRect(CloseButtonRect, P) then
|
|
CloseButtonState := msPressed
|
|
else
|
|
CloseButtonState := msSelected;
|
|
end;
|
|
else
|
|
TranslateMessage(Msg);
|
|
DispatchMessage(Msg);
|
|
end;
|
|
end;
|
|
finally
|
|
if GetCapture = CaptureWnd then ReleaseCapture;
|
|
CloseButtonState := msNone;
|
|
if SuccessfulDragging then
|
|
begin
|
|
ABar := FBar;
|
|
Bar.Visible := False;
|
|
ABar.BarManager.DesignerModified;
|
|
ABar.BarManager.DoBarClose(ABar);
|
|
end;
|
|
end;
|
|
Exit;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMNCPaint(var Message: TMessage);
|
|
var
|
|
WR, R, CR: TRect;
|
|
Rgn, Rgn1: HRGN;
|
|
DC: HDC;
|
|
AToolbarBrush: HBRUSH;
|
|
BR: TRect;
|
|
|
|
procedure DrawStatusBar;
|
|
var
|
|
R1: TRect;
|
|
begin
|
|
DC := GetWindowDC(Handle);
|
|
// separator
|
|
R1 := R;
|
|
R1.Bottom := R1.Top + PainterClass.StatusBarTopBorderSize(BarManager);
|
|
PainterClass.BarDrawStatusBarTopBorder(Self, DC, R1, AToolbarBrush);
|
|
// grip
|
|
if FHasSizeGrip then
|
|
begin
|
|
R1 := R;
|
|
Inc(R1.Top, PainterClass.StatusBarTopBorderSize(BarManager));
|
|
R1.Left := R1.Right - PainterClass.StatusBarGripSize(BarManager).cx;
|
|
PainterClass.BarDrawStatusBarGrip(Self, DC, R1, AToolbarBrush);
|
|
end;
|
|
ReleaseDC(Handle, DC);
|
|
end;
|
|
|
|
procedure DrawFloatingBarBorder;
|
|
begin
|
|
DC := GetWindowDC(Handle);
|
|
PainterClass.BarDrawFloatingBarBorder(Self, DC, R, CR, AToolbarBrush);
|
|
ReleaseDC(Handle, DC);
|
|
end;
|
|
|
|
procedure DrawFloatingBarCaption;
|
|
begin
|
|
if not FHasCaption then Exit;
|
|
R := GetCaptionNCRect;
|
|
CR := R;
|
|
DC := GetWindowDC(Handle);
|
|
PainterClass.BarDrawFloatingBarCaption(Self, DC, R, CR, AToolbarBrush);
|
|
ReleaseDC(Handle, DC);
|
|
end;
|
|
|
|
begin
|
|
inherited;
|
|
GetWindowRect(WR);
|
|
R := WR;
|
|
Windows.GetClientRect(Handle, CR);
|
|
with ClientToScreen(Point(0, 0)), WR do
|
|
OffsetRect(CR, X - Left, Y - Top);
|
|
OffsetRect(R, -R.Left, -R.Top);
|
|
AToolbarBrush := ToolbarBrush;
|
|
|
|
if (DockingStyle <> dsNone) and (FBar.BorderStyle = bbsNone) then
|
|
begin
|
|
if FBar.IsStatusBar then DrawStatusBar;
|
|
Exit;
|
|
end;
|
|
|
|
with R do
|
|
if DockingStyle = dsNone then
|
|
begin
|
|
DrawFloatingBarBorder;
|
|
R := CR;
|
|
if FHasCaption then
|
|
begin
|
|
Dec(Left, BarManager.PainterClass.BarHorSize);
|
|
Inc(Right, BarManager.PainterClass.BarHorSize);
|
|
Dec(Top, BarManager.PainterClass.BarTopSize);
|
|
Inc(Bottom, BarManager.PainterClass.BarBottomSize);
|
|
end;
|
|
Rgn := CreateRectRgn(Left, Top, Right, Bottom);
|
|
end
|
|
else
|
|
begin
|
|
PainterClass.BarBorderPaintSizes(Self, BR);
|
|
Rgn := CreateRectRgn(Left + BR.Left, Top + BR.Top, Right - BR.Right, Bottom - BR.Bottom);
|
|
end;
|
|
with CR do
|
|
Rgn1 := CreateRectRgn(Left, Top, Right, Bottom);
|
|
CombineRgn(Rgn, Rgn1, Rgn, RGN_XOR);
|
|
DeleteObject(Rgn1);
|
|
|
|
DC := GetWindowDC(Handle);
|
|
FillBackgroundRgn(DC, Rgn, AToolbarBrush, False);
|
|
|
|
DeleteObject(Rgn);
|
|
if DockingStyle <> dsNone then
|
|
PainterClass.BarDrawDockedBarBorder(Self, DC, R, AToolbarBrush);
|
|
ReleaseDC(Handle, DC);
|
|
|
|
if DockingStyle = dsNone then
|
|
DrawFloatingBarCaption;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMRButtonDown(var Message: TWMRButtonDown);
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
ReleaseCapture;
|
|
if IsCustomizing then IsActive := False
|
|
else {HideAll};//BarLostFocus;
|
|
inherited;
|
|
if BarManager.IsCustomizing then Exit;
|
|
//SetMouseSelectedItem(nil);
|
|
with Message do
|
|
P := ClientToScreen(Point(XPos, YPos));
|
|
ShowToolbarsPopup(Self, BarManager, P);
|
|
end;
|
|
|
|
procedure TdxBarControl.WMSetCursor(var Message: TWMSetCursor);
|
|
var
|
|
P: TPoint;
|
|
R: TRect;
|
|
begin
|
|
if GetCapture = 0 then
|
|
begin
|
|
GetCursorPos(P);
|
|
Windows.ScreenToClient(Handle, P);
|
|
FEditSizingCursor := False;
|
|
if IsCustomizing and (SelectedItem is TdxBarEditControl) then
|
|
begin
|
|
R := SelectedItem.ItemLink.ItemRect;
|
|
with R do
|
|
if PtInRect(Rect(Left, Top, Left + EditSizingZoneSize, Bottom), P) then
|
|
begin
|
|
FEditSizingCursor := True;
|
|
FRightBorderSizing := False;
|
|
end
|
|
else
|
|
if PtInRect(Rect(Right - EditSizingZoneSize, Top, Right, Bottom), P) then
|
|
begin
|
|
FEditSizingCursor := True;
|
|
FRightBorderSizing := True;
|
|
end;
|
|
end;
|
|
if not Moving and not FEditSizingCursor and Bar.CanMoving then // ---
|
|
SetCursorForMoving(PtInRect(GetSizeAllCursorBounds, P));
|
|
end;
|
|
if FEditSizingCursor then
|
|
SetCursor(Screen.Cursors[crdxBarEditSizing])
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMSize(var Message: TWMSize);
|
|
begin
|
|
if IsDestroying then Exit;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMSizing(var Message: TMessage);
|
|
var
|
|
Size: TPoint;
|
|
NCSize: Integer;
|
|
begin
|
|
inherited;
|
|
if DockingStyle = dsNone then
|
|
with Message, PRect(lParam)^ do
|
|
begin
|
|
case wParam of
|
|
WMSZ_LEFT, WMSZ_RIGHT:
|
|
begin
|
|
NCSize := Bar.BarNCSizeX(dsNone);
|
|
Size := GetSizeForWidth(DockingStyle, Right - Left - NCSize);
|
|
if wParam = WMSZ_LEFT then
|
|
Left := Right - Size.X - NCSize
|
|
else
|
|
Right := Left + Size.X + NCSize;
|
|
Bottom := Top + Size.Y + Bar.BarNCSizeY(dsNone);
|
|
end;
|
|
WMSZ_TOP, WMSZ_BOTTOM:
|
|
begin
|
|
NCSize := Bar.BarNCSizeY(dsNone);
|
|
Size := GetSizeForHeight(DockingStyle, Bottom - Top - NCSize);
|
|
Right := Left + Size.X + Bar.BarNCSizeX(dsNone);
|
|
if wParam = WMSZ_TOP then
|
|
Top := Bottom - Size.Y - NCSize
|
|
else
|
|
Bottom := Top + Size.Y + NCSize;
|
|
end;
|
|
else
|
|
PRect(lParam)^ := BoundsRect;
|
|
Result := 1;
|
|
end;
|
|
// against windows' bug:
|
|
if Top < -15 then OffsetRect(PRect(lParam)^, 0, -15 - Top);
|
|
Result := 1;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMWindowPosChanged(var Message: TWMWindowPosChanged);
|
|
begin
|
|
inherited;
|
|
if (FBar = nil) or InternallyLocked or IsDestroying then Exit;
|
|
FBar.ChangeDockingStyle(DockingStyle, DockControl);
|
|
SavePos;
|
|
with Message.WindowPos^ do
|
|
begin
|
|
if ((flags and SWP_NOSIZE = 0) or (flags and SWP_NOMOVE = 0)) and
|
|
(FQuickPopup <> nil) then
|
|
begin
|
|
FQuickPopup.OwnerBounds := MarkScreenRect;
|
|
FQuickPopup.ResizeShadow;
|
|
SendMessage(FQuickPopup.Handle, WM_NCPAINT, 0, 0);
|
|
end;
|
|
if (flags and SWP_NOSIZE <> 0) and (flags and SWP_NOMOVE = 0) and
|
|
(FHasSizeGrip <> FBar.HasSizeGrip) then
|
|
RebuildBar;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WMWindowPosChanging(var Message: TWMWindowPosChanging);
|
|
|
|
procedure CalcCoords(const AWindowPos: TWindowPos; var ALeft, ATop, AWidth, AHeight: Integer);
|
|
begin
|
|
if AWindowPos.flags and SWP_NOMOVE = 0 then
|
|
begin
|
|
ALeft := AWindowPos.x;
|
|
ATop := AWindowPos.y;
|
|
end
|
|
else
|
|
begin
|
|
ALeft := Left;
|
|
ATop := Top;
|
|
end;
|
|
if AWindowPos.flags and SWP_NOSIZE = 0 then
|
|
begin
|
|
AWidth := AWindowPos.cx;
|
|
AHeight := AWindowPos.cy;
|
|
end
|
|
else
|
|
begin
|
|
AWidth := Width;
|
|
AHeight := Height;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
L, T, W, H: Integer;
|
|
I: Integer;
|
|
AIntersect: Boolean;
|
|
P: TPoint;
|
|
R, ABarRect, ARect: TRect;
|
|
begin
|
|
inherited;
|
|
if DockingStyle <> dsNone then Exit;
|
|
if (Message.WindowPos^.flags and SWP_NOMOVE = 0) or
|
|
(Message.WindowPos^.flags and SWP_NOSIZE = 0) then
|
|
begin
|
|
CalcCoords(Message.WindowPos^, L, T, W, H);
|
|
|
|
ABarRect := Bounds(L, T, W, H);
|
|
AIntersect := False;
|
|
for I := 0 to Screen.MonitorCount - 1 do
|
|
begin
|
|
// begin BoundsRect
|
|
P := Point(Screen.Monitors[I].Left, Screen.Monitors[I].Top);
|
|
R := GetWorkArea(P);
|
|
// end BoundsRect
|
|
if IntersectRect(ARect, R, ABarRect) then
|
|
begin
|
|
AIntersect := True;
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
if not AIntersect then
|
|
begin
|
|
GetCursorPos(P);
|
|
R := GetWorkArea(P);
|
|
with Message.WindowPos^ do
|
|
begin
|
|
with R do
|
|
begin
|
|
if L + W <= Left then
|
|
begin
|
|
x := Left;
|
|
y := T;
|
|
flags := flags and not SWP_NOMOVE;
|
|
end;
|
|
if T + H <= Top then
|
|
begin
|
|
x := L;
|
|
y := Top;
|
|
flags := flags and not SWP_NOMOVE;
|
|
end;
|
|
if L >= Right then
|
|
begin
|
|
x := Right - W;
|
|
y := T;
|
|
flags := flags and not SWP_NOMOVE;
|
|
end;
|
|
if T >= Bottom then
|
|
begin
|
|
x := L;
|
|
y := Bottom - H;
|
|
flags := flags and not SWP_NOMOVE;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.CMFontChanged(var Message: TMessage);
|
|
var
|
|
LogFont: TLogFont;
|
|
begin
|
|
if IsVertical(Self) and not FSettingFont then
|
|
begin
|
|
FSettingFont := True;
|
|
GetObject(Font.Handle, SizeOf(LogFont), @LogFont);
|
|
with LogFont do
|
|
begin
|
|
lfEscapement := -900;
|
|
lfOrientation := lfEscapement;
|
|
lfOutPrecision := OUT_TT_ONLY_PRECIS;
|
|
end;
|
|
Canvas.Font.Handle := CreateFontIndirect(LogFont);
|
|
FSettingFont := False;
|
|
end
|
|
else
|
|
Canvas.Font := Font;
|
|
CalcDrawingConsts;
|
|
if not InternallyLocked then
|
|
begin
|
|
SetMouseSelectedItem(nil);
|
|
RepaintBar;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarControl.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited CreateParams(Params);
|
|
with Params do
|
|
begin
|
|
Style := WS_CLIPCHILDREN or WS_CLIPSIBLINGS;
|
|
WindowClass.Style := CS_DBLCLKS or CS_HREDRAW or CS_VREDRAW;
|
|
ExStyle := 0;//WS_EX_TOOLWINDOW;
|
|
if DockingStyle = dsNone then
|
|
begin
|
|
Style := Style or WS_POPUPWINDOW or WS_SIZEBOX;
|
|
// WndParent := BarManager.MainForm.Handle;
|
|
WndParent := GetMainForm.Handle;
|
|
end
|
|
else
|
|
begin
|
|
Style := Style or WS_CHILD;
|
|
WndParent := FDockControl.Handle;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.CreateWnd;
|
|
begin
|
|
if FMoving and InternallyLocked then
|
|
if FDockingStyle = dsNone then
|
|
WindowHandle := FFloatingHandle
|
|
else
|
|
WindowHandle := FDockedHandle
|
|
else
|
|
inherited;
|
|
Text := Bar.Caption;
|
|
SendMessage(Handle, WM_NCACTIVATE, Longint(True), 0); // don't remove (AV in ntdll.dll)
|
|
end;
|
|
|
|
procedure TdxBarControl.Paint;
|
|
var
|
|
DC: HDC;
|
|
I: Integer;
|
|
AItemLink: TdxBarItemLink;
|
|
ItemRect: TRect;
|
|
Rgn: HRGN;
|
|
AButtons: TdxBarMDIButtons;
|
|
AToolbarBrush: HBRUSH;
|
|
AVertical: Boolean;
|
|
begin
|
|
inherited;
|
|
if {not IsWindowVisible(BarManager.MainForm.Handle) or} FDestroyFlag then Exit;
|
|
|
|
// recalc positions of items
|
|
CalcControlsPositions;
|
|
|
|
// hide invisible items that require that
|
|
if not BarManager.Designing then
|
|
for I := 0 to FItemLinks.CanVisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := FItemLinks.CanVisibleItems[I];
|
|
with AItemLink do
|
|
if Item.NeedToBeHidden and (VisibleIndex = -1) then
|
|
Item.HideControl(Control);
|
|
end;
|
|
|
|
AToolbarBrush := ToolbarBrush;
|
|
Rgn := CreateRectRgnIndirect(ClientRect);
|
|
DC := Canvas.Handle;
|
|
|
|
// paint items and "BeginGroups"
|
|
for I := 0 to FItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := FItemLinks.VisibleItems[I];
|
|
ItemRect := GetItemRect(AItemLink.Control);
|
|
PaintItem(AItemLink.Control);
|
|
ExcludeRect(Rgn, ItemRect);
|
|
|
|
if AItemLink.BeginGroup and not IsRectEmpty(ItemRect) then
|
|
begin
|
|
AVertical := Vertical;
|
|
if not AVertical and (ItemRect.Left = 0) and (ItemRect.Top > 0) or
|
|
AVertical and (ItemRect.Top > 0) then
|
|
begin // begin group in vertical direction
|
|
with ItemRect do
|
|
begin
|
|
if AVertical then
|
|
ItemRect := Bounds(
|
|
Left - (AItemLink.FRowHeight - (Right - Left)) div 2,
|
|
Top - BeginGroupSize,
|
|
AItemLink.FRowHeight, BeginGroupSize)
|
|
else
|
|
ItemRect := Bounds(
|
|
0,
|
|
Top - (AItemLink.FRowHeight - (Bottom - Top)) div 2 - BeginGroupSize,
|
|
ClientWidth - Byte((DockingStyle <> dsNone) and MarkExists) * MarkSizeX,
|
|
BeginGroupSize);
|
|
end;
|
|
ExcludeRect(Rgn, ItemRect);
|
|
AItemLink.Control.FBeginGroupRect := ItemRect;
|
|
PainterClass.BarDrawBeginGroup(Self, DC, ItemRect, AToolbarBrush, True);
|
|
end
|
|
else
|
|
begin // begin group in horizontal direction
|
|
with ItemRect do
|
|
begin
|
|
if AVertical then
|
|
ItemRect := Bounds(
|
|
Right + (AItemLink.FRowHeight - (Right - Left)) div 2, 0,
|
|
BeginGroupSize,
|
|
ClientHeight - Byte((DockingStyle <> dsNone) and MarkExists) * MarkSizeX)
|
|
else
|
|
ItemRect := Bounds(
|
|
Left - BeginGroupSize,
|
|
Top - (AItemLink.FRowHeight - (Bottom - Top)) div 2,
|
|
BeginGroupSize, AItemLink.FRowHeight);
|
|
end;
|
|
ExcludeRect(Rgn, ItemRect);
|
|
AItemLink.Control.FBeginGroupRect := ItemRect;
|
|
PainterClass.BarDrawBeginGroup(Self, DC, ItemRect, AToolbarBrush, False);
|
|
end;
|
|
end
|
|
else
|
|
SetRectEmpty(AItemLink.Control.FBeginGroupRect);
|
|
end;
|
|
|
|
// draw MDI buttons
|
|
if MDIButtonsOnBar then
|
|
begin
|
|
if RealMDIButtonsOnBar then
|
|
AButtons := [mdibMinimize, mdibRestore, mdibClose]
|
|
else
|
|
AButtons := [mdibClose];
|
|
DrawMDIButtons(Rgn, AButtons);
|
|
end;
|
|
|
|
// draw mark(s)
|
|
if (DockingStyle <> dsNone) and MarkExists then
|
|
begin
|
|
ItemRect := MarkItemRect;
|
|
PainterClass.BarDrawMarks(Self, DC, ItemRect, AToolbarBrush);
|
|
ExcludeRect(Rgn, ItemRect);
|
|
end;
|
|
|
|
FillBackgroundRgn(DC, Rgn, AToolbarBrush, True);
|
|
DeleteObject(Rgn);
|
|
end;
|
|
|
|
procedure TdxBarControl.BeginInternal;
|
|
begin
|
|
Inc(FInternalLockCount);
|
|
end;
|
|
|
|
procedure TdxBarControl.EndInternal;
|
|
begin
|
|
if FInternalLockCount > 0 then
|
|
Dec(FInternalLockCount);
|
|
end;
|
|
|
|
procedure TdxBarControl.CalcDrawingConsts;
|
|
begin
|
|
inherited;
|
|
FMDIButtonWidth := GetSystemMetrics(SM_CXMENUSIZE) - 2;
|
|
FMDIButtonHeight := GetSystemMetrics(SM_CYMENUSIZE) - 2 * 2;
|
|
end;
|
|
|
|
function TdxBarControl.CanAlignControl(AControl: TdxBarItemControl): Boolean;
|
|
begin
|
|
with AControl.ItemLink do
|
|
Result := (CanVisibleIndex = Owner.CanVisibleItemCount - 1);
|
|
end;
|
|
|
|
function TdxBarControl.CanCallInheritedNCCalcSize: Boolean; // obsolete
|
|
begin
|
|
Result := (DockingStyle <> dsNone) or not Flat;
|
|
end;
|
|
|
|
function TdxBarControl.CanCustomizing: Boolean;
|
|
begin
|
|
Result := inherited CanCustomizing or FBar.AllowCustomizing;
|
|
end;
|
|
|
|
function TdxBarControl.CanFinishMouseTracking(const Message: TWMNCHitTest): Boolean;
|
|
begin
|
|
Result := inherited CanFinishMouseTracking(Message) and
|
|
(CloseButtonState <> msSelected);
|
|
end;
|
|
|
|
function TdxBarControl.CloseButtonRect: TRect;
|
|
var
|
|
ASize: TSize;
|
|
RW, RH: Integer;
|
|
begin
|
|
Result := GetCaptionRect;
|
|
with Result do
|
|
Left := Right - PainterClass.BarCaptionSize;
|
|
ASize := PainterClass.BarCloseButtonSize;
|
|
RW := Result.Right - Result.Left;
|
|
if ASize.cx < RW then
|
|
begin
|
|
Result.Left := Result.Left + (RW div 2) - (ASize.cx div 2);
|
|
Result.Right := Result.Left + ASize.cx;
|
|
end;
|
|
RH := Result.Bottom - Result.Top;
|
|
if ASize.cy < RH then
|
|
begin
|
|
Result.Top := Result.Top + (RH div 2) - (ASize.cy div 2);
|
|
Result.Bottom := Result.Top + ASize.cy;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.CloseButtonRectNC: TRect;
|
|
var
|
|
WR: TRect;
|
|
begin
|
|
Result := CloseButtonRect;
|
|
MapWindowPoints(Handle, 0, Result, 2);
|
|
GetWindowRect(WR);
|
|
OffsetRect(Result, -WR.Left, -WR.Top);
|
|
end;
|
|
|
|
function TdxBarControl.GetAlphaBlendValue: Byte;
|
|
begin
|
|
if {not FMovingChanging and }(DockingStyle = dsNone) then
|
|
Result := 200
|
|
else
|
|
Result := 255;
|
|
end;
|
|
|
|
function TdxBarControl.GetBeginGroupSize: Integer;
|
|
begin
|
|
Result := PainterClass.BarBeginGroupSize;
|
|
end;
|
|
|
|
function TdxBarControl.GetCol: Integer;
|
|
var
|
|
I, J: Integer;
|
|
begin
|
|
Result := 0;
|
|
if (FBar = nil) or (FBar.FBars = nil) or (DockingStyle = dsNone) or
|
|
(FDockControl = nil) then Exit;
|
|
with FDockControl do
|
|
for I := 0 to FRowList.Count - 1 do
|
|
for J := 0 to TdxDockRow(FRowList[I]).ColList.Count - 1 do
|
|
if TdxDockCol(TdxDockRow(FRowList[I]).ColList[J]).BarControl = Self then
|
|
begin
|
|
Result := J;
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.WndProc(var Message: TMessage);
|
|
var
|
|
AStyle: TdxBarDockingStyle;
|
|
ADockControl: TdxDockControl;
|
|
begin
|
|
with Message do
|
|
begin
|
|
if Msg = WM_SETFOCUS then
|
|
begin
|
|
Exit;
|
|
end;
|
|
|
|
if (FIsMDIButtonPressed or FIsMouseOverMDIButton) and (Msg = WM_CANCELMODE) then
|
|
begin
|
|
ReleaseCapture;
|
|
FIsMDIButtonPressed := False;
|
|
FIsMouseOverMDIButton := False;
|
|
RepaintMDIButtons;
|
|
end;
|
|
|
|
if (Msg = WM_LBUTTONDBLCLK) and (FHitTest = HTCAPTION) then
|
|
begin
|
|
if not BarManager.Designing then
|
|
with Bar do
|
|
begin
|
|
ADockControl := nil;
|
|
if DockingStyle = dsNone then
|
|
if DockedDockingStyle <> dsNone then
|
|
begin
|
|
AStyle := DockedDockingStyle;
|
|
ADockControl := DockedDockControl;
|
|
if ADockControl = nil then
|
|
ADockControl := FBars.FDockControls[AStyle];
|
|
end
|
|
else
|
|
begin
|
|
AStyle := dsTop;
|
|
ADockControl := FBars.FDockControls[dsTop];
|
|
end
|
|
else
|
|
AStyle := dsNone;
|
|
if BarManager.DoDocking(Bar, AStyle, ADockControl) then
|
|
begin
|
|
Visible := False;
|
|
if DockingStyle = dsNone then
|
|
begin
|
|
ChangeDockingStyle(AStyle, ADockControl);
|
|
if DockedDockingStyle = dsNone then
|
|
begin
|
|
OneOnRow := True;
|
|
Row := ADockControl.RowCount;
|
|
end;
|
|
end
|
|
else
|
|
DockingStyle := dsNone;
|
|
Visible := True;
|
|
end;
|
|
end;
|
|
Exit;
|
|
end;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
function TdxBarControl.GetDockCol: TdxDockCol;
|
|
var
|
|
I, J: Integer;
|
|
begin
|
|
Result := nil;
|
|
if (FBar = nil) or (FBar.FBars = nil) or (DockingStyle = dsNone) or
|
|
(FDockControl = nil) then Exit;
|
|
with FDockControl do
|
|
for I := 0 to RowCount - 1 do
|
|
for J := 0 to Rows[I].ColCount - 1 do
|
|
if Rows[I].Cols[J].BarControl = Self then
|
|
begin
|
|
Result := Rows[I].Cols[J];
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.GetRow: Integer;
|
|
var
|
|
I, J: Integer;
|
|
begin
|
|
Result := 0;
|
|
if (FBar = nil) or (FBar.FBars = nil) or (DockingStyle = dsNone) or
|
|
(FDockControl = nil) then Exit;
|
|
with FDockControl do
|
|
for I := 0 to RowCount - 1 do
|
|
for J := 0 to Rows[I].ColCount - 1 do
|
|
if Rows[I].Cols[J].BarControl = Self then
|
|
begin
|
|
Result := I;
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.GetMainForm: TCustomForm;
|
|
begin
|
|
if DockControl <> nil then
|
|
Result := DockControl.GetMainForm
|
|
else
|
|
Result := BarManager.MainForm;
|
|
end;
|
|
|
|
function TdxBarControl.GetMinWidth(AStyle: TdxBarDockingStyle): Integer;
|
|
var
|
|
I, AWidth: Integer;
|
|
begin
|
|
if (AStyle in [dsLeft, dsRight]) or MultiLine then
|
|
begin
|
|
if ItemLinks.CanVisibleItemCount = 0 then
|
|
Result := BarManager.ButtonWidth
|
|
else
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to ItemLinks.CanVisibleItemCount - 1 do
|
|
begin
|
|
AWidth := ItemLinks.CanVisibleItems[I].Control.Width;
|
|
if Result < AWidth then Result := AWidth;
|
|
end;
|
|
end;
|
|
if MDIButtonsOnBar and (Result < GetMDIWidth) then
|
|
Result := GetMDIWidth;
|
|
end
|
|
else
|
|
begin
|
|
if ItemLinks.CanVisibleItemCount = 0 then
|
|
Result := BarManager.ButtonWidth
|
|
else
|
|
begin
|
|
ItemLinks.RecentItemCount := 1;
|
|
Result := ItemLinks.VisibleItems[0].Control.Width;
|
|
ItemLinks.RestoreRecentItemCount;
|
|
end;
|
|
if MDIButtonsOnBar then Inc(Result, GetMDIWidth);
|
|
end;
|
|
if Horizontal and MarkExists then Inc(Result, MarkSizeX);
|
|
end;
|
|
|
|
function TdxBarControl.GetMinHeight(AStyle: TdxBarDockingStyle): Integer;
|
|
var
|
|
I, AHeight: Integer;
|
|
begin
|
|
if (AStyle in [dsTop, dsBottom]) or MultiLine then
|
|
begin
|
|
if ItemLinks.CanVisibleItemCount = 0 then
|
|
Result := BarManager.ButtonHeight
|
|
else
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to ItemLinks.CanVisibleItemCount - 1 do
|
|
begin
|
|
AHeight := ItemLinks.CanVisibleItems[I].Control.Height;
|
|
if Result < AHeight then Result := AHeight;
|
|
end;
|
|
end;
|
|
if MDIButtonsOnBar and (Result < GetMDIHeight) then
|
|
Result := GetMDIHeight;
|
|
end
|
|
else
|
|
begin
|
|
if ItemLinks.CanVisibleItemCount = 0 then
|
|
Result := BarManager.ButtonHeight
|
|
else
|
|
begin
|
|
ItemLinks.RecentItemCount := 1;
|
|
Result := ItemLinks.VisibleItems[0].Control.Height;
|
|
ItemLinks.RestoreRecentItemCount;
|
|
end;
|
|
if MDIButtonsOnBar then Inc(Result, GetMDIHeight);
|
|
end;
|
|
if Vertical and MarkExists then Inc(Result, MarkSizeX);
|
|
end;
|
|
|
|
function TdxBarControl.GetMaxWidth(AStyle: TdxBarDockingStyle): Integer;
|
|
var
|
|
AWidth, I: Integer;
|
|
AItemLink: TdxBarItemLink;
|
|
begin
|
|
Result := GetMinWidth(AStyle);
|
|
AWidth := 0;
|
|
if (AStyle in [dsTop, dsBottom]) or MultiLine then
|
|
begin
|
|
ItemLinks.RecentItemCount := -1;
|
|
for I := 0 to ItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := ItemLinks.VisibleItems[I];
|
|
if AItemLink.BeginGroup then Inc(AWidth, BeginGroupSize);
|
|
Inc(AWidth, AItemLink.Control.Width);
|
|
end;
|
|
ItemLinks.RestoreRecentItemCount;
|
|
if MDIButtonsOnBar then Inc(AWidth, GetMDIWidth);
|
|
if Horizontal and MarkExists then Inc(AWidth, MarkSizeX);
|
|
end
|
|
else
|
|
begin
|
|
for I := 0 to ItemLinks.CanVisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := ItemLinks.CanVisibleItems[I];
|
|
if AWidth < AItemLink.Control.Width then
|
|
AWidth := AItemLink.Control.Width;
|
|
end;
|
|
if MDIButtonsOnBar and (AWidth < GetMDIWidth) then AWidth := GetMDIWidth;
|
|
end;
|
|
if Result < AWidth then Result := AWidth;
|
|
end;
|
|
|
|
function TdxBarControl.GetMaxHeight(AStyle: TdxBarDockingStyle): Integer;
|
|
var
|
|
AHeight, I: Integer;
|
|
AItemLink: TdxBarItemLink;
|
|
begin
|
|
Result := GetMinHeight(AStyle);
|
|
AHeight := 0;
|
|
if (AStyle in [dsLeft, dsRight]) or MultiLine then
|
|
begin
|
|
ItemLinks.RecentItemCount := -1;
|
|
for I := 0 to ItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := ItemLinks.VisibleItems[I];
|
|
if AItemLink.BeginGroup then Inc(AHeight, BeginGroupSize);
|
|
Inc(AHeight, AItemLink.Control.Height);
|
|
end;
|
|
ItemLinks.RestoreRecentItemCount;
|
|
if MDIButtonsOnBar then Inc(AHeight, GetMDIHeight);
|
|
if Vertical and MarkExists then Inc(AHeight, MarkSizeX);
|
|
end
|
|
else
|
|
begin
|
|
for I := 0 to ItemLinks.CanVisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := ItemLinks.CanVisibleItems[I];
|
|
if AHeight < AItemLink.Control.Height then
|
|
AHeight := AItemLink.Control.Height;
|
|
end;
|
|
if MDIButtonsOnBar and (AHeight < GetMDIHeight) then
|
|
AHeight := GetMDIHeight;
|
|
end;
|
|
if Result < AHeight then Result := AHeight;
|
|
end;
|
|
|
|
procedure TdxBarControl.GetMultiLineBarSize(AStyle: TdxBarDockingStyle;
|
|
ASize: Integer; var Result: TPoint);
|
|
var
|
|
CurX, CurY, CurRowHeight, MaxSize, ACount, I, ABeginGroupSize, W, H,
|
|
LastItemLinkWithBeginGroupCurX, LastItemLinkWithBeginGroupCurRowHeight: Integer;
|
|
LastItemLinkWithBeginGroup, AItemLink: TdxBarItemLink;
|
|
AVertical, BreakingRow, EntireRow: Boolean;
|
|
begin
|
|
AVertical := Vertical;
|
|
if AVertical then
|
|
if ASize < Result.Y then ASize := Result.Y
|
|
else
|
|
else
|
|
if ASize < Result.X then ASize := Result.X;
|
|
if (AStyle <> dsNone) and MarkExists then Dec(ASize, MarkSizeX);
|
|
CurX := 0;
|
|
CurY := 0;
|
|
CurRowHeight := 0;
|
|
MaxSize := 0;
|
|
LastItemLinkWithBeginGroup := nil;
|
|
LastItemLinkWithBeginGroupCurX := 0;
|
|
LastItemLinkWithBeginGroupCurRowHeight := 0;
|
|
BreakingRow := False;
|
|
EntireRow := True;
|
|
|
|
ACount := ItemLinks.VisibleItemCount;
|
|
I := 0;
|
|
while I < ACount do
|
|
begin
|
|
AItemLink := ItemLinks.VisibleItems[I];
|
|
if AItemLink.BeginGroup and (CurX > 0) then
|
|
begin
|
|
ABeginGroupSize := BeginGroupSize;
|
|
LastItemLinkWithBeginGroup := AItemLink;
|
|
LastItemLinkWithBeginGroupCurX := CurX;
|
|
LastItemLinkWithBeginGroupCurRowHeight := CurRowHeight;
|
|
end
|
|
else
|
|
ABeginGroupSize := 0;
|
|
|
|
with AItemLink.Control do
|
|
if AVertical then
|
|
begin
|
|
W := Height;
|
|
H := Width;
|
|
end
|
|
else
|
|
begin
|
|
W := Width;
|
|
H := Height;
|
|
end;
|
|
|
|
if (CurX > 0) and (CurX + ABeginGroupSize + W > ASize) or
|
|
BreakingRow or (ABeginGroupSize > 0) and not EntireRow then
|
|
begin
|
|
EntireRow := True;
|
|
AItemLink.Control.FBreakingRow := True;
|
|
if LastItemLinkWithBeginGroup = nil then
|
|
EntireRow := False
|
|
else
|
|
if BreakingRow then
|
|
begin
|
|
LastItemLinkWithBeginGroup := nil;
|
|
BreakingRow := False;
|
|
end
|
|
else
|
|
begin
|
|
I := LastItemLinkWithBeginGroup.VisibleIndex;
|
|
CurX := LastItemLinkWithBeginGroupCurX;
|
|
CurRowHeight := LastItemLinkWithBeginGroupCurRowHeight;
|
|
BreakingRow := True;
|
|
Continue;
|
|
end;
|
|
Inc(CurY, ABeginGroupSize + CurRowHeight);
|
|
CurRowHeight := 0;
|
|
if MaxSize < CurX then MaxSize := CurX;
|
|
CurX := W;
|
|
end
|
|
else
|
|
begin
|
|
AItemLink.Control.FBreakingRow := False;
|
|
Inc(CurX, ABeginGroupSize + W);
|
|
end;
|
|
if CurRowHeight < H then CurRowHeight := H;
|
|
Inc(I);
|
|
end;
|
|
if ItemLinks.VisibleItemCount > 0 then
|
|
if AVertical then
|
|
Result.X := CurY + CurRowHeight
|
|
else
|
|
Result.Y := CurY + CurRowHeight;
|
|
if MDIButtonsOnBar then
|
|
begin
|
|
if AVertical then
|
|
I := GetMDIHeight
|
|
else
|
|
I := GetMDIWidth;
|
|
if CurX + I <= ASize then
|
|
Inc(CurX, I)
|
|
else
|
|
if AVertical then
|
|
Inc(Result.X, GetMDIWidth)
|
|
else
|
|
Inc(Result.Y, GetMDIHeight);
|
|
end;
|
|
if MaxSize < CurX then MaxSize := CurX;
|
|
if AVertical then
|
|
if Result.Y < MaxSize then Result.Y := MaxSize
|
|
else
|
|
else
|
|
if Result.X < MaxSize then Result.X := MaxSize;
|
|
CalcControlsPositions; // because of a FBreakingRow
|
|
end;
|
|
|
|
function TdxBarControl.GetSizeAllCursorBounds: TRect;
|
|
begin
|
|
if (DockingStyle = dsNone) or (Bar.BorderStyle = bbsNone) then
|
|
SetRectEmpty(Result)
|
|
else
|
|
if Horizontal then
|
|
Result := Rect(-100, -100, 0, 100)
|
|
else
|
|
Result := Rect(-100, -100, 100, 0);
|
|
end;
|
|
|
|
function TdxBarControl.GetSizeForWidth(AStyle: TdxBarDockingStyle;
|
|
AWidth: Integer): TPoint;
|
|
var
|
|
J, ABeginGroupSize: Integer;
|
|
AItemLink: TdxBarItemLink;
|
|
Found: Boolean;
|
|
PrevSize, Size: TPoint;
|
|
|
|
function CalcSize(var Size: TPoint): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := False;
|
|
Size.X := 0;
|
|
Size.Y := 0;
|
|
for I := 0 to ItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := ItemLinks.VisibleItems[I];
|
|
if AItemLink.BeginGroup then
|
|
ABeginGroupSize := BeginGroupSize
|
|
else
|
|
ABeginGroupSize := 0;
|
|
with AItemLink.Control do
|
|
begin
|
|
if (Size.X + ABeginGroupSize + Width > AWidth) and (I <> 0) then
|
|
begin
|
|
Result := True;
|
|
Break;
|
|
end;
|
|
Inc(Size.X, ABeginGroupSize + Width);
|
|
if Size.Y < Height then Size.Y := Height;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
ItemLinks.RecentItemCount := -1;
|
|
CalcControlsPositions;
|
|
ItemLinks.RestoreRecentItemCount;
|
|
|
|
if MultiLine then
|
|
if Vertical then
|
|
begin
|
|
Size := GetSizeForHeight(AStyle, GetMaxHeight(AStyle));
|
|
repeat
|
|
if Size.X >= AWidth then Break;
|
|
PrevSize := Size;
|
|
Dec(Size.Y);
|
|
Size := GetSizeForHeight(AStyle, Size.Y);
|
|
until Size.Y = PrevSize.Y;
|
|
Result := Size;
|
|
end
|
|
else
|
|
begin
|
|
Result := Point(GetMinWidth(AStyle), GetMinHeight(AStyle));
|
|
GetMultiLineBarSize(AStyle, AWidth, Result);
|
|
end
|
|
else
|
|
case AStyle of
|
|
dsTop, dsBottom:
|
|
begin
|
|
Result := Point(GetMinWidth(AStyle), GetMinHeight(AStyle));
|
|
if AWidth < Result.X then AWidth := Result.X;
|
|
if MDIButtonsOnBar then Dec(AWidth, GetMDIWidth);
|
|
ItemLinks.RecentItemCount := -1;
|
|
if ItemLinks.CanVisibleItemCount > 0 then
|
|
begin
|
|
if MarkExists then Dec(AWidth, MarkSizeX);
|
|
if ItemLinks.CanUseRecentItems and not BarManager.Designing then
|
|
begin
|
|
PrevSize := Result;
|
|
if MarkExists then Dec(PrevSize.X, MarkSizeX);
|
|
Found := False;
|
|
for J := 1 to ItemLinks.CanVisibleItemCount do
|
|
begin
|
|
ItemLinks.RecentItemCount := J;
|
|
Found := CalcSize(Size);
|
|
if Found then
|
|
begin
|
|
ItemLinks.RecentItemCount := J - 1;
|
|
Size := PrevSize;
|
|
Break;
|
|
end;
|
|
PrevSize := Size;
|
|
end;
|
|
if not Found then ItemLinks.RecentItemCount := -1;
|
|
end
|
|
else
|
|
CalcSize(Size);
|
|
if MarkExists then Inc(Size.X, MarkSizeX);
|
|
|
|
if Result.X < Size.X then Result.X := Size.X;
|
|
Result.Y := Size.Y;
|
|
if MDIButtonsOnBar then
|
|
begin
|
|
Inc(Result.X, GetMDIWidth);
|
|
if Result.Y < GetMDIHeight then Result.Y := GetMDIHeight;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
dsLeft, dsRight:
|
|
Result := Point(GetMinWidth(AStyle), GetMaxHeight(AStyle));
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.GetSizeForHeight(AStyle: TdxBarDockingStyle;
|
|
AHeight: Integer): TPoint;
|
|
var
|
|
J, ABeginGroupSize: Integer;
|
|
AItemLink: TdxBarItemLink;
|
|
Found: Boolean;
|
|
PrevSize, Size: TPoint;
|
|
|
|
function CalcSize(var Size: TPoint): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := False;
|
|
Size.X := 0;
|
|
Size.Y := 0;
|
|
for I := 0 to ItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
AItemLink := ItemLinks.VisibleItems[I];
|
|
if AItemLink.BeginGroup then
|
|
ABeginGroupSize := BeginGroupSize
|
|
else
|
|
ABeginGroupSize := 0;
|
|
with AItemLink.Control do
|
|
begin
|
|
if (Size.Y + ABeginGroupSize + Height > AHeight) and (I <> 0) then
|
|
begin
|
|
Result := True;
|
|
Break;
|
|
end;
|
|
Inc(Size.Y, ABeginGroupSize + Height);
|
|
if Size.X < Width then Size.X := Width;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
ItemLinks.RecentItemCount := -1;
|
|
CalcControlsPositions;
|
|
ItemLinks.RestoreRecentItemCount;
|
|
|
|
if MultiLine then
|
|
if Vertical then
|
|
begin
|
|
Result := Point(GetMinWidth(AStyle), GetMinHeight(AStyle));
|
|
GetMultiLineBarSize(AStyle, AHeight, Result);
|
|
end
|
|
else
|
|
begin
|
|
Size := GetSizeForWidth(AStyle, GetMaxWidth(AStyle));
|
|
repeat
|
|
if Size.Y >= AHeight then Break;
|
|
PrevSize := Size;
|
|
Dec(Size.X);
|
|
Size := GetSizeForWidth(AStyle, Size.X);
|
|
until Size.X = PrevSize.X;
|
|
Result := Size;
|
|
end
|
|
else
|
|
case AStyle of
|
|
dsTop, dsBottom:
|
|
Result := Point(GetMaxWidth(AStyle), GetMinHeight(AStyle));
|
|
|
|
dsLeft, dsRight:
|
|
begin
|
|
Result := Point(GetMinWidth(AStyle), GetMinHeight(AStyle));
|
|
if AHeight < Result.Y then AHeight := Result.Y;
|
|
if MDIButtonsOnBar then Dec(AHeight, GetMDIHeight);
|
|
ItemLinks.RecentItemCount := -1;
|
|
if ItemLinks.CanVisibleItemCount > 0 then
|
|
begin
|
|
if MarkExists then Dec(AHeight, MarkSizeX);
|
|
if ItemLinks.CanUseRecentItems and not BarManager.Designing then
|
|
begin
|
|
PrevSize := Result;
|
|
if MarkExists then Dec(PrevSize.Y, MarkSizeX);
|
|
Found := False;
|
|
for J := 1 to ItemLinks.CanVisibleItemCount do
|
|
begin
|
|
ItemLinks.RecentItemCount := J;
|
|
Found := CalcSize(Size);
|
|
if Found then
|
|
begin
|
|
ItemLinks.RecentItemCount := J - 1;
|
|
Size := PrevSize;
|
|
Break;
|
|
end;
|
|
PrevSize := Size;
|
|
end;
|
|
if not Found then ItemLinks.RecentItemCount := -1;
|
|
end
|
|
else
|
|
CalcSize(Size);
|
|
if MarkExists then Inc(Size.Y, MarkSizeX);
|
|
|
|
if Result.Y < Size.Y then Result.Y := Size.Y;
|
|
Result.X := Size.X;
|
|
if MDIButtonsOnBar then
|
|
begin
|
|
Inc(Result.Y, GetMDIHeight);
|
|
if Result.X < GetMDIWidth then Result.X := GetMDIWidth;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.GetTrackSize(AStyle: TdxBarDockingStyle): TPoint;
|
|
var
|
|
PrevRecentItemCount: Integer;
|
|
begin
|
|
Result.X := 0;
|
|
Result.Y := 0;
|
|
PrevRecentItemCount := ItemLinks.RecentItemCount;
|
|
case AStyle of
|
|
dsNone:
|
|
begin
|
|
Result := GetSizeForWidth(AStyle, Bar.FloatClientWidth);
|
|
Inc(Result.X, Bar.BarNCSizeX(AStyle));
|
|
Inc(Result.Y, Bar.BarNCSizeY(AStyle));
|
|
end;
|
|
dsTop, dsBottom:
|
|
begin
|
|
if (FBar <> nil) and FBar.WholeRow then
|
|
Result.X := FDockControl.ClientWidth - FBar.BarNCSizeX(AStyle)
|
|
else
|
|
Result.X := GetMaxWidth(AStyle);
|
|
Result := GetSizeForWidth(AStyle, Result.X);
|
|
if (FBar <> nil) and FBar.WholeRow then
|
|
Result.X := FDockControl.ClientWidth
|
|
else
|
|
Inc(Result.X, Bar.BarNCSizeX(AStyle));
|
|
Inc(Result.Y, Bar.BarNCSizeY(AStyle));
|
|
end;
|
|
dsLeft, dsRight:
|
|
begin
|
|
if (FBar <> nil) and FBar.WholeRow then
|
|
Result.Y := FDockControl.ClientHeight - FBar.BarNCSizeY(AStyle)
|
|
else
|
|
Result.Y := GetMaxHeight(AStyle);
|
|
Result := GetSizeForHeight(AStyle, Result.Y);
|
|
Inc(Result.X, Bar.BarNCSizeX(AStyle));
|
|
if (FBar <> nil) and FBar.WholeRow then
|
|
Result.Y := FDockControl.ClientHeight
|
|
else
|
|
Inc(Result.Y, Bar.BarNCSizeY(AStyle));
|
|
end;
|
|
end;
|
|
ItemLinks.RecentItemCount := PrevRecentItemCount;
|
|
CalcControlsPositions;
|
|
end;
|
|
|
|
procedure TdxBarControl.InvalidateMark;
|
|
begin
|
|
PainterClass.BarMarkRectInvalidate(Self);
|
|
end;
|
|
|
|
function TdxBarControl.MarkExists: Boolean;
|
|
begin
|
|
Result := Bar.ShowMark and
|
|
(FTruncated or
|
|
(BarManager.PainterClass.BarAllowQuickCustomizing and Bar.AllowQuickCustomizing));
|
|
end;
|
|
|
|
function TdxBarControl.MarkNCRect: TRect;
|
|
var
|
|
WR: TRect;
|
|
begin
|
|
Result := MarkScreenRect;
|
|
GetWindowRect(WR);
|
|
OffsetRect(Result, -WR.Left, -WR.Top);
|
|
end;
|
|
|
|
function TdxBarControl.MarkRect: TRect;
|
|
begin
|
|
Result := PainterClass.BarMarkRect(Self);
|
|
end;
|
|
|
|
function TdxBarControl.MarkItemRect: TRect;
|
|
begin
|
|
Result := PainterClass.BarMarkItemRect(Self);
|
|
end;
|
|
|
|
function TdxBarControl.MarkScreenRect: TRect;
|
|
begin
|
|
Result := MarkRect;
|
|
MapWindowPoints(Handle, 0, Result, 2);
|
|
end;
|
|
|
|
function TdxBarControl.SizeGripRect: TRect;
|
|
begin
|
|
with Result do
|
|
begin
|
|
Left := ClientWidth;
|
|
Right := Left + PainterClass.StatusBarGripSize(BarManager).cx;
|
|
Bottom := ClientHeight;
|
|
Top := Bottom - PainterClass.StatusBarGripSize(BarManager).cy;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.BarManagerStyleChanged;
|
|
var
|
|
ABar: TdxBar;
|
|
begin
|
|
UpdateControlStyle;
|
|
CalcDrawingConsts;
|
|
if DockingStyle = dsNone then
|
|
begin
|
|
ABar := Bar;
|
|
ABar.Visible := False;
|
|
ABar.Visible := True;
|
|
end
|
|
else
|
|
RebuildBar;
|
|
end;
|
|
|
|
procedure TdxBarControl.CaptionChanged;
|
|
begin
|
|
Text := Bar.Caption;
|
|
SendMessage(Handle, WM_NCPAINT, 0, 0);
|
|
end;
|
|
|
|
procedure TdxBarControl.DrawMDIButtons(ARgn: HRGN; AButtons: TdxBarMDIButtons);
|
|
var
|
|
AButton: TdxBarMDIButton;
|
|
begin
|
|
for AButton := Low(TdxBarMDIButton) to High(TdxBarMDIButton) do
|
|
if AButton in AButtons then
|
|
begin
|
|
DrawMDIButton(AButton, FIsMouseOverMDIButton and (AButton = FSelectedMDIButton),
|
|
FIsMDIButtonPressed and (AButton = FPressedMDIButton));
|
|
if ARgn <> 0 then
|
|
ExcludeRect(ARgn, RectMDI(AButton));
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.FrameChanged;
|
|
begin
|
|
SetWindowPos(Handle, 0, 0, 0, 0, 0,
|
|
SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_FRAMECHANGED);
|
|
end;
|
|
|
|
function TdxBarControl.GetEditFontHandle: HFONT;
|
|
begin
|
|
if FBar.UseOwnFont then
|
|
Result := FBar.FEditFontHandle
|
|
else
|
|
Result := inherited GetEditFontHandle;
|
|
end;
|
|
|
|
function TdxBarControl.GetFullItemRect(Item: TdxBarItemControl): TRect;
|
|
begin
|
|
Result := GetItemRect(Item);
|
|
with Item.ItemLink, Result do
|
|
if Vertical then
|
|
begin
|
|
Dec(Left, (RowHeight - (Right - Left)) div 2);
|
|
Right := Left + RowHeight;
|
|
end
|
|
else
|
|
begin
|
|
Dec(Top, (RowHeight - (Bottom - Top)) div 2);
|
|
Bottom := Top + RowHeight;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.GetItemRegion(Item: TdxBarItemControl): HRGN;
|
|
var
|
|
Rgn: HRGN;
|
|
begin
|
|
Result := CreateRectRgnIndirect(GetFullItemRect(Item));
|
|
if not IsRectEmpty(Item.FBeginGroupRect) then
|
|
begin
|
|
Rgn := CreateRectRgnIndirect(Item.FBeginGroupRect);
|
|
CombineRgn(Result, Result, Rgn, RGN_OR);
|
|
DeleteObject(Rgn);
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.GetToolbarBrush: HBRUSH;
|
|
begin
|
|
Result := PainterClass.BarToolbarBrushEx(Self);
|
|
end;
|
|
|
|
function TdxBarControl.ItemAtPosEx(Pos: TPoint;
|
|
var IsBeginGroup, IsFirstPart, IsVerticalDirection: Boolean): TdxBarItemControl;
|
|
var
|
|
I: Integer;
|
|
Control: TdxBarItemControl;
|
|
R: TRect;
|
|
AVertical: Boolean;
|
|
begin
|
|
Result :=
|
|
inherited ItemAtPosEx(Pos, IsBeginGroup, IsFirstPart, IsVerticalDirection);
|
|
if (Result = nil) and PtInRect(ClientRect, Pos) then
|
|
begin
|
|
IsBeginGroup := False;
|
|
IsFirstPart := False;
|
|
for I := 0 to ItemLinks.VisibleItemCount - 1 do
|
|
begin
|
|
Control := ItemLinks.VisibleItems[I].Control;
|
|
if Control.CanCustomize and Control.FLastInRow then
|
|
begin
|
|
R := GetItemRect(Control);
|
|
AVertical := Vertical;
|
|
if AVertical and (R.Left <= Pos.X) and (Pos.X < R.Right) or
|
|
not AVertical and (R.Top <= Pos.Y) and (Pos.Y < R.Bottom) then
|
|
begin
|
|
if AVertical and (Pos.Y < R.Top) or
|
|
not AVertical and (Pos.X < R.Left) then
|
|
begin
|
|
IsFirstPart := True;
|
|
if Control.Align in [iaCenter, iaRight] then
|
|
Result := Control
|
|
else
|
|
Result := ItemLinks.VisibleItems[1].Control;
|
|
end
|
|
else
|
|
Result := Control;
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.NotHandleMouseMove(P: TPoint): Boolean;
|
|
|
|
function ControlContainerActive: Boolean;
|
|
{var
|
|
Control: TWinControl;}
|
|
begin
|
|
{Control := FindControl(GetActiveWindow);
|
|
Result := (Control is TCustomdxBarControl) and
|
|
(TCustomdxBarControl(Control).BarManager = BarManager);}
|
|
Result := HasAsParent(GetActiveWindow, {GetMainForm}BarManager.MainForm.Handle);
|
|
end;
|
|
|
|
begin
|
|
with TDummyForm(BarManager.MainForm) do
|
|
// with TDummyForm(GetMainForm) do
|
|
Result := inherited NotHandleMouseMove(P) or
|
|
(DockingStyle <> dsNone) and
|
|
((FormStyle = fsMDIForm) and not Application.Active or
|
|
(FormStyle <> fsMDIForm) and not Active and not ControlContainerActive);
|
|
end;
|
|
|
|
procedure TdxBarControl.PaintItem(AControl: TdxBarItemControl);
|
|
var
|
|
AItemRect: TRect;
|
|
DC: HDC;
|
|
PrevClipRgn: HRGN;
|
|
ClipRgnExists: Boolean;
|
|
begin
|
|
inherited;
|
|
if (AControl = nil) or (AControl.ItemLink = nil) or
|
|
(Bar <> nil) and Bar.LockUpdate then Exit;
|
|
AItemRect := GetItemRect(AControl);
|
|
|
|
// TODO: !!!
|
|
if FInRepaint then
|
|
begin
|
|
Windows.InvalidateRect(Handle, @AItemRect, False);
|
|
// FInRepaint := False;
|
|
// Windows.UpdateWindow(Handle);
|
|
Exit;
|
|
end;
|
|
|
|
DC := Canvas.Handle;
|
|
SaveClipRgn(DC, PrevClipRgn, ClipRgnExists);
|
|
with AItemRect do
|
|
IntersectClipRect(DC, Left, Top, Right, Bottom);
|
|
try
|
|
if IsVertical(Self) then
|
|
AControl.Paint(AItemRect, ptVert)
|
|
else
|
|
AControl.Paint(AItemRect, ptHorz);
|
|
DrawSelectedItem(AControl);
|
|
finally
|
|
RestoreClipRgn(DC, PrevClipRgn, ClipRgnExists);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.RebuildBar;
|
|
begin
|
|
UpdateDoubleBuffered;
|
|
FrameChanged;
|
|
RepaintBar;
|
|
end;
|
|
|
|
procedure TdxBarControl.RefreshShadow;
|
|
begin
|
|
FShadow.Refresh;
|
|
end;
|
|
|
|
procedure TdxBarControl.RepaintMDIButtons;
|
|
var
|
|
AButtons: TdxBarMDIButtons;
|
|
begin
|
|
if RealMDIButtonsOnBar then
|
|
AButtons := [mdibMinimize, mdibRestore, mdibClose]
|
|
else
|
|
AButtons := [mdibClose];
|
|
DrawMDIButtons(0, AButtons);
|
|
end;
|
|
|
|
procedure TdxBarControl.SavePos;
|
|
begin
|
|
if FBar.Visible and not FMoving and not BarManager.IsDestroying then
|
|
if DockingStyle = dsNone then
|
|
with Bar do
|
|
begin
|
|
FloatLeft := Self.Left;
|
|
FloatTop := Self.Top;
|
|
FloatClientWidth := ClientWidth;
|
|
FloatClientHeight := ClientHeight;
|
|
end
|
|
else
|
|
if (DockControl <> nil) and not DockControl.IsBarHandleDestroying and
|
|
not BarManager.IsHandleCreating then
|
|
begin
|
|
FBar.DockedDockingStyle := DockingStyle;
|
|
if FDockControl.Main then
|
|
FBar.DockedDockControl := nil
|
|
else
|
|
FBar.DockedDockControl := TdxBarDockControl(FDockControl);
|
|
FBar.Row := GetRow;
|
|
if GetDockCol <> nil then
|
|
begin
|
|
FBar.OneOnRow := GetDockCol.DockRow.ColList.Count = 1;
|
|
FBar.DockedLeft := Left;
|
|
FBar.DockedTop := Top;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.SetFont;
|
|
begin
|
|
Font := Bar.Font;
|
|
end;
|
|
|
|
procedure TdxBarControl.SetIsActive(Value: Boolean);
|
|
begin
|
|
if not Value then
|
|
begin
|
|
if IsCustomizing and (SelectedItem <> nil) then
|
|
SetMouseSelectedItem(nil);
|
|
if IsActive and (SelectedItem is TdxBarButtonControl) and
|
|
TdxBarButtonControl(SelectedItem).DroppedDown then
|
|
SelectedItem.ControlInactivate(True);
|
|
if IsDowned then
|
|
begin
|
|
IsDowned := False;
|
|
if not IsCustomizing then {HideAll;//}BarLostFocus;
|
|
end;
|
|
end;
|
|
inherited SetIsActive(Value);
|
|
|
|
BarLostFocus; // !!!
|
|
end;
|
|
|
|
procedure TdxBarControl.SetDockingStyle(Value: TdxBarDockingStyle);
|
|
begin
|
|
if DockingStyle <> Value then FTruncated := False;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TdxBarControl.SetKeySelectedItem(Value: TdxBarItemControl);
|
|
var
|
|
PrevSelectedItem: TdxBarItemControl;
|
|
begin
|
|
PrevSelectedItem := FSelectedItem;
|
|
inherited SetKeySelectedItem(Value);
|
|
if (FSelectedItem <> PrevSelectedItem) and
|
|
(SelectedItem <> nil) and not SelectedItem.IsActive and not IsCustomizing then
|
|
if SelectedItem is TdxBarSubItemControl then
|
|
SelectedItem.ControlClick(False)
|
|
else
|
|
SelectedItem.ControlActivate(True);
|
|
end;
|
|
|
|
procedure TdxBarControl.FillBackground(DC: HDC; ARect: TRect; ABrush: HBRUSH;
|
|
AColor: TColor; AIsClientArea: Boolean);
|
|
var
|
|
R: TRect;
|
|
ANCOffset: TPoint;
|
|
begin
|
|
// calc rect
|
|
R := ARect;
|
|
if AIsClientArea then
|
|
begin
|
|
ANCOffset := NCOffset;
|
|
OffsetRect(R, ANCOffset.X, ANCOffset.Y);
|
|
end;
|
|
// check background
|
|
if not Bar.BackgroundBitmap.Empty then
|
|
FillBackgroundRect(DC, ARect, R, ABrush, AColor, Bar.BackgroundBitmap)
|
|
else
|
|
begin
|
|
if Bar.IsStatusBar and BarManager.Backgrounds.Bar.Empty then
|
|
PainterClass.StatusBarFillBackground(Self, DC, ARect, R, Rect(0, 0, Width, Height), ABrush, AColor)
|
|
else
|
|
begin
|
|
if Bar.Color = clDefault then
|
|
inherited FillBackground(DC, ARect, ABrush, AColor, AIsClientArea)
|
|
else
|
|
begin
|
|
FillRectByColor(DC, ARect, Bar.Color); // TODO
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TdxBarControl.IsBackgroundBitmap: Boolean;
|
|
begin
|
|
Result := inherited IsBackgroundBitmap or
|
|
not Bar.BackgroundBitmap.Empty or
|
|
not BarManager.Backgrounds.Bar.Empty;
|
|
end;
|
|
|
|
function TdxBarControl.IsTransparent: Boolean;
|
|
begin
|
|
Result := (Bar.Color <> clDefault) or not Bar.BackgroundBitmap.Empty or
|
|
not BarManager.Backgrounds.Bar.Empty or inherited IsTransparent;
|
|
end;
|
|
|
|
function TdxBarControl.NCOffset: TPoint;
|
|
var
|
|
WR: TRect;
|
|
P: TPoint;
|
|
begin
|
|
Result := inherited NCOffset;
|
|
// if DockingStyle <> dsNone then
|
|
begin
|
|
GetWindowRect(WR);
|
|
P := ClientToScreen(Point(0, 0));
|
|
Inc(Result.X, P.X - WR.Left);
|
|
Inc(Result.Y, P.Y - WR.Top);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.SetLayeredAttributes;
|
|
var
|
|
AAlphaBlendValue: Byte;
|
|
begin
|
|
if FMoving or ((DockingStyle = dsNone) and not IsInternal) then
|
|
AAlphaBlendValue := Bar.AlphaBlendValue
|
|
else
|
|
AAlphaBlendValue := 255;
|
|
if FMoving then
|
|
SetLayeredWndAttributes(FFloatingHandle, AAlphaBlendValue)
|
|
else
|
|
SetLayeredWndAttributes(Handle, AAlphaBlendValue);
|
|
end;
|
|
|
|
procedure TdxBarControl.SetMarkState(Value: TdxBarMarkState);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
if IsCustomizing then Exit;
|
|
if FMarkState <> Value then
|
|
begin
|
|
FMarkState := Value;
|
|
FinishMoreButtonsHintTimer;
|
|
R := MarkRect;
|
|
if FMarkState = msPressed then
|
|
begin
|
|
//PlaySound(psMenuPopup);
|
|
MapWindowPoints(Handle, 0, R, 2);
|
|
FQuickPopup := TdxBarQuickControl.CreateWithOwnerBar(BarManager, Self);
|
|
TdxBarQuickControl(FQuickPopup).Popup(R);
|
|
PlaySound(psMenuPopup);
|
|
end
|
|
else
|
|
begin
|
|
if FQuickPopup <> nil then
|
|
begin
|
|
FQuickPopup.Free;
|
|
FQuickPopup := nil;
|
|
end;
|
|
if FMarkState = msSelected then
|
|
begin
|
|
if DockingStyle = dsNone then StartMoreButtonsHintTimer;
|
|
BarManager.HintActivate(True, cxGetResourceString(@dxSBAR_MOREBUTTONS));
|
|
end
|
|
else
|
|
if SelectedItem = nil then
|
|
BarManager.HintActivate(False, '');
|
|
end;
|
|
InvalidateMark;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.BarGetFocus(ASelectedItem: TdxBarItemControl);
|
|
var
|
|
P: TPoint;
|
|
AControl: TWinControl;
|
|
ItemLink: TdxBarItemLink;
|
|
begin
|
|
//if (ItemLinks.First <> nil) and (ItemLinks.First.Control <> nil) then
|
|
begin
|
|
GetCursorPos(P);
|
|
AControl := FindControl(WindowFromPointEx(P));
|
|
if (AControl is TCustomdxBarControl) and (AControl <> Self) then
|
|
FinishMouseTracking(AControl.Handle);
|
|
|
|
GetMainForm.SendCancelMode(nil);
|
|
|
|
BeforeBarGetFocusFocusedWnd := GetFocus;
|
|
|
|
if not IsCustomizing and
|
|
not ((Self is TdxBarQuickControl) and TdxBarQuickControl(Self).FOwnerBar.Focused) then
|
|
SetWindowPos(GetMainForm.Handle, HWND_TOP, 0, 0, 0, 0,
|
|
SWP_NOMOVE or SWP_NOSIZE);
|
|
|
|
if ASelectedItem = nil then
|
|
begin
|
|
ItemLink := nil;
|
|
repeat
|
|
ItemLink := ItemLinks.Next(ItemLink);
|
|
until (ItemLink = nil) or (ItemLink.Control <> nil) and
|
|
not (ItemLink.Control is TSystemMenuSubItemControl); // !!!
|
|
if ItemLink <> nil then
|
|
ASelectedItem := ItemLink.Control;
|
|
end;
|
|
SetKeySelectedItem(ASelectedItem);
|
|
IsActive := True;
|
|
BarManager.FFocusedBarControl := Self;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.BarLostFocus;
|
|
var
|
|
P: TPoint;
|
|
AControl: TWinControl;
|
|
begin
|
|
if BarManager.FocusedBarControl = Self then
|
|
begin
|
|
BarManager.FFocusedBarControl := nil;
|
|
SetKeySelectedItem(nil);
|
|
IsActive := False;
|
|
|
|
GetCursorPos(P);
|
|
AControl := FindControl(WindowFromPointEx(P));
|
|
if AControl is TCustomdxBarControl then
|
|
with TCustomdxBarControl(AControl) do
|
|
begin
|
|
Windows.ScreenToClient(Handle, P);
|
|
FLastMousePos := Point(-1, -1);
|
|
PostMessage(Handle, WM_MOUSEMOVE, 0, MakeLParam(P.X, P.Y));
|
|
end;
|
|
|
|
if Application.Active and GetMainForm.Active and // -> bug with toolbars' hiding (without Application.Active)
|
|
IsWindowVisible(BeforeBarGetFocusFocusedWnd) then
|
|
Windows.SetFocus(BeforeBarGetFocusFocusedWnd);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxBarControl.HideAll;
|
|
begin
|
|
BarLostFocus;
|
|
inherited HideAll;
|
|
{ if not BarManager.IsDestroying then
|
|
ProcessPaintMessages;}
|
|
end;
|
|
|
|
procedure TdxBarControl.Repaint;
|
|
begin
|
|
if not ((Bar <> nil) and Bar.LockUpdate) then inherited;
|
|
end;
|
|
|
|
procedure TdxBarControl.RepaintBar;
|
|
var
|
|
PrevSelectedItemLink: TdxBarItemLink;
|
|
P: TPoint;
|
|
begin
|
|
if FDestroyFlag or (Bar <> nil) and Bar.LockUpdate or not HandleAllocated then Exit;
|
|
|
|
PrevSelectedItemLink := nil;
|
|
if IsCustomizing then
|
|
begin
|
|
if (BarManager.SelectedItem <> nil) and
|
|
(BarManager.SelectedItem.Parent = Self) then
|
|
begin
|
|
PrevSelectedItemLink := BarManager.SelectedItem.ItemLink;
|
|
BarManager.FSelectedItem := nil;
|
|
end;
|
|
FSelectedItem := nil;
|
|
end;
|
|
DestroyControls;
|
|
CreateControls;
|
|
if IsCustomizing and (PrevSelectedItemLink <> nil) then
|
|
SetKeySelectedItem(PrevSelectedItemLink.Control);
|
|
|
|
if DockingStyle = dsNone then
|
|
if HandleAllocated then
|
|
begin
|
|
P := GetSizeForWidth(DockingStyle, ClientWidth);
|
|
ClientWidth := P.X;
|
|
ClientHeight := P.Y;
|
|
end
|
|
else
|
|
else
|
|
FDockControl.UpdateDock;
|
|
//Repaint;
|
|
CalcControlsPositions;
|
|
Invalidate;
|
|
if IsTransparent then
|
|
SendMessage(Handle, WM_NCPAINT, 0, 0);
|
|
end;
|
|
|
|
initialization
|
|
FUser32DLL := LoadLibrary('USER32');
|
|
if FUser32DLL > 32 then
|
|
begin
|
|
@TrackMouseEvent := GetProcAddress(FUser32DLL, 'TrackMouseEvent');
|
|
@UpdateLayeredWindow := GetProcAddress(FUser32DLL, 'UpdateLayeredWindow');
|
|
@AnimateWindowProc := GetProcAddress(FUser32DLL, 'AnimateWindow');
|
|
@SetLayeredWindowAttributes := GetProcAddress(FUser32DLL, 'SetLayeredWindowAttributes');
|
|
end;
|
|
GetMem(AClassName, 256);
|
|
InternalItemList := TList.Create;
|
|
dxBarManagerList := TdxBarManagerList.Create;
|
|
RefreshDeviceConsts;
|
|
CreatePatternBrush;
|
|
RegisterClass(TdxBarGroup);
|
|
|
|
FRegItemList := TList.Create;
|
|
FBarControls := TList.Create;
|
|
|
|
dxBarRegisterItem(TdxBarButton, TdxBarButtonControl, True);
|
|
dxBarRegisterItem(TdxBarEdit, TdxBarEditControl, True);
|
|
dxBarRegisterItem(TCustomdxBarCombo, TCustomdxBarComboControl, True);
|
|
dxBarRegisterItem(TdxBarCombo, TdxBarComboControl, True);
|
|
dxBarRegisterItem(TdxBarSubItem, TdxBarSubItemControl, True);
|
|
dxBarRegisterItem(TdxBarListItem, TdxBarContainerItemControl, True);
|
|
dxBarRegisterItem(TdxBarContainerItem, TdxBarContainerItemControl, True);
|
|
|
|
dxBarRegisterItem(TdxBarQuickCustExtButton, TdxBarQuickCustExtButtonControl, False);
|
|
dxBarRegisterItem(TdxBarQuickCustItem, TdxBarQuickCustItemControl, False);
|
|
dxBarRegisterItem(TdxBarQuickSubItem, TdxBarSubItemControl, False);
|
|
|
|
dxBarRegisterItem(TSystemMenuSubItem, TSystemMenuSubItemControl, False);
|
|
|
|
Screen.Cursors[crdxBarDrag] := LoadCursor(HInstance, 'DXBARDRAGCURSOR');
|
|
Screen.Cursors[crdxBarDragCopy] := LoadCursor(HInstance, 'DXBARDRAGCOPYCURSOR');
|
|
Screen.Cursors[crdxBarDragNoDrop] := LoadCursor(HInstance, 'DXBARDRAGNODROPCURSOR');
|
|
Screen.Cursors[crdxBarEditSizing] := LoadCursor(HInstance, 'DXBAREDITSIZINGCURSOR');
|
|
|
|
finalization
|
|
dxBarUnregisterItem(TSystemMenuSubItem);
|
|
|
|
dxBarUnregisterItem(TdxBarQuickSubItem);
|
|
dxBarUnregisterItem(TdxBarQuickCustItem);
|
|
dxBarUnregisterItem(TdxBarQuickCustExtButton);
|
|
|
|
dxBarUnregisterItem(TdxBarContainerItem);
|
|
dxBarUnregisterItem(TdxBarListItem);
|
|
dxBarUnregisterItem(TdxBarSubItem);
|
|
dxBarUnregisterItem(TdxBarCombo);
|
|
dxBarUnregisterItem(TCustomdxBarCombo);
|
|
dxBarUnregisterItem(TdxBarEdit);
|
|
dxBarUnregisterItem(TdxBarButton);
|
|
|
|
FBarControls.Free;
|
|
with FRegItemList do
|
|
begin
|
|
while Count > 0 do
|
|
begin
|
|
TRegItemRecord(Last).Free;
|
|
Remove(Last);
|
|
end;
|
|
Free;
|
|
end;
|
|
|
|
DeleteObject(PatternBrush);
|
|
dxBarManagerList.Free;
|
|
dxBarManagerList := nil;
|
|
InternalItemList.Free;
|
|
FreeMem(AClassName, 256);
|
|
if FUser32DLL > 32 then FreeLibrary(FUser32DLL);
|
|
end.
|
|
|