Author: aolk
Date: 2005-04-20 13:10:51 -0400 (Wed, 20 Apr 2005)
New Revision: 43348

Modified:
   trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
   
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/FolderBrowserDialog.cs
Log:
2005-04-20  Alexander Olk  <[EMAIL PROTECTED]>
        * FolderBrowserDialog.cs:
        - Use a thread to fill the TreeView
        - Adjusted some sizes



Modified: trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
===================================================================
--- trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog        
2005-04-20 15:34:49 UTC (rev 43347)
+++ trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog        
2005-04-20 17:10:51 UTC (rev 43348)
@@ -1,3 +1,8 @@
+2005-04-20  Alexander Olk  <[EMAIL PROTECTED]>
+       * FolderBrowserDialog.cs:
+       - Use a thread to fill the TreeView
+       - Adjusted some sizes
+
 2005-04-19  Peter Bartok  <[EMAIL PROTECTED]>
 
        * LinkLabel.cs: (Re-)create the pieces when setting the Text
@@ -52,8 +57,8 @@
        * GridTableStylesCollection.cs: fixes name and constructor
        * DataGridTableStyle.cs: fixes
        * DataGridBoolColumn.cs: fixes names and constructors
-       * DataGrid.cs: define methods and properties. Some init implementations 
-       * DataGridCell.cs: define methods and properties. Some init 
implementations     
+       * DataGrid.cs: define methods and properties. Some init implementations
+       * DataGridCell.cs: define methods and properties. Some init 
implementations
        * GridTablesFactory.cs: Define methods and properties
 
 2005-04-15  Geoff Norton  <[EMAIL PROTECTED]>
@@ -76,7 +81,7 @@
 2005-04-13  Jordi Mas i Hernandez <[EMAIL PROTECTED]>
 
        * Form.cs: Pospone menu assignation if the window has not been created 
yet
-       * XplatUIWin32.cs: Fixes Win32SetWindowPos, then does not change window 
+       * XplatUIWin32.cs: Fixes Win32SetWindowPos, then does not change window
        size and position
 
 2005-04-12  Jackson Harper  <[EMAIL PROTECTED]>

Modified: 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/FolderBrowserDialog.cs
===================================================================
--- 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/FolderBrowserDialog.cs
   2005-04-20 15:34:49 UTC (rev 43347)
+++ 
trunk/mcs/class/Managed.Windows.Forms/System.Windows.Forms/FolderBrowserDialog.cs
   2005-04-20 17:10:51 UTC (rev 43348)
@@ -29,8 +29,6 @@
 // - 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...)
-// - start FillTreeView after every control is visible, not before...
-// - speed up reading of directories !?!
 
 using System;
 using System.Drawing;
@@ -38,6 +36,7 @@
 using System.Resources;
 using System.IO;
 using System.Collections;
+using System.Threading;
 
 namespace System.Windows.Forms
 {
@@ -50,12 +49,14 @@
                
                private FolderBrowserDialogPanel folderBrowserDialogPanel;
                
+               private bool treeViewFull = false;
+               
                #region Public Constructors
-               public FolderBrowserDialog()
+               public FolderBrowserDialog( )
                {
                        form = new FolderBrowserDialogForm( this );
                        
-                       form.Size =  new Size(322, 288);
+                       form.Size =  new Size( 322, 288 );
                        
                        form.MinimumSize = new Size( 322, 288 );
                        
@@ -135,9 +136,9 @@
                        selectedPath = "";
                        showNewFolderButton = true;
                        
-                       ResetPanelValues();
+                       ResetPanelValues( );
                }
-
+               
                private void ResetPanelValues( )
                {
                        folderBrowserDialogPanel.NewFolderButton.Enabled = true;
@@ -149,7 +150,11 @@
                protected override bool RunDialog( IntPtr hwndOwner )
                {
                        form.Controls.Add( folderBrowserDialogPanel );
-//                     folderBrowserDialogPanel.FillTreeView();
+                       if ( !treeViewFull )
+                       {
+                               folderBrowserDialogPanel.FillTreeView( );
+                               treeViewFull = true;
+                       }
                        return true;
                }
                #endregion      // Public Instance Methods
@@ -198,39 +203,49 @@
                        
                        private FolderBrowserTreeNode selectedPathNode = null;
                        
-                       public FolderBrowserDialogPanel( FolderBrowserDialog 
folderBrowserDialog)
+                       private string globalPath = "";
+                       
+                       private TreeNode globalTreeNode = null;
+                       
+                       private Thread reader_thread = null;
+                       
+                       public delegate void ThreadEventHandler( object sender, 
ThreadEventArgs e );
+                       
+                       private ThreadEventHandler OnThreadTreeViewUpdate;
+                       
+                       public FolderBrowserDialogPanel( FolderBrowserDialog 
folderBrowserDialog )
                        {
                                this.folderBrowserDialog = folderBrowserDialog;
                                
-                               newFolderButton = new Button();
-                               folderBrowserTreeView = new TreeView();
-                               okButton = new Button();
-                               cancelButton = new Button();
-                               descriptionLabel = new Label();
+                               newFolderButton = new Button( );
+                               folderBrowserTreeView = new TreeView( );
+                               okButton = new Button( );
+                               cancelButton = new Button( );
+                               descriptionLabel = new Label( );
                                
-                               imageList = new ImageList();
+                               imageList = new ImageList( );
                                
                                folderBrowserDialog.form.AcceptButton = 
okButton;
                                folderBrowserDialog.form.CancelButton = 
cancelButton;
                                
-                               SuspendLayout();
+                               SuspendLayout( );
                                
-                               // newFolderButton
-                               newFolderButton.Anchor = 
((AnchorStyles)((AnchorStyles.Bottom | AnchorStyles.Left)));
-                               newFolderButton.FlatStyle = FlatStyle.System;
-                               newFolderButton.Location = new Point(14, 256);
-                               newFolderButton.Size = new Size(125, 23);
-                               newFolderButton.TabIndex = 2;
-                               newFolderButton.Text = "New Folder";
+                               // 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 = "";
                                
                                // folderBrowserTreeView
-                               folderBrowserTreeView.Anchor = 
((AnchorStyles)((((AnchorStyles.Top | AnchorStyles.Bottom)
-                               | AnchorStyles.Left)
-                               | AnchorStyles.Right)));
+                               folderBrowserTreeView.Anchor = ( 
(AnchorStyles)( ( ( ( AnchorStyles.Top | AnchorStyles.Bottom )
+                               | AnchorStyles.Left )
+                               | AnchorStyles.Right ) ) );
                                folderBrowserTreeView.ImageIndex = -1;
-                               folderBrowserTreeView.Location = new Point(20, 
61);
+                               folderBrowserTreeView.Location = new Point( 20, 
61 );
                                folderBrowserTreeView.SelectedImageIndex = -1;
-                               folderBrowserTreeView.Size = new Size(290, 180);
+                               folderBrowserTreeView.Size = new Size( 278, 153 
);
                                folderBrowserTreeView.TabIndex = 1;
                                folderBrowserTreeView.ImageList = imageList;
                                folderBrowserTreeView.ShowLines = false;
@@ -238,49 +253,49 @@
                                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";
+                               
                                // okButton
-                               okButton.Anchor = 
((AnchorStyles)((AnchorStyles.Bottom | AnchorStyles.Right)));
+                               okButton.Anchor = ( (AnchorStyles)( ( 
AnchorStyles.Bottom | AnchorStyles.Right ) ) );
                                okButton.FlatStyle = FlatStyle.System;
-                               okButton.Location = new Point(147, 256);
-                               okButton.Size = new Size(80, 23);
+                               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.Anchor = ( (AnchorStyles)( ( 
AnchorStyles.Bottom | AnchorStyles.Right ) ) );
                                cancelButton.DialogResult = DialogResult.Cancel;
                                cancelButton.FlatStyle = FlatStyle.System;
-                               cancelButton.Location = new Point(234, 256);
-                               cancelButton.Size = new Size(80, 23);
+                               cancelButton.Location = new Point( 226, 230 );
+                               cancelButton.Size = new Size( 80, 23 );
                                cancelButton.TabIndex = 4;
                                cancelButton.Text = "Cancel";
                                
-                               // 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
-                               ClientSize = new Size(322, 288);
+                               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);
+                               Controls.Add( cancelButton );
+                               Controls.Add( okButton );
+                               Controls.Add( newFolderButton );
+                               Controls.Add( folderBrowserTreeView );
+                               Controls.Add( descriptionLabel );
+                               ResumeLayout( false );
                                
-                               SetupImageList();
+                               SetupImageList( );
                                
                                okButton.Click += new EventHandler( 
OnClickOKButton );
                                cancelButton.Click += new EventHandler( 
OnClickCancelButton );
                                
                                folderBrowserTreeView.AfterSelect += new 
TreeViewEventHandler( OnAfterSelectFolderBrowserTreeView );
                                
-                               VisibleChanged += new EventHandler( 
OnVisibleChanged );
+                               OnThreadTreeViewUpdate = new 
ThreadEventHandler( ThreadTreeViewUpdate );
                        }
                        
                        public Label DescriptionLabel
@@ -337,6 +352,8 @@
                        
                        void OnClickOKButton( object sender, EventArgs e )
                        {
+                               StopThread( );
+                               
                                folderBrowserDialog.SelectedPath = selectedPath;
                                
                                folderBrowserDialog.form.Controls.Remove( this 
);
@@ -345,6 +362,8 @@
                        
                        void OnClickCancelButton( object sender, EventArgs e )
                        {
+                               StopThread( );
+                               
                                folderBrowserDialog.form.Controls.Remove( this 
);
                                folderBrowserDialog.form.DialogResult = 
DialogResult.Cancel;
                        }
@@ -358,17 +377,11 @@
                                selectedPath = tn.FullPathName;
                        }
                        
-                       void OnVisibleChanged( object sender, EventArgs e )
-                       {
-                               if ( Visible )
-                                       FillTreeView();
-                       }
-                       
                        // FIXME
                        // this needs some work, because almost no paths are 
available for
                        // Environment.GetFolderPath( 
Environment.SpecialFolder.xxx)
                        // under non windows platforms !!!!!!!!!
-                       public void FillTreeView()
+                       public void FillTreeView( )
                        {
                                selectedPathNode = null;
                                
@@ -377,27 +390,28 @@
                                
                                if ( rootFolder == 
Environment.SpecialFolder.Desktop )
                                {
-                                       folderBrowserTreeView.BeginUpdate();
+                                       folderBrowserTreeView.BeginUpdate( );
                                        string path = 
Environment.GetFolderPath( rootFolder );
                                        FolderBrowserTreeNode node = new 
FolderBrowserTreeNode( Path.GetFileName( path ) );
                                        node.FullPathName = path;
                                        node.ImageIndex = 1;
                                        folderBrowserTreeView.Nodes.Add( node );
-                                       folderBrowserTreeView.EndUpdate();
+                                       folderBrowserTreeView.EndUpdate( );
                                        
-                                       folderBrowserTreeView.BeginUpdate();
-                                       GetAllSubDirs( 
Environment.GetFolderPath( Environment.SpecialFolder.Personal ), null );
-                                       folderBrowserTreeView.EndUpdate();
+                                       globalPath = Environment.GetFolderPath( 
Environment.SpecialFolder.Personal );
+                                       globalTreeNode = null;
                                        
+                                       StartThread( );
+                                       
 //                                     folderBrowserTreeView.BeginUpdate();
 //                                     GetAllSubDirs( 
Environment.GetFolderPath( Environment.SpecialFolder.MyComputer ), null );
 //                                     folderBrowserTreeView.EndUpdate();
                                }
                                else
                                {
-                                       folderBrowserTreeView.BeginUpdate();
+                                       folderBrowserTreeView.BeginUpdate( );
                                        GetAllSubDirs( 
Environment.GetFolderPath( rootFolder ), null );
-                                       folderBrowserTreeView.EndUpdate();
+                                       folderBrowserTreeView.EndUpdate( );
                                }
                                
                                if ( selectedPathNode != null )
@@ -407,9 +421,58 @@
                                
                                Cursor = oldCursor;
                        }
-       
-                       // recursive
-                       // slow, if there are a lot of sub directories.
+                       
+                       void StartThread( )
+                       {
+                               reader_thread = new Thread( new ThreadStart( 
ThreadFunc ) );
+                               reader_thread.Start( );
+                       }
+                       
+                       void StopThread( )
+                       {
+                               if ( reader_thread != null )
+                               {
+                                       // is there any other safe and clean
+                                       // way to stop a thread that calls a 
recursive
+                                       // method ??
+                                       // maybe throw some other exception...
+                                       reader_thread.Abort( );
+                                       reader_thread = null;
+                               }
+                       }
+                       
+                       void ThreadFunc( )
+                       {
+                               Console.WriteLine( "Starting thread..." );
+                               
+                               try
+                               {
+                                       
+                                       GetAllSubDirs( globalPath, 
globalTreeNode );
+                               }
+                               catch (ThreadAbortException)
+                               {
+                                       Console.WriteLine( "Thread aborted..." 
);
+                               }
+                               finally
+                               {
+                                       Console.WriteLine( "Leaving thread..." 
);
+                                       reader_thread = null;
+                               }
+                       }
+                       
+                       void ThreadTreeViewUpdate( object sender, 
ThreadEventArgs e )
+                       {
+                               if ( e.ParentTreeNode == null )
+                               {
+                                       folderBrowserTreeView.Nodes.Add( 
e.FolderBrowserTreeNode );
+                               }
+                               else
+                               {
+                                       e.ParentTreeNode.Nodes.Add( 
e.FolderBrowserTreeNode );
+                               }
+                       }
+                       
                        private void GetAllSubDirs( string path, TreeNode 
parent )
                        {
                                string shortname = Path.GetFileName( path );
@@ -423,33 +486,28 @@
                                if ( selectedPath == path )
                                {
                                        selectedPathNode = node;
-                                       //node.EnsureVisible();
+                                       node.EnsureVisible( );
                                }
                                
-                               if ( parent == null )
-                               {
-                                       node.ImageIndex = NodeImageIndex( path 
);
-                                       folderBrowserTreeView.Nodes.Add( node );
-                               }
-                               else
-                               {
-                                       node.ImageIndex = NodeImageIndex( path 
);
-                                       parent.Nodes.Add( node );
-                               }
+                               node.ImageIndex = NodeImageIndex( path );
                                
+                               BeginInvoke( OnThreadTreeViewUpdate, new 
object[] { this, new ThreadEventArgs( node, parent ) } );
+                               
+                               Thread.Sleep( 20 );
+                               
                                try
                                {
                                        string[] directories = 
Directory.GetDirectories( path );
-                               
-                                       foreach( string s in directories )
+                                       
+                                       foreach ( string s in directories )
                                                GetAllSubDirs( s, node );
                                }
                                catch ( Exception ex ) // if we have no 
permission
                                {
-                                       Console.WriteLine( ex.ToString() );
+                                       Console.WriteLine( ex.ToString( ) );
                                }
                        }
-
+                       
                        private int NodeImageIndex( string path )
                        {
                                int index = 5;
@@ -463,7 +521,7 @@
                                return index;
                        }
                        
-                       private void SetupImageList()
+                       private void SetupImageList( )
                        {
                                imageList.ColorDepth = ColorDepth.Depth32Bit;
                                imageList.ImageSize = new Size( 16, 16 );
@@ -477,12 +535,42 @@
                                imageList.TransparentColor = Color.Transparent;
                        }
                        
+                       public class ThreadEventArgs : EventArgs
+                       {
+                               FolderBrowserTreeNode folderBrowserTreeNode;
+                               
+                               TreeNode parentTreeNode;
+                               
+                               public FolderBrowserTreeNode 
FolderBrowserTreeNode
+                               {
+                                       get
+                                       {
+                                               return folderBrowserTreeNode;
+                                       }
+                               }
+                               
+                               public TreeNode ParentTreeNode
+                               {
+                                       get
+                                       {
+                                               return parentTreeNode;
+                                       }
+                               }
+                               
+                               public ThreadEventArgs( FolderBrowserTreeNode 
folderBrowserTreeNode, TreeNode parentTreeNode )
+                               {
+                                       this.folderBrowserTreeNode = 
folderBrowserTreeNode;
+                                       this.parentTreeNode = parentTreeNode;
+                               }
+                       }
+                       
                        internal class FolderBrowserTreeNode : TreeNode
                        {
                                private string fullPathName = "";
                                
                                public FolderBrowserTreeNode( string text )
-                               : base( text ) {}
+                               : base( text )
+                               {}
                                
                                public string FullPathName
                                {

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to