gov.redhawk.ui.views.monitor.ports.PortMonitorView.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.ui.views.monitor.ports.PortMonitorView.java

Source

/** 
 * This file is protected by Copyright. 
 * Please refer to the COPYRIGHT file distributed with this source distribution.
 * 
 * This file is part of REDHAWK IDE.
 * 
 * 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 gov.redhawk.ui.views.monitor.ports;

import gov.redhawk.model.sca.ScaPort;
import gov.redhawk.model.sca.ScaPortContainer;
import gov.redhawk.model.sca.provider.ScaItemProviderAdapterFactory;
import gov.redhawk.ui.views.internal.monitor.ports.PortMonitorViewConfigDialog;
import gov.redhawk.ui.views.monitor.model.ports.Monitor;
import gov.redhawk.ui.views.monitor.model.ports.MonitorRegistry;
import gov.redhawk.ui.views.monitor.model.ports.PortMonitor;
import gov.redhawk.ui.views.monitor.model.ports.PortSupplierMonitor;
import gov.redhawk.ui.views.monitor.model.ports.PortsFactory;
import gov.redhawk.ui.views.monitor.model.ports.PortsPackage;
import gov.redhawk.ui.views.monitor.model.ports.provider.MonitorRegistryItemProvider;
import gov.redhawk.ui.views.monitor.model.ports.provider.PortsItemProviderAdapterFactory;

import java.util.ArrayList;
import java.util.Collection;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

public class PortMonitorView extends ViewPart {

    /**
     * The ID of the view as specified by the extension.
     */
    public static final String ID = "gov.redhawk.ui.views.monitor.ports.PortMonitorView";

    private TreeViewer viewer;
    private Action configAction;
    private MonitorRegistry input = PortsFactory.eINSTANCE.createMonitorRegistry();
    private final Adapter jobScheduler = new AdapterImpl() {
        @Override
        public void notifyChanged(final org.eclipse.emf.common.notify.Notification msg) {
            switch (msg.getFeatureID(MonitorRegistry.class)) {
            case PortsPackage.MONITOR_REGISTRY__MONITORS:
                if (PortMonitorView.this.input.getMonitors().isEmpty()) {
                    PortMonitorView.this.refreshJob.cancel();
                } else {
                    PortMonitorView.this.refreshJob.schedule(PortMonitorView.this.refreshDelta);
                }
                break;
            default:
                break;
            }
        }
    };
    private Job refreshJob = new Job("Refreshing all port stats") {
        {
            setUser(false);
            setSystem(true);
        }

        @Override
        public boolean shouldSchedule() {
            return !PortMonitorView.this.input.getMonitors().isEmpty() && super.shouldSchedule();
        }

        @Override
        public boolean shouldRun() {
            return !PortMonitorView.this.input.getMonitors().isEmpty() && super.shouldRun();
        }

        @Override
        protected IStatus run(final IProgressMonitor monitor) {
            for (final Monitor m : PortMonitorView.this.input.getMonitors()) {
                m.fetchStats();
            }
            schedule(PortMonitorView.this.refreshDelta);
            return Status.OK_STATUS;
        }

    };

    private ComposedAdapterFactory adapterFactory;

    private long refreshDelta = 10000;

    private TreeColumnLayout treeLayout;

    /**
     * The constructor.
     */
    public PortMonitorView() {

    }

    /**
     * This is a callback that will allow us
     * to create the viewer and initialize it.
     */
    @Override
    public void createPartControl(final Composite root) {
        final Composite parent = new Composite(root, SWT.None);
        this.treeLayout = new TreeColumnLayout();
        parent.setLayout(this.treeLayout);

        this.viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        this.viewer.getTree().setHeaderVisible(true);
        this.viewer.getTree().setLinesVisible(true);

        initializeColumns();
        final PortsItemProviderAdapterFactory providesPortAdapterFactory = new PortsItemProviderAdapterFactory() {
            @Override
            public Adapter createMonitorRegistryAdapter() {
                if (this.monitorRegistryItemProvider == null) {
                    this.monitorRegistryItemProvider = new MonitorRegistryItemProvider(this) {
                        @Override
                        public Collection<? extends EStructuralFeature> getChildrenFeatures(final Object object) {
                            if (this.childrenFeatures == null) {
                                this.childrenFeatures = new ArrayList<EStructuralFeature>();
                                this.childrenFeatures.add(PortsPackage.Literals.MONITOR_REGISTRY__MONITORS);
                            }
                            return this.childrenFeatures;
                        }
                    };
                }

                return this.monitorRegistryItemProvider;
            }
        };
        this.adapterFactory = new ComposedAdapterFactory(
                new AdapterFactory[] { providesPortAdapterFactory, new ScaItemProviderAdapterFactory() });
        this.viewer.setContentProvider(new AdapterFactoryContentProvider(this.adapterFactory));
        this.viewer.setInput(this.input);
        makeActions();
        hookContextMenu();
        contributeToActionBars();
        this.getSite().setSelectionProvider(this.viewer);
        this.input.eAdapters().add(this.jobScheduler);
    }

    private void initializeColumns() {
        for (final Column c : StatisticsColumns.DEFAULT_COLUMNS) {
            addColumn(c);
        }
    }

    /**
     * @since 3.0
     */
    public void addColumn(final Column c) {
        final TreeColumn column = c.createTreeColumn(this.viewer);
        this.treeLayout.setColumnData(column, new ColumnWeightData(1, column.getResizable()));
        this.viewer.getTree().getParent().layout(true);
    }

    /**
     * @since 3.0
     */
    public void removeColumn(final Column c) {
        final TreeColumn column = c.findColumn(this.viewer);
        if (column != null) {
            column.dispose();
        }
    }

    /**
     * @since 3.0
     */
    public boolean hasColumn(final Column c) {
        return c.isIn(this.viewer);
    }

    public void setRefreshDelta(final long msec) {
        this.refreshDelta = msec;
    }

    public long getRefreshDelta() {
        return this.refreshDelta;
    }

    @Override
    public void dispose() {
        super.dispose();
        if (this.adapterFactory != null) {
            this.adapterFactory.dispose();
        }
        this.adapterFactory = null;
        this.input.eAdapters().remove(this.jobScheduler);
        if (this.refreshJob != null) {
            this.refreshJob.cancel();
            this.refreshJob = null;
        }
        if (this.input != null) {
            this.input.getMonitors().clear();
            this.input = null;
        }
        this.viewer = null;
        this.configAction = null;
    }

    /**
     * @since 3.0
     */
    public void addMonitor(final ScaPortContainer portContainer) {
        PortSupplierMonitor monitor = findMonitor(portContainer);
        if (monitor == null) {
            monitor = PortsFactory.eINSTANCE.createPortSupplierMonitor();
            monitor.setPortContainer(portContainer);
            this.input.getMonitors().add(monitor);
        }
        monitor.fetchStats();
        this.viewer.reveal(monitor);
        this.viewer.expandToLevel(monitor, AbstractTreeViewer.ALL_LEVELS);
    }

    private PortSupplierMonitor findMonitor(final ScaPortContainer portContainer) {
        for (final Monitor m : this.input.getMonitors()) {
            if (m instanceof PortSupplierMonitor) {
                final PortSupplierMonitor ps = (PortSupplierMonitor) m;
                if (ps.getPortContainer() == portContainer) {
                    return ps;
                }
            }
        }
        return null;
    }

    public void addMonitor(final ScaPort<?, ?> port) {
        PortMonitor portMonitor = findMonitor(port);
        if (portMonitor == null) {
            portMonitor = PortsFactory.eINSTANCE.createPortMonitor();
            portMonitor.setPort(port);
            this.input.getMonitors().add(portMonitor);
        }
        portMonitor.fetchStats();
        this.viewer.reveal(portMonitor);
        this.viewer.expandToLevel(portMonitor, AbstractTreeViewer.ALL_LEVELS);
    }

    private PortMonitor findMonitor(final ScaPort<?, ?> port) {
        for (final Monitor m : this.input.getMonitors()) {
            if (m instanceof PortMonitor) {
                final PortMonitor ps = (PortMonitor) m;
                if (ps.getPort() == port) {
                    return ps;
                }
            }
        }
        return null;
    }

    public void removeMonitor(final EObject monitor) {
        EcoreUtil.remove(monitor);
    }

    private void hookContextMenu() {
        final MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(final IMenuManager manager) {
                PortMonitorView.this.fillContextMenu(manager);
            }
        });
        final Menu menu = menuMgr.createContextMenu(this.viewer.getControl());
        this.viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, this.viewer);
    }

    private void contributeToActionBars() {
        final IActionBars bars = getViewSite().getActionBars();
        fillLocalPullDown(bars.getMenuManager());
    }

    private void fillLocalPullDown(final IMenuManager manager) {
        manager.add(this.configAction);
    }

    private void fillContextMenu(final IMenuManager manager) {
        // Other plug-ins can contribute there actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void makeActions() {
        this.configAction = new Action() {
            @Override
            public void run() {
                final PortMonitorViewConfigDialog dialog = new PortMonitorViewConfigDialog(getSite().getShell(),
                        PortMonitorView.this, PortMonitorView.this.input);
                dialog.open();

            }
        };
        this.configAction.setText("Configure");
        this.configAction.setToolTipText("Configure the view");
        this.configAction.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    @Override
    public void setFocus() {
        if (this.viewer != null) {
            this.viewer.getControl().setFocus();
        }
    }
}