diff --git a/plugin.xml b/plugin.xml index f170f3b..dfc8153 100644 --- a/plugin.xml +++ b/plugin.xml @@ -111,6 +111,17 @@ + + + + + + + + @@ -159,6 +174,12 @@ name="org.ntlab.traceDebugger.dstSideDeltaAnnotation" super="org.eclipse.ui.workbench.texteditor.info"> + + @@ -234,6 +255,23 @@ verticalRulerPreferenceKey="clvertical4" verticalRulerPreferenceValue="true"> + + diff --git a/src/org/ntlab/traceDebugger/BreakPointView.java b/src/org/ntlab/traceDebugger/BreakPointView.java index 375fccd..d5787bc 100644 --- a/src/org/ntlab/traceDebugger/BreakPointView.java +++ b/src/org/ntlab/traceDebugger/BreakPointView.java @@ -1,5 +1,6 @@ package org.ntlab.traceDebugger; +import org.eclipse.core.resources.IMarker; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuListener; @@ -84,7 +85,9 @@ // �I������TraceBreakPoint�̏ꏊ���J���Ĕ��]�\������ (������������?) MethodExecution methodExecution = tbp.getMethodExecutions().iterator().next(); int highlightLineNo = tbp.getLineNo(); - JavaEditorOperator.openSrcFileOfMethodExecution(methodExecution, highlightLineNo); +// JavaEditorOperator.openSrcFileOfMethodExecution(methodExecution, highlightLineNo); + IMarker marker = DebuggingController.getInstance().createCurrentLineMarker(methodExecution, highlightLineNo); + JavaEditorOperator.markAndOpenJavaFile(marker); } } }); diff --git a/src/org/ntlab/traceDebugger/CallStackView.java b/src/org/ntlab/traceDebugger/CallStackView.java index 1febba0..d4cdf64 100644 --- a/src/org/ntlab/traceDebugger/CallStackView.java +++ b/src/org/ntlab/traceDebugger/CallStackView.java @@ -65,7 +65,10 @@ selectionCallStackModel = callStackModel; MethodExecution methodExecution = callStackModel.getMethodExecution(); TracePoint tp = callStackModel.getTracePoint(); - JavaEditorOperator.openSrcFileOfMethodExecution(methodExecution, callStackModel.getCallLineNo()); +// JavaEditorOperator.openSrcFileOfMethodExecution(methodExecution, callStackModel.getCallLineNo()); + IMarker marker = DebuggingController.getInstance().createCurrentLineMarker(methodExecution, callStackModel.getCallLineNo()); + JavaEditorOperator.markAndOpenJavaFile(marker); + CallTreeView callTreeView = (CallTreeView)TraceDebuggerPlugin.getActiveView(CallTreeView.ID); callTreeView.highlight(methodExecution); @@ -76,9 +79,11 @@ DeltaMarkerView deltaMarkerView = (DeltaMarkerView)TraceDebuggerPlugin.getActiveView(DeltaMarkerView.ID); if (deltaMarkerView != null) { DeltaMarkerManager deltaMarkerManager = deltaMarkerView.getDeltaMarkerManager(); - Map> deltaMarkers = deltaMarkerManager.getMarkers(); - if (deltaMarkers != null) { - variableView.markAndExpandVariablesByDeltaMarkers(deltaMarkers); + if (deltaMarkerManager != null) { + Map> deltaMarkers = deltaMarkerManager.getMarkers(); + if (deltaMarkers != null) { + variableView.markAndExpandVariablesByDeltaMarkers(deltaMarkers); + } } } } diff --git a/src/org/ntlab/traceDebugger/DebuggingController.java b/src/org/ntlab/traceDebugger/DebuggingController.java index 1879b4e..3a56beb 100644 --- a/src/org/ntlab/traceDebugger/DebuggingController.java +++ b/src/org/ntlab/traceDebugger/DebuggingController.java @@ -1,7 +1,21 @@ package org.ntlab.traceDebugger; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.filebuffers.FileBuffers; +import org.eclipse.core.filebuffers.ITextFileBuffer; +import org.eclipse.core.filebuffers.ITextFileBufferManager; +import org.eclipse.core.filebuffers.LocationKind; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; @@ -24,6 +38,8 @@ private TracePoint debuggingTp; private TraceBreakPoint selectedTraceBreakPoint; private TraceBreakPoints traceBreakPoints = new TraceBreakPoints(); + private IMarker currentLineMarker; + public static final String CURRENT_MARKER_ID = "org.ntlab.traceDebugger.currentMarker"; private DebuggingController() { @@ -122,6 +138,13 @@ public void terminateAction() { debuggingTp = null; + if (currentLineMarker != null) { + try { + currentLineMarker.delete(); + } catch (CoreException e) { + e.printStackTrace(); + } + } ((CallStackView)getOtherView(CallStackView.ID)).reset(); ((VariableView)getOtherView(VariableView.ID)).reset(); } @@ -168,13 +191,13 @@ } } while (debuggingTp.stepFull()); - if (debuggingTp.getStatement() instanceof BlockEnter) { - debuggingTp.stepFull(); - } if (!debuggingTp.isValid()) { terminateAction(); MessageDialog.openInformation(null, "Terminate", "This trace is terminated"); return false; + } + if (debuggingTp.getStatement() instanceof BlockEnter) { + debuggingTp.stepFull(); } refresh(previousTp, debuggingTp, isReturned, true); return true; @@ -211,14 +234,14 @@ Variables.getInstance().addDifferentialUpdatePoint(debuggingTp); } } while (debuggingTp.stepFull()); - - if (debuggingTp.getStatement() instanceof BlockEnter) { - debuggingTp.stepFull(); - } + if (!debuggingTp.isValid()) { terminateAction(); MessageDialog.openInformation(null, "Terminate", "This trace is terminated"); return false; + } + if (debuggingTp.getStatement() instanceof BlockEnter) { + debuggingTp.stepFull(); } boolean isReturned = false; refresh(previousTp, debuggingTp, isReturned, true); @@ -318,7 +341,9 @@ private void refresh(TracePoint from, TracePoint to, boolean isReturned, boolean canDifferentialUpdateVariables) { MethodExecution me = to.getMethodExecution(); int lineNo = to.getStatement().getLineNo(); - JavaEditorOperator.openSrcFileOfMethodExecution(me, lineNo); +// JavaEditorOperator.openSrcFileOfMethodExecution(me, lineNo); + IMarker marker = createCurrentLineMarker(me, lineNo); + JavaEditorOperator.markAndOpenJavaFile(marker); CallStackView callStackView = ((CallStackView)getOtherView(CallStackView.ID)); callStackView.updateByTracePoint(to); VariableView variableView = ((VariableView)getOtherView(VariableView.ID)); @@ -330,6 +355,35 @@ } } + public IMarker createCurrentLineMarker(MethodExecution methodExecution, int highlightLineNo) { + IFile file = JavaElementFinder.findIFile(methodExecution); + try { +// file.deleteMarkers(CURRENT_MARKER_ID, false, IResource.DEPTH_ZERO); + if (currentLineMarker != null) currentLineMarker.delete(); + currentLineMarker = file.createMarker(CURRENT_MARKER_ID); + Map attributes = new HashMap<>(); + attributes.put(IMarker.TRANSIENT, true); + attributes.put(IMarker.LINE_NUMBER, highlightLineNo); + + IPath path = file.getFullPath(); + ITextFileBufferManager manager = FileBuffers.getTextFileBufferManager(); + manager.connect(path, LocationKind.IFILE, null); + ITextFileBuffer buffer = manager.getTextFileBuffer(path, LocationKind.IFILE); + IDocument document = buffer.getDocument(); + try { + IRegion region = document.getLineInformation(highlightLineNo - 1); + attributes.put(IMarker.CHAR_START, region.getOffset()); + attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); + } catch (BadLocationException e) { + e.printStackTrace(); + } + currentLineMarker.setAttributes(attributes); + } catch (CoreException e) { + e.printStackTrace(); + } + return currentLineMarker; + } + private IViewPart getOtherView(String viewId) { IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); try { diff --git a/src/org/ntlab/traceDebugger/TracePointsView.java b/src/org/ntlab/traceDebugger/TracePointsView.java index 7933aba..7ac112a 100644 --- a/src/org/ntlab/traceDebugger/TracePointsView.java +++ b/src/org/ntlab/traceDebugger/TracePointsView.java @@ -75,7 +75,9 @@ selectedTp = (TracePoint)element; MethodExecution me = selectedTp.getMethodExecution(); int lineNo = selectedTp.getStatement().getLineNo(); - JavaEditorOperator.openSrcFileOfMethodExecution(me, lineNo); +// JavaEditorOperator.openSrcFileOfMethodExecution(me, lineNo); + IMarker marker = DebuggingController.getInstance().createCurrentLineMarker(me, lineNo); + JavaEditorOperator.markAndOpenJavaFile(marker); } } }); @@ -186,7 +188,10 @@ debuggingController.jumpToTheTracePoint(tp, false); MethodExecution currentME = tp.getMethodExecution(); int lineNo = tp.getStatement().getLineNo(); - JavaEditorOperator.openSrcFileOfMethodExecution(currentME, lineNo); +// JavaEditorOperator.openSrcFileOfMethodExecution(currentME, lineNo); + IMarker marker = DebuggingController.getInstance().createCurrentLineMarker(currentME, lineNo); + JavaEditorOperator.markAndOpenJavaFile(marker); + CallStackView callStackView = ((CallStackView)TraceDebuggerPlugin.getActiveView(CallStackView.ID)); VariableView variableView = ((VariableView)TraceDebuggerPlugin.getActiveView(VariableView.ID)); diff --git a/src/org/ntlab/traceDebugger/VariableView.java b/src/org/ntlab/traceDebugger/VariableView.java index 01755e2..63a9189 100644 --- a/src/org/ntlab/traceDebugger/VariableView.java +++ b/src/org/ntlab/traceDebugger/VariableView.java @@ -215,9 +215,10 @@ updateDeltaActionsTexts(selectedVariable); if (selectedVariable.getVariableName().equals(Variables.RETURN_VARIABLE_NAME)) { manager.add(deltaActionForContainerToComponent); - manager.add(deltaActionForThisToAnother); + manager.add(deltaActionForThisToAnother); } else { manager.add(deltaAction); +// manager.add(deltaActionForCollection); } // manager.add(deltaActionForCollection); manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); @@ -241,20 +242,27 @@ String containerId = selectedVariable.getContainerId(); String containerClassName = selectedVariable.getContainerClassName(); - containerClassName = containerClassName.substring(containerClassName.lastIndexOf(".") + 1); - String textForContainerToComponent = String.format("Extract Delta (%s: %s �� %s: %s)", containerId, containerClassName, valueId, valueClassName); - deltaActionForContainerToComponent.setText(textForContainerToComponent); - deltaActionForContainerToComponent.setToolTipText(textForContainerToComponent); - deltaAction.setText(textForContainerToComponent); - deltaAction.setToolTipText(textForContainerToComponent); - + if (containerId != null && containerClassName != null) { + containerClassName = containerClassName.substring(containerClassName.lastIndexOf(".") + 1); + String textForContainerToComponent = String.format("Extract Delta (%s: %s �� %s: %s)", containerId, containerClassName, valueId, valueClassName); + deltaActionForContainerToComponent.setText(textForContainerToComponent); + deltaActionForContainerToComponent.setToolTipText(textForContainerToComponent); + deltaAction.setText(textForContainerToComponent); + deltaAction.setToolTipText(textForContainerToComponent); + } else { + deltaAction.setText("Extract Delta"); + deltaAction.setToolTipText("Extract Delta"); + } + TracePoint before = selectedVariable.getBeforeTracePoint(); String thisId = before.getMethodExecution().getThisObjId(); String thisClassName = before.getMethodExecution().getThisClassName(); - thisClassName = thisClassName.substring(thisClassName.lastIndexOf(".") + 1); - String textForThisToAnother = String.format("Extract Delta (%s: %s �� %s: %s)", thisId, thisClassName, valueId, valueClassName); - deltaActionForThisToAnother.setText(textForThisToAnother); - deltaActionForThisToAnother.setToolTipText(textForThisToAnother); + if (thisId != null && thisClassName != null) { + thisClassName = thisClassName.substring(thisClassName.lastIndexOf(".") + 1); + String textForThisToAnother = String.format("Extract Delta (%s: %s �� %s: %s)", thisId, thisClassName, valueId, valueClassName); + deltaActionForThisToAnother.setText(textForThisToAnother); + deltaActionForThisToAnother.setToolTipText(textForThisToAnother); + } } public void updateVariablesByTracePoint(TracePoint tp, boolean isReturned) {