QueuePathDialog.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Services / Messaging / System / Messaging / Design / QueuePathDialog.cs / 1305376 / QueuePathDialog.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Messaging.Design { 
    using System.Messaging; 
    using System.Threading;
    using System.ComponentModel; 
    using System.ComponentModel.Design;
    using System.Diagnostics;
    using System;
    using System.Drawing; 
    using System.Windows.Forms;
    using System.Windows.Forms.Design; 
    using System.Windows.Forms.ComponentModel; 
    using System.Messaging.Interop;
    using System.Collections; 
    using System.Text;
    using System.Globalization;

    ///  
    /// 
    ///  
    ///  
    public class QueuePathDialog : Form {
        private static readonly string HELP_KEYWORD = "System.Messaging.Design.QueuePathDialog"; 

        private System.Windows.Forms.ImageList icons;

        private System.Windows.Forms.Button okButton; 

        private System.Windows.Forms.ComboBox pathType; 
 
        private System.Windows.Forms.TreeView enterprise;
 
        private System.Windows.Forms.Button helpButton;

        private System.Windows.Forms.Label selectLabel;
 
        private System.Windows.Forms.Label referenceLabel;
 
        private System.Windows.Forms.Button cancelButton; 

        private string path = String.Empty; 
        private string queuePath = String.Empty;
        private int lastPathType = 0;
        private bool exit;
        private MessageQueue selectedQueue; 
        private delegate void FinishPopulateDelegate(MessageQueue[] queues);
        private delegate void SelectQueueDelegate(MessageQueue queue, int pathTypeIndex); 
        private delegate void ShowErrorDelegate(); 
        private IUIService uiService;
        private IServiceProvider provider; 
        private Hashtable machinesTable = new Hashtable();

        private Thread populateThread = null;
        private bool closed = false; 
        private bool populateThreadRan = false;
 
        //Path prefixes 
        private static readonly string PREFIX_LABEL = "LABEL:";
        private static readonly string PREFIX_FORMAT_NAME = "FORMATNAME:"; 

        /// 
        /// 
        ///     Creates a path editor control. 
        ///     This will create also a tree view control, and an ImageList with
        ///     the icons. 
        ///  
        public QueuePathDialog(IServiceProvider provider)
        : base() { 
            this.uiService = (IUIService)provider.GetService(typeof(IUIService));
            this.provider = provider;
            this.InitializeComponent();
        } 

 
        ///  
        /// 
        ///     Creates a path editor control. 
        ///     This will create also a tree view control, and an ImageList with
        ///     the icons.
        /// 
        public QueuePathDialog(IUIService uiService) 
        : base() {
            this.uiService = uiService; 
            this.InitializeComponent(); 
        }
 
        /// 
        /// 
        ///    [To be supplied.]
        ///  
        public string Path {
            get { 
                return this.queuePath; 
            }
        } 

        private void AfterSelect(object source, TreeViewEventArgs e) {
            TreeNode node =  (TreeNode)e.Node;
            string[] nodeTexts = node.FullPath.Split(new char[]{'\\'}); 

            if (nodeTexts.Length == 2) { 
                StringBuilder path = new StringBuilder(); 
                path.Append(node.Parent.Text);
                path.Append("\\"); 
                path.Append(nodeTexts[1]);
                this.path = path.ToString();
                ChoosePath();
                exit = true; 
            }
        } 
 
        private void BeforeSelect(object source, TreeViewCancelEventArgs e) {
            TreeNode node = e.Node; 
            string[] nodeTexts = node.FullPath.Split(new char[]{'\\'});
            node.SelectedImageIndex = nodeTexts.Length - 1;
            exit = false;
        } 

        ///  
        ///  
        ///    [To be supplied.]
        ///  
 		[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1300:SpecifyMessageBoxOptions")]
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2102:CatchNonClsCompliantExceptionsInGeneralHandlers")]
		public void ChoosePath() {
            if (this.path != null && this.path != String.Empty) { 
                if (pathType.Text.CompareTo(Res.GetString(Res.RefByPath)) == 0) {
                    this.queuePath = this.path; 
                    this.lastPathType = this.pathType.SelectedIndex; 
                }
                else if (pathType.Text.CompareTo(Res.GetString(Res.RefByFormatName)) == 0) { 
                    MessageQueue queue = new MessageQueue(this.path);
                    this.queuePath = PREFIX_FORMAT_NAME + queue.FormatName;
                    this.lastPathType = this.pathType.SelectedIndex;
                } 
                else {
                    MessageQueue queue = new MessageQueue(this.path); 
                    string tempPath = PREFIX_LABEL + queue.Label; 
                    try {
                        MessageQueue validate = new MessageQueue(tempPath); 
                        string stringValidate = validate.FormatName;
                        this.queuePath = tempPath;
                        this.lastPathType = this.pathType.SelectedIndex;
                    } 
					// validate.FormatName can result in a deep stack, making it diffucult
					// to enumerate all exception types that can be thrown. At the same time, 
 					// we dont want to catch non-CLS exceptions to make users aware of them 
					// (since this is design time). Hence, SuppressMessage above
                    catch (Exception e) { 
                        if (this.queuePath != null && String.Compare(this.queuePath, tempPath, true, CultureInfo.InvariantCulture) != 0)  {
                            exit = false;
                            if (uiService != null)
                                uiService.ShowError(e.Message); 
                            else
                                MessageBox.Show(e.Message, String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error); 
 
                            if (this.queuePath == String.Empty) {
                                this.queuePath = this.path; 
                                this.lastPathType = 0;
                            }

                            OnSelectQueue(new MessageQueue(this.queuePath), this.lastPathType); 
                        }
                    } 
                } 
            }
        } 

        /// 
        /// 
        ///    [To be supplied.] 
        /// 
        // Supressing FxCop violations since it is breaking change 
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")] 
        public void DoubleClicked(object source, EventArgs e) {
            if (exit) { 
                this.Close();
                this.DialogResult = DialogResult.OK;
            }
        } 

        private void IndexChanged(object source, EventArgs e) { 
            ChoosePath(); 
        }
 
        private void InitializeComponent() {
            System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(QueuePathDialog));
            this.icons = new ImageList();
            this.okButton = new System.Windows.Forms.Button(); 
            this.pathType = new System.Windows.Forms.ComboBox();
            this.enterprise = new System.Windows.Forms.TreeView(); 
            this.helpButton = new System.Windows.Forms.Button(); 
            this.selectLabel = new System.Windows.Forms.Label();
            this.referenceLabel = new System.Windows.Forms.Label(); 
            this.cancelButton = new System.Windows.Forms.Button();
            this.okButton.Location = ((System.Drawing.Point)(resources.GetObject("okButton.Location")));
            this.okButton.Size = ((System.Drawing.Size)(resources.GetObject("okButton.Size")));
            this.okButton.TabIndex = ((int)(resources.GetObject("okButton.TabIndex"))); 
            this.okButton.Text = resources.GetString("okButton.Text");
            this.okButton.DialogResult = DialogResult.OK; 
            this.pathType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 
            this.pathType.DropDownWidth = 264;
            this.pathType.Items.Add(Res.GetString(Res.RefByPath)); 
            this.pathType.Items.Add(Res.GetString(Res.RefByFormatName));
            this.pathType.Items.Add(Res.GetString(Res.RefByLabel));
            this.pathType.SelectedIndex = 0;
            this.pathType.Location = ((System.Drawing.Point)(resources.GetObject("pathType.Location"))); 
            this.pathType.Size = ((System.Drawing.Size)(resources.GetObject("pathType.Size")));
            this.pathType.TabIndex = ((int)(resources.GetObject("pathType.TabIndex"))); 
            this.pathType.SelectedIndexChanged += new System.EventHandler(this.IndexChanged); 
            this.enterprise.HideSelection = false;
            this.enterprise.ImageIndex = -1; 
            this.enterprise.Location = ((System.Drawing.Point)(resources.GetObject("enterprise.Location")));
            this.enterprise.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {new System.Windows.Forms.TreeNode(Res.GetString(Res.PleaseWait))});
            this.enterprise.SelectedImageIndex = -1;
            this.enterprise.Size = ((System.Drawing.Size)(resources.GetObject("enterprise.Size"))); 
            this.enterprise.Sorted = true;
            this.enterprise.TabIndex = ((int)(resources.GetObject("enterprise.TabIndex"))); 
            this.enterprise.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.AfterSelect); 
            this.enterprise.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.BeforeSelect);
            this.enterprise.DoubleClick += new System.EventHandler(this.DoubleClicked); 
            this.enterprise.ImageList = icons;
            this.helpButton.Location = ((System.Drawing.Point)(resources.GetObject("helpButton.Location")));
            this.helpButton.Size = ((System.Drawing.Size)(resources.GetObject("helpButton.Size")));
            this.helpButton.TabIndex = ((int)(resources.GetObject("helpButton.TabIndex"))); 
            this.helpButton.Text = resources.GetString("helpButton.Text");
            this.helpButton.Click += new System.EventHandler(this.OnClickHelpButton); 
            this.icons.Images.Add(new Bitmap(typeof(MessageQueue), "Machine.bmp")); 
            this.icons.Images.Add(new Bitmap(typeof(MessageQueue), "PublicQueue.bmp"));
            this.selectLabel.Location = ((System.Drawing.Point)(resources.GetObject("selectLabel.Location"))); 
            this.selectLabel.Size = ((System.Drawing.Size)(resources.GetObject("selectLabel.Size")));
            this.selectLabel.TabIndex = ((int)(resources.GetObject("selectLabel.TabIndex")));
            this.selectLabel.Text = resources.GetString("selectLabel.Text");
            this.referenceLabel.Location = ((System.Drawing.Point)(resources.GetObject("referenceLabel.Location"))); 
            this.referenceLabel.Size = ((System.Drawing.Size)(resources.GetObject("referenceLabel.Size")));
            this.referenceLabel.TabIndex = ((int)(resources.GetObject("referenceLabel.TabIndex"))); 
            this.referenceLabel.Text = resources.GetString("referenceLabel.Text"); 
            this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
            this.cancelButton.Location = ((System.Drawing.Point)(resources.GetObject("cancelButton.Location"))); 
            this.cancelButton.Size = ((System.Drawing.Size)(resources.GetObject("cancelButton.Size")));
            this.cancelButton.TabIndex = ((int)(resources.GetObject("cancelButton.TabIndex")));
            this.cancelButton.Text = resources.GetString("cancelButton.Text");
            this.cancelButton.DialogResult = DialogResult.Cancel; 
            this.HelpRequested += new HelpEventHandler(this.OnHelpRequested);
            this.AcceptButton = this.okButton; 
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6.0F, 14.0F);
            this.CancelButton = this.cancelButton; 
            this.ClientSize = ((System.Drawing.Size)(resources.GetObject("$this.ClientSize")));
            this.Controls.AddRange(new System.Windows.Forms.Control[] {this.helpButton,
                        this.cancelButton,
                        this.okButton, 
                        this.pathType,
                        this.referenceLabel, 
                        this.enterprise, 
                        this.selectLabel});
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "Win32Form1";
            this.ShowInTaskbar = false; 
            this.StartPosition = FormStartPosition.CenterParent;
            this.Text = resources.GetString("$this.Text"); 
            this.lastPathType = 0; 
            this.Icon = null;
        } 

        // PopulateThread calls BeginInvoke in case of failure. BeginInvoke requires window handle
        // to exist for this Form. Therefore, PopulateThread can be called safely only after handle is created
        // Call it in OnHandleCreated event handler 
        private void PopulateThread() {
            try { 
                IEnumerator messageQueues = MessageQueue.GetMessageQueueEnumerator(); 
                bool locate = true;
                while (locate) { 
                    MessageQueue[] queues = new MessageQueue[100];
                    for (int index = 0; index < queues.Length; ++index) {
                        if (messageQueues.MoveNext())
                            queues[index] = (MessageQueue)messageQueues.Current; 
                        else {
                            queues[index] = null; 
                            locate = false; 
                        }
                    } 

                    this.BeginInvoke(new FinishPopulateDelegate(this.OnPopulateTreeview), new object[]{queues});
                }
            } 
            catch {
                if (!this.closed) 
                    this.BeginInvoke(new ShowErrorDelegate(this.OnShowError), null); 
            }
 
            if (!this.closed)
                this.BeginInvoke(new SelectQueueDelegate(this.OnSelectQueue), new object[]{this.selectedQueue, 0});
        }
 
        /// 
        ///  
        ///    [To be supplied.] 
        /// 
        public void SelectQueue(MessageQueue queue) { 
            this.selectedQueue = queue;
        }

        private void OnHelpRequested(object sender, HelpEventArgs e) { 
            OnClickHelpButton(null, null);
        } 
 
        private void OnClickHelpButton(object source, EventArgs e) {
            if (this.provider != null) { 
                IHelpService helpService = (IHelpService)provider.GetService(typeof(IHelpService));
                if (helpService != null) {
                    helpService.ShowHelpFromKeyword(HELP_KEYWORD);
                } 
            }
        } 
 

        protected override void OnFormClosing(FormClosingEventArgs e) { 
            this.closed = true;

            if (populateThread != null) {
                populateThread.Abort(); 
            }
 
            base.OnFormClosing(e); 
        }
 

        protected override void OnHandleCreated(EventArgs e) {
            // Window handle has been created, so it's safe to call PopulateThread now.
            // However, OnHandleCreated can be called multiple times during Form's life-time. 
            // So we need to ensure that PopulateThread runs only once.
            // ( [....] May 27 2005. Whidbey 463310 ) 
            if (!populateThreadRan) { 
                populateThreadRan = true;
                populateThread = new Thread(new ThreadStart(this.PopulateThread)); 
                populateThread.Start();
            }

            base.OnHandleCreated(e); 
        }
 
 
        private void OnPopulateTreeview(MessageQueue[] queues) {
            if (queues == null || queues.Length == 0) { 
                return;
            }

            if (machinesTable.Count == 0) 
                enterprise.Nodes.Clear();
 
            for (int index = 0; index < queues.Length; ++ index) { 
                if (queues[index] != null) {
                    string machineName = queues[index].MachineName; 
                    TreeNode machineNode = null;
                    if (machinesTable.ContainsKey(machineName))
                        machineNode = (TreeNode)machinesTable[machineName];
                    else { 
                        machineNode = enterprise.Nodes.Add(machineName);
                        machinesTable[machineName] = machineNode; 
                    } 

                    machineNode.Nodes.Add(queues[index].QueueName).ImageIndex = 1; 
                }
            }
        }
 
 		
 		[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1300:SpecifyMessageBoxOptions")] 
        private void OnShowError() { 
            if (uiService != null)
                uiService.ShowError(Res.GetString(Res.QueueNetworkProblems)); 
            else
                MessageBox.Show(Res.GetString(Res.QueueNetworkProblems), String.Empty, MessageBoxButtons.OK, MessageBoxIcon.Error);

            this.DialogResult = DialogResult.Cancel; 
            this.Close();
        } 
 
        private void OnSelectQueue(MessageQueue queue, int pathTypeIndex) {
            try { 
                pathType.SelectedIndex = pathTypeIndex;
                string machineName = queue.MachineName;
                string queueName = queue.QueueName;
                TreeNodeCollection machines = enterprise.Nodes; 
                for (int index = 0; index < machines.Count; ++ index) {
                    TreeNode machine = machines[index]; 
                    if ( String.Compare(machineName, machine.Text, true, CultureInfo.InvariantCulture) == 0) { 
                        machine.Expand();
                        //Need to flush all events so that the children nodes get added. 
                        Application.DoEvents();
                        TreeNodeCollection queues = machine.Nodes;
                        for (int index2 = 0; index2 < queues.Count; ++ index2) {
                            TreeNode queueNode = queues[index2]; 
                            if (queueNode.Text != null && String.Compare(queueName, queueNode.Text, true, CultureInfo.InvariantCulture) == 0) {
                                enterprise.SelectedNode = queueNode; 
                                return; 
                            }
                        } 
                        return;
                    }
                }
            } 
            catch {
                //Ignore all Exceptions. 
            } 
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK