diff options
author | Eike Stepper | 2007-08-07 09:48:47 +0000 |
---|---|---|
committer | Eike Stepper | 2007-08-07 09:48:47 +0000 |
commit | 8ef3c98cf31aad2834318229aa096dea3a5aa98e (patch) | |
tree | 11aaf4bdb36605c3bb1406dfc3de0ccb8b1a9c4f /plugins/org.eclipse.net4j.debug | |
parent | 42b13704bc2b7a8a2d0568c8ab1c0b0b574f6aaf (diff) | |
download | cdo-8ef3c98cf31aad2834318229aa096dea3a5aa98e.tar.gz cdo-8ef3c98cf31aad2834318229aa096dea3a5aa98e.tar.xz cdo-8ef3c98cf31aad2834318229aa096dea3a5aa98e.zip |
*** empty log message ***
Diffstat (limited to 'plugins/org.eclipse.net4j.debug')
-rw-r--r-- | plugins/org.eclipse.net4j.debug/plugin.xml | 29 | ||||
-rw-r--r-- | plugins/org.eclipse.net4j.debug/src/org/eclipse/net4j/internal/debug/views/IntrospectorView.java | 294 |
2 files changed, 306 insertions, 17 deletions
diff --git a/plugins/org.eclipse.net4j.debug/plugin.xml b/plugins/org.eclipse.net4j.debug/plugin.xml index 23119d2b2a..7d265c962d 100644 --- a/plugins/org.eclipse.net4j.debug/plugin.xml +++ b/plugins/org.eclipse.net4j.debug/plugin.xml @@ -5,28 +5,23 @@ <extension point="org.eclipse.ui.views"> <category - name="Net4j" - id="org.eclipse.net4j"> + name="Net4j Debug" + id="org.eclipse.net4j.debug"> </category> <view name="Remote Traces" icon="icons/sample.gif" - category="org.eclipse.net4j" + category="org.eclipse.net4j.debug" class="org.eclipse.net4j.internal.debug.views.RemoteTraceView" - id="org.eclipse.net4j.internal.debug.views.RemoteTraceView"> + id="org.eclipse.net4j.debug.RemoteTraceView"> + </view> + <view + name="Introspector" + icon="icons/sample.gif" + category="org.eclipse.net4j.debug" + class="org.eclipse.net4j.internal.debug.views.IntrospectorView" + id="org.eclipse.net4j.debug.IntrospectorView"> </view> </extension> - <extension - point="org.eclipse.ui.perspectiveExtensions"> - <perspectiveExtension - targetID="org.eclipse.ui.resourcePerspective"> - <view - ratio="0.5" - relative="org.eclipse.ui.views.TaskList" - relationship="right" - id="org.eclipse.net4j.internal.debug.views.RemoteTraceView"> - </view> - </perspectiveExtension> - </extension> - + </plugin> diff --git a/plugins/org.eclipse.net4j.debug/src/org/eclipse/net4j/internal/debug/views/IntrospectorView.java b/plugins/org.eclipse.net4j.debug/src/org/eclipse/net4j/internal/debug/views/IntrospectorView.java new file mode 100644 index 0000000000..a2632e11a5 --- /dev/null +++ b/plugins/org.eclipse.net4j.debug/src/org/eclipse/net4j/internal/debug/views/IntrospectorView.java @@ -0,0 +1,294 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * 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 + * + * Contributors: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.net4j.internal.debug.views; + +import org.eclipse.net4j.internal.debug.bundle.OM; +import org.eclipse.net4j.util.ReflectUtil; +import org.eclipse.net4j.util.collection.Pair; + +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +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.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.part.ViewPart; + +import java.lang.reflect.Field; + +/** + * @author Eike Stepper + */ +public class IntrospectorView extends ViewPart implements ISelectionListener +{ + private static final Object[] NO_ELEMENTS = {}; + + private TableViewer viewer; + + private Object selection; + + public IntrospectorView() + { + } + + @Override + public void dispose() + { + getSite().getPage().removeSelectionListener(this); + super.dispose(); + } + + @Override + public void createPartControl(Composite parent) + { + viewer = new TableViewer(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + viewer.getTable().setHeaderVisible(true); + viewer.getTable().setLinesVisible(true); + createColmuns(viewer); + viewer.setContentProvider(new ViewContentProvider()); + viewer.setLabelProvider(new ViewLabelProvider()); + viewer.setInput(getViewSite()); + + makeActions(); + hookContextMenu(); + hookDoubleClickAction(); + contributeToActionBars(); + + getSite().getPage().addSelectionListener(this); + // getSite().getPage().getSelectionProvider().addSelectionChangedListener(this); + } + + protected void createColmuns(TableViewer viewer) + { + final String[] columnNames = { "Field", "Value" }; + final int[] columnWidths = { 200, 400 }; + TableColumn[] columns = new TableColumn[columnNames.length]; + for (int i = 0; i < columns.length; i++) + { + TableColumn column = new TableColumn(viewer.getTable(), SWT.LEFT, i); + column.setText(columnNames[i]); + column.setWidth(columnWidths[i]); + column.setMoveable(true); + column.setResizable(true); + } + } + + public void refreshViewer() + { + if (isViewerAlive()) + { + getSite().getShell().getDisplay().asyncExec(new Runnable() + { + public void run() + { + if (isViewerAlive()) + { + viewer.refresh(); + } + } + }); + } + } + + public void selectionChanged(IWorkbenchPart part, ISelection sel) + { + if (part == this) + { + return; + } + + if (sel instanceof IStructuredSelection) + { + IStructuredSelection ssel = (IStructuredSelection)sel; + selection = ssel.getFirstElement(); + } + else + { + selection = null; + } + + refreshViewer(); + } + + private boolean isViewerAlive() + { + return viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed(); + } + + private void hookContextMenu() + { + MenuManager menuMgr = new MenuManager("#PopupMenu"); + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() + { + public void menuAboutToShow(IMenuManager manager) + { + IntrospectorView.this.fillContextMenu(manager); + } + }); + + Menu menu = menuMgr.createContextMenu(viewer.getControl()); + viewer.getControl().setMenu(menu); + getSite().registerContextMenu(menuMgr, viewer); + } + + private void contributeToActionBars() + { + IActionBars bars = getViewSite().getActionBars(); + fillLocalPullDown(bars.getMenuManager()); + fillLocalToolBar(bars.getToolBarManager()); + } + + private void fillLocalPullDown(IMenuManager manager) + { + } + + private void fillContextMenu(IMenuManager manager) + { + manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); + } + + private void fillLocalToolBar(IToolBarManager manager) + { + } + + private void makeActions() + { + } + + private void hookDoubleClickAction() + { + viewer.addDoubleClickListener(new IDoubleClickListener() + { + public void doubleClick(DoubleClickEvent event) + { + } + }); + } + + @SuppressWarnings("unused") + private void showMessage(String message) + { + MessageDialog.openInformation(viewer.getControl().getShell(), "Remote Traces", message); + } + + /** + * Passing the focus request to the viewer's control. + */ + @Override + public void setFocus() + { + viewer.getControl().setFocus(); + } + + /** + * @author Eike Stepper + */ + class ViewContentProvider implements IStructuredContentProvider + { + public void inputChanged(Viewer v, Object oldInput, Object newInput) + { + } + + public void dispose() + { + } + + public Object[] getElements(Object parent) + { + if (selection != null) + { + try + { + return ReflectUtil.dumpToArray(selection); + } + catch (RuntimeException ex) + { + OM.LOG.error(ex); + } + } + + return NO_ELEMENTS; + } + } + + /** + * @author Eike Stepper + */ + class ViewLabelProvider extends LabelProvider implements ITableLabelProvider + { + public ViewLabelProvider() + { + } + + public String getColumnText(Object obj, int index) + { + if (obj instanceof Pair) + { + try + { + Pair<Field, Object> pair = (Pair)obj; + switch (index) + { + case 0: + return pair.getElement1().getName(); + case 1: + Object value = pair.getElement2(); + return value == null ? "null" : value.toString(); + } + } + catch (RuntimeException ex) + { + OM.LOG.error(ex); + } + } + + return getText(obj); + } + + public Image getColumnImage(Object obj, int index) + { + return null; + } + + @Override + public Image getImage(Object obj) + { + return null; + } + } + + /** + * @author Eike Stepper + */ + class NameSorter extends ViewerSorter + { + } +}
\ No newline at end of file |