Skip to content

Commit d5d34ad

Browse files
committed
feat: create file-save dialog with linebreaks selector
Refs #2268
1 parent 56b783d commit d5d34ad

File tree

4 files changed

+121
-124
lines changed

4 files changed

+121
-124
lines changed

source/extfiledialog.lfm

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ object frmExtFileDialog: TfrmExtFileDialog
88
ClientHeight = 544
99
ClientWidth = 872
1010
DesignTimePPI = 120
11+
OnCloseQuery = FormCloseQuery
1112
OnCreate = FormCreate
1213
OnDestroy = FormDestroy
1314
OnShow = FormShow
@@ -117,6 +118,7 @@ object frmExtFileDialog: TfrmExtFileDialog
117118
ItemHeight = 20
118119
Style = csDropDownList
119120
TabOrder = 4
121+
Visible = False
120122
OnChange = comboEncodingChange
121123
end
122124
object lblEncoding: TLabel
@@ -130,6 +132,36 @@ object frmExtFileDialog: TfrmExtFileDialog
130132
Anchors = [akTop, akRight]
131133
BorderSpacing.Right = 10
132134
Caption = 'Encoding:'
135+
Visible = False
136+
end
137+
object comboLineBreaks: TComboBox
138+
AnchorSideTop.Control = comboFileType
139+
AnchorSideTop.Side = asrBottom
140+
AnchorSideRight.Control = lblEncoding
141+
Left = 117
142+
Height = 28
143+
Top = 38
144+
Width = 200
145+
Anchors = [akTop, akRight]
146+
BorderSpacing.Right = 10
147+
ItemHeight = 20
148+
Style = csDropDownList
149+
TabOrder = 5
150+
Visible = False
151+
OnChange = comboLineBreaksChange
152+
end
153+
object lblLinebreaks: TLabel
154+
AnchorSideTop.Control = comboLineBreaks
155+
AnchorSideTop.Side = asrCenter
156+
AnchorSideRight.Control = comboLineBreaks
157+
Left = 34
158+
Height = 20
159+
Top = 42
160+
Width = 73
161+
Anchors = [akTop, akRight]
162+
BorderSpacing.Right = 10
163+
Caption = 'Linebreaks:'
164+
Visible = False
133165
end
134166
end
135167
object ShellTreeView: TShellTreeView

source/extfiledialog.pas

Lines changed: 84 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ interface
1515
TfrmExtFileDialog = class(TExtForm)
1616
btnCancel: TButton;
1717
btnOk: TButton;
18+
comboLineBreaks: TComboBox;
1819
comboEncoding: TComboBox;
1920
comboFileType: TComboBox;
2021
editFilename: TEdit;
22+
lblLinebreaks: TLabel;
2123
lblEncoding: TLabel;
2224
lblFilename: TLabel;
2325
pnlBottom: TPanel;
@@ -26,6 +28,8 @@ TfrmExtFileDialog = class(TExtForm)
2628
splitterMain: TSplitter;
2729
procedure comboEncodingChange(Sender: TObject);
2830
procedure comboFileTypeChange(Sender: TObject);
31+
procedure comboLineBreaksChange(Sender: TObject);
32+
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
2933
procedure FormCreate(Sender: TObject);
3034
procedure FormDestroy(Sender: TObject);
3135
procedure FormShow(Sender: TObject);
@@ -39,31 +43,39 @@ TfrmExtFileDialog = class(TExtForm)
3943
FFilterMasks: TStringList;
4044
FDefaultExt: String;
4145
FEncodings: TStringList;
42-
FEncodingIndex: Cardinal;
46+
FEncodingIndex: Integer;
47+
FLineBreakIndex: TLineBreaks;
4348
FOptions: TOpenOptions;
4449
FFiles: TStringList;
50+
procedure SetTitle(AValue: String);
4551
function GetFileName: String;
4652
procedure SetFileName(const AValue: String);
4753
procedure SetInitialDir(const AValue: String);
4854
public
55+
property Title: String write SetTitle;
4956
function Execute: Boolean;
5057
procedure AddFileType(FileMask, DisplayName: String);
5158
property FileName: String read GetFileName write SetFileName;
5259
property InitialDir: String read FInitialDir write SetInitialDir;
5360
class var PreviousDir: String;
5461
property DefaultExt: String read FDefaultExt write FDefaultExt;
55-
property Encodings: TStringList read FEncodings write FEncodings;
56-
property EncodingIndex: Cardinal read FEncodingIndex write FEncodingIndex;
5762
property Options: TOpenOptions read FOptions write FOptions;
5863
property Files: TStringList read FFiles;
59-
6064
end;
6165

6266
// File-open-dialog with encoding selector
6367
TExtFileOpenDialog = class(TfrmExtFileDialog)
6468
procedure FormCreate(Sender: TObject); overload;
69+
public
70+
property Encodings: TStringList read FEncodings write FEncodings;
71+
property EncodingIndex: Integer read FEncodingIndex write FEncodingIndex;
6572
end;
6673

74+
TExtFileSaveDialog = class(TfrmExtFileDialog)
75+
procedure FormCreate(Sender: TObject); overload;
76+
public
77+
property LineBreakIndex: TLineBreaks read FLineBreakIndex write FLineBreakIndex;
78+
end;
6779

6880
implementation
6981

@@ -89,11 +101,19 @@ procedure TfrmExtFileDialog.FormCreate(Sender: TObject);
89101
FFilterNames := TStringList.Create;
90102
FFilterMasks := TStringList.Create;
91103
FEncodings := TStringList.Create;
104+
{$IFDEF LINUX}
105+
FLineBreakIndex := lbsUnix;
106+
{$ENDIF}
107+
{$IFDEF WINDOWS}
108+
FLineBreakIndex := lbsWindows;
109+
{$ENDIF}
110+
{$IFDEF DARWIN}
111+
FLineBreakIndex := lbsMac;
112+
{$ENDIF}
92113
FFiles := TStringList.Create;
93114
comboFileType.Items.Clear;
94115
editFilename.Text := '';
95-
lblEncoding.Enabled := False;
96-
comboEncoding.Enabled := False;
116+
comboLineBreaks.Items.Clear;
97117
end;
98118

99119
procedure TfrmExtFileDialog.FormDestroy(Sender: TObject);
@@ -106,10 +126,12 @@ procedure TfrmExtFileDialog.FormDestroy(Sender: TObject);
106126
end;
107127

108128
procedure TfrmExtFileDialog.FormShow(Sender: TObject);
129+
var
130+
LineBreakIndexInt: Integer;
109131
begin
110132
ShellListView.MultiSelect := ofAllowMultiSelect in FOptions;
111133
ShellTreeView.Enabled := not (ofNoChangeDir in FOptions);
112-
// Todo: support ofOverwritePrompt, ofFileMustExist
134+
// Todo: support ofFileMustExist and convert usages of TOpenDialog and TSaveDialog
113135
if FInitialDir.IsEmpty then begin
114136
if not PreviousDir.IsEmpty then
115137
SetInitialDir(PreviousDir)
@@ -123,6 +145,13 @@ procedure TfrmExtFileDialog.FormShow(Sender: TObject);
123145
comboEncoding.Items.AddStrings(FEncodings, True);
124146
if (FEncodingIndex >=0) and (FEncodingIndex < comboEncoding.Items.Count) then
125147
comboEncoding.ItemIndex := FEncodingIndex;
148+
149+
comboLineBreaks.Items.Add(_('Windows linebreaks'));
150+
comboLineBreaks.Items.Add(_('UNIX linebreaks'));
151+
comboLineBreaks.Items.Add(_('Mac OS linebreaks'));
152+
LineBreakIndexInt := Integer(FLineBreakIndex)-1; // we skip lbsNone
153+
if (LineBreakIndexInt >=0) and (LineBreakIndexInt < comboLineBreaks.Items.Count) then
154+
comboLineBreaks.ItemIndex := LineBreakIndexInt;
126155
end;
127156

128157
procedure TfrmExtFileDialog.comboFileTypeChange(Sender: TObject);
@@ -136,6 +165,36 @@ procedure TfrmExtFileDialog.comboFileTypeChange(Sender: TObject);
136165
ShellListView.Mask := FileMask;
137166
end;
138167

168+
procedure TfrmExtFileDialog.comboLineBreaksChange(Sender: TObject);
169+
begin
170+
case comboLineBreaks.ItemIndex of
171+
0: FLineBreakIndex := lbsWindows;
172+
1: FLineBreakIndex := lbsUnix;
173+
2: FLineBreakIndex := lbsMac;
174+
end;
175+
end;
176+
177+
procedure TfrmExtFileDialog.FormCloseQuery(Sender: TObject;
178+
var CanClose: Boolean);
179+
begin
180+
CanClose := True;
181+
if ModalResult = mrOK then begin
182+
183+
if FileName.IsEmpty then begin
184+
CanClose := False;
185+
end;
186+
187+
if (not FileName.IsEmpty) and (Self is TExtFileSaveDialog) and (ofOverwritePrompt in FOptions) then begin
188+
case MessageDialog(f_('File already exists: %s'+sLineBreak+sLineBreak+'Overwrite it?', [FileName]), mtConfirmation, [mbYes, mbNo]) of
189+
mrNo: begin
190+
CanClose := False;
191+
end;
192+
end;
193+
end;
194+
195+
end;
196+
end;
197+
139198
procedure TfrmExtFileDialog.comboEncodingChange(Sender: TObject);
140199
begin
141200
FEncodingIndex := comboEncoding.ItemIndex;
@@ -168,10 +227,17 @@ procedure TfrmExtFileDialog.ShellListViewSelectItem(Sender: TObject;
168227
end;
169228
end;
170229

230+
procedure TfrmExtFileDialog.SetTitle(AValue: String);
231+
begin
232+
Caption := AValue;
233+
end;
234+
171235
function TfrmExtFileDialog.GetFileName: String;
172236
begin
173237
if ShellListView.Selected <> nil then
174238
Result := ShellListView.GetPathFromItem(ShellListView.Selected)
239+
else if (editFilename.Text <> '') and (ShellTreeView.Selected <> nil) then
240+
Result := ShellTreeView.Path + editFilename.Text
175241
else
176242
Result := '';
177243
end;
@@ -198,10 +264,19 @@ procedure TfrmExtFileDialog.SetInitialDir(const AValue: String);
198264
procedure TExtFileOpenDialog.FormCreate(Sender: TObject);
199265
begin
200266
inherited;
201-
lblEncoding.Enabled := True;
202-
comboEncoding.Enabled := True;
267+
lblEncoding.Visible := True;
268+
comboEncoding.Visible := True;
203269
end;
204270

205271

272+
{ TExtFileSaveDialog }
273+
274+
procedure TExtFileSaveDialog.FormCreate(Sender: TObject);
275+
begin
276+
inherited;
277+
lblLinebreaks.Visible := True;
278+
comboLineBreaks.Visible := True;
279+
end;
280+
206281
end.
207282

source/extra_controls.pas

Lines changed: 0 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,6 @@ TExtForm = class(TForm)
4040
class procedure ShowPopup(ClickedControl: TControl; PopupMenu: TPopupMenu);
4141
end;
4242

43-
TExtFileSaveDialog = class(TSaveDialog)
44-
private
45-
FFilters: TStringList;
46-
FLineBreaks: TStringList;
47-
FLineBreakIndex: TLineBreaks;
48-
//const idLineBreakCombo = 1;
49-
procedure FileOkClickNoOp(Sender: TObject; var CanClose: Boolean);
50-
protected
51-
//procedure DoOnExecute; override;
52-
//function DoOnFileOkClick: Boolean; override;
53-
public
54-
constructor Create(AOwner: TComponent); override;
55-
destructor Destroy; override;
56-
procedure AddFileType(FileMask, DisplayName: String);
57-
property LineBreaks: TStringList read FLineBreaks;
58-
property LineBreakIndex: TLineBreaks read FLineBreakIndex write FLineBreakIndex;
59-
end;
60-
6143
{TExtSynHotKey = class(TSynHotKey)
6244
private
6345
FOnChange: TNotifyEvent;
@@ -464,98 +446,6 @@ class procedure TExtForm.ShowPopup(ClickedControl: TControl; PopupMenu: TPopupMe
464446
end;
465447

466448

467-
468-
{ TExtFileSaveDialog }
469-
470-
constructor TExtFileSaveDialog.Create(AOwner: TComponent);
471-
begin
472-
inherited Create(AOwner);
473-
FLineBreaks := TStringList.Create;
474-
FLineBreaks.Add(_('Windows linebreaks'));
475-
FLineBreaks.Add(_('UNIX linebreaks'));
476-
FLineBreaks.Add(_('Mac OS linebreaks'));
477-
FLineBreakIndex := lbsWindows;
478-
FFilters := TStringList.Create;
479-
end;
480-
481-
482-
destructor TExtFileSaveDialog.Destroy;
483-
begin
484-
FLineBreaks.Free;
485-
inherited;
486-
end;
487-
488-
489-
procedure TExtFileSaveDialog.AddFileType(FileMask, DisplayName: String);
490-
var
491-
i: Integer;
492-
NewFilter: String;
493-
begin
494-
// Shorthand for callers
495-
FFilters.Values[DisplayName] := FileMask;
496-
NewFilter := '';
497-
for i:=FFilters.Count-1 downto 0 do begin
498-
NewFilter := NewFilter + Format('%s (%s)|%s', [FFilters.Names[i], FFilters.ValueFromIndex[i], FFilters.ValueFromIndex[i]]);
499-
if i > 0 then
500-
NewFilter := NewFilter + '|';
501-
end;
502-
Filter := NewFilter;
503-
end;
504-
505-
506-
{procedure TExtFileSaveDialog.DoOnExecute;
507-
var
508-
iCustomize: IFileDialogCustomize;
509-
i, ComboIndex: Integer;
510-
begin
511-
// Add line break selector
512-
if Dialog.QueryInterface(IFileDialogCustomize, iCustomize) = S_OK then
513-
begin
514-
iCustomize.StartVisualGroup(0, PChar(_('Linebreaks')+':'));
515-
try
516-
iCustomize.AddComboBox(idLineBreakCombo);
517-
case FLineBreakIndex of
518-
lbsUnix: ComboIndex := 1;
519-
lbsMac: ComboIndex := 2;
520-
else ComboIndex := 0;
521-
end;
522-
for i:=0 to FLineBreaks.Count - 1 do begin
523-
iCustomize.AddControlItem(idLineBreakCombo, i, PChar(FLineBreaks[i]));
524-
end;
525-
iCustomize.SetSelectedControlItem(idLineBreakCombo, ComboIndex);
526-
if not Assigned(OnFileOkClick) then
527-
OnFileOkClick := FileOkClickNoOp;
528-
finally
529-
iCustomize.EndVisualGroup;
530-
end;
531-
end;
532-
end;}
533-
534-
535-
procedure TExtFileSaveDialog.FileOkClickNoOp(Sender: TObject; var CanClose: Boolean);
536-
begin
537-
// Dummy procedure, just makes sure parent class calls DoOnFileOkClick
538-
end;
539-
540-
541-
{function TExtFileSaveDialog.DoOnFileOkClick: Boolean;
542-
var
543-
iCustomize: IFileDialogCustomize;
544-
ComboIndex: Cardinal;
545-
begin
546-
Result := inherited;
547-
if Dialog.QueryInterface(IFileDialogCustomize, iCustomize) = S_OK then
548-
begin
549-
iCustomize.GetSelectedControlItem(idLineBreakCombo, ComboIndex);
550-
case ComboIndex of
551-
0: FLineBreakIndex := lbsWindows;
552-
1: FLineBreakIndex := lbsUnix;
553-
2: FLineBreakIndex := lbsMac;
554-
end;
555-
end;
556-
end;}
557-
558-
559449
{ TExtSynHotKey }
560450

561451
{procedure TExtSynHotKey.WMKillFocus(var Msg: TWMKillFocus);

0 commit comments

Comments
 (0)