62
62
procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
63
63
procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
65
procedure CheckButtonVisible;
66
function CalcButtonVisible: boolean; virtual;
67
function CalcButtonEnabled: Boolean; virtual;
65
68
function GetReadOnly: Boolean; override;
66
69
function GetDefaultGlyph: TBitmap; virtual;
67
70
function GetDefaultGlyphName: String; virtual;
147
152
property Visible;
155
// Called when an item is filtered. Returns true if the item passes the filter.
156
// Done=False means the data should also be filtered by its title string.
157
// Done=True means no other filtering is needed.
158
TFilterItemEvent = function (Item: TObject; out Done: Boolean): Boolean of object;
160
// Can be used only for items that have a checkbox. Returns true if checked.
161
TCheckItemEvent = function (Item: TObject): Boolean of object;
163
{ TCustomControlFilterEdit }
165
// An abstract base class for edit controls which filter data in
166
// visual controls like TListView and TTreeView.
167
TCustomControlFilterEdit = class(TCustomEditButton)
170
fIdleConnected: Boolean;
171
fSortData: Boolean; // Data needs to be sorted.
172
procedure SetFilter(const AValue: string);
173
procedure SetIdleConnected(const AValue: Boolean);
174
procedure OnIdle(Sender: TObject; var Done: Boolean);
176
fNeedUpdate: Boolean;
177
fIsFirstUpdate: Boolean;
178
fSelectedPart: TObject; // Select this node on next update
179
fOnFilterItem: TFilterItemEvent;
180
fOnCheckItem: TCheckItemEvent;
181
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
182
procedure Change; override;
183
procedure DoEnter; override;
184
procedure DoExit; override;
185
procedure DoButtonClick (Sender: TObject); override;
186
procedure SortAndFilter; virtual; abstract;
187
procedure ApplyFilter(Immediately: Boolean = False);
188
procedure ApplyFilterCore; virtual; abstract;
189
procedure MoveNext; virtual; abstract;
190
procedure MovePrev; virtual; abstract;
191
function ReturnPressed: Boolean; virtual; abstract;
192
function GetDefaultGlyphName: String; override;
194
constructor Create(AOwner: TComponent); override;
195
destructor Destroy; override;
196
procedure InvalidateFilter;
197
procedure StoreSelection; virtual; abstract;
198
procedure RestoreSelection; virtual; abstract;
200
property Filter: string read fFilter write SetFilter;
201
property IdleConnected: Boolean read fIdleConnected write SetIdleConnected;
202
property SortData: Boolean read fSortData write fSortData;
203
property SelectedPart: TObject read fSelectedPart write fSelectedPart;
205
property OnFilterItem: TFilterItemEvent read fOnFilterItem write fOnFilterItem;
206
property OnCheckItem: TCheckItemEvent read fOnCheckItem write fOnCheckItem;
207
// TEditButton properties.
208
property ButtonWidth;
209
property DirectInput;
210
property ButtonOnlyWhenFocused;
217
property BorderSpacing;
218
property BorderStyle;
227
property ParentBidiMode;
228
property ParentColor;
230
property ParentShowHint;
242
property OnEditingDone;
249
property OnMouseDown;
250
property OnMouseMove;
252
property OnStartDrag;
253
property OnUTF8KeyPress;
151
256
{ TFileNameEdit }
165
270
FDefaultExt: String;
166
271
FHideDirectories: Boolean;
167
272
FInitialDir: String;
168
FOnAcceptFN: TAcceptFileNameEvent;
273
FOnAcceptFileName: TAcceptFileNameEvent;
169
274
FOnFolderChange: TNotifyEvent;
170
275
FFileNameChangeLock: Integer;
171
276
procedure SetFileName(const AValue: String);
173
278
function GetDefaultGlyph: TBitmap; override;
174
279
function GetDefaultGlyphName: String; override;
175
function CreateDialog(AKind : TDialogKind) : TCommonDialog; virtual;
176
procedure SaveDialogResult(AKind : TDialogKind; D : TCommonDialog); virtual;
280
function CreateDialog(AKind: TDialogKind): TCommonDialog; virtual;
281
procedure SaveDialogResult(AKind: TDialogKind; D: TCommonDialog); virtual;
177
282
procedure DoButtonClick (Sender: TObject); override;
178
283
procedure RunDialog; virtual;
179
284
procedure TextChanged; override;
186
291
// TFileName properties.
187
292
property FileName: String read FFileName write SetFileName;
188
293
property InitialDir: String read FInitialDir write FInitialDir;
189
property OnAcceptFileName: TAcceptFileNameEvent read FOnAcceptFN write FonAcceptFN;
294
property OnAcceptFileName: TAcceptFileNameEvent read FOnAcceptFileName write FOnAcceptFileName;
190
295
property OnFolderChange: TNotifyEvent read FOnFolderChange write FOnFolderChange;
191
296
property DialogKind: TDialogKind read FDialogKind write FDialogKind default dkOpen;
192
297
property DialogTitle: String read FDialogTitle write FDialogTitle;
193
property DialogOptions: TOpenOptions read FDialogOptions write FDialogOptions;
298
property DialogOptions: TOpenOptions read FDialogOptions write FDialogOptions default DefaultOpenDialogOptions;
194
299
property Filter: String read FFilter write FFilter;
195
300
property FilterIndex: Integer read FFilterIndex write FFIlterIndex;
196
301
property DefaultExt: String read FDefaultExt write FDefaultExt;
690
function TCustomEditButton.CalcButtonVisible: boolean;
692
Result := (csdesigning in ComponentState) or
693
(Visible and (Focused or not FButtonNeedsFocus));
576
696
procedure TCustomEditButton.CheckButtonVisible;
578
698
If Assigned(FButton) then
579
FButton.Visible:=(csdesigning in ComponentState) or
580
(Visible and (Focused or not FButtonNeedsFocus));
699
FButton.Visible:=CalcButtonVisible;
583
702
procedure TCustomEditButton.SetButtonHint(const AValue: TTranslateString);
636
755
procedure TCustomEditButton.CMVisibleChanged(var Msg: TLMessage);
638
757
inherited CMVisibleChanged(Msg);
640
758
CheckButtonVisible;
643
761
procedure TCustomEditButton.CMEnabledChanged(var Msg: TLMessage);
645
763
inherited CMEnabledChanged(Msg);
764
if (FButton<>nil) then
765
FButton.Enabled:=CalcButtonEnabled;
647
if (FButton<>nil) and (not ReadOnly) then
648
FButton.Enabled:=Enabled;
768
procedure TCustomEditButton.CMBiDiModeChanged(var Message: TLMessage);
651
774
function TCustomEditButton.GetMinHeight: Integer;
682
804
procedure TCustomEditButton.SetParent(AParent: TWinControl);
684
806
inherited SetParent(AParent);
685
if FButton <> nil then
807
if FButton <> nil then
688
810
CheckButtonVisible;
814
function TCustomEditButton.CalcButtonEnabled: Boolean;
816
Result := not FIsReadOnly and Enabled;
692
819
procedure TCustomEditButton.SetReadOnly(AValue: Boolean);
694
821
FIsReadOnly := AValue;
695
822
if Assigned(FButton) then
696
FButton.Enabled := not FIsReadOnly and Enabled;
823
FButton.Enabled := CalcButtonEnabled;
697
824
inherited SetReadOnly(FIsReadOnly or (not DirectInput));
700
827
procedure TCustomEditButton.DoPositionButton;
702
if FButton = nil then exit;
829
if FButton = nil then exit;
703
830
FButton.Parent := Parent;
704
FButton.Visible := Visible;
705
FButton.AnchorToCompanion(akLeft,0,Self);
831
if BiDiMode = bdLeftToRight then
832
FButton.AnchorToCompanion(akLeft,0,Self)
834
FButton.AnchorToCompanion(akRight,0,Self);
708
837
procedure TCustomEditButton.WMSetFocus(var Message: TLMSetFocus);
710
FButton.Visible:=True;
844
{ TCustomControlFilterEdit }
846
constructor TCustomControlFilterEdit.Create(AOwner: TComponent);
848
inherited Create(AOwner);
849
CharCase:=ecLowerCase;
850
Button.Enabled:=False;
851
fIsFirstUpdate := True;
854
destructor TCustomControlFilterEdit.Destroy;
859
procedure TCustomControlFilterEdit.OnIdle(Sender: TObject; var Done: Boolean);
863
IdleConnected:=false;
866
procedure TCustomControlFilterEdit.SetFilter(const AValue: string);
870
if AValue=lisCEFilter then
874
Button.Enabled:=NewValue<>'';
875
if (NewValue='') and not Focused then begin
877
Font.Color:=clBtnShadow;
881
Font.Color:=clDefault;
883
if fFilter=NewValue then exit;
888
procedure TCustomControlFilterEdit.SetIdleConnected(const AValue: Boolean);
890
if fIdleConnected=AValue then exit;
891
fIdleConnected:=AValue;
892
if fIdleConnected then
893
Application.AddOnIdleHandler(@OnIdle)
895
Application.RemoveOnIdleHandler(@OnIdle);
898
procedure TCustomControlFilterEdit.KeyDown(var Key: Word; Shift: TShiftState);
905
VK_UP: begin MovePrev; Handled:=True; end;
906
VK_DOWN: begin MoveNext; Handled:=True; end;
907
VK_RETURN: Handled:=ReturnPressed;
912
inherited KeyDown(Key, Shift);
915
procedure TCustomControlFilterEdit.Change;
921
procedure TCustomControlFilterEdit.DoEnter;
923
if Text=lisCEFilter then
928
procedure TCustomControlFilterEdit.DoExit;
934
procedure TCustomControlFilterEdit.DoButtonClick(Sender: TObject);
939
procedure TCustomControlFilterEdit.ApplyFilter(Immediately: Boolean);
941
if Immediately then begin
942
fNeedUpdate := False;
944
if (fSelectedPart=Nil) and not fIsFirstUpdate then
945
StoreSelection; // At first round the selection is from caller
946
fIsFirstUpdate:=False;
948
ApplyFilterCore; // The actual filtering implemented by inherited class.
954
if [csDestroying,csDesigning]*ComponentState=[] then
959
procedure TCustomControlFilterEdit.InvalidateFilter;
965
function TCustomControlFilterEdit.GetDefaultGlyphName: String;
967
Result := ResBtnListFilter;
714
970
{ TFileNameEdit }
751
dkopen, dkPictureOpen:
1009
dkOpen, dkPictureOpen:
753
O:=TOpenDialog.Create(Self);
754
O.FileName:=FileName;
755
O.Options:=DialogOptions;
756
O.InitialDir:=InitialDir;
758
O.FilterIndex:=FilterIndex;
1011
O := TOpenDialog.Create(Self);
761
1014
dkSave, dkPictureSave:
763
1016
S:=TSaveDialog.Create(Self);
764
S.DefaultExt:= FDefaultExt;
766
S.FilterIndex:=FilterIndex;
1017
S.DefaultExt := FDefaultExt;
1021
if Result is TOpenDialog then
1023
O:=TOpenDialog(Result);
1024
Dir:=ExtractFilePath(Filename);
1025
if (Dir<>'') and DirPathExists(Dir) then
1026
// setting a FileName with path disables InitialDir
1027
O.FileName := FileName
1029
// do not use path, so that InitialDir works
1030
O.FileName := ExtractFileName(Filename);
1032
O.Options := DialogOptions;
1034
O.FilterIndex := FilterIndex;
1035
O.InitialDir := CleanAndExpandDirectory(InitialDir);
770
1037
// Set some common things.
771
1038
Result.Title := DialogTitle;
779
dkOpen,dkPictureOpen :
1046
dkOpen, dkPictureOpen :
781
FN:=TOpenDialog(D).FileName;
1048
FilterIndex := TOpenDialog(D).FilterIndex;
1049
FN := TOpenDialog(D).FileName;
784
if Assigned(FOnAcceptFN) then
785
FOnAcceptFN(Self,Fn);
1052
if Assigned(OnAcceptFileName) then
1053
OnAcceptFileName(Self, FN);
789
1057
// set FDialogFiles first since assigning of FileName trigger events
790
FDialogFiles.Text:=TOpenDialog(D).Files.Text;
1058
FDialogFiles.Text := TOpenDialog(D).Files.Text;
794
dkSave,dkPictureSave :
1062
dkSave, dkPictureSave :
796
FileName:=TSaveDialog(D).FileName;
1064
FileName := TSaveDialog(D).FileName;
1065
FilterIndex := TSaveDialog(D).FilterIndex;
797
1066
FDialogFiles.Clear;