diff options
author | William Chen | 2012-05-28 08:36:28 +0000 |
---|---|---|
committer | William Chen | 2012-05-28 08:36:28 +0000 |
commit | 4b5f4ecd71347dc8b5460ddd8c20516f8e6b7213 (patch) | |
tree | 9b4e123cee4ea0a443e72968f3006a3c9cdb5bac /target_explorer/plugins | |
parent | b8161411c6f132efc58bc77a995f9433e2f4bdce (diff) | |
download | org.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')
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 Binary files differindex 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 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 Binary files differnew file mode 100644 index 000000000..0cf45f086 --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/icons/ovr16/filtering_ovr.png 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;
}
/**
|