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 |
|
Save or Open |
FileDialogType.Save |
|
Filter string for file extensions |
All Files (.)|*.* |
|
Dialog box title |
Select propertyname |
|
Default file extensions |
None |
|
True to only allow selecting existing files |
False |
|
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>