/*******************************************************************************
* Copyright (c) 2010 R.Dvorak 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:
* Sergey Boyko - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.debug.ui.views;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.ui.AbstractDebugView;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.contexts.DebugContextEvent;
import org.eclipse.debug.ui.contexts.IDebugContextListener;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.m2m.internal.qvt.oml.ast.env.InternalEvaluationEnv;
import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEvaluationEnv;
import org.eclipse.m2m.internal.qvt.oml.runtime.ui.trace.common.TraceActionBarContributor;
import org.eclipse.m2m.internal.qvt.oml.runtime.ui.trace.common.TraceWorkbenchPart;
import org.eclipse.m2m.internal.qvt.oml.trace.Trace;
import org.eclipse.m2m.qvt.oml.debug.core.QVTODebugCore;
import org.eclipse.m2m.qvt.oml.debug.core.QVTOStackFrame;
import org.eclipse.m2m.qvt.oml.debug.core.QVTOThread;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchActionConstants;
public class TraceViewPart extends AbstractDebugView implements IDebugContextListener {
public static final String ID = "org.eclipse.m2m.internal.qvt.oml.debug.ui.views.trace"; //$NON-NLS-1$
@Override
protected Viewer createViewer(Composite parent) {
myTraceWorkbenchPart.createPartControl(parent);
DebugUITools.getDebugContextManager().getContextService(getSite().getWorkbenchWindow()).addDebugContextListener(this);
TreeViewer viewer = myTraceWorkbenchPart.getViewer();
myTraceActionBarContributor.setViewer(viewer);
return viewer;
}
@Override
public void dispose() {
DebugUITools.getDebugContextManager().getContextService(getSite().getWorkbenchWindow()).removeDebugContextListener(this);
super.dispose();
}
@Override
protected String getHelpContextId() {
return ID;
}
@Override
protected void configureToolBar(IToolBarManager toolBarManager) {
myTraceActionBarContributor.contributeToToolBar(toolBarManager);
}
@Override
protected void createActions() {
}
@Override
protected void fillContextMenu(IMenuManager menu) {
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
@Override
protected void becomesHidden() {
myTraceWorkbenchPart.setInput(null);
}
@Override
protected void becomesVisible() {
ISelection selection = DebugUITools.getDebugContextManager().getContextService(getSite().getWorkbenchWindow()).getActiveContext();
contextActivated(selection);
}
public void debugContextChanged(DebugContextEvent event) {
if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
contextActivated(event.getContext());
}
}
private void contextActivated(ISelection selection) {
if (!isAvailable() || !isVisible()) {
return;
}
if (selection instanceof IStructuredSelection) {
Object firstElement = ((IStructuredSelection)selection).getFirstElement();
if (firstElement == null) {
return;
}
IDebugTarget debugTarget = null;
if (firstElement instanceof QVTOThread) {
QVTOThread qvtThread = (QVTOThread) firstElement;
try {
IStackFrame[] stackFrames = qvtThread.getStackFrames();
if (stackFrames.length == 0
|| false == stackFrames[0] instanceof QVTOStackFrame) {
return;
}
debugTarget = ((QVTOStackFrame) stackFrames[0]).getDebugTarget();
} catch (DebugException e) {
QVTODebugCore.log(e);
}
}
else if (firstElement instanceof QVTOStackFrame) {
debugTarget = ((QVTOStackFrame) firstElement).getDebugTarget();
}
else if (firstElement instanceof IDebugTarget) {
debugTarget = (IDebugTarget) firstElement;
}
if (debugTarget != null) {
QvtOperationalEvaluationEnv evalEnv = (QvtOperationalEvaluationEnv) debugTarget.getAdapter(QvtOperationalEvaluationEnv.class);
if (evalEnv != null) {
InternalEvaluationEnv internEnv = evalEnv.getAdapter(InternalEvaluationEnv.class);
Trace trace = internEnv.getTraces();
activate(trace);
return;
}
}
}
deactivate();
}
private void activate(Trace trace) {
if (trace == myTraceWorkbenchPart.getInput()) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
myTraceWorkbenchPart.getViewer().refresh();
}
});
} else {
myTraceWorkbenchPart.setInput(trace);
setEnabled(true);
}
}
private void deactivate() {
myTraceWorkbenchPart.setInput(null);
setEnabled(false);
}
private void setEnabled(boolean enabled) {
getDefaultPage().getControl().setVisible(enabled);
for (IAction action : myTraceActionBarContributor.getActions()) {
action.setEnabled(enabled);
}
}
private final TraceWorkbenchPart myTraceWorkbenchPart = new TraceWorkbenchPart(this);
private final TraceActionBarContributor myTraceActionBarContributor = new TraceActionBarContributor();
}