crashanalysercmd/UI/Plugins/CAPluginCrashAnalyserUi/Tabs/CATabCrashContainerSummary.cs
author Matti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:50:58 +0200
changeset 0 818e61de6cd1
permissions -rw-r--r--
Add initial version of Crash Analyser cmdline under EPL

/*
* Copyright (c) 2004-2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using CrashItemLib.Crash.Container;
using CrashItemLib.Crash.Source;
using CrashItemLib.Crash.Summarisable;
using XPTable.Models;
using CAPCrashAnalysis.Plugin;

namespace CAPluginCrashAnalysisUi.Tabs
{
    internal partial class CATabCrashContainerSummary : CATabCrashBase
    {
        #region Constructors
        public CATabCrashContainerSummary( CAPluginCrashAnalysis aSubEngine )
            : base( aSubEngine )
        {
            InitializeComponent();
        }
        #endregion

        #region Event handlers
        private void CASubControlCrashSummary_Load( object sender, EventArgs e )
        {
            UpdateTable();
            UpdateButtons();
        }

        private void iBT_Open_Click( object sender, EventArgs e )
        {
            if ( iTable.SelectedIndicies.Length > 0 )
            {
                int index = iTable.SelectedIndicies[ 0 ];
                CIContainer container = (CIContainer) iTableModel.Rows[ index ].Tag;
                //
                CATabCrashContainerExplorer control = new CATabCrashContainerExplorer( SubEngine, container );
                base.UIManager.UIManagerContentAdd( control );
            }
        }

        private void iBT_Open_All_Click( object sender, EventArgs e )
        {
            foreach ( CIContainer container in base.CrashItemEngine )
            {
                CATabCrashContainerExplorer control = new CATabCrashContainerExplorer( SubEngine, container );
                base.UIManager.UIManagerContentAdd( control );
            }
        }

        private void iBT_Close_Click( object sender, EventArgs e )
        {
            base.UIManager.UIManagerContentClose( this );
        }

        private void iTable_SelectionChanged( object sender, XPTable.Events.SelectionEventArgs e )
        {
            UpdateButtons();
        }
        #endregion

        #region Internal methods
        private void UpdateTable()
        {
            iTable.BeginUpdate();
            iTableModel.Rows.Clear();

            foreach ( CIContainer item in base.CrashItemEngine )
            {
                CISourceElement source = item.Source;

                // Main row
                Row row = new Row();
                row.Tag = item;

                // Cell: crash source file name
                Cell cFile = new Cell( source.MasterFileName );
                cFile.ForeColor = Color.Blue;
                cFile.ColSpan = iColModel.Columns.Count;
                cFile.Font = new Font( iTable.Font, FontStyle.Bold );
                row.Cells.Add( cFile );
                iTableModel.Rows.Add( row );

                // Sub-row
                int index = 1;
                int numberOfNonCrashingThreads = 0;
                CISummarisableEntityList list = item.Summaries;
                foreach ( CISummarisableEntity entity in list )
                {
                    if ( entity.IsAbnormalTermination )
                    {
                        Row subRow = new Row();
                        subRow.Tag = item; 

                        // Spacer
                        subRow.Cells.Add( new Cell() );

                        // Sub-cell: line number of crash item within source file
                        Cell scLineNumber = new Cell( index.ToString() );
                        if ( source.IsLineNumberAvailable )
                        {
                            scLineNumber.Text = source.LineNumber.ToString();
                        }
                        subRow.Cells.Add( scLineNumber );
                        ++index;

                        // Sub-cell: summary name (thread/stack name)
                        Cell scThreadName = new Cell( entity.Name );
                        subRow.Cells.Add( scThreadName );

                        // Sub-cell: summary exit info (for threads)
                        if ( entity.IsAvailable( CISummarisableEntity.TElement.EElementThread ) )
                        {
                            Cell scThreadExitInfo = new Cell( entity.Thread.ExitInfo.ToString() );
                            subRow.Cells.Add( scThreadExitInfo );
                        }

                        // Save subrow as a child of main row. *MUST* do this 
                        // after adding row to table model.
                        row.SubRows.Add( subRow );
                    }
                    else
                    {
                        ++numberOfNonCrashingThreads;
                    }
                }

                // If we saw other (non-crashed) threads, also include a count
                if ( numberOfNonCrashingThreads > 0 )
                {
                    Row subRow = new Row();
                    subRow.Tag = item; 

                    // Spacer
                    subRow.Cells.Add( new Cell() );

                    // Our text
                    string numberOfNonCrashingThreadsText = string.Format( "...plus {0} more running thread{1}", numberOfNonCrashingThreads, numberOfNonCrashingThreads != 1 ? "s" : string.Empty );
                    Cell cell = new Cell( numberOfNonCrashingThreadsText );
                    subRow.Cells.Add( cell );

                    // Spacer
                    subRow.Cells.Add( new Cell() );

                    // Spacer
                    subRow.Cells.Add( new Cell() );
                }
            }

            iTable.EndUpdate();
        }

        private void UpdateButtons()
        {
            iBT_Open.Enabled = ( iTable.TableModel.Selections.SelectedIndicies.Length > 0 );
            iBT_Open_All.Enabled = ( iTable.TableModel.Rows.Count > 0 );
        }
        #endregion

        #region Data members
        #endregion
    }
}