sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi.call/src/com/nokia/carbide/cpp/pi/call/CallPlugin.java
author Toni Pulkkinen <ext-toni.p.pulkkinen@nokia.com>
Wed, 23 Jun 2010 15:05:09 +0300
changeset 12 ae255c9aa552
parent 5 844b047e260d
permissions -rw-r--r--
Performance Investigator Carbide extension 2.4.0

/*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "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.carbide.cpp.pi.call;

import java.io.File;
import java.util.ArrayList;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.PlatformUI;
import org.osgi.framework.BundleContext;

import com.nokia.carbide.cpp.internal.pi.analyser.NpiInstanceRepository;
import com.nokia.carbide.cpp.internal.pi.analyser.ProfileVisualiser;
import com.nokia.carbide.cpp.internal.pi.interfaces.IToolBarActionListener;
import com.nokia.carbide.cpp.internal.pi.model.GenericTrace;
import com.nokia.carbide.cpp.internal.pi.model.ParsedTraceData;
import com.nokia.carbide.cpp.internal.pi.plugin.model.AbstractPiPlugin;
import com.nokia.carbide.cpp.internal.pi.plugin.model.IClassReplacer;
import com.nokia.carbide.cpp.internal.pi.plugin.model.IEventListener;
import com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace;
import com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable;
import com.nokia.carbide.cpp.internal.pi.test.AnalysisInfoHandler;
import com.nokia.carbide.cpp.internal.pi.visual.GenericTraceGraph;
import com.nokia.carbide.cpp.internal.pi.visual.GraphDrawRequest;
import com.nokia.carbide.cpp.pi.call.GfcFunctionItem.GfcFunctionItemData;
import com.nokia.carbide.cpp.pi.editors.PIPageEditor;
import com.nokia.carbide.cpp.pi.util.GeneralMessages;


/**
 * The main plugin class to be used in the desktop.
 */
public class CallPlugin extends AbstractPiPlugin
		implements ITrace, IClassReplacer, IVisualizable, IEventListener, IToolBarActionListener
{
	private static final String HELP_CONTEXT_ID = PIPageEditor.PI_ID + ".call";  //$NON-NLS-1$

	// the shared instance
	private static CallPlugin plugin;
	
	// page index assigned to the page displaying call info
	private int pageIndex = PIPageEditor.NEXT_AVAILABLE_PAGE;
	
	// call trace
	private GfcTrace trace;

	// call page
	private ProfileVisualiser profileVisualiser;

	// call table handler
	private CallVisualiser callVisualiser;

	private static void setPlugin(CallPlugin newPlugin)
	{
		plugin = newPlugin;
	}

	/**
	 * The constructor.
	 */
	public CallPlugin() {
		super();
		setPlugin(this);
	}
	
	public Class getTraceClass() 
	{
		return GfcTrace.class;
	}

	public Class getReplacedClass(String className)
	{
		if (   className.indexOf("com.nokia.carbide.cpp.pi.call.GfcTrace") != -1 //$NON-NLS-1$
			|| className.indexOf("com.nokia.carbide.pi.call.GfcTrace") != -1 //$NON-NLS-1$
			|| className.indexOf("fi.vtt.bappea.model.GfcTrace") != -1 //$NON-NLS-1$
			|| className.indexOf("fi.vtt.bappea.gfcTracePlugin.GfcTrace") != -1) //$NON-NLS-1$
		{
			return GfcTrace.class;
		}
		else if (   className.indexOf("com.nokia.carbide.cpp.pi.call.GfcSample") != -1 //$NON-NLS-1$
				 || className.indexOf("com.nokia.carbide.pi.call.GfcSample") != -1 //$NON-NLS-1$
				 || className.indexOf("fi.vtt.bappea.model.GfcSample") != -1 //$NON-NLS-1$
				 || className.indexOf("fi.vtt.bappea.gfcTracePlugin.GfcSample") != -1) //$NON-NLS-1$
		{
			return GfcSample.class;
		}
		else if (   className.indexOf("com.nokia.carbide.cpp.pi.call.GfcFunctionItem$GfcFunctionItemData") != -1 //$NON-NLS-1$
				 || className.indexOf("com.nokia.carbide.pi.call.GfcFunctionItem$GfcFunctionItemData") != -1 //$NON-NLS-1$
				 || className.indexOf("fi.vtt.bappea.gfcTracePlugin.GfcFunctionItem$GfcFunctionItemData") != -1) //$NON-NLS-1$
		{
			return GfcFunctionItemData.class;
		}
		else if (   className.indexOf("com.nokia.carbide.cpp.pi.call.GfcFunctionItem") != -1 //$NON-NLS-1$
				 || className.indexOf("com.nokia.carbide.pi.call.GfcFunctionItem") != -1 //$NON-NLS-1$
				 || className.indexOf("fi.vtt.bappea.analyser.GfcFunctionItem") != -1 //$NON-NLS-1$
				 || className.indexOf("fi.vtt.bappea.gfcTracePlugin.GfcFunctionItem") != -1) //$NON-NLS-1$
		{
			return GfcFunctionItem.class;
		}
		else 
		{
			return null;
		}
	}

	public void initialiseTrace(GenericTrace trace) 
	{
		if (!(trace instanceof GfcTrace))
			return;
		
		this.trace = (GfcTrace) trace;
		
		this.trace.samples.trimToSize();
		this.trace.getCompleteGfcTrace().trimToSize();
		
		NpiInstanceRepository.getInstance().activeUidAddTrace("com.nokia.carbide.cpp.pi.call", trace); //$NON-NLS-1$
		
	  	/*
	  	 * Check if the trace is complete (first sample is at time 1,
	  	 * sample N is at time N)
	  	 */
		this.trace.setComplete();
		
		ArrayList<CallVisualiser>    callVisualiserList    = new ArrayList<CallVisualiser>();

		NpiInstanceRepository.getInstance().activeUidSetPersistState("com.nokia.carbide.cpp.pi.call.CallPlugin.callVisualiserList", callVisualiserList);	//$NON-NLS-1$

		ArrayList<ProfileVisualiser> profileVisualiserList = new ArrayList<ProfileVisualiser>();
		NpiInstanceRepository.getInstance().activeUidSetPersistState("com.nokia.carbide.cpp.pi.call.CallPlugin.profileVisualiserList", profileVisualiserList);	//$NON-NLS-1$

	}

	public String getTraceName() {
		return "Function Call"; //$NON-NLS-1$
	}

	/* (non-Javadoc)
	 * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#getTraceTitle()
	 */
	public String getTraceTitle() {
		return Messages.getString("CallPlugin.1"); //$NON-NLS-1$
	}

	public int getTraceId() {
		return 2;
	}

	public ParsedTraceData parseTraceFile(File file /*, ProgressBar progressBar*/) throws Exception 
	{
        GfcTraceParser gfcParser;
        gfcParser = new GfcTraceParser();

        return gfcParser.parse(file);
	}

	/**
	 * This method is called upon plug-in activation
	 */
	public void start(BundleContext context) throws Exception {
		super.start(context);
	}

	/**
	 * This method is called when the plug-in is stopped
	 */
	public void stop(BundleContext context) throws Exception {
		super.stop(context);
		setPlugin(null);
	}

	/**
	 * Returns the shared instance.
	 */
	public static CallPlugin getDefault() {
		return plugin;
	}

	/**
	 * Returns an image descriptor for the image file at the given
	 * plug-in relative path.
	 *
	 * @param path the path
	 * @return the image descriptor
	 */
	public static ImageDescriptor getImageDescriptor(String path) {
		return AbstractPiPlugin.imageDescriptorFromPlugin("com.nokia.carbide.cpp.pi.call", path); //$NON-NLS-1$
	}

	boolean pagesCreated = false;

	// return whether this plugin's editor pages have been created
	public boolean arePagesCreated() {
		return this.pagesCreated;
	}
	
	// set whether this plugin's editor pages have been created
	public void setPagesCreated(boolean pagesCreated) {
		this.pagesCreated = pagesCreated;
	}

	// number of editor pages to create
	public int getCreatePageCount() {
		return 1;
	}

	// editor page index for each created editor page
	public int getCreatePageIndex(int index) {
		return PIPageEditor.NEXT_AVAILABLE_PAGE;
	}

	// page index actually assigned to a created page
	public void setPageIndex(int index, int pageIndex) {
		if (index == 0)
			this.pageIndex = pageIndex;
	}

	// create the page(s)
	public ProfileVisualiser createPage(int index) {
		Composite parent = NpiInstanceRepository.getInstance().activeUidGetParentComposite();
		if (parent == null) {
			// no parent composite is only for temp instance used by non-GUI importer
			GeneralMessages.showErrorMessage(Messages.getString("CallPlugin.0")); //$NON-NLS-1$
			return null;
		}
		
		// there is one page, with no graph
		this.profileVisualiser = new ProfileVisualiser(ProfileVisualiser.TOP_ONLY, parent,
														Messages.getString("CallPlugin.functionCalls")); //$NON-NLS-1$
		AnalysisInfoHandler infoHandler = NpiInstanceRepository.getInstance().activeUidGetAnalysisInfoHandler();
		this.profileVisualiser.getParserRepository().setPIAnalysisInfoHandler(infoHandler);
	    
		PlatformUI.getWorkbench().getHelpSystem().setHelp(profileVisualiser.getContentPane(),
														HELP_CONTEXT_ID + ".functionCallsPageContext"); //$NON-NLS-1$

		PIPageEditor pageEditor = PIPageEditor.currentPageEditor();
		
		this.callVisualiser = new CallVisualiser(pageEditor, pageIndex, profileVisualiser.getTopComposite().getSashForm(), this.trace, this.profileVisualiser.getContentPane());

		Object objCallList = NpiInstanceRepository.getInstance().activeUidGetPersistState("com.nokia.carbide.cpp.pi.call.CallPlugin.callVisualiserList"); //$NON-NLS-1$
		ArrayList<CallVisualiser> callVisualiserList = (ArrayList<CallVisualiser>) objCallList;

		Object objProfileList = NpiInstanceRepository.getInstance().activeUidGetPersistState("com.nokia.carbide.cpp.pi.call.CallPlugin.profileVisualiserList"); //$NON-NLS-1$
		ArrayList<ProfileVisualiser> profileVisualiserList = (ArrayList<ProfileVisualiser>) objProfileList;

		if (callVisualiserList != null)
			callVisualiserList.add(this.callVisualiser);

		if (profileVisualiserList != null)
			profileVisualiserList.add(this.profileVisualiser);

		return this.profileVisualiser;
	}

	// number of graphs supplied by this plugin
	public int getGraphCount() {
		return 0;
	}

	// page number of each graph supplied by this plugin
	public int getPageNumber(int graphIndex) {
		Object objCallList = NpiInstanceRepository.getInstance().activeUidGetPersistState("com.nokia.carbide.cpp.pi.call.CallPlugin.callVisualiserList");	//$NON-NLS-1$
		ArrayList<CallVisualiser> callVisualiserList = (ArrayList<CallVisualiser>) objCallList;
		
		if (callVisualiserList == null)
			return this.pageIndex;

		for (int i = 0; i < callVisualiserList.size(); i++) {
			if (callVisualiserList.get(i).getPageEditor() == PIPageEditor.currentPageEditor())
				return callVisualiserList.get(i).getPageIndex();
		}
		
		return this.pageIndex;
	}

	public GenericTraceGraph getTraceGraph(int graphIndex) {
		return null;
	}

	public Integer getLastSample(int graphIndex) {
		return null;
	}

	public GraphDrawRequest getDrawRequest(int graphIndex) {
		return null;
	}

	public void receiveEvent(String action, Event event) {
		Object objCallList = NpiInstanceRepository.getInstance().activeUidGetPersistState("com.nokia.carbide.cpp.pi.call.CallPlugin.callVisualiserList");	//$NON-NLS-1$
		ArrayList<CallVisualiser> callVisualiserList = (ArrayList<CallVisualiser>) objCallList;

		if (callVisualiserList == null)
			return;
		
		Object objProfileList = NpiInstanceRepository.getInstance().activeUidGetPersistState("com.nokia.carbide.cpp.pi.call.CallPlugin.profileVisualiserList");	//$NON-NLS-1$
		ArrayList<ProfileVisualiser> profileVisualiserList = (ArrayList<ProfileVisualiser>) objProfileList;

		if (profileVisualiserList == null)
			return;
		
		if (action.equals("changeSelection")) { //$NON-NLS-1$
			// find the right callVisualiser and ProfileVisualiser
			for (int i = 0; i < callVisualiserList.size(); i++) {
				if (callVisualiserList.get(i).getPageEditor() == PIPageEditor.currentPageEditor()) {
					callVisualiserList.get(i).setStartAndEnd(event.start, event.end);
					double startTime = PIPageEditor.currentPageEditor().getStartTime();
					double endTime   = PIPageEditor.currentPageEditor().getEndTime();
					profileVisualiserList.get(i).updateStatusBarTimeInterval(startTime, endTime);
				}
			}
		}
	}

	public void setActions(boolean entering, int pageIndex) {
		if (pageIndex != this.pageIndex)
			return;
		
		if (entering) {
			PIPageEditor.getZoomInAction().setEnabled(false);
			PIPageEditor.getZoomOutAction().setEnabled(false);
			PIPageEditor.getZoomToSelectionAction().setEnabled(false);
			PIPageEditor.getZoomToTraceAction().setEnabled(false);
		} else {
			PIPageEditor.getZoomInAction().setEnabled(true);
			PIPageEditor.getZoomOutAction().setEnabled(true);
			PIPageEditor.getZoomToSelectionAction().setEnabled(true);
			PIPageEditor.getZoomToTraceAction().setEnabled(true);
		}
	}

	/* (non-Javadoc)
	 * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#parseTraceFiles(java.io.File[])
	 */
	public ParsedTraceData parseTraceFiles(File[] files) throws Exception {
		throw new UnsupportedOperationException();
	}
	
	/*
	 * (non-Javadoc)
	 * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#isMandatory()
	 */
	public boolean isMandatory() {
		return false;
	}
	
	/*
	 * (non-Javadoc)
	 * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#getTraceDescription()
	 */
	public String getTraceDescription() {
		return getTraceTitle();
	}
}