mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-09 09:15:38 +02:00
[204587][204588] Added the IElementPropertiesProvider and PropertyBasedLabelProvider.
This commit is contained in:
parent
a9ca46d100
commit
2b3d31bb31
11 changed files with 867 additions and 0 deletions
|
@ -14,6 +14,7 @@ Eclipse-LazyStart: true
|
|||
Export-Package: org.eclipse.dd.dsf.ui.concurrent,
|
||||
org.eclipse.dd.dsf.ui.viewmodel,
|
||||
org.eclipse.dd.dsf.ui.viewmodel.dm,
|
||||
org.eclipse.dd.dsf.ui.viewmodel.properties,
|
||||
org.eclipse.dd.dsf.ui.viewmodel.update,
|
||||
org.eclipse.dd.dsf.ui.viewmodel.update.actions
|
||||
Bundle-RequiredExecutionEnvironment: J2SE-1.5
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
package org.eclipse.dd.dsf.ui.viewmodel.properties;
|
||||
|
||||
|
||||
/**
|
||||
* Provides context-sensitive properties. Can be registered as an adapter for
|
||||
* an element or implemented directly
|
||||
*/
|
||||
public interface IElementPropertiesProvider {
|
||||
|
||||
/**
|
||||
* Updates the specified property sets.
|
||||
*
|
||||
* @param updates each update specifies the element and context for which
|
||||
* a set of properties is requested and stores them
|
||||
*/
|
||||
public void update(IPropertiesUpdate[] updates);
|
||||
|
||||
/**
|
||||
* Returns a user-presentable name for the given property.
|
||||
*/
|
||||
public String getPropertyName(String property);
|
||||
|
||||
/**
|
||||
* Returns a description for the given property.
|
||||
*/
|
||||
public String getPropertyDescription(String property);
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Wind River Systems 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.dd.dsf.ui.viewmodel.properties;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public interface ILabelAttributeChangedListener {
|
||||
|
||||
public void attributesChanged();
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package org.eclipse.dd.dsf.ui.viewmodel.properties;
|
||||
|
||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
|
||||
|
||||
/**
|
||||
* Context sensitive properties update request for an element.
|
||||
*/
|
||||
public interface IPropertiesUpdate extends IViewerUpdate {
|
||||
/**
|
||||
* Returns the list of element properties that the provider should set.
|
||||
* If <code>null</code>, all available properties should be set.
|
||||
*/
|
||||
public String[] getProperties();
|
||||
|
||||
/**
|
||||
* Sets the given property to update.
|
||||
* @param property Property ID.
|
||||
* @param value Property value.
|
||||
*/
|
||||
public void setProperty(String property, Object value);
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Wind River Systems 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.dd.dsf.ui.viewmodel.properties;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.core.runtime.ListenerList;
|
||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
|
||||
|
||||
/**
|
||||
* This is a base class for a label attribute used in generating label
|
||||
* information based on properties of an element. There are currently
|
||||
* four types of attributes: text, image, font, and color, and a given
|
||||
* attribute can be either enabled or disabled based on the element
|
||||
* properties.
|
||||
* <p/>
|
||||
* Clients are intended to override this class and its extensions to
|
||||
* implement the {@link LabelAttribute#isEnabled(Map)} and
|
||||
* {@link LabelAttribute#getPropertyNames()} methods as needed. Clients can
|
||||
* also override how the attribute settings are stored, for example in
|
||||
* order to use a preference.
|
||||
*
|
||||
* @see PropertyBasedLabelProvider
|
||||
* @see LabelColumnInfo
|
||||
*/
|
||||
@SuppressWarnings("restriction")
|
||||
abstract public class LabelAttribute {
|
||||
public static final String[] EMPTY_PROPERTY_NAMES_ARRAY = new String[0];
|
||||
|
||||
/**
|
||||
* Listeners for when this attribute is modified.
|
||||
*/
|
||||
private ListenerList fListeners = new ListenerList();
|
||||
|
||||
public LabelAttribute() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Disposes this attribute.
|
||||
*/
|
||||
public void dispose() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers the given listener for changes in this attribute. A change in
|
||||
* the attributes of a label should cause a view to repaint.
|
||||
* @param listener Listener to register.
|
||||
*/
|
||||
public void addChangedListener(ILabelAttributeChangedListener listener) {
|
||||
fListeners.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters the given listener.
|
||||
* @param listener Listener to unregister.
|
||||
*/
|
||||
public void removeChangedListener(ILabelAttributeChangedListener listener) {
|
||||
fListeners.remove(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the listeners to notify them that this attribute has changed.
|
||||
*/
|
||||
protected void fireAttributeChanged() {
|
||||
Object[] listeners = fListeners.getListeners();
|
||||
for (Object listener : listeners) {
|
||||
((ILabelAttributeChangedListener)listener).attributesChanged();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the propertis that are needed by this attribute in order to
|
||||
* determine whether this attribute is enabled and/or for the actual
|
||||
* attribute itself.
|
||||
* @return Array of names of properties for the element properties provider.
|
||||
*/
|
||||
public String[] getPropertyNames() {
|
||||
return EMPTY_PROPERTY_NAMES_ARRAY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether this attribute is enabled for an element which has
|
||||
* the given properties.
|
||||
* @param properties Map or element properties. The client should ensure
|
||||
* that all properties specified by {@link #getPropertyNames()} are
|
||||
* supplied in this map.
|
||||
* @return true if this attribute is enabled.
|
||||
*/
|
||||
public boolean isEnabled(Map<String, Object> properties) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the label with this attribute.
|
||||
*
|
||||
* @param update Label update object to write to.
|
||||
* @param columnIndex Colum index to write at.
|
||||
* @param properties Element properties to use.
|
||||
*/
|
||||
abstract public void updateAttribute(ILabelUpdate update, int columnIndex, Map<String, Object> properties);
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Wind River Systems 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.dd.dsf.ui.viewmodel.properties;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
|
||||
import org.eclipse.swt.graphics.RGB;
|
||||
|
||||
/**
|
||||
* The color attribute of a label. It determines what foreground and
|
||||
* background color to use for the given label.
|
||||
*
|
||||
* @see LabelAttribute
|
||||
* @see LabelColumnInfo
|
||||
* @see PropertyBasedLabelProvider
|
||||
*/
|
||||
|
||||
@SuppressWarnings("restriction")
|
||||
public class LabelColor extends LabelAttribute {
|
||||
private RGB fForeground;
|
||||
private RGB fBackground;
|
||||
|
||||
public LabelColor() {
|
||||
this(null, null);
|
||||
}
|
||||
|
||||
public LabelColor(RGB foreground, RGB background) {
|
||||
fForeground = foreground;
|
||||
fBackground = background;
|
||||
}
|
||||
|
||||
public RGB getForeground() {
|
||||
return fForeground;
|
||||
}
|
||||
|
||||
public RGB getBackground() {
|
||||
return fBackground;
|
||||
}
|
||||
|
||||
public void setForeground(RGB foreground) {
|
||||
fForeground = foreground;
|
||||
fireAttributeChanged();
|
||||
}
|
||||
|
||||
public void setBackground(RGB background) {
|
||||
fBackground = background;
|
||||
fireAttributeChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAttribute(ILabelUpdate update, int columnIndex, Map<String, Object> properties) {
|
||||
RGB foreground = getForeground();
|
||||
if (foreground != null) {
|
||||
update.setForeground(foreground, columnIndex);
|
||||
}
|
||||
|
||||
RGB background = getBackground();
|
||||
if (background != null) {
|
||||
update.setBackground(background, columnIndex);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,158 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Wind River Systems 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.dd.dsf.ui.viewmodel.properties;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.core.runtime.ListenerList;
|
||||
import org.eclipse.dd.dsf.concurrent.ThreadSafe;
|
||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
|
||||
|
||||
/**
|
||||
* Class used by the PropertyBasedLabelProvider to generate store
|
||||
* label attributes related to a single column. Each column info is
|
||||
* configured with an array of attributes (there are currently four
|
||||
* types of attributes: text, image, font, and color), which are
|
||||
* evaluated in order to generate the label.
|
||||
* <p/>
|
||||
* Clients are not intended to extend this class.
|
||||
*
|
||||
* @see PropertyBasedLabelProvider
|
||||
*/
|
||||
@SuppressWarnings("restriction")
|
||||
@ThreadSafe
|
||||
public class LabelColumnInfo implements ILabelAttributeChangedListener {
|
||||
|
||||
private static final LabelAttribute[] EMPTY_ATTRIBUTES_ARRAY = new LabelAttribute[0];
|
||||
|
||||
/**
|
||||
* Calculated list of property names that need to be retrieved to
|
||||
* generate the label for this column.
|
||||
*/
|
||||
private String[] fPropertyNames;
|
||||
|
||||
/**
|
||||
* Array of label attribute objects.
|
||||
*/
|
||||
private LabelAttribute[] fLabelAttributes;
|
||||
|
||||
/**
|
||||
* Listeners for when column attributes are modified.
|
||||
*/
|
||||
private ListenerList fListeners = new ListenerList();
|
||||
|
||||
/**
|
||||
* Creates the column info object with given array of attributes.
|
||||
* @param attributeInfos Attributes for the label.
|
||||
*/
|
||||
public LabelColumnInfo(LabelAttribute[] attributes)
|
||||
{
|
||||
fLabelAttributes = attributes;
|
||||
|
||||
List<String> names = new LinkedList<String>();
|
||||
for (LabelAttribute attr : attributes) {
|
||||
attr.addChangedListener(this);
|
||||
for (String name : attr.getPropertyNames()) {
|
||||
names.add(name);
|
||||
}
|
||||
}
|
||||
|
||||
fPropertyNames = names.toArray(new String[names.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disposes this column info object and the attribute objects
|
||||
* within it.
|
||||
*/
|
||||
public void dispose() {
|
||||
for (LabelAttribute attr : fLabelAttributes) {
|
||||
attr.dispose();
|
||||
attr.removeChangedListener(this);
|
||||
}
|
||||
fLabelAttributes = EMPTY_ATTRIBUTES_ARRAY;
|
||||
fPropertyNames = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the property names that need to be retrieved in order
|
||||
* to generate the label for this column.
|
||||
*/
|
||||
public String[] getPropertyNames() { return fPropertyNames; }
|
||||
|
||||
/**
|
||||
* Returns the list of configured label attributes for this column.
|
||||
*/
|
||||
public LabelAttribute[] getLabelAttributes() { return fLabelAttributes; }
|
||||
|
||||
/**
|
||||
* Registers the given listener for changes in the attributes of this
|
||||
* column. A change in the attributes of a label should cause
|
||||
* a view to repaint.
|
||||
* @param listener Listener to register.
|
||||
*/
|
||||
public void addChangedListener(ILabelAttributeChangedListener listener) {
|
||||
fListeners.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters the given listener.
|
||||
* @param listener Listener to unregister.
|
||||
*/
|
||||
public void removeChangedListener(ILabelAttributeChangedListener listener) {
|
||||
fListeners.remove(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Listener method called by the attribute objects.
|
||||
* @see ILabelAttributeChangedListener
|
||||
*/
|
||||
public void attributesChanged() {
|
||||
Object[] listeners = fListeners.getListeners();
|
||||
for (Object listener : listeners) {
|
||||
((ILabelAttributeChangedListener)listener).attributesChanged();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the label parameters for this column based on the provided
|
||||
* properties. The label information is written to the givne label
|
||||
* update under the given column index.
|
||||
* @param update Update to write to.
|
||||
* @param columnIndex Column to write label information under.
|
||||
* @param properties Map of properties to use to generate the label.
|
||||
*/
|
||||
public void updateColumn(ILabelUpdate update, int columnIndex, Map<String,Object> properties) {
|
||||
boolean textSet = false;
|
||||
boolean imageSet = false;
|
||||
boolean fontSet = false;
|
||||
boolean colorSet = false;
|
||||
|
||||
LabelAttribute[] labelAttributes = getLabelAttributes();
|
||||
for (LabelAttribute info : labelAttributes) {
|
||||
|
||||
if (!(info instanceof LabelText && textSet) &&
|
||||
!(info instanceof LabelImage && imageSet) &&
|
||||
!(info instanceof LabelFont && fontSet) &&
|
||||
!(info instanceof LabelColor && colorSet) &&
|
||||
info.isEnabled(properties))
|
||||
{
|
||||
info.updateAttribute(update, columnIndex, properties);
|
||||
|
||||
textSet = textSet || info instanceof LabelText;
|
||||
imageSet = imageSet || info instanceof LabelImage;
|
||||
fontSet = fontSet || info instanceof LabelFont;
|
||||
colorSet = colorSet || info instanceof LabelColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Wind River Systems 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.dd.dsf.ui.viewmodel.properties;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
|
||||
import org.eclipse.jface.resource.JFaceResources;
|
||||
import org.eclipse.swt.graphics.FontData;
|
||||
|
||||
/**
|
||||
* The font attribute of a label.
|
||||
*
|
||||
* @see LabelAttribute
|
||||
* @see LabelColumnInfo
|
||||
* @see PropertyBasedLabelProvider
|
||||
*/
|
||||
@SuppressWarnings("restriction")
|
||||
public class LabelFont extends LabelAttribute {
|
||||
private static final FontData DEFAULT_FONT = JFaceResources.getDefaultFontDescriptor().getFontData()[0];
|
||||
|
||||
/**
|
||||
* The font data of this attribute.
|
||||
*/
|
||||
private FontData fFontData;
|
||||
|
||||
public LabelFont() {
|
||||
this(DEFAULT_FONT);
|
||||
}
|
||||
|
||||
public LabelFont(FontData fontData) {
|
||||
fFontData = fontData;
|
||||
}
|
||||
|
||||
public FontData getFontData() {
|
||||
return fFontData;
|
||||
}
|
||||
|
||||
public void setFontData(FontData fontData) {
|
||||
fFontData = fontData;
|
||||
fireAttributeChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAttribute(ILabelUpdate update, int columnIndex, Map<String, Object> properties) {
|
||||
update.setFontData(getFontData(), columnIndex);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Wind River Systems 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.dd.dsf.ui.viewmodel.properties;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
|
||||
import org.eclipse.jface.resource.ImageDescriptor;
|
||||
|
||||
/**
|
||||
* The image attribute of a label.
|
||||
*
|
||||
* @see LabelAttribute
|
||||
* @see LabelColumnInfo
|
||||
* @see PropertyBasedLabelProvider
|
||||
*/
|
||||
@SuppressWarnings("restriction")
|
||||
public class LabelImage extends LabelAttribute {
|
||||
private ImageDescriptor fImageDescriptor;
|
||||
|
||||
public LabelImage() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
public LabelImage(ImageDescriptor image) {
|
||||
fImageDescriptor = image;
|
||||
}
|
||||
|
||||
public ImageDescriptor getImageDescriptor() {
|
||||
return fImageDescriptor;
|
||||
}
|
||||
|
||||
public void setImageDescriptor(ImageDescriptor image) {
|
||||
fImageDescriptor = image;
|
||||
fireAttributeChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAttribute(ILabelUpdate update, int columnIndex, Map<String, Object> properties) {
|
||||
ImageDescriptor descriptor = getImageDescriptor();
|
||||
if (descriptor != null) {
|
||||
update.setImageDescriptor(descriptor, columnIndex);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Wind River Systems 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.dd.dsf.ui.viewmodel.properties;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
import org.eclipse.dd.dsf.ui.DsfUIPlugin;
|
||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
|
||||
|
||||
/**
|
||||
* The text attribute of a label. It uses a message format string in order to
|
||||
* compose the text string. The parameter names determine the array of objects
|
||||
* given to the message format.
|
||||
*
|
||||
* @see MessageFormat#format(Object[], StringBuffer, java.text.FieldPosition)
|
||||
* @see LabelAttribute
|
||||
* @see LabelColumnInfo
|
||||
* @see PropertyBasedLabelProvider
|
||||
*/
|
||||
@SuppressWarnings("restriction")
|
||||
public class LabelText extends LabelAttribute {
|
||||
|
||||
public static final MessageFormat DEFAULT_MESSAGE = new MessageFormat("<unknown>");
|
||||
|
||||
/**
|
||||
* Message format used to generate the label text.
|
||||
*
|
||||
*/
|
||||
private MessageFormat fMessageFormat;
|
||||
|
||||
/**
|
||||
* The property names needed for the message format. The property values
|
||||
* corresponding to these names are given the the {@link MessageFormat#format(Object[], StringBuffer, java.text.FieldPosition)}
|
||||
* method.
|
||||
*/
|
||||
private String[] fPropertyNames;
|
||||
|
||||
public LabelText() {
|
||||
this(DEFAULT_MESSAGE, EMPTY_PROPERTY_NAMES_ARRAY);
|
||||
}
|
||||
|
||||
public LabelText(MessageFormat format, String[] propertyNames) {
|
||||
fMessageFormat = format;
|
||||
fPropertyNames = propertyNames;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getPropertyNames() {
|
||||
return fPropertyNames;
|
||||
}
|
||||
|
||||
public MessageFormat getMessageFormat() {
|
||||
return fMessageFormat;
|
||||
}
|
||||
|
||||
public void setMessageFormat(MessageFormat messageFormat) {
|
||||
fMessageFormat = messageFormat;
|
||||
fireAttributeChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAttribute(ILabelUpdate update, int columnIndex, Map<String, Object> properties) {
|
||||
String[] propertyNames = getPropertyNames();
|
||||
Object[] propertyValues = new Object[propertyNames.length];
|
||||
for (int i = 0; i < propertyNames.length; i++) {
|
||||
propertyValues[i] = properties.get(propertyNames[i]);
|
||||
}
|
||||
|
||||
try {
|
||||
update.setLabel(getMessageFormat().format(propertyValues, new StringBuffer(), null).toString(), columnIndex);
|
||||
} catch (IllegalArgumentException e) {
|
||||
update.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, 0, "Failed formatting a message for column " + columnIndex + ", for update " + update, e)); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,265 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Wind River Systems 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.dd.dsf.ui.viewmodel.properties;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.core.runtime.IAdaptable;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.ListenerList;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
|
||||
import org.eclipse.dd.dsf.concurrent.ImmediateExecutor;
|
||||
import org.eclipse.dd.dsf.concurrent.ThreadSafe;
|
||||
import org.eclipse.dd.dsf.service.IDsfService;
|
||||
import org.eclipse.dd.dsf.ui.DsfUIPlugin;
|
||||
import org.eclipse.dd.dsf.ui.viewmodel.VMViewerUpdate;
|
||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
|
||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
|
||||
|
||||
/**
|
||||
* A configurable label provider which uses element's property label provider
|
||||
* to set element's label attributes.
|
||||
* <p>
|
||||
* When this provider is registered for an element it calculates the properties
|
||||
* that need to be retrieved based on view's active columns, and then it calls the
|
||||
* element's property provider to retrieve those properties. After the property
|
||||
* values are retrieved, they are processed in order to produce correct label text,
|
||||
* images, fonts, and colors, for the given element.
|
||||
*/
|
||||
@SuppressWarnings("restriction")
|
||||
@ThreadSafe
|
||||
public class PropertyBasedLabelProvider
|
||||
implements IElementLabelProvider, ILabelAttributeChangedListener
|
||||
{
|
||||
private static final String[] EMPTY_PROPERTY_NAMES_ARRAY = new String[0];
|
||||
|
||||
/**
|
||||
* Properties update used as to collect property data from the provider.
|
||||
*/
|
||||
private class PropertiesUpdate extends VMViewerUpdate implements IPropertiesUpdate {
|
||||
|
||||
private final String[] fProperties;
|
||||
private final Map<String, Object> fValues;
|
||||
|
||||
public PropertiesUpdate(String[] properties, ILabelUpdate labelUpdate, DataRequestMonitor<Map<String,Object>> rm) {
|
||||
super(labelUpdate, rm);
|
||||
fProperties = properties;
|
||||
fValues = fProperties != null
|
||||
? new HashMap<String, Object>(properties.length * 4 / 3, 0.75f)
|
||||
: new HashMap<String, Object>();
|
||||
}
|
||||
|
||||
public String[] getProperties() {
|
||||
return fProperties;
|
||||
}
|
||||
|
||||
public void setProperty(String property, Object value) {
|
||||
fValues.put(property, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overrides the standard done in order to store the retrieved values
|
||||
* in the client's request monitor.
|
||||
*/
|
||||
@Override
|
||||
public void done() {
|
||||
@SuppressWarnings("unchecked")
|
||||
DataRequestMonitor<Map<String,Object>> rm = (DataRequestMonitor<Map<String,Object>>)fRequestMonitor;
|
||||
if (fProperties == null || fValues.size() >= fProperties.length) {
|
||||
rm.setData(fValues);
|
||||
} else {
|
||||
rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfService.REQUEST_FAILED, "Incomplete properties updated", null)); //$NON-NLS-1$
|
||||
}
|
||||
super.done();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute information for each column by column ID.
|
||||
*/
|
||||
private Map<String, LabelColumnInfo> fColumnInfos = Collections.synchronizedMap(new HashMap<String,LabelColumnInfo>());
|
||||
|
||||
private ListenerList fListeners = new ListenerList();
|
||||
|
||||
/**
|
||||
* Standard constructor. A property based label constructor does not
|
||||
* initialize column attribute information {@link #setColumnInfo(String, LabelColumnInfo)}
|
||||
* must be called to configure each column.
|
||||
*/
|
||||
public PropertyBasedLabelProvider() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Disposes this label provider and its configured column info objects.
|
||||
*/
|
||||
public void dispose() {
|
||||
LabelColumnInfo[] infos = null;
|
||||
synchronized (fColumnInfos) {
|
||||
infos = fColumnInfos.values().toArray(new LabelColumnInfo[fColumnInfos.size()]);
|
||||
fColumnInfos.clear();
|
||||
}
|
||||
for (LabelColumnInfo info : infos) {
|
||||
info.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the given column info object for the given column ID. This column
|
||||
* info will be used to generate the label when the given column is visibile.
|
||||
* @param columnId Column ID that the given column info is being registered for.
|
||||
* @param info Column 'info' object containing column attributes.
|
||||
* @return The previous column info object configured for this ID.
|
||||
*/
|
||||
public LabelColumnInfo setColumnInfo(String columnId, LabelColumnInfo info) {
|
||||
LabelColumnInfo oldInfo = fColumnInfos.put(columnId, info);
|
||||
info.addChangedListener(this);
|
||||
if (oldInfo != null) {
|
||||
info.removeChangedListener(this);
|
||||
}
|
||||
return oldInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the given column info object for the given column ID.
|
||||
* @param columnId Column ID to retrieve the column info for.
|
||||
* @@return Column 'info' object containing column attributes.
|
||||
*/
|
||||
public LabelColumnInfo getColumnInfo(String column) {
|
||||
return fColumnInfos.get(column);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers the given listener for changes in the attributes of this
|
||||
* label provider. A change in the attributes of a label should cause
|
||||
* a view to repaint.
|
||||
* @param listener Listener to register.
|
||||
*/
|
||||
public void addChangedListener(ILabelAttributeChangedListener listener) {
|
||||
fListeners.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters the given listener.
|
||||
* @param listener Listener to unregister.
|
||||
*/
|
||||
public void removeChangedListener(ILabelAttributeChangedListener listener) {
|
||||
fListeners.remove(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Listener method called by label provider's column info objects.
|
||||
* @see ILabelAttributeChangedListener
|
||||
*/
|
||||
public void attributesChanged() {
|
||||
Object[] listeners = fListeners.getListeners();
|
||||
for (Object listener : listeners) {
|
||||
((ILabelAttributeChangedListener)listener).attributesChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public void update(ILabelUpdate[] labelUpdates) {
|
||||
IElementPropertiesProvider propertiesProvider = getElementPropertiesProvider(labelUpdates[0].getElement());
|
||||
if (propertiesProvider == null) {
|
||||
for (ILabelUpdate update : labelUpdates) {
|
||||
update.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, "Properties-based label provider " + this + " failed to generate a label, no properties provider registered for element: " + labelUpdates[0].getElement())); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
}
|
||||
|
||||
String[] columnIds = labelUpdates[0].getColumnIds();
|
||||
String[] propertyNames = calcPropertyNamesForColumns(columnIds);
|
||||
|
||||
// Call the properties provider. Create a request monitor for each label update.
|
||||
// We can use an immediate executor for the request monitor because the label provider
|
||||
// is thread safe.
|
||||
IPropertiesUpdate[] propertiesUpdates = new IPropertiesUpdate[labelUpdates.length];
|
||||
for (int i = 0; i < labelUpdates.length; i++) {
|
||||
final ILabelUpdate labelUpdate = labelUpdates[i];
|
||||
propertiesUpdates[i] = new PropertiesUpdate(
|
||||
propertyNames, labelUpdates[i],
|
||||
new DataRequestMonitor<Map<String, Object>>(ImmediateExecutor.getInstance(), null) {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
if (getStatus().isOK()) {
|
||||
updateLabel(labelUpdate, getData());
|
||||
}
|
||||
labelUpdate.done();
|
||||
}
|
||||
});
|
||||
}
|
||||
propertiesProvider.update(propertiesUpdates);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the names of properties that have to be retrieved from the property
|
||||
* provider to generate the labels for given columns.
|
||||
* @param columnIds Column IDs to check.
|
||||
* @return Array of property names.
|
||||
*/
|
||||
private String[] calcPropertyNamesForColumns(String[] columnIds) {
|
||||
if (columnIds == null) {
|
||||
LabelColumnInfo columnInfo = getColumnInfo(null);
|
||||
if (columnInfo != null) {
|
||||
return columnInfo.getPropertyNames();
|
||||
} else {
|
||||
return EMPTY_PROPERTY_NAMES_ARRAY;
|
||||
}
|
||||
} else {
|
||||
List<String> properties = new LinkedList<String>();
|
||||
for (String columnId : columnIds) {
|
||||
LabelColumnInfo info = getColumnInfo(columnId);
|
||||
if (info != null) {
|
||||
String[] infoPropertyNames = info.getPropertyNames();
|
||||
for (int i = 0; i < infoPropertyNames.length; i++) {
|
||||
properties.add(infoPropertyNames[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return properties.toArray(new String[properties.size()]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the label information based on given map of properties.
|
||||
* @param update Label update to write to.
|
||||
* @param properties Properties retrieved from the element properties provider.
|
||||
*/
|
||||
protected void updateLabel(ILabelUpdate update, Map<String,Object> properties) {
|
||||
if (update.getColumnIds() == null) {
|
||||
LabelColumnInfo info = getColumnInfo(null);
|
||||
if (info != null) {
|
||||
info.updateColumn(update, 0, properties);
|
||||
}
|
||||
} else {
|
||||
String[] columnIds = update.getColumnIds();
|
||||
|
||||
for (int i = 0; i < columnIds.length; i++) {
|
||||
LabelColumnInfo info = getColumnInfo(columnIds[i]);
|
||||
if (info != null) {
|
||||
info.updateColumn(update, i, properties);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
update.done();
|
||||
}
|
||||
|
||||
private IElementPropertiesProvider getElementPropertiesProvider(Object element) {
|
||||
if (element instanceof IAdaptable) {
|
||||
return (IElementPropertiesProvider)((IAdaptable)element).getAdapter(IElementPropertiesProvider.class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue