diff options
author | Eike Stepper | 2021-11-11 05:35:37 +0000 |
---|---|---|
committer | Eike Stepper | 2021-11-11 05:35:37 +0000 |
commit | 583759ff711db7c756a3cb3ad2e06704e572b94f (patch) | |
tree | 6a661dcacca5a4159822e43b16fd75191f9928a9 | |
parent | e40e42a8aed8b2e8f6ce9e94b1f95f7dcec354fc (diff) | |
download | cdo-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
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 Binary files differnew file mode 100644 index 0000000000..559471b892 --- /dev/null +++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/etool16/clear_log.png 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 Binary files differnew file mode 100644 index 0000000000..978c271661 --- /dev/null +++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/indication_async.gif 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 Binary files differnew file mode 100644 index 0000000000..3ae5817b1e --- /dev/null +++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/indication_sync.gif 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 Binary files differnew file mode 100644 index 0000000000..ce70642be0 --- /dev/null +++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/request_async.gif 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 Binary files differnew file mode 100644 index 0000000000..d3003d9e03 --- /dev/null +++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/request_sync.gif 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 Binary files differnew file mode 100644 index 0000000000..70c4a3f855 --- /dev/null +++ b/plugins/org.eclipse.net4j.ui.shared/icons/full/obj16/signal.gif 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; } }; |