Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
virtual System.Windows.Forms.Design.FolderNameEditor.InitializeDialog(System.Windows.Forms.FolderBrowserDialog! folderBrowserDialog) -> void
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,19 @@ namespace System.Windows.Forms.Design;
[CLSCompliant(false)]
public partial class FolderNameEditor : UITypeEditor
{
private FolderBrowser? _folderBrowser;

public override object? EditValue(ITypeDescriptorContext? context, IServiceProvider provider, object? value)
{
Comment thread
SimonZhao888 marked this conversation as resolved.
if (_folderBrowser is null)
{
_folderBrowser = new FolderBrowser();
InitializeDialog(_folderBrowser);
}
// The dialog is created locally and disposed at the end of the call so its
// native resources (Component/CommonDialog state) are released, and no stale
// configuration leaks between successive invocations of EditValue.
using FolderBrowserDialog folderBrowserDialog = new();
InitializeDialog(folderBrowserDialog);

if (_folderBrowser.ShowDialog() == DialogResult.OK)
folderBrowserDialog.SelectedPath = value as string ?? string.Empty;

if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
return _folderBrowser.DirectoryPath;
return folderBrowserDialog.SelectedPath;
}

return value;
Expand All @@ -37,7 +37,17 @@ public partial class FolderNameEditor : UITypeEditor
/// Initializes the folder browser dialog when it is created. This gives you an opportunity
/// to configure the dialog as you please. The default implementation provides a generic folder browser.
/// </summary>
[Obsolete]
[EditorBrowsable(EditorBrowsableState.Never)]
protected virtual void InitializeDialog(FolderBrowser folderBrowser)
{
}

/// <summary>
/// Initializes the folder browser dialog when it is created. This gives you an opportunity
/// to configure the dialog as you please. The default implementation provides a generic folder browser.
/// </summary>
protected virtual void InitializeDialog(FolderBrowserDialog folderBrowserDialog)
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ namespace System.Windows.Forms.Design;
/// </summary>
internal class InitialDirectoryEditor : FolderNameEditor
{
protected override void InitializeDialog(FolderBrowser folderBrowser)
protected override void InitializeDialog(FolderBrowserDialog folderBrowserDialog)
{
folderBrowser.Description = SR.InitialDirectoryEditorLabel;
folderBrowserDialog.Description = SR.InitialDirectoryEditorLabel;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ namespace System.Windows.Forms.Design;
/// </summary>
internal class SelectedPathEditor : FolderNameEditor
{
protected override void InitializeDialog(FolderBrowser folderBrowser)
protected override void InitializeDialog(FolderBrowserDialog folderBrowserDialog)
{
folderBrowser.Description = SR.SelectedPathEditorLabel;
folderBrowserDialog.Description = SR.SelectedPathEditorLabel;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Licensed to the .NET Foundation under one or more agreements.
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable
Expand Down Expand Up @@ -38,71 +38,24 @@ public void FolderNameEditor_GetPaintValueSupported_Invoke_ReturnsFalse(ITypeDes
public void FolderNameEditor_InitializeDialog_Invoke_Nop()
{
SubFolderNameEditor editor = new();
editor.InitializeDialog();
}

public class FolderBrowserTests : FolderNameEditor
{
[Fact]
public void FolderBrowser_Ctor_Default()
{
FolderBrowser browser = new();
Assert.Empty(browser.DirectoryPath);
Assert.Empty(browser.Description);
Assert.Equal(FolderBrowserStyles.RestrictToFilesystem, browser.Style);
Assert.Equal(FolderBrowserFolder.Desktop, browser.StartLocation);
}

[Theory]
[NormalizedStringData]
public void FolderBrowser_Description_Set_GetReturnsExpected(string value, string expected)
{
FolderBrowser browser = new()
{
Description = value
};
Assert.Equal(expected, browser.Description);

// Set same.
browser.Description = value;
Assert.Equal(expected, browser.Description);
}

[Theory]
[EnumData<FolderBrowserFolder>]
[InvalidEnumData<FolderBrowserFolder>]
protected void FolderBrowser_StartLocation_Set_GetReturnsExpected(FolderBrowserFolder value)
{
FolderBrowser browser = new()
{
StartLocation = value
};
Assert.Equal(value, browser.StartLocation);
using FolderBrowserDialog dialog = new();

// Set same.
browser.StartLocation = value;
Assert.Equal(value, browser.StartLocation);
}
// The base implementation is intentionally a no-op; invoking it should not
// throw and should leave the dialog's defaults untouched.
string originalSelectedPath = dialog.SelectedPath;
string originalDescription = dialog.Description;
Environment.SpecialFolder originalRootFolder = dialog.RootFolder;

[Theory]
[EnumData<FolderBrowserStyles>]
[InvalidEnumData<FolderBrowserStyles>]
protected void FolderBrowser_Style_Set_GetReturnsExpected(FolderBrowserStyles value)
{
FolderBrowser browser = new()
{
Style = value
};
Assert.Equal(value, browser.Style);
editor.InitializeDialog(dialog);

// Set same.
browser.Style = value;
Assert.Equal(value, browser.Style);
}
Assert.Equal(originalSelectedPath, dialog.SelectedPath);
Assert.Equal(originalDescription, dialog.Description);
Assert.Equal(originalRootFolder, dialog.RootFolder);
}

private class SubFolderNameEditor : FolderNameEditor
{
public void InitializeDialog() => base.InitializeDialog(null);
public new void InitializeDialog(FolderBrowserDialog folderBrowserDialog) =>
base.InitializeDialog(folderBrowserDialog);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,21 @@ public void FolderNameEditor_EditValue_ReturnsExpected()

private class TestFolderNameEditor : FolderNameEditor
{
private FolderBrowser? _folderBrowser;
private FolderBrowserDialog? _folderBrowserDialog;

public override object? EditValue(ITypeDescriptorContext? context, IServiceProvider provider, object? value)
{
using DialogHostForm dialogOwnerForm = new();

if (_folderBrowser is null)
if (_folderBrowserDialog is null)
{
_folderBrowser = new FolderBrowser();
InitializeDialog(_folderBrowser);
_folderBrowserDialog = new FolderBrowserDialog();
InitializeDialog(_folderBrowserDialog);
}

if (_folderBrowser.ShowDialog(dialogOwnerForm) == DialogResult.OK)
if (_folderBrowserDialog.ShowDialog(dialogOwnerForm) == DialogResult.OK)
{
return _folderBrowser.DirectoryPath;
return _folderBrowserDialog.SelectedPath = value as string ?? string.Empty;
}
Comment thread
SimonZhao888 marked this conversation as resolved.

return value;
Expand Down
Loading