com.nokia.s60tools.swmtanalyser.editors.GraphedItemsHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.s60tools.swmtanalyser.editors.GraphedItemsHelper.java

Source

/*
* 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();
    }
}