using System;
using System.Diagnostics;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace PerfBrowser
{
	/// <summary>
	/// Summary description for Form1.
	/// </summary>
	public class MainForm : System.Windows.Forms.Form
	{
        private System.Windows.Forms.ColumnHeader col1;
        private System.Windows.Forms.ColumnHeader col2;
        private System.Windows.Forms.ComboBox comboBox;
        private System.Windows.Forms.ListView lvCounters;
        private System.Windows.Forms.TreeView tvCategories;
        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.Splitter splitter2;
        private System.Windows.Forms.Panel panel2;
		/// <summary>
		/// Required designer variable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public MainForm()
		{
			//
			// Required for Windows Form Designer support
			//
			InitializeComponent();
		}

		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
            this.lvCounters = new System.Windows.Forms.ListView();
            this.col1 = new System.Windows.Forms.ColumnHeader();
            this.col2 = new System.Windows.Forms.ColumnHeader();
            this.comboBox = new System.Windows.Forms.ComboBox();
            this.tvCategories = new System.Windows.Forms.TreeView();
            this.panel1 = new System.Windows.Forms.Panel();
            this.splitter2 = new System.Windows.Forms.Splitter();
            this.panel2 = new System.Windows.Forms.Panel();
            this.panel1.SuspendLayout();
            this.panel2.SuspendLayout();
            this.SuspendLayout();
            // 
            // lvCounters
            // 
            this.lvCounters.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right);
            this.lvCounters.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
                                                                                         this.col1,
                                                                                         this.col2});
            this.lvCounters.Cursor = System.Windows.Forms.Cursors.Default;
            this.lvCounters.Location = new System.Drawing.Point(0, 36);
            this.lvCounters.MultiSelect = false;
            this.lvCounters.Name = "lvCounters";
            this.lvCounters.Size = new System.Drawing.Size(468, 324);
            this.lvCounters.Sorting = System.Windows.Forms.SortOrder.Ascending;
            this.lvCounters.TabIndex = 2;
            this.lvCounters.View = System.Windows.Forms.View.Details;
            // 
            // col1
            // 
            this.col1.Text = "Name";
            this.col1.Width = 314;
            // 
            // col2
            // 
            this.col2.Text = "Value";
            this.col2.Width = 150;
            // 
            // comboBox
            // 
            this.comboBox.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right);
            this.comboBox.Location = new System.Drawing.Point(8, 8);
            this.comboBox.Name = "comboBox";
            this.comboBox.Size = new System.Drawing.Size(688, 21);
            this.comboBox.TabIndex = 2;
            this.comboBox.Text = ".";
            this.comboBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.comboBox_KeyDown);
            // 
            // tvCategories
            // 
            this.tvCategories.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right);
            this.tvCategories.ImageIndex = -1;
            this.tvCategories.Location = new System.Drawing.Point(8, 36);
            this.tvCategories.Name = "tvCategories";
            this.tvCategories.SelectedImageIndex = -1;
            this.tvCategories.Size = new System.Drawing.Size(212, 324);
            this.tvCategories.Sorted = true;
            this.tvCategories.TabIndex = 3;
            this.tvCategories.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvCategories_AfterSelect);
            // 
            // panel1
            // 
            this.panel1.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                                 this.tvCategories});
            this.panel1.Dock = System.Windows.Forms.DockStyle.Left;
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(220, 369);
            this.panel1.TabIndex = 0;
            // 
            // splitter2
            // 
            this.splitter2.Location = new System.Drawing.Point(220, 0);
            this.splitter2.Name = "splitter2";
            this.splitter2.Size = new System.Drawing.Size(8, 369);
            this.splitter2.TabIndex = 1;
            this.splitter2.TabStop = false;
            // 
            // panel2
            // 
            this.panel2.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                                 this.lvCounters});
            this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
            this.panel2.Location = new System.Drawing.Point(228, 0);
            this.panel2.Name = "panel2";
            this.panel2.Size = new System.Drawing.Size(476, 369);
            this.panel2.TabIndex = 3;
            // 
            // MainForm
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(704, 369);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.comboBox,
                                                                          this.panel2,
                                                                          this.splitter2,
                                                                          this.panel1});
            this.Name = "MainForm";
            this.Text = "Performance Browser";
            this.Load += new System.EventHandler(this.MainForm_Load);
            this.panel1.ResumeLayout(false);
            this.panel2.ResumeLayout(false);
            this.ResumeLayout(false);

        }
		#endregion

		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new MainForm());
		}

        private void RefreshContent()
        {
            // Clear everthing currently displayed in the app
            this.tvCategories.Nodes.Clear();
            this.lvCounters.Items.Clear();
            this.Refresh();

            // Suspend drawing until we're done
            this.tvCategories.BeginUpdate();

            try
            {
                PerformanceCounterCategory[] aPerfCat = PerformanceCounterCategory.GetCategories(this.comboBox.Text);

                foreach(PerformanceCounterCategory perfcat in aPerfCat)
                {
                    TreeNode nodeCat = new TreeNode(perfcat.CategoryName);
                    this.tvCategories.Nodes.Add(nodeCat);

                    try
                    {
                        String[] astrInstNames = perfcat.GetInstanceNames();

                        foreach(String strInstName in astrInstNames)
                            nodeCat.Nodes.Add(new TreeNode(strInstName));
                    }
                    catch(Exception ex)
                    {
                        Console.WriteLine(ex);
                    }
                }

                //this.tvCategories.SelectedNode.Index = 0;
            }
            catch(Exception)
            {
                this.lvCounters.Items.Add("Machine not found.");
            }

            // Resume drawing
            this.tvCategories.EndUpdate();
        }

        private void MainForm_Load(object sender, System.EventArgs e)
        {
            this.comboBox.Text = SystemInformation.ComputerName;
            this.RefreshContent();
        }

        private void comboBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            if(e.KeyCode == Keys.Enter)
                this.RefreshContent();
        }

        private void tvCategories_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
        {
            // Clear the listview to prep it for new data
            this.lvCounters.Items.Clear();

            // If a category was selected, that has multiple instances skip everything
            if(e.Node.Parent == null && e.Node.GetNodeCount(false) > 0)
                return;

            // If there are no instances just get the category name, otherwise get category and instance name
            String  strCategory;
            String  strInstance = null;

            if(e.Node.Parent == null)
            {
                strCategory = e.Node.Text;
            }
            else
            {
                strCategory = e.Node.Parent.Text;
                strInstance = e.Node.Text;
            }

            // Suspend drawing until we're done
            this.lvCounters.BeginUpdate();

            // Get the selected category
            PerformanceCounterCategory perfcat = new PerformanceCounterCategory(strCategory, this.comboBox.Text);

            try
            {
                InstanceDataCollectionCollection datacollcoll = perfcat.ReadCategory();

                foreach(InstanceDataCollection datacoll in datacollcoll.Values)
                {
                    foreach(InstanceData data in datacoll.Values)
                    {
                        if(strInstance == null || data.InstanceName == strInstance)
                        {
                            ListViewItem item = new ListViewItem(datacoll.CounterName);
                            item.SubItems.Add(data.RawValue.ToString());
                            this.lvCounters.Items.Add(item);
                            break;
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex);
            }

            // Result drawing
            this.lvCounters.EndUpdate();
        }
	}
}