cxnavigator.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,873 行 · 第 1/4 页

PAS
1,873
字号

{********************************************************************}
{                                                                    }
{       Developer Express Visual Component Library                   }
{       ExpressEditors                                               }
{                                                                    }
{       Copyright (c) 1998-2008 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 EXPRESSEDITORS 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 cxNavigator;

{$I cxVer.inc}

interface

uses
{$IFDEF DELPHI6}
  Types,
{$ENDIF}
  Messages, Windows, Classes, Controls, Forms, Graphics, ImgList,
  StdCtrls, SysUtils, cxClasses, cxContainer, cxControls, cxFilter, cxGraphics,
  cxLookAndFeels, cxLookAndFeelPainters, dxThemeManager;

const
  NavigatorButtonCount = 16;

  NBDI_FIRST        = 0;
  NBDI_PRIORPAGE    = 1;
  NBDI_PRIOR        = 2;
  NBDI_NEXT         = 3;
  NBDI_NEXTPAGE     = 4;
  NBDI_LAST         = 5;
  NBDI_INSERT       = 6;
  NBDI_APPEND       = 7;
  NBDI_DELETE       = 8;
  NBDI_EDIT         = 9;
  NBDI_POST         = 10;
  NBDI_CANCEL       = 11;
  NBDI_REFRESH      = 12;
  NBDI_SAVEBOOKMARK = 13;
  NBDI_GOTOBOOKMARK = 14;
  NBDI_FILTER       = 15;

type
  TcxCustomNavigatorButtons = class;

  TcxNavigatorChangeType = (nctProperties, nctSize, nctLayout);

  IcxNavigatorOwner = interface
  ['{504B7F43-8847-46C5-B84A-C24F8E5E61A6}']
    procedure NavigatorChanged(AChangeType: TcxNavigatorChangeType);
    function GetNavigatorBounds: TRect;
    function GetNavigatorButtons: TcxCustomNavigatorButtons;
    function GetNavigatorCanvas: TCanvas;
    function GetNavigatorControl: TWinControl;
    function GetNavigatorFocused: Boolean;
    function GetNavigatorLookAndFeel: TcxLookAndFeel;
    function GetNavigatorOwner: TComponent;
    function GetNavigatorShowHint: Boolean;
    function GetNavigatorTabStop: Boolean;
    procedure NavigatorButtonsStateChanged;
    procedure RefreshNavigator;
  end;

  TcxNavigatorButton = class(TPersistent)
  private
    FButtons: TcxCustomNavigatorButtons;
    FDefaultIndex: Integer;
    FDefaultVisible: Boolean;
    FEnabled: Boolean;
    FHint: string;
    FImageIndex: TImageIndex;
    FIsVisibleAssigned: Boolean;
    FVisible: Boolean;
    FOnClick: TNotifyEvent;
    function GetInternalImageIndex: Integer;
    function GetIternalImages: TCustomImageList;
    procedure InternalSetVisible(Value: Boolean; AIsInternalSetting: Boolean = True);
    function IsVisibleStored: Boolean;
    procedure SetEnabled(const Value: Boolean);
    procedure SetHint(const Value: string);
    procedure SetImageIndex(Value: TImageIndex);
    procedure SetOnClick(const Value: TNotifyEvent);
    procedure SetVisible(const Value: Boolean);
  protected
    function  GetOwner: TPersistent; override;
    function GetInternalEnabled: Boolean;
    function GetInternalHint: string;
    function IsUserImageListUsed: Boolean;
    procedure DoClick; dynamic;
    procedure RestoreDefaultVisible(ACanBeVisible: Boolean);

    function GetNavigator: IcxNavigatorOwner;

    property DefaultIndex: Integer read FDefaultIndex write FDefaultIndex;
    property InternalImageIndex: Integer read GetInternalImageIndex;
    property InternalImages: TCustomImageList read GetIternalImages;
  public
    constructor Create(AButtons: TcxCustomNavigatorButtons;
      ADefaultVisible: Boolean);

    procedure Assign(Source: TPersistent); override;
    procedure Click;
    function GetImageSize: TSize;

    property Buttons: TcxCustomNavigatorButtons read FButtons;
    property Navigator: IcxNavigatorOwner read GetNavigator;
    property OnClick: TNotifyEvent read FOnClick write SetOnClick;
  published
    property Enabled: Boolean read FEnabled write SetEnabled default True;
    property Hint: string read FHint write SetHint;
    property ImageIndex: TImageIndex read FImageIndex write SetImageIndex default -1;
    property Visible: Boolean read FVisible write SetVisible stored IsVisibleStored;
  end;

  TcxCustomNavigator = class;

  TcxNavigatorButtonClickEvent = procedure(Sender: TObject; AButtonIndex: Integer;
    var ADone: Boolean) of object;

  TcxCustomNavigatorButtons = class(TPersistent)
  private
    FNavigator: IcxNavigatorOwner;
    FButtons: array [0 .. NavigatorButtonCount - 1] of TcxNavigatorButton;
    FImages: TCustomImageList;
    FImageChangeLink: TChangeLink;
    FConfirmDelete: Boolean;
    FOnButtonClick: TcxNavigatorButtonClickEvent;

    function GetButton(Index: Integer): TcxNavigatorButton;
    function GetButtonCount: Integer;
    function GetDefaultImages: TCustomImageList;
    procedure SetButton(Index: Integer; const Value: TcxNavigatorButton);
    procedure SetConfirmDelete(const Value: Boolean);
    procedure SetImages(const Value: TCustomImageList);
    procedure SetOnButtonClick(const Value: TcxNavigatorButtonClickEvent);
    procedure ImageListChange(Sender: TObject);
  protected
    function  GetOwner: TPersistent; override;
    procedure CreateButtons; virtual;
    procedure DestroyButtons; virtual;

    procedure DoButtonClick(ADefaultIndex: Integer); virtual;
    function GetButtonEnabled(ADefaultIndex: Integer): Boolean; virtual;
    function GetButtonHint(ADefaultIndex: Integer): string; virtual;
    function GetButtonImageOffset: Integer; virtual;
    function IsNavigatorEnabled: Boolean;

    property ConfirmDelete: Boolean read FConfirmDelete write SetConfirmDelete default True;

    property First: TcxNavigatorButton index NBDI_FIRST read GetButton write SetButton;
    property PriorPage: TcxNavigatorButton index NBDI_PRIORPAGE read GetButton write SetButton;
    property Prior: TcxNavigatorButton index NBDI_PRIOR read GetButton write SetButton;
    property Next: TcxNavigatorButton index NBDI_NEXT read GetButton write SetButton;
    property NextPage: TcxNavigatorButton index NBDI_NEXTPAGE read GetButton write SetButton;
    property Last: TcxNavigatorButton index NBDI_LAST read GetButton write SetButton;
    property Insert: TcxNavigatorButton index NBDI_INSERT read GetButton write SetButton;
    property Append: TcxNavigatorButton index NBDI_APPEND read GetButton write SetButton;
    property Delete: TcxNavigatorButton index NBDI_DELETE read GetButton write SetButton;
    property Edit: TcxNavigatorButton index NBDI_EDIT read GetButton write SetButton;
    property Post: TcxNavigatorButton index NBDI_POST read GetButton write SetButton;
    property Cancel: TcxNavigatorButton index NBDI_CANCEL read GetButton write SetButton;
    property Refresh: TcxNavigatorButton index NBDI_REFRESH read GetButton write SetButton;
    property SaveBookmark: TcxNavigatorButton index NBDI_SAVEBOOKMARK read GetButton write SetButton;
    property GotoBookmark: TcxNavigatorButton index NBDI_GOTOBOOKMARK read GetButton write SetButton;
    property Filter: TcxNavigatorButton index NBDI_FILTER read GetButton write SetButton;
  public
    constructor Create(ANavigator: IcxNavigatorOwner); virtual;
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
    procedure ClickButton(Index: Integer);
    procedure ReleaseBookmark; virtual;

    property ButtonCount: Integer read GetButtonCount;
    property Buttons[Index: Integer]: TcxNavigatorButton read GetButton; default;
    property DefaultImages: TCustomImageList read GetDefaultImages;
    property Images: TCustomImageList read FImages write SetImages;
    property Navigator: IcxNavigatorOwner read FNavigator;
  published
    property OnButtonClick: TcxNavigatorButtonClickEvent read FOnButtonClick
      write SetOnButtonClick;
  end;

  TcxNavigatorButtonViewInfo = class
  public
    Button: TcxNavigatorButton;
    Bounds: TRect;
    Enabled: Boolean;
    Hint: string;
  end;

  TcxNavigatorViewInfo = class
  private
    FButtonPressTimer: TcxTimer;
    FButtons: TList;
    FCanvas: TcxCanvas;
    FFocusedButton: TcxNavigatorButton;
    FHintTimer: TcxTimer;
    FHintWindow: THintWindow;
    FHintWindowShowing: Boolean;
    FHotTrackButtonViewInfo: TcxNavigatorButtonViewInfo;
    FIsDirty: Boolean;
    FIsInplace: Boolean;
    FIsSelected: Boolean;
    FNavigator: IcxNavigatorOwner;
    FPressedButtonViewInfo: TcxNavigatorButtonViewInfo;

    function GetButton(Index: Integer): TcxNavigatorButtonViewInfo;
    function GetButtonCount: Integer;
    function GetFocusedButton: TcxNavigatorButtonViewInfo;
    procedure SetFocusedButton(Value: TcxNavigatorButtonViewInfo);
    function StopButtonPressTimerIfLeftMouseReleased: Boolean;

    procedure DoButtonPressTimer(Sender: TObject);
    procedure DoHintTimer(Sender: TObject);

    procedure UpdateSelected;
  protected
    function GetButtonBorderExtent(APainter: TcxCustomLookAndFeelPainterClass;
      AButtonIndex, AButtonCount: Integer): TRect;
    function GetButtonState(AButton: TcxNavigatorButtonViewInfo): TcxButtonState;
    function GetMiddleButtonBorderExtent(APainter: TcxCustomLookAndFeelPainterClass): TRect;
    function GetMinButtonSize(AButtonIndex, AButtonCount: Integer;
      AAutoHeight: Boolean = False): TSize;
    function GetVisibleButtonCount: Integer;
    procedure InvalidateButton(AButton: TcxNavigatorButtonViewInfo);
    procedure PaintButton(AButtonIndex: Integer);
    procedure HintActivate(AShow: Boolean);

    property Canvas: TcxCanvas read FCanvas;
    property FocusedButton: TcxNavigatorButtonViewInfo read GetFocusedButton
      write SetFocusedButton;
    property HotTrackButtonViewInfo: TcxNavigatorButtonViewInfo
      read FHotTrackButtonViewInfo write FHotTrackButtonViewInfo;
    property Navigator: IcxNavigatorOwner read FNavigator;
    property PressedButtonViewInfo: TcxNavigatorButtonViewInfo
      read FPressedButtonViewInfo write FPressedButtonViewInfo;
  public
    constructor Create(ANavigator: IcxNavigatorOwner;
      AIsInplace: Boolean = True); virtual;
    destructor Destroy; override;
    procedure Calculate;
    procedure CheckSize(var AWidth, AHeight: Integer;
      ACheckMinHeight: Boolean = False);
    procedure Clear;
    procedure DoEnter;
    procedure DoExit;
    function GetButtonAt(const pt: TPoint): TcxNavigatorButton;
    function GetButtonViewInfoAt(const pt: TPoint): TcxNavigatorButtonViewInfo;
    function GetButtonViewInfoByButton(AButton: TcxNavigatorButton): TcxNavigatorButtonViewInfo;
    procedure MakeIsDirty;
    procedure MouseDown(X, Y: Integer);
    procedure MouseMove(X, Y: Integer);
    procedure MouseUp(X, Y: Integer);
    procedure Paint;
    procedure PressArrowKey(ALeftKey: Boolean);
    procedure UpdateButtonsEnabled;

    property ButtonCount: Integer read GetButtonCount;
    property Buttons[Index: Integer]: TcxNavigatorButtonViewInfo read GetButton;
  end;

  TcxNavigatorViewInfoClass = class of TcxNavigatorViewInfo;

  TcxCustomNavigator = class(TcxControl, IUnknown,
    IcxNavigatorOwner, IcxMouseTrackingCaller, IdxSkinSupport)
  private
    FButtons: TcxCustomNavigatorButtons;
    FButtonsEvents: TNotifyEvent;
    FViewInfo: TcxNavigatorViewInfo;
    procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
  protected
    function CanFocusOnClick: Boolean; override;
    function CanResize(var NewWidth, NewHeight: Integer): Boolean; override;
    function CreateButtons: TcxCustomNavigatorButtons; virtual;
    procedure DoEnter; override;
    procedure DoExit; override;
    procedure EnabledChanged; dynamic;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure LookAndFeelChanged(Sender: TcxLookAndFeel;
      AChangedValues: TcxLookAndFeelValues); override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseEnter(AControl: TControl); override;
    procedure MouseLeave(AControl: TControl); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure Paint; override;
    //IcxMouseTrackingCaller
    procedure IcxMouseTrackingCaller.MouseLeave = NavigatorMouseLeave;
    procedure NavigatorMouseLeave;
   // IcxNavigatorOwner
    procedure NavigatorChanged(AChangeType: TcxNavigatorChangeType);
    function GetNavigatorBounds: TRect;
    function GetNavigatorButtons: TcxCustomNavigatorButtons;
    function GetNavigatorCanvas: TCanvas;
    function GetNavigatorControl: TWinControl;
    function GetNavigatorFocused: Boolean;
    function GetNavigatorLookAndFeel: TcxLookAndFeel;
    function GetNavigatorOwner: TComponent;
    function GetNavigatorShowHint: Boolean;
    function GetNavigatorTabStop: Boolean;
    function GetViewInfoClass: TcxNavigatorViewInfoClass; virtual;
    procedure InitButtons; virtual;
    procedure NavigatorButtonsStateChanged;
    procedure RefreshNavigator;
    procedure CreateWnd; override;
    procedure WndProc(var Message: TMessage); override;
    property CustomButtons: TcxCustomNavigatorButtons read FButtons;
    property ViewInfo: TcxNavigatorViewInfo read FViewInfo;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ClickButton(Index: Integer);
    procedure RestoreButtons;
    property LookAndFeel;
  published
    property TabStop default False;
    property ButtonsEvents: TNotifyEvent read FButtonsEvents
      write FButtonsEvents;
  end;

  TcxNavigatorControlNotifier = class
  private
    FList: TList;
  public
    constructor Create;
    destructor Destroy; override;
    procedure AddNavigator(ANavigator: IcxNavigatorOwner);
    procedure RemoveNavigator(ANavigator: IcxNavigatorOwner);
    procedure RefreshNavigatorButtons;
  end;

  IcxNavigator = interface
  ['{A15F80CA-DE56-47CB-B0EB-035D0BF90E9D}']
    function CanAppend: Boolean;
    function CanDelete: Boolean;
    function CanEdit: Boolean;
    function CanInsert: Boolean;
    function IsActive: Boolean;
    function IsBof: Boolean;
    function IsBookmarkAvailable: Boolean;
    function IsEditing: Boolean;
    function IsEof: Boolean;
    procedure ClearBookmark;
    procedure DoAction(AButtonIndex: Integer);
    function GetNotifier: TcxNavigatorControlNotifier;
    function IsActionSupported(AButtonIndex: Integer): Boolean;
  end;

  TcxNavigatorControlButtonsGetControl = function: IcxNavigator of object;

  TcxNavigatorControlButtons = class(TcxCustomNavigatorButtons)
  private
    FOnGetControl: TcxNavigatorControlButtonsGetControl;

    function GetControl: IcxNavigator;
  protected
    procedure DoButtonClick(ADefaultIndex: Integer); override;
    function GetButtonEnabled(ADefaultIndex: Integer): Boolean; override;

    property Control: IcxNavigator read GetControl;
  public
    procedure ReleaseBookmark; override;
    property OnGetControl: TcxNavigatorControlButtonsGetControl
      read FOnGetControl write FOnGetControl;
  published
    property ConfirmDelete;
    property Images;

    property First;
    property PriorPage;
    property Prior;
    property Next;
    property NextPage;
    property Last;
    property Insert;
    property Append;
    property Delete;
    property Edit;
    property Post;
    property Cancel;
    property Refresh;
    property SaveBookmark;
    property GotoBookmark;
    property Filter;
  end;

  TcxNavigatorControlButtonsClass = class of TcxNavigatorControlButtons;

  TcxCustomNavigatorControl = class(TcxCustomNavigator)
  private
    FControl: TComponent;
    function GetButtons: TcxNavigatorControlButtons;
    function GetControl: IcxNavigator;
    procedure SetButtons(Value: TcxNavigatorControlButtons);
    procedure SetControl(Value: TComponent);
  protected
    function CreateButtons: TcxCustomNavigatorButtons; override;
    function GetButtonsClass: TcxNavigatorControlButtonsClass; virtual;
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    procedure InitButtons; override;
    property Buttons: TcxNavigatorControlButtons read GetButtons write SetButtons;
    property Control: TComponent read FControl write SetControl;
  public
    destructor Destroy; override;
  end;

  TcxNavigator = class(TcxCustomNavigatorControl)
  published
    property Control;
    property Buttons;
    property LookAndFeel;

    property Align;
    property Anchors;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Ctl3D;
    property ParentCtl3D;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property TabOrder;
    property TabStop;
    property Visible;
{$IFDEF DELPHI5}
    property OnContextPopup;
{$ENDIF}
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnResize;
    property OnStartDock;
    property OnStartDrag;
  end;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?