/******************************************************************************* * Copyright (c) 2006 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 * * Code was inspired by org.eclipse.equinox.client source, (c) 2006 IBM *******************************************************************************/ package net.jmesnil.jmx.ui.internal.tables; import javax.management.MBeanOperationInfo; import javax.management.MBeanParameterInfo; import net.jmesnil.jmx.resources.MBeanInfoWrapper; import net.jmesnil.jmx.resources.MBeanOperationInfoWrapper; import net.jmesnil.jmx.ui.JMXUIActivator; import net.jmesnil.jmx.ui.internal.JMXImages; import net.jmesnil.jmx.ui.internal.Messages; import net.jmesnil.jmx.ui.internal.StringUtils; import net.jmesnil.jmx.ui.internal.views.explorer.MBeanExplorer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IViewPart; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.part.ISetSelectionTarget; public class MBeanOperationsTable { protected class MBeanOpContentProvider implements IStructuredContentProvider { private MBeanOperationInfoWrapper[] opInfos; public Object[] getElements(Object inputElement) { if (opInfos == null) return new Object[0]; return opInfos; } public void dispose() { // nothing needs to be disposed } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { opInfos = (MBeanOperationInfoWrapper[]) newInput; } } protected class MBeanOpLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { switch (columnIndex) { case 0: return JMXImages.get(JMXImages.IMG_MISC_PUBLIC); } return null; } public String getColumnText(Object element, int columnIndex) { if (!(element instanceof MBeanOperationInfoWrapper)) return super.getText(element); MBeanOperationInfoWrapper wrapper = (MBeanOperationInfoWrapper) element; MBeanOperationInfo opInfo = wrapper.getMBeanOperationInfo(); switch (columnIndex) { case 0: return ""; //$NON-NLS-1$ case 1: return opInfo.getReturnType() != null ? StringUtils .toString(opInfo.getReturnType()) : "void"; //$NON-NLS-1$ case 2: return opInfo.getName(); case 3: MBeanParameterInfo[] params = opInfo.getSignature(); StringBuffer sb = new StringBuffer(); for (int j = 0; j < params.length; j++) { String type = params[j].getType(); if (j != 0) sb.append(", "); //$NON-NLS-1$ sb.append(StringUtils.toString(type)); } return sb.toString(); } return getText(element); } } protected class MBeanOpViewerSorter extends ViewerSorter { int fDirection, fIndex; protected MBeanOpViewerSorter(int direction, int index) { fDirection = direction == SWT.UP ? -1 : 1; fIndex = index; } @Override public int compare(Viewer viewer, Object e1, Object e2) { if (e1 instanceof MBeanOperationInfo && e2 instanceof MBeanOperationInfo) { MBeanOperationInfo opInfo1 = ((MBeanOperationInfoWrapper) e1) .getMBeanOperationInfo(); MBeanOperationInfo opInfo2 = ((MBeanOperationInfoWrapper) e2) .getMBeanOperationInfo(); switch (fIndex) { case 1: String a1 = opInfo1.getReturnType(); String a2 = opInfo2.getReturnType(); int p = a1.lastIndexOf('.'); if (p != -1) a1 = a1.substring(p + 1); p = a2.lastIndexOf('.'); if (p != -1) a2 = a2.substring(p + 1); return fDirection * a1.compareTo(a2); case 2: return fDirection * opInfo1.getName().compareTo(opInfo2.getName()); case 3: MBeanParameterInfo[] info1 = opInfo1.getSignature(); MBeanParameterInfo[] info2 = opInfo2.getSignature(); if (info2.length == 0) return fDirection; if (info1.length == 0) return -fDirection; return fDirection * (info1[0].getType().compareTo(info2[0].getType())); } } return fDirection * super.compare(viewer, e1, e2); } } private TableViewer viewer; public MBeanOperationsTable(Composite parent, final FormToolkit toolkit) { final Table operationsTable = toolkit.createTable(parent, SWT.FULL_SELECTION); GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 20; gd.widthHint = 100; operationsTable.setLayoutData(gd); toolkit.paintBordersFor(parent); createColumns(operationsTable); operationsTable.setLinesVisible(true); operationsTable.setHeaderVisible(true); viewer = new TableViewer(operationsTable); viewer.setContentProvider(new MBeanOpContentProvider()); viewer.setLabelProvider(new MBeanOpLabelProvider()); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IViewPart part = JMXUIActivator.getActivePage().findView( MBeanExplorer.ID); if (part != JMXUIActivator.getActivePage().getActivePart()) { ((ISetSelectionTarget) part).selectReveal(event .getSelection()); } } }); } private void createColumns(final Table opTable) { TableColumn blankCol = new TableColumn(opTable, SWT.NONE); blankCol.setText(""); //$NON-NLS-1$ blankCol.setWidth(20); final TableColumn returnType = new TableColumn(opTable, SWT.NONE); returnType.setText(Messages.returnType); returnType.setWidth(100); final TableColumn opName = new TableColumn(opTable, SWT.NONE); opName.setText(Messages.name); opName.setWidth(150); final TableColumn params = new TableColumn(opTable, SWT.NONE); params.setText(Messages.parameters); params.setWidth(300); Listener sortListener = new Listener() { public void handleEvent(Event e) { // determine new sort column and direction TableColumn sortColumn = opTable.getSortColumn(); TableColumn currentColumn = (TableColumn) e.widget; int dir = opTable.getSortDirection(); if (sortColumn == currentColumn) { dir = dir == SWT.UP ? SWT.DOWN : SWT.UP; } else { opTable.setSortColumn(currentColumn); dir = SWT.UP; } int colIndex; if (currentColumn == returnType) colIndex = 1; else if (currentColumn == opName) colIndex = 2; else if (currentColumn == params) colIndex = 3; else return; // sort the data based on column and direction opTable.setSortDirection(dir); viewer.setSorter(new MBeanOpViewerSorter(dir, colIndex)); } }; returnType.addListener(SWT.Selection, sortListener); opName.addListener(SWT.Selection, sortListener); params.addListener(SWT.Selection, sortListener); opTable.setSortColumn(opName); opTable.setSortDirection(SWT.UP); } public void setInput(MBeanInfoWrapper input) { if (input == null || input.getMBeanInfo() == null) viewer.setInput(null); else viewer.setInput(input.getMBeanOperationInfoWrappers()); } public Viewer getViewer() { return viewer; } }