sysperfana/memspyext/com.nokia.s60tools.swmtanalyser/src/com/nokia/s60tools/swmtanalyser/editors/GraphedItemsHelper.java
/*
* 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();
}
}