Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Chen2012-05-28 08:36:28 +0000
committerWilliam Chen2012-05-28 08:36:28 +0000
commit4b5f4ecd71347dc8b5460ddd8c20516f8e6b7213 (patch)
tree9b4e123cee4ea0a443e72968f3006a3c9cdb5bac /target_explorer/plugins
parentb8161411c6f132efc58bc77a995f9433e2f4bdce (diff)
downloadorg.eclipse.tcf-4b5f4ecd71347dc8b5460ddd8c20516f8e6b7213.tar.gz
org.eclipse.tcf-4b5f4ecd71347dc8b5460ddd8c20516f8e6b7213.tar.xz
org.eclipse.tcf-4b5f4ecd71347dc8b5460ddd8c20516f8e6b7213.zip
Target Explorer: 380795: [TCF][UI] Decorate the node that are being
filtered in Target Explorer and relative editors.
Diffstat (limited to 'target_explorer/plugins')
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/AbstractTreeNode.java14
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.xml3
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/ViewerInputAdapterFactory.java10
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/icons/obj16/process_polling.pngbin507 -> 164 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/activator/UIPlugin.java23
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/internal/pages/ProcessMonitorTitleDecorator.java9
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/internal/pages/RefreshingImageDescriptor.java70
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/editor/pages/TreeViewerExplorerEditorPage.java123
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/ViewViewer.java20
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/ViewViewerDecoratingLabelProvider.java140
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/filtering_ovr.pngbin0 -> 181 bytes
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.xml10
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/activator/UIPlugin.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IFilteringLabelDecorator.java43
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/ImageConsts.java5
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/AdapterFactory.java79
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/FilteringImageDescriptor.java70
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/QuickFilter.java83
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/SearchEngine.java18
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/TablePatternFilter.java45
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/TreeViewerSearchDialog.java11
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerDecoratingLabelProvider.java116
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/utils/TreeViewerUtil.java34
24 files changed, 831 insertions, 99 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/AbstractTreeNode.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/AbstractTreeNode.java
index b69d12247..0ff6cc759 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/AbstractTreeNode.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/AbstractTreeNode.java
@@ -16,6 +16,7 @@ import java.util.List;
import java.util.UUID;
import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.tcf.te.core.interfaces.IPropertyChangeProvider;
import org.eclipse.tcf.te.core.interfaces.IViewerInput;
import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback;
import org.eclipse.tcf.te.tcf.core.Tcf;
@@ -236,6 +237,19 @@ public abstract class AbstractTreeNode extends PlatformObject implements IPeerMo
refresh(null);
}
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("rawtypes")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if(IPropertyChangeProvider.class.equals(adapter)) {
+ return peerNode.getAdapter(adapter);
+ }
+ return super.getAdapter(adapter);
+ }
+
/**
* Recursively refresh the children of the given process context with a callback, which is
* called when whole process is finished.
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.xml b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.xml
index 4a424b9a4..4fe977519 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.xml
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.xml
@@ -1876,6 +1876,9 @@
<adapter
type="org.eclipse.tcf.te.core.interfaces.IViewerInput">
</adapter>
+ <adapter
+ type="org.eclipse.tcf.te.core.interfaces.IPropertyChangeProvider">
+ </adapter>
</factory>
</extension>
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/ViewerInputAdapterFactory.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/ViewerInputAdapterFactory.java
index 3272e8fca..9ea010e75 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/ViewerInputAdapterFactory.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/ViewerInputAdapterFactory.java
@@ -13,6 +13,7 @@ import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.tcf.protocol.Protocol;
+import org.eclipse.tcf.te.core.interfaces.IPropertyChangeProvider;
import org.eclipse.tcf.te.core.interfaces.IViewerInput;
import org.eclipse.tcf.te.tcf.filesystem.ui.activator.UIPlugin;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
@@ -31,8 +32,11 @@ public class ViewerInputAdapterFactory implements IAdapterFactory {
@Override
public Object getAdapter(Object adaptableObject, Class adapterType) {
if(adaptableObject instanceof IPeerModel) {
- IPeerModel peerModel = (IPeerModel) adaptableObject;
- return getViewerInput(peerModel);
+ if (IViewerInput.class.equals(adapterType)
+ || IPropertyChangeProvider.class.equals(adapterType)) {
+ IPeerModel peerModel = (IPeerModel) adaptableObject;
+ return getViewerInput(peerModel);
+ }
}
return null;
}
@@ -71,7 +75,7 @@ public class ViewerInputAdapterFactory implements IAdapterFactory {
*/
@Override
public Class[] getAdapterList() {
- return new Class[] { IViewerInput.class };
+ return new Class[] { IViewerInput.class, IPropertyChangeProvider.class };
}
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/icons/obj16/process_polling.png b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/icons/obj16/process_polling.png
index fc7ce8a4a..1a026c55a 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/icons/obj16/process_polling.png
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/icons/obj16/process_polling.png
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/activator/UIPlugin.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/activator/UIPlugin.java
index 79cc96d2b..43e3231d1 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/activator/UIPlugin.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/activator/UIPlugin.java
@@ -15,6 +15,7 @@ import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Image;
import org.eclipse.tcf.te.tcf.processes.ui.interfaces.ImageConsts;
+import org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
@@ -104,4 +105,26 @@ public class UIPlugin extends AbstractUIPlugin {
public static ImageDescriptor getImageDescriptor(String key) {
return getDefault().getImageRegistry().getDescriptor(key);
}
+
+ /**
+ * Loads the image given by the specified image descriptor from the image
+ * registry. If the image has been loaded ones before already, the cached
+ * <code>Image</code> object instance is returned. Otherwise, the <code>
+ * Image</code> object instance will be created and cached before returned.
+ *
+ * @param descriptor The image descriptor.
+ * @return The corresponding <code>Image</code> object instance or <code>null</code>.
+ */
+ public static Image getSharedImage(AbstractImageDescriptor descriptor) {
+ ImageRegistry registry = getDefault().getImageRegistry();
+
+ String imageKey = descriptor.getDecriptorKey();
+ Image image = registry.get(imageKey);
+ if (image == null) {
+ registry.put(imageKey, descriptor);
+ image = registry.get(imageKey);
+ }
+
+ return image;
+ }
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/internal/pages/ProcessMonitorTitleDecorator.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/internal/pages/ProcessMonitorTitleDecorator.java
index 1ca721f54..5e934083c 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/internal/pages/ProcessMonitorTitleDecorator.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/internal/pages/ProcessMonitorTitleDecorator.java
@@ -15,7 +15,7 @@ import org.eclipse.swt.graphics.Image;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
import org.eclipse.tcf.te.tcf.processes.core.model.ProcessModel;
import org.eclipse.tcf.te.tcf.processes.ui.activator.UIPlugin;
-import org.eclipse.tcf.te.tcf.processes.ui.interfaces.ImageConsts;
+import org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor;
/**
* The title bar decorator for Process Monitor.
@@ -32,7 +32,12 @@ public class ProcessMonitorTitleDecorator extends LabelProvider implements ILabe
IPeerModel peerModel = (IPeerModel) element;
ProcessModel pModel = ProcessModel.getProcessModel(peerModel);
if(!pModel.isRefreshStopped()) {
- return UIPlugin.getImage(ImageConsts.PM_POLLING);
+ Image decoratedImage = image;
+ if (image != null) {
+ AbstractImageDescriptor descriptor = new RefreshingImageDescriptor(UIPlugin.getDefault().getImageRegistry(), image);
+ decoratedImage = UIPlugin.getSharedImage(descriptor);
+ }
+ return decoratedImage;
}
return image;
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/internal/pages/RefreshingImageDescriptor.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/internal/pages/RefreshingImageDescriptor.java
new file mode 100644
index 000000000..7a49799b3
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/internal/pages/RefreshingImageDescriptor.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Wind River Systems, Inc. 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:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.tcf.te.tcf.processes.ui.internal.pages;
+
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.tcf.te.tcf.processes.ui.interfaces.ImageConsts;
+import org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor;
+
+/**
+ * Filtering image descriptor implementation.
+ */
+public class RefreshingImageDescriptor extends AbstractImageDescriptor {
+ // the base image to decorate with overlays
+ private Image baseImage;
+ // the image size
+ private Point imageSize;
+
+ /**
+ * Constructor.
+ */
+ public RefreshingImageDescriptor(final ImageRegistry registry, final Image baseImage) {
+ super(registry);
+
+ this.baseImage = baseImage;
+ imageSize = new Point(baseImage.getImageData().width, baseImage.getImageData().height);
+
+ // build up the key for the image registry
+ defineKey(baseImage.hashCode());
+ }
+
+ protected void defineKey(int hashCode) {
+ String key = "PollingID:" + hashCode; //$NON-NLS-1$
+ setDecriptorKey(key);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.resource.CompositeImageDescriptor#drawCompositeImage(int, int)
+ */
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ drawCentered(baseImage, width, height);
+ drawCentered(ImageConsts.PM_POLLING, width, height);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.resource.CompositeImageDescriptor#getSize()
+ */
+ @Override
+ protected Point getSize() {
+ return imageSize;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.tcf.ide.util.ui.AbstractImageDescriptor#getBaseImage()
+ */
+ @Override
+ protected Image getBaseImage() {
+ return baseImage;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/editor/pages/TreeViewerExplorerEditorPage.java b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/editor/pages/TreeViewerExplorerEditorPage.java
index d09426a6a..9d0f4aa72 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/editor/pages/TreeViewerExplorerEditorPage.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/editor/pages/TreeViewerExplorerEditorPage.java
@@ -41,6 +41,7 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.tcf.te.core.interfaces.IViewerInput;
import org.eclipse.tcf.te.ui.forms.CustomFormToolkit;
+import org.eclipse.tcf.te.ui.interfaces.IFilteringLabelDecorator;
import org.eclipse.tcf.te.ui.trees.TreeControl;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IWorkbenchPartSite;
@@ -67,8 +68,7 @@ public abstract class TreeViewerExplorerEditorPage extends AbstractCustomFormToo
*/
@Override
public void dispose() {
- Object input = getEditorInputNode();
- IViewerInput viewerInput = getViewerInput(input);
+ IViewerInput viewerInput = getViewerInput();
if(viewerInput != null && pcListener != null) {
viewerInput.removePropertyChangeListener(pcListener);
}
@@ -174,8 +174,7 @@ public abstract class TreeViewerExplorerEditorPage extends AbstractCustomFormToo
});
viewer.addDoubleClickListener(this);
- Object input = getEditorInputNode();
- IViewerInput viewerInput = getViewerInput(input);
+ IViewerInput viewerInput = getViewerInput();
if(viewerInput != null) {
pcListener = new PropertyChangeListener() {
@Override
@@ -200,6 +199,38 @@ public abstract class TreeViewerExplorerEditorPage extends AbstractCustomFormToo
viewerInput.addPropertyChangeListener(pcListener);
}
}
+
+ /**
+ * Get an adapter instance from the adaptable with the specified
+ * adapter interface.
+ *
+ * @param adaptable The adaptable to get the adapter.
+ * @param adapter The adapter interface class.
+ * @return An adapter or null if it does not adapt to this type.
+ */
+ @SuppressWarnings("rawtypes")
+ private Object getAdapter(Object adaptable, Class adapter) {
+ Object adapted = null;
+ if(adapter.isInstance(adaptable)) {
+ adapted = adaptable;
+ }
+ if(adapted == null && adaptable instanceof IAdaptable) {
+ adapted = ((IAdaptable)adaptable).getAdapter(adapter);
+ }
+ if(adapted == null && adaptable != null) {
+ adapted = Platform.getAdapterManager().getAdapter(adaptable, adapter);
+ }
+ return adapted;
+ }
+
+ /**
+ * Get an adapter of IFilteringLabelDecorator.
+ *
+ * @return an IFilteringLabelDecorator adapter or null if it does not adapt to IFilteringLabelDecorator.
+ */
+ private IFilteringLabelDecorator getFilteringDecorator() {
+ return (IFilteringLabelDecorator) getAdapter(getEditorInputNode(), IFilteringLabelDecorator.class);
+ }
/**
* Get the viewer input adapter for the input.
@@ -207,22 +238,8 @@ public abstract class TreeViewerExplorerEditorPage extends AbstractCustomFormToo
* @param input the input of the tree viewer.
* @return The adapter.
*/
- private IViewerInput getViewerInput(Object input) {
- IViewerInput viewerInput = null;
- if (input != null) {
- if (input instanceof IViewerInput) {
- viewerInput = (IViewerInput) input;
- }
- else {
- if (input instanceof IAdaptable) {
- viewerInput = (IViewerInput) ((IAdaptable) input).getAdapter(IViewerInput.class);
- }
- if (viewerInput == null) {
- viewerInput = (IViewerInput) Platform.getAdapterManager().getAdapter(input, IViewerInput.class);
- }
- }
- }
- return viewerInput;
+ private IViewerInput getViewerInput() {
+ return (IViewerInput) getAdapter(getEditorInputNode(), IViewerInput.class);
}
/**
@@ -248,32 +265,48 @@ public abstract class TreeViewerExplorerEditorPage extends AbstractCustomFormToo
*/
protected void updateUI() {
toolbarMgr.update(true);
- ILabelDecorator decorator = getTitleBarDecorator();
- if (decorator != null) {
- IManagedForm managedForm = getManagedForm();
- Form form = managedForm.getForm().getForm();
- Object element = getEditorInputNode();
- String text = getFormTitle();
- if (text != null) {
- text = decorator.decorateText(text, element);
- if (text != null) {
- try {
- form.setText(text);
- }
- catch (Exception e) {
- // Ignore any disposed exception
- }
- }
+ IManagedForm managedForm = getManagedForm();
+ Form form = managedForm.getForm().getForm();
+ Object element = getEditorInputNode();
+ boolean filterEnabled = false;
+ IFilteringLabelDecorator filterDecorator = getFilteringDecorator();
+ if (filterDecorator != null) {
+ TreeViewer viewer = (TreeViewer) treeControl.getViewer();
+ filterEnabled = filterDecorator.isEnabled(viewer, element);
+ }
+ ILabelDecorator titleDecorator = getTitleBarDecorator();
+ String text = getFormTitle();
+ if (text != null) {
+ if (titleDecorator != null) {
+ text = titleDecorator.decorateText(text, element);
}
- Image image = getFormImage();
- image = decorator.decorateImage(image, element);
- if (image != null) {
- try {
- form.setImage(image);
- }
- catch (Exception e) {
- // Ignore any disposed exception
- }
+ if (filterEnabled) {
+ text = filterDecorator.decorateText(text, element);
+ }
+ }
+ Image image = getFormImage();
+ if (image != null) {
+ if (titleDecorator != null) {
+ image = titleDecorator.decorateImage(image, element);
+ }
+ if (filterEnabled) {
+ image = filterDecorator.decorateImage(image, element);
+ }
+ }
+ if (text != null) {
+ try {
+ form.setText(text);
+ }
+ catch (Exception e) {
+ // Ignore any disposed exception
+ }
+ }
+ if (image != null) {
+ try {
+ form.setImage(image);
+ }
+ catch (Exception e) {
+ // Ignore any disposed exception
}
}
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/ViewViewer.java b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/ViewViewer.java
index e67dc7c92..1e5d0f872 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/ViewViewer.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/ViewViewer.java
@@ -21,6 +21,7 @@ import org.eclipse.tcf.te.runtime.events.EventManager;
import org.eclipse.tcf.te.ui.views.events.ViewerContentChangeEvent;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.navigator.CommonViewerSorter;
+import org.eclipse.ui.navigator.INavigatorContentService;
/**
* View common viewer implementation.
@@ -30,6 +31,9 @@ public class ViewViewer extends CommonViewer {
// ViewerContentChangeEvents are send.
private boolean silent = false;
+ // Remember the last double click selection event state mask
+ private int lastDoubleClickSelectionEventStateMask = 0;
+
/**
* Constructor.
*
@@ -59,6 +63,19 @@ public class ViewViewer extends CommonViewer {
}
}
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.navigator.CommonViewer#init()
+ */
+ @Override
+ protected void init() {
+ setUseHashlookup(true);
+ INavigatorContentService contentService = getNavigatorContentService();
+ setContentProvider(contentService.createCommonContentProvider());
+ setLabelProvider(new ViewViewerDecoratingLabelProvider(this, contentService.createCommonLabelProvider()));
+ initDragAndDrop();
+ }
+
/**
* Sets the viewers event firing silent mode.
*
@@ -127,9 +144,6 @@ public class ViewViewer extends CommonViewer {
super.setSorter(sorter);
}
- // Remember the last double click selection event state mask
- private int lastDoubleClickSelectionEventStateMask = 0;
-
/* (non-Javadoc)
* @see org.eclipse.ui.navigator.CommonViewer#handleDoubleSelect(org.eclipse.swt.events.SelectionEvent)
*/
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/ViewViewerDecoratingLabelProvider.java b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/ViewViewerDecoratingLabelProvider.java
new file mode 100644
index 000000000..651bc7b7d
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/ViewViewerDecoratingLabelProvider.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2012 Wind River Systems, Inc. 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:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.views.internal;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.tcf.te.ui.interfaces.IFilteringLabelDecorator;
+import org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider;
+
+/**
+ * An wrapping decorating label provider to replace the default navigator decorating label provider
+ * in order to provide the filtering decoration.
+ */
+@SuppressWarnings("restriction")
+public class ViewViewerDecoratingLabelProvider extends NavigatorDecoratingLabelProvider {
+ // The navigator's tree viewer to be decorated.
+ private TreeViewer viewer;
+
+ /**
+ * Create an instance with the tree viewer and a common label provider.
+ *
+ * @param viewer The navigator's tree viewer.
+ * @param commonLabelProvider The navigator's common label provider.
+ */
+ public ViewViewerDecoratingLabelProvider(TreeViewer viewer, ILabelProvider commonLabelProvider) {
+ super(commonLabelProvider);
+ this.viewer = viewer;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object element) {
+ String text = super.getText(element);
+ IFilteringLabelDecorator decorator = getFilteringDecorator(element);
+ if (decorator != null && decorator.isEnabled(viewer, element)) {
+ return decorator.decorateText(text, element);
+ }
+ return text;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider#getImage(java.lang.Object)
+ */
+ @Override
+ public Image getImage(Object element) {
+ Image image = super.getImage(element);
+ if (image != null) {
+ IFilteringLabelDecorator decorator = getFilteringDecorator(element);
+ if (decorator != null && decorator.isEnabled(viewer, element)) {
+ return decorator.decorateImage(image, element);
+ }
+ }
+ return image;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider#getStyledText(java.lang.Object)
+ */
+ @Override
+ protected StyledString getStyledText(Object element) {
+ StyledString styledString = super.getStyledText(element);
+ IFilteringLabelDecorator decorator = getFilteringDecorator(element);
+ if (decorator != null && decorator.isEnabled(viewer, element)) {
+ String decorated = decorator.decorateText(styledString.getString(), element);
+ Styler style = getDecorationStyle(element);
+ return StyledCellLabelProvider.styleDecoratedString(decorated, style, styledString);
+ }
+ return styledString;
+ }
+
+ /**
+ * Get an adapter of IFilteringLabelProvider from the specified element.
+ *
+ * @param element The element to get the adapter from.
+ * @return The element's adapter or null if does not adapt to IFilteringLabelProvider.
+ */
+ private IFilteringLabelDecorator getFilteringDecorator(Object element) {
+ IFilteringLabelDecorator decorator = null;
+ if(element instanceof IFilteringLabelDecorator) {
+ decorator = (IFilteringLabelDecorator) element;
+ }
+ if(decorator == null && element instanceof IAdaptable) {
+ decorator = (IFilteringLabelDecorator) ((IAdaptable)element).getAdapter(IFilteringLabelDecorator.class);
+ }
+ if(decorator == null) {
+ decorator = (IFilteringLabelDecorator) Platform.getAdapterManager().getAdapter(element, IFilteringLabelDecorator.class);
+ }
+ return decorator;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider#getColumnImage(java.lang.Object, int)
+ */
+ @Override
+ public Image getColumnImage(Object element, int columnIndex) {
+ Image image = super.getColumnImage(element, columnIndex);
+ if (image != null && columnIndex == 0) {
+ IFilteringLabelDecorator decorator = getFilteringDecorator(element);
+ if (decorator != null && decorator.isEnabled(viewer, element)) {
+ return decorator.decorateImage(image, element);
+ }
+ }
+ return image;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider#getColumnText(java.lang.Object, int)
+ */
+ @Override
+ public String getColumnText(Object element, int columnIndex) {
+ String text = super.getColumnText(element, columnIndex);
+ if (columnIndex == 0) {
+ IFilteringLabelDecorator decorator = getFilteringDecorator(element);
+ if (decorator != null && decorator.isEnabled(viewer, element)) {
+ return decorator.decorateText(text, element);
+ }
+ }
+ return text;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/filtering_ovr.png b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/filtering_ovr.png
new file mode 100644
index 000000000..0cf45f086
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/filtering_ovr.png
Binary files differ
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.xml b/target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.xml
index c5212cfe8..4c9770f9b 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.xml
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/plugin.xml
@@ -129,5 +129,15 @@
name="%preference.page.name">
</page>
</extension>
+ <extension
+ point="org.eclipse.core.runtime.adapters">
+ <factory
+ adaptableType="java.lang.Object"
+ class="org.eclipse.tcf.te.ui.internal.utils.AdapterFactory">
+ <adapter
+ type="org.eclipse.tcf.te.ui.interfaces.IFilteringLabelDecorator">
+ </adapter>
+ </factory>
+ </extension>
</plugin>
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/activator/UIPlugin.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/activator/UIPlugin.java
index 65ad07cfa..614b29be7 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/activator/UIPlugin.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/activator/UIPlugin.java
@@ -171,6 +171,8 @@ public class UIPlugin extends AbstractUIPlugin {
registry.put(ImageConsts.GREY_OVR, ImageDescriptor.createFromURL(url));
url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "red_ovr.gif"); //$NON-NLS-1$
registry.put(ImageConsts.RED_OVR, ImageDescriptor.createFromURL(url));
+ url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "filtering_ovr.png"); //$NON-NLS-1$
+ registry.put(ImageConsts.FILTERING_OVR, ImageDescriptor.createFromURL(url));
url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "redX_ovr.gif"); //$NON-NLS-1$
registry.put(ImageConsts.RED_X_OVR, ImageDescriptor.createFromURL(url));
url = UIPlugin.getDefault().getBundle().getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_OVR + "busy.gif"); //$NON-NLS-1$
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IFilteringLabelDecorator.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IFilteringLabelDecorator.java
new file mode 100644
index 000000000..f54423681
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/IFilteringLabelDecorator.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2012 Wind River Systems, Inc. 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:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.interfaces;
+
+import org.eclipse.jface.viewers.ILabelDecorator;
+import org.eclipse.jface.viewers.TreeViewer;
+
+/**
+ * The interface to define a label decorator which has a method
+ * to check if the label decorator is enabled for specified viewer and
+ * element.
+ * <p>
+ * An ordinary label decorator's enablement state is only checked upon the
+ * cell element, which is an issue when the decoration depends on the
+ * tree viewer's state besides the element. This interface is designed
+ * to check the enablement state with both the tree viewer and the element
+ * itself.
+ * <p>
+ * This interface is used in TreeControl and Target Explorer view to decorate
+ * the tree node that are being filtered.
+ *
+ * @see TreeViewerDecoratingLabelProvider
+ * @see ViewViewerDecoratingLabelProvider
+ */
+public interface IFilteringLabelDecorator extends ILabelDecorator {
+
+ /**
+ * Check if this decorator is enabled to the specified viewer and
+ * element.
+ *
+ * @param viewer The tree viewer
+ * @param element The element
+ * @return true if this decorator is enabled over this viewer and this element.
+ */
+ public boolean isEnabled(TreeViewer viewer, Object element);
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/ImageConsts.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/ImageConsts.java
index 6f026f403..18c16f59f 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/ImageConsts.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/interfaces/ImageConsts.java
@@ -97,6 +97,11 @@ public interface ImageConsts {
* The key to access the target object red overlay image.
*/
public static final String RED_OVR = "RedOverlay"; //$NON-NLS-1$
+
+ /**
+ * The key to access the filtering decoration image.
+ */
+ public static final String FILTERING_OVR = "FilteringOverlay"; //$NON-NLS-1$
/**
* The key to access the target object red X overlay image.
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/AdapterFactory.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/AdapterFactory.java
new file mode 100644
index 000000000..ee0ad6a91
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/AdapterFactory.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2012 Wind River Systems, Inc. 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:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.internal.utils;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.tcf.te.ui.activator.UIPlugin;
+import org.eclipse.tcf.te.ui.interfaces.IFilteringLabelDecorator;
+import org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor;
+import org.eclipse.tcf.te.ui.utils.TreeViewerUtil;
+
+/**
+ * An adapter factory that adapt an object to IFilteringLabelDecorator used in
+ * a tree viewer or a target explorer view to provide filtering decoration.
+ */
+public class AdapterFactory extends LabelProvider implements IAdapterFactory, IFilteringLabelDecorator {
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Object adaptableObject, Class adapterType) {
+ if(adaptableObject != null && IFilteringLabelDecorator.class.equals(adapterType)) {
+ return this;
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
+ */
+ @Override
+ public Class[] getAdapterList() {
+ return new Class[]{IFilteringLabelDecorator.class};
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILabelDecorator#decorateImage(org.eclipse.swt.graphics.Image, java.lang.Object)
+ */
+ @Override
+ public Image decorateImage(Image image, Object element) {
+ Image decoratedImage = image;
+ if (image != null && element != null) {
+ AbstractImageDescriptor descriptor = new FilteringImageDescriptor(UIPlugin.getDefault().getImageRegistry(), image);
+ decoratedImage = UIPlugin.getSharedImage(descriptor);
+ }
+ return decoratedImage;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ILabelDecorator#decorateText(java.lang.String, java.lang.Object)
+ */
+ @Override
+ public String decorateText(String text, Object element) {
+ return text+"[Filtering... Press <ESC> to reset]"; //$NON-NLS-1$
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.interfaces.IFilteringLabelDecorator#isEnabled(org.eclipse.jface.viewers.TreeViewer, java.lang.Object)
+ */
+ @Override
+ public boolean isEnabled(TreeViewer viewer, Object element) {
+ return TreeViewerUtil.isFiltering(viewer, element);
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/FilteringImageDescriptor.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/FilteringImageDescriptor.java
new file mode 100644
index 000000000..5d7229273
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/FilteringImageDescriptor.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Wind River Systems, Inc. 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:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.tcf.te.ui.internal.utils;
+
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.tcf.te.ui.interfaces.ImageConsts;
+import org.eclipse.tcf.te.ui.jface.images.AbstractImageDescriptor;
+
+/**
+ * Filtering image descriptor implementation.
+ */
+public class FilteringImageDescriptor extends AbstractImageDescriptor {
+ // the base image to decorate with overlays
+ private Image baseImage;
+ // the image size
+ private Point imageSize;
+
+ /**
+ * Constructor.
+ */
+ public FilteringImageDescriptor(final ImageRegistry registry, final Image baseImage) {
+ super(registry);
+
+ this.baseImage = baseImage;
+ imageSize = new Point(baseImage.getImageData().width, baseImage.getImageData().height);
+
+ // build up the key for the image registry
+ defineKey(baseImage.hashCode());
+ }
+
+ protected void defineKey(int hashCode) {
+ String key = "FilteringID:" + hashCode; //$NON-NLS-1$
+ setDecriptorKey(key);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.resource.CompositeImageDescriptor#drawCompositeImage(int, int)
+ */
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ drawCentered(baseImage, width, height);
+ drawCentered(ImageConsts.FILTERING_OVR, width, height);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.resource.CompositeImageDescriptor#getSize()
+ */
+ @Override
+ protected Point getSize() {
+ return imageSize;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.tcf.ide.util.ui.AbstractImageDescriptor#getBaseImage()
+ */
+ @Override
+ protected Image getBaseImage() {
+ return baseImage;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/QuickFilter.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/QuickFilter.java
index eff7ac068..d5facf769 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/QuickFilter.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/QuickFilter.java
@@ -9,6 +9,11 @@
*******************************************************************************/
package org.eclipse.tcf.te.ui.internal.utils;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeViewer;
@@ -17,12 +22,13 @@ import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.tcf.te.core.interfaces.IPropertyChangeProvider;
/**
* A quick filter is a viewer filter that selects elements,
* which has the specified name pattern, under a certain tree path.
* Other elements outside of this tree path is ignored.
*/
-public class QuickFilter extends TablePatternFilter {
+public class QuickFilter extends TablePatternFilter implements PropertyChangeListener {
// The tree viewer to filter.
private TreeViewer viewer;
// The root path to select from.
@@ -34,8 +40,9 @@ public class QuickFilter extends TablePatternFilter {
public QuickFilter(TreeViewer viewer) {
super((ILabelProvider) viewer.getLabelProvider());
this.viewer = viewer;
+ this.addPropertyChangeListener(this);
}
-
+
/**
* Show the pop up dialog for the specified root path.
*
@@ -65,17 +72,68 @@ public class QuickFilter extends TablePatternFilter {
location = viewer.getTree().toDisplay(location);
popup.open();
popup.getShell().setLocation(location);
+ viewer.refresh();
}
+ /*
+ * (non-Javadoc)
+ * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ Object element = getFilteringElement();
+ if(element != null) {
+ IPropertyChangeProvider provider = getPropertyChangeProvider(element);
+ if(provider!=null) {
+ provider.firePropertyChange(new PropertyChangeEvent(element, evt.getPropertyName(), evt.getOldValue(), evt.getNewValue()));
+ }
+ }
+ }
+
+ /**
+ * Get an adapter of IPropertyChangeProvider from the specified element.
+ *
+ * @param element The element to get the adapter from.
+ * @return The element's adapter or null if does not adapt to IPropertyChangeProvider.
+ */
+ private IPropertyChangeProvider getPropertyChangeProvider(Object element) {
+ IPropertyChangeProvider provider = null;
+ if(element instanceof IPropertyChangeProvider) {
+ provider = (IPropertyChangeProvider) element;
+ }
+ if(provider == null && element instanceof IAdaptable) {
+ provider = (IPropertyChangeProvider) ((IAdaptable)element).getAdapter(IPropertyChangeProvider.class);
+ }
+ if(provider == null && element != null) {
+ provider = (IPropertyChangeProvider) Platform.getAdapterManager().getAdapter(element, IPropertyChangeProvider.class);
+ }
+ return provider;
+ }
+
+ /**
+ * Get the element which is currently being filtered.
+ *
+ * @return The current filtered element.
+ */
+ private Object getFilteringElement() {
+ Object element = root;
+ if(root instanceof TreePath) {
+ element = ((TreePath)root).getLastSegment();
+ }
+ return element;
+ }
+
/**
* Reset the tree viewer to the original view by removing this filter.
*/
public void resetViewer() {
viewer.removeFilter(this);
- root = null;
setPattern(null);
+ root = null;
+ viewer.refresh();
}
+
/**
* If the current viewer is being filtered.
*
@@ -86,7 +144,7 @@ public class QuickFilter extends TablePatternFilter {
if (filters != null) {
for (ViewerFilter filter : filters) {
if (filter == this) {
- return true;
+ return matcher != null;
}
}
}
@@ -123,4 +181,21 @@ public class QuickFilter extends TablePatternFilter {
}
return !root.equals(parentElement);
}
+
+ /**
+ * If the element is being filtered.
+ *
+ * @param element The element to be checked.
+ * @return true if it is filtering.
+ */
+ public boolean isFiltering(Object element) {
+ if(root != null) {
+ Object rootElement = root;
+ if(root instanceof TreePath) {
+ rootElement = ((TreePath)root).getLastSegment();
+ }
+ return rootElement == element && matcher != null;
+ }
+ return false;
+ }
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/SearchEngine.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/SearchEngine.java
index 1cdd78f5b..681681f33 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/SearchEngine.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/SearchEngine.java
@@ -51,29 +51,13 @@ public class SearchEngine {
*
* @param viewer The tree viewer.
*/
- private SearchEngine(TreeViewer viewer) {
+ public SearchEngine(TreeViewer viewer) {
fViewer = viewer;
fMatcher = new SearchMatcher(viewer);
fSearcher = new BreadthFirstSearcher(fViewer, fMatcher);
}
/**
- * Get a singleton search engine for a tree viewer. If
- * it does not exist then create one and store it.
- *
- * @param viewer The tree viewer.
- * @return A search engine.
- */
- public static SearchEngine getSearchEngine(TreeViewer viewer) {
- SearchEngine searcher = (SearchEngine) viewer.getData("search.engine"); //$NON-NLS-1$
- if (searcher == null) {
- searcher = new SearchEngine(viewer);
- viewer.setData("search.engine", searcher); //$NON-NLS-1$
- }
- return searcher;
- }
-
- /**
* If the current algorithm is DFS.
*
* @return true if it is DFS.
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/TablePatternFilter.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/TablePatternFilter.java
index feb7eb67c..97df8419c 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/TablePatternFilter.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/TablePatternFilter.java
@@ -10,6 +10,12 @@
*******************************************************************************/
package org.eclipse.tcf.te.ui.internal.utils;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
@@ -23,9 +29,29 @@ public class TablePatternFilter extends ViewerFilter {
protected StringMatcher matcher = null;
protected ILabelProvider labelProvider;
+ protected List<PropertyChangeListener> listeners;
public TablePatternFilter(ILabelProvider labelProvider) {
this.labelProvider = labelProvider;
+ listeners = Collections.synchronizedList(new ArrayList<PropertyChangeListener>());
+ }
+
+ /**
+ * Add a property change listener to this pattern filter.
+ *
+ * @param l The listener.
+ */
+ public void addPropertyChangeListener(PropertyChangeListener l) {
+ listeners.add(l);
+ }
+
+ /**
+ * Remove a property change listener to this pattern filter.
+ *
+ * @param l The listener.
+ */
+ public void removePropertyChangeListener(PropertyChangeListener l) {
+ listeners.remove(l);
}
/*
@@ -44,16 +70,33 @@ public class TablePatternFilter extends ViewerFilter {
* @param newPattern The new pattern
*/
public void setPattern(String newPattern) {
+ StringMatcher old = matcher;
if (newPattern == null || newPattern.trim().length() == 0) {
- matcher = new StringMatcher(ALL, true, false);
+ matcher = null;
}
else {
String patternString = ALL + newPattern + ALL;
matcher = new StringMatcher(patternString, true, false);
}
+ firePatternChangedEvent(old, matcher);
}
/**
+ * Fire a pattern changed event to all listening listeners.
+ *
+ * @param oldMatcher The old matcher.
+ * @param newMatcher The new matcher.
+ */
+ protected void firePatternChangedEvent(StringMatcher oldMatcher, StringMatcher newMatcher) {
+ PropertyChangeEvent event = new PropertyChangeEvent(this, "pattern", oldMatcher, newMatcher); //$NON-NLS-1$
+ synchronized(listeners) {
+ for(PropertyChangeListener listener : listeners) {
+ listener.propertyChange(event);
+ }
+ }
+ }
+
+ /**
* Answers whether the given String matches the pattern.
*
* @param input the String to test
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/TreeViewerSearchDialog.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/TreeViewerSearchDialog.java
index c0a4eee79..fbff7b088 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/TreeViewerSearchDialog.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/internal/utils/TreeViewerSearchDialog.java
@@ -35,6 +35,7 @@ import org.eclipse.swt.widgets.Text;
import org.eclipse.tcf.te.ui.interfaces.ISearchCallback;
import org.eclipse.tcf.te.ui.jface.dialogs.CustomTitleAreaDialog;
import org.eclipse.tcf.te.ui.nls.Messages;
+import org.eclipse.tcf.te.ui.utils.TreeViewerUtil;
/**
* The searching dialog used to get the searching input.
@@ -88,7 +89,7 @@ public class TreeViewerSearchDialog extends CustomTitleAreaDialog implements Sel
super(viewer.getTree().getShell());
setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS);
fViewer = viewer;
- fSearcher = SearchEngine.getSearchEngine(fViewer);
+ fSearcher = TreeViewerUtil.getSearchEngine(fViewer);
fSearcher.setDepthFirst(depthFirst);
fViewer.getTree().addSelectionListener(this);
setTitle(Messages.TreeViewerSearchDialog_DialogTitleMessage);
@@ -123,6 +124,9 @@ public class TreeViewerSearchDialog extends CustomTitleAreaDialog implements Sel
}
}
+ /**
+ * Invoked when button "Close" is pressed.
+ */
protected void closePressed() {
fSearcher.endSearch();
setReturnCode(OK);
@@ -336,6 +340,11 @@ public class TreeViewerSearchDialog extends CustomTitleAreaDialog implements Sel
getButton(SEARCH_ID).setEnabled(valid);
}
+ /**
+ * Set the start searching path.
+ *
+ * @param rootPath The path where to start searching.
+ */
public void setStartPath(TreePath rootPath) {
fSearcher.setStartPath(rootPath);
String text = fSearcher.getMatcher().getElementText(rootPath.getLastSegment());
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java
index 8e6c6388e..396ac444f 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/AbstractTreeControl.java
@@ -490,7 +490,7 @@ public abstract class AbstractTreeControl extends WorkbenchPartControl implement
IWorkbench workbench = PlatformUI.getWorkbench();
IDecoratorManager manager = workbench.getDecoratorManager();
ILabelDecorator decorator = manager.getLabelDecorator();
- return new TreeViewerDecoratingLabelProvider(labelProvider,decorator);
+ return new TreeViewerDecoratingLabelProvider(viewer, labelProvider,decorator);
}
/**
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerDecoratingLabelProvider.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerDecoratingLabelProvider.java
index 1f660d782..ff7d96842 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerDecoratingLabelProvider.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeViewerDecoratingLabelProvider.java
@@ -9,11 +9,15 @@
*******************************************************************************/
package org.eclipse.tcf.te.ui.trees;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelDecorator;
+import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.graphics.Image;
+import org.eclipse.tcf.te.ui.interfaces.IFilteringLabelDecorator;
/**
* A subclass of DecoratingLabelProvider provides an FS Tree Viewer
@@ -28,6 +32,8 @@ public class TreeViewerDecoratingLabelProvider extends DecoratingLabelProvider i
private TreeViewerLabelProvider fProvider;
//The label decorator decorating the above label provider.
private ILabelDecorator fDecorator;
+ //Tree viewer that this label provider serves.
+ private TreeViewer viewer;
/**
* Create a FSTreeDecoratingLabelProvider with an FSTreeLabelProvider and a decorator.
@@ -35,10 +41,11 @@ public class TreeViewerDecoratingLabelProvider extends DecoratingLabelProvider i
* @param provider The label provider to be decorated.
* @param decorator The label decorator.
*/
- public TreeViewerDecoratingLabelProvider(TreeViewerLabelProvider provider, ILabelDecorator decorator) {
+ public TreeViewerDecoratingLabelProvider(TreeViewer viewer, TreeViewerLabelProvider provider, ILabelDecorator decorator) {
super(provider, decorator);
fProvider = provider;
fDecorator = decorator;
+ this.viewer = viewer;
}
/* (non-Javadoc)
@@ -47,17 +54,26 @@ public class TreeViewerDecoratingLabelProvider extends DecoratingLabelProvider i
@Override
public Image getColumnImage(Object element, int columnIndex) {
Image image = fProvider.getColumnImage(element, columnIndex);
- if (columnIndex == 0 && fDecorator != null) {
- if (fDecorator instanceof LabelDecorator) {
- LabelDecorator ld2 = (LabelDecorator) fDecorator;
- Image decorated = ld2.decorateImage(image, element, getDecorationContext());
- if (decorated != null) {
- return decorated;
+ if (columnIndex == 0) {
+ if (fDecorator != null) {
+ if (fDecorator instanceof LabelDecorator) {
+ LabelDecorator ld2 = (LabelDecorator) fDecorator;
+ Image decorated = ld2.decorateImage(image, element, getDecorationContext());
+ if (decorated != null) {
+ image = decorated;
+ }
}
- } else {
- Image decorated = fDecorator.decorateImage(image, element);
- if (decorated != null) {
- return decorated;
+ else {
+ Image decorated = fDecorator.decorateImage(image, element);
+ if (decorated != null) {
+ image = decorated;
+ }
+ }
+ }
+ if (image != null) {
+ IFilteringLabelDecorator decorator = getFilteringDecorator(element);
+ if (decorator != null && decorator.isEnabled(viewer, element)) {
+ return decorator.decorateImage(image, element);
}
}
}
@@ -70,20 +86,78 @@ public class TreeViewerDecoratingLabelProvider extends DecoratingLabelProvider i
@Override
public String getColumnText(Object element, int columnIndex) {
String text = fProvider.getColumnText(element, columnIndex);
- if (columnIndex == 0 && fDecorator != null) {
- if (fDecorator instanceof LabelDecorator) {
- LabelDecorator ld2 = (LabelDecorator) fDecorator;
- String decorated = ld2.decorateText(text, element, getDecorationContext());
- if (decorated != null) {
- return decorated;
+ if (columnIndex == 0) {
+ if (fDecorator != null) {
+ if (fDecorator instanceof LabelDecorator) {
+ LabelDecorator ld2 = (LabelDecorator) fDecorator;
+ String decorated = ld2.decorateText(text, element, getDecorationContext());
+ if (decorated != null) {
+ text = decorated;
+ }
}
- } else {
- String decorated = fDecorator.decorateText(text, element);
- if (decorated != null) {
- return decorated;
+ else {
+ String decorated = fDecorator.decorateText(text, element);
+ if (decorated != null) {
+ text = decorated;
+ }
}
}
+ IFilteringLabelDecorator decorator = getFilteringDecorator(element);
+ if (decorator != null && decorator.isEnabled(viewer, element)) {
+ text = decorator.decorateText(text, element);
+ }
+ }
+ return text;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.DecoratingLabelProvider#getImage(java.lang.Object)
+ */
+ @Override
+ public Image getImage(Object element) {
+ Image image = super.getImage(element);
+ if (image != null) {
+ IFilteringLabelDecorator decorator = getFilteringDecorator(element);
+ if (decorator != null && decorator.isEnabled(viewer, element)) {
+ return decorator.decorateImage(image, element);
+ }
+ }
+ return image;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.DecoratingLabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object element) {
+ String text = super.getText(element);
+ IFilteringLabelDecorator decorator = getFilteringDecorator(element);
+ if (decorator != null && decorator.isEnabled(viewer, element)) {
+ return decorator.decorateText(text, element);
}
return text;
+ }
+
+ /**
+ * Get an adapter of IFilteringLabelProvider from the specified element.
+ *
+ * @param element The element to get the adapter from.
+ * @return The element's adapter or null if does not adapt to IFilteringLabelProvider.
+ */
+ private IFilteringLabelDecorator getFilteringDecorator(Object element) {
+ IFilteringLabelDecorator decorator = null;
+ if(element instanceof IFilteringLabelDecorator) {
+ decorator = (IFilteringLabelDecorator) element;
+ }
+ if(decorator == null && element instanceof IAdaptable) {
+ decorator = (IFilteringLabelDecorator) ((IAdaptable)element).getAdapter(IFilteringLabelDecorator.class);
+ }
+ if(decorator == null) {
+ decorator = (IFilteringLabelDecorator) Platform.getAdapterManager().getAdapter(element, IFilteringLabelDecorator.class);
+ }
+ return decorator;
}
+
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/utils/TreeViewerUtil.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/utils/TreeViewerUtil.java
index 62650aab2..24eb9cff5 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/utils/TreeViewerUtil.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/utils/TreeViewerUtil.java
@@ -40,6 +40,22 @@ public class TreeViewerUtil {
}
/**
+ * Get a singleton search engine for a tree viewer. If
+ * it does not exist then create one and store it.
+ *
+ * @param viewer The tree viewer.
+ * @return A search engine.
+ */
+ public static SearchEngine getSearchEngine(TreeViewer viewer) {
+ SearchEngine searcher = (SearchEngine) viewer.getData("search.engine"); //$NON-NLS-1$
+ if (searcher == null) {
+ searcher = new SearchEngine(viewer);
+ viewer.setData("search.engine", searcher); //$NON-NLS-1$
+ }
+ return searcher;
+ }
+
+ /**
* Reset the viewer to the original view.
*
* @param viewer The viewer to be reset.
@@ -84,7 +100,23 @@ public class TreeViewerUtil {
* @param viewer The tree viewer to be searched.
*/
public static void doSearchNext(TreeViewer viewer) {
- SearchEngine.getSearchEngine(viewer).startSearch(null, null);
+ getSearchEngine(viewer).startSearch(null, null);
+ }
+
+ /**
+ * If the specified element is being filtered.
+ *
+ * @param element
+ * @return
+ */
+ public static boolean isFiltering(TreeViewer viewer, Object element) {
+ if(element != null) {
+ QuickFilter filter = TreeViewerUtil.getQuickFilter(viewer);
+ if(filter != null) {
+ return filter.isFiltering() && filter.isFiltering(element);
+ }
+ }
+ return false;
}
/**

Back to the top