Componentes.Terceros.DevExp.../internal/x.44/1/ExpressEditors Library 5/Sources/cxMRUEdit.pas
2009-06-29 12:09:02 +00:00

474 lines
14 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 cxMRUEdit;
{$I cxVer.inc}
interface
uses
Messages,
{$IFDEF DELPHI6}
Types,
{$ENDIF}
SysUtils, Classes, Controls, Graphics, cxContainer, cxEdit,
cxDropDownEdit, cxFilterControlUtils;
type
TcxCustomMRUEditProperties = class;
TcxMRUEditDeleteLookupItemEvent = procedure(AProperties: TcxCustomMRUEditProperties;
AItemIndex: Integer) of object;
{ TcxCustomMRUEditProperties }
TcxCustomMRUEditProperties = class(TcxCustomComboBoxProperties)
private
FMaxItemCount: Integer;
FShowEllipsis: Boolean;
FOnButtonClick: TNotifyEvent;
FOnDeleteLookupItem: TcxMRUEditDeleteLookupItemEvent;
procedure CheckItemCount;
procedure SetMaxItemCount(Value: Integer);
procedure SetShowEllipsis(Value: Boolean);
protected
procedure DoDeleteLookupItem(AItemIndex: Integer);
procedure DoOnNewLookupDisplayText(const AText: string); virtual;
procedure InternalAddItem(const AItem: string;
ARaiseOnNewLookupDisplayTextEvent: Boolean); virtual;
public
constructor Create(AOwner: TPersistent); override;
procedure Assign(Source: TPersistent); override;
class function GetContainerClass: TcxContainerClass; override;
procedure Update(AProperties: TcxCustomEditProperties); override;
procedure AddItem(const AItem: string);
// !!!
property MaxItemCount: Integer read FMaxItemCount write SetMaxItemCount
default 0;
property ShowEllipsis: Boolean read FShowEllipsis write SetShowEllipsis
default True;
property OnButtonClick: TNotifyEvent
read FOnButtonClick write FOnButtonClick;
property OnDeleteLookupItem: TcxMRUEditDeleteLookupItemEvent
read FOnDeleteLookupItem write FOnDeleteLookupItem;
end;
{ TcxMRUEditProperties }
TcxMRUEditProperties = class(TcxCustomMRUEditProperties)
published
property Alignment;
property AssignedValues;
property AutoSelect;
property BeepOnError;
property ButtonGlyph;
property CaseInsensitive;
property CharCase;
property ClearKey;
property ClickKey;
property DropDownAutoWidth;
property DropDownListStyle;
property DropDownRows;
property DropDownSizeable;
property DropDownWidth;
property HideSelection;
property IgnoreMaskBlank;
property ImeMode;
property ImeName;
property ImmediateDropDown;
property ImmediatePost;
property ImmediateUpdateText;
property ItemHeight;
property LookupItems;
property MaskKind;
property EditMask;
property MaxItemCount;
property MaxLength;
property OEMConvert;
property PopupAlignment;
property PostPopupValueOnTab;
property ReadOnly;
property Revertable;
property ShowEllipsis;
property UseLeftAlignmentOnEditing;
property ValidateOnEnter;
property OnButtonClick;
property OnChange;
property OnCloseUp;
property OnDeleteLookupItem;
property OnDrawItem;
property OnEditValueChanged;
property OnInitPopup;
property OnMeasureItem;
property OnNewLookupDisplayText;
property OnPopup;
property OnValidate;
end;
{ TcxMRUEditProperties }
TcxCustomMRUEdit = class(TcxCustomComboBox)
private
function GetProperties: TcxCustomMRUEditProperties;
function GetActiveProperties: TcxCustomMRUEditProperties;
procedure SetProperties(Value: TcxCustomMRUEditProperties);
protected
procedure DoButtonClick(AButtonVisibleIndex: Integer); override;
procedure DoEditKeyDown(var Key: Word; Shift: TShiftState); override;
procedure HandleSelectItem(Sender: TObject); override;
procedure InternalValidateDisplayValue(const ADisplayValue: TcxEditValue); override;
function SupportsSpelling: Boolean; override;
procedure PropertiesChanged(Sender: TObject); override;
public
procedure AddItem(const Value: string); virtual;
class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
property ActiveProperties: TcxCustomMRUEditProperties read GetActiveProperties;
property Properties: TcxCustomMRUEditProperties read GetProperties
write SetProperties;
end;
{ TcxMRUEdit }
TcxMRUEdit = class(TcxCustomMRUEdit)
private
function GetActiveProperties: TcxMRUEditProperties;
function GetProperties: TcxMRUEditProperties;
procedure SetProperties(Value: TcxMRUEditProperties);
public
class function GetPropertiesClass: TcxCustomEditPropertiesClass; override;
property ActiveProperties: TcxMRUEditProperties read GetActiveProperties;
property ItemIndex;
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: TcxMRUEditProperties read GetProperties write SetProperties;
property ShowHint;
property Style;
property StyleDisabled;
property StyleFocused;
property StyleHot;
property TabOrder;
property TabStop;
property Text;
{$IFDEF DELPHI12}
property TextHint;
{$ENDIF}
property Visible;
property OnClick;
{$IFDEF DELPHI5}
property OnContextPopup;
{$ENDIF}
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEditing;
property OnEndDock;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseEnter;
property OnMouseLeave;
property OnMouseMove;
property OnMouseUp;
property OnStartDock;
property OnStartDrag;
end;
implementation
uses
Windows, cxControls, cxEditConsts, cxTextEdit;
{ TcxCustomMRUEditProperties }
constructor TcxCustomMRUEditProperties.Create(AOwner: TPersistent);
begin
inherited Create(AOwner);
FMaxItemCount := 0;
FShowEllipsis := True;
Buttons.Add;
GlyphButtonIndex := 1;
Buttons[1].Kind := bkEllipsis;
Buttons[1].Default := True;
DropDownListStyle := lsEditList;
MRUMode := True;
end;
procedure TcxCustomMRUEditProperties.CheckItemCount;
begin
if FMaxItemCount > 0 then
while Items.Count > FMaxItemCount do
begin
DoDeleteLookupItem(Items.Count - 1);
Items.Delete(Items.Count - 1);
end;
end;
procedure TcxCustomMRUEditProperties.SetMaxItemCount(Value: Integer);
begin
if Value < 0 then Value := 0;
if FMaxItemCount <> Value then
begin
FMaxItemCount := Value;
CheckItemCount;
Changed;
end;
end;
procedure TcxCustomMRUEditProperties.SetShowEllipsis(Value: Boolean);
begin
if FShowEllipsis <> Value then
try
BeginUpdate;
FShowEllipsis := Value;
Buttons[1].Visible := Value;
if Value then
GlyphButtonIndex := 1
else
GlyphButtonIndex := 0;
finally
EndUpdate;
end;
end;
procedure TcxCustomMRUEditProperties.Assign(Source: TPersistent);
begin
if Source is TcxCustomMRUEditProperties then
begin
BeginUpdate;
try
inherited Assign(Source);
with TcxCustomMRUEditProperties(Source) do
begin
Self.MaxItemCount := MaxItemCount;
Self.ShowEllipsis := ShowEllipsis;
Self.OnButtonClick := OnButtonClick;
Self.OnDeleteLookupItem := OnDeleteLookupItem;
end;
finally
EndUpdate
end
end
else
inherited Assign(Source);
end;
class function TcxCustomMRUEditProperties.GetContainerClass: TcxContainerClass;
begin
Result := TcxMRUEdit;
end;
procedure TcxCustomMRUEditProperties.Update(AProperties: TcxCustomEditProperties);
begin
if AProperties is TcxCustomMRUEditProperties then
TcxCustomMRUEditProperties(AProperties).LookupItems.Assign(LookupItems);
end;
procedure TcxCustomMRUEditProperties.AddItem(const AItem: string);
begin
InternalAddItem(AItem, True);
end;
procedure TcxCustomMRUEditProperties.DoDeleteLookupItem(AItemIndex: Integer);
begin
if Assigned(FOnDeleteLookupItem) then
FOnDeleteLookupItem(Self, AItemIndex);
end;
procedure TcxCustomMRUEditProperties.DoOnNewLookupDisplayText(
const AText: string);
begin
if Assigned(OnNewLookupDisplayText) then
OnNewLookupDisplayText(Self, AText);
end;
procedure TcxCustomMRUEditProperties.InternalAddItem(const AItem: string;
ARaiseOnNewLookupDisplayTextEvent: Boolean);
var
I: Integer;
begin
if AItem = '' then
Exit;
I := LookupItems.IndexOf(AItem);
if I <> 0 then
if I = -1 then
begin
if ARaiseOnNewLookupDisplayTextEvent then
DoOnNewLookupDisplayText(AItem);
LookupItems.Insert(0, AItem);
CheckItemCount;
end
else
LookupItems.Move(I, 0);
end;
{ TcxCustomMRUEdit }
function TcxCustomMRUEdit.GetProperties: TcxCustomMRUEditProperties;
begin
Result := TcxCustomMRUEditProperties(FProperties);
end;
function TcxCustomMRUEdit.GetActiveProperties: TcxCustomMRUEditProperties;
begin
Result := TcxCustomMRUEditProperties(InternalGetActiveProperties);
end;
procedure TcxCustomMRUEdit.SetProperties(Value: TcxCustomMRUEditProperties);
begin
FProperties.Assign(Value);
end;
procedure TcxCustomMRUEdit.DoButtonClick(AButtonVisibleIndex: Integer);
begin
if AButtonVisibleIndex = 1 then
begin
with Properties do
if Assigned(OnButtonClick) then
OnButtonClick(Self);
if RepositoryItem <> nil then
with ActiveProperties do
if Assigned(OnButtonClick) then
OnButtonClick(Self);
end;
end;
procedure TcxCustomMRUEdit.DoEditKeyDown(var Key: Word; Shift: TShiftState);
begin
if (Key = VK_RETURN) and not(ssAlt in Shift) and
(not HasPopupWindow or (TcxCustomEditListBox(ILookupData.ActiveControl).ItemIndex = -1)) then
AddItem(Text);
inherited DoEditKeyDown(Key, Shift);
end;
procedure TcxCustomMRUEdit.HandleSelectItem(Sender: TObject);
begin
inherited HandleSelectItem(Sender);
if not LookupItemsScrolling and DoEditing then
AddItem(Text);
end;
procedure TcxCustomMRUEdit.InternalValidateDisplayValue(
const ADisplayValue: TcxEditValue);
begin
AddItem(Text);
inherited InternalValidateDisplayValue(ADisplayValue);
end;
function TcxCustomMRUEdit.SupportsSpelling: Boolean;
begin
Result := IsTextInputMode;
end;
procedure TcxCustomMRUEdit.PropertiesChanged(Sender: TObject);
begin
with ActiveProperties do
if ShowEllipsis then
if ButtonGlyph.Empty then
Buttons[1].Kind := bkEllipsis
else
Buttons[1].Kind := bkGlyph
else
if ButtonGlyph.Empty then
Buttons[0].Kind := bkDown
else
Buttons[0].Kind := bkGlyph;
inherited PropertiesChanged(Sender);
end;
procedure TcxCustomMRUEdit.AddItem(const Value: string);
begin
if Value <> '' then
begin
if ActiveProperties.LookupItems.IndexOf(Value) = -1 then
DoOnNewLookupDisplayText(Value);
ActiveProperties.InternalAddItem(Value, False);
end;
end;
class function TcxCustomMRUEdit.GetPropertiesClass: TcxCustomEditPropertiesClass;
begin
Result := TcxCustomMRUEditProperties;
end;
{ TcxMRUEdit }
class function TcxMRUEdit.GetPropertiesClass: TcxCustomEditPropertiesClass;
begin
Result := TcxMRUEditProperties;
end;
function TcxMRUEdit.GetActiveProperties: TcxMRUEditProperties;
begin
Result := TcxMRUEditProperties(InternalGetActiveProperties);
end;
function TcxMRUEdit.GetProperties: TcxMRUEditProperties;
begin
Result := TcxMRUEditProperties(FProperties);
end;
procedure TcxMRUEdit.SetProperties(Value: TcxMRUEditProperties);
begin
FProperties.Assign(Value);
end;
initialization
GetRegisteredEditProperties.Register(TcxMRUEditProperties, scxSEditRepositoryMRUItem);
FilterEditsController.Register(TcxMRUEditProperties, TcxFilterTextEditHelper);
finalization
FilterEditsController.Unregister(TcxMRUEditProperties, TcxFilterTextEditHelper);
end.