Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2007-08-07 09:48:47 +0000
committerEike Stepper2007-08-07 09:48:47 +0000
commit8ef3c98cf31aad2834318229aa096dea3a5aa98e (patch)
tree11aaf4bdb36605c3bb1406dfc3de0ccb8b1a9c4f /plugins/org.eclipse.net4j.debug
parent42b13704bc2b7a8a2d0568c8ab1c0b0b574f6aaf (diff)
downloadcdo-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.xml29
-rw-r--r--plugins/org.eclipse.net4j.debug/src/org/eclipse/net4j/internal/debug/views/IntrospectorView.java294
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

Back to the top