/******************************************************************************* * Copyright (c) 2007 Jeff Mesnil * 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 net.jmesnil.jmx.ui.internal.editors; import java.util.ArrayList; import java.util.List; import javax.management.Notification; import javax.management.NotificationListener; import net.jmesnil.jmx.resources.MBeanInfoWrapper; import net.jmesnil.jmx.ui.JMXUIActivator; import net.jmesnil.jmx.ui.internal.JMXImages; import net.jmesnil.jmx.ui.internal.Messages; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.action.Action; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; public class NotificationsPage extends FormPage { private final class NotificationLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { Notification notification = (Notification) element; if (columnIndex == 0) { return Long.toString(notification.getTimeStamp()); } if (columnIndex == 1) { return notification.getType(); } if (columnIndex == 2) { return notification.getMessage(); } if (columnIndex == 3) { if (notification.getUserData() != null) return notification.getUserData().toString(); else return ""; //$NON-NLS-1$ } if (columnIndex == 4) { return Long.toString(notification.getSequenceNumber()); } if (columnIndex == 5) { return notification.getSource().toString(); } return super.getText(element); } } static final String ID = "notifications"; //$NON-NLS-1$ private MBeanInfoWrapper wrapper; private Action subscribeAction; private NotificationListener listener; @SuppressWarnings("unchecked")//$NON-NLS-1$ private List notifications = new ArrayList(); private TableViewer viewer; public NotificationsPage(FormEditor editor) { super(editor, ID, Messages.NotificationsPage_title); MBeanEditorInput input = (MBeanEditorInput) editor.getEditorInput(); this.wrapper = input.getWrapper(); } private void createToolBarActions(ScrolledForm form) { Action clearAction = new Action("Clear", Action.AS_PUSH_BUTTON) { //$NON-NLS-1$ public void run() { notifications.clear(); viewer.refresh(); } }; clearAction .setToolTipText(Messages.NotificationsPage_clearActionToolTip); JMXImages.setLocalImageDescriptors(clearAction, "clear_co.gif"); //$NON-NLS-1$ subscribeAction = new Action("Subscribe", Action.AS_CHECK_BOX) { //$NON-NLS-1$ public void run() { toogleSubcription(); } }; subscribeAction .setToolTipText(Messages.NotificationsPage_subscribeActionToolTip); subscribeAction.setEnabled(wrapper.isNotificationBroadcaster()); form.getToolBarManager().add(clearAction); form.getToolBarManager().add(subscribeAction); form.updateToolBar(); } private void toogleSubcription() { if (subscribeAction.isChecked()) { try { wrapper.getMBeanServerConnection().addNotificationListener( wrapper.getObjectName(), listener, null, null); } catch (Exception e) { JMXUIActivator.log(IStatus.ERROR, e.getMessage(), e); } } else { try { wrapper.getMBeanServerConnection().removeNotificationListener( wrapper.getObjectName(), listener); } catch (Exception e) { JMXUIActivator.log(IStatus.ERROR, e.getMessage(), e); } } } protected void createFormContent(IManagedForm managedForm) { FormToolkit toolkit = managedForm.getToolkit(); ScrolledForm form = managedForm.getForm(); form.setText(wrapper.getObjectName().getCanonicalName()); createToolBarActions(form); form.getForm().setSeparatorVisible(true); Composite body = form.getBody(); body.setLayout(new GridLayout(1, false)); Table table = toolkit.createTable(body, SWT.FULL_SELECTION); toolkit.paintBordersFor(body); GridDataFactory.fillDefaults().grab(true, true).applyTo(table); createColumns(table); table.setHeaderVisible(true); table.setLinesVisible(true); viewer = new TableViewer(table); viewer.setLabelProvider(new NotificationLabelProvider()); viewer.setContentProvider(new IStructuredContentProvider() { @SuppressWarnings("unchecked")//$NON-NLS-1$ public Object[] getElements(Object inputElement) { return (Notification[]) notifications .toArray(new Notification[notifications.size()]); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); viewer.setInput(notifications); listener = new NotificationListener() { @SuppressWarnings("unchecked")//$NON-NLS-1$ public void handleNotification(final Notification notification, Object handback) { // add notification at the head so that the more recent // appears at the top of the table (issue #25) notifications.add(0, notification); viewer.getControl().getDisplay().asyncExec(new Runnable() { public void run() { viewer.refresh(); } }); } }; } private void createColumns(final Table table) { final TableColumn timestampColumn = new TableColumn(table, SWT.NONE); timestampColumn.setText(Messages.NotificationsPage_timestamp); timestampColumn.setWidth(100); final TableColumn typeColumn = new TableColumn(table, SWT.NONE); typeColumn.setText(Messages.NotificationsPage_type); typeColumn.setWidth(200); final TableColumn messageColumn = new TableColumn(table, SWT.NONE); messageColumn.setText(Messages.NotificationsPage_message); messageColumn.setWidth(300); final TableColumn userDataColumn = new TableColumn(table, SWT.NONE); userDataColumn.setText(Messages.NotificationsPage_userData); userDataColumn.setWidth(100); final TableColumn sequenceNumberColumn = new TableColumn(table, SWT.NONE); sequenceNumberColumn.setText(Messages.NotificationsPage_sequenceNumber); sequenceNumberColumn.setWidth(100); final TableColumn sourceColumn = new TableColumn(table, SWT.NONE); sourceColumn.setText(Messages.NotificationsPage_source); sourceColumn.setWidth(100); } }