Package org.erlide.debug.ui.model

Source Code of org.erlide.debug.ui.model.ErlDebugModelPresentation

/**
*
*/
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.erlang.IErlModule;
import org.erlide.engine.model.root.IErlElementLocator;
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;
    }

}
TOP

Related Classes of org.erlide.debug.ui.model.ErlDebugModelPresentation

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.