crashanalysis/crashanalyser/com.nokia.s60tools.crashanalyser/src/com/nokia/s60tools/crashanalyser/ui/editors/CodesegmentsPage.java
author Jussi Ryoma <ext-jussi.s.ryoma@nokia.com>
Tue, 20 Apr 2010 14:41:43 +0300
changeset 4 615035072f7e
permissions -rw-r--r--
Crash Analyser Carbide extension v1.3

/*
* Copyright (c) 2010 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:
*
*/
package com.nokia.s60tools.crashanalyser.ui.editors;

import java.util.List;

import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.PlatformUI;

import com.nokia.s60tools.crashanalyser.containers.CodeSegment;
import com.nokia.s60tools.crashanalyser.containers.Process;
//import com.nokia.s60tools.crashanalyser.containers.Thread;
import com.nokia.s60tools.crashanalyser.files.CrashFile;
import com.nokia.s60tools.crashanalyser.files.SummaryFile;
import com.nokia.s60tools.crashanalyser.resources.HelpContextIDs;
import com.nokia.s60tools.crashanalyser.ui.viewers.CodeSegmentsTableViewer;

public class CodesegmentsPage {

	// code segments group UI items
	Table tableCodeSegments;
	CodeSegmentsTableViewer tableViewerCodeSegments;

	FontRegistry fontRegistry;
	SummaryFile crashFile;
	Process selectedProcess = null;
//	Thread selectedThread = null;

	/**
	 * Creates the page
	 * @param parent composite
	 * @param file summary file
	 * @return composite
	 */
	public Composite createPage(Composite parent, SummaryFile file) {
		crashFile = file;
		return doCreatePage(parent);
	}
	
	/**
	 * Creates the page
	 * @param parent composite
	 * @return composite
	 */
	public Composite createPage(Composite parent) {
		return doCreatePage(parent);
	}
	
	/**
	 * Loads data from given file into UI elements.
	 * @param file crash file
	 */
	public void setFile(CrashFile file) {
		if (file != null) {
			crashFile = file;
//			initialUserRegistersTableLoad();
			loadCodeSegmentsTable();
//			loadEventLogTable();
//			initialCpsrDetailsTableLoad();
		}
	}
	
	/**
	 * Creates all UI elements to the page
	 * @param parent
	 * @return composite
	 */
	Composite doCreatePage(Composite parent) {
		GridLayout layout = new GridLayout();
		layout.numColumns = 1;
		parent.setLayout(layout);
		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
		
		fontRegistry = new FontRegistry(Display.getCurrent());
		fontRegistry.put("monospace", new FontData[]{new FontData("Courier", 8, SWT.NORMAL)});

		SashForm sashFormMain = new SashForm(parent, SWT.VERTICAL);
		sashFormMain.setLayoutData(new GridData(GridData.FILL_BOTH));
		createCodeSegmentsGroup(sashFormMain);
		
		/*
		SashForm sashFormTop = new SashForm(sashFormMain, SWT.HORIZONTAL);
		createRegistersGroup(sashFormTop);
		createCodeSegmentsGroup(sashFormTop);
		SashForm sashFormBottom = new SashForm(sashFormMain, SWT.HORIZONTAL);
		createEventLogGroup(sashFormBottom);
		createCpsrDetailsGroup(sashFormBottom);
		
		sashFormTop.setWeights(new int[]{3,2});
		sashFormBottom.setWeights(new int[]{3,7});
			*/
		setHelps();
		
		return parent;
	}
	
	
	/**
	 * Creates code segments group
	 * @param parent
	 */
	void createCodeSegmentsGroup(Composite parent) {
		Group groupCodeSegments = new Group(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.numColumns = 1;
		groupCodeSegments.setLayout(layout);
		groupCodeSegments.setText("Code Segments");
		GridData groupGD = new GridData();
		groupCodeSegments.setLayoutData(groupGD);
		
		tableCodeSegments = new Table(groupCodeSegments, SWT.BORDER);
		tableCodeSegments.setHeaderVisible(true);
		GridData tableGd = new GridData(GridData.FILL_BOTH);
		tableCodeSegments.setLayoutData(tableGd);
		
		tableViewerCodeSegments = new CodeSegmentsTableViewer(tableCodeSegments);
		tableCodeSegments.setFont(fontRegistry.get("monospace"));
		
		loadCodeSegmentsTable();
		AutoSizeTableCells(tableCodeSegments);
		
	}

	/**
	 * Loads code segments to table
	 */
	void loadCodeSegmentsTable() {
		if (crashFile == null) {
			return;
		}
		
		if (crashFile.getThread() != null) {
			selectedProcess = crashFile.getProcessByThread(crashFile.getThread().getId());
		} else {
			selectedProcess = crashFile.getCrashedProcess();
		}
		
		if (selectedProcess == null)
			return;
		
		List<CodeSegment> codeSegments = selectedProcess.getCodeSegments();
		if (codeSegments != null && !codeSegments.isEmpty()) {
			for (int i = 0; i < codeSegments.size(); i++) {
				CodeSegment codeSegment = codeSegments.get(i);
				newCodeSegmentsTableItem(codeSegment);
			}
		}
		
		AutoSizeTableCells(tableCodeSegments);
	}

	/**
	 * Adds a new table row for code segments table
	 * @param codeSegment
	 */
	void newCodeSegmentsTableItem(CodeSegment codeSegment) {
		TableItem item = new TableItem(tableCodeSegments, SWT.NONE);
		String segmentRange = codeSegment.getSegmentRange();
		String base = "";
		String top = "";
		try {
			// segment range is of format: XXXXX-YYYYY, parse this to XXXXX and YYYYY
			if (segmentRange.contains("-")) {
				top = segmentRange.substring(segmentRange.indexOf('-')+1);
				base = segmentRange.substring(0, segmentRange.indexOf('-'));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		item.setText(new String[] {base, top, codeSegment.getSegmentName()});
		
		// code segment should be highlighted if there was some problem with the code section
		// while creating data
		if (codeSegment.shouldBeHighlighted()) {
			item.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_MAGENTA));
		}
		item.setData(codeSegment);
	}

	/**
	 * Packs all columns for given table
	 * @param table table which columns are to be packed
	 */
	void AutoSizeTableCells(Table table) {
		for (int i = 0; i < table.getColumnCount(); i++) {
			table.getColumn(i).pack();
		}
	}

	/**
	 * Sets context sensitive help ids to UI elements
	 */
	void setHelps() {
		PlatformUI.getWorkbench().getHelpSystem().setHelp(tableCodeSegments,
				HelpContextIDs.CRASH_ANALYSER_HELP_CRASH_VISUALISER);	
/*
		PlatformUI.getWorkbench().getHelpSystem().setHelp(tableCpsrDetails,
				HelpContextIDs.CRASH_ANALYSER_HELP_CRASH_VISUALISER);	
		PlatformUI.getWorkbench().getHelpSystem().setHelp(tableEventLog,
				HelpContextIDs.CRASH_ANALYSER_HELP_CRASH_VISUALISER);	
		PlatformUI.getWorkbench().getHelpSystem().setHelp(tableRegisters,
				HelpContextIDs.CRASH_ANALYSER_HELP_CRASH_VISUALISER);	
		PlatformUI.getWorkbench().getHelpSystem().setHelp(tableEventLog,
				HelpContextIDs.CRASH_ANALYSER_HELP_CRASH_VISUALISER);	
		PlatformUI.getWorkbench().getHelpSystem().setHelp(tableRegisters,
				HelpContextIDs.CRASH_ANALYSER_HELP_CRASH_VISUALISER);	
		PlatformUI.getWorkbench().getHelpSystem().setHelp(comboCpsrDetails,
				HelpContextIDs.CRASH_ANALYSER_HELP_CRASH_VISUALISER);	
		PlatformUI.getWorkbench().getHelpSystem().setHelp(comboRegisters,
				HelpContextIDs.CRASH_ANALYSER_HELP_CRASH_VISUALISER);	
	*/
	}

}