package org.ntlab.reversedebugger;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.ntlab.debuggingControl.MethodCaller;
public class SeedAliasView extends ViewPart {
private static TableViewer viewer;
private IAction refreshAction;
private IAction resetAction;
private IAction getObjectFlowAction;
private MethodCaller selectSeedAlias;
private static SeedAliases seedAliases = new SeedAliases();
private static JavaEditorOperator javaEditorOperator = new JavaEditorOperator();
public static final String ID = "org.ntlab.reverseDebugger.seedAliasView";
public SeedAliasView() {
// TODO Auto-generated constructor stub
System.out.println("SeedAliasViewクラスが生成されたよ!");
}
@Override
public void createPartControl(Composite parent) {
// TODO Auto-generated method stub
System.out.println("SeedAliasView#createPartControl(Composite)が呼ばれたよ!");
viewer = new TableViewer(parent, SWT.FULL_SELECTION);
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
// テーブルのカラムを作成
String[] tableColumnTexts = {"objectID", "objectType", "srcFile", "lineNo", "statementType", "statementSignature", "occurrence"};
int[] tableColumnWidth = {150, 160, 160, 80, 180, 300, 110};
TableColumn[] tableColumns = new TableColumn[tableColumnTexts.length];
for (int i = 0; i < tableColumns.length; i++) {
tableColumns[i] = new TableColumn(table, SWT.NULL);
tableColumns[i].setText(tableColumnTexts[i]);
tableColumns[i].setWidth(tableColumnWidth[i]);
}
viewer.setContentProvider(new ArrayContentProvider());
viewer.setLabelProvider(new SeedAliasLabelProvider());
viewer.setInput(seedAliases.getSeedAliases());
CallStackView.refresh();
// 選択したカラムに対応するシードエイリアスを起点にオブジェクトフローを実行させるリスナーを登録
// viewer.addSelectionChangedListener(new ISelectionChangedListener() {
// @Override
// public void selectionChanged(SelectionChangedEvent event) {
// IStructuredSelection sel = (IStructuredSelection)event.getSelection();
// Object element = sel.getFirstElement();
// if (element instanceof MethodCaller) {
// MethodCaller seedAlias = (MethodCaller)element;
// ObjectFlowAliasView.createObjectFlow(seedAlias);
// ObjectFlowAliasView.refresh();
// }
// }
// });
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection)event.getSelection();
Object element = sel.getFirstElement();
if (element instanceof MethodCaller) {
selectSeedAlias = (MethodCaller)element;
javaEditorOperator.openSrcFileOfAlias(selectSeedAlias);
}
}
});
createActions();
createToolBar();
createMenuBar();
createPopupMenu();
}
@Override
public void setFocus() {
// TODO Auto-generated method stub
viewer.getControl().setFocus();
// viewer.refresh();
}
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));
resetAction = new Action() {
@Override
public void run() {
reset();
}
};
resetAction.setText("reset");
resetAction.setToolTipText("reset");
resetAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_ETOOL_HOME_NAV));
getObjectFlowAction = new Action() {
@Override
public void run() {
getObjectFlow();
}
};
getObjectFlowAction.setText("getObjectFlow");
getObjectFlowAction.setToolTipText("getObjectFlow");
getObjectFlowAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_TASK_TSK));
}
private void createToolBar() {
IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
mgr.add(refreshAction);
mgr.add(resetAction);
}
private void createMenuBar() {
IMenuManager mgr = getViewSite().getActionBars().getMenuManager();
mgr.add(refreshAction);
mgr.add(resetAction);
}
private void createPopupMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
manager.add(getObjectFlowAction);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
public static MethodCaller getDebuggerStopMethodExecution() {
return seedAliases.getDebuggerStopMethodExecution();
}
public static void createSeedAliasesByAlias(MethodCaller alias) {
seedAliases.createSeedAliasesByAlias(alias);
}
public static void createSeedAliasesByMethodExecution(MethodCaller methodExecution) {
seedAliases.createSeedAliasesByMethodExecution(methodExecution);
}
public static void refresh() {
if (seedAliases.getSeedAliases().isEmpty()) {
seedAliases.initSeedAliases();
javaEditorOperator.openSrcFileOfMethodExecution(seedAliases.getDebuggerStopMethodExecution());
CallStackView.reset();
}
viewer.refresh();
// CallStackView.refresh();
}
private void reset() {
seedAliases.reset();
ObjectFlowAliasView.reset();
refresh();
}
private void getObjectFlow() {
if (selectSeedAlias != null) {
ObjectFlowAliasView.createObjectFlow(selectSeedAlias);
ObjectFlowAliasView.refresh();
}
}
}