FileNameEditor

The FileNameEditor class lets you provide your users with a standard open file dialog box or save file dialog box from the CodeSmith property grid. To use this class, you must include a reference to the CodeSmith.CustomProperties assembly in your template. You'll make the code simpler if you import the namespace as well:

<%@ Assembly Name="CodeSmith.CustomProperties" %>
<%@ Import Namespace="CodeSmith.CustomProperties" %>

After you include the appropriate assembly reference, you can define a property in a script block that uses the FileNameEditor:

<script runat="template">
private string _userFileName = @"c:\temp\test.txt";
[Editor(typeof(FileNameEditor), typeof(System.Drawing.Design.UITypeEditor)),
Category("Custom"), Description("User selected file.")]
public string UserFileName
{
      get {return _userFileName;}
      set {_userFileName= value;}
}
</script>

When the user executes the template, the specified property will display a builder button on the property sheet:

Clicking the builder button will open the specified file dialog box:

You can customize the appearance of the file dialog box by applying the FileDialogAttribute to the property. For example, consider this property definition:

private string _openFileName = @"c:\temp\test.txt";
[Editor(typeof(FileNameEditor), typeof(System.Drawing.Design.UITypeEditor)),
FileDialogAttribute(FileDialogType.Open, Title="Select Input File"),
Category("Custom"), Description("User selected file.")]
public string OpenFileName
{
      get {return _openFileName;}
      set {_openFileName= value;}
}

The resulting file dialog box looks like this:

You can specify these properties in the FileDialogAttribute:

Property

Meaning

Default

FileDialogType

Save or Open

FileDialogType.Save

Filter

Filter string for file extensions

All Files (.)|*.*

Title

Dialog box title

Select propertyname

DefaultExtension

Default file extensions

None

CheckFileExists

True to only allow selecting existing files

False

CheckPathExists

True to only allow using existing paths

False

To select a folder name instead of a file name, use the FolderNameEditor class from the .NET Framework instead: 

<%@ Assembly Name="System.Design" %>
<script runat="template">
private string _outputDirectory = @"c:\temp";
[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor)),
Category("Custom"), Description("Output directory.")]
public string OutputDirectory
{
       get {return _outputDirectory;}
       set {_outputDirectory= value;}
}
</script>