Componentes.Terceros.DevExp.../internal/x.46/2/ExpressEditors Library 5/Sources/cxDBNavigator.pas

542 lines
17 KiB
ObjectPascal

{********************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressEditors }
{ }
{ 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 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 cxDBNavigator;
{$I cxVer.inc}
interface
uses
Classes, DB, cxDBFilterControl, cxNavigator;
type
TcxCustomDBNavigator = class;
TcxDBNavigatorDataLink = class(TDataLink)
private
FNavigator: TcxCustomDBNavigator;
protected
procedure EditingChanged; override;
procedure DataSetChanged; override;
procedure ActiveChanged; override;
public
constructor Create(ANavigator: TcxCustomDBNavigator);
destructor Destroy; override;
end;
TcxDBNavigatorButtonsFilterEvent = procedure(Sender: TObject;
AFilterControl: TcxDBFilterControl) of object;
TcxDBNavigatorButtonsGetDataLink = function: TDataLink of object;
TcxDBNavigatorButtons = class(TcxCustomNavigatorButtons)
private
FBookmark: TBookmark;
FFilterCriteria: TMemoryStream;
FFilterSetting: Boolean;
FPageSize: Integer;
FOnApplyFilter: TcxDBNavigatorButtonsFilterEvent;
FOnGetDataLink: TcxDBNavigatorButtonsGetDataLink;
FOnShowFilterDialog: TcxDBNavigatorButtonsFilterEvent;
procedure DoApplyFilter(Sender: TObject);
procedure DoShowFilterDialog(Sender: TObject);
function GetDataLink: TDataLink;
function GetDataSet: TDataSet;
function GetInternalPageSize: Integer;
procedure SetBookmark(Value: TBookmark);
procedure SetPageSize(Value: Integer);
procedure ShowFilter;
protected
procedure DoButtonClick(ADefaultIndex: Integer); override;
function GetButtonEnabled(ADefaultIndex: Integer): Boolean; override;
procedure CheckBookmark;
procedure ClearFilterCriteria;
property Bookmark: TBookmark read FBookmark write SetBookmark;
property DataLink: TDataLink read GetDataLink;
property DataSet: TDataSet read GetDataSet;
property InternalPageSize: Integer read GetInternalPageSize;
property OnGetDataLink: TcxDBNavigatorButtonsGetDataLink
read FOnGetDataLink write FOnGetDataLink;
public
constructor Create(ANavigator: IcxNavigatorOwner); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure ReleaseBookmark; override;
published
property ConfirmDelete;
property Images;
property PageSize: Integer read FPageSize write SetPageSize default 0;
property OnShowFilterDialog: TcxDBNavigatorButtonsFilterEvent
read FOnShowFilterDialog write FOnShowFilterDialog;
property OnApplyFilter: TcxDBNavigatorButtonsFilterEvent
read FOnApplyFilter write FOnApplyFilter;
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;
TcxDBNavigatorFilterEvent = procedure(ANavigator: TcxCustomDBNavigator;
AFilterControl: TcxDBFilterControl) of object;
TcxCustomDBNavigator = class(TcxCustomNavigator)
private
FDataLink: TcxDBNavigatorDataLink;
FOnApplyFilter: TcxDBNavigatorFilterEvent;
FOnShowFilterDialog: TcxDBNavigatorFilterEvent;
procedure DoApplyFilter(Sender: TObject; AFilterControl: TcxDBFilterControl);
procedure DoShowFilterDialog(Sender: TObject; AFilterControl: TcxDBFilterControl);
function GetButtons: TcxDBNavigatorButtons;
function GetDataLink: TDataLink;
function GetDataSource: TDataSource;
function GetDataSet: TDataSet;
procedure SetButtons(Value: TcxDBNavigatorButtons);
procedure SetDataSource(Value: TDataSource);
procedure SetOnApplyFilter(Value: TcxDBNavigatorFilterEvent);
procedure SetOnShowFilterDialog(Value: TcxDBNavigatorFilterEvent);
protected
function CreateButtons: TcxCustomNavigatorButtons; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure DataSetActiveChanged; virtual;
procedure DataSetDataChanged; virtual;
property Buttons: TcxDBNavigatorButtons read GetButtons write SetButtons;
property DataLink: TcxDBNavigatorDataLink read FDataLink;
property DataSource: TDataSource read GetDataSource write SetDataSource;
property OnApplyFilter: TcxDBNavigatorFilterEvent read FOnApplyFilter
write SetOnApplyFilter;
property OnShowFilterDialog: TcxDBNavigatorFilterEvent read FOnShowFilterDialog
write SetOnShowFilterDialog;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property DataSet: TDataSet read GetDataSet;
end;
TcxDBNavigator = class(TcxCustomDBNavigator)
published
property Buttons;
property DataSource;
property LookAndFeel;
property OnApplyFilter;
property OnShowFilterDialog;
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;
implementation
uses
Windows, SysUtils, Controls, DBCtrls, Dialogs, cxClasses,
cxFilterControlDialog, cxEditConsts;
type
TDataSetAccess = class(TDataSet);
{ TcxDBNavigatorDataLink }
constructor TcxDBNavigatorDataLink.Create(ANavigator: TcxCustomDBNavigator);
begin
inherited Create;
FNavigator := ANavigator;
VisualControl := True;
end;
destructor TcxDBNavigatorDataLink.Destroy;
begin
FNavigator := nil;
inherited Destroy;
end;
procedure TcxDBNavigatorDataLink.EditingChanged;
begin
if FNavigator <> nil then
FNavigator.NavigatorButtonsStateChanged;
end;
procedure TcxDBNavigatorDataLink.DataSetChanged;
begin
if FNavigator <> nil then
begin
FNavigator.DataSetDataChanged;
FNavigator.NavigatorButtonsStateChanged;
end;
end;
procedure TcxDBNavigatorDataLink.ActiveChanged;
begin
if FNavigator <> nil then
begin
FNavigator.DataSetActiveChanged;
FNavigator.NavigatorButtonsStateChanged;
end;
end;
{ TcxDBNavigatorButtons }
constructor TcxDBNavigatorButtons.Create(ANavigator: IcxNavigatorOwner);
begin
inherited Create(ANavigator);
FPageSize := 0;
FFilterCriteria := TMemoryStream.Create;
end;
destructor TcxDBNavigatorButtons.Destroy;
begin
FreeAndNil(FFilterCriteria);
inherited Destroy;
end;
procedure TcxDBNavigatorButtons.Assign(Source: TPersistent);
begin
if Source is TcxDBNavigatorButtons then
with TcxDBNavigatorButtons(Source) do
begin
Self.PageSize := PageSize;
Self.OnApplyFilter := OnApplyFilter;
Self.OnShowFilterDialog := OnShowFilterDialog;
end
else
inherited Assign(Source);
end;
procedure TcxDBNavigatorButtons.ReleaseBookmark;
begin
Bookmark := nil;
end;
procedure TcxDBNavigatorButtons.DoApplyFilter(Sender: TObject);
begin
ClearFilterCriteria;
TcxDBFilterControl(Sender).SaveToStream(FFilterCriteria);
FFilterSetting := True;
try
if Assigned(FOnApplyFilter) then
FOnApplyFilter(Self, TcxDBFilterControl(Sender))
else
begin
DataSet.Filter := TcxDBFilterControl(Sender).GetFilterTextEx('[', ']');
DataSet.Filtered := True;
end;
finally
FFilterSetting := False;
end;
end;
procedure TcxDBNavigatorButtons.DoShowFilterDialog(Sender: TObject);
var
AFilterControl: TcxDBFilterControl;
begin
AFilterControl := TfmFilterControlDialog(Sender).FilterControl as TcxDBFilterControl;
if FFilterCriteria.Size > 0 then
begin
FFilterCriteria.Position := 0;
AFilterControl.LoadFromStream(FFilterCriteria);
end;
if Assigned(OnShowFilterDialog) then
OnShowFilterDialog(Self, AFilterControl);
if not Assigned(FOnApplyFilter) then
with AFilterControl.FilterOptions do
begin
SupportedBetween := False;
SupportedIn := False;
SupportedLike := False;
end;
end;
function TcxDBNavigatorButtons.GetDataLink: TDataLink;
begin
if Assigned(FOnGetDataLink) then
Result := FOnGetDataLink
else Result := nil;
end;
function TcxDBNavigatorButtons.GetDataSet: TDataSet;
begin
if DataLink <> nil then
Result := DataLink.DataSet
else Result := nil;
end;
function TcxDBNavigatorButtons.GetInternalPageSize: Integer;
begin
if PageSize > 0 then
Result := PageSize
else
if (DataSet <> nil) then
Result := TDataSetAccess(DataSet).BufferCount
else
Result := 0;
end;
procedure TcxDBNavigatorButtons.SetBookmark(Value: TBookmark);
begin
if Value <> FBookmark then
begin
if FBookmark <> nil then
if DataSet = nil then
{$IFNDEF DELPHI12}FreeMem(FBookmark){$ENDIF}
else
DataSet.FreeBookmark(FBookmark);
FBookmark := Value;
Navigator.NavigatorButtonsStateChanged;
end;
end;
procedure TcxDBNavigatorButtons.SetPageSize(Value: Integer);
begin
if Value > - 1 then
FPageSize := Value;
end;
procedure TcxDBNavigatorButtons.ShowFilter;
var
AShowFilterEvent: TNotifyEvent;
begin
AShowFilterEvent := DoShowFilterDialog;
ExecuteDBFilterControlDialog(DataSet, Navigator.GetNavigatorLookAndFeel,
DoApplyFilter, AShowFilterEvent);
end;
procedure TcxDBNavigatorButtons.DoButtonClick(ADefaultIndex: Integer);
begin
if (DataLink = nil) or not DataLink.Active then
Exit;
case ADefaultIndex of
NBDI_FIRST: DataSet.First;
NBDI_PRIORPAGE: DataSet.MoveBy(-InternalPageSize);
NBDI_PRIOR: DataSet.Prior;
NBDI_LAST: DataSet.Last;
NBDI_NEXTPAGE: DataSet.MoveBy(InternalPageSize);
NBDI_NEXT: DataSet.Next;
NBDI_INSERT: DataSet.Insert;
NBDI_APPEND: DataSet.Append;
NBDI_DELETE:
if not ConfirmDelete or
(MessageDlg(cxGetResourceString(@cxNavigator_DeleteRecordQuestion),
mtConfirmation, mbOKCancel, 0) = ID_OK) then
DataSet.Delete;
NBDI_EDIT: DataSet.Edit;
NBDI_POST: DataSet.Post;
NBDI_CANCEL: DataSet.Cancel;
NBDI_SAVEBOOKMARK: Bookmark := DataSet.GetBookmark;
NBDI_GOTOBOOKMARK: DataSet.GotoBookmark(Bookmark);
NBDI_REFRESH: DataSet.Refresh;
NBDI_FILTER: ShowFilter;
end;
end;
function TcxDBNavigatorButtons.GetButtonEnabled(ADefaultIndex: Integer): Boolean;
begin
Result := IsNavigatorEnabled and (DataLink <> nil) and DataLink.Active;
if Result then
begin
case ADefaultIndex of
NBDI_FIRST, NBDI_PRIOR, NBDI_PRIORPAGE: Result := not DataSet.Bof;
NBDI_LAST, NBDI_NEXT, NBDI_NEXTPAGE: Result := not DataSet.Eof;
NBDI_INSERT, NBDI_APPEND: Result := DataSet.CanModify;
NBDI_DELETE: Result := DataSet.CanModify and
not (DataSet.BOF and DataSet.EOF);
NBDI_EDIT: Result := DataSet.CanModify and not DataLink.Editing;
NBDI_POST, NBDI_CANCEL: Result := DataSet.CanModify and DataLink.Editing;
NBDI_GOTOBOOKMARK: Result := Bookmark <> nil;
end;
end;
end;
procedure TcxDBNavigatorButtons.CheckBookmark;
begin
if (Bookmark <> nil) and not DataSet.BookmarkValid(Bookmark) then
ReleaseBookmark;
end;
procedure TcxDBNavigatorButtons.ClearFilterCriteria;
begin
if not FFilterSetting then
FFilterCriteria.Clear;
end;
{ TcxCustomDBNavigator }
constructor TcxCustomDBNavigator.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FDataLink := TcxDBNavigatorDataLink.Create(Self);
end;
destructor TcxCustomDBNavigator.Destroy;
begin
FreeAndNil(FDataLink);
inherited Destroy;
end;
procedure TcxCustomDBNavigator.DoApplyFilter(Sender: TObject;
AFilterControl: TcxDBFilterControl);
begin
if Assigned(FOnApplyFilter) then
FOnApplyFilter(Self, AFilterControl);
end;
procedure TcxCustomDBNavigator.DoShowFilterDialog(Sender: TObject;
AFilterControl: TcxDBFilterControl);
begin
if Assigned(FOnShowFilterDialog) then
FOnShowFilterDialog(Self, AFilterControl);
end;
function TcxCustomDBNavigator.GetButtons: TcxDBNavigatorButtons;
begin
Result := TcxDBNavigatorButtons(CustomButtons);
end;
function TcxCustomDBNavigator.GetDataLink: TDataLink;
begin
Result := FDataLink;
end;
function TcxCustomDBNavigator.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
function TcxCustomDBNavigator.GetDataSet: TDataSet;
begin
Result := FDataLink.DataSet;
end;
procedure TcxCustomDBNavigator.SetButtons(Value: TcxDBNavigatorButtons);
begin
CustomButtons.Assign(Value);
end;
procedure TcxCustomDBNavigator.SetDataSource(Value: TDataSource);
begin
if DataSource <> Value then
begin
{$IFDEF DELPHI5}
if (DataSource <> nil) and not (csDestroying in DataSource.ComponentState) then
DataSource.RemoveFreeNotification(Self);
{$ENDIF}
FDataLink.DataSource := Value;
if (DataSource <> nil) then
DataSource.FreeNotification(Self);
end;
end;
procedure TcxCustomDBNavigator.SetOnApplyFilter(Value: TcxDBNavigatorFilterEvent);
begin
FOnApplyFilter := Value;
if Assigned(FOnApplyFilter) then
Buttons.OnApplyFilter := DoApplyFilter
else
Buttons.OnApplyFilter := nil;
end;
procedure TcxCustomDBNavigator.SetOnShowFilterDialog(Value: TcxDBNavigatorFilterEvent);
begin
FOnShowFilterDialog := Value;
if Assigned(FOnShowFilterDialog) then
Buttons.OnShowFilterDialog := DoShowFilterDialog
else
Buttons.OnShowFilterDialog := nil;
end;
function TcxCustomDBNavigator.CreateButtons: TcxCustomNavigatorButtons;
begin
Result := TcxDBNavigatorButtons.Create(Self);
TcxDBNavigatorButtons(Result).OnGetDataLink := GetDataLink;
end;
procedure TcxCustomDBNavigator.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (FDataLink <> nil)
and (AComponent = DataSource) then
DataSource := nil;
end;
procedure TcxCustomDBNavigator.DataSetActiveChanged;
begin
Buttons.ClearFilterCriteria;
Buttons.ReleaseBookmark;
end;
procedure TcxCustomDBNavigator.DataSetDataChanged;
begin
Buttons.CheckBookmark;
end;
end.