1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-17 05:55:22 +02:00

[238519][api] Support styled label decorations

This commit is contained in:
Martin Oberhuber 2009-03-19 22:33:07 +00:00
parent 19da40a4dc
commit 1aae9acec9

View file

@ -1,21 +1,22 @@
/******************************************************************************** /********************************************************************************
* Copyright (c) 2006, 2008 IBM Corporation and others. All rights reserved. * Copyright (c) 2006, 2009 IBM Corporation and others. All rights reserved.
* This program and the accompanying materials are made available under the terms * 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 * of the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html * available at http://www.eclipse.org/legal/epl-v10.html
* *
* Initial Contributors: * Initial Contributors:
* The following IBM employees contributed to the Remote System Explorer * The following IBM employees contributed to the Remote System Explorer
* component that contains this file: David McKnight, Kushal Munir, * component that contains this file: David McKnight, Kushal Munir,
* Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson, * Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson,
* Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley.
* *
* Contributors: * Contributors:
* Martin Oberhuber (Wind River) - [168975] Move RSE Events API to Core * Martin Oberhuber (Wind River) - [168975] Move RSE Events API to Core
* Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API * Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API
* Martin Oberhuber (Wind River) - [190271] Move ISystemViewInputProvider to Core * Martin Oberhuber (Wind River) - [190271] Move ISystemViewInputProvider to Core
* Martin Oberhuber (Wind River) - [197550] Fix NPE when refreshing Pending items * Martin Oberhuber (Wind River) - [197550] Fix NPE when refreshing Pending items
* David McKnight (IBM) - [236505] Remote systems dialog not working * David McKnight (IBM) - [236505] Remote systems dialog not working
* Martin Oberhuber (Wind River) - [238519][api] Support styled label decorations
********************************************************************************/ ********************************************************************************/
package org.eclipse.rse.internal.ui.view; package org.eclipse.rse.internal.ui.view;
@ -34,7 +35,9 @@ import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.rse.core.model.ISystemViewInputProvider; import org.eclipse.rse.core.model.ISystemViewInputProvider;
import org.eclipse.rse.core.model.SystemMessageObject; import org.eclipse.rse.core.model.SystemMessageObject;
import org.eclipse.rse.core.subsystems.ISubSystem; import org.eclipse.rse.core.subsystems.ISubSystem;
@ -54,7 +57,7 @@ import org.eclipse.ui.progress.PendingUpdateAdapter;
/** /**
* Provides tree contents for objects that have the ISystemViewElement * Provides tree contents for objects that have the ISystemViewElement
* adapter registered. Also provides label contents, so can be used for * adapter registered. Also provides label contents, so can be used for
* both a content and label provider for TreeViewers. * both a content and label provider for TreeViewers.
* <p> * <p>
* This has a general flavor, which is used in most cases, and also has * This has a general flavor, which is used in most cases, and also has
* a specialized flavor for universal file systems, which allows restricting * a specialized flavor for universal file systems, which allows restricting
@ -62,10 +65,10 @@ import org.eclipse.ui.progress.PendingUpdateAdapter;
* setting an input filter or filter string. * setting an input filter or filter string.
*/ */
public class SystemViewLabelAndContentProvider extends LabelProvider public class SystemViewLabelAndContentProvider extends LabelProvider
implements ITreeContentProvider, ILabelProvider, ITableLabelProvider implements ITreeContentProvider, ILabelProvider, ITableLabelProvider, IStyledLabelProvider
// ,IResourceChangeListener // ,IResourceChangeListener
{ {
private static final Object[] NO_OBJECTS = new Object[0]; private static final Object[] NO_OBJECTS = new Object[0];
protected Viewer viewer; protected Viewer viewer;
private boolean filesOnly, foldersOnly; private boolean filesOnly, foldersOnly;
@ -79,7 +82,7 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
*/ */
public SystemViewLabelAndContentProvider() public SystemViewLabelAndContentProvider()
{ {
// System.out.println("inside ctor for LCProvider " + this); // System.out.println("inside ctor for LCProvider " + this);
} }
/** /**
* Constructor to restrict to remote folders or files * Constructor to restrict to remote folders or files
@ -88,7 +91,7 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
{ {
this(); this();
this.foldersOnly = foldersOnly; this.foldersOnly = foldersOnly;
this.filesOnly = filesOnly; this.filesOnly = filesOnly;
} }
/** /**
* Set a filter string to subset the list by. For example, "A*.java" or "java,class," * Set a filter string to subset the list by. For example, "A*.java" or "java,class,"
@ -109,9 +112,9 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
{ {
return filterString; return filterString;
} }
/** /**
* Flush the in-memory cache which remembers the result of the last * Flush the in-memory cache which remembers the result of the last
* getChildren request when we are in files-only or folders-only * getChildren request when we are in files-only or folders-only
@ -121,7 +124,7 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
{ {
resolvedChildrenPerFolder = null; resolvedChildrenPerFolder = null;
} }
/** /**
* Return the current viewer we are associated with * Return the current viewer we are associated with
*/ */
@ -129,26 +132,26 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
{ {
return viewer; return viewer;
} }
/** /**
* The visual part that is using this content provider is about * The visual part that is using this content provider is about
* to be disposed. Deallocate all allocated SWT resources. * to be disposed. Deallocate all allocated SWT resources.
*/ */
public void dispose() public void dispose()
{ {
// AS LONG AS WE DON'T SUPPORT IWORKSPACE OBJECT THIS IS NOT NEEDED. // AS LONG AS WE DON'T SUPPORT IWORKSPACE OBJECT THIS IS NOT NEEDED.
// WE LEAVE IT IN BECAUSE IT IS HARMLESS AND MIGHT BE OF VALUE SOMEDAY. // WE LEAVE IT IN BECAUSE IT IS HARMLESS AND MIGHT BE OF VALUE SOMEDAY.
if (viewer != null) if (viewer != null)
{ {
Object obj = viewer.getInput(); Object obj = viewer.getInput();
if (obj != null) if (obj != null)
{ {
if (obj instanceof IWorkspace) if (obj instanceof IWorkspace)
{ {
//IWorkspace workspace = (IWorkspace) obj; //IWorkspace workspace = (IWorkspace) obj;
//workspace.removeResourceChangeListener(this); //workspace.removeResourceChangeListener(this);
} }
else if (obj instanceof IContainer) else if (obj instanceof IContainer)
{ {
//IWorkspace workspace = ((IContainer) obj).getWorkspace(); //IWorkspace workspace = ((IContainer) obj).getWorkspace();
//workspace.removeResourceChangeListener(this); //workspace.removeResourceChangeListener(this);
@ -157,19 +160,19 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
} }
} }
/** /**
* Returns the implementation of ISystemViewElement for the given * Returns the implementation of ISystemViewElement for the given
* object. Returns null if the adapter is not defined or the * object. Returns null if the adapter is not defined or the
* object is not adaptable. * object is not adaptable.
*/ */
protected ISystemViewElementAdapter getViewAdapter(Object o) protected ISystemViewElementAdapter getViewAdapter(Object o)
{ {
if (o instanceof IContextObject) if (o instanceof IContextObject)
{ {
o = ((IContextObject)o).getModelObject(); o = ((IContextObject)o).getModelObject();
} }
ISystemViewElementAdapter adapter = null; ISystemViewElementAdapter adapter = null;
if (o == null) if (o == null)
{ {
SystemBasePlugin.logWarning("ERROR: null passed to getAdapter in SystemViewLabelAndContentProvider"); //$NON-NLS-1$ SystemBasePlugin.logWarning("ERROR: null passed to getAdapter in SystemViewLabelAndContentProvider"); //$NON-NLS-1$
@ -177,7 +180,7 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
else else
{ {
if (o instanceof IAdaptable) if (o instanceof IAdaptable)
{ {
adapter = (ISystemViewElementAdapter)((IAdaptable)o).getAdapter(ISystemViewElementAdapter.class); adapter = (ISystemViewElementAdapter)((IAdaptable)o).getAdapter(ISystemViewElementAdapter.class);
} }
else else
@ -193,7 +196,7 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
} }
} }
if ((adapter!=null) && (viewer != null)) if ((adapter!=null) && (viewer != null))
{ {
Shell shell = null; Shell shell = null;
if (viewer instanceof ISystemShellProvider) if (viewer instanceof ISystemShellProvider)
shell = ((ISystemShellProvider)viewer).getShell(); shell = ((ISystemShellProvider)viewer).getShell();
@ -213,18 +216,18 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
SystemBasePlugin.logWarning("VIEWER IS NULL FOR SYSTEMVIEWLABELANDCONTENTPROVIDER"); //$NON-NLS-1$ SystemBasePlugin.logWarning("VIEWER IS NULL FOR SYSTEMVIEWLABELANDCONTENTPROVIDER"); //$NON-NLS-1$
return adapter; return adapter;
} }
/** /**
* Cancel any jobs that are fetching content from the given location. * Cancel any jobs that are fetching content from the given location.
* @param location * @param location
*/ */
public void cancelJobs(Object location) public void cancelJobs(Object location)
{ {
if (manager != null) { if (manager != null) {
manager.cancel(location); manager.cancel(location);
} }
} }
protected boolean supportsDeferredQueries() protected boolean supportsDeferredQueries()
{ {
//IPreferenceStore store = RSEUIPlugin.getDefault().getPreferenceStore(); //IPreferenceStore store = RSEUIPlugin.getDefault().getPreferenceStore();
@ -232,17 +235,17 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
//return true; // DKM now enforcing deferred queries //return true; // DKM now enforcing deferred queries
return _enableDeferredQueries; return _enableDeferredQueries;
} }
public void setEnableDeferredQueries(boolean enable) public void setEnableDeferredQueries(boolean enable)
{ {
_enableDeferredQueries = enable; _enableDeferredQueries = enable;
} }
/** /**
* @see ITreeContentProvider * @see ITreeContentProvider
*/ */
public Object[] getChildren(Object object) public Object[] getChildren(Object object)
{ {
Object element = object; Object element = object;
if (object instanceof IContextObject) if (object instanceof IContextObject)
@ -254,7 +257,7 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
{ {
// The adapter needs to be checked to be not null, otherwise // The adapter needs to be checked to be not null, otherwise
// we run into an NPE here. // we run into an NPE here.
if (manager != null && adapter != null) if (manager != null && adapter != null)
{ {
ISubSystem ss = null; ISubSystem ss = null;
if (object instanceof IContextObject) if (object instanceof IContextObject)
@ -269,11 +272,11 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
{ {
// if (ss.isConnected()) // if (ss.isConnected())
{ {
Object[] children = manager.getChildren(object, getViewer()); Object[] children = manager.getChildren(object, getViewer());
if (children != null) if (children != null)
{ {
// This will be a placeholder to indicate // This will be a placeholder to indicate
// that the real children are being fetched // that the real children are being fetched
return children; return children;
} }
@ -281,13 +284,13 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
} }
} }
} }
//System.out.println("inside getChildren for landcProvider"); //System.out.println("inside getChildren for landcProvider");
//System.out.println("...element = " + element); //System.out.println("...element = " + element);
//System.out.println("...adapter = " + adapter); //System.out.println("...adapter = " + adapter);
if (adapter != null) if (adapter != null)
{ {
// we first test to see if this is an expand-to filter in effect for this // we first test to see if this is an expand-to filter in effect for this
// object, and if so use it... // object, and if so use it...
if ((viewer instanceof SystemView) && (((SystemView)viewer).getSystemViewPart() != null) && if ((viewer instanceof SystemView) && (((SystemView)viewer).getSystemViewPart() != null) &&
@ -297,7 +300,7 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
if (expandToFilter != null) if (expandToFilter != null)
return adapter.getChildrenUsingExpandToFilter(element, expandToFilter); return adapter.getChildrenUsingExpandToFilter(element, expandToFilter);
} }
Object[] children = null; Object[] children = null;
// The re-usable Eclipse GUI widgets are not very efficient. // The re-usable Eclipse GUI widgets are not very efficient.
// The are always re-asking for children, which for remote requests // The are always re-asking for children, which for remote requests
// causes a lot of flashing and unnecessary trips to the host. // causes a lot of flashing and unnecessary trips to the host.
@ -306,11 +309,11 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
// same files or folders, we can return that remembered cache. // same files or folders, we can return that remembered cache.
// The tricky part is what to key each request by. We use the element // The tricky part is what to key each request by. We use the element
// as the key ... this is the parent folder which children are being // as the key ... this is the parent folder which children are being
// asked for. However, for the same folder we will be asked for // asked for. However, for the same folder we will be asked for
// folders and files in separate requests. It turns out this is not // folders and files in separate requests. It turns out this is not
// not a problem though, because a separate instance of us is used // not a problem though, because a separate instance of us is used
// for files versus folders so each maintains its own cache. // for files versus folders so each maintains its own cache.
if ((filesOnly || foldersOnly) && (resolvedChildrenPerFolder != null)) if ((filesOnly || foldersOnly) && (resolvedChildrenPerFolder != null))
{ {
children = (Object[])resolvedChildrenPerFolder.get(element); children = (Object[])resolvedChildrenPerFolder.get(element);
@ -322,13 +325,13 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
{ {
children = adapter.getChildren((IContextObject)object, new NullProgressMonitor()); children = adapter.getChildren((IContextObject)object, new NullProgressMonitor());
} }
else else
{ {
children = adapter.getChildren((IAdaptable)object, new NullProgressMonitor()); children = adapter.getChildren((IAdaptable)object, new NullProgressMonitor());
} }
if ((filesOnly || foldersOnly) &&
if ((filesOnly || foldersOnly) &&
// an array of one SystemMessageObject item implies some kind of error, so don't cache... // an array of one SystemMessageObject item implies some kind of error, so don't cache...
((children.length != 1) || !(children[0] instanceof SystemMessageObject)) ) ((children.length != 1) || !(children[0] instanceof SystemMessageObject)) )
{ {
@ -344,17 +347,17 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
/** /**
* @see ITreeContentProvider * @see ITreeContentProvider
*/ */
public Object[] getElements(Object element) public Object[] getElements(Object element)
{ {
return getChildren(element); return getChildren(element);
} }
/** /**
* @see ITreeContentProvider * @see ITreeContentProvider
*/ */
public Object getParent(Object element) public Object getParent(Object element)
{ {
ISystemViewElementAdapter adapter = getViewAdapter(element); ISystemViewElementAdapter adapter = getViewAdapter(element);
if (adapter != null) if (adapter != null)
return adapter.getParent(element); return adapter.getParent(element);
return null; return null;
} }
@ -367,7 +370,7 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
* get a plus but that is way better than a very slow remote * get a plus but that is way better than a very slow remote
* system query just to decide if we want a plus or not! * system query just to decide if we want a plus or not!
*/ */
public boolean hasChildren(Object element) public boolean hasChildren(Object element)
{ {
ISystemViewElementAdapter adapter = getViewAdapter(element); ISystemViewElementAdapter adapter = getViewAdapter(element);
if (adapter!=null) { if (adapter!=null) {
@ -391,41 +394,41 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
} }
return false; return false;
} }
/** /**
* inputChanged method comment. * inputChanged method comment.
* AS LONG AS WE DON'T SUPPORT IWORKSPACE OBJECT THIS IS NOT NEEDED. * AS LONG AS WE DON'T SUPPORT IWORKSPACE OBJECT THIS IS NOT NEEDED.
* WE LEAVE IT IN BECAUSE IT IS HARMLESS AND MIGHT BE OF VALUE SOMEDAY. * WE LEAVE IT IN BECAUSE IT IS HARMLESS AND MIGHT BE OF VALUE SOMEDAY.
*/ */
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{ {
//System.out.println("Inside LCProvider "+this+". viewer = " + viewer); //System.out.println("Inside LCProvider "+this+". viewer = " + viewer);
this.viewer = viewer; this.viewer = viewer;
if (newInput instanceof IWorkspace) if (newInput instanceof IWorkspace)
{ {
//IWorkspace workspace = (IWorkspace)newInput; //IWorkspace workspace = (IWorkspace)newInput;
//workspace.addResourceChangeListener(this); //workspace.addResourceChangeListener(this);
} }
else if (newInput instanceof IContainer) else if (newInput instanceof IContainer)
{ {
//IWorkspace workspace = ((IContainer)newInput).getWorkspace(); //IWorkspace workspace = ((IContainer)newInput).getWorkspace();
//workspace.addResourceChangeListener(this); //workspace.addResourceChangeListener(this);
} }
if (viewer instanceof AbstractTreeViewer) if (viewer instanceof AbstractTreeViewer)
{ {
manager = new SystemDeferredTreeContentManager(this, (AbstractTreeViewer) viewer); manager = new SystemDeferredTreeContentManager(this, (AbstractTreeViewer) viewer);
} }
} }
public Image getColumnImage(Object element, int columnIndex) public Image getColumnImage(Object element, int columnIndex)
{ {
return getImage(element); return getImage(element);
} }
public String getColumnText(Object element, int columnIndex) public String getColumnText(Object element, int columnIndex)
{ {
return getText(element); return getText(element);
} }
public Image getImage(Object element) public Image getImage(Object element)
{ {
ISystemViewElementAdapter adapter = getViewAdapter(element); ISystemViewElementAdapter adapter = getViewAdapter(element);
//System.out.println("Inside getImage. element = " + element + ", adapter = " + adapter); //System.out.println("Inside getImage. element = " + element + ", adapter = " + adapter);
@ -433,41 +436,41 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
return null; return null;
ImageDescriptor descriptor = adapter.getImageDescriptor(element); ImageDescriptor descriptor = adapter.getImageDescriptor(element);
if (descriptor == null) if (descriptor == null)
return null; return null;
//add any annotations to the image descriptor //add any annotations to the image descriptor
descriptor = decorateImage(descriptor, element); descriptor = decorateImage(descriptor, element);
//obtain the cached image corresponding to the descriptor //obtain the cached image corresponding to the descriptor
Image image = RSEImageMap.get(descriptor); Image image = RSEImageMap.get(descriptor);
if (image == null) if (image == null)
{ {
image = descriptor.createImage(); image = descriptor.createImage();
RSEImageMap.put(descriptor, image); RSEImageMap.put(descriptor, image);
} }
return image; return image;
} }
/** /**
* Returns the label text for the given object. * Returns the label text for the given object.
*/ */
public String getText(Object element) public String getText(Object element)
{ {
ISystemViewElementAdapter adapter = getViewAdapter(element); ISystemViewElementAdapter adapter = getViewAdapter(element);
//System.out.println("INSIDE GETTEXT FOR SVLandCprovider: " + element + ", adapter = " + adapter); //System.out.println("INSIDE GETTEXT FOR SVLandCprovider: " + element + ", adapter = " + adapter);
if (adapter == null) if (adapter == null)
{ {
IWorkbenchAdapter wadapter = (IWorkbenchAdapter)((IAdaptable) element).getAdapter(IWorkbenchAdapter.class); IWorkbenchAdapter wadapter = (IWorkbenchAdapter)((IAdaptable) element).getAdapter(IWorkbenchAdapter.class);
if (wadapter == null) if (wadapter == null)
{ {
return super.getText(element); return super.getText(element);
} }
return wadapter.getLabel(element); return wadapter.getLabel(element);
} }
//return the decorated label (FROM WorkbenchLabelProvider) //return the decorated label (FROM WorkbenchLabelProvider)
return decorateText(adapter.getText(element), element); return decorateText(adapter.getText(element), element);
} }
/** /**
@ -479,10 +482,11 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
* image. * image.
* @see org.eclipse.jface.resource.ImageDescriptor * @see org.eclipse.jface.resource.ImageDescriptor
*/ */
protected ImageDescriptor decorateImage(ImageDescriptor input, Object element) protected ImageDescriptor decorateImage(ImageDescriptor input, Object element)
{ {
return input; return input;
} }
/** /**
* Returns a label that is based on the given label, * Returns a label that is based on the given label,
* but decorated with additional information relating to the state * but decorated with additional information relating to the state
@ -491,8 +495,17 @@ public class SystemViewLabelAndContentProvider extends LabelProvider
* Subclasses may implement this method to decorate an object's * Subclasses may implement this method to decorate an object's
* label. * label.
*/ */
protected String decorateText(String input, Object element) protected String decorateText(String input, Object element)
{ {
return input; return input;
} }
/**
* @InheritDoc
* @since 3.1
* @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object)
*/
public StyledString getStyledText(Object element) {
return new StyledString(getText(element));
}
} }