diff --git a/plugin.xml b/plugin.xml index 252a1c2..f170f3b 100644 --- a/plugin.xml +++ b/plugin.xml @@ -44,6 +44,13 @@ name="CallTree" restorable="true"> + + diff --git a/src/org/ntlab/traceDebugger/CallStackView.java b/src/org/ntlab/traceDebugger/CallStackView.java index fb58439..c04ba47 100644 --- a/src/org/ntlab/traceDebugger/CallStackView.java +++ b/src/org/ntlab/traceDebugger/CallStackView.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Map; +import org.eclipse.core.resources.IMarker; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; @@ -22,6 +23,9 @@ import org.eclipse.ui.part.ViewPart; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; +import org.ntlab.traceDebugger.analyzerProvider.AbstractAnalyzer; +import org.ntlab.traceDebugger.analyzerProvider.DeltaExtractionAnalyzer; +import org.ntlab.traceDebugger.analyzerProvider.DeltaMarkerManager; public class CallStackView extends ViewPart { private TreeViewer viewer; @@ -56,7 +60,22 @@ MethodExecution methodExecution = callStackModel.getMethodExecution(); TracePoint tp = callStackModel.getTracePoint(); JavaEditorOperator.openSrcFileOfMethodExecution(methodExecution, callStackModel.getCallLineNo()); - ((VariableView)getOtherView(VariableView.ID)).updateVariablesByTracePoint(tp, false); + CallTreeView callTreeView = (CallTreeView)(getOtherView(CallTreeView.ID)); + callTreeView.highlight(methodExecution); + + VariableView variableView = (VariableView)(getOtherView(VariableView.ID)); + variableView.updateVariablesByTracePoint(tp, false); + AbstractAnalyzer analyzer = TraceDebuggerPlugin.getAnalyzer(); + if (analyzer instanceof DeltaExtractionAnalyzer) { + DeltaMarkerView deltaMarkerView = ((DeltaExtractionAnalyzer)analyzer).getActiveDeltaMarkerView(); + if (deltaMarkerView != null) { + DeltaMarkerManager deltaMarkerManager = deltaMarkerView.getDeltaMarkerManager(); + Map> deltaMarkers = deltaMarkerManager.getMarkers(); + if (deltaMarkers != null) { + variableView.markAndExpandVariablesByDeltaMarkers(deltaMarkers); + } + } + } } } } diff --git a/src/org/ntlab/traceDebugger/CallTreeView.java b/src/org/ntlab/traceDebugger/CallTreeView.java index 2470723..8fdd670 100644 --- a/src/org/ntlab/traceDebugger/CallTreeView.java +++ b/src/org/ntlab/traceDebugger/CallTreeView.java @@ -51,8 +51,9 @@ if (value instanceof CallTreeModel) { CallTreeModel callTreeModel = (CallTreeModel)value; MethodExecution methodExecution = callTreeModel.getMethodExecution(); + highlight(methodExecution); TracePoint tp = methodExecution.getEntryPoint(); - JavaEditorOperator.openSrcFileOfMethodExecution(methodExecution, -1); + JavaEditorOperator.openSrcFileOfMethodExecution(methodExecution, -1); DeltaMarkerView deltaMarkerView = ((DeltaMarkerView)getOtherView(DeltaMarkerView.ID, subId)); DeltaMarkerManager deltaMarkerManager = deltaMarkerView.getDeltaMarkerManager(); CallStackView callStackView = (CallStackView)getOtherView(CallStackView.ID, null); diff --git a/src/org/ntlab/traceDebugger/DebuggingController.java b/src/org/ntlab/traceDebugger/DebuggingController.java index ce24a7f..46f9009 100644 --- a/src/org/ntlab/traceDebugger/DebuggingController.java +++ b/src/org/ntlab/traceDebugger/DebuggingController.java @@ -36,6 +36,10 @@ this.selectedTraceBreakPoint = tbp; } + public TracePoint getCurrentTp() { + return debuggingTp.duplicate(); + } + public boolean fileOpenAction(Shell shell) { FileDialog fileDialog = new FileDialog(shell, SWT.OPEN); fileDialog.setText("Open Trace File"); diff --git a/src/org/ntlab/traceDebugger/DeltaMarkerView.java b/src/org/ntlab/traceDebugger/DeltaMarkerView.java index 2951ee3..e1e35d4 100644 --- a/src/org/ntlab/traceDebugger/DeltaMarkerView.java +++ b/src/org/ntlab/traceDebugger/DeltaMarkerView.java @@ -23,9 +23,10 @@ import org.eclipse.ui.part.ViewPart; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; +import org.ntlab.traceDebugger.analyzerProvider.AbstractAnalyzer; import org.ntlab.traceDebugger.analyzerProvider.Alias; import org.ntlab.traceDebugger.analyzerProvider.Alias.AliasType; - +import org.ntlab.traceDebugger.analyzerProvider.DeltaExtractionAnalyzer; import org.ntlab.traceDebugger.analyzerProvider.DeltaMarkerManager; public class DeltaMarkerView extends ViewPart { @@ -131,6 +132,10 @@ @Override public void setFocus() { // TODO Auto-generated method stub + AbstractAnalyzer analyzer = TraceDebuggerPlugin.getAnalyzer(); + if (analyzer instanceof DeltaExtractionAnalyzer) { + ((DeltaExtractionAnalyzer)analyzer).setActiveDeltaMarkerView(this); + } viewer.getControl().setFocus(); } diff --git a/src/org/ntlab/traceDebugger/TracePoints.java b/src/org/ntlab/traceDebugger/TracePoints.java new file mode 100644 index 0000000..3014b65 --- /dev/null +++ b/src/org/ntlab/traceDebugger/TracePoints.java @@ -0,0 +1,26 @@ +package org.ntlab.traceDebugger; + +import java.util.ArrayList; +import java.util.List; + +import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; + +public class TracePoints { + List tracePoints = new ArrayList<>(); + + public List getTracePoints() { + return tracePoints; + } + + public TracePoint[] getTracePointsArray() { + return tracePoints.toArray(new TracePoint[tracePoints.size()]); + } + + public void addTracePoints(TracePoint tp) { + tracePoints.add(tp); + } + + public void removeTracePoints(TracePoint tp) { + tracePoints.remove(tp); + } +} diff --git a/src/org/ntlab/traceDebugger/TracePointsLabelProvider.java b/src/org/ntlab/traceDebugger/TracePointsLabelProvider.java new file mode 100644 index 0000000..4d0d377 --- /dev/null +++ b/src/org/ntlab/traceDebugger/TracePointsLabelProvider.java @@ -0,0 +1,35 @@ +package org.ntlab.traceDebugger; + +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.PlatformUI; +import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; + +public class TracePointsLabelProvider extends LabelProvider implements ITableLabelProvider { + + @Override + public String getColumnText(Object element, int columnIndex) { + if (element instanceof TracePoint) { + TracePoint tp = (TracePoint)element; + switch (columnIndex) { + case 0: + return String.valueOf(tp.getStatement().getLineNo()); + case 1: + return tp.getMethodExecution().getSignature(); + } + } + return "�e�X�g�p�e�L�X�g" + columnIndex; + } + + @Override + public Image getColumnImage(Object element, int columnIndex) { + return getImage(element); + } + + @Override + public Image getImage(Object element) { + return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT); + } +} \ No newline at end of file diff --git a/src/org/ntlab/traceDebugger/TracePointsView.java b/src/org/ntlab/traceDebugger/TracePointsView.java new file mode 100644 index 0000000..e315b8d --- /dev/null +++ b/src/org/ntlab/traceDebugger/TracePointsView.java @@ -0,0 +1,185 @@ +package org.ntlab.traceDebugger; + +import java.util.List; +import java.util.Map; + +import org.eclipse.core.resources.IMarker; +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.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.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.ViewPart; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; +import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; +import org.ntlab.traceDebugger.analyzerProvider.AbstractAnalyzer; +import org.ntlab.traceDebugger.analyzerProvider.DeltaExtractionAnalyzer; +import org.ntlab.traceDebugger.analyzerProvider.DeltaMarkerManager; + +public class TracePointsView extends ViewPart { + private TableViewer viewer; + private Shell shell; + private IAction addAction; + private IAction removeAction; + private TracePoints tracePoints = new TracePoints(); + public static final String ID = "org.ntlab.traceDebugger.tracePointsView"; + + public TracePointsView() { + // TODO Auto-generated constructor stub + System.out.println("BreakPointView�N���X���������ꂽ��!"); + } + + @Override + public void createPartControl(Composite parent) { + // TODO Auto-generated method stub + System.out.println("TracePointsView#createPartControl(Composite)���Ă΂ꂽ��!"); + shell = parent.getShell(); + viewer = new TableViewer(parent, SWT.FULL_SELECTION); + Table table = viewer.getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + + // �e�[�u���̃J�������쐬 + String[] tableColumnTexts = {"Line No", "Signature"}; + int[] tableColumnWidth = {80, 1000}; + 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 TracePointsLabelProvider()); + viewer.addSelectionChangedListener(new ISelectionChangedListener() { + @Override + public void selectionChanged(SelectionChangedEvent event) { + IStructuredSelection sel = (IStructuredSelection)event.getSelection(); + Object element = sel.getFirstElement(); + if (element instanceof TracePoint) { + TracePoint tp = (TracePoint)element; + DebuggingController debuggingController = DebuggingController.getInstance(); + debuggingController.jumpToTheTracePoint(tp, false); + MethodExecution currentME = tp.getMethodExecution(); + int lineNo = tp.getStatement().getLineNo(); + JavaEditorOperator.openSrcFileOfMethodExecution(currentME, lineNo); + CallStackView callStackView = ((CallStackView)getOtherView(CallStackView.ID)); + VariableView variableView = ((VariableView)getOtherView(VariableView.ID)); + + AbstractAnalyzer analyzer = TraceDebuggerPlugin.getAnalyzer(); + if (analyzer instanceof DeltaExtractionAnalyzer) { + DeltaMarkerView deltaMarkerView = ((DeltaExtractionAnalyzer)analyzer).getActiveDeltaMarkerView(); + if (deltaMarkerView != null) { + DeltaMarkerManager deltaMarkerManager = deltaMarkerView.getDeltaMarkerManager(); + Map> deltaMarkers = deltaMarkerManager.getMarkers(); + if (deltaMarkers != null) { + variableView.markAndExpandVariablesByDeltaMarkers(deltaMarkers); + } + IMarker coordinatorMarker = deltaMarkerManager.getCoordinatorDeltaMarker(); + MethodExecution coordinatorME = deltaMarkerManager.getMethodExecution(coordinatorMarker); + callStackView.highlight(coordinatorME); + CallTreeView callTreeView = ((CallTreeView)getOtherView(CallTreeView.ID)); + callTreeView.highlight(currentME); + } + } + } + } + }); + + createActions(); + createToolBar(); + createMenuBar(); + createPopupMenu(); + } + + @Override + public void setFocus() { + // TODO Auto-generated method stub + viewer.getControl().setFocus(); + } + + private void createActions() { + addAction = new Action() { + @Override + public void run() { + DebuggingController debuggingController = DebuggingController.getInstance(); + TracePoint currentTp = debuggingController.getCurrentTp(); + addTracePoint(currentTp); +// tracePoints.addTracePoints(currentTp); +// update(); + } + }; + addAction.setText("Add"); + addAction.setToolTipText("Add"); + + removeAction = new Action() { + @Override + public void run() { +// tracePoints.removeTracePoints(tp); + update(); + } + }; + removeAction.setText("Remove"); + removeAction.setToolTipText("Remove"); + } + + private void createToolBar() { + IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager(); + mgr.add(addAction); + } + + private void createMenuBar() { + IMenuManager mgr = getViewSite().getActionBars().getMenuManager(); + mgr.add(addAction); + } + + private void createPopupMenu() { + MenuManager menuMgr = new MenuManager("#PopupMenu"); + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() { + @Override + public void menuAboutToShow(IMenuManager manager) { +// manager.add(addAction); +// manager.add(removeAction); +// manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); + } + }); + Menu menu = menuMgr.createContextMenu(viewer.getControl()); + viewer.getControl().setMenu(menu); + getSite().registerContextMenu(menuMgr, viewer); + } + + public void addTracePoint(TracePoint tp) { + tracePoints.addTracePoints(tp); + update(); + } + + private void update() { + viewer.setInput(tracePoints.getTracePointsArray()); + viewer.refresh(); + } + + private IViewPart getOtherView(String viewId) { + IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + try { + return workbenchPage.showView(viewId); + } catch (PartInitException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/src/org/ntlab/traceDebugger/VariableView.java b/src/org/ntlab/traceDebugger/VariableView.java index 2fa6fa7..a429e27 100644 --- a/src/org/ntlab/traceDebugger/VariableView.java +++ b/src/org/ntlab/traceDebugger/VariableView.java @@ -173,6 +173,8 @@ // callTreeView.highlight(coordinatorME); callTreeView.update(deltaMarkerManager); callTreeView.highlight(coordinatorME); + TracePointsView tracePointsView = (TracePointsView)getOtherView(TracePointsView.ID); + tracePointsView.addTracePoint(coordinatorPoint); } catch (PartInitException e) { e.printStackTrace(); } @@ -228,7 +230,9 @@ if (dstSideDeltaMarkers != null) { markVariables(DeltaMarkerManager.DST_SIDE_DELTA_MARKER, dstSideDeltaMarkers); } - markVariables(DeltaMarkerManager.COORDINATOR_DELTA_MARKER, coordinatorMarker); + if (coordinatorMarker != null) { + markVariables(DeltaMarkerManager.COORDINATOR_DELTA_MARKER, coordinatorMarker); + } viewer.refresh(); expandAllMarkedNodes(); } diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java index 8a951d2..afd9b83 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; +import org.eclipse.ui.IViewPart; import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; import org.ntlab.traceAnalysisPlatform.tracer.trace.Reference; @@ -13,6 +14,7 @@ import org.ntlab.traceAnalysisPlatform.tracer.trace.TraceJSON; import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; import org.ntlab.traceDebugger.DeltaMarkerView; +import org.ntlab.traceDebugger.TraceDebuggerPlugin; import org.ntlab.traceDebugger.Variable; public class DeltaExtractionAnalyzer extends AbstractAnalyzer { @@ -20,6 +22,7 @@ private DeltaExtractorJSON deltaExtractor; private ExtractedStructure extractedStructure; private Map deltaMarkerViews = new HashMap<>(); + private DeltaMarkerView activeDeltaMarkerView; public DeltaExtractionAnalyzer(Trace trace) { super(trace); @@ -27,6 +30,10 @@ reset(); } + /** + * note: �I�����C����͗p + * @return + */ private static DeltaExtractionAnalyzer getInstance() { if (theInstance == null) { theInstance = new DeltaExtractionAnalyzer(TraceJSON.getInstance()); @@ -135,4 +142,12 @@ public String getNextDeltaMarkerSubId() { return String.valueOf(deltaMarkerViews.size() + 1); } + + public DeltaMarkerView getActiveDeltaMarkerView() { + return activeDeltaMarkerView; + } + + public void setActiveDeltaMarkerView(DeltaMarkerView deltaMarkerView) { + this.activeDeltaMarkerView = deltaMarkerView; + } } \ No newline at end of file