diff -r f65f740e69f9 -r 8e12a575a9b5 sysperfana/memspyext/com.nokia.s60tools.swmtanalyser/src/com/nokia/s60tools/swmtanalyser/editors/GraphedItemsHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysperfana/memspyext/com.nokia.s60tools.swmtanalyser/src/com/nokia/s60tools/swmtanalyser/editors/GraphedItemsHelper.java Wed Apr 21 20:01:08 2010 +0300 @@ -0,0 +1,355 @@ +/* +* 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 selectedItems = new ArrayList(); + + 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(); + } +}