package org.ntlab.reverseDebugger;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeNode;
import org.eclipse.jface.viewers.TreeNodeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.ntlab.onlineAccessor.JDIInstanceMethodCaller;
public class CallStackView extends ViewPart {
private static TreeViewer viewer;
private IAction refreshAction;
private static CallStackModels callStackModels = new CallStackModels();
private JavaEditorOperator javaEditorOperator = new JavaEditorOperator();
public static final String ID = "org.ntlab.reverseDebugger.callStackView";
public CallStackView() {
// TODO Auto-generated constructor stub
System.out.println("callStackViewクラスが生成されたよ");
}
@Override
public void createPartControl(Composite parent) {
// TODO Auto-generated method stub
System.out.println("CallStackView#createPartControl(Composite)が呼ばれたよ!");
viewer = new TreeViewer(parent);
viewer.setContentProvider(new TreeNodeContentProvider());
viewer.setLabelProvider(new CallStackLabelProvider());
viewer.expandAll();
// 選択したカラムに対応するメソッド実行のソースファイルを開かせるリスナーを登録する
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection)event.getSelection();
Object element = sel.getFirstElement();
if (element instanceof TreeNode) {
Object value = ((TreeNode)element).getValue();
if (value instanceof CallStackModel) {
CallStackModel callStackModel = (CallStackModel)value;
JDIInstanceMethodCaller methodExecution = callStackModel.getMethodCaller();
SeedAliasView.createSeedAliasesByMethodExecution(methodExecution);
SeedAliasView.refresh();
javaEditorOperator.openSrcFileOfMethodExecution(methodExecution, callStackModel.getCallLineNo());
}
}
}
});
createActions();
createToolBar();
createMenuBar();
}
@Override
public void setFocus() {
// TODO Auto-generated method stub
viewer.getControl().setFocus();
}
private void createActions() {
refreshAction = new Action() {
@Override
public void run() {
refresh();
}
};
refreshAction.setText("refresh");
refreshAction.setToolTipText("refresh");
refreshAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_ELCL_SYNCED));
}
private void createToolBar() {
IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
mgr.add(refreshAction);
}
private void createMenuBar() {
IMenuManager mgr = getViewSite().getActionBars().getMenuManager();
mgr.add(refreshAction);
}
public static void updateByAlias(JDIInstanceMethodCaller alias) {
callStackModels.updateByAlias(alias);
}
public static void refresh() {
if (callStackModels.getCallStackModels().isEmpty()) {
JDIInstanceMethodCaller currentMe = SeedAliasView.getDebuggingMethodExecution();
callStackModels.updateByDebuggerStopMethodExecution(currentMe);
}
TreeNode[] nodes = callStackModels.getCallStackModelsTreeNodes();
if (nodes == null || nodes[0] == null) {
return;
}
viewer.setInput(nodes);
viewer.expandAll();
}
public static void reset() {
callStackModels.reset();
refresh();
}
}