package gov.redhawk.ui.views.event; /******************************************************************************* * 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 *******************************************************************************/ import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import org.eclipse.core.databinding.observable.list.WritableList; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.nebula.widgets.xviewer.XViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.eclipse.ui.statushandlers.StatusManager; import org.eclipse.ui.views.properties.IPropertySheetPage; import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; import org.omg.CosEventChannelAdmin.EventChannel; import gov.redhawk.model.sca.DomainConnectionException; import gov.redhawk.model.sca.RefreshDepth; import gov.redhawk.model.sca.ScaDomainManager; import gov.redhawk.model.sca.provider.ScaItemProviderAdapterFactory; import gov.redhawk.sca.util.OrbSession; import gov.redhawk.ui.views.event.model.ChannelListener; import gov.redhawk.ui.views.event.model.DomainChannelListener; import gov.redhawk.ui.views.event.model.Event; import gov.redhawk.ui.views.event.model.EventChannelListener; import mil.jpeojtrs.sca.util.CorbaUtils; public class EventView extends ViewPart implements ITabbedPropertySheetPageContributor { public static final String ID = "gov.redhawk.ui.views.event.eventViewer"; private EventViewerFactory viewerFactory; private XViewer viewer; private Action clearAction = new Action("Clear", AbstractUIPlugin.imageDescriptorFromPlugin(EventViewPlugin.PLUGIN_ID, "icons/clear_co.gif")) { @Override public void run() { history.clear(); viewer.refresh(true); } }; private Action scrollLockAction = new Action("Scroll Lock", IAction.AS_CHECK_BOX) { { setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(EventViewPlugin.PLUGIN_ID, "icons/lock_co.gif")); } @Override public void run() { contentProvider.setScrollLock(!contentProvider.isScrollLock()); } }; private Action detailsAction = new Action("Show Details", IAction.AS_PUSH_BUTTON) { { setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(EventViewPlugin.PLUGIN_ID, "icons/details.png")); } @Override public void run() { try { EventView.this.getSite().getPage().showView(IPageLayout.ID_PROP_SHEET); } catch (PartInitException e) { StatusManager.getManager().handle(new Status(IStatus.ERROR, EventViewPlugin.PLUGIN_ID, "Failed to open Properties view: " + e.getMessage(), e), StatusManager.SHOW | StatusManager.LOG); } } }; private Action disconnectAction = new Action("Disconnect") { { setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(EventViewPlugin.PLUGIN_ID, "icons/disconnect.gif")); } @Override public void run() { List<ChannelListener> listeners = EventView.this.channelListeners; for (int i = 0; i < listeners.size(); i++) { if (listeners.get(i).getFullChannelName().equals(EventView.this.eventChannelId)) { listeners.get(i).disconnect(); listeners.remove(i); this.setEnabled(false); } } }; }; private WritableList<Event> history = new WritableList<Event>(); private List<ChannelListener> channelListeners = new ArrayList<ChannelListener>(); private OrbSession session = OrbSession.createSession(); private ScaItemProviderAdapterFactory factory; private EventViewerContentProvider contentProvider; private String eventChannelId; public EventView() { } @Override public void createPartControl(Composite parent) { parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).create()); Composite viewerComposite = new Composite(parent, SWT.BORDER); createViewer(viewerComposite); viewerComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create()); IActionBars actionBars = getViewSite().getActionBars(); createToolbarItems(actionBars.getToolBarManager()); } private void createToolbarItems(IToolBarManager toolBarManager) { toolBarManager.add(detailsAction); toolBarManager.add(disconnectAction); toolBarManager.add(clearAction); toolBarManager.add(scrollLockAction); } private void createViewer(Composite parent) { parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).create()); viewerFactory = new EventViewerFactory(); viewer = new XViewer(parent, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI | SWT.FULL_SELECTION, viewerFactory); viewer.getTree().setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create()); contentProvider = new EventViewerContentProvider(); viewer.setContentProvider(contentProvider); viewer.setLabelProvider(new EventViewerLabelProvider(viewer)); viewer.setInput(this.history); viewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { try { EventView.this.getSite().getPage().showView(IPageLayout.ID_PROP_SHEET); } catch (PartInitException e) { StatusManager.getManager().handle( new Status(IStatus.ERROR, EventViewPlugin.PLUGIN_ID, "Failed to open Properties view: " + e.getMessage(), e), StatusManager.SHOW | StatusManager.LOG); } } }); getSite().setSelectionProvider(viewer); } @Override public void dispose() { super.dispose(); if (factory != null) { factory.dispose(); } Job disconnectAll = new Job("Disconnect All Channels") { @Override protected IStatus run(IProgressMonitor monitor) { synchronized (EventView.this) { SubMonitor subMonitor = SubMonitor.convert(monitor, "Disconnecting all channels...", IProgressMonitor.UNKNOWN); for (final ChannelListener listener : channelListeners) { try { CorbaUtils.invoke(new Callable<Object>() { @Override public Object call() throws Exception { listener.disconnect(); return null; } }, subMonitor.newChild(1)); } catch (CoreException e) { // PASS } catch (InterruptedException e) { // PASS } } channelListeners.clear(); session.dispose(); } return Status.OK_STATUS; } }; disconnectAll.setUser(false); disconnectAll.schedule(); } public synchronized void connect(String channel, final EventChannel eventChannel) throws CoreException { this.eventChannelId = channel; // Don't add duplicate listeners for (ChannelListener l : channelListeners) { if (l.getFullChannelName().equals(channel)) { return; } } if (!disconnectAction.isEnabled()) { disconnectAction.setEnabled(true); } final ChannelListener newListener = new EventChannelListener(history, eventChannel, channel); newListener.connect(session); channelListeners.add(newListener); } public synchronized void connect(final ScaDomainManager domain, final String channel) throws CoreException { this.eventChannelId = domain.getLabel() + "/" + channel; // Don't add duplicate listeners for (ChannelListener l : channelListeners) { if (l.getFullChannelName().equals(domain.getLabel() + "/" + channel)) { return; } } if (!disconnectAction.isEnabled()) { disconnectAction.setEnabled(true); } final ChannelListener newListener = new DomainChannelListener(history, domain, channel); if (!domain.isConnected()) { try { domain.connect(null, RefreshDepth.SELF); } catch (DomainConnectionException e) { throw new CoreException(new Status(IStatus.ERROR, EventViewPlugin.PLUGIN_ID, "Failed to connect to domain.", e)); } } newListener.connect(session); channelListeners.add(newListener); } @Override public void setFocus() { if (viewer != null) { viewer.getTree().setFocus(); } } @Override public void setPartName(String partName) { super.setPartName(partName); } @Override public void setTitleToolTip(String toolTip) { super.setTitleToolTip(toolTip); } @Override public String getContributorId() { return getSite().getId(); } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Object getAdapter(Class adapter) { if (adapter == IPropertySheetPage.class) { return new TabbedPropertySheetPage(this); } return super.getAdapter(adapter); } }