You've already forked lazarus-ccr
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6876 8e941d3f-bd1b-0410-a28a-d453659cc2b4
1776 lines
48 KiB
ObjectPascal
1776 lines
48 KiB
ObjectPascal
{-----------------------------------------------------------------------------
|
|
The contents of this file are subject to the Mozilla Public License
|
|
Version 1.1 (the "License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
http://www.mozilla.org/MPL/MPL-1.1.html
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
|
|
the specific language governing rights and limitations under the License.
|
|
|
|
The Original Code is: JvDBLookupTreeView.PAS, released on 2002-07-04.
|
|
|
|
The Initial Developers of the Original Code are: Andrei Prygounkov <a dott prygounkov att gmx dott de>
|
|
Copyright (c) 1999, 2002 Andrei Prygounkov
|
|
All Rights Reserved.
|
|
|
|
Contributor(s):
|
|
|
|
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
|
|
located at http://jvcl.delphi-jedi.org
|
|
|
|
Components:
|
|
TJvDBLookupTreeView,
|
|
TJvDBLookupTreeViewCombo
|
|
|
|
Description:
|
|
db-aware lookup TreeView
|
|
|
|
History:
|
|
(JVCL Library versions):
|
|
1.20:
|
|
- first release;
|
|
1.61:
|
|
- support for non-bde components;
|
|
2.01:
|
|
- support for BiDi mode
|
|
(thanks to Oussama Al-Rifai);
|
|
|
|
Usage:
|
|
- Attach main table to "DataSource"
|
|
- Attach lookup table to "ListSource"
|
|
- Assign ID field of the main table to "DataField"; this is a unique ID of
|
|
the current record in the dataset.
|
|
- Assign ID field of the lookup dataset which matches the ID field of the
|
|
main table to the "KeyField"
|
|
- Assign the field of the lookup table with the lookup text to "ListField"
|
|
- MasterField and DetailField establish the links for the tree:
|
|
- "MasterField" is the ID of a record in the lookup table (usually the
|
|
same as "Keyfield")
|
|
- "DetailField" is the ID of the parent record for the current record
|
|
|
|
Known Issues:
|
|
-----------------------------------------------------------------------------}
|
|
// $Id$
|
|
|
|
unit JvDBLookupTreeView;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
LCLIntf, LCLType, LMessages,
|
|
Classes, Controls, Forms, ComCtrls, DB,
|
|
JvDBTreeView, {JvToolEdit, }JvComponent, JvExControls;
|
|
|
|
type
|
|
TJvDBLookupControl = class;
|
|
|
|
TJvLookupDataSourceLink = class(TDataLink)
|
|
private
|
|
FDBLookupControl: TJvDBLookupControl;
|
|
protected
|
|
procedure FocusControl(Field: TFieldRef); override;
|
|
procedure ActiveChanged; override;
|
|
procedure RecordChanged(Field: TField); override;
|
|
end;
|
|
|
|
TJvLookupListSourceLink = class(TDataLink)
|
|
private
|
|
FDBLookupControl: TJvDBLookupControl;
|
|
protected
|
|
procedure ActiveChanged; override;
|
|
procedure DataSetChanged; override;
|
|
end;
|
|
|
|
TJvDBLookupControl = class(TJvCustomControl)
|
|
private
|
|
FLookupSource: TDataSource;
|
|
FDataLink: TJvLookupDataSourceLink;
|
|
FListLink: TJvLookupListSourceLink;
|
|
FDataFieldName: string;
|
|
FKeyFieldName: string;
|
|
FListFieldName: string;
|
|
FListFieldIndex: Integer;
|
|
FDataField: TField;
|
|
FMasterField: TField;
|
|
FKeyField: TField;
|
|
FListField: TField;
|
|
FListFields: TList;
|
|
FKeyValue: Variant;
|
|
FUseFilter: Boolean;
|
|
FSearchText: string;
|
|
FLookupMode: Boolean;
|
|
FListActive: Boolean;
|
|
// FFocused: Boolean;
|
|
FSearchTickCount: Integer;
|
|
FOnKeyValueChange: TNotifyEvent;
|
|
function CanModify: Boolean;
|
|
procedure CheckNotCircular;
|
|
procedure CheckNotLookup;
|
|
procedure DataLinkActiveChanged;
|
|
procedure DataLinkRecordChanged(Field: TField);
|
|
function GetBorderSize: Integer;
|
|
function GetDataSource: TDataSource;
|
|
function GetKeyFieldName: string;
|
|
function GetListSource: TDataSource;
|
|
function GetReadOnly: Boolean;
|
|
function GetTextHeight: Integer;
|
|
procedure KeyValueChanged; virtual;
|
|
procedure ListLinkActiveChanged; virtual;
|
|
procedure ListLinkDataChanged; virtual;
|
|
function LocateKey: Boolean;
|
|
procedure ProcessSearchKey(Key: Char);
|
|
procedure SelectKeyValue(const Value: Variant);
|
|
procedure SetDataFieldName(const Value: string);
|
|
procedure SetDataSource(Value: TDataSource);
|
|
procedure SetKeyFieldName(const Value: string);
|
|
procedure SetKeyValue(const Value: Variant);
|
|
procedure SetListFieldName(const Value: string);
|
|
procedure SetListSource(Value: TDataSource);
|
|
procedure SetLookupMode(Value: Boolean);
|
|
procedure SetReadOnly(Value: Boolean);
|
|
procedure CMGetDataLink(var Msg: TLMessage); message CM_GETDATALINK;
|
|
protected
|
|
{
|
|
procedure FocusKilled(NextWnd: THandle); override;
|
|
procedure FocusSet(PrevWnd: THandle); override;
|
|
}
|
|
procedure GetDlgCode(var Code: TDlgCodes); override;
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
|
property DataField: string read FDataFieldName write SetDataFieldName;
|
|
property DataSource: TDataSource read GetDataSource write SetDataSource;
|
|
property KeyField: string read GetKeyFieldName write SetKeyFieldName;
|
|
property KeyValue: Variant read FKeyValue write SetKeyValue;
|
|
property ListField: string read FListFieldName write SetListFieldName;
|
|
property ListFieldIndex: Integer read FListFieldIndex write FListFieldIndex default 0;
|
|
property ListSource: TDataSource read GetListSource write SetListSource;
|
|
property UseFilter: Boolean read FUseFilter write FUseFilter default False;
|
|
property ParentColor default False;
|
|
property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
|
|
property TabStop default True;
|
|
property OnKeyValueChange: TNotifyEvent read FOnKeyValueChange write FOnKeyValueChange;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
property Field: TField read FDataField;
|
|
end;
|
|
|
|
(************************ NOT CONVERTED ***
|
|
|
|
TJvTreePopupDataList = class;
|
|
|
|
TDropDownAlign = (daLeft, daRight, daCenter);
|
|
|
|
TJvDBLookupTreeViewCombo = class(TJvDBLookupControl)
|
|
private
|
|
FDataList: TJvTreePopupDataList;
|
|
FButtonWidth: Integer;
|
|
FText: string;
|
|
// FDropDownRows: Integer;
|
|
FTracking: Boolean;
|
|
FDropDownWidth: Integer;
|
|
FDropDownHeight: Integer;
|
|
FDropDownAlign: TDropDownAlign;
|
|
FListVisible: Boolean;
|
|
FPressed: Boolean;
|
|
FAlignment: TAlignment;
|
|
FLookupMode: Boolean;
|
|
FOnDropDown: TNotifyEvent;
|
|
FOnCloseUp: TNotifyEvent;
|
|
FMasterField: string; {new}
|
|
FDetailField: string; {new}
|
|
FIconField: string; {new}
|
|
FStartMasterValue: string;
|
|
FFullExpand: Boolean; {new}
|
|
procedure KeyValueChanged; override;
|
|
procedure ListLinkActiveChanged; override;
|
|
{ procedure ListMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);}
|
|
procedure StopTracking;
|
|
procedure TrackButton(X, Y: Integer);
|
|
procedure CMCtl3DChanged(var Msg: TMessage); message CM_CTL3DCHANGED;
|
|
procedure CMGetDataLink(var Msg: TMessage); message CM_GETDATALINK;
|
|
procedure WMCancelMode(var Msg: TMessage); message WM_CANCELMODE;
|
|
procedure CMCancelMode(var Msg: TCMCancelMode); message CM_CANCELMODE;
|
|
procedure PopupCloseUp(Sender: TObject; Accept: Boolean); virtual;
|
|
private
|
|
FAutoExpand: Boolean;
|
|
FChangeDelay: Integer;
|
|
FHotTrack: Boolean;
|
|
FRowSelect: Boolean;
|
|
FToolTips: Boolean;
|
|
FAlwaysAcceptOnCloseUp: Boolean;
|
|
FOnCustomDraw: TTVCustomDrawEvent;
|
|
FOnCustomDrawItem: TTVCustomDrawItemEvent;
|
|
FOnGetImageIndex: TTVExpandedEvent;
|
|
protected
|
|
procedure FontChanged; override;
|
|
procedure FocusKilled(NextWnd: THandle); override;
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
procedure Paint; override;
|
|
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
|
procedure KeyPress(var Key: Char); override;
|
|
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
|
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
|
|
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
|
{added by zelen}
|
|
{$IFDEF JVCLThemesEnabled}
|
|
procedure MouseEnter(Control: TControl); override;
|
|
procedure MouseLeave(Control: TControl); override;
|
|
{$ENDIF JVCLThemesEnabled}
|
|
{/added by zelen}
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
procedure CloseUp(Accept: Boolean);
|
|
procedure DropDown;
|
|
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
|
|
function CanFocusEx: Boolean;
|
|
property KeyValue;
|
|
property ListVisible: Boolean read FListVisible;
|
|
property Text: string read FText;
|
|
published
|
|
property AutoSize;
|
|
property Color;
|
|
property DataField;
|
|
property DataSource;
|
|
property DragCursor;
|
|
property DragMode;
|
|
property DropDownAlign: TDropDownAlign read FDropDownAlign write FDropDownAlign default daLeft;
|
|
// property DropDownRows: Integer read FDropDownRows write FDropDownRows default 7;
|
|
property DropDownWidth: Integer read FDropDownWidth write FDropDownWidth default 0;
|
|
{new}
|
|
property DropDownHeight: Integer read FDropDownHeight write FDropDownHeight default 100;
|
|
|
|
property Enabled;
|
|
property Font;
|
|
property KeyField;
|
|
property ListField;
|
|
property UseFilter;
|
|
{new}
|
|
property MasterField: string read FMasterField write FMasterField;
|
|
property DetailField: string read FDetailField write FDetailField;
|
|
property IconField: string read FIconField write FIconField;
|
|
property StartMasterValue: string read FStartMasterValue write FStartMasterValue;
|
|
|
|
property ListFieldIndex;
|
|
property ListSource;
|
|
property ParentColor;
|
|
property ParentFont;
|
|
property ParentShowHint;
|
|
property PopupMenu;
|
|
property ReadOnly;
|
|
property ShowHint;
|
|
property TabOrder;
|
|
property TabStop;
|
|
property Visible;
|
|
property OnClick;
|
|
property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp;
|
|
property OnDragDrop;
|
|
property OnDragOver;
|
|
property OnDropDown: TNotifyEvent read FOnDropDown write FOnDropDown;
|
|
property OnEndDrag;
|
|
property OnEnter;
|
|
property OnExit;
|
|
property OnKeyDown;
|
|
property OnKeyPress;
|
|
property OnKeyUp;
|
|
property OnMouseDown;
|
|
property OnMouseMove;
|
|
property OnMouseUp;
|
|
property OnStartDrag;
|
|
property ImeMode;
|
|
property ImeName;
|
|
property Anchors;
|
|
property BevelEdges;
|
|
property BevelInner;
|
|
property BevelKind default bkNone;
|
|
property BevelOuter;
|
|
property BiDiMode;
|
|
property BorderWidth;
|
|
property Constraints;
|
|
property DragKind;
|
|
property ParentBiDiMode;
|
|
property OnEndDock;
|
|
property OnStartDock;
|
|
property AutoExpand: Boolean read FAutoExpand write FAutoExpand default False;
|
|
property ChangeDelay: Integer read FChangeDelay write FChangeDelay default 0;
|
|
property HotTrack: Boolean read FHotTrack write FHotTrack default False;
|
|
property RowSelect: Boolean read FRowSelect write FRowSelect default False;
|
|
property ToolTips: Boolean read FToolTips write FToolTips default False;
|
|
property AlwaysAcceptOnCloseUp: Boolean read FAlwaysAcceptOnCloseUp write FAlwaysAcceptOnCloseUp default False;
|
|
property OnCustomDraw: TTVCustomDrawEvent read FOnCustomDraw write FOnCustomDraw;
|
|
property OnCustomDrawItem: TTVCustomDrawItemEvent read FOnCustomDrawItem write FOnCustomDrawItem;
|
|
property OnGetImageIndex: TTVExpandedEvent read FOnGetImageIndex write FOnGetImageIndex;
|
|
property OnKeyValueChange;
|
|
property FullExpand: Boolean read FFullExpand write FFullExpand default False;
|
|
end;
|
|
|
|
{###################### Borland ######################}
|
|
|
|
TJvPopupTree = class(TJvDBTreeView)
|
|
private
|
|
procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY;
|
|
protected
|
|
procedure FocusSet(PrevWnd: THandle); override;
|
|
procedure DblClick; override;
|
|
end;
|
|
|
|
TJvTreePopupDataList = class(TJvPopupWindow)
|
|
private
|
|
FTree: TJvPopupTree;
|
|
protected
|
|
function GetValue: Variant; override;
|
|
procedure SetValue(const Value: Variant); override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
|
|
function GetPopupText: string; override;
|
|
end;
|
|
*****************)
|
|
TJvDBLookupTreeView = class(TJvDBLookupControl)
|
|
private
|
|
FTree: TJvDBTreeView;
|
|
FBorderStyle: TBorderStyle;
|
|
InKeyValueChanged: Boolean;
|
|
function GetMasterField: string;
|
|
procedure SetMasterField(Value: string);
|
|
function GetDetailField: string;
|
|
procedure SetDetailField(Value: string);
|
|
function GetStartMasterValue: string;
|
|
procedure SetStartMasterValue(Value: string);
|
|
function GetIconField: string;
|
|
procedure SetIconField(const Value: string);
|
|
procedure KeyValueChanged; override;
|
|
{Tree}
|
|
function GetShowButtons: Boolean;
|
|
function GetShowLines: Boolean;
|
|
function GetShowRoot: Boolean;
|
|
function GetReadOnly: Boolean;
|
|
function GetHideSelection: Boolean;
|
|
function GetIndent: Integer;
|
|
procedure SetShowButtons(Value: Boolean);
|
|
procedure SetShowLines(Value: Boolean);
|
|
procedure SetShowRoot(Value: Boolean);
|
|
procedure SetReadOnly(Value: Boolean);
|
|
procedure SetHideSelection(Value: Boolean);
|
|
procedure SetIndent(Value: Integer);
|
|
function GetRightClickSelect: Boolean;
|
|
procedure SetRightClickSelect(Value: Boolean);
|
|
function GetAutoExpand: Boolean;
|
|
function GetHotTrack: Boolean;
|
|
function GetOnGetImageIndex: TTVExpandedEvent;
|
|
function GetRowSelect: Boolean;
|
|
function GetToolTips: Boolean;
|
|
procedure SetAutoExpand(const Value: Boolean);
|
|
procedure SetHotTrack(const Value: Boolean);
|
|
procedure SetOnGetImageIndex(const Value: TTVExpandedEvent);
|
|
procedure SetRowSelect(const Value: Boolean);
|
|
procedure SetToolTips(const Value: Boolean);
|
|
function GetOnCustomDraw: TTVCustomDrawEvent;
|
|
function GetOnCustomDrawItem: TTVCustomDrawItemEvent;
|
|
procedure SetOnCustomDraw(const Value: TTVCustomDrawEvent);
|
|
procedure SetOnCustomDrawItem(const Value: TTVCustomDrawItemEvent);
|
|
protected
|
|
{
|
|
procedure FocusSet({%H-}PrevWnd: THandle); override;
|
|
}
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
procedure ListLinkActiveChanged; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
published
|
|
property Align;
|
|
property BorderSpacing;
|
|
property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;
|
|
property Color;
|
|
property DataField;
|
|
property DataSource;
|
|
property DragCursor;
|
|
property DragMode;
|
|
property Enabled;
|
|
property Font;
|
|
property KeyField;
|
|
property ListField;
|
|
property ListFieldIndex;
|
|
property ListSource;
|
|
property ParentColor;
|
|
property ParentFont;
|
|
property ParentShowHint;
|
|
property PopupMenu;
|
|
property ShowHint;
|
|
property TabOrder;
|
|
property TabStop;
|
|
property Visible;
|
|
property OnClick;
|
|
property OnDblClick;
|
|
property OnDragDrop;
|
|
property OnDragOver;
|
|
property OnEndDrag;
|
|
property OnEnter;
|
|
property OnExit;
|
|
property OnKeyDown;
|
|
property OnKeyPress;
|
|
property OnKeyUp;
|
|
property OnMouseDown;
|
|
property OnMouseMove;
|
|
property OnMouseUp;
|
|
property OnStartDrag;
|
|
property Anchors;
|
|
property BiDiMode;
|
|
property BorderWidth;
|
|
property Constraints;
|
|
property DragKind;
|
|
property ParentBiDiMode;
|
|
property OnEndDock;
|
|
property OnStartDock;
|
|
|
|
property AutoExpand: Boolean read GetAutoExpand write SetAutoExpand default False;
|
|
property HotTrack: Boolean read GetHotTrack write SetHotTrack default False;
|
|
property RowSelect: Boolean read GetRowSelect write SetRowSelect default False;
|
|
property ToolTips: Boolean read GetToolTips write SetToolTips default True;
|
|
property OnCustomDraw: TTVCustomDrawEvent read GetOnCustomDraw write SetOnCustomDraw;
|
|
property OnCustomDrawItem: TTVCustomDrawItemEvent read GetOnCustomDrawItem write SetOnCustomDrawItem;
|
|
property OnGetImageIndex: TTVExpandedEvent read GetOnGetImageIndex write SetOnGetImageIndex;
|
|
property OnKeyValueChange;
|
|
{Tree}
|
|
property MasterField: string read GetMasterField write SetMasterField;
|
|
property DetailField: string read GetDetailField write SetDetailField;
|
|
property IconField: string read GetIconField write SetIconField;
|
|
property StartMasterValue: string read GetStartMasterValue write SetStartMasterValue;
|
|
property ShowButtons: Boolean read GetShowButtons write SetShowButtons default True;
|
|
property ShowLines: Boolean read GetShowLines write SetShowLines default True;
|
|
property ShowRoot: Boolean read GetShowRoot write SetShowRoot default True;
|
|
property ReadOnly: Boolean read GetReadOnly write SetReadOnly default True;
|
|
property RightClickSelect: Boolean read GetRightClickSelect write SetRightClickSelect default False;
|
|
property HideSelection: Boolean read GetHideSelection write SetHideSelection default False;
|
|
property Indent: Integer read GetIndent write SetIndent {default 19};
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
uses
|
|
Variants,
|
|
Graphics, DBConst,
|
|
JvJclUtils, JvDBConst, JvDBUtils, JvThemes;
|
|
|
|
//=== { TJvLookupDataSourceLink } ============================================
|
|
|
|
procedure TJvLookupDataSourceLink.ActiveChanged;
|
|
begin
|
|
if FDBLookupControl <> nil then
|
|
FDBLookupControl.DataLinkActiveChanged;
|
|
end;
|
|
|
|
procedure TJvLookupDataSourceLink.RecordChanged(Field: TField);
|
|
begin
|
|
if FDBLookupControl <> nil then
|
|
FDBLookupControl.DataLinkRecordChanged(Field);
|
|
end;
|
|
|
|
procedure TJvLookupDataSourceLink.FocusControl(Field: TFieldRef);
|
|
begin
|
|
if (Field^ <> nil) and (Field^ = FDBLookupControl.Field) and
|
|
(FDBLookupControl <> nil) and FDBLookupControl.CanFocus then
|
|
begin
|
|
Field^ := nil;
|
|
FDBLookupControl.SetFocus;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvLookupListSourceLink.ActiveChanged;
|
|
begin
|
|
if FDBLookupControl <> nil then
|
|
FDBLookupControl.ListLinkActiveChanged;
|
|
end;
|
|
|
|
procedure TJvLookupListSourceLink.DataSetChanged;
|
|
begin
|
|
if FDBLookupControl <> nil then
|
|
FDBLookupControl.ListLinkDataChanged;
|
|
end;
|
|
|
|
//=== { TJvDBLookupControl } =================================================
|
|
|
|
function VarEquals(const V1, V2: Variant): Boolean;
|
|
begin
|
|
Result := False;
|
|
try
|
|
Result := V1 = V2;
|
|
except
|
|
end;
|
|
end;
|
|
|
|
constructor TJvDBLookupControl.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
ControlStyle := [csOpaque];
|
|
IncludeThemeStyle(Self, [csNeedsBorderPaint]);
|
|
|
|
ParentColor := False;
|
|
TabStop := True;
|
|
FLookupSource := TDataSource.Create(Self);
|
|
FDataLink := TJvLookupDataSourceLink.Create;
|
|
FDataLink.FDBLookupControl := Self;
|
|
FListLink := TJvLookupListSourceLink.Create;
|
|
FListLink.FDBLookupControl := Self;
|
|
FListFields := TList{$IFDEF RTL240_UP}<TField>{$ENDIF RTL240_UP}.Create;
|
|
FKeyValue := Null;
|
|
FSearchTickCount := 0;
|
|
end;
|
|
|
|
destructor TJvDBLookupControl.Destroy;
|
|
begin
|
|
// Deregister FreeNotifications
|
|
DataSource := nil;
|
|
ListSource := nil;
|
|
|
|
FListFields.Free;
|
|
FListLink.FDBLookupControl := nil;
|
|
FListLink.Free;
|
|
FDataLink.FDBLookupControl := nil;
|
|
FDataLink.Free;
|
|
FDataLink := nil;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TJvDBLookupControl.CanModify: Boolean;
|
|
begin
|
|
Result := FListActive and not ReadOnly and ((FDataLink.DataSource = nil) or
|
|
(FMasterField <> nil) and FMasterField.CanModify);
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.CheckNotCircular;
|
|
begin
|
|
if (FDataLink.Active and FDataLink.DataSet.IsLinkedTo(ListSource)) or
|
|
(FListLink.Active and FListLink.DataSet.IsLinkedTo(DataSource)) then
|
|
DatabaseError(SErrCircularDataSourceReferenceNotAllowed);
|
|
// DatabaseError(SCircularDataLink);
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.CheckNotLookup;
|
|
begin
|
|
if FLookupMode then
|
|
DatabaseError(SPropDefByLookup);
|
|
if FDataLink.DataSourceFixed then
|
|
DatabaseError(SDataSourceFixed);
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.DataLinkActiveChanged;
|
|
begin
|
|
FDataField := nil;
|
|
FMasterField := nil;
|
|
if (csDestroying in ComponentState) then
|
|
exit;
|
|
if FDataLink.Active and (FDataFieldName <> '') then
|
|
begin
|
|
CheckNotCircular;
|
|
FDataField := GetFieldProperty(FDataLink.DataSet, Self, FDataFieldName);
|
|
FMasterField := FDataField;
|
|
end;
|
|
SetLookupMode((FDataField <> nil) and (FDataField.FieldKind = fkLookup));
|
|
DataLinkRecordChanged(nil);
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.DataLinkRecordChanged(Field: TField);
|
|
begin
|
|
if (Field = nil) or (Field = FMasterField) then
|
|
if FMasterField <> nil then
|
|
SetKeyValue(FMasterField.Value)
|
|
else
|
|
SetKeyValue(Null);
|
|
end;
|
|
|
|
function TJvDBLookupControl.GetBorderSize: Integer;
|
|
var
|
|
Params: TCreateParams;
|
|
R: TRect;
|
|
begin
|
|
CreateParams(Params{%H-});
|
|
R := Rect(0, 0, 0, 0);
|
|
AdjustWindowRectEx(R, Params.Style, False, Params.ExStyle);
|
|
Result := R.Bottom - R.Top;
|
|
end;
|
|
|
|
function TJvDBLookupControl.GetDataSource: TDataSource;
|
|
begin
|
|
Result := FDataLink.DataSource;
|
|
end;
|
|
|
|
function TJvDBLookupControl.GetKeyFieldName: string;
|
|
begin
|
|
if FLookupMode then
|
|
Result := ''
|
|
else
|
|
Result := FKeyFieldName;
|
|
end;
|
|
|
|
function TJvDBLookupControl.GetListSource: TDataSource;
|
|
begin
|
|
if FLookupMode then
|
|
Result := nil
|
|
else
|
|
Result := FListLink.DataSource;
|
|
end;
|
|
|
|
function TJvDBLookupControl.GetReadOnly: Boolean;
|
|
begin
|
|
Result := FDataLink.ReadOnly;
|
|
end;
|
|
|
|
function TJvDBLookupControl.GetTextHeight: Integer;
|
|
var
|
|
cnv: TControlCanvas;
|
|
begin
|
|
cnv := TControlCanvas.Create;
|
|
try
|
|
cnv.Control := self;
|
|
cnv.Font := Screen.SystemFont;
|
|
Result := cnv.TextHeight('Tg');
|
|
finally
|
|
cnv.Free;
|
|
end;
|
|
end;
|
|
{
|
|
var
|
|
DC: HDC;
|
|
SaveFont: HFont;
|
|
Metrics: TTextMetric;
|
|
begin
|
|
DC := GetDC(HWND_DESKTOP);
|
|
SaveFont := SelectObject(DC, Font.Handle);
|
|
GetTextMetrics(DC, Metrics);
|
|
SelectObject(DC, SaveFont);
|
|
ReleaseDC(HWND_DESKTOP, DC);
|
|
Result := Metrics.tmHeight;
|
|
end;
|
|
}
|
|
|
|
procedure TJvDBLookupControl.KeyValueChanged;
|
|
begin
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.ListLinkActiveChanged;
|
|
var
|
|
DataSet: TDataSet;
|
|
ResultField: TField;
|
|
begin
|
|
FListActive := False;
|
|
FKeyField := nil;
|
|
FListField := nil;
|
|
FListFields.Clear;
|
|
if FListLink.Active and (FKeyFieldName <> '') then
|
|
begin
|
|
CheckNotCircular;
|
|
DataSet := FListLink.DataSet;
|
|
FKeyField := GetFieldProperty(DataSet, Self, FKeyFieldName);
|
|
try
|
|
DataSet.GetFieldList(FListFields, FListFieldName);
|
|
except
|
|
DatabaseErrorFmt(SFieldNotFound, [Self.Name, FListFieldName]);
|
|
end;
|
|
if FLookupMode then
|
|
begin
|
|
ResultField := GetFieldProperty(DataSet, Self, FDataField.LookupResultField);
|
|
if FListFields.IndexOf(ResultField) < 0 then
|
|
FListFields.Insert(0, ResultField);
|
|
FListField := ResultField;
|
|
end
|
|
else
|
|
begin
|
|
if FListFields.Count = 0 then
|
|
FListFields.Add(FKeyField);
|
|
if (FListFieldIndex >= 0) and (FListFieldIndex < FListFields.Count) then
|
|
FListField := TField(FListFields[FListFieldIndex])
|
|
else
|
|
FListField := TField(FListFields[0]);
|
|
end;
|
|
FListActive := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.ListLinkDataChanged;
|
|
begin
|
|
end;
|
|
|
|
function TJvDBLookupControl.LocateKey: Boolean;
|
|
begin
|
|
Result := False;
|
|
try
|
|
if not VarIsNullEmpty(FKeyValue) and
|
|
FListLink.DataSet.Locate(FKeyFieldName, FKeyValue, []) then
|
|
Result := True;
|
|
except
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.Notification(AComponent: TComponent;
|
|
Operation: TOperation);
|
|
begin
|
|
inherited Notification(AComponent, Operation);
|
|
if (Operation = opRemove) and not (csDestroying in ComponentState) then
|
|
begin
|
|
if (FDataLink <> nil) and (AComponent = DataSource) then
|
|
DataSource := nil;
|
|
if (FListLink <> nil) and (AComponent = ListSource) then
|
|
ListSource := nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.ProcessSearchKey(Key: Char);
|
|
var
|
|
TickCount: Integer;
|
|
S: string;
|
|
begin
|
|
if (FListField <> nil) and (FListField.FieldKind = fkData) and (FListField is TStringField) then
|
|
case Ord(Key) of
|
|
VK_BACK, VK_ESCAPE:
|
|
FSearchText := '';
|
|
VK_SPACE..Ord(High(Char)):
|
|
if CanModify then
|
|
begin
|
|
TickCount := GetTickCount;
|
|
if TickCount - FSearchTickCount > 2000 then
|
|
FSearchText := '';
|
|
FSearchTickCount := TickCount;
|
|
if Length(FSearchText) < 32 then
|
|
begin
|
|
S := FSearchText + Key;
|
|
if FListLink.DataSet.Locate(FListField.FieldName, S, [loCaseInsensitive, loPartialKey]) then
|
|
begin
|
|
SelectKeyValue(FKeyField.Value);
|
|
FSearchText := S;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.SelectKeyValue(const Value: Variant);
|
|
begin
|
|
if FMasterField <> nil then
|
|
begin
|
|
if FDataLink.Edit then
|
|
FMasterField.Value := Value;
|
|
end
|
|
else
|
|
SetKeyValue(Value);
|
|
Repaint;
|
|
Click;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.SetDataFieldName(const Value: string);
|
|
begin
|
|
if FDataFieldName <> Value then
|
|
begin
|
|
FDataFieldName := Value;
|
|
DataLinkActiveChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.SetDataSource(Value: TDataSource);
|
|
begin
|
|
if FDataLink.DataSource <> nil then
|
|
FDataLink.DataSource.RemoveFreeNotification(Self);
|
|
FDataLink.DataSource := Value;
|
|
if Value <> nil then
|
|
Value.FreeNotification(Self);
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.SetKeyFieldName(const Value: string);
|
|
begin
|
|
CheckNotLookup;
|
|
if FKeyFieldName <> Value then
|
|
begin
|
|
FKeyFieldName := Value;
|
|
ListLinkActiveChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.SetKeyValue(const Value: Variant);
|
|
begin
|
|
if not VarEquals(FKeyValue, Value) then
|
|
begin
|
|
FKeyValue := Value;
|
|
KeyValueChanged;
|
|
if Assigned(FOnKeyValueChange) then
|
|
FOnKeyValueChange(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.SetListFieldName(const Value: string);
|
|
begin
|
|
if FListFieldName <> Value then
|
|
begin
|
|
FListFieldName := Value;
|
|
ListLinkActiveChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.SetListSource(Value: TDataSource);
|
|
begin
|
|
CheckNotLookup;
|
|
if FListLink.DataSource <> nil then
|
|
FListLink.DataSource.RemoveFreeNotification(Self);
|
|
FListLink.DataSource := Value;
|
|
if Value <> nil then
|
|
Value.FreeNotification(Self);
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.SetLookupMode(Value: Boolean);
|
|
begin
|
|
if FLookupMode <> Value then
|
|
if Value then
|
|
begin
|
|
FMasterField := GetFieldProperty(FDataField.DataSet, Self, FDataField.KeyFields);
|
|
FLookupSource.DataSet := FDataField.LookupDataSet;
|
|
FKeyFieldName := FDataField.LookupKeyFields;
|
|
FLookupMode := True;
|
|
FListLink.DataSource := FLookupSource;
|
|
end
|
|
else
|
|
begin
|
|
FListLink.DataSource := nil;
|
|
FLookupMode := False;
|
|
FKeyFieldName := '';
|
|
FLookupSource.DataSet := nil;
|
|
FMasterField := FDataField;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.SetReadOnly(Value: Boolean);
|
|
begin
|
|
FDataLink.ReadOnly := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.GetDlgCode(var Code: TDlgCodes);
|
|
begin
|
|
Code := [dcWantArrows, dcWantChars];
|
|
end;
|
|
|
|
{
|
|
procedure TJvDBLookupControl.FocusKilled(NextWnd: THandle);
|
|
begin
|
|
FFocused := False;
|
|
inherited FocusKilled(NextWnd);
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TJvDBLookupControl.FocusSet(PrevWnd: THandle);
|
|
begin
|
|
FFocused := True;
|
|
inherited FocusSet(PrevWnd);
|
|
Invalidate;
|
|
end;
|
|
}
|
|
procedure TJvDBLookupControl.CMGetDataLink(var Msg: TLMessage);
|
|
begin
|
|
Msg.Result := LRESULT(FDataLink);
|
|
end;
|
|
|
|
|
|
(******************************** NOT CONVERTED ***
|
|
|
|
//=== { TJvDBLookupTreeViewCombo } ===========================================
|
|
|
|
constructor TJvDBLookupTreeViewCombo.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
ControlStyle := ControlStyle + [csReplicatable];
|
|
Width := 145;
|
|
Height := 0;
|
|
FDataList := TJvTreePopupDataList.Create(Self);
|
|
// FDataList.Visible := False;
|
|
// FDataList.Parent := Self;
|
|
FButtonWidth := GetSystemMetrics(SM_CXVSCROLL);
|
|
FDropDownHeight := 100;
|
|
FFullExpand := False;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited CreateParams(Params);
|
|
with Params do
|
|
if Ctl3D then
|
|
ExStyle := ExStyle or WS_EX_CLIENTEDGE
|
|
else
|
|
Style := Style or WS_BORDER;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.Paint;
|
|
var
|
|
W, X, Flags: Integer;
|
|
Text: string;
|
|
Alignment: TAlignment;
|
|
Selected: Boolean;
|
|
R: TRect;
|
|
|
|
{added by zelen}
|
|
{$IFDEF JVCLThemesEnabled}
|
|
State: TThemedComboBox;
|
|
Details: TThemedElementDetails;
|
|
{$ENDIF JVCLThemesEnabled}
|
|
{/added by zelen}
|
|
|
|
begin
|
|
Canvas.Font := Font;
|
|
Canvas.Brush.Color := Color;
|
|
Selected := FFocused and not FListVisible and not (csPaintCopy in ControlState);
|
|
|
|
if Selected then
|
|
begin
|
|
Canvas.Font.Color := clHighlightText;
|
|
Canvas.Brush.Color := clHighlight;
|
|
end
|
|
{added by zelen}
|
|
else
|
|
if not Enabled then
|
|
Canvas.Font.Color := clGrayText;
|
|
{/added by zelen}
|
|
if (csPaintCopy in ControlState) and (FDataField <> nil) then
|
|
begin
|
|
Text := FDataField.DisplayText;
|
|
Alignment := FDataField.Alignment;
|
|
end
|
|
else
|
|
begin
|
|
Text := FText;
|
|
Alignment := FAlignment;
|
|
end;
|
|
W := ClientWidth - FButtonWidth;
|
|
X := 2;
|
|
case Alignment of
|
|
taRightJustify: X := W - Canvas.TextWidth(Text) - 3;
|
|
taCenter: X := (W - Canvas.TextWidth(Text)) div 2;
|
|
end;
|
|
|
|
// Fill the background (Mantis 2723)
|
|
SetRect(R, 0, 0, W, ClientHeight);
|
|
Canvas.FillRect(R);
|
|
|
|
SetRect(R, 1, 1, W - 1, ClientHeight - 1);
|
|
Canvas.TextRect(R, X, 2, Text);
|
|
if Selected then
|
|
Canvas.DrawFocusRect(R);
|
|
|
|
SetRect(R, W, 0, ClientWidth, ClientHeight);
|
|
{added by zelen}
|
|
{$IFDEF JVCLThemesEnabled}
|
|
if StyleServices.Enabled then
|
|
begin
|
|
if (not FListActive) or (not Enabled) or ReadOnly then
|
|
State := tcDropDownButtonDisabled
|
|
else
|
|
if FPressed then
|
|
State := tcDropDownButtonPressed
|
|
else
|
|
if MouseOver and not FListVisible then
|
|
State := tcDropDownButtonHot
|
|
else
|
|
State := tcDropDownButtonNormal;
|
|
Details := StyleServices.GetElementDetails(State);
|
|
StyleServices.DrawElement(Canvas.Handle, Details, R);
|
|
|
|
|
|
|
|
|
|
end
|
|
else
|
|
{$ENDIF JVCLThemesEnabled}
|
|
{/added by zelen}
|
|
begin
|
|
if not FListActive or not Enabled or ReadOnly then
|
|
Flags := DFCS_SCROLLCOMBOBOX or DFCS_INACTIVE
|
|
else
|
|
if FPressed then
|
|
Flags := DFCS_SCROLLCOMBOBOX or DFCS_FLAT or DFCS_PUSHED
|
|
else
|
|
Flags := DFCS_SCROLLCOMBOBOX;
|
|
DrawFrameControl(Canvas.Handle, R, DFC_SCROLL, Flags);
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
|
|
begin
|
|
inherited SetBounds(ALeft, ATop, AWidth, GetTextHeight + GetBorderSize + 4);
|
|
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.KeyValueChanged;
|
|
begin
|
|
if FLookupMode then
|
|
begin
|
|
FText := FDataField.DisplayText;
|
|
FAlignment := FDataField.Alignment;
|
|
end
|
|
else
|
|
if FListActive and LocateKey then
|
|
begin
|
|
FText := FListField.DisplayText;
|
|
FAlignment := FListField.Alignment;
|
|
end
|
|
else
|
|
begin
|
|
FText := '';
|
|
FAlignment := taLeftJustify;
|
|
end;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.ListLinkActiveChanged;
|
|
begin
|
|
inherited ListLinkActiveChanged;
|
|
KeyValueChanged;
|
|
end;
|
|
|
|
function TJvDBLookupTreeViewCombo.CanFocusEx: Boolean;
|
|
var
|
|
P: TWinControl;
|
|
begin
|
|
P := Parent;
|
|
Result := Visible and Enabled;
|
|
while Result and (P <> nil) do
|
|
begin
|
|
Result := P.Visible and P.Enabled;
|
|
P := P.Parent;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.CloseUp(Accept: Boolean);
|
|
var
|
|
ListValue: Variant;
|
|
begin
|
|
if FListVisible then
|
|
begin
|
|
if GetCapture <> 0 then
|
|
SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
|
|
ListValue := FDataList.GetValue;
|
|
if CanFocusEx then
|
|
SetFocus;
|
|
FDataList.Hide;
|
|
{ SetWindowPos(FDataList.Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or
|
|
SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW); }
|
|
FListVisible := False;
|
|
// FDataList.ListSource := nil;
|
|
FDataList.FTree.DataSource := nil;
|
|
Invalidate;
|
|
FSearchText := '';
|
|
if Accept and CanModify then
|
|
SelectKeyValue(ListValue);
|
|
if Assigned(FOnCloseUp) then
|
|
FOnCloseUp(Self);
|
|
FPressed := False;
|
|
Repaint;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.DropDown;
|
|
var
|
|
P: TPoint;
|
|
{I,}Y: Integer;
|
|
{S: string;}
|
|
OldLong: Longword;
|
|
begin
|
|
if not FListVisible and FListActive then
|
|
begin
|
|
if Assigned(FOnDropDown) then
|
|
FOnDropDown(Self);
|
|
FDataList.Color := Color;
|
|
FDataList.Font := Font;
|
|
if FDropDownWidth > 0 then
|
|
FDataList.Width := FDropDownWidth
|
|
else
|
|
FDataList.Width := Width;
|
|
FDataList.Height := FDropDownHeight;
|
|
// FDataList.RowCount := FDropDownRows;
|
|
// FDataList.KeyField := FKeyFieldName;
|
|
FDataList.FTree.MasterField := FKeyFieldName;
|
|
FDataList.FTree.DetailField := FDetailField;
|
|
FDataList.FTree.IconField := FIconField;
|
|
FDataList.FTree.MasterField := FMasterField;
|
|
FDataList.FTree.StartMasterValue := FStartMasterValue;
|
|
FDataList.FTree.UseFilter := FUseFilter;
|
|
|
|
{Source added by Oussama Al-Rifai}
|
|
OldLong := GetWindowLong(FDataList.FTree.Handle, GWL_EXSTYLE);
|
|
if BiDiMode <> bdLeftToRight then
|
|
begin
|
|
FDataList.FTree.BiDiMode := bdLeftToRight;
|
|
SetWindowLong(FDataList.FTree.Handle, GWL_EXSTYLE, OldLong or $00400000);
|
|
end
|
|
else
|
|
SetWindowLong(FDataList.FTree.Handle, GWL_EXSTYLE, OldLong and not $00400000);
|
|
{End of source added by Oussama Al-Rifai}
|
|
|
|
FDataList.FTree.AutoExpand := FAutoExpand;
|
|
FDataList.FTree.ChangeDelay := FChangeDelay;
|
|
FDataList.FTree.HotTrack := FHotTrack;
|
|
FDataList.FTree.RowSelect := FRowSelect;
|
|
FDataList.FTree.ToolTips := FToolTips;
|
|
FDataList.FTree.OnCustomDraw := FOnCustomDraw;
|
|
FDataList.FTree.OnCustomDrawItem := FOnCustomDrawItem;
|
|
FDataList.FTree.OnGetImageIndex := FOnGetImageIndex;
|
|
FDataList.FTree.ReadOnly := not FDataLink.ReadOnly;
|
|
|
|
{ for I := 0 to FListFields.Count - 1 do
|
|
S := S + TField(FListFields[I]).FieldName + ';';
|
|
FDataList.ListField := S;}
|
|
FDataList.FTree.ItemField := ListField;
|
|
|
|
// FDataList.ListFieldIndex := FListFields.IndexOf(FListField);
|
|
// FDataList.ListSource := FListLink.DataSource;
|
|
FDataList.FTree.DataSource := FListLink.DataSource;
|
|
{ FDataList.FTree.FullExpand;
|
|
FDataList.FTree.FullCollapse;
|
|
FDataList.FTree.DataChanged; }
|
|
FDataList.SetValue(FListLink.DataSet.Lookup(FKeyFieldName, FKeyValue, FMasterField));
|
|
|
|
// FDataList.KeyValue := KeyValue;
|
|
|
|
P := Parent.ClientToScreen(Point(Left, Top));
|
|
Y := P.Y + Height;
|
|
if Y + FDataList.Height > Screen.Height then
|
|
Y := P.Y - FDataList.Height;
|
|
case FDropDownAlign of
|
|
daRight: Dec(P.X, FDataList.Width - Width);
|
|
daCenter: Dec(P.X, (FDataList.Width - Width) div 2);
|
|
end;
|
|
// FDataList.Left := P.X;
|
|
// FDataList.Top := P.Y;
|
|
P.Y := Y;
|
|
FListVisible := True;
|
|
FDataList.Show(P);
|
|
// FDataList.Visible := True;
|
|
// SetWindowPos(FDataList.Handle, HWND_TOP, P.X, Y, 0, 0,
|
|
// SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
|
|
|
|
if FullExpand then
|
|
FDataList.FTree.FullExpand;
|
|
|
|
Repaint;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.KeyDown(var Key: Word; Shift: TShiftState);
|
|
var
|
|
Delta: Integer;
|
|
begin
|
|
inherited KeyDown(Key, Shift);
|
|
if FListActive and ((Key = VK_UP) or (Key = VK_DOWN)) then
|
|
if ssAlt in Shift then
|
|
begin
|
|
if FListVisible then
|
|
CloseUp(True)
|
|
else
|
|
DropDown;
|
|
Key := 0;
|
|
end
|
|
else
|
|
if not FListVisible then
|
|
begin
|
|
if not LocateKey then
|
|
FListLink.DataSet.First
|
|
else
|
|
begin
|
|
if Key = VK_UP then
|
|
Delta := -1
|
|
else
|
|
Delta := 1;
|
|
FListLink.DataSet.MoveBy(Delta);
|
|
end;
|
|
SelectKeyValue(FKeyField.Value);
|
|
Key := 0;
|
|
end;
|
|
if (Key <> 0) and FListVisible then
|
|
// FDataList.KeyDown(Key, Shift);
|
|
SendMessage(FDataList.FTree.Handle, WM_KEYDOWN, Key, 0);
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.KeyPress(var Key: Char);
|
|
begin
|
|
inherited KeyPress(Key);
|
|
if FListVisible then
|
|
if Word(Key) in [VK_RETURN, VK_ESCAPE] then
|
|
CloseUp(Word(Key) = VK_RETURN)
|
|
else
|
|
FDataList.KeyPress(Key)
|
|
else
|
|
ProcessSearchKey(Key);
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.MouseDown(Button: TMouseButton; Shift: TShiftState;
|
|
X, Y: Integer);
|
|
begin
|
|
if Button = mbLeft then
|
|
begin
|
|
SetFocus;
|
|
if not FFocused then
|
|
Exit;
|
|
if FListVisible then
|
|
CloseUp(AlwaysAcceptOnCloseUp)
|
|
else
|
|
if FListActive then
|
|
begin
|
|
MouseCapture := True;
|
|
FTracking := True;
|
|
TrackButton(X, Y);
|
|
DropDown;
|
|
end;
|
|
end;
|
|
inherited MouseDown(Button, Shift, X, Y);
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.MouseMove(Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
ListPos: TPoint;
|
|
MousePos: TSmallPoint;
|
|
begin
|
|
if FTracking then
|
|
begin
|
|
TrackButton(X, Y);
|
|
if FListVisible then
|
|
begin
|
|
ListPos := FDataList.ScreenToClient(ClientToScreen(Point(X, Y)));
|
|
if PtInRect(FDataList.ClientRect, ListPos) then
|
|
begin
|
|
StopTracking;
|
|
MousePos.X := ListPos.X;
|
|
MousePos.Y := ListPos.Y;
|
|
SendMessage(FDataList.FTree.Handle, WM_LBUTTONDOWN, 0, {$IFDEF RTL230_UP}PointToLParam{$ELSE}LPARAM{$ENDIF RTL230_UP}(MousePos));
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
inherited MouseMove(Shift, X, Y);
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.MouseUp(Button: TMouseButton; Shift: TShiftState;
|
|
X, Y: Integer);
|
|
begin
|
|
StopTracking;
|
|
inherited MouseUp(Button, Shift, X, Y);
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.StopTracking;
|
|
begin
|
|
if FTracking then
|
|
begin
|
|
TrackButton(-1, -1);
|
|
FTracking := False;
|
|
MouseCapture := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.TrackButton(X, Y: Integer);
|
|
var
|
|
NewState: Boolean;
|
|
begin
|
|
Repaint;
|
|
NewState := PtInRect(Rect(ClientWidth - FButtonWidth, 0, ClientWidth,
|
|
ClientHeight), Point(X, Y));
|
|
if FPressed <> NewState then
|
|
begin
|
|
FPressed := NewState;
|
|
Repaint;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.CMCtl3DChanged(var Msg: TMessage);
|
|
begin
|
|
RecreateWnd;
|
|
Height := 0;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.FontChanged;
|
|
begin
|
|
inherited FontChanged;
|
|
Height := 0;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.CMGetDataLink(var Msg: TMessage);
|
|
begin
|
|
Msg.Result := LRESULT(FDataLink);
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.WMCancelMode(var Msg: TMessage);
|
|
begin
|
|
StopTracking;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.CMCancelMode(var Msg: TCMCancelMode);
|
|
begin
|
|
if (Msg.Sender <> Self) and (Msg.Sender <> FDataList) and
|
|
((FDataList <> nil) and
|
|
not FDataList.ContainsControl(Msg.Sender)) then
|
|
PopupCloseUp(FDataList, AlwaysAcceptOnCloseUp);
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.FocusKilled(NextWnd: THandle);
|
|
begin
|
|
if (Handle <> NextWnd) and (FDataList.Handle <> NextWnd) and
|
|
(FDataList.FTree.Handle <> NextWnd) then
|
|
CloseUp(AlwaysAcceptOnCloseUp);
|
|
|
|
inherited FocusKilled(NextWnd);
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.PopupCloseUp(Sender: TObject; Accept: Boolean);
|
|
var
|
|
AValue: Variant;
|
|
begin
|
|
if (FDataList <> nil) and FListVisible then
|
|
begin
|
|
if Accept then
|
|
CloseUp(True)
|
|
else
|
|
begin
|
|
if GetCapture <> 0 then
|
|
SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
|
|
AValue := FDataList.GetValue;
|
|
FDataList.Hide;
|
|
try
|
|
try
|
|
if CanFocus then
|
|
SetFocus;
|
|
except
|
|
{ ignore exceptions }
|
|
end;
|
|
// SetDirectInput(DirectInput);
|
|
Invalidate;
|
|
finally
|
|
FListVisible := False;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{added by zelen}
|
|
{$IFDEF JVCLThemesEnabled}
|
|
procedure TJvDBLookupTreeViewCombo.MouseEnter(Control: TControl);
|
|
begin
|
|
if csDesigning in ComponentState then
|
|
Exit;
|
|
inherited MouseEnter(Control);
|
|
{Windows XP themes use hot track states, hence we have to update the drop down button.}
|
|
if StyleServices.Enabled and not MouseOver and not (csDesigning in ComponentState) then
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewCombo.MouseLeave(Control: TControl);
|
|
begin
|
|
if csDesigning in ComponentState then
|
|
Exit;
|
|
if StyleServices.Enabled and MouseOver then
|
|
Invalidate;
|
|
inherited MouseLeave(Control);
|
|
end;
|
|
{$ENDIF JVCLThemesEnabled}
|
|
{/added by zelen}
|
|
|
|
//=== { TJvTreePopupDataList } ===============================================
|
|
|
|
constructor TJvTreePopupDataList.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
// ControlStyle := ControlStyle + [csNoDesignVisible, csReplicatable];
|
|
// TabStop := False;
|
|
FTree := TJvPopupTree.Create(Self);
|
|
FTree.Parent := Self;
|
|
FTree.Align := alClient;
|
|
FTree.ReadOnly := True;
|
|
FTree.BorderStyle := bsNone;
|
|
FTree.HideSelection := False;
|
|
FTree.TabStop := False;
|
|
end;
|
|
|
|
destructor TJvTreePopupDataList.Destroy;
|
|
begin
|
|
FTree.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TJvTreePopupDataList.GetPopupText: string;
|
|
begin
|
|
Result := GetValue;
|
|
end;
|
|
|
|
function TJvTreePopupDataList.GetValue: Variant;
|
|
begin
|
|
if FTree.Selected <> nil then
|
|
// Result := (FTree.Selected as TJvDBTreeNode).MasterValue
|
|
Result := FTree.DataSource.DataSet.Lookup(FTree.MasterField,
|
|
(FTree.Selected as TJvDBTreeNode).MasterValue, (Owner as TJvDBLookupControl).KeyField)
|
|
else
|
|
Result := Null;
|
|
end;
|
|
|
|
procedure TJvTreePopupDataList.SetValue(const Value: Variant);
|
|
begin
|
|
FTree.SelectNode(Value);
|
|
end;
|
|
|
|
//=== { TJvPopupTree } =======================================================
|
|
|
|
// Jean-Luc Mattei
|
|
// jlucm dott club-internet att fr
|
|
const
|
|
NM_CUSTOMDRAW = (NM_FIRST - 12);
|
|
CDDS_PREPAINT = $000000001;
|
|
CDRF_NOTIFYITEMDRAW = $00000020;
|
|
CDDS_ITEM = $000010000;
|
|
CDDS_ITEMPREPAINT = (CDDS_ITEM or CDDS_PREPAINT);
|
|
CDIS_SELECTED = $0001;
|
|
|
|
type
|
|
PNMCustomDrawInfo = ^TNMCustomDrawInfo;
|
|
TNMCustomDrawInfo = record
|
|
hdr: TNMHdr;
|
|
dwDrawStage: DWORD;
|
|
hdc: HDC;
|
|
rc: TRect;
|
|
dwItemSpec: {$IFDEF RTL230_UP}DWORD_PTR{$ELSE}Longint{$ENDIF TRL230_UP}; // this is control specific, but it's how to specify an item. valid only with CDDS_ITEM bit set
|
|
uItemState: UINT;
|
|
lItemlParam: LPARAM;
|
|
end;
|
|
|
|
procedure TJvPopupTree.CNNotify(var Msg: TWMNotify);
|
|
begin
|
|
with Msg.NMHdr^ do
|
|
case code of
|
|
NM_CUSTOMDRAW:
|
|
begin
|
|
with PNMCustomDrawInfo(Pointer(Msg.NMHdr))^ do
|
|
begin
|
|
if (dwDrawStage and CDDS_PREPAINT) = CDDS_PREPAINT then
|
|
Msg.Result := CDRF_NOTIFYITEMDRAW;
|
|
if (dwDrawStage and CDDS_ITEMPREPAINT) = CDDS_ITEMPREPAINT then
|
|
begin
|
|
if (uItemState and CDIS_SELECTED) <> 0 then
|
|
begin
|
|
SetTextColor(hdc, ColorToRGB(clHighlightText));
|
|
SetBkColor(hdc, ColorToRGB(clHighlight));
|
|
end;
|
|
Msg.Result := CDRF_NOTIFYITEMDRAW;
|
|
end;
|
|
end;
|
|
end;
|
|
else
|
|
inherited;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvPopupTree.FocusSet(PrevWnd: THandle);
|
|
begin
|
|
inherited FocusSet(PrevWnd);
|
|
(Owner.Owner as TJvDBLookupTreeViewCombo).SetFocus;
|
|
end;
|
|
|
|
procedure TJvPopupTree.DblClick;
|
|
begin
|
|
(Owner.Owner as TJvDBLookupTreeViewCombo).CloseUp(True);
|
|
end;
|
|
|
|
***********************)
|
|
|
|
//=== { TJvDBLookupTreeView } ================================================
|
|
|
|
type
|
|
TJvDBLookupTreeViewTree = class(TJvDBTreeView)
|
|
protected
|
|
procedure DataScrolled; override;
|
|
procedure DataChanged; override;
|
|
procedure Change2(Node: TTreeNode); override;
|
|
public
|
|
procedure DefaultHandler(var Message); override;
|
|
end;
|
|
|
|
constructor TJvDBLookupTreeView.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FBorderStyle := bsSingle;
|
|
FTree := TJvDBLookupTreeViewTree.Create(Self);
|
|
FTree.Parent := Self;
|
|
Width := FTree.Width;
|
|
Height := FTree.Height;
|
|
FTree.Align := alClient;
|
|
FTree.ReadOnly := True;
|
|
FTree.BorderStyle := bsNone;
|
|
FTree.HideSelection := False;
|
|
// FTree.TabStop := False;
|
|
end;
|
|
|
|
destructor TJvDBLookupTreeView.Destroy;
|
|
begin
|
|
FTree.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.CreateParams(var Params: TCreateParams);
|
|
begin
|
|
inherited CreateParams(Params);
|
|
with Params do
|
|
if FBorderStyle = bsSingle then
|
|
Style := Style or WS_BORDER;
|
|
end;
|
|
|
|
(**** not converted, probably not needed
|
|
procedure TJvDBLookupTreeView.SetBorderStyle(Value: TBorderStyle);
|
|
begin
|
|
if FBorderStyle <> Value then
|
|
begin
|
|
FBorderStyle := Value;
|
|
Invalidate
|
|
RecreateWnd;
|
|
end;
|
|
end;
|
|
****)
|
|
|
|
function TJvDBLookupTreeView.GetMasterField: string;
|
|
begin
|
|
Result := FTree.MasterField;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetMasterField(Value: string);
|
|
begin
|
|
FTree.MasterField := Value;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetDetailField: string;
|
|
begin
|
|
Result := FTree.DetailField;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetDetailField(Value: string);
|
|
begin
|
|
FTree.DetailField := Value;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetIconField: string;
|
|
begin
|
|
Result := FTree.IconField;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetIconField(const Value: string);
|
|
begin
|
|
FTree.IconField := Value;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetStartMasterValue: string;
|
|
begin
|
|
Result := FTree.StartMasterValue;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetStartMasterValue(Value: string);
|
|
begin
|
|
FTree.StartMasterValue := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.ListLinkActiveChanged;
|
|
begin
|
|
inherited ListLinkActiveChanged;
|
|
FTree.DataSource := ListSource;
|
|
FTree.ItemField := ListField;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.KeyValueChanged;
|
|
begin
|
|
InKeyValueChanged := True;
|
|
try
|
|
TJvDBLookupTreeViewTree(FTree).SelectNode(FKeyValue);
|
|
finally
|
|
InKeyValueChanged := False;
|
|
end;
|
|
end;
|
|
|
|
{
|
|
procedure TJvDBLookupTreeView.FocusSet(PrevWnd: THandle);
|
|
begin
|
|
FTree.SetFocus;
|
|
end;
|
|
}
|
|
|
|
function TJvDBLookupTreeView.GetShowButtons: Boolean;
|
|
begin
|
|
Result := FTree.ShowButtons;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetShowLines: Boolean;
|
|
begin
|
|
Result := FTree.ShowLines;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetShowRoot: Boolean;
|
|
begin
|
|
Result := FTree.ShowRoot;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetReadOnly: Boolean;
|
|
begin
|
|
Result := FTree.ReadOnly;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetRightClickSelect: Boolean;
|
|
begin
|
|
Result := FTree.RightClickSelect;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetHideSelection: Boolean;
|
|
begin
|
|
Result := FTree.HideSelection;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetIndent: Integer;
|
|
begin
|
|
Result := FTree.Indent;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetShowButtons(Value: Boolean);
|
|
begin
|
|
FTree.ShowButtons := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetShowLines(Value: Boolean);
|
|
begin
|
|
FTree.ShowLines := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetShowRoot(Value: Boolean);
|
|
begin
|
|
FTree.ShowRoot := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetReadOnly(Value: Boolean);
|
|
begin
|
|
FTree.ReadOnly := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetRightClickSelect(Value: Boolean);
|
|
begin
|
|
FTree.RightClickSelect := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetHideSelection(Value: Boolean);
|
|
begin
|
|
FTree.HideSelection := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetIndent(Value: Integer);
|
|
begin
|
|
FTree.Indent := Value;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetAutoExpand: Boolean;
|
|
begin
|
|
Result := FTree.AutoExpand;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetHotTrack: Boolean;
|
|
begin
|
|
Result := FTree.HotTrack;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetOnCustomDraw: TTVCustomDrawEvent;
|
|
begin
|
|
Result := FTree.OnCustomDraw;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetOnCustomDrawItem: TTVCustomDrawItemEvent;
|
|
begin
|
|
Result := FTree.OnCustomDrawItem;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetOnGetImageIndex: TTVExpandedEvent;
|
|
begin
|
|
Result := FTree.OnGetImageIndex;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetRowSelect: Boolean;
|
|
begin
|
|
Result := FTree.RowSelect;
|
|
end;
|
|
|
|
function TJvDBLookupTreeView.GetToolTips: Boolean;
|
|
begin
|
|
Result := FTree.ToolTips;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetAutoExpand(const Value: Boolean);
|
|
begin
|
|
FTree.AutoExpand := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetHotTrack(const Value: Boolean);
|
|
begin
|
|
FTree.HotTrack := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetOnCustomDraw(const Value: TTVCustomDrawEvent);
|
|
begin
|
|
FTree.OnCustomDraw := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetOnCustomDrawItem(const Value: TTVCustomDrawItemEvent);
|
|
begin
|
|
FTree.OnCustomDrawItem := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetOnGetImageIndex(const Value: TTVExpandedEvent);
|
|
begin
|
|
FTree.OnGetImageIndex := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetRowSelect(const Value: Boolean);
|
|
begin
|
|
FTree.RowSelect := Value;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeView.SetToolTips(const Value: Boolean);
|
|
begin
|
|
FTree.ToolTips := Value;
|
|
end;
|
|
|
|
{# Translate properties }
|
|
|
|
//=== { TJvDBLookupTreeViewTree } ============================================
|
|
|
|
procedure TJvDBLookupTreeViewTree.DataScrolled;
|
|
begin
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewTree.DataChanged;
|
|
begin
|
|
inherited DataChanged;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewTree.Change2(Node: TTreeNode);
|
|
begin
|
|
with Owner as TJvDBLookupTreeView do
|
|
if not InKeyValueChanged then
|
|
begin
|
|
FListLink.DataSet.Locate(MasterField, (Node as TJvDBTreeNode).MasterValue, []);
|
|
SelectKeyValue(FKeyField.Value);
|
|
KeyValueChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvDBLookupTreeViewTree.DefaultHandler(var Message);
|
|
begin
|
|
inherited DefaultHandler(Message);
|
|
with TLMessage(Message) do
|
|
case Msg of
|
|
LM_KEYDOWN, LM_KEYUP, LM_CHAR, LM_LBUTTONDOWN, LM_LBUTTONUP,
|
|
LM_RBUTTONDOWN, LM_RBUTTONUP, LM_MBUTTONDOWN, LM_MBUTTONUP,
|
|
LM_MOUSEMOVE:
|
|
PostMessage((Owner as TWinControl).Handle, Msg, WParam, LParam);
|
|
end;
|
|
end;
|
|
|
|
|
|
end.
|