Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2021-11-11 05:35:37 +0000
committerEike Stepper2021-11-11 05:35:37 +0000
commit583759ff711db7c756a3cb3ad2e06704e572b94f (patch)
tree6a661dcacca5a4159822e43b16fd75191f9928a9
parente40e42a8aed8b2e8f6ce9e94b1f95f7dcec354fc (diff)
downloadcdo-583759ff711db7c756a3cb3ad2e06704e572b94f.tar.gz
cdo-583759ff711db7c756a3cb3ad2e06704e572b94f.tar.xz
cdo-583759ff711db7c756a3cb3ad2e06704e572b94f.zip
[577178] Provide a view that lists all IChannels and logs of their signals
https://bugs.eclipse.org/bugs/show_bug.cgi?id=577178
-rw-r--r--features/org.eclipse.net4j.ui-feature/feature.xml2
-rw-r--r--features/org.eclipse.net4j.ui-feature/pom.xml2
-rw-r--r--plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/LinkedResourceWizardPage.java3
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/plugin.xml18
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOLockStatesView.java259
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java36
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/.settings/.api_filters5
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/META-INF/MANIFEST.MF6
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/icons/full/etool16/clear_log.pngbin0 -> 620 bytes
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/indication_async.gifbin0 -> 324 bytes
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/indication_sync.gifbin0 -> 324 bytes
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/request_async.gifbin0 -> 323 bytes
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/request_sync.gifbin0 -> 323 bytes
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/signal.gifbin0 -> 198 bytes
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/pom.xml2
-rw-r--r--plugins/org.eclipse.net4j.ui.shared/src/org/eclipse/net4j/ui/shared/SharedIcons.java40
-rw-r--r--plugins/org.eclipse.net4j.ui/src/org/eclipse/net4j/internal/ui/messages/messages.properties3
-rw-r--r--plugins/org.eclipse.net4j.ui/src/org/eclipse/net4j/internal/ui/views/ChannelsView.java154
-rw-r--r--plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/SearchField.java3
19 files changed, 493 insertions, 40 deletions
diff --git a/features/org.eclipse.net4j.ui-feature/feature.xml b/features/org.eclipse.net4j.ui-feature/feature.xml
index b961118c9c..643d52774f 100644
--- a/features/org.eclipse.net4j.ui-feature/feature.xml
+++ b/features/org.eclipse.net4j.ui-feature/feature.xml
@@ -12,7 +12,7 @@
<feature
id="org.eclipse.net4j.ui"
label="%featureName"
- version="4.5.1.qualifier"
+ version="4.6.0.qualifier"
provider-name="%providerName"
image="eclipse_update_120.jpg"
license-feature="org.eclipse.emf.cdo.license"
diff --git a/features/org.eclipse.net4j.ui-feature/pom.xml b/features/org.eclipse.net4j.ui-feature/pom.xml
index 55e9a04228..ddfd5b4a27 100644
--- a/features/org.eclipse.net4j.ui-feature/pom.xml
+++ b/features/org.eclipse.net4j.ui-feature/pom.xml
@@ -25,7 +25,7 @@
<groupId>org.eclipse.emf.cdo.features</groupId>
<artifactId>org.eclipse.net4j.ui</artifactId>
- <version>4.5.1-SNAPSHOT</version>
+ <version>4.6.0-SNAPSHOT</version>
<packaging>eclipse-feature</packaging>
</project>
diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/LinkedResourceWizardPage.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/LinkedResourceWizardPage.java
index c7f267aafd..f7f17e169e 100644
--- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/LinkedResourceWizardPage.java
+++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/LinkedResourceWizardPage.java
@@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutContentProvider;
import org.eclipse.net4j.util.StringUtil;
import org.eclipse.net4j.util.ui.UIUtil;
+import org.eclipse.net4j.util.ui.views.ItemProvider;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
@@ -265,7 +266,7 @@ public class LinkedResourceWizardPage extends CheckoutNodeWizardPage
}
}
- return new Object[0];
+ return ItemProvider.NO_ELEMENTS;
}
@Override
diff --git a/plugins/org.eclipse.emf.cdo.ui/plugin.xml b/plugins/org.eclipse.emf.cdo.ui/plugin.xml
index 2f2c79116f..3fd38a2a49 100644
--- a/plugins/org.eclipse.emf.cdo.ui/plugin.xml
+++ b/plugins/org.eclipse.emf.cdo.ui/plugin.xml
@@ -66,29 +66,31 @@
class="org.eclipse.emf.cdo.internal.ui.views.CDOSessionsView"
icon="platform:/plugin/org.eclipse.emf.cdo.ui.shared/icons/full/view16/cdo_sessions.gif"
id="org.eclipse.emf.cdo.ui.CDOSessionsView"
- name="%view.name.0">
- </view>
+ name="%view.name.0"/>
<view
category="org.eclipse.emf.cdo"
class="org.eclipse.emf.cdo.internal.ui.views.CDOWatchListView"
icon="platform:/plugin/org.eclipse.emf.cdo.ui.shared/icons/full/view16/watch_list.gif"
id="org.eclipse.emf.cdo.ui.CDOWatchListView"
- name="%view.name.1">
- </view>
+ name="%view.name.1"/>
<view
category="org.eclipse.emf.cdo"
class="org.eclipse.emf.cdo.internal.ui.views.CDORemoteSessionsView"
icon="platform:/plugin/org.eclipse.emf.cdo.ui.shared/icons/full/view16/cdo_remote_sessions.gif"
id="org.eclipse.emf.cdo.ui.CDORemoteSessionsView"
- name="%view.name.2">
- </view>
+ name="%view.name.2"/>
<view
category="org.eclipse.emf.cdo"
class="org.eclipse.emf.cdo.internal.ui.views.CDOTimeMachineView"
icon="platform:/plugin/org.eclipse.emf.cdo.ui.shared/icons/full/view16/cdo_time_machine.gif"
id="org.eclipse.emf.cdo.ui.CDOTimeMachineView"
- name="%view.name.3">
- </view>
+ name="%view.name.3"/>
+ <view
+ category="org.eclipse.emf.cdo"
+ class="org.eclipse.emf.cdo.internal.ui.views.CDOLockStatesView"
+ icon="icons/full/elcl16/lock.gif"
+ id="org.eclipse.emf.cdo.ui.CDOLockStatesView"
+ name="CDO Lock States"/>
</extension>
<extension point = "org.eclipse.ui.editors">
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOLockStatesView.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOLockStatesView.java
new file mode 100644
index 0000000000..73050234be
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/views/CDOLockStatesView.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2021 Eike Stepper (Loehne, Germany) and others.
+ * 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.emf.cdo.internal.ui.views;
+
+import org.eclipse.emf.cdo.CDOElement;
+import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.common.lock.CDOLockState;
+import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.cdo.util.CDOUtil;
+import org.eclipse.emf.cdo.view.CDOView;
+import org.eclipse.emf.cdo.view.CDOViewInvalidationEvent;
+
+import org.eclipse.emf.internal.cdo.view.CDOViewImpl;
+import org.eclipse.emf.internal.cdo.view.CDOViewImpl.LockStatesChangedEvent;
+
+import org.eclipse.net4j.util.AdapterUtil;
+import org.eclipse.net4j.util.StringUtil;
+import org.eclipse.net4j.util.event.IEvent;
+import org.eclipse.net4j.util.lifecycle.ILifecycleEvent;
+import org.eclipse.net4j.util.lifecycle.ILifecycleEvent.Kind;
+import org.eclipse.net4j.util.ui.StructuredContentProvider;
+import org.eclipse.net4j.util.ui.UIUtil;
+import org.eclipse.net4j.util.ui.actions.SafeAction;
+import org.eclipse.net4j.util.ui.views.ContainerView;
+import org.eclipse.net4j.util.ui.views.ItemProvider;
+
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.ViewPart;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Eike Stepper
+ */
+public class CDOLockStatesView extends ViewPart implements ISelectionListener
+{
+ public static final String ID = "org.eclipse.emf.cdo.ui.CDOLockStatesView"; //$NON-NLS-1$
+
+ private TableViewer viewer;
+
+ public CDOLockStatesView()
+ {
+ }
+
+ @Override
+ public void createPartControl(Composite parent)
+ {
+ TableColumnLayout tableLayout = new TableColumnLayout();
+
+ Composite tableComposite = new Composite(parent, SWT.NONE);
+ tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ tableComposite.setLayout(tableLayout);
+
+ viewer = new TableViewer(tableComposite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(new ContentProvider());
+
+ TableViewerColumn objectViewerColumn = new TableViewerColumn(viewer, SWT.NONE);
+ TableColumn objectColumn = objectViewerColumn.getColumn();
+ objectColumn.setText("Object");
+ tableLayout.setColumnData(objectColumn, new ColumnWeightData(30, 100, true));
+ objectViewerColumn.setLabelProvider(new ColumnLabelProvider()
+ {
+ @Override
+ public String getText(Object element)
+ {
+ @SuppressWarnings("unchecked")
+ CDOObject object = ((Map.Entry<CDOObject, CDOLockState>)element).getKey();
+ CDORevision revision = object.cdoRevision(false);
+ if (revision != null)
+ {
+ return StringUtil.safe(revision);
+ }
+
+ return StringUtil.safe(object);
+ }
+ });
+
+ TableViewerColumn lockStateViewerColumn = new TableViewerColumn(viewer, SWT.NONE);
+ TableColumn lockStateColumn = lockStateViewerColumn.getColumn();
+ lockStateColumn.setText("Lock State");
+ tableLayout.setColumnData(lockStateColumn, new ColumnWeightData(70, 150, true));
+ lockStateViewerColumn.setLabelProvider(new ColumnLabelProvider()
+ {
+ @Override
+ public String getText(Object element)
+ {
+ @SuppressWarnings("unchecked")
+ CDOLockState lockState = ((Map.Entry<CDOObject, CDOLockState>)element).getValue();
+ return StringUtil.safe(lockState);
+ }
+ });
+
+ IViewSite site = getViewSite();
+ site.setSelectionProvider(viewer);
+
+ IWorkbenchPage page = site.getPage();
+ selectionChanged(null, page.getSelection());
+ page.addSelectionListener(this);
+
+ IActionBars bars = site.getActionBars();
+ IToolBarManager toolBarManager = bars.getToolBarManager();
+ toolBarManager.add(new SafeAction("Refresh", ContainerView.getRefreshImageDescriptor())
+ {
+ @Override
+ protected void safeRun() throws Exception
+ {
+ viewer.refresh();
+ }
+ });
+ }
+
+ @Override
+ public void dispose()
+ {
+ getSite().getPage().removeSelectionListener(this);
+ super.dispose();
+ }
+
+ @Override
+ public void setFocus()
+ {
+ viewer.getControl().setFocus();
+ }
+
+ @Override
+ public void selectionChanged(IWorkbenchPart part, ISelection selection)
+ {
+ CDOViewImpl view = getView(selection);
+ if (view != null && view.isActive())
+ {
+ viewer.setInput(view);
+ }
+ }
+
+ private CDOViewImpl getView(ISelection selection)
+ {
+ if (selection instanceof IStructuredSelection)
+ {
+ IStructuredSelection ssel = (IStructuredSelection)selection;
+ for (Iterator<?> it = ssel.iterator(); it.hasNext();)
+ {
+ Object element = it.next();
+ if (element instanceof CDOElement)
+ {
+ element = ((CDOElement)element).getDelegate();
+ }
+
+ if (element instanceof Notifier)
+ {
+ Notifier notifier = (Notifier)element;
+
+ CDOView view = CDOUtil.getView(notifier);
+ if (view instanceof CDOViewImpl)
+ {
+ return (CDOViewImpl)view;
+ }
+ }
+
+ CDOView view = AdapterUtil.adapt(element, CDOView.class);
+ if (view instanceof CDOViewImpl)
+ {
+ return (CDOViewImpl)view;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public class ContentProvider extends StructuredContentProvider<CDOViewImpl>
+ {
+ public ContentProvider()
+ {
+ }
+
+ @Override
+ protected void connectInput(CDOViewImpl view)
+ {
+ view.addListener(this);
+ }
+
+ @Override
+ protected void disconnectInput(CDOViewImpl view)
+ {
+ view.removeListener(this);
+ }
+
+ @Override
+ public Object[] getElements(Object inputElement)
+ {
+ CDOViewImpl view = getInput();
+ if (view == null)
+ {
+ return ItemProvider.NO_ELEMENTS;
+ }
+
+ Set<Map.Entry<CDOObject, CDOLockState>> entrySet = view.getLockStates().entrySet();
+
+ @SuppressWarnings("unchecked")
+ Map.Entry<CDOObject, CDOLockState>[] elements = entrySet.toArray(new Map.Entry[entrySet.size()]);
+ Arrays.sort(elements, Comparator.comparing(Map.Entry::getKey, Comparator.comparing(CDOObject::cdoID)));
+ return elements;
+ }
+
+ @Override
+ public void notifyEvent(IEvent event)
+ {
+ if (event instanceof ILifecycleEvent)
+ {
+ ILifecycleEvent e = (ILifecycleEvent)event;
+ if (e.getKind() == Kind.DEACTIVATED)
+ {
+ UIUtil.asyncExec(() -> getViewer().setInput(null));
+ }
+ }
+ else if (event instanceof CDOViewInvalidationEvent)
+ {
+ refreshViewer(true);
+ }
+ else if (event instanceof LockStatesChangedEvent)
+ {
+ refreshViewer(true);
+ }
+ }
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
index 5b1256ed9c..e631f882fb 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
@@ -169,7 +169,41 @@ public class CDOViewImpl extends AbstractCDOView
@ExcludeFromDump
private CDOLockOwner lockOwner;
- private Map<CDOObject, CDOLockState> lockStates = new WeakHashMap<>();
+ private Map<CDOObject, CDOLockState> lockStates = new WeakHashMap<CDOObject, CDOLockState>()
+ {
+ @Override
+ public CDOLockState put(CDOObject key, CDOLockState value)
+ {
+ CDOLockState old = super.put(key, value);
+ fireLockStatesChangedEvent();
+ return old;
+ }
+
+ @Override
+ public CDOLockState remove(Object key)
+ {
+ CDOLockState removed = super.remove(key);
+ if (removed != null)
+ {
+ fireLockStatesChangedEvent();
+ }
+
+ return removed;
+ }
+ };
+
+ protected void fireLockStatesChangedEvent()
+ {
+ fireEvent(new LockStatesChangedEvent());
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public final class LockStatesChangedEvent extends Event
+ {
+ private static final long serialVersionUID = 1L;
+ }
@ExcludeFromDump
private ViewInvalidator invalidator = new ViewInvalidator();
diff --git a/plugins/org.eclipse.net4j.ui.shared/.settings/.api_filters b/plugins/org.eclipse.net4j.ui.shared/.settings/.api_filters
index 6e5d9cdbf8..3f8a36206b 100644
--- a/plugins/org.eclipse.net4j.ui.shared/.settings/.api_filters
+++ b/plugins/org.eclipse.net4j.ui.shared/.settings/.api_filters
@@ -7,6 +7,11 @@
<message_argument value="OBJ_SIGNAL"/>
</message_arguments>
</filter>
+ <filter id="337768515">
+ <message_arguments>
+ <message_argument value="org.eclipse.net4j.ui.shared.SharedIcons"/>
+ </message_arguments>
+ </filter>
<filter id="1143996420">
<message_arguments>
<message_argument value="OBJ_SIGNAL"/>
diff --git a/plugins/org.eclipse.net4j.ui.shared/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.ui.shared/META-INF/MANIFEST.MF
index cf6cd72f5d..c076cd4b24 100644
--- a/plugins/org.eclipse.net4j.ui.shared/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.net4j.ui.shared/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: org.eclipse.net4j.ui.shared;singleton:=true
-Bundle-Version: 4.5.1.qualifier
+Bundle-Version: 4.6.0.qualifier
Bundle-Name: %pluginName
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -9,8 +9,8 @@ Bundle-ActivationPolicy: lazy
Bundle-Activator: org.eclipse.net4j.ui.internal.shared.bundle.OM$Activator
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ClassPath: .
-Export-Package: org.eclipse.net4j.ui.shared;version="4.5.1";uses:="org.eclipse.jface.resource,org.eclipse.swt.graphics",
- org.eclipse.net4j.ui.internal.shared.bundle;version="4.5.1";x-internal:=true
+Export-Package: org.eclipse.net4j.ui.shared;version="4.6.0";uses:="org.eclipse.jface.resource,org.eclipse.swt.graphics",
+ org.eclipse.net4j.ui.internal.shared.bundle;version="4.6.0";x-internal:=true
Require-Bundle: org.eclipse.ui;bundle-version="[3.6.0,4.0.0)",
org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
org.eclipse.net4j.util;bundle-version="[3.1.0,4.0.0)"
diff --git a/plugins/org.eclipse.net4j.ui.shared/icons/full/etool16/clear_log.png b/plugins/org.eclipse.net4j.ui.shared/icons/full/etool16/clear_log.png
new file mode 100644
index 0000000000..559471b892
--- /dev/null
+++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/etool16/clear_log.png
Binary files differ
diff --git a/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/indication_async.gif b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/indication_async.gif
new file mode 100644
index 0000000000..978c271661
--- /dev/null
+++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/indication_async.gif
Binary files differ
diff --git a/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/indication_sync.gif b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/indication_sync.gif
new file mode 100644
index 0000000000..3ae5817b1e
--- /dev/null
+++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/indication_sync.gif
Binary files differ
diff --git a/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/request_async.gif b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/request_async.gif
new file mode 100644
index 0000000000..ce70642be0
--- /dev/null
+++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/request_async.gif
Binary files differ
diff --git a/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/request_sync.gif b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/request_sync.gif
new file mode 100644
index 0000000000..d3003d9e03
--- /dev/null
+++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/request_sync.gif
Binary files differ
diff --git a/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/signal.gif b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/signal.gif
new file mode 100644
index 0000000000..70c4a3f855
--- /dev/null
+++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/signal.gif
Binary files differ
diff --git a/plugins/org.eclipse.net4j.ui.shared/pom.xml b/plugins/org.eclipse.net4j.ui.shared/pom.xml
index faedba449c..28d838118a 100644
--- a/plugins/org.eclipse.net4j.ui.shared/pom.xml
+++ b/plugins/org.eclipse.net4j.ui.shared/pom.xml
@@ -25,7 +25,7 @@
<groupId>org.eclipse.emf.cdo</groupId>
<artifactId>org.eclipse.net4j.ui.shared</artifactId>
- <version>4.5.1-SNAPSHOT</version>
+ <version>4.6.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/plugins/org.eclipse.net4j.ui.shared/src/org/eclipse/net4j/ui/shared/SharedIcons.java b/plugins/org.eclipse.net4j.ui.shared/src/org/eclipse/net4j/ui/shared/SharedIcons.java
index a8e6dfdf94..6b68be2152 100644
--- a/plugins/org.eclipse.net4j.ui.shared/src/org/eclipse/net4j/ui/shared/SharedIcons.java
+++ b/plugins/org.eclipse.net4j.ui.shared/src/org/eclipse/net4j/ui/shared/SharedIcons.java
@@ -21,7 +21,7 @@ import org.eclipse.ui.plugin.AbstractUIPlugin;
/**
* @author Eike Stepper
*/
-public class SharedIcons
+public final class SharedIcons
{
private static final ImageRegistry REGISTRY = new ImageRegistry(getDisplay());
@@ -33,7 +33,30 @@ public class SharedIcons
public static final String OBJ_CHANNEL = OBJ + "channel"; //$NON-NLS-1$
- public static final String OBJ_SIGNAL = OBJ + "message"; //$NON-NLS-1$
+ /**
+ * @since 4.6
+ */
+ public static final String OBJ_SIGNAL = OBJ + "signal"; //$NON-NLS-1$
+
+ /**
+ * @since 4.6
+ */
+ public static final String OBJ_REQUEST_SYNC = OBJ + "request_sync"; //$NON-NLS-1$
+
+ /**
+ * @since 4.6
+ */
+ public static final String OBJ_REQUEST_ASYNC = OBJ + "request_async"; //$NON-NLS-1$
+
+ /**
+ * @since 4.6
+ */
+ public static final String OBJ_INDICATION_SYNC = OBJ + "indication_sync"; //$NON-NLS-1$
+
+ /**
+ * @since 4.6
+ */
+ public static final String OBJ_INDICATION_ASYNC = OBJ + "indication_async"; //$NON-NLS-1$
public static final String OBJ_CONNECTOR = OBJ + "connector"; //$NON-NLS-1$
@@ -90,6 +113,11 @@ public class SharedIcons
*/
public static final String ETOOL_COLLAPSE_ALL = ETOOL + "collapse_all"; //$NON-NLS-1$
+ /**
+ * @since 4.6
+ */
+ public static final String ETOOL_CLEAR_LOG = ETOOL + "clear_log.png"; //$NON-NLS-1$
+
private static final String VIEW = "view16/"; //$NON-NLS-1$
public static final String VIEW_CONTAINER = VIEW + "container"; //$NON-NLS-1$
@@ -169,6 +197,12 @@ public class SharedIcons
private static String mangleKey(String key)
{
- return "icons/full/" + key + ".gif"; //$NON-NLS-1$ //$NON-NLS-2$
+ key = "icons/full/" + key;
+ if (key.endsWith(".png"))
+ {
+ return key;
+ }
+
+ return key + ".gif"; //$NON-NLS-1$
}
}
diff --git a/plugins/org.eclipse.net4j.ui/src/org/eclipse/net4j/internal/ui/messages/messages.properties b/plugins/org.eclipse.net4j.ui/src/org/eclipse/net4j/internal/ui/messages/messages.properties
index bc4653dd72..848f0b4411 100644
--- a/plugins/org.eclipse.net4j.ui/src/org/eclipse/net4j/internal/ui/messages/messages.properties
+++ b/plugins/org.eclipse.net4j.ui/src/org/eclipse/net4j/internal/ui/messages/messages.properties
@@ -14,3 +14,6 @@ AcceptorsView_4=Add Acceptor 2037
AcceptorsView_5=Add an acceptor for port 2037
Net4jItemProvider.0=Remove
Net4jItemProvider.1=Remove
+
+ChannelsView.0 = Clear Log
+ChannelsView.1 = Clear Logs
diff --git a/plugins/org.eclipse.net4j.ui/src/org/eclipse/net4j/internal/ui/views/ChannelsView.java b/plugins/org.eclipse.net4j.ui/src/org/eclipse/net4j/internal/ui/views/ChannelsView.java
index 46db074291..5a20605d64 100644
--- a/plugins/org.eclipse.net4j.ui/src/org/eclipse/net4j/internal/ui/views/ChannelsView.java
+++ b/plugins/org.eclipse.net4j.ui/src/org/eclipse/net4j/internal/ui/views/ChannelsView.java
@@ -12,8 +12,13 @@ package org.eclipse.net4j.internal.ui.views;
import org.eclipse.net4j.buffer.IBufferHandler;
import org.eclipse.net4j.channel.IChannel;
+import org.eclipse.net4j.internal.ui.messages.Messages;
import org.eclipse.net4j.protocol.IProtocol;
import org.eclipse.net4j.signal.ISignalProtocol;
+import org.eclipse.net4j.signal.Indication;
+import org.eclipse.net4j.signal.IndicationWithResponse;
+import org.eclipse.net4j.signal.Request;
+import org.eclipse.net4j.signal.RequestWithConfirmation;
import org.eclipse.net4j.signal.Signal;
import org.eclipse.net4j.signal.SignalFinishedEvent;
import org.eclipse.net4j.signal.SignalProtocol;
@@ -23,11 +28,17 @@ import org.eclipse.net4j.util.container.IContainer;
import org.eclipse.net4j.util.container.IPluginContainer;
import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.INotifier;
+import org.eclipse.net4j.util.ui.UIUtil;
+import org.eclipse.net4j.util.ui.actions.SafeAction;
import org.eclipse.net4j.util.ui.views.ContainerItemProvider;
import org.eclipse.net4j.util.ui.views.ContainerView;
import org.eclipse.net4j.util.ui.views.IElementFilter;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.preference.JFacePreferences;
+import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.jface.viewers.Viewer;
@@ -36,9 +47,8 @@ import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
+import java.util.LinkedList;
import java.util.Map;
/**
@@ -50,7 +60,7 @@ public class ChannelsView extends ContainerView implements IElementFilter
private static final Styler ERROR_STYLER = StyledString.createColorRegistryStyler(JFacePreferences.ERROR_COLOR, null);
- private final Map<IChannel, List<LogEntry>> logs = new HashMap<>();
+ private final Map<IChannel, LinkedList<LogEntry>> logs = new HashMap<>();
private final ChannelContainer channelContainer = new ChannelContainer(IPluginContainer.INSTANCE)
{
@@ -71,15 +81,13 @@ public class ChannelsView extends ContainerView implements IElementFilter
if (event instanceof SignalFinishedEvent)
{
SignalFinishedEvent<?> e = (SignalFinishedEvent<?>)event;
-
- Exception exception = e.getException();
- String error = exception == null ? null : exception.getMessage();
-
- notifySignal(e.getSignal(), error, e.getDuration());
+ notifySignalFinished(e);
}
}
};
+ private final IAction clearLogsAction = new ClearLogAction(null);
+
public ChannelsView()
{
}
@@ -111,6 +119,25 @@ public class ChannelsView extends ContainerView implements IElementFilter
}
@Override
+ protected void fillLocalToolBar(IToolBarManager manager)
+ {
+ super.fillLocalToolBar(manager);
+ manager.add(clearLogsAction);
+ }
+
+ @Override
+ protected void fillContextMenu(IMenuManager manager, ITreeSelection selection)
+ {
+ super.fillContextMenu(manager, selection);
+
+ IChannel channel = UIUtil.getElement(selection, IChannel.class);
+ if (channel != null)
+ {
+ manager.add(new ClearLogAction(channel));
+ }
+ }
+
+ @Override
protected ContainerItemProvider<IContainer<Object>> createContainerItemProvider()
{
return new Net4jItemProvider(this)
@@ -128,7 +155,7 @@ public class ChannelsView extends ContainerView implements IElementFilter
{
IChannel channel = (IChannel)element;
- List<LogEntry> log;
+ LinkedList<LogEntry> log;
synchronized (logs)
{
log = logs.get(channel);
@@ -147,7 +174,7 @@ public class ChannelsView extends ContainerView implements IElementFilter
{
IChannel channel = (IChannel)element;
- List<LogEntry> log;
+ LinkedList<LogEntry> log;
synchronized (logs)
{
log = logs.get(channel);
@@ -183,7 +210,7 @@ public class ChannelsView extends ContainerView implements IElementFilter
{
if (obj instanceof LogEntry)
{
- return SharedIcons.getImage(SharedIcons.OBJ_SIGNAL);
+ return ((LogEntry)obj).getType().getImage();
}
return super.getImage(obj);
@@ -239,28 +266,28 @@ public class ChannelsView extends ContainerView implements IElementFilter
};
}
- protected void notifySignal(Signal signal, String error, long duration)
+ protected void notifySignalFinished(SignalFinishedEvent<?> event)
{
- SignalProtocol<?> protocol = signal.getProtocol();
+ SignalProtocol<?> protocol = event.getSignal().getProtocol();
if (protocol != null)
{
IChannel channel = protocol.getChannel();
if (channel != null)
{
- List<LogEntry> log;
+ LinkedList<LogEntry> log;
synchronized (logs)
{
log = logs.get(channel);
if (log == null)
{
- log = new ArrayList<>();
+ log = new LinkedList<>();
logs.put(channel, log);
}
}
synchronized (log)
{
- log.add(0, new LogEntry(signal.toString(true), error, duration));
+ log.addFirst(new LogEntry(event));
}
refreshElement(channel, false);
@@ -273,17 +300,48 @@ public class ChannelsView extends ContainerView implements IElementFilter
*/
private static final class LogEntry
{
+ private final Type type;
+
private final String text;
private final String error;
private final long duration;
- public LogEntry(String text, String error, long duration)
+ public LogEntry(SignalFinishedEvent<?> event)
{
- this.text = text;
- this.error = error;
- this.duration = duration;
+ Signal signal = event.getSignal();
+ if (signal instanceof RequestWithConfirmation)
+ {
+ type = Type.REQUEST_SYNC;
+ }
+ else if (signal instanceof Request)
+ {
+ type = Type.REQUEST_ASYNC;
+ }
+ else if (signal instanceof IndicationWithResponse)
+ {
+ type = Type.INDICATION_SYNC;
+ }
+ else if (signal instanceof Indication)
+ {
+ type = Type.INDICATION_ASYNC;
+ }
+ else
+ {
+ type = Type.SIGNAL;
+ }
+
+ text = signal.toString(true);
+ duration = event.getDuration();
+
+ Exception exception = event.getException();
+ error = exception == null ? null : exception.getMessage();
+ }
+
+ public Type getType()
+ {
+ return type;
}
public String getText()
@@ -306,5 +364,61 @@ public class ChannelsView extends ContainerView implements IElementFilter
{
return getText();
}
+
+ /**
+ * @author Eike Stepper
+ */
+ public enum Type
+ {
+ SIGNAL(SharedIcons.OBJ_SIGNAL), //
+ REQUEST_SYNC(SharedIcons.OBJ_REQUEST_SYNC), //
+ REQUEST_ASYNC(SharedIcons.OBJ_REQUEST_ASYNC), //
+ INDICATION_SYNC(SharedIcons.OBJ_INDICATION_SYNC), //
+ INDICATION_ASYNC(SharedIcons.OBJ_INDICATION_ASYNC);
+
+ private final Image image;
+
+ private Type(String key)
+ {
+ image = SharedIcons.getImage(key);
+ }
+
+ public Image getImage()
+ {
+ return image;
+ }
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private final class ClearLogAction extends SafeAction
+ {
+ private final IChannel channel;
+
+ private ClearLogAction(IChannel channel)
+ {
+ super(Messages.getString("ChannelsView." + (channel == null ? "1" : "0")), SharedIcons.getDescriptor(SharedIcons.ETOOL_CLEAR_LOG));
+ this.channel = channel;
+ }
+
+ @Override
+ protected void safeRun() throws Exception
+ {
+ synchronized (logs)
+ {
+ if (channel == null)
+ {
+ logs.clear();
+ }
+ else
+ {
+ logs.remove(channel);
+ }
+ }
+
+ refreshViewer(true);
+ }
}
}
diff --git a/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/SearchField.java b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/SearchField.java
index acfdae9963..e41e860cf5 100644
--- a/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/SearchField.java
+++ b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/widgets/SearchField.java
@@ -13,6 +13,7 @@ package org.eclipse.net4j.util.ui.widgets;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.ReflectUtil;
import org.eclipse.net4j.util.ui.UIUtil;
+import org.eclipse.net4j.util.ui.views.ItemProvider;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
@@ -69,7 +70,7 @@ public class SearchField extends Composite
filterHandler.handleFilter(filter);
}
- return new Object[0];
+ return ItemProvider.NO_ELEMENTS;
}
};

Back to the top