Setup.SelectFolderForm.pas 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. unit Setup.SelectFolderForm;
  2. {
  3. Inno Setup
  4. Copyright (C) 1997-2024 Jordan Russell
  5. Portions by Martijn Laan
  6. For conditions of distribution and use, see LICENSE.TXT.
  7. "Select Folder" form
  8. }
  9. interface
  10. uses
  11. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  12. Setup.SetupForm, StdCtrls, FolderTreeView, NewStaticText, BidiCtrls;
  13. type
  14. TSelectFolderForm = class(TSetupForm)
  15. BrowseLabel: TNewStaticText;
  16. PathEdit: TEdit;
  17. NewFolderButton: TNewButton;
  18. OKButton: TNewButton;
  19. CancelButton: TNewButton;
  20. procedure PathEditChange(Sender: TObject);
  21. procedure NewFolderButtonClick(Sender: TObject);
  22. private
  23. { Private declarations }
  24. FFolderTreeView: TCustomFolderTreeView;
  25. FNewFolderName: String;
  26. FStartMenu, FAppendDir: Boolean;
  27. procedure FolderTreeViewChange(Sender: TObject);
  28. public
  29. { Public declarations }
  30. constructor Create(AOwner: TComponent); override;
  31. constructor Create2(AOwner: TComponent; AStartMenu: Boolean);
  32. end;
  33. function ShowSelectFolderDialog(const StartMenu, AppendDir: Boolean;
  34. var Path: String; const NewFolderName: String): Boolean;
  35. implementation
  36. uses
  37. PathFunc, SetupLdrAndSetup.Messages, Shared.SetupMessageIDs, Setup.MainFunc,
  38. Shared.SetupTypes, Setup.WizardForm, Shared.CommonFunc;
  39. {$R *.DFM}
  40. function ShowSelectFolderDialog(const StartMenu, AppendDir: Boolean;
  41. var Path: String; const NewFolderName: String): Boolean;
  42. var
  43. Form: TSelectFolderForm;
  44. begin
  45. Form := TSelectFolderForm.Create2(nil, StartMenu);
  46. try
  47. Form.FAppendDir := AppendDir;
  48. Form.FNewFolderName := NewFolderName;
  49. Form.NewFolderButton.Visible := not AppendDir and (NewFolderName <> '');
  50. if StartMenu then begin
  51. with Form.FFolderTreeView as TStartMenuFolderTreeView do
  52. SetPaths(GetShellFolder(False, sfPrograms),
  53. GetShellFolder(True, sfPrograms),
  54. GetShellFolder(False, sfStartup),
  55. GetShellFolder(True, sfStartup));
  56. TidyUpGroupName(Path);
  57. end
  58. else
  59. TidyUpDirName(Path);
  60. if AppendDir then begin
  61. if PathExtractDir(Path) <> Path then
  62. Form.FFolderTreeView.ChangeDirectory(PathExtractDir(Path), True);
  63. end
  64. else
  65. Form.FFolderTreeView.ChangeDirectory(Path, True);
  66. if StartMenu or (Form.FFolderTreeView.Directory <> '') then
  67. Form.ActiveControl := Form.FFolderTreeView;
  68. Form.PathEdit.Text := Path;
  69. Result := (Form.ShowModal = mrOK);
  70. if Result then
  71. Path := Trim(Form.PathEdit.Text);
  72. finally
  73. Form.Free;
  74. end;
  75. end;
  76. { TSelectFolderForm }
  77. constructor TSelectFolderForm.Create(AOwner: TComponent);
  78. var
  79. YDiff, W: Integer;
  80. begin
  81. inherited;
  82. if not FStartMenu then begin
  83. FFolderTreeView := TFolderTreeView.Create(Self);
  84. TFolderTreeView(FFolderTreeView).OnChange := FolderTreeViewChange;
  85. TFolderTreeView(FFolderTreeView).OnRename := WizardForm.DirTreeRename;
  86. end
  87. else begin
  88. FFolderTreeView := TStartMenuFolderTreeView.Create(Self);
  89. TStartMenuFolderTreeView(FFolderTreeView).OnChange := FolderTreeViewChange;
  90. TStartMenuFolderTreeView(FFolderTreeView).OnRename := WizardForm.GroupTreeRename;
  91. end;
  92. FFolderTreeView.SetBounds(16, 64, 317, 229);
  93. FFolderTreeView.Anchors := [akLeft, akTop, akRight, akBottom];
  94. FFolderTreeView.Visible := False;
  95. { The form needs its handle allocated before the Parent assignment,
  96. otherwise the control's width and height get reduced later. Looks like
  97. a Delphi 11 bug; the problem is seen in IS 6.3 but not 6.2.2. }
  98. HandleNeeded;
  99. FFolderTreeView.Parent := Self;
  100. PathEdit.BringToFront; { for MSAA }
  101. BrowseLabel.BringToFront; { for MSAA }
  102. FFolderTreeView.TabOrder := 2;
  103. FFolderTreeView.Visible := True;
  104. InitializeFont;
  105. Caption := SetupMessages[msgBrowseDialogTitle];
  106. BrowseLabel.Caption := SetupMessages[msgBrowseDialogLabel];
  107. YDiff := WizardForm.AdjustLabelHeight(BrowseLabel);
  108. PathEdit.Top := PathEdit.Top + YDiff;
  109. TryEnableAutoCompleteFileSystem(PathEdit.Handle);
  110. FFolderTreeView.Top := FFolderTreeView.Top + YDiff;
  111. NewFolderButton.Caption := SetupMessages[msgButtonNewFolder];
  112. NewFolderButton.Top := NewFolderButton.Top + YDiff;
  113. NewFolderButton.Width := CalculateButtonWidth([SetupMessages[msgButtonNewFolder]]);
  114. W := CalculateButtonWidth([SetupMessages[msgButtonOK], SetupMessages[msgButtonCancel]]);
  115. CancelButton.Caption := SetupMessages[msgButtonCancel];
  116. CancelButton.SetBounds(CancelButton.Left + CancelButton.Width - W,
  117. CancelButton.Top + YDiff, W, CancelButton.Height);
  118. OKButton.Caption := SetupMessages[msgButtonOK];
  119. OKButton.SetBounds(CancelButton.Left - ScalePixelsX(6) - W,
  120. OKButton.Top + YDiff, W, OKButton.Height);
  121. ClientHeight := ClientHeight + YDiff;
  122. FlipSizeAndCenterIfNeeded(True, WizardForm, False);
  123. end;
  124. constructor TSelectFolderForm.Create2(AOwner: TComponent; AStartMenu: Boolean);
  125. begin
  126. FStartMenu := AStartMenu;
  127. Create(AOwner);
  128. end;
  129. procedure TSelectFolderForm.PathEditChange(Sender: TObject);
  130. begin
  131. OKButton.Enabled := (Trim(PathEdit.Text) <> '');
  132. end;
  133. procedure TSelectFolderForm.FolderTreeViewChange(Sender: TObject);
  134. begin
  135. if FAppendDir then
  136. PathEdit.Text := AddBackslash(FFolderTreeView.Directory) + FNewFolderName
  137. else
  138. PathEdit.Text := FFolderTreeView.Directory;
  139. NewFolderButton.Enabled := FStartMenu or (FFolderTreeView.Directory <> '');
  140. end;
  141. procedure TSelectFolderForm.NewFolderButtonClick(Sender: TObject);
  142. begin
  143. FFolderTreeView.CreateNewDirectory(FNewFolderName);
  144. end;
  145. end.