package org.eclipse.dltk.core.tools.internal.ui; import java.util.Map; import java.util.Map.Entry; import org.eclipse.dltk.core.RuntimePerformanceMonitor; import org.eclipse.dltk.core.RuntimePerformanceMonitor.DataEntry; import org.eclipse.dltk.ui.DLTKUIPlugin; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.contexts.IContextActivation; import org.eclipse.ui.contexts.IContextService; import org.eclipse.ui.part.ViewPart; public class DLTKPerformanceViewPart extends ViewPart { private static final int UPDATE_INTERVAL = 500; public class PerformanceLabelProvide extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { switch (columnIndex) { case 0: if (element instanceof Map.Entry) { return (String) ((Map.Entry) element).getKey(); } break; case 1: if (element instanceof Map.Entry) { Map.Entry entry = (Entry) element; if (entry.getValue() instanceof DataEntry) { DataEntry e = (DataEntry) entry.getValue(); return Long.toString(e.getTime()); } } break; case 2: if (element instanceof Map.Entry) { Map.Entry entry = (Entry) element; if (entry.getValue() instanceof DataEntry) { DataEntry e = (DataEntry) entry.getValue(); return Long.toString(e.getTotal()); } } break; case 3: if (element instanceof Map.Entry) { Map.Entry entry = (Entry) element; if (entry.getValue() instanceof DataEntry) { DataEntry e = (DataEntry) entry.getValue(); return Long.toString(e.getCount()); } } break; case 4: if (element instanceof Map.Entry) { Map.Entry entry = (Entry) element; if (entry.getValue() instanceof DataEntry) { DataEntry e = (DataEntry) entry.getValue(); if (e.getCount() != 0) { return Double.toString(e.getTime() / e.getCount()); } } } break; case 5: if (element instanceof Map.Entry) { Map.Entry entry = (Entry) element; if (entry.getValue() instanceof DataEntry) { DataEntry e = (DataEntry) entry.getValue(); if (e.getCount() != 0) { return Double.toString(e.getTotal() / e.getCount()); } } } break; case 6: if (element instanceof Map.Entry) { Map.Entry entry = (Entry) element; if (entry.getValue() instanceof DataEntry) { DataEntry e = (DataEntry) entry.getValue(); if (e.getTime() != 0) { return Double.toString(e.getTotal() / e.getTime()); } } } break; } return ""; } } private static final class PerformanceContentProvider implements ITreeContentProvider { private static final Object[] NONE_OBJECTS = new Object[0]; public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object inputElement) { Map<String, Map<String, DataEntry>> map = RuntimePerformanceMonitor .getAllEntries(); return map.entrySet().toArray(); } public boolean hasChildren(Object element) { if (element instanceof Map) { return !((Map) element).isEmpty(); } else if (element instanceof Map.Entry) { Map.Entry e = (Entry) element; Object value = e.getValue(); if (value instanceof Map) { Map mval = (Map) value; return !mval.isEmpty(); } } return false; } public Object getParent(Object element) { return null; } public Object[] getChildren(Object parentElement) { if (parentElement instanceof Map) { return ((Map) parentElement).entrySet().toArray(); } else if (parentElement instanceof Map.Entry) { Map.Entry e = (Entry) parentElement; if (e.getValue() instanceof Map) { return ((Map) e.getValue()).entrySet().toArray(); } } return NONE_OBJECTS; } } private TreeViewer viewer; private IContextActivation fContextActivation; public DLTKPerformanceViewPart() { } public void init(IViewSite site) throws PartInitException { super.init(site); RuntimePerformanceMonitor.setActive(true); } Runnable update = new Runnable() { public void run() { if (!viewer.getTree().isDisposed()) { viewer.refresh(); viewer.getTree().getDisplay() .timerExec(UPDATE_INTERVAL, update); viewer.expandAll(); } } }; @Override public void createPartControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout()); viewer = new TreeViewer(composite); viewer.getTree().setHeaderVisible(true); viewer.getTree().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true)); TreeColumn col = new TreeColumn(viewer.getTree(), SWT.NONE); col.setText("ID"); col.setWidth(250); TreeColumn time = new TreeColumn(viewer.getTree(), SWT.NONE); time.setText("Time"); time.setWidth(80); TreeColumn total = new TreeColumn(viewer.getTree(), SWT.NONE); total.setText("Total"); total.setWidth(80); TreeColumn count = new TreeColumn(viewer.getTree(), SWT.NONE); count.setText("Count"); count.setWidth(80); TreeColumn avrTime = new TreeColumn(viewer.getTree(), SWT.NONE); avrTime.setText("Avr.Time"); avrTime.setWidth(80); TreeColumn average = new TreeColumn(viewer.getTree(), SWT.NONE); average.setText("Avr.Count"); average.setWidth(80); TreeColumn speed = new TreeColumn(viewer.getTree(), SWT.NONE); speed.setText("Speed"); speed.setWidth(80); viewer.setContentProvider(new PerformanceContentProvider()); viewer.setLabelProvider(new PerformanceLabelProvide()); viewer.setInput(new Object()); parent.getDisplay().timerExec(500, update); Button clear = new Button(composite, SWT.PUSH); clear.setText("Clear"); clear.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { RuntimePerformanceMonitor.clear(); } public void widgetDefaultSelected(SelectionEvent e) { } }); IContextService ctxService = (IContextService) getSite().getService( IContextService.class); if (ctxService != null) { fContextActivation = ctxService .activateContext(DLTKUIPlugin.CONTEXT_VIEWS); } } @Override public void setFocus() { } @Override public void dispose() { if (fContextActivation != null) { IContextService ctxService = (IContextService) getSite() .getService(IContextService.class); if (ctxService != null) { ctxService.deactivateContext(fContextActivation); } } super.dispose(); } }