Componentes.Terceros.DevExp.../official/x.44/ExpressQuantumGrid 5/Sources/cxDBExtLookupComboBox.pas

969 lines
31 KiB
ObjectPascal

{********************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressQuantumGrid }
{ }
{ 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 EXPRESSQUANTUMGRID 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 cxDBExtLookupComboBox;
{$I cxVer.inc}
interface
uses
{$IFDEF DELPHI6}
Variants,
{$ENDIF}
Windows, Classes, Controls, DB, Graphics, Messages, SysUtils, cxClasses,
cxContainer, cxControls, cxCustomData, cxDB, cxDBData, cxDBEdit,
cxDBLookupEdit, cxEditConsts, cxGrid, cxGridCustomTableView, cxEdit,
cxGridCustomView, cxGridStrs, cxGridTableView, cxLookAndFeels, cxLookupEdit;
type
{ TcxExtLookupGrid }
TcxExtLookupGrid = class(TcxGrid)
private
FEditable: Boolean;
FMousePos: TPoint;
FPopupMouseMoveLocked: Boolean;
FPrevOnKeyDown: TKeyEvent;
FPrevOnMouseDown: TMouseEvent;
FPrevOnMouseMove: TMouseMoveEvent;
FPrevOnMouseUp: TMouseEvent;
FRowPressed: Boolean;
FOnCloseUp: TcxLookupGridCloseUpEvent;
function GetView: TcxCustomGridTableView;
procedure ViewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure ViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure ViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure ViewMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
protected
procedure DoCancelMode; override;
procedure DoCloseUp(AAccept: Boolean); virtual;
function IsDataRow(AHitTest: TcxCustomGridHitTest): Boolean;
property Editable: Boolean read FEditable write FEditable;
property PopupMouseMoveLocked: Boolean read FPopupMouseMoveLocked write FPopupMouseMoveLocked;
property OnCloseUp: TcxLookupGridCloseUpEvent read FOnCloseUp write FOnCloseUp;
public
property View: TcxCustomGridTableView read GetView;
end;
{ TcxCustomExtLookupComboBoxProperties }
TcxCustomExtLookupComboBoxProperties = class(TcxCustomDBLookupEditProperties);
{ TcxExtLookupComboBoxProperties }
TcxExtLookupComboBoxProperties = class(TcxCustomExtLookupComboBoxProperties)
private
FAutoSearchOnPopup: Boolean;
FDestroying: Boolean;
FFocusPopup: Boolean;
FGrid: TcxExtLookupGrid;
FInCheckListFieldItem: Boolean;
FListFieldItem: TcxCustomGridTableItem;
FPrevColumnFiltering: Boolean;
FPrevPullFocusing: Boolean;
FPrevImmediateEditor: Boolean;
FPrevIncSearch: Boolean;
FPrevMultiSelect: Boolean;
FView: TcxCustomGridTableView;
function GetGrid: TcxExtLookupGrid;
function GetGridMode: Boolean;
function GetListFieldIndex: Integer;
function GetListFieldItem: TcxCustomGridTableItem;
procedure SetGridMode(Value: Boolean);
procedure SetListFieldItem(Value: TcxCustomGridTableItem);
procedure SetView(Value: TcxCustomGridTableView);
protected
procedure CheckListFieldItem;
procedure DeinitializeDataController; override;
procedure FreeNotification(Sender: TComponent); override;
function GetIncrementalFiltering: Boolean; override;
function GetListIndex: Integer; override;
procedure InitializeDataController; override;
procedure LinkView(AView: TcxCustomGridTableView);
function PopupWindowCapturesFocus: Boolean; override;
procedure UnlinkView(AView: TcxCustomGridTableView);
// LookupGrid methods
function GetLookupGridActiveControl: TWinControl; override;
function GetLookupGridCanResize: Boolean; override;
function GetLookupGridColumnCount: Integer; override;
function GetLookupGridControl: TWinControl; override;
function GetLookupGridDataController: TcxCustomDataController; override;
function GetLookupGridVisualAreaPreferredWidth: Integer; override;
function GetLookupGridNearestPopupHeight(AHeight: Integer): Integer; override;
function GetLookupGridPopupHeight(ADropDownRowCount: Integer): Integer; override;
function IsLookupGridMouseOverList(const P: TPoint): Boolean; override;
procedure LookupGridDeinitialize; override;
procedure LookupGridDroppedDown(const AFindStr: string); override;
procedure LookupGridInitEvents(AOnClick, AOnFocusedRowChanged: TNotifyEvent;
AOnCloseUp: TcxLookupGridCloseUpEvent); override;
procedure LookupGridInitialize; override;
procedure LookupGridInitLookAndFeel(ALookAndFeel: TcxLookAndFeel;
AColor: TColor; AFont: TFont); override;
procedure LookupGridLockMouseMove; override;
procedure LookupGridMakeFocusedRowVisible; override;
procedure LookupGridUnlockMouseMove; override;
// DBLookupGrid methods
procedure DBLookupGridBeginUpdate; override;
procedure DBLookupGridCheckColumnByFieldName(const AFieldName: string); override;
procedure DBLookupGridCreateColumnsByFieldNames(const AFieldNames: string); override;
procedure DBLookupGridEndUpdate; override;
function GetDBLookupGridColumnField(AIndex: Integer): TField; override;
function GetDBLookupGridColumnFieldName(AIndex: Integer): string; override;
function GetDBLookupGridColumnIndexByFieldName(const AFieldName: string): Integer; override;
function GetDBLookupGridDataController: TcxDBDataController; override;
public
constructor Create(AOwner: TPersistent); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
class function GetContainerClass: TcxContainerClass; override;
class function IsViewSupported(Value: TcxCustomGridTableView): Boolean;
property Grid: TcxExtLookupGrid read GetGrid;
property ListFieldIndex: Integer read GetListFieldIndex;
published
property Alignment;
property AssignedValues;
property AutoSearchOnPopup: Boolean read FAutoSearchOnPopup write FAutoSearchOnPopup default True;
property AutoSelect;
property ButtonGlyph;
property CaseSensitiveSearch;
property CharCase;
property ClearKey;
property DropDownAutoSize;
property DropDownHeight;
property DropDownListStyle;
property DropDownRows;
property DropDownSizeable;
property DropDownWidth;
property FocusPopup: Boolean read FFocusPopup write FFocusPopup default False;
property GridMode: Boolean read GetGridMode write SetGridMode default False;
property HideSelection;
property ImeMode;
property ImeName;
property ImmediateDropDown;
property ImmediatePost;
property IncrementalFiltering;
property View: TcxCustomGridTableView read FView write SetView; // before
property KeyFieldNames;
property ListFieldItem: TcxCustomGridTableItem read GetListFieldItem write SetListFieldItem;
property MaxLength;
property OEMConvert;
property PopupAlignment;
property PostPopupValueOnTab;
property ReadOnly;
property Revertable;
property UseLeftAlignmentOnEditing;
property ValidateOnEnter;
property OnChange;
property OnCloseUp;
property OnEditValueChanged;
property OnInitPopup;
property OnNewLookupDisplayText;
property OnPopup;
property OnValidate;
end;
{ TcxCustomExtLookupComboBox }
TcxCustomExtLookupComboBox = class(TcxCustomDBLookupEdit)
private
function GetActiveProperties: TcxExtLookupComboBoxProperties;
function GetProperties: TcxExtLookupComboBoxProperties;
procedure SetProperties(Value: TcxExtLookupComboBoxProperties);
protected
function CanDropDown: Boolean; override;
public
class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
property ActiveProperties: TcxExtLookupComboBoxProperties
read GetActiveProperties;
property EditValue;
property Properties: TcxExtLookupComboBoxProperties read GetProperties
write SetProperties;
property Text;
end;
{ TcxExtLookupComboBox }
TcxExtLookupComboBox = class(TcxCustomExtLookupComboBox)
published
property Anchors;
property AutoSize;
property BeepOnEnter;
property Constraints;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property ImeMode;
property ImeName;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property Properties;
property EditValue;
property ShowHint;
property Style;
property StyleDisabled;
property StyleFocused;
property StyleHot;
property TabOrder;
property TabStop;
property Visible;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnEditing;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
{ TcxDBExtLookupComboBox }
TcxDBExtLookupComboBox = class(TcxCustomExtLookupComboBox)
private
function GetDataBinding: TcxDBTextEditDataBinding;
procedure SetDataBinding(Value: TcxDBTextEditDataBinding);
procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
protected
class function GetDataBindingClass: TcxEditDataBindingClass; override;
published
property Anchors;
property AutoSize;
property BeepOnEnter;
property Constraints;
property DragCursor;
property DragKind;
property DataBinding: TcxDBTextEditDataBinding read GetDataBinding
write SetDataBinding;
property DragMode;
property Enabled;
property ImeMode;
property ImeName;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property Properties;
property ShowHint;
property Style;
property StyleDisabled;
property StyleFocused;
property StyleHot;
property TabOrder;
property TabStop;
property Visible;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnEditing;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
{ TcxEditRepositoryExtLookupComboBoxItem }
TcxEditRepositoryExtLookupComboBoxItem = class(TcxEditRepositoryItem)
private
function GetProperties: TcxExtLookupComboBoxProperties;
procedure SetProperties(Value: TcxExtLookupComboBoxProperties);
public
class function GetEditPropertiesClass: TcxCustomEditPropertiesClass; override;
published
property Properties: TcxExtLookupComboBoxProperties read GetProperties write SetProperties;
end;
implementation
uses
cxGridFilterHelpers;
type
TcxCustomGridTableOptionsBehaviorAccess = class(TcxCustomGridTableOptionsBehavior);
TcxCustomGridTableOptionsViewAccess = class(TcxCustomGridTableOptionsView);
{ TcxExtLookupGrid }
procedure TcxExtLookupGrid.DoCancelMode;
begin
FRowPressed := False;
inherited;
end;
procedure TcxExtLookupGrid.DoCloseUp(AAccept: Boolean);
begin
if AAccept then
View.DataController.SyncSelected(True);
if Assigned(FOnCloseUp) then FOnCloseUp(Self, AAccept);
end;
function TcxExtLookupGrid.IsDataRow(AHitTest: TcxCustomGridHitTest): Boolean;
begin
Result := (AHitTest is TcxGridRecordHitTest) and
TcxGridRecordHitTest(AHitTest).GridRecord.IsData;
end;
function TcxExtLookupGrid.GetView: TcxCustomGridTableView;
begin
Result := Levels[0].GridView as TcxCustomGridTableView;
end;
procedure TcxExtLookupGrid.ViewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Assigned(FPrevOnKeyDown) then
FPrevOnKeyDown(Self, Key, Shift);
if (View = nil) then Exit;
case Key of
VK_RETURN:
if not Editable or not View.OptionsData.Editing or (ssCtrl in Shift) then
begin
if View.DataController.IsEditing then
View.DataController.Post;
DoCloseUp(View.DataController.FocusedRowIndex <> -1);
end;
VK_ESCAPE:
if Editable and not View.DataController.IsEditing then
DoCloseUp(False);
end;
end;
procedure TcxExtLookupGrid.ViewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
AHitTest: TcxCustomGridHitTest;
begin
if Assigned(FPrevOnMouseDown) then
FPrevOnMouseDown(Sender, Button, Shift, X, Y);
AHitTest := View.ViewInfo.GetHitTest(X, Y);
if (Button = mbLeft) and IsDataRow(AHitTest) then
begin
if Editable then
begin
if ssDouble in Shift then
DoCloseUp(True);
end
else
FRowPressed := True;
end;
end;
procedure TcxExtLookupGrid.ViewMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
AHitTest: TcxCustomGridHitTest;
begin
if Assigned(FPrevOnMouseMove) then
FPrevOnMouseMove(Sender, Shift, X, Y);
if not MouseCapture and PopupMouseMoveLocked then
begin
PopupMouseMoveLocked := False;
Exit;
end;
// Hot Track
if (View = nil) or Editable then Exit;
AHitTest := View.ViewInfo.GetHitTest(X, Y);
if IsDataRow(AHitTest) and ((FMousePos.X <> X) or (FMousePos.Y <> Y)) then
begin
FMousePos.X := X;
FMousePos.Y := Y;
TcxGridRecordHitTest(AHitTest).GridRecord.Focused := True;
end;
end;
procedure TcxExtLookupGrid.ViewMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
AHitTest: TcxCustomGridHitTest;
begin
if Assigned(FPrevOnMouseUp) then
FPrevOnMouseUp(Sender, Button, Shift, X, Y);
AHitTest := View.ViewInfo.GetHitTest(X, Y);
if (Button = mbLeft) and FRowPressed then
DoCloseUp(IsDataRow(AHitTest));
FRowPressed := False;
end;
{ TcxExtLookupComboBoxProperties }
constructor TcxExtLookupComboBoxProperties.Create(AOwner: TPersistent);
begin
inherited Create(AOwner);
FAutoSearchOnPopup := True;
end;
destructor TcxExtLookupComboBoxProperties.Destroy;
begin
FDestroying := True;
ListFieldItem := nil;
View := nil;
FreeAndNil(FGrid);
inherited Destroy;
end;
procedure TcxExtLookupComboBoxProperties.Assign(Source: TPersistent);
begin
if Source is TcxExtLookupComboBoxProperties then
begin
BeginUpdate;
try
AutoSearchOnPopup := TcxExtLookupComboBoxProperties(Source).AutoSearchOnPopup;
FocusPopup := TcxExtLookupComboBoxProperties(Source).FocusPopup;
View := nil; //?
GridMode := TcxExtLookupComboBoxProperties(Source).GridMode;
View := TcxExtLookupComboBoxProperties(Source).View;
inherited Assign(Source);
ListFieldItem := TcxExtLookupComboBoxProperties(Source).ListFieldItem;
finally
EndUpdate;
end
end
else
inherited Assign(Source);
end;
class function TcxExtLookupComboBoxProperties.GetContainerClass: TcxContainerClass;
begin
Result := TcxExtLookupComboBox;
end;
class function TcxExtLookupComboBoxProperties.IsViewSupported(Value: TcxCustomGridTableView): Boolean;
begin
Result := Value.CanBeLookupList and
(TcxCustomGridView(Value).DataController is TcxDBDataController);
end;
procedure TcxExtLookupComboBoxProperties.CheckListFieldItem;
begin
FInCheckListFieldItem := True;
try
if (View <> nil) and (ListFieldItem <> nil) and
(View.IndexOfItem(ListFieldItem) = -1) then
ListFieldItem := nil;
finally
FInCheckListFieldItem := False;
end;
end;
procedure TcxExtLookupComboBoxProperties.DeinitializeDataController;
begin
inherited DeinitializeDataController;
if DataController <> nil then
DataController.RemoveDataChangeRefCount;
end;
procedure TcxExtLookupComboBoxProperties.FreeNotification(Sender: TComponent);
begin
inherited FreeNotification(Sender);
if Sender = ListFieldItem then
ListFieldItem := nil;
if Sender = View then
View := nil;
end;
function TcxExtLookupComboBoxProperties.GetIncrementalFiltering: Boolean;
begin
if FocusPopup then
Result := False
else
Result := inherited GetIncrementalFiltering;
end;
function TcxExtLookupComboBoxProperties.GetListIndex: Integer;
begin
Result := Self.ListFieldIndex;
end;
procedure TcxExtLookupComboBoxProperties.InitializeDataController;
begin
inherited InitializeDataController;
if DataController <> nil then
DataController.AddDataChangeRefCount;
end;
procedure TcxExtLookupComboBoxProperties.LinkView(AView: TcxCustomGridTableView);
begin
CheckListFieldItem;
FreeNotificator.AddSender(AView);
InitializeDataController;
end;
function TcxExtLookupComboBoxProperties.PopupWindowCapturesFocus: Boolean;
begin
Result := FocusPopup;
end;
procedure TcxExtLookupComboBoxProperties.UnlinkView(AView: TcxCustomGridTableView);
begin
DeinitializeDataController;
FreeNotificator.RemoveSender(AView);
end;
// LookupGrid methods
function TcxExtLookupComboBoxProperties.GetLookupGridActiveControl: TWinControl;
begin
if View <> nil then
Result := View.Site
else
Result := inherited GetLookupGridActiveControl;
end;
function TcxExtLookupComboBoxProperties.GetLookupGridCanResize: Boolean;
begin
if View <> nil then
Result := not TcxCustomGridTableOptionsViewAccess(View.OptionsView).CellAutoHeight
else
Result := False;
end;
function TcxExtLookupComboBoxProperties.GetLookupGridColumnCount: Integer;
begin
if View <> nil then
Result := View.ItemCount
else
Result := 0;
end;
function TcxExtLookupComboBoxProperties.GetLookupGridControl: TWinControl;
begin
Result := Grid;
end;
function TcxExtLookupComboBoxProperties.GetLookupGridDataController: TcxCustomDataController;
begin
if View <> nil then
Result := View.DataController
else
Result := nil;
end;
function TcxExtLookupComboBoxProperties.GetLookupGridVisualAreaPreferredWidth: Integer;
begin
Result := 0;
if View <> nil then
View.ViewInfo.GetWidth(Point(MaxInt, MaxInt), Result);
end;
function TcxExtLookupComboBoxProperties.GetLookupGridNearestPopupHeight(AHeight: Integer): Integer;
begin
if View <> nil then
Result := View.ViewInfo.GetNearestPopupHeight(AHeight, FocusPopup)
else
Result := AHeight;
end;
function TcxExtLookupComboBoxProperties.GetLookupGridPopupHeight(ADropDownRowCount: Integer): Integer;
begin
if View <> nil then
begin
if FocusPopup and (ADropDownRowCount < 2) then // TODO: Check New Item Row
ADropDownRowCount := 2;
Result := View.ViewInfo.GetPopupHeight(ADropDownRowCount);
end
else
Result := 0;
end;
function TcxExtLookupComboBoxProperties.IsLookupGridMouseOverList(const P: TPoint): Boolean;
var
AHitTest: TcxCustomGridHitTest;
begin
Result := False;
if View <> nil then
begin
AHitTest := View.ViewInfo.GetHitTest(P);
Result := AHitTest is TcxGridRecordHitTest;
end;
end;
procedure TcxExtLookupComboBoxProperties.LookupGridDeinitialize;
begin
Grid.Levels[0].GridView := nil;
// restore options
if (View <> nil) and not (csDestroying in View.ComponentState) then
begin
TcxCustomGridTableOptionsBehaviorAccess(View.OptionsBehavior).PullFocusing := FPrevPullFocusing;
View.OptionsSelection.MultiSelect := FPrevMultiSelect;
View.OptionsBehavior.ImmediateEditor := FPrevImmediateEditor;
if View is TcxGridTableView then
TcxGridTableView(View).OptionsCustomize.ColumnFiltering := FPrevColumnFiltering;
View.OptionsBehavior.IncSearch := FPrevIncSearch;
View.OnKeyDown := Grid.FPrevOnKeyDown;
View.OnMouseDown := Grid.FPrevOnMouseDown;
View.OnMouseMove := Grid.FPrevOnMouseMove;
View.OnMouseUp := Grid.FPrevOnMouseUp;
end;
end;
procedure TcxExtLookupComboBoxProperties.LookupGridDroppedDown(const AFindStr: string);
begin
// Init Inc Search
// TODO: !!!
if FocusPopup and AutoSearchOnPopup and (ListFieldItem <> nil) then
begin
ListFieldItem.Focused := True;
View.DataController.Search.Locate(ListFieldItem.Index, AFindStr);
end;
end;
procedure TcxExtLookupComboBoxProperties.LookupGridInitEvents(AOnClick, AOnFocusedRowChanged: TNotifyEvent;
AOnCloseUp: cxLookupEdit.TcxLookupGridCloseUpEvent);
begin
Grid.OnClick := AOnClick; // not impl
if View <> nil then
begin
// View.OnFocusedRecordChanged := AOnFocusedRowChanged;
Grid.OnCloseUp := AOnCloseUp;
end;
end;
procedure TcxExtLookupComboBoxProperties.LookupGridInitialize;
begin
if View = nil then
Exit;
// save options
FPrevPullFocusing := TcxCustomGridTableOptionsBehaviorAccess(View.OptionsBehavior).PullFocusing;
TcxCustomGridTableOptionsBehaviorAccess(View.OptionsBehavior).PullFocusing := True;
FPrevMultiSelect := View.OptionsSelection.MultiSelect;
View.OptionsSelection.MultiSelect := False;
FPrevImmediateEditor := View.OptionsBehavior.ImmediateEditor;
View.OptionsBehavior.ImmediateEditor := False;
if View is TcxGridTableView then
begin
FPrevColumnFiltering := TcxGridTableView(View).OptionsCustomize.ColumnFiltering;
if not FocusPopup then
TcxGridTableView(View).OptionsCustomize.ColumnFiltering := False;
end;
Grid.FPrevOnKeyDown := View.OnKeyDown;
View.OnKeyDown := Grid.ViewKeyDown;
Grid.FPrevOnMouseDown := View.OnMouseDown;
View.OnMouseDown := Grid.ViewMouseDown;
Grid.FMousePos := Point(-1, -1);
Grid.FPrevOnMouseMove := View.OnMouseMove;
View.OnMouseMove := Grid.ViewMouseMove;
Grid.FPrevOnMouseUp := View.OnMouseUp;
View.OnMouseUp := Grid.ViewMouseUp;
Grid.Editable := FocusPopup;
Grid.Levels[0].GridView := View;
FPrevIncSearch := View.OptionsBehavior.IncSearch;
if FocusPopup and AutoSearchOnPopup then
View.OptionsBehavior.IncSearch := True;
View.DataController.Search.Cancel;
end;
procedure TcxExtLookupComboBoxProperties.LookupGridInitLookAndFeel(ALookAndFeel: TcxLookAndFeel;
AColor: TColor; AFont: TFont);
begin
Grid.LookAndFeel.MasterLookAndFeel := ALookAndFeel;
Grid.Color := AColor;
Grid.Font := AFont;
end;
procedure TcxExtLookupComboBoxProperties.LookupGridLockMouseMove;
begin
Grid.PopupMouseMoveLocked := True;
end;
procedure TcxExtLookupComboBoxProperties.LookupGridMakeFocusedRowVisible;
begin
if View <> nil then
View.Controller.MakeFocusedRecordVisible;
end;
procedure TcxExtLookupComboBoxProperties.LookupGridUnlockMouseMove;
begin
Grid.MouseCapture := False;
Grid.PopupMouseMoveLocked := False;
end;
// DBLookupGrid methods
procedure TcxExtLookupComboBoxProperties.DBLookupGridBeginUpdate;
begin
if View <> nil then View.BeginUpdate;
end;
procedure TcxExtLookupComboBoxProperties.DBLookupGridCheckColumnByFieldName(const AFieldName: string);
begin
if (View <> nil) and (DataController <> nil) then
begin
if (AFieldName <> '') and (DataController.GetItemByFieldName(AFieldName) = nil) then
with View.CreateItem do
begin
Index := 0;
DataController.ChangeFieldName(Index, AFieldName);
end;
end;
end;
procedure TcxExtLookupComboBoxProperties.DBLookupGridCreateColumnsByFieldNames(const AFieldNames: string);
var
I: Integer;
AFieldNamesList: TStrings;
begin
if View <> nil then
begin
View.ClearItems;
AFieldNamesList := TStringList.Create;
try
GetFieldNames(AFieldNames, AFieldNamesList);
View.BeginUpdate;
try
for I := 0 to AFieldNamesList.Count - 1 do
DataController.ChangeFieldName(View.CreateItem.Index, AFieldNamesList[I]);
finally
View.EndUpdate;
end;
finally
AFieldNamesList.Free;
end;
end;
end;
procedure TcxExtLookupComboBoxProperties.DBLookupGridEndUpdate;
begin
if View <> nil then View.EndUpdate;
end;
function TcxExtLookupComboBoxProperties.GetDBLookupGridColumnField(AIndex: Integer): TField;
begin
if DataController <> nil then
Result := DataController.GetItemField(AIndex)
else
Result := nil;
end;
function TcxExtLookupComboBoxProperties.GetDBLookupGridColumnFieldName(AIndex: Integer): string;
begin
if DataController <> nil then
Result := DataController.GetItemFieldName(AIndex)
else
Result := '';
end;
function TcxExtLookupComboBoxProperties.GetDBLookupGridColumnIndexByFieldName(const AFieldName: string): Integer;
var
AItem: TcxCustomGridTableItem;
begin
if DataController <> nil then
begin
AItem := TcxCustomGridTableItem(DataController.GetItemByFieldName(AFieldName));
Result := AItem.Index;
end
else
Result := -1;
end;
function TcxExtLookupComboBoxProperties.GetDBLookupGridDataController: TcxDBDataController;
begin
Result := TcxDBDataController(GetLookupGridDataController);
end;
function TcxExtLookupComboBoxProperties.GetGrid: TcxExtLookupGrid;
procedure CreateGrid;
begin
FGrid := TcxExtLookupGrid.Create(nil);
FGrid.IsPopupControl := True;
FGrid.BorderStyle := cxcbsNone;
FGrid.Levels.Add;
end;
begin
if (FGrid = nil) and not FDestroying then
CreateGrid;
Result := FGrid;
end;
function TcxExtLookupComboBoxProperties.GetGridMode: Boolean;
begin
Result := inherited IsUseLookupList;
end;
function TcxExtLookupComboBoxProperties.GetListFieldIndex: Integer;
var
AItem: TcxCustomGridTableItem;
begin
if IsDefinedByLookup then
Result := GetDisplayColumnIndex
else
begin
AItem := ListFieldItem;
if AItem <> nil then
Result := AItem.Index
else
Result := -1;
end;
end;
function TcxExtLookupComboBoxProperties.GetListFieldItem: TcxCustomGridTableItem;
begin
if IsDefinedByLookup then
Result := nil
else
Result := FListFieldItem;
end;
procedure TcxExtLookupComboBoxProperties.SetGridMode(Value: Boolean);
begin
inherited IsUseLookupList := Value;
end;
procedure TcxExtLookupComboBoxProperties.SetListFieldItem(Value: TcxCustomGridTableItem);
begin
if (View <> nil) and (View.IndexOfItem(Value) = -1) then
Value := nil;
if FListFieldItem <> Value then
begin
if FListFieldItem <> nil then
FreeNotificator.RemoveSender(FListFieldItem);
FListFieldItem := Value;
if FListFieldItem <> nil then
FreeNotificator.AddSender(FListFieldItem);
if not FInCheckListFieldItem then
Changed;
end;
end;
procedure TcxExtLookupComboBoxProperties.SetView(Value: TcxCustomGridTableView);
begin
if (Value <> nil) and not IsViewSupported(Value) then Exit;
if FView <> Value then
begin
if FView <> nil then
UnlinkView(FView);
FView := Value;
if FView <> nil then
LinkView(FView);
Changed;
end;
end;
{ TcxCustomExtLookupComboBox }
class function TcxCustomExtLookupComboBox.GetPropertiesClass: TcxCustomEditPropertiesClass;
begin
Result := TcxExtLookupComboBoxProperties;
end;
function TcxCustomExtLookupComboBox.CanDropDown: Boolean;
begin
if ActiveProperties.FocusPopup then
Result := True
else
Result := inherited CanDropDown;
end;
function TcxCustomExtLookupComboBox.GetActiveProperties: TcxExtLookupComboBoxProperties;
begin
Result := TcxExtLookupComboBoxProperties(InternalGetActiveProperties);
end;
function TcxCustomExtLookupComboBox.GetProperties: TcxExtLookupComboBoxProperties;
begin
Result := TcxExtLookupComboBoxProperties(FProperties);
end;
procedure TcxCustomExtLookupComboBox.SetProperties(Value: TcxExtLookupComboBoxProperties);
begin
FProperties.Assign(Value);
end;
{ TcxDBExtLookupComboBox }
class function TcxDBExtLookupComboBox.GetDataBindingClass: TcxEditDataBindingClass;
begin
Result := TcxDBLookupEditDataBinding;
end;
function TcxDBExtLookupComboBox.GetDataBinding: TcxDBTextEditDataBinding;
begin
Result := TcxDBTextEditDataBinding(FDataBinding);
end;
procedure TcxDBExtLookupComboBox.SetDataBinding(Value: TcxDBTextEditDataBinding);
begin
FDataBinding.Assign(Value);
end;
procedure TcxDBExtLookupComboBox.CMGetDataLink(var Message: TMessage);
begin
Message.Result := Integer(GetcxDBEditDataLink(Self));
end;
{ TcxEditRepositoryExtLookupComboBoxItem }
class function TcxEditRepositoryExtLookupComboBoxItem.GetEditPropertiesClass: TcxCustomEditPropertiesClass;
begin
Result := TcxExtLookupComboBoxProperties;
end;
function TcxEditRepositoryExtLookupComboBoxItem.GetProperties: TcxExtLookupComboBoxProperties;
begin
Result := inherited Properties as TcxExtLookupComboBoxProperties;
end;
procedure TcxEditRepositoryExtLookupComboBoxItem.SetProperties(Value: TcxExtLookupComboBoxProperties);
begin
inherited Properties := Value;
end;
initialization
RegisterClasses([TcxEditRepositoryExtLookupComboBoxItem]);
GetRegisteredEditProperties.Register(TcxExtLookupComboBoxProperties,
cxSEditRepositoryExtLookupComboBoxItem);
finalization
GetRegisteredEditProperties.Unregister(TcxExtLookupComboBoxProperties);
end.