sysperfana/memspyext/com.nokia.s60tools.swmtanalyser/src/com/nokia/s60tools/swmtanalyser/editors/GraphedItemsHelper.java
author Jussi Ryoma <ext-jussi.s.ryoma@nokia.com>
Tue, 24 Aug 2010 14:01:48 +0300
changeset 16 72f198be1c1d
parent 7 8e12a575a9b5
permissions -rw-r--r--
Crash Analyser Carbide Extension 1.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 "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.swmtanalyser.editors;

import java.util.ArrayList;
import java.util.Random;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.TableColumn;

import com.nokia.s60tools.swmtanalyser.ui.actions.CopyToClipboardAction;
import com.nokia.s60tools.swmtanalyser.ui.actions.ISelectionProvider;
import com.nokia.s60tools.swmtanalyser.ui.graphs.GraphForAllEvents;

/**
 * Helper class for graphed items tab.
 *
 */
public class GraphedItemsHelper implements Listener, ISelectionProvider{
	
	/**
	 * Copy a to clipboard action
	 */
	private IAction actionContextMenuCopyTo;


	CheckboxTableViewer graphedItemsViewer = null;
	
	private GraphForAllEvents graphedItemsGraph;
	private GraphedItemsSelectionListener graphedItemChangedListener;
	
	/**
	 * Construts UI controls over the area of given TabItem.
	 * @param graphedItemsTab represents Graphed items Tab.
	 * @param allEventsGraph represents the graph which gets updated based upon
	 * the actions on UI controls of the Graphed items tab. 
	 */
	public CheckboxTableViewer constructGraphedItemsViewer(TabItem graphedItemsTab, GraphForAllEvents allEventsGraph)
	{
		this.graphedItemsGraph = allEventsGraph;
		
		Composite compAllItems = new Composite(graphedItemsTab.getParent(),  SWT.NONE); 
		compAllItems.setLayout(new GridLayout(1, true));

		
		graphedItemsViewer = CheckboxTableViewer.newCheckList(compAllItems, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI );  
		graphedItemsViewer.getTable().setLayoutData(new GridData(GridData.FILL_VERTICAL|GridData.FILL_HORIZONTAL));
		
		TableColumn tc = new TableColumn(graphedItemsViewer.getTable(), SWT.CENTER);
		tc.setWidth(50);
		tc.setResizable(true);

		TableColumn elems_col = new TableColumn(graphedItemsViewer.getTable(), SWT.LEFT);
		elems_col.setText(GraphedItemsInput.COL1_ELEMENTS);
		elems_col.setWidth(600);
		elems_col.setResizable(true);
		elems_col.addListener(SWT.Selection, this);
				
		TableColumn event_col = new TableColumn(graphedItemsViewer.getTable(), SWT.LEFT);
		event_col.setText(GraphedItemsInput.COL2_EVENT);
		event_col.setWidth(150);
		event_col.setResizable(true);
		event_col.addListener(SWT.Selection, this);
		
		TableColumn type_col = new TableColumn(graphedItemsViewer.getTable(), SWT.LEFT);
		type_col.setText(GraphedItemsInput.COL3_TYPE);
		type_col.setWidth(150);
		type_col.setResizable(true);
		type_col.addListener(SWT.Selection, this);
		
		graphedItemsViewer.getTable().setHeaderVisible(true);
		graphedItemsViewer.getTable().setLinesVisible(true);		
		
		graphedItemsViewer.setContentProvider(new GraphedItemsContentProvider());
		graphedItemsViewer.setLabelProvider(new TableLabelColorProvider());
		
		graphedItemChangedListener = new GraphedItemsSelectionListener(allEventsGraph);
		graphedItemsViewer.addCheckStateListener(graphedItemChangedListener);
		
		hookContextMenu();
		
		graphedItemsTab.setControl(compAllItems);
				
		return graphedItemsViewer;
	}
	
	/**
	 * This method creates the context menu on the Graphed Items Tab
	 */
	 
	private void hookContextMenu()
	{
		MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
		menuMgr.setRemoveAllWhenShown(true);
		menuMgr.addMenuListener(new IMenuListener() {
			public void menuAboutToShow(IMenuManager manager) {
				fillContextMenu(manager);
			}
        });
	    Menu menu = menuMgr.createContextMenu(graphedItemsViewer.getTable());
		graphedItemsViewer.getTable().setMenu(menu);
	}
	
	private Color getRandomColor()
	{
		Random rand = new Random();
		int r = rand.nextInt(255);
		int g = rand.nextInt(255);
		int b = rand.nextInt(255);
		return new Color(Display.getCurrent(), r, g,b);
	}
	
	/**
	 * The method checks all items in the given viewer and assigns random colors for all checked items.
	 * @param tableViewer
	 */
	private void selectAllItems(CheckboxTableViewer tableViewer)
	{
		tableViewer.setAllChecked(true);
		
		for(Object obj:tableViewer.getCheckedElements())
		{
			if(obj instanceof GraphedItemsInput){
				GraphedItemsInput graphedItem = (GraphedItemsInput)obj;
				
				if(graphedItem.getColor() == null)
					graphedItem.setColor(getRandomColor());
				
				tableViewer.update(obj, null);
			}
		}
		
	}
	
	/**
	 * @param manager -- MenuManager on which actions will be created.
	 */
	private void fillContextMenu(IMenuManager manager) {
		//Popup Action to check all items in the graphed items viewer.
		Action checkAllItems = new Action()
		{
			{
				this.setText("Check all");
				this.setToolTipText("");
			}
			public void run()
			{
				selectAllItems(graphedItemsViewer);
				notifyGraphedItemsSelection(graphedItemsViewer, graphedItemsGraph);
			}
			
		};
		manager.add(checkAllItems);
		
		//Popup action to uncheck all items in the graphed items viewer
		Action unCheckAllItems = new Action()
		{
			{
				this.setText("Uncheck all");
			}
			public void run()
			{
				for(Object obj:graphedItemsViewer.getCheckedElements())
				{
					((GraphedItemsInput)obj).setColor(null);
					graphedItemsViewer.setChecked(obj, false);
					graphedItemsViewer.update(obj, null);
					CheckStateChangedEvent e = new CheckStateChangedEvent(graphedItemsViewer, obj, false);
					graphedItemChangedListener.checkStateChanged(e);
				}
				this.setToolTipText("");
			}
			
		};
		manager.add(unCheckAllItems);	

		//Popup action to remove all items in the graphed items viewer
		Action removeAllItems = new Action()
				{
					public void run()
					{
						graphedItemsViewer.setInput(null);
						graphedItemsViewer.refresh();
						CheckStateChangedEvent e = new CheckStateChangedEvent(graphedItemsViewer, null, false);
						graphedItemChangedListener.checkStateChanged(e);
						graphedItemsGraph.removeAllData();
					}
					{
						this.setText("Remove all");
						this.setToolTipText("");
					}
				};
		manager.add(removeAllItems);
		
		actionContextMenuCopyTo = new CopyToClipboardAction(this);				
		manager.add(actionContextMenuCopyTo);
	}
	
	/**
	 * This method updates the graph based on the selections made in the given graphed items viewer.
	 * @param tableViewer 
	 * @param graphToBeUpdated
	 */
	private void notifyGraphedItemsSelection(CheckboxTableViewer tableViewer, GraphForAllEvents graphToBeUpdated)
	{
		Object [] checkedElems = tableViewer.getCheckedElements();
		
		ArrayList<GraphedItemsInput> selectedItems = new ArrayList<GraphedItemsInput>();
		
		for(Object obj:checkedElems)
		{
			GraphedItemsInput graphInput = (GraphedItemsInput)obj;
			selectedItems.add(graphInput);
		}
		
		graphToBeUpdated.setGraphedItemsInput(selectedItems);		
		graphToBeUpdated.constructGraphArea(); 
	}

	/* (non-Javadoc)
	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
	 */
	public void handleEvent(Event event) {
		
		TableColumn sortedColumn = graphedItemsViewer.getTable().getSortColumn();
		TableColumn currentSelected = (TableColumn)event.widget;
		
		int dir = graphedItemsViewer.getTable().getSortDirection();
		
		if(sortedColumn == currentSelected){
			dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
		}else
		{
			graphedItemsViewer.getTable().setSortColumn(currentSelected);
			dir = SWT.UP;
		}
		graphedItemsViewer.setSorter(new Sorter(dir,currentSelected));
		graphedItemsViewer.getTable().setSortDirection(dir);
	}
	

	/**
	 * 
	 * Customized CheckStateListener for Graphed Items viewer.
	 * This listener is associated with the Graphed Items viewer.
	 * The 'checkStateChanged' method gets invoked, when items are
	 * checked/unchecked in Graphed Items viewer. 
	 *
	 */
	class GraphedItemsSelectionListener implements ICheckStateListener
	{
			private GraphForAllEvents graphToBeUpdated;
			
			public GraphedItemsSelectionListener(GraphForAllEvents graphToBeUpdated){
				this.graphToBeUpdated = graphToBeUpdated;
			}
			public void checkStateChanged(CheckStateChangedEvent e) {
				
				GraphedItemsInput obj =((GraphedItemsInput)e.getElement());
				if(obj!=null)
				{
					if(e.getChecked())
				    {
						if(obj.getColor() == null)
							obj.setColor(getRandomColor());
					}
					else
					{
						obj.setColor(null);
					}	
					graphedItemsViewer.update(obj, null);
				}
				
				notifyGraphedItemsSelection(graphedItemsViewer,graphToBeUpdated);
			}
			
			
	}
	
	/**
	 * This sorter class is associated with table in Graphed Items Tab
	 * It contains logic to sort the table based on various columns.
	 * 
	 */
	class Sorter extends ViewerSorter
	{
		int sortDirection;
		TableColumn column;
		Sorter(int sortDirection, TableColumn column)
		{
			this.sortDirection = sortDirection;
			this.column = column;
		}
		public int compare(Viewer viewer, Object e1, Object e2)
		{
			int returnValue = 0;
			
			GraphedItemsInput o1 = (GraphedItemsInput)e1;
			GraphedItemsInput o2 = (GraphedItemsInput)e2;
			
			if(column.getText().equalsIgnoreCase(GraphedItemsInput.COL1_ELEMENTS))
				returnValue = o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
			else if(column.getText().equalsIgnoreCase(GraphedItemsInput.COL2_EVENT))
				returnValue = o1.getEvent().toLowerCase().compareTo(o2.getEvent().toLowerCase());
			else if(column.getText().equalsIgnoreCase(GraphedItemsInput.COL3_TYPE))
				returnValue = o1.getType().toLowerCase().compareTo(o2.getType().toLowerCase());
			
			if(sortDirection == SWT.UP)
				return returnValue;
			else
				return returnValue * -1;
		}
	}

	/* (non-Javadoc)
	 * @see com.nokia.s60tools.swmtanalyser.ui.actions.ISelectionProvider#getSelection()
	 */
	public ISelection getUserSelection() {
		return graphedItemsViewer.getSelection();
	}
}