de.tuilmenau.ics.fog.eclipse.ui.views.MarkerView.java Source code

Java tutorial

Introduction

Here is the source code for de.tuilmenau.ics.fog.eclipse.ui.views.MarkerView.java

Source

/*******************************************************************************
 * Forwarding on Gates Simulator/Emulator - Eclipse
 * Copyright (c) 2012, Integrated Communication Systems Group, TU Ilmenau.
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html.
 ******************************************************************************/
package de.tuilmenau.ics.fog.eclipse.ui.views;

import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.part.ViewPart;

import de.tuilmenau.ics.fog.eclipse.ui.editors.SelectionProvider;
import de.tuilmenau.ics.fog.ui.IMarkerContainerObserver;
import de.tuilmenau.ics.fog.ui.Logging;
import de.tuilmenau.ics.fog.ui.Marker;
import de.tuilmenau.ics.fog.ui.MarkerContainer;

/**
 * Class for showing all markers.
 */
public class MarkerView extends ViewPart implements IMarkerContainerObserver, ISelectionChangedListener {
    private static final String[] COLUMN_TITLES = { "Marker", "Color" };
    private static final int[] COLUMN_SIZE = { 200, 150 };

    private static final int COLUMN_ID_NAME = 0;
    private static final int COLUMN_ID_COLOR = 1;

    private enum Direction {
        ASCENDING, DESCENDING
    };

    class TableSorter extends ViewerSorter {
        private Direction direction;
        private int column;

        public TableSorter() {
            column = -1;
            direction = Direction.ASCENDING;
        }

        public void setSorting(TableColumn column, int direction) {
            // Find column via title text
            this.column = -1;
            for (int i = 0; i < COLUMN_TITLES.length; i++) {
                if (COLUMN_TITLES[i].equals(column.getText())) {
                    this.column = i;
                    break;
                }
            }

            // Store order
            if (direction == SWT.DOWN)
                this.direction = Direction.DESCENDING;
            else
                this.direction = Direction.ASCENDING;
        }

        @Override
        public int compare(Viewer viewer, Object e1, Object e2) {
            Marker p1 = (Marker) e1;
            Marker p2 = (Marker) e2;

            int rc = 0;
            switch (column) {
            case -1:
            case COLUMN_ID_NAME:
                rc = p2.getName().compareTo(p1.getName());
                break;
            case COLUMN_ID_COLOR:
                rc = p2.getColor().getRGB() - p1.getColor().getRGB();
                break;
            default:
                throw new RuntimeException(this + ": Invalid column ID for marker view sorting.");
            }

            // If descending order, flip the direction
            if (direction == Direction.DESCENDING) {
                rc = -rc;
            }

            return rc;
        }
    }

    class ViewContentProvider implements IStructuredContentProvider {
        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }

        public Object[] getElements(Object parent) {
            if (parent instanceof MarkerContainer) {
                return ((MarkerContainer) parent).getMarkers();
            }

            return null;
        }
    }

    class ViewLabelExtProvider extends StyledCellLabelProvider {
        @Override
        public void update(ViewerCell cell) {
            Marker element = (Marker) cell.getElement();
            int index = cell.getColumnIndex();
            String columnText = getColumnText(element, index);
            cell.setText(columnText);

            if (index == COLUMN_ID_COLOR) {
                java.awt.Color awtColor = element.getColor();
                Color color = new Color(cell.getControl().getDisplay(), awtColor.getRed(), awtColor.getGreen(),
                        awtColor.getBlue());
                cell.setBackground(color);
            }
        }

        public String getColumnText(Object obj, int index) {
            if (obj instanceof Marker) {
                Marker entry = (Marker) obj;

                switch (index) {
                case COLUMN_ID_NAME:
                    return entry.getName();
                case COLUMN_ID_COLOR:
                    return entry.getColor().toString();
                default:
                    throw new RuntimeException(this + ": Invalid column ID for packet view.");
                }
            }

            return null;
        }
    }

    public MarkerView() {
    }

    /**
     * Create GUI
     */
    public void createPartControl(Composite parent) {
        GridLayout layout = new GridLayout(1, false);
        parent.setLayout(layout);

        Composite tableComp = new Composite(parent, SWT.NONE);
        tableComp.setLayout(new FillLayout());
        tableComp.setLayoutData(new GridData(GridData.FILL_BOTH));

        viewer = new TableViewer(tableComp, SWT.FULL_SELECTION | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);

        // important to create the columns before setting the providers
        createColumns();

        viewer.setContentProvider(new ViewContentProvider());
        viewer.setLabelProvider(new ViewLabelExtProvider());
        viewer.setInput(MarkerContainer.getInstance());

        Composite buttonComp = new Composite(parent, SWT.NONE);
        buttonComp.setLayout(new RowLayout());

        Button deleteButton = new Button(buttonComp, SWT.NONE);
        deleteButton.setText("Delete marker");
        deleteButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                ISelection selection = viewer.getSelection();

                if (!selection.isEmpty()) {
                    if (selection instanceof StructuredSelection) {
                        Object obj = ((StructuredSelection) selection).getFirstElement();

                        if (obj instanceof Marker) {
                            Logging.info(this, "Deleting marker: " + obj);
                            MarkerContainer.getInstance().removeMarker((Marker) obj);
                        }
                    }
                }
            }
        });

        Button refreshButton = new Button(buttonComp, SWT.NONE);
        refreshButton.setText("Refresh view");
        refreshButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                updateView();
            }
        });

        // store display
        display = parent.getDisplay();

        // get selection events from internal table
        viewer.addSelectionChangedListener(this);

        // announce ourself as selection source
        selectionProvider = new SelectionProvider(display);
        getSite().setSelectionProvider(selectionProvider);

        MarkerContainer.getInstance().addObserver(this);
    }

    /**
     * Called by the internal table displaying the packets, if the user
     * selects one of them. Now, we have to convert the PacketQueueEntry
     * to a Packet and announce the selection of the Packet object. That
     * transition is needed for the PropertyView, which is able to display
     * Packets, only.
     */
    @Override
    public void selectionChanged(SelectionChangedEvent event) {
        if (event != null) {
            ISelection selection = event.getSelection();

            if (!selection.isEmpty()) {
                if (selection instanceof StructuredSelection) {
                    Object obj = ((StructuredSelection) selection).getFirstElement();

                    Logging.log(this, "Selected object: " + obj);
                    selectionProvider.announceSelection(obj);
                }
            }
        }
    }

    @Override
    public void notify(MarkerContainer pContainer, Object pChangesObject) {
        updateView();
    }

    private void updateView() {
        if (Thread.currentThread() != display.getThread()) {
            display.asyncExec(new Runnable() {
                @Override
                public void run() {
                    updateView();
                }
            });
        } else {
            viewer.refresh(); // TODO: refreshes all, performance?
            //viewer.add(log.getFirst()); // TODO adds at the end, not the best solution
        }
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        viewer.getControl().setFocus();
    }

    @Override
    public void dispose() {
        MarkerContainer.getInstance().deleteObserver(this);

        super.dispose();
    }

    private void createColumns() {
        for (int i = 0; i < Math.min(COLUMN_TITLES.length, COLUMN_SIZE.length); i++) {
            TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
            column.getColumn().setText(COLUMN_TITLES[i]);
            column.getColumn().setWidth(COLUMN_SIZE[i]);
            column.getColumn().setResizable(true);
            column.getColumn().setMoveable(true);

            // Setting the right sorter
            column.getColumn().addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent event) {
                    if (event.widget instanceof TableColumn) {
                        TableColumn column = (TableColumn) event.widget;

                        int dir = viewer.getTable().getSortDirection();

                        if (viewer.getTable().getSortColumn() == column) {
                            dir = (dir == SWT.UP) ? SWT.DOWN : SWT.UP;
                        } else {
                            dir = SWT.DOWN;
                        }

                        tableSorter.setSorting(column, dir);
                        viewer.getTable().setSortColumn(column);
                        viewer.getTable().setSortDirection(dir);
                        updateView();
                    }
                }
            });

        }

        Table table = viewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
    }

    private TableViewer viewer;
    private TableSorter tableSorter;
    private Display display;
    private SelectionProvider selectionProvider;
}