Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/Managed.Windows.Forms/System.Windows.Forms/FolderBrowserDialog.cs')
-rw-r--r--mcs/class/Managed.Windows.Forms/System.Windows.Forms/FolderBrowserDialog.cs442
1 files changed, 442 insertions, 0 deletions
diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/FolderBrowserDialog.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/FolderBrowserDialog.cs
new file mode 100644
index 00000000000..9ccc5954d4c
--- /dev/null
+++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/FolderBrowserDialog.cs
@@ -0,0 +1,442 @@
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (c) 2005-2006 Novell, Inc. (http://www.novell.com)
+//
+// Authors:
+// Alexander Olk (xenomorph2@onlinehome.de)
+//
+//
+
+// NOT COMPLETE
+// TODO:
+// - create new folder if NewFolderButton is pressed
+// - better handling of Environment.SpecialFolders
+// - fix: if SelectedPath != "" and it is beyond RootFolder then show it (currently TreeNode.EnsureVisible() is missing...)
+
+using System;
+using System.Drawing;
+using System.ComponentModel;
+using System.Resources;
+using System.IO;
+using System.Collections;
+
+namespace System.Windows.Forms
+{
+ [DefaultEvent("HelpRequest")]
+ [DefaultProperty("SelectedPath")]
+ [Designer("System.Windows.Forms.Design.FolderBrowserDialogDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
+ public sealed class FolderBrowserDialog : CommonDialog
+ {
+ #region Local Variables
+ private string description = "";
+ private Environment.SpecialFolder rootFolder = Environment.SpecialFolder.Desktop;
+ private string selectedPath = "";
+ private bool showNewFolderButton = true;
+
+ #endregion // Local Variables
+
+ #region Public Constructors
+ public FolderBrowserDialog( )
+ {
+ form = new FolderBrowserDialogForm( this );
+ form.Size = new Size( 322, 288 );
+ form.MinimumSize = new Size( 322, 288 );
+ form.Text = "Search Folder";
+ }
+ #endregion // Public Constructors
+
+ #region Public Instance Properties
+ [Browsable(true)]
+ [DefaultValue("")]
+ [Localizable(true)]
+ public string Description
+ {
+ set
+ {
+ description = value;
+ }
+
+ get
+ {
+ return description;
+ }
+ }
+
+ [Browsable(true)]
+ [DefaultValue(Environment.SpecialFolder.Desktop)]
+ [Localizable(false)]
+ public Environment.SpecialFolder RootFolder
+ {
+ set
+ {
+ rootFolder = value;
+ }
+
+ get
+ {
+ return rootFolder;
+ }
+ }
+
+ [Browsable(true)]
+ [DefaultValue("")]
+ [Editor("System.Windows.Forms.Design.SelectedPathEditor, " + Consts.AssemblySystem_Design, typeof(System.Drawing.Design.UITypeEditor))]
+ [Localizable(true)]
+ public string SelectedPath
+ {
+ set
+ {
+ selectedPath = value;
+ }
+
+ get
+ {
+ return selectedPath;
+ }
+ }
+
+ [Browsable(true)]
+ [DefaultValue(true)]
+ [Localizable(false)]
+ public bool ShowNewFolderButton
+ {
+ set
+ {
+ showNewFolderButton = value;
+ }
+
+ get
+ {
+ return showNewFolderButton;
+ }
+ }
+ #endregion // Public Instance Properties
+
+ #region Public Instance Methods
+ public override void Reset( )
+ {
+ description = "";
+ rootFolder = Environment.SpecialFolder.Desktop;
+ selectedPath = "";
+ showNewFolderButton = true;
+ }
+
+ protected override bool RunDialog( IntPtr hwndOwner )
+ {
+ FolderBrowserDialogPanel fb = new FolderBrowserDialogPanel (this);
+ form.Controls.Add (fb);
+ return true;
+ }
+ #endregion // Public Instance Methods
+
+ #region Internal Methods
+ internal class FolderBrowserDialogForm : DialogForm
+ {
+ internal FolderBrowserDialogForm( CommonDialog owner )
+ : base( owner )
+ {}
+
+ protected override CreateParams CreateParams
+ {
+ get
+ {
+ CreateParams cp;
+
+ ControlBox = true;
+ MinimizeBox = false;
+ MaximizeBox = false;
+
+ cp = base.CreateParams;
+ cp.Style = (int)( WindowStyles.WS_POPUP | WindowStyles.WS_CAPTION | WindowStyles.WS_SYSMENU | WindowStyles.WS_CLIPCHILDREN | WindowStyles.WS_CLIPSIBLINGS );
+ cp.Style |= (int)WindowStyles.WS_OVERLAPPEDWINDOW;
+
+ if (!is_enabled) {
+ cp.Style |= (int)(WindowStyles.WS_DISABLED);
+ }
+
+ return cp;
+ }
+ }
+ }
+
+ internal class FolderBrowserDialogPanel : Panel
+ {
+ private Label descriptionLabel;
+ private Button cancelButton;
+ private Button okButton;
+ private TreeView folderBrowserTreeView;
+ private Button newFolderButton;
+
+ private FolderBrowserDialog folderBrowserDialog;
+ private string selectedPath;
+
+ private ImageList imageList;
+ private TreeNode selectedPathNode = null;
+ private TreeNode root_node;
+
+ public FolderBrowserDialogPanel (FolderBrowserDialog folderBrowserDialog)
+ {
+ this.folderBrowserDialog = folderBrowserDialog;
+
+ newFolderButton = new Button( );
+ folderBrowserTreeView = new TreeView( );
+ okButton = new Button( );
+ cancelButton = new Button( );
+ descriptionLabel = new Label( );
+
+ imageList = new ImageList( );
+
+ folderBrowserDialog.form.AcceptButton = okButton;
+ folderBrowserDialog.form.CancelButton = cancelButton;
+
+ SuspendLayout( );
+
+ // descriptionLabel
+ descriptionLabel.Anchor = ( (AnchorStyles)( ( ( AnchorStyles.Top | AnchorStyles.Left )
+ | AnchorStyles.Right ) ) );
+ descriptionLabel.Location = new Point( 17, 14 );
+ descriptionLabel.Size = new Size( 290, 40 );
+ descriptionLabel.TabIndex = 0;
+ descriptionLabel.Text = folderBrowserDialog.Description;
+
+ // folderBrowserTreeView
+ folderBrowserTreeView.Anchor = ( (AnchorStyles)( ( ( ( AnchorStyles.Top | AnchorStyles.Bottom )
+ | AnchorStyles.Left )
+ | AnchorStyles.Right ) ) );
+ folderBrowserTreeView.ImageIndex = -1;
+ folderBrowserTreeView.Location = new Point( 20, 61 );
+ folderBrowserTreeView.SelectedImageIndex = -1;
+ folderBrowserTreeView.Size = new Size( 278, 153 );
+ folderBrowserTreeView.TabIndex = 1;
+ folderBrowserTreeView.ImageList = imageList;
+ folderBrowserTreeView.ShowLines = false;
+ folderBrowserTreeView.ShowPlusMinus = true;
+ folderBrowserTreeView.HotTracking = true;
+ //folderBrowserTreeView.Indent = 2;
+
+ // newFolderButton
+ newFolderButton.Anchor = ( (AnchorStyles)( ( AnchorStyles.Bottom | AnchorStyles.Left ) ) );
+ newFolderButton.FlatStyle = FlatStyle.System;
+ newFolderButton.Location = new Point( 14, 230 );
+ newFolderButton.Size = new Size( 125, 23 );
+ newFolderButton.TabIndex = 2;
+ newFolderButton.Text = "New Folder";
+ newFolderButton.Enabled = folderBrowserDialog.ShowNewFolderButton;
+
+ // okButton
+ okButton.Anchor = ( (AnchorStyles)( ( AnchorStyles.Bottom | AnchorStyles.Right ) ) );
+ okButton.FlatStyle = FlatStyle.System;
+ okButton.Location = new Point( 142, 230 );
+ okButton.Size = new Size( 80, 23 );
+ okButton.TabIndex = 3;
+ okButton.Text = "OK";
+
+ // cancelButton
+ cancelButton.Anchor = ( (AnchorStyles)( ( AnchorStyles.Bottom | AnchorStyles.Right ) ) );
+ cancelButton.DialogResult = DialogResult.Cancel;
+ cancelButton.FlatStyle = FlatStyle.System;
+ cancelButton.Location = new Point( 226, 230 );
+ cancelButton.Size = new Size( 80, 23 );
+ cancelButton.TabIndex = 4;
+ cancelButton.Text = "Cancel";
+
+ // FolderBrowserDialog
+ ClientSize = new Size( 322, 288 );
+ Dock = DockStyle.Fill;
+
+ Controls.Add( cancelButton );
+ Controls.Add( okButton );
+ Controls.Add( newFolderButton );
+ Controls.Add( folderBrowserTreeView );
+ Controls.Add( descriptionLabel );
+ ResumeLayout( false );
+
+ SetupImageList( );
+
+ okButton.Click += new EventHandler( OnClickOKButton );
+ cancelButton.Click += new EventHandler( OnClickCancelButton );
+
+ string root_path = Environment.GetFolderPath (folderBrowserDialog.RootFolder);
+ root_node = new TreeNode (Path.GetFileName (root_path));
+ root_node.Tag = root_path;
+ root_node.ImageIndex = NodeImageIndex (root_path);
+
+ // If we add the sub nodes before the root is added to the
+ // tree no refreshing will be done whil adding
+ if (folderBrowserDialog.RootFolder == Environment.SpecialFolder.Desktop) {
+
+
+ // Add something similar to 'My Computer'
+ TreeNode mycomp = new TreeNode ("My Computer");
+ if (Path.DirectorySeparatorChar == '/')
+ mycomp.Tag = "/";
+ else
+ mycomp.Tag = Environment.GetFolderPath (Environment.SpecialFolder.MyComputer);
+ mycomp.ImageIndex = NodeImageIndex ((string) mycomp.Tag);
+
+ // A home directory
+ string home_path = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
+ TreeNode home = new TreeNode (Path.GetFileName (home_path));
+ home.Tag = home_path;
+ home.ImageIndex = NodeImageIndex (home_path);
+
+ // This is so we get the expand box
+ mycomp.Nodes.Add (new TreeNode (String.Empty));
+ home.Nodes.Add (new TreeNode (String.Empty));
+
+ root_node.Nodes.Add (mycomp);
+ root_node.Nodes.Add (home);
+ root_node.Expand ();
+ } else {
+ FillNode (root_node);
+ }
+
+ folderBrowserTreeView.Nodes.Add (root_node);
+
+ folderBrowserTreeView.BeforeExpand += new TreeViewCancelEventHandler (OnBeforeExpand);
+ folderBrowserTreeView.AfterSelect += new TreeViewEventHandler( OnAfterSelectFolderBrowserTreeView );
+ }
+
+ public string SelectedPath
+ {
+ set
+ {
+ selectedPath = value;
+ }
+
+ get
+ {
+ return selectedPath;
+ }
+ }
+
+ void OnClickOKButton( object sender, EventArgs e )
+ {
+ folderBrowserDialog.SelectedPath = selectedPath;
+
+ folderBrowserDialog.form.Controls.Remove( this );
+ folderBrowserDialog.form.DialogResult = DialogResult.OK;
+ }
+
+ void OnClickCancelButton( object sender, EventArgs e )
+ {
+ folderBrowserDialog.form.Controls.Remove( this );
+ folderBrowserDialog.form.DialogResult = DialogResult.Cancel;
+ }
+
+ void OnAfterSelectFolderBrowserTreeView( object sender, TreeViewEventArgs e )
+ {
+ if (e.Node == null)
+ return;
+ selectedPath = (string) e.Node.Tag;
+ }
+
+ private void OnBeforeExpand (object sender, TreeViewCancelEventArgs e)
+ {
+ if (e.Node == root_node)
+ return;
+ FillNode (e.Node);
+ }
+
+ private void OnAfterCollapse (object sender, TreeViewCancelEventArgs e)
+ {
+ if (e.Node == root_node)
+ return;
+ e.Node.Nodes.Clear ();
+ }
+
+ private void FillNode (TreeNode node)
+ {
+ Cursor old = folderBrowserTreeView.Cursor;
+ folderBrowserTreeView.Cursor = Cursors.WaitCursor;
+
+ folderBrowserTreeView.BeginUpdate ();
+
+ node.Nodes.Clear ();
+ string path = node.Tag as string;
+ string [] dirs = Directory.GetDirectories (path);
+
+ foreach (string s in dirs) {
+ string name = Path.GetFileName (s);
+ // filter out . directories
+ if (name.StartsWith ("."))
+ continue;
+ TreeNode child = new TreeNode (name);
+ child.Tag = s;
+ child.ImageIndex = NodeImageIndex (s);
+
+ try {
+ // so we get the plus
+ string [] subdirs = Directory.GetDirectories (s);
+ foreach (string subdir in subdirs) {
+ // filter out . directories (le sigh)
+ string subdirname = Path.GetFileName (subdir);
+ if (!subdirname.StartsWith (".")) {
+ child.Nodes.Add (new TreeNode (String.Empty));
+ break;
+ }
+ }
+ } catch {
+ // Probably don't have access
+ }
+
+ node.Nodes.Add (child);
+ }
+
+ folderBrowserTreeView.EndUpdate ();
+ folderBrowserTreeView.Cursor = old;
+ }
+
+ private int NodeImageIndex( string path )
+ {
+ int index = 5;
+
+ if ( path == Environment.GetFolderPath( Environment.SpecialFolder.Desktop ) )
+ index = 1;
+ else
+ if ( path == Environment.GetFolderPath( Environment.SpecialFolder.Personal ) )
+ index = 2;
+
+ return index;
+ }
+
+ private void SetupImageList( )
+ {
+ imageList.ColorDepth = ColorDepth.Depth32Bit;
+ imageList.ImageSize = new Size( 16, 16 );
+ imageList.Images.Add( (Image)Locale.GetResource( "last_open" ) );
+ imageList.Images.Add( (Image)Locale.GetResource( "desktop" ) );
+ imageList.Images.Add( (Image)Locale.GetResource( "folder_with_paper" ) );
+ imageList.Images.Add( (Image)Locale.GetResource( "monitor-computer" ) );
+ imageList.Images.Add( (Image)Locale.GetResource( "monitor-planet" ) );
+ imageList.Images.Add( (Image)Locale.GetResource( "folder" ) );
+ imageList.Images.Add( (Image)Locale.GetResource( "paper" ) );
+ imageList.TransparentColor = Color.Transparent;
+ }
+ }
+ #endregion // Internal Methods
+
+ #region Events
+ [Browsable(false)]
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public event EventHandler HelpRequest;
+ #endregion
+ }
+}