/*******************************************************************************
* Copyright (c) 2007, 2010 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.tm.internal.tcf.debug.ui.model;
import java.net.URI;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.IValueDetailListener;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.tm.internal.tcf.debug.model.TCFBreakpoint;
import org.eclipse.tm.internal.tcf.debug.model.TCFBreakpointsModel;
import org.eclipse.tm.internal.tcf.debug.ui.Activator;
import org.eclipse.tm.internal.tcf.debug.ui.ImageCache;
import org.eclipse.tm.tcf.services.IBreakpoints;
import org.eclipse.tm.tcf.util.TCFTask;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.part.FileEditorInput;
public class TCFModelPresentation implements IDebugModelPresentation {
private final Collection<ILabelProviderListener> listeners = new HashSet<ILabelProviderListener>();
private static final TCFModelPresentation default_instance = new TCFModelPresentation();
public static TCFModelPresentation getDefault() {
return default_instance;
}
public void addListener(ILabelProviderListener listener) {
listeners.add(listener);
}
public void removeListener(ILabelProviderListener listener) {
listeners.remove(listener);
}
public void dispose() {
}
public void computeDetail(IValue value, IValueDetailListener listener) {
}
public Image getImage(Object element) {
ImageDescriptor descriptor = null;
if (element instanceof TCFBreakpoint) {
final TCFBreakpoint breakpoint = (TCFBreakpoint)element;
descriptor = ImageCache.getImageDescriptor(ImageCache.IMG_BREAKPOINT_DISABLED);
try {
if (breakpoint.isEnabled()) {
descriptor = new TCFTask<ImageDescriptor>() {
public void run() {
boolean installed = false;
boolean warning = false;
boolean error = false;
ImageDescriptor d = ImageCache.getImageDescriptor(ImageCache.IMG_BREAKPOINT_ENABLED);
for (Map<String,Object> map : Activator.getAnnotationManager().getBreakpointStatus(breakpoint).values()) {
if (map != null) {
if ((String)map.get(IBreakpoints.STATUS_ERROR) != null) error = true;
Object planted = map.get(IBreakpoints.STATUS_INSTANCES);
if (planted != null) {
@SuppressWarnings("unchecked")
Collection<Map<String,Object>> list = (Collection<Map<String,Object>>)planted;
for (Map<String,Object> m : list) {
if (m.get(IBreakpoints.INSTANCE_ERROR) == null) installed = true;
else warning = true;
}
}
}
}
if (warning) d = ImageCache.addOverlay(d, ImageCache.IMG_BREAKPOINT_WARNING, 9, 8);
if (installed) d = ImageCache.addOverlay(d, ImageCache.IMG_BREAKPOINT_INSTALLED, 0, 8);
if (error) d = ImageCache.addOverlay(d, ImageCache.IMG_BREAKPOINT_ERROR, 9, 8);
done(d);
}
}.getE();
}
if (breakpoint.getMarker().getAttribute(TCFBreakpointsModel.ATTR_CONDITION, null) != null) {
descriptor = ImageCache.addOverlay(descriptor, ImageCache.IMG_BREAKPOINT_CONDITIONAL);
}
}
catch (Throwable x) {
}
}
if (descriptor != null) return ImageCache.getImage(descriptor);
return null;
}
public String getText(Object element) {
String text = null;
if (element instanceof TCFBreakpoint) {
final TCFBreakpoint breakpoint = (TCFBreakpoint)element;
text = breakpoint.getText();
String status = new TCFTask<String>() {
public void run() {
done(Activator.getAnnotationManager().getBreakpointStatusText(breakpoint));
}
}.getE();
if (status != null) text += " (" + status + ")";
}
return text;
}
public void setAttribute(String attribute, Object value) {
}
public boolean isLabelProperty(Object element, String property) {
return true;
}
public String getEditorId(IEditorInput input, Object element) {
String id = null;
if (input != null) {
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
IEditorDescriptor descriptor = registry.getDefaultEditor(input.getName());
if (descriptor != null) id = descriptor.getId();
}
return id;
}
public IEditorInput getEditorInput(Object element) {
if (element instanceof ILineBreakpoint) {
element = ((ILineBreakpoint)element).getMarker();
}
if (element instanceof IMarker) {
element = ((IMarker)element).getResource();
}
if (element instanceof IFile) {
return new FileEditorInput((IFile)element);
}
if (element instanceof IStorage) {
IPath fullPath = ((IStorage)element).getFullPath();
URI uri = URIUtil.toURI(fullPath);
if (uri != null) {
try {
return new FileStoreEditorInput(EFS.getStore(uri));
}
catch (CoreException e) {
Activator.log(e);
}
}
}
return null;
}
}