/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package org.absmodels.abs.plugin.debug.views.debugview;
import static org.absmodels.abs.plugin.debug.DebugUtils.getSchedulerRef;
import static org.absmodels.abs.plugin.debug.DebugUtils.highlightLine;
import static org.absmodels.abs.plugin.debug.DebugUtils.openVariableView;
import static org.absmodels.abs.plugin.debug.DebugUtils.refreshButtonEnablement;
import static org.absmodels.abs.plugin.debug.DebugUtils.refreshVariableView;
import org.absmodels.abs.plugin.debug.model.Debugger;
import org.eclipse.debug.ui.AbstractDebugView;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PartInitException;
import abs.backend.java.debugging.TaskInfo;
import abs.backend.java.observing.ObjectView;
import abs.backend.java.observing.TaskStackFrameView;
import abs.backend.java.observing.TaskView;
/**
* This is the ABS debug view intended to be used in the ABS debug perspective. It contains
* a TreeViewer representing the current state of the debugged ABS program as well as a set of
* buttons which allow the user to control the debug process (see plugin.xml to see how buttons are added).
* @author tfischer
*/
public class DebugView extends AbstractDebugView {
private Debugger debugger;
public DebugView() {
debugger = new Debugger();
}
@Override
public void init(IViewSite site) throws PartInitException {
super.init(site);
// active scope of the debug view when component is active
}
@Override
protected void configureToolBar(IToolBarManager arg0) { }
@Override
protected void createActions() { }
@Override
protected Viewer createViewer(Composite parent) {
final TreeViewer viewer = new TreeViewer(parent);
viewer.setContentProvider(new DebugTreeContentProvider());
viewer.setLabelProvider(new DebugTreeStyledLabelProvider());
viewer.setInput(debugger.getModel());
viewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
refreshButtonEnablement();
Object selection = ((IStructuredSelection)event.getSelection()).getFirstElement();
if(selection instanceof TaskView || selection instanceof ObjectView || selection instanceof TaskStackFrameView){
refreshVariableView();
if(selection instanceof TaskView){
TaskView tv = (TaskView) selection;
TaskInfo taskInfo = getDebugger().getModel().getTaskInfo(tv);
highlightLine(taskInfo);
}
}
getSchedulerRef().taskSelectionChanged(selection);
}
});
viewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
Object selection = ((IStructuredSelection)event.getSelection()).getFirstElement();
if(selection instanceof ObjectView || selection instanceof TaskStackFrameView){
openVariableView();
refreshVariableView();
} else{
viewer.setExpandedState(selection, !viewer.getExpandedState(selection));
}
}
});
viewer.expandAll();
return viewer;
}
@Override
protected void fillContextMenu(IMenuManager arg0) { }
@Override
protected String getHelpContextId() { return null; }
/**
* Returns the org.abs-models.abs.plugin.debug.model.Debugger of this view. Whenever a DebugView is created,
* a new debugger is created and added, so a debugger always exists.
* @return Debugger of this view
*/
public Debugger getDebugger(){
return debugger;
}
}