Skip to content

Commit 34e3f32

Browse files
committed
fix: some remaining issues in the new file-open/save dialogs
* add missing support for ofFileMustExist, by default enabled in TExtFileOpenDialog * store and restore previously selected path * support single FileName when MultiSelect is true * avoid setting unwanted tree path when caller provides an empty FileName or InitialDir * set different default form caption for open + save mode (todo: include lclstrconsts translation files in packages) Refs #2268
1 parent ec4c237 commit 34e3f32

File tree

2 files changed

+40
-6
lines changed

2 files changed

+40
-6
lines changed

source/extfiledialog.lfm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ object frmExtFileDialog: TfrmExtFileDialog
3737
BorderSpacing.Right = 10
3838
TabOrder = 0
3939
Text = 'editFilename'
40+
OnEditingDone = editFilenameEditingDone
4041
end
4142
object lblFilename: TLabel
4243
AnchorSideLeft.Control = pnlBottom
@@ -222,7 +223,7 @@ object frmExtFileDialog: TfrmExtFileDialog
222223
end
223224
object IdleTimerTreeNodeScrolltoview: TIdleTimer
224225
AutoEnabled = True
225-
Interval = 100
226+
Interval = 200
226227
OnTimer = IdleTimerTreeNodeScrolltoviewTimer
227228
Left = 32
228229
Top = 64

source/extfiledialog.pas

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ TfrmExtFileDialog = class(TExtForm)
3131
procedure comboEncodingChange(Sender: TObject);
3232
procedure comboFileTypeChange(Sender: TObject);
3333
procedure comboLineBreaksChange(Sender: TObject);
34+
procedure editFilenameEditingDone(Sender: TObject);
3435
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
3536
procedure FormCreate(Sender: TObject);
3637
procedure FormDestroy(Sender: TObject);
@@ -74,7 +75,6 @@ TfrmExtFileDialog = class(TExtForm)
7475
procedure AddFileType(FileMask, DisplayName: String);
7576
property FileName: String read GetFileName write SetFileName;
7677
property InitialDir: String read FInitialDir write SetInitialDir;
77-
class var PreviousDir: String;
7878
property DefaultExt: String read FDefaultExt write FDefaultExt;
7979
property Options: TOpenOptions read FOptions write FOptions;
8080
property Files: TStringList read FFiles;
@@ -83,13 +83,15 @@ TfrmExtFileDialog = class(TExtForm)
8383

8484
// File-open-dialog with encoding selector
8585
TExtFileOpenDialog = class(TfrmExtFileDialog)
86+
procedure FormCreate(Sender: TObject); overload;
8687
procedure FormShow(Sender: TObject); overload;
8788
public
8889
property Encodings: TStringList read FEncodings write FEncodings;
8990
property EncodingIndex: Integer read FEncodingIndex write FEncodingIndex;
9091
end;
9192

9293
TExtFileSaveDialog = class(TfrmExtFileDialog)
94+
procedure FormCreate(Sender: TObject); overload;
9395
procedure FormShow(Sender: TObject); overload;
9496
public
9597
property LineBreakIndex: TLineBreaks read FLineBreakIndex write FLineBreakIndex;
@@ -131,7 +133,7 @@ procedure TfrmExtFileDialog.FormCreate(Sender: TObject);
131133

132134
procedure TfrmExtFileDialog.FormDestroy(Sender: TObject);
133135
begin
134-
PreviousDir := ShellTreeView.Path;
136+
AppSettings.WriteString(asFileDialogPreviousDir, ShellTreeView.Path);
135137
FFilterNames.Free;
136138
FFilterMasks.Free;
137139
FEncodings.Free;
@@ -141,9 +143,10 @@ procedure TfrmExtFileDialog.FormDestroy(Sender: TObject);
141143
procedure TfrmExtFileDialog.FormShow(Sender: TObject);
142144
var
143145
LineBreakIndexInt: Integer;
146+
PreviousDir: String;
144147
begin
145148
ShellListView.MultiSelect := ofAllowMultiSelect in FOptions;
146-
// Todo: support ofFileMustExist
149+
PreviousDir := AppSettings.ReadString(asFileDialogPreviousDir);
147150
if not FInitialDir.IsEmpty then
148151
SetInitialDir(FInitialDir)
149152
else if not PreviousDir.IsEmpty then
@@ -251,6 +254,12 @@ procedure TfrmExtFileDialog.comboLineBreaksChange(Sender: TObject);
251254
end;
252255
end;
253256

257+
procedure TfrmExtFileDialog.editFilenameEditingDone(Sender: TObject);
258+
begin
259+
FFiles.Clear;
260+
FFiles.Add(GetFileName);
261+
end;
262+
254263
procedure TfrmExtFileDialog.FormCloseQuery(Sender: TObject;
255264
var CanClose: Boolean);
256265
begin
@@ -265,10 +274,16 @@ procedure TfrmExtFileDialog.FormCloseQuery(Sender: TObject;
265274
Exit;
266275
end;
267276

268-
// Ask user whether to overwrite the selected file
269-
if (Self is TExtFileSaveDialog) and (ofOverwritePrompt in FOptions) and (FileExists(FileName)) then begin
277+
// Only for save dialogs: Ask user whether to overwrite the selected file
278+
if (ofOverwritePrompt in FOptions) and (FileExists(FileName)) then begin
270279
CanClose := MessageDialog(f_('File already exists: %s'+sLineBreak+sLineBreak+'Overwrite it?', [FileName]), mtConfirmation, [mbYes, mbNo]) = mrYes;
271280
end;
281+
282+
// Only for open dialogs: Error if file does not exist
283+
if (ofFileMustExist in FOptions) and (not FileExists(FileName)) then begin
284+
ErrorDialog(f_('File does not exist: %s', [FileName]));
285+
CanClose := False;
286+
end;
272287
end;
273288

274289
procedure TfrmExtFileDialog.comboEncodingChange(Sender: TObject);
@@ -337,6 +352,8 @@ procedure TfrmExtFileDialog.SetFileName(const AValue: String);
337352
var
338353
fn: String;
339354
begin
355+
if AValue.IsEmpty then
356+
Exit;
340357
fn := ExpandFileName(AValue);
341358
SetInitialDir(ExtractFilePath(fn));
342359
editFilename.Text := ExtractFileName(fn);
@@ -349,6 +366,9 @@ procedure TfrmExtFileDialog.SetInitialDir(const AValue: String);
349366
i: Integer;
350367
begin
351368
// Try to set path on tree
369+
// Note both .FileName and .InitialDir go here, and .FileName := '' sets the initial dir to the app directory.
370+
if AValue.IsEmpty then
371+
Exit;
352372
FInitialDir := AValue;
353373
CurPath := AValue;
354374
for i:=0 to 10 do begin
@@ -378,6 +398,13 @@ procedure TfrmExtFileDialog.SetFilterIndex(AValue: Integer);
378398

379399
{ TExtFileOpenDialog }
380400

401+
procedure TExtFileOpenDialog.FormCreate(Sender: TObject);
402+
begin
403+
inherited;
404+
Include(FOptions, ofFileMustExist);
405+
Caption := _('Open existing file');
406+
end;
407+
381408
procedure TExtFileOpenDialog.FormShow(Sender: TObject);
382409
var
383410
EncodingVisible: Boolean;
@@ -392,6 +419,12 @@ procedure TExtFileOpenDialog.FormShow(Sender: TObject);
392419

393420
{ TExtFileSaveDialog }
394421

422+
procedure TExtFileSaveDialog.FormCreate(Sender: TObject);
423+
begin
424+
inherited;
425+
Caption := _('Save to file');
426+
end;
427+
395428
procedure TExtFileSaveDialog.FormShow(Sender: TObject);
396429
var
397430
LinebreaksVisible: Boolean;

0 commit comments

Comments
 (0)