sysperfana/heapanalyser/Libraries/UI/MemAnalysisUiLib/Forms/MemAnalysisStatisticalForm.cs
author Matti Laitinen <matti.t.laitinen@nokia.com>
Tue, 15 Jun 2010 12:47:20 +0300
changeset 8 15296fd0af4a
permissions -rw-r--r--
HeapAnalyser 1.1.0

/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
*   this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
*   this list of conditions and the following disclaimer in the documentation
*   and/or other materials provided with the distribution.
* - Neither the name of Nokia Corporation nor the names of its contributors
*   may be used to endorse or promote products derived from this software
*   without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* 
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using MemAnalysisLib;
using MemAnalysisLib.Parser;
using SymbianUtils.Settings;
using MemAnalysisLib.MemoryOperations.Class;
using MemAnalysisLib.MemoryOperations.Functions;
using MemAnalysisLib.MemoryOperations.Operations;
using MemAnalysisLib.Parser.Base;
using MemAnalysisLib.Parser.Implementations;

namespace MemAnalysisUiLib.Forms
{
	public class MemAnalysisStatisticalForm : System.Windows.Forms.Form
	{
		#region Windows Form Designer Code
        private System.Windows.Forms.Button iCloseButton;
        private System.Windows.Forms.Timer iTimerRefreshGrid;
        private XPTable.Models.TextColumn iGridCol_MemOp;
        private XPTable.Models.TextColumn iGridCol_LineNumber;
        private XPTable.Models.TextColumn iGridCol_CellAddr;
        private XPTable.Models.TextColumn iGridCol_AllocSize;
        private XPTable.Models.TextColumn iGridCol_Type;
        private XPTable.Models.TextColumn iGridCol_HeapSize;
        private XPTable.Models.TextColumn iGridCol_AssociatedOp;
        private XPTable.Models.ColumnModel iGrid_ColModel;
        private XPTable.Models.TableModel iGrid_TableModel;
        private MenuStrip menuStrip1;
        private ToolStripMenuItem iMenuItem_File;
        private SplitContainer iSplitContainer;
        private GroupBox groupBox32;
        private ListView iListView;
        private ColumnHeader iColHdrTotals;
        private ColumnHeader iColHdrObjectAllocCount;
        private ColumnHeader iColHdrObjectFreeCount;
        private ColumnHeader iColHdrTotalAllocSize;
        private ColumnHeader iColHdrFreedMemory;
        private ColumnHeader iColHdrNetAllocSize;
        private ColumnHeader iColHdrSymbolName;
        private GroupBox iMemAnalysisDetailedInfoForSymbolGroupBox;
        private XPTable.Models.Table iGrid;
        private ToolStripMenuItem iMenuItem_File_SaveAs;
        private ToolStripMenuItem iMenuItem_File_Exit;
        private Button iBT_CopyToClipboard;
		private System.ComponentModel.IContainer components;
		#endregion

		#region Constructors & destructor
		public MemAnalysisStatisticalForm( MemAnalysisParserBase aParser, XmlSettings aSettings )
		{
			InitializeComponent();

			System.Diagnostics.Debug.Assert( aParser is MemAnalysisStatisticalParser );
			iParser = (MemAnalysisStatisticalParser) aParser;
			iSettings = aSettings;
		}

		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if(components != null)
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}
		#endregion

		#region Windows Form Designer generated code
		private void InitializeComponent()
		{
            this.components = new System.ComponentModel.Container();
            this.iCloseButton = new System.Windows.Forms.Button();
            this.iTimerRefreshGrid = new System.Windows.Forms.Timer( this.components );
            this.iGrid_ColModel = new XPTable.Models.ColumnModel();
            this.iGridCol_MemOp = new XPTable.Models.TextColumn();
            this.iGridCol_LineNumber = new XPTable.Models.TextColumn();
            this.iGridCol_CellAddr = new XPTable.Models.TextColumn();
            this.iGridCol_Type = new XPTable.Models.TextColumn();
            this.iGridCol_AllocSize = new XPTable.Models.TextColumn();
            this.iGridCol_HeapSize = new XPTable.Models.TextColumn();
            this.iGridCol_AssociatedOp = new XPTable.Models.TextColumn();
            this.iGrid_TableModel = new XPTable.Models.TableModel();
            this.menuStrip1 = new System.Windows.Forms.MenuStrip();
            this.iMenuItem_File = new System.Windows.Forms.ToolStripMenuItem();
            this.iMenuItem_File_SaveAs = new System.Windows.Forms.ToolStripMenuItem();
            this.iMenuItem_File_Exit = new System.Windows.Forms.ToolStripMenuItem();
            this.iSplitContainer = new System.Windows.Forms.SplitContainer();
            this.groupBox32 = new System.Windows.Forms.GroupBox();
            this.iListView = new System.Windows.Forms.ListView();
            this.iColHdrTotals = new System.Windows.Forms.ColumnHeader();
            this.iColHdrObjectAllocCount = new System.Windows.Forms.ColumnHeader();
            this.iColHdrObjectFreeCount = new System.Windows.Forms.ColumnHeader();
            this.iColHdrTotalAllocSize = new System.Windows.Forms.ColumnHeader();
            this.iColHdrFreedMemory = new System.Windows.Forms.ColumnHeader();
            this.iColHdrNetAllocSize = new System.Windows.Forms.ColumnHeader();
            this.iColHdrSymbolName = new System.Windows.Forms.ColumnHeader();
            this.iMemAnalysisDetailedInfoForSymbolGroupBox = new System.Windows.Forms.GroupBox();
            this.iBT_CopyToClipboard = new System.Windows.Forms.Button();
            this.iGrid = new XPTable.Models.Table();
            this.menuStrip1.SuspendLayout();
            this.iSplitContainer.Panel1.SuspendLayout();
            this.iSplitContainer.Panel2.SuspendLayout();
            this.iSplitContainer.SuspendLayout();
            this.groupBox32.SuspendLayout();
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.SuspendLayout();
            ( (System.ComponentModel.ISupportInitialize) ( this.iGrid ) ).BeginInit();
            this.SuspendLayout();
            // 
            // iCloseButton
            // 
            this.iCloseButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
            this.iCloseButton.Location = new System.Drawing.Point( 439, 680 );
            this.iCloseButton.Name = "iCloseButton";
            this.iCloseButton.Size = new System.Drawing.Size( 75, 23 );
            this.iCloseButton.TabIndex = 51;
            this.iCloseButton.Text = "Close";
            this.iCloseButton.Click += new System.EventHandler( this.iCloseButton_Click );
            // 
            // iTimerRefreshGrid
            // 
            this.iTimerRefreshGrid.Interval = 200;
            this.iTimerRefreshGrid.Tick += new System.EventHandler( this.iTimerRefreshGrid_Tick );
            // 
            // iGrid_ColModel
            // 
            this.iGrid_ColModel.Columns.AddRange( new XPTable.Models.Column[] {
            this.iGridCol_MemOp,
            this.iGridCol_LineNumber,
            this.iGridCol_CellAddr,
            this.iGridCol_Type,
            this.iGridCol_AllocSize,
            this.iGridCol_HeapSize,
            this.iGridCol_AssociatedOp} );
            // 
            // iGridCol_MemOp
            // 
            this.iGridCol_MemOp.Text = "Op. #";
            this.iGridCol_MemOp.Width = 72;
            // 
            // iGridCol_LineNumber
            // 
            this.iGridCol_LineNumber.Text = "Line";
            this.iGridCol_LineNumber.Width = 62;
            // 
            // iGridCol_CellAddr
            // 
            this.iGridCol_CellAddr.Text = "Cell Addr.";
            this.iGridCol_CellAddr.Width = 62;
            // 
            // iGridCol_Type
            // 
            this.iGridCol_Type.Text = "Type";
            this.iGridCol_Type.Width = 110;
            // 
            // iGridCol_AllocSize
            // 
            this.iGridCol_AllocSize.Alignment = XPTable.Models.ColumnAlignment.Right;
            this.iGridCol_AllocSize.Text = "Alloc. Size";
            this.iGridCol_AllocSize.Width = 64;
            // 
            // iGridCol_HeapSize
            // 
            this.iGridCol_HeapSize.Alignment = XPTable.Models.ColumnAlignment.Right;
            this.iGridCol_HeapSize.Text = "Heap Size";
            this.iGridCol_HeapSize.Width = 64;
            // 
            // iGridCol_AssociatedOp
            // 
            this.iGridCol_AssociatedOp.Text = "Associated Op.";
            this.iGridCol_AssociatedOp.Width = 170;
            // 
            // menuStrip1
            // 
            this.menuStrip1.Items.AddRange( new System.Windows.Forms.ToolStripItem[] {
            this.iMenuItem_File} );
            this.menuStrip1.Location = new System.Drawing.Point( 0, 0 );
            this.menuStrip1.Name = "menuStrip1";
            this.menuStrip1.Size = new System.Drawing.Size( 738, 24 );
            this.menuStrip1.TabIndex = 53;
            this.menuStrip1.Text = "menuStrip1";
            // 
            // iMenuItem_File
            // 
            this.iMenuItem_File.DropDownItems.AddRange( new System.Windows.Forms.ToolStripItem[] {
            this.iMenuItem_File_SaveAs,
            this.iMenuItem_File_Exit} );
            this.iMenuItem_File.Name = "iMenuItem_File";
            this.iMenuItem_File.Size = new System.Drawing.Size( 35, 20 );
            this.iMenuItem_File.Text = "&File";
            // 
            // iMenuItem_File_SaveAs
            // 
            this.iMenuItem_File_SaveAs.Name = "iMenuItem_File_SaveAs";
            this.iMenuItem_File_SaveAs.Size = new System.Drawing.Size( 152, 22 );
            this.iMenuItem_File_SaveAs.Text = "Save &As...";
            this.iMenuItem_File_SaveAs.Click += new System.EventHandler( this.iMenuItem_File_SaveAs_Click );
            // 
            // iMenuItem_File_Exit
            // 
            this.iMenuItem_File_Exit.Name = "iMenuItem_File_Exit";
            this.iMenuItem_File_Exit.Size = new System.Drawing.Size( 152, 22 );
            this.iMenuItem_File_Exit.Text = "E&xit";
            this.iMenuItem_File_Exit.Click += new System.EventHandler( this.iMenuItem_File_Exit_Click );
            // 
            // iSplitContainer
            // 
            this.iSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
            this.iSplitContainer.Location = new System.Drawing.Point( 0, 24 );
            this.iSplitContainer.Name = "iSplitContainer";
            this.iSplitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
            // 
            // iSplitContainer.Panel1
            // 
            this.iSplitContainer.Panel1.Controls.Add( this.groupBox32 );
            // 
            // iSplitContainer.Panel2
            // 
            this.iSplitContainer.Panel2.Controls.Add( this.iMemAnalysisDetailedInfoForSymbolGroupBox );
            this.iSplitContainer.Size = new System.Drawing.Size( 738, 425 );
            this.iSplitContainer.SplitterDistance = 116;
            this.iSplitContainer.TabIndex = 54;
            // 
            // groupBox32
            // 
            this.groupBox32.Controls.Add( this.iListView );
            this.groupBox32.Dock = System.Windows.Forms.DockStyle.Fill;
            this.groupBox32.Location = new System.Drawing.Point( 0, 0 );
            this.groupBox32.Name = "groupBox32";
            this.groupBox32.Size = new System.Drawing.Size( 738, 116 );
            this.groupBox32.TabIndex = 51;
            this.groupBox32.TabStop = false;
            this.groupBox32.Text = "Memory Analysis by Symbol";
            // 
            // iListView
            // 
            this.iListView.Anchor = ( (System.Windows.Forms.AnchorStyles) ( ( ( ( System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom )
                        | System.Windows.Forms.AnchorStyles.Left )
                        | System.Windows.Forms.AnchorStyles.Right ) ) );
            this.iListView.Columns.AddRange( new System.Windows.Forms.ColumnHeader[] {
            this.iColHdrTotals,
            this.iColHdrObjectAllocCount,
            this.iColHdrObjectFreeCount,
            this.iColHdrTotalAllocSize,
            this.iColHdrFreedMemory,
            this.iColHdrNetAllocSize,
            this.iColHdrSymbolName} );
            this.iListView.Font = new System.Drawing.Font( "Lucida Sans Unicode", 7.25F );
            this.iListView.FullRowSelect = true;
            this.iListView.GridLines = true;
            this.iListView.Location = new System.Drawing.Point( 6, 16 );
            this.iListView.MultiSelect = false;
            this.iListView.Name = "iListView";
            this.iListView.Size = new System.Drawing.Size( 724, 94 );
            this.iListView.TabIndex = 47;
            this.iListView.UseCompatibleStateImageBehavior = false;
            this.iListView.View = System.Windows.Forms.View.Details;
            this.iListView.SelectedIndexChanged += new System.EventHandler( this.iListView_SelectedIndexChanged );
            // 
            // iColHdrTotals
            // 
            this.iColHdrTotals.Text = "";
            this.iColHdrTotals.Width = 57;
            // 
            // iColHdrObjectAllocCount
            // 
            this.iColHdrObjectAllocCount.Text = "Alloc. Count";
            this.iColHdrObjectAllocCount.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            this.iColHdrObjectAllocCount.Width = 83;
            // 
            // iColHdrObjectFreeCount
            // 
            this.iColHdrObjectFreeCount.Text = "Free\'d Count";
            this.iColHdrObjectFreeCount.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            this.iColHdrObjectFreeCount.Width = 81;
            // 
            // iColHdrTotalAllocSize
            // 
            this.iColHdrTotalAllocSize.Text = "Allocated Memory";
            this.iColHdrTotalAllocSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            this.iColHdrTotalAllocSize.Width = 100;
            // 
            // iColHdrFreedMemory
            // 
            this.iColHdrFreedMemory.Text = "Free\'d Memory";
            this.iColHdrFreedMemory.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            this.iColHdrFreedMemory.Width = 84;
            // 
            // iColHdrNetAllocSize
            // 
            this.iColHdrNetAllocSize.Text = "Net";
            this.iColHdrNetAllocSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            this.iColHdrNetAllocSize.Width = 108;
            // 
            // iColHdrSymbolName
            // 
            this.iColHdrSymbolName.Text = "Symbol Name";
            this.iColHdrSymbolName.Width = 362;
            // 
            // iMemAnalysisDetailedInfoForSymbolGroupBox
            // 
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.Controls.Add( this.iBT_CopyToClipboard );
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.Controls.Add( this.iGrid );
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.Location = new System.Drawing.Point( 0, 0 );
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.Name = "iMemAnalysisDetailedInfoForSymbolGroupBox";
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.Size = new System.Drawing.Size( 738, 305 );
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.TabIndex = 52;
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.TabStop = false;
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.Text = "Detailed Analysis for Symbol";
            // 
            // iBT_CopyToClipboard
            // 
            this.iBT_CopyToClipboard.Anchor = ( (System.Windows.Forms.AnchorStyles) ( ( ( System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left )
                        | System.Windows.Forms.AnchorStyles.Right ) ) );
            this.iBT_CopyToClipboard.Location = new System.Drawing.Point( 7, 270 );
            this.iBT_CopyToClipboard.Name = "iBT_CopyToClipboard";
            this.iBT_CopyToClipboard.Size = new System.Drawing.Size( 723, 31 );
            this.iBT_CopyToClipboard.TabIndex = 1;
            this.iBT_CopyToClipboard.Text = "Copy to Clipboard...";
            this.iBT_CopyToClipboard.UseVisualStyleBackColor = true;
            // 
            // iGrid
            // 
            this.iGrid.AlternatingRowColor = System.Drawing.Color.WhiteSmoke;
            this.iGrid.Anchor = ( (System.Windows.Forms.AnchorStyles) ( ( ( ( System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom )
                        | System.Windows.Forms.AnchorStyles.Left )
                        | System.Windows.Forms.AnchorStyles.Right ) ) );
            this.iGrid.ColumnModel = this.iGrid_ColModel;
            this.iGrid.Font = new System.Drawing.Font( "Microsoft Sans Serif", 7.25F );
            this.iGrid.FullRowSelect = true;
            this.iGrid.GridLines = XPTable.Models.GridLines.Both;
            this.iGrid.HeaderFont = new System.Drawing.Font( "Lucida Sans Unicode", 7.25F );
            this.iGrid.Location = new System.Drawing.Point( 7, 19 );
            this.iGrid.Name = "iGrid";
            this.iGrid.Size = new System.Drawing.Size( 723, 249 );
            this.iGrid.TabIndex = 0;
            this.iGrid.TableModel = this.iGrid_TableModel;
            this.iGrid.KeyDown += new System.Windows.Forms.KeyEventHandler( this.iGrid_KeyDown );
            this.iGrid.CellClick += new XPTable.Events.CellMouseEventHandler( this.iGrid_CellClick );
            // 
            // MemAnalysisStatisticalForm
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size( 5, 13 );
            this.ClientSize = new System.Drawing.Size( 738, 449 );
            this.Controls.Add( this.iSplitContainer );
            this.Controls.Add( this.iCloseButton );
            this.Controls.Add( this.menuStrip1 );
            this.Name = "MemAnalysisStatisticalForm";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "Memory Analysis";
            this.Load += new System.EventHandler( this.MemAnalysisForm_Load );
            this.menuStrip1.ResumeLayout( false );
            this.menuStrip1.PerformLayout();
            this.iSplitContainer.Panel1.ResumeLayout( false );
            this.iSplitContainer.Panel2.ResumeLayout( false );
            this.iSplitContainer.ResumeLayout( false );
            this.groupBox32.ResumeLayout( false );
            this.iMemAnalysisDetailedInfoForSymbolGroupBox.ResumeLayout( false );
            ( (System.ComponentModel.ISupportInitialize) ( this.iGrid ) ).EndInit();
            this.ResumeLayout( false );
            this.PerformLayout();

		}
		#endregion

		#region Event handlers
		private void MemAnalysisForm_Load(object sender, System.EventArgs e)
		{
			PrepareMemoryAnalysisData();
		}

		private void iCloseButton_Click(object sender, System.EventArgs e)
		{
			this.Close();
		}

		private void iTimerRefreshGrid_Tick(object sender, System.EventArgs e)
		{
			lock( this )
			{
				iTimerRefreshGrid.Enabled = false;
				iTimerRefreshGrid.Stop();
				UpdateMemoryAnalysisGridForSelectedSymbol();
			}
		}

		private void iListView_SelectedIndexChanged(object sender, System.EventArgs e)
		{
			if	( iListView.SelectedIndices.Count > 0 )
			{
				// Check the selected item isn't one of the footer (total) rows
				int selectedIndex = iListView.SelectedIndices[0];
				if	( selectedIndex >= 0 && selectedIndex < iListView.Items.Count - 2 )
				{
					// Start the timer - this will refresh the grid when it expires...
					lock( this )
					{
						iGridIsDirty = true;
						iStopPopulatingGrid = true;
						//
						iTimerRefreshGrid.Stop();
						iTimerRefreshGrid.Enabled = true;
						iTimerRefreshGrid.Start();
					}
				}
			}
		}

		private void iGrid_KeyDown(object sender, KeyEventArgs e)
		{
			if	( e.KeyCode == Keys.C && e.Control && iListView.SelectedIndices.Count > 0 )
			{
                XPTable.Models.Row[] rows = iGrid.SelectedItems;
                if ( rows.Length > 0 && rows[ 0 ].Tag != null && rows[ 0 ].Tag is MemOpBase )
                {
                    MemOpBase op = rows[ 0 ].Tag as MemOpBase;
                    //
                    Clipboard.SetDataObject( op.ToString(), true );
					e.Handled = true;
                }
			}
		}

        private void iGrid_CellClick( object sender, XPTable.Events.CellMouseEventArgs e )
        {
            if ( e.Cell.Tag != null && e.Cell.Tag is MemOpBase )
            {
				// Get the object & collection
				MemOpBase currentObject = (MemOpBase) e.Cell.Tag;
                MemObjStatisticalCollection collection = (MemObjStatisticalCollection) currentObject.Collection;

                // If we have a linked item, then we'll attempt to show it
                if ( currentObject.Link != null )
                {
                    MemOpBase linkedOp = currentObject.Link;

                    // We know that the linked item should be in the same collection - so search for it.
                    int rowIndex = 0;
                    foreach( XPTable.Models.Row row in iGrid.TableModel.Rows )
                    {
                        // The first row's tag has been setup to point to a MemOpBase object for the entire row.
                        MemOpBase rowTagEntry = (MemOpBase) row.Tag;
                        if ( rowTagEntry.CellAddress == linkedOp.CellAddress && 
                             rowTagEntry.OperationIndex == linkedOp.OperationIndex &&
                             rowTagEntry.AllocationNumber == linkedOp.AllocationNumber &&
                             rowTagEntry != currentObject )
                        {
                            // This is the one to focus to.
                            iGrid.TableModel.Selections.SelectCell( rowIndex, 5 );
                            iGrid.EnsureVisible( rowIndex, 5 );
                            iGrid.Select();
                            break;
                        }

                        // No match...
                        ++rowIndex;
                    }
                }
            }
        }

        private void iMenuItem_File_SaveAs_Click( object sender, EventArgs e )
        {

        }

        private void iMenuItem_File_Exit_Click( object sender, EventArgs e )
        {
            this.Close();
        }
        #endregion

		#region Internal methods
		private void PrepareMemoryAnalysisData()
		{
			try
			{
				Cursor.Current = Cursors.WaitCursor;
				iListView.Enabled = false;

				long totalAllocCount = 0;
				long totalFreeCount = 0;
				long totalAllocSize = 0;
				long totalFreeSize = 0;
				long totalNetSize = 0;

				// Ensure that each allocation-symbol is added to the symbol listbox
				MemObjStatisticalData data = iParser.Data;
				//
				iListView.BeginUpdate();
				int count = data.CollectionCount;
				for(int i=0; i<count; i++)
				{
					MemObjStatisticalCollection collection = data.CollectionAt( i );
					if	( collection.Count > 0 )
					{
						System.Diagnostics.Debug.Assert( collection[0] is MemOpAllocation );
						MemOpAllocation memObj = (MemOpAllocation) collection[0];
						//
						long allocCount = collection.AllocationCount;
						long freeCount = collection.DeallocationCount;
						long allocSize = collection.TotalAmountOfAllocatedMemory;
						long freeSize = collection.TotalAmountOfDeallocatedMemory;
						long netAllocSize = collection.TotalMemoryAllocatedButNotFreed;
						//
						ListViewItem item = new ListViewItem( "" );
						item.Tag = collection;
						item.SubItems.Add( allocCount.ToString() );
						item.SubItems.Add( freeCount.ToString() );
						item.SubItems.Add( allocSize.ToString() );
						item.SubItems.Add( freeSize.ToString() );
						item.SubItems.Add( netAllocSize.ToString() );
						string symbolText = "Unknown";
						if	( memObj.LinkRegisterSymbol != null && memObj.LinkRegisterSymbol.Symbol != null )
						{
							symbolText = memObj.LinkRegisterSymbol.Symbol.ToString();
						}
						item.SubItems.Add( symbolText );
						iListView.Items.Add( item );

						// Update totals
						totalAllocCount += allocCount;
						totalFreeCount += freeCount;
						totalAllocSize += allocSize;
						totalFreeSize += freeSize;
						totalNetSize += netAllocSize;
					}

					if	( count % 100 != 0 )
						Application.DoEvents();
				}
				iListView.EndUpdate();

				// Make the first item selected
				if	( iListView.Items.Count > 0 && iListView.SelectedIndices.Count == 0 )
				{
					// Add total item
					iListView.Items.Add( new ListViewItem( "" ) );
					//
					ListViewItem totalItem = new ListViewItem( "Totals:" );
					totalItem.SubItems.Add( totalAllocCount.ToString() );
					totalItem.SubItems.Add( totalFreeCount.ToString() );
					totalItem.SubItems.Add( totalAllocSize.ToString() );
					totalItem.SubItems.Add( totalFreeSize.ToString() );
					totalItem.SubItems.Add( totalNetSize.ToString() );
					totalItem.SubItems.Add( "" );
					iListView.Items.Add( totalItem );
					//
					iListView.Items[0].Selected = true;
					iListView.Select();
				}
			}
			finally
			{
				Cursor.Current = Cursors.Default;
				iListView.Enabled = true;
				iListView.Select();
			}
		}

        private void PopulateTableRows( MemObjStatisticalCollection aCollection )
        {
            // Clear existing content
            iGrid.BeginUpdate();
            iGrid.TableModel.Rows.Clear();
            iGrid.Tag = aCollection;

            // Make new content
            int count = aCollection.Count;
            for ( int i = 0; i < count; i++ )
            {
                // The entry we are rendering
                MemOpBase baseObject = aCollection[ i ];

                // Only initialised if we are dealing with an allocation (or realloc) type cell.
                MemOpAllocation memObj = null;

                // The color format for the entire row.
                System.Drawing.Color rowColor = Color.Black;

                // The row we are creating
                XPTable.Models.Row row = new XPTable.Models.Row();

                // Set tag for the row
                row.Tag = baseObject;

                // Common items
                // ============
                XPTable.Models.Cell opIndexCell = new XPTable.Models.Cell( baseObject.OperationIndex.ToString( "d6" ) );
                row.Cells.Add( opIndexCell );
                XPTable.Models.Cell lineNumberCell = new XPTable.Models.Cell( baseObject.LineNumber.ToString( "d6" ) );
                row.Cells.Add( lineNumberCell );
                XPTable.Models.Cell cellAddressCell = new XPTable.Models.Cell( baseObject.CellAddress.ToString( "x8" ) );
                row.Cells.Add( cellAddressCell );
                XPTable.Models.Cell functionCell = new XPTable.Models.Cell( " " + baseObject.FunctionName );
                row.Cells.Add( functionCell );

                // Row Color & Object Association
                // ==============================
                if ( baseObject is MemOpAllocation )
                {
                    // Allocation
                    memObj = (MemOpAllocation) baseObject;
                    rowColor = Color.Blue;
                }
                else if ( baseObject is MemOpFree )
                {
                    // Deallocation
                    if ( baseObject.Link != null )
                    {
                        memObj = (MemOpAllocation) baseObject.Link;
                    }
                    else
                    {
                        memObj = null;
                    }
                    rowColor = Color.Green;
                }
                else if ( baseObject is MemOpReallocation )
                {
                    // Reallocation
                    if ( baseObject.Link != null )
                    {
                        memObj = (MemOpAllocation) baseObject.Link;
                    }
                    else
                    {
                        memObj = null;
                    }
                    rowColor = Color.Purple;
                }

                // Allocation size
                // ===============
                string allocationSize = "???";
                if ( memObj != null )
                {
                    allocationSize = memObj.AllocationSize.ToString();
                }
                row.Cells.Add( new XPTable.Models.Cell( allocationSize + "  " ) );

                // Heap size
                // =========
                row.Cells.Add( new XPTable.Models.Cell( baseObject.HeapSize.ToString() + "  " ) );

                // Associated object
                // =================
                MemOpAllocation symbolObject = memObj;
                if ( memObj != null && baseObject.Link != null )
                {
                    // If we have an associated link item, we can connect the two items together
                    string associatedText = string.Empty;
                    if ( baseObject.IsAllocationType )
                    {
                        associatedText = "Free'd by op #:  " + baseObject.Link.OperationIndex.ToString( "d5" );
                    }
                    else if ( baseObject.IsReallocationType )
                    {
                        associatedText = "First alloc'd by op #: " + baseObject.Link.OperationIndex.ToString( "d5" );
                        symbolObject = ( baseObject.Link as MemOpAllocation );
                    }
                    else
                    {
                        associatedText = "Alloc'd by op #: " + baseObject.Link.OperationIndex.ToString( "d5" );
                    }

                    // We store the object with the cell so that we can handle hyperlinks between
                    // associated objects.
                    XPTable.Models.Cell associatedCell = new XPTable.Models.Cell( associatedText );
                    associatedCell.Tag = baseObject;

                    // Make it look like a hyperlink
                    associatedCell.Font = new Font( iGrid.Font.FontFamily.Name, iGrid.Font.SizeInPoints, System.Drawing.FontStyle.Underline );

                    // Add the cell to the row
                    row.Cells.Add( associatedCell );
                }
                else
                {
                    if ( baseObject.IsAllocationType )
                    {
                        if ( memObj != null )
                        {
                            symbolObject = memObj;
                        }

                        rowColor = Color.Red;
                        row.Font = new System.Drawing.Font( iGrid.Font.FontFamily.Name, iGrid.Font.SizeInPoints, System.Drawing.FontStyle.Regular );
                        row.Cells.Add( new XPTable.Models.Cell( "Object never free'd!" ) );
                    }
                    else
                    {
                        row.Cells.Add( new XPTable.Models.Cell( "???!" ) );
                    }
                }

                // Set row color
                // =============
                row.ForeColor = rowColor;

                // Add row
                // =======
                iGrid.TableModel.Rows.Add( row );

                // Event handling
                // ==============
                if ( i % 100 != 0 )
                {
                    Application.DoEvents();
                }
                lock ( this )
                {
                    if ( iStopPopulatingGrid )
                    {
                        break;
                    }
                }
            }

            // If no items, then dim table
            iGrid.Enabled = ( count > 0 );
            iGrid.EndUpdate();
        }

        private void UpdateMemoryAnalysisGridForSelectedSymbol()
		{
			lock( this )
			{
				iStopPopulatingGrid = false;
			}
			//
			try
			{
				Cursor.Current = Cursors.WaitCursor;
				//
				if	( iListView.SelectedIndices.Count > 0 )
				{
					MemObjStatisticalData data = iParser.Data;
					int selectedIndex = iListView.SelectedIndices[0];

					ListViewItem selectedItem = iListView.SelectedItems[ 0 ];
					if	( selectedItem.Tag != null )
					{
						MemObjStatisticalCollection collection = (MemObjStatisticalCollection) selectedItem.Tag;
						MemOpBase baseObject = collection[0];
						System.Diagnostics.Debug.Assert( baseObject is MemOpAllocation );
						MemOpAllocation memObj = (MemOpAllocation) baseObject;
						//
                        string symbolText = "Unknown";
						if	( memObj.LinkRegisterSymbol != null && memObj.LinkRegisterSymbol.Symbol != null )
						{
							symbolText = memObj.LinkRegisterSymbol.Symbol.ToString();
						}
						iMemAnalysisDetailedInfoForSymbolGroupBox.Text = @"Detailed Analysis for Symbol '" + symbolText + @"'";
						//
                        PopulateTableRows( collection );
					}
				}
			}
			catch(Exception)
			{
				iGridIsDirty = false;
			}
			finally
			{
				Cursor.Current = Cursors.Default;
				iStopPopulatingGrid = false;
				//iListView.Enabled = false;
				//iListView.Select();
			}

			lock( this )
			{
				iGridIsDirty = false;
			}
		}
		#endregion

		#region Data members
		private bool iGridIsDirty = false;
		private bool iStopPopulatingGrid;
		private MemAnalysisStatisticalParser iParser;
		private XmlSettings iSettings;
		#endregion
    }
}