/******************************************************************************* * ALMA - Atacama Large Millimeter Array * Copyright (c) ESO - European Southern Observatory, 2013 * (in the framework of the ALMA collaboration). * All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *******************************************************************************/ package alma.acs.eventbrowser.parts; import java.util.Arrays; import java.util.List; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.inject.Inject; import org.eclipse.core.runtime.IStatus; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.core.services.statusreporter.StatusReporter; import org.eclipse.e4.ui.di.Focus; import org.eclipse.e4.ui.di.UIEventTopic; import org.eclipse.e4.ui.model.application.ui.menu.MPopupMenu; import org.eclipse.e4.ui.workbench.swt.modeling.EMenuService; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import alma.acs.eventbrowser.handlers.NotifyServiceUpdateJob; import alma.acs.nsstatistics.EventModel; import alma.acs.nsstatistics.NotifyServiceData; public class ServiceSummaryPart { /** * Blocking (popup) status report. */ @Inject private StatusReporter statusReporter; /** * TableViewer comes from JFace, allows access to embedded SWT Table. * http://www.vogella.com/articles/EclipseJFaceTable/article.html */ private TableViewer viewer; /** * TODO: The EventModel instance should get injected by the Eclipse DI container, * either as an OSGI service or as a node from the application model. * We retrieve the NotifyServices from the EventModel. */ private EventModel eventModel; private Thread serviceMonitoringThread; /** * The content provider class is responsible for providing objects to the view. * It can wrap existing objects in adapters or simply return objects as-is. * These objects may be sensitive to the current input of the view, * or ignore it and always show the same content (like Task List, for example). */ private class ViewContentProvider implements IStructuredContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { if (serviceMonitoringThread != null) serviceMonitoringThread.interrupt(); } public Object[] getElements(Object parent) { List<NotifyServiceData> cdlist = null; cdlist = eventModel.getNotifyServicesRoot().getServices(); NotifyServiceData[] l; if (cdlist != null) l = cdlist.toArray(new NotifyServiceData[cdlist.size()]); else return new NotifyServiceData[]{}; Arrays.sort(l); return l; } } private static class ServiceNameLabelProvider extends ColumnLabelProvider { @Override public String getText(Object element) { if (element instanceof NotifyServiceData) return ((NotifyServiceData)element).getName(); return ""; } @Override public Image getImage(Object element) { return null; } } private static class NumConsumersLabelProvider extends ColumnLabelProvider { @Override public String getText(Object element) { if (element instanceof NotifyServiceData) return ""+((NotifyServiceData)element).getNumberConsumers(); else return ""; } @Override public Image getImage(Object element) { return null; } } private static class NumSuppliersLabelProvider extends ColumnLabelProvider { @Override public String getText(Object element) { if (element instanceof NotifyServiceData) return ""+((NotifyServiceData)element).getNumberSuppliers(); else return ""; } @Override public Image getImage(Object element) { return null; } } @PostConstruct public void createComposite(Composite parent, EMenuService menuService) { try { eventModel = EventModel.getInstance(); } catch (Throwable thr) { thr.printStackTrace(); IStatus someStatus = statusReporter.newStatus(IStatus.ERROR, "Connection with NCs failed.", thr); statusReporter.report(someStatus, StatusReporter.SHOW); throw new RuntimeException(thr); } viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); TableViewerColumn tvcol = new TableViewerColumn(viewer,SWT.NONE, 0); tvcol.setLabelProvider(new ServiceNameLabelProvider()); TableColumn col = tvcol.getColumn(); col.setText("Notify Service"); col.setWidth(110); col.setAlignment(SWT.LEFT); tvcol = new TableViewerColumn(viewer,SWT.NONE, 1); tvcol.setLabelProvider(new NumConsumersLabelProvider()); col = tvcol.getColumn(); col.setText("#consumers"); col.setWidth(50); col.setAlignment(SWT.LEFT); tvcol = new TableViewerColumn(viewer,SWT.NONE, 2); tvcol.setLabelProvider(new NumSuppliersLabelProvider()); col = tvcol.getColumn(); col.setText("#suppliers"); col.setWidth(50); col.setAlignment(SWT.LEFT); viewer.setContentProvider(new ViewContentProvider()); viewer.setComparator(new ServiceViewerComparator()); viewer.setInput(new Object()); //was: getViewSite() -- the dummy arg seems to become the input arg for ViewContentProvider#getElements(Object) hookContextMenu(menuService); } private void hookContextMenu(EMenuService menuService) { // For the case of popup (mouse) menues we actually reference the menu ID from the Application.e4xmi MPopupMenu menu = menuService.registerContextMenu(viewer.getTable(), "alma.acs.eventgui.popupmenu.servicesummary"); if (menu == null) { System.out.println("ServiceSummaryPart popup menu is null!"); } } // TODO: Implement double-click, beyond the e3 code // doubleClickAction = new Action() { // public void run() { // ISelection selection = viewer.getSelection(); // Object obj = ((IStructuredSelection)selection).getFirstElement(); // showMessage("Double-click detected on "+obj.toString()); // } // }; /** * The keybinding implementation requires that all parts correctly implement @Focus. Eclipse requires that one control get the focus assigned. */ @Focus public void setFocus() { viewer.getTable().setFocus(); } @PreDestroy public void dispose() { } /** * @param s * @see NotifyServiceUpdateJob */ @Inject @Optional private void refreshNotify(@UIEventTopic(NotifyServiceUpdateJob.REFRESH_UI_SIGNAL_NAME) String s) { // System.out.println("ServiceSummaryPart#refreshNotify() called via IEventBroker"); viewer.refresh(); } }