SelFolderForm.pas 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. unit SelFolderForm;
  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. 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, Msgs, MsgIDs, Main, SetupTypes, Wizard, CmnFunc2;
  38. {$R *.DFM}
  39. function ShowSelectFolderDialog(const StartMenu, AppendDir: Boolean;
  40. var Path: String; const NewFolderName: String): Boolean;
  41. var
  42. Form: TSelectFolderForm;
  43. begin
  44. Form := TSelectFolderForm.Create2(nil, StartMenu);
  45. try
  46. Form.FAppendDir := AppendDir;
  47. Form.FNewFolderName := NewFolderName;
  48. Form.NewFolderButton.Visible := not AppendDir and (NewFolderName <> '');
  49. if StartMenu then begin
  50. with Form.FFolderTreeView as TStartMenuFolderTreeView do
  51. SetPaths(GetShellFolder(False, sfPrograms),
  52. GetShellFolder(True, sfPrograms),
  53. GetShellFolder(False, sfStartup),
  54. GetShellFolder(True, sfStartup));
  55. TidyUpGroupName(Path);
  56. end
  57. else
  58. TidyUpDirName(Path);
  59. if AppendDir then begin
  60. if PathExtractDir(Path) <> Path then
  61. Form.FFolderTreeView.ChangeDirectory(PathExtractDir(Path), True);
  62. end
  63. else
  64. Form.FFolderTreeView.ChangeDirectory(Path, True);
  65. if StartMenu or (Form.FFolderTreeView.Directory <> '') then
  66. Form.ActiveControl := Form.FFolderTreeView;
  67. Form.PathEdit.Text := Path;
  68. Result := (Form.ShowModal = mrOK);
  69. if Result then
  70. Path := Trim(Form.PathEdit.Text);
  71. finally
  72. Form.Free;
  73. end;
  74. end;
  75. { TSelectFolderForm }
  76. constructor TSelectFolderForm.Create(AOwner: TComponent);
  77. var
  78. YDiff, W: Integer;
  79. begin
  80. inherited;
  81. if not FStartMenu then begin
  82. FFolderTreeView := TFolderTreeView.Create(Self);
  83. TFolderTreeView(FFolderTreeView).OnChange := FolderTreeViewChange;
  84. TFolderTreeView(FFolderTreeView).OnRename := WizardForm.DirTreeRename;
  85. end
  86. else begin
  87. FFolderTreeView := TStartMenuFolderTreeView.Create(Self);
  88. TStartMenuFolderTreeView(FFolderTreeView).OnChange := FolderTreeViewChange;
  89. TStartMenuFolderTreeView(FFolderTreeView).OnRename := WizardForm.GroupTreeRename;
  90. end;
  91. FFolderTreeView.SetBounds(16, 64, 317, 229);
  92. FFolderTreeView.Anchors := [akLeft, akTop, akRight, akBottom];
  93. FFolderTreeView.Visible := False;
  94. FFolderTreeView.Parent := Self;
  95. PathEdit.BringToFront; { for MSAA }
  96. BrowseLabel.BringToFront; { for MSAA }
  97. FFolderTreeView.TabOrder := 2;
  98. FFolderTreeView.Visible := True;
  99. InitializeFont;
  100. Caption := SetupMessages[msgBrowseDialogTitle];
  101. BrowseLabel.Caption := SetupMessages[msgBrowseDialogLabel];
  102. YDiff := WizardForm.AdjustLabelHeight(BrowseLabel);
  103. PathEdit.Top := PathEdit.Top + YDiff;
  104. TryEnableAutoCompleteFileSystem(PathEdit.Handle);
  105. FFolderTreeView.Top := FFolderTreeView.Top + YDiff;
  106. NewFolderButton.Caption := SetupMessages[msgButtonNewFolder];
  107. NewFolderButton.Top := NewFolderButton.Top + YDiff;
  108. NewFolderButton.Width := CalculateButtonWidth([SetupMessages[msgButtonNewFolder]]);
  109. W := CalculateButtonWidth([SetupMessages[msgButtonOK], SetupMessages[msgButtonCancel]]);
  110. CancelButton.Caption := SetupMessages[msgButtonCancel];
  111. CancelButton.SetBounds(CancelButton.Left + CancelButton.Width - W,
  112. CancelButton.Top + YDiff, W, CancelButton.Height);
  113. OKButton.Caption := SetupMessages[msgButtonOK];
  114. OKButton.SetBounds(CancelButton.Left - ScalePixelsX(6) - W,
  115. OKButton.Top + YDiff, W, OKButton.Height);
  116. ClientHeight := ClientHeight + YDiff;
  117. FlipSizeAndCenterIfNeeded(True, WizardForm, False);
  118. end;
  119. constructor TSelectFolderForm.Create2(AOwner: TComponent; AStartMenu: Boolean);
  120. begin
  121. FStartMenu := AStartMenu;
  122. Create(AOwner);
  123. end;
  124. procedure TSelectFolderForm.PathEditChange(Sender: TObject);
  125. begin
  126. OKButton.Enabled := (Trim(PathEdit.Text) <> '');
  127. end;
  128. procedure TSelectFolderForm.FolderTreeViewChange(Sender: TObject);
  129. begin
  130. if FAppendDir then
  131. PathEdit.Text := AddBackslash(FFolderTreeView.Directory) + FNewFolderName
  132. else
  133. PathEdit.Text := FFolderTreeView.Directory;
  134. NewFolderButton.Enabled := FStartMenu or (FFolderTreeView.Directory <> '');
  135. end;
  136. procedure TSelectFolderForm.NewFolderButtonClick(Sender: TObject);
  137. begin
  138. FFolderTreeView.CreateNewDirectory(FNewFolderName);
  139. end;
  140. end.