Bug 569134 - "Toggle Tracepoint" creates usual breakpoints on class
files

Change-Id: I74b6958bdd492a3f3731ea4625e80c0dcaa9df3c
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java
index c4bfc07..1487edb 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ToggleBreakpointAdapter.java
@@ -59,6 +59,7 @@
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.SourceRange;
+import org.eclipse.jdt.core.WorkingCopyOwner;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ClassInstanceCreation;
 import org.eclipse.jdt.core.dom.CompilationUnit;
@@ -86,7 +87,7 @@
 import org.eclipse.jdt.internal.debug.ui.IJDIPreferencesConstants;
 import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
 import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
 import org.eclipse.jdt.internal.ui.text.template.contentassist.TemplateEngine;
 import org.eclipse.jdt.internal.ui.text.template.contentassist.TemplateProposal;
 import org.eclipse.jdt.ui.IWorkingCopyManager;
@@ -309,8 +310,8 @@
 		IResource resource = BreakpointUtils.getBreakpointResource(member);
 		String qualifiedName = getQualifiedName(type);
 		IJavaMethodBreakpoint methodBreakpoint = JDIDebugModel.createMethodBreakpoint(resource, qualifiedName, mname, signature, true, false, false, -1, start, end, 0, true, attributes);
-		if (BreakpointToggleUtils.isToggleTracepoints() && finalSelection instanceof ITextSelection && part instanceof CompilationUnitEditor) {
-			String pattern = getCodeTemplate((ITextSelection) finalSelection, (CompilationUnitEditor) part);
+		if (BreakpointToggleUtils.isToggleTracepoints() && finalSelection instanceof ITextSelection && part instanceof JavaEditor) {
+			String pattern = getCodeTemplate((ITextSelection) finalSelection, (JavaEditor) part);
 			if (pattern != null) {
 				pattern = pattern.trim();
 				pattern = pattern.replaceAll("\\\t", ""); //$NON-NLS-1$//$NON-NLS-2$
@@ -409,8 +410,8 @@
 			}
 			BreakpointUtils.addJavaBreakpointAttributes(attributes, type);
 			IJavaLineBreakpoint breakpoint = JDIDebugModel.createLineBreakpoint(resource, tname, lnumber, charstart, charend, 0, true, attributes);
-			if (BreakpointToggleUtils.isToggleTracepoints() && selection instanceof ITextSelection && part instanceof CompilationUnitEditor) {
-				String pattern = getCodeTemplate((ITextSelection) selection, (CompilationUnitEditor) part);
+			if (BreakpointToggleUtils.isToggleTracepoints() && selection instanceof ITextSelection && part instanceof JavaEditor) {
+				String pattern = getCodeTemplate((ITextSelection) selection, (JavaEditor) part);
 				if (pattern != null) {
 					pattern = pattern.trim();
 					pattern = pattern.replaceAll("\\\t", ""); //$NON-NLS-1$//$NON-NLS-2$
@@ -1585,7 +1586,7 @@
 	 * @return the type root or <code>null</code> if one cannot be derived
 	 * @since 3.8
 	 */
-	private static String getCodeTemplate(ITextSelection textSelection, CompilationUnitEditor part) {
+	private static String getCodeTemplate(ITextSelection textSelection, JavaEditor part) {
 		ITextViewer viewer = part.getViewer();
 		if (viewer == null) {
 			return null;
@@ -1596,22 +1597,21 @@
 		return templateBuffer.get();
 	}
 
-	private static void doGetCodeTemplate(ITextSelection textSelection, CompilationUnitEditor part, ITextViewer viewer, TemplateContextType contextType, AtomicReference<String> templateBuffer) {
+	private static void doGetCodeTemplate(ITextSelection textSelection, JavaEditor part, ITextViewer viewer, TemplateContextType contextType, AtomicReference<String> templateBuffer) {
 		ITextEditor editor = getTextEditor(part);
 		if (editor == null) {
 			return;
 		}
-		TemplateEngine statementEngine = new TemplateEngine(contextType);
-		statementEngine.reset();
-		IJavaElement element = getJavaElement(editor.getEditorInput());
-		ICompilationUnit cunit = null;
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		IFile file = root.getFile(element.getPath());
-		cunit = JavaCore.createCompilationUnitFrom(file);
 		IDocumentProvider documentProvider = editor.getDocumentProvider();
 		if (documentProvider == null) {
 			return;
 		}
+		ICompilationUnit cunit = getCompilationUnit(editor);
+		if (cunit == null) {
+			return;
+		}
+		TemplateEngine statementEngine = new TemplateEngine(contextType);
+		statementEngine.reset();
 		IDocument document = documentProvider.getDocument(editor.getEditorInput());
 		try {
 			IRegion line = document.getLineInformation(textSelection.getStartLine() + 1);
@@ -1636,4 +1636,22 @@
 		}
 	}
 
+	private static ICompilationUnit getCompilationUnit(ITextEditor editor) {
+		IJavaElement element = getJavaElement(editor.getEditorInput());
+		if (element == null) {
+			return null;
+		}
+		if (element instanceof IOrdinaryClassFile) {
+			try {
+				return ((IOrdinaryClassFile) element).getWorkingCopy(new WorkingCopyOwner() {}, null);
+			} catch (JavaModelException e) {
+				// ignore
+				return null;
+			}
+		}
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IFile file = root.getFile(element.getPath());
+		return JavaCore.createCompilationUnitFrom(file);
+	}
+
 }