blob: f82896841440283a3a9339e027c11c291c249f6e [file] [log] [blame]
package org.eclipse.debug.internal.ui;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IExpression;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.IValueDetailListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorInput;
/**
* A model presentation that delegates to the appropriate extension. This
* presentation contains a table of specialized presentations that are defined
* as <code>org.eclipse.debug.ui.debugModelPresentations</code> extensions. When
* asked to render an object from a debug model, this presentation delegates
* to the extension registered for that debug model.
*/
public class DelegatingModelPresentation implements IDebugModelPresentation {
/**
* A mapping of attribute ids to their values
* @see IDebugModelPresentation#setAttribute
*/
private HashMap fAttributes= new HashMap(3);
/**
* A table of label providers keyed by debug model identifiers.
*/
private HashMap fLabelProviders= new HashMap(5);
/**
* Constructs a new DelegatingLabelProvider that delegates to extensions
* of kind <code>org.eclipse.debug.ui.debugLabelProvider</code>
*/
public DelegatingModelPresentation() {
IPluginDescriptor descriptor= DebugUIPlugin.getDefault().getDescriptor();
IExtensionPoint point= descriptor.getExtensionPoint(IDebugUIConstants.ID_DEBUG_MODEL_PRESENTATION);
if (point != null) {
IExtension[] extensions= point.getExtensions();
for (int i= 0; i < extensions.length; i++) {
IExtension extension= extensions[i];
IConfigurationElement[] configElements= extension.getConfigurationElements();
for (int j= 0; j < configElements.length; j++) {
IConfigurationElement elt= configElements[j];
String id= elt.getAttribute("id"); //$NON-NLS-1$
if (id != null) {
IDebugModelPresentation lp= new LazyModelPresentation(elt);
getLabelProviders().put(id, lp);
}
}
}
}
}
/**
* Delegate to all extensions.
*
* @see IBaseLabelProvider#addListener(ILabelProviderListener)
*/
public void addListener(ILabelProviderListener listener) {
Iterator i= getLabelProviders().values().iterator();
while (i.hasNext()) {
((ILabelProvider) i.next()).addListener(listener);
}
}
/**
* Delegate to all extensions.
*
* @see IBaseLabelProvider#dispose()
*/
public void dispose() {
Iterator i= getLabelProviders().values().iterator();
while (i.hasNext()) {
((ILabelProvider) i.next()).dispose();
}
}
/**
* @see IDebugModelPresentation#getImage(Object)
*/
public Image getImage(Object item) {
// Attempt to delegate
IDebugModelPresentation lp= getConfiguredPresentation(item);
if (lp != null) {
Image image= lp.getImage(item);
if (image != null) {
return image;
}
}
// If no delegate returned an image, use the default
return getDefaultImage(item);
}
/**
* @see IDebugModelPresentation#getText(Object)
*/
public String getText(Object item) {
// Attempt to delegate
IDebugModelPresentation lp= getConfiguredPresentation(item);
if (lp != null) {
String label= lp.getText(item);
if (label != null) {
return label;
}
}
// If no delegate returned a text label, use the default
if (showVariableTypeNames()) {
try {
if (item instanceof IExpression) {
return new StringBuffer(((IExpression)item).getValue().getReferenceTypeName()).append(' ').append(getDefaultText(item)).toString(); //$NON-NLS-1$
} else if (item instanceof IVariable) {
return new StringBuffer(((IVariable)item).getValue().getReferenceTypeName()).append(' ').append(getDefaultText(item)).toString(); //$NON-NLS-1$
}
} catch (DebugException de) {
DebugUIPlugin.log(de);
}
}
return getDefaultText(item);
}
/**
* @see IDebugModelPresentation#getEditorInput(Object)
*/
public IEditorInput getEditorInput(Object item) {
IDebugModelPresentation lp= getConfiguredPresentation(item);
if (lp != null) {
return lp.getEditorInput(item);
}
return null;
}
/**
* @see IDebugModelPresentation#getEditorId(IEditorInput, Object)
*/
public String getEditorId(IEditorInput input, Object objectInput) {
IDebugModelPresentation lp= getConfiguredPresentation(objectInput);
if (lp != null) {
return lp.getEditorId(input, objectInput);
}
return null;
}
/**
* Returns a default text label for the debug element
*/
protected String getDefaultText(Object element) {
return DebugUIPlugin.getDefaultLabelProvider().getText(element);
}
/**
* Returns a default image for the debug element
*/
protected Image getDefaultImage(Object element) {
return DebugUIPlugin.getDefaultLabelProvider().getImage(element);
}
/*
* @see IDebugModelPresentation#computeDetail(IValue, IValueDetailListener)
*/
public void computeDetail(IValue value, IValueDetailListener listener) {
IDebugModelPresentation lp= getConfiguredPresentation(value);
if (lp != null) {
lp.computeDetail(value, listener);
} else {
listener.detailComputed(value, getText(value));
}
}
/**
* Delegate to all extensions.
*
* @see IBaseLabelProvider#removeListener(ILabelProviderListener)
*/
public void removeListener(ILabelProviderListener listener) {
Iterator i= getLabelProviders().values().iterator();
while (i.hasNext()) {
((ILabelProvider) i.next()).removeListener(listener);
}
}
/**
* Delegate to the appropriate label provider.
*
* @see IBaseLabelProvider#isLabelProperty(Object, String)
*/
public boolean isLabelProperty(Object element, String property) {
if (element instanceof IDebugElement) {
IDebugModelPresentation lp= getConfiguredPresentation((IDebugElement) element);
if (lp != null) {
return lp.isLabelProperty(element, property);
}
}
return true;
}
/**
* Returns a configured model presentation for the given object,
* or <code>null</code> if one is not registered.
*/
protected IDebugModelPresentation getConfiguredPresentation(Object element) {
String id= null;
if (element instanceof IDebugElement) {
IDebugElement de= (IDebugElement) element;
id= de.getModelIdentifier();
} else if (element instanceof IMarker) {
IMarker m= (IMarker) element;
IBreakpoint bp = DebugPlugin.getDefault().getBreakpointManager().getBreakpoint(m);
if (bp != null) {
id= bp.getModelIdentifier();
}
} else if (element instanceof IBreakpoint) {
id = ((IBreakpoint)element).getModelIdentifier();
}
if (id != null) {
return getPresentation(id);
}
return null;
}
/**
* Returns the presentation registered for the given id, or <code>null</code>
* of nothing is registered for the id.
*/
public IDebugModelPresentation getPresentation(String id) {
return (IDebugModelPresentation) getLabelProviders().get(id);
}
/**
* @see IDebugModelPresentation#setAttribute(String, Object)
*/
public void setAttribute(String id, Object value) {
if (value == null) {
return;
}
getAttributes().put(id, value);
Iterator presentations = fLabelProviders.values().iterator();
while (presentations.hasNext()) {
((IDebugModelPresentation)presentations.next()).setAttribute(id, value);
}
}
/**
* Whether or not to show variable type names.
* This option is configured per model presentation.
* This allows this option to be set per view, for example.
*/
protected boolean showVariableTypeNames() {
Boolean show= (Boolean) fAttributes.get(DISPLAY_VARIABLE_TYPE_NAMES);
show= show == null ? Boolean.FALSE : show;
return show.booleanValue();
}
protected HashMap getAttributes() {
return fAttributes;
}
protected void setAttributes(HashMap attributes) {
fAttributes = attributes;
}
protected HashMap getLabelProviders() {
return fLabelProviders;
}
protected void setLabelProviders(HashMap labelProviders) {
fLabelProviders = labelProviders;
}
}