/**
*
*/
package org.erlide.debug.ui.model;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.IValueDetailListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.part.FileEditorInput;
import org.erlide.backend.debug.ErlangLineBreakpoint;
import org.erlide.backend.debug.model.ErlangDebugTarget;
import org.erlide.backend.debug.model.ErlangProcess;
import org.erlide.backend.debug.model.ErlangStackFrame;
import org.erlide.backend.debug.model.ErlangUninterpretedStackFrame;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.model.root.IErlElementLocator;
import org.erlide.engine.model.root.IErlModule;
import org.erlide.ui.ErlideUIDebugImages;
import org.erlide.ui.editors.erl.ErlangEditor;
import org.erlide.ui.editors.util.EditorUtility;
import org.erlide.util.ErlLogger;
/**
* @author jakob
*
*/
public class ErlDebugModelPresentation extends LabelProvider
implements IDebugModelPresentation {
@Override
public Image getImage(final Object element) {
if (element instanceof ErlangUninterpretedStackFrame) {
return ErlideUIDebugImages
.get(ErlideUIDebugImages.IMG_OBJ_UNINTERPRETED_STACK_FRAME);
}
return super.getImage(element);
}
@Override
public void setAttribute(final String attribute, final Object value) {
}
@Override
public String getText(final Object element) {
try {
if (element instanceof ErlangDebugTarget) {
return getTargetText((ErlangDebugTarget) element);
} else if (element instanceof ErlangProcess) {
return getErlangProcessText((ErlangProcess) element);
} else if (element instanceof ErlangUninterpretedStackFrame) {
return getErlangUninterpretedStackFrameText(
(ErlangUninterpretedStackFrame) element);
} else if (element instanceof ErlangStackFrame) {
return getErlangStackFrameText((ErlangStackFrame) element);
} else if (element instanceof ErlangLineBreakpoint) {
return getErlangLineBreakpointText((ErlangLineBreakpoint) element);
}
return null;
} catch (final DebugException e) {
return "?";
}
}
private String getErlangUninterpretedStackFrameText(
final ErlangUninterpretedStackFrame stackFrame) {
return stackFrame.getModule() + ":" + stackFrame.getFunction().getNameWithArity();
}
private String getErlangLineBreakpointText(final ErlangLineBreakpoint breakpoint) {
try {
return getErlangPositionText(breakpoint.getModule(),
breakpoint.getLineNumber(), breakpoint.getClauseHead());
} catch (final CoreException e) {
}
return breakpoint.getModule();
}
private String getErlangStackFrameText(final ErlangStackFrame stackFrame) {
try {
return getErlangPositionText(stackFrame.getModule(),
stackFrame.getLineNumber(), stackFrame.getClauseHead());
} catch (final DebugException e) {
ErlLogger.warn(e);
}
return null;
}
private static String getErlangPositionText(final String module, final int lineNumber,
final String clauseHead) {
final StringBuilder sb = new StringBuilder();
sb.append(module);
if (lineNumber != -1) {
sb.append(':');
sb.append(lineNumber);
}
if (clauseHead != null && clauseHead.length() > 0) {
sb.append(" - ").append(clauseHead);
}
return sb.toString();
}
private String getErlangProcessText(final ErlangProcess el) throws DebugException {
final StringBuilder sb = new StringBuilder();
if (el.isSystemProcess()) {
sb.append('*');
}
if (el.isErlideProcess()) {
sb.append('#');
}
sb.append(el.getName());
sb.append(" [").append(el.getStatus());
final boolean terminated = el.getStatus().equals(ErlangProcess.STATUS_TERMINATED);
if (terminated) {
sb.append(", ").append(el.getExitStatus());
}
sb.append("] ").append(el.getInitialCall());
if (!terminated) {
sb.append(' ').append(el.getCurrentFunction());
}
return sb.toString();
}
private String getTargetText(final ErlangDebugTarget el) throws DebugException {
return el.getName() + " (backend)";
}
@Override
public void computeDetail(final IValue value, final IValueDetailListener listener) {
String detail = "";
try {
detail = value.getValueString();
} catch (final DebugException e) {
}
listener.detailComputed(value, detail);
}
@Override
public void dispose() {
}
@Override
public boolean isLabelProperty(final Object element, final String property) {
return true;
}
@Override
public IEditorInput getEditorInput(final Object element) {
if (element instanceof IFile) {
return new FileEditorInput((IFile) element);
}
if (element instanceof ILineBreakpoint) {
return new FileEditorInput(
(IFile) ((ILineBreakpoint) element).getMarker().getResource());
}
if (element instanceof LocalFileStorage) {
final LocalFileStorage lfs = (LocalFileStorage) element;
try {
final IErlElementLocator model = ErlangEngine.getInstance().getModel();
final IErlModule module = ErlangEngine.getInstance().getModelFindService()
.findModule(model, null, null, lfs.getFullPath().toString(),
IErlElementLocator.Scope.ALL_PROJECTS);
return EditorUtility.getEditorInput(module);
} catch (final CoreException e) {
ErlLogger.error(e);
}
}
return null;
}
@Override
public String getEditorId(final IEditorInput input, final Object element) {
if (element instanceof IFile || element instanceof ILineBreakpoint
|| element instanceof LocalFileStorage) {
return ErlangEditor.ERLANG_EDITOR_ID;
}
return null;
}
}