1 /******************************************************************************* 2 * Copyright (c) 2000, 2015 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 *******************************************************************************/ 14 package org.eclipse.jdt.internal.debug.ui.actions; 15 16 17 import org.eclipse.jdt.core.IClassFile; 18 import org.eclipse.jdt.core.ICompilationUnit; 19 import org.eclipse.jdt.core.IJavaElement; 20 import org.eclipse.jdt.core.IMember; 21 import org.eclipse.jdt.core.JavaModelException; 22 import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin; 23 import org.eclipse.jdt.internal.debug.ui.snippeteditor.JavaSnippetEditor; 24 import org.eclipse.jdt.ui.IWorkingCopyManager; 25 import org.eclipse.jdt.ui.JavaUI; 26 import org.eclipse.jface.text.ITextSelection; 27 import org.eclipse.jface.viewers.ISelection; 28 import org.eclipse.ui.IEditorInput; 29 import org.eclipse.ui.IEditorPart; 30 import org.eclipse.ui.IPartListener; 31 import org.eclipse.ui.IWindowListener; 32 import org.eclipse.ui.IWorkbenchPage; 33 import org.eclipse.ui.IWorkbenchPart; 34 import org.eclipse.ui.IWorkbenchWindow; 35 import org.eclipse.ui.texteditor.ITextEditor; 36 37 public class ActionDelegateHelper implements IPartListener, IWindowListener { 38 39 private static ActionDelegateHelper fgDefault; 40 private IMember fMember= null; 41 private ITextEditor fTextEditor= null; 42 private ISelection fCurrentSelection= null; 43 private IWorkbenchWindow fCurrentWindow= null; 44 getDefault()45 public static ActionDelegateHelper getDefault() { 46 if (fgDefault == null) { 47 fgDefault= new ActionDelegateHelper(); 48 } 49 return fgDefault; 50 } 51 ActionDelegateHelper()52 private ActionDelegateHelper() { 53 fCurrentWindow= JDIDebugUIPlugin.getActiveWorkbenchWindow(); 54 if (fCurrentWindow != null) { 55 fCurrentWindow.getWorkbench().addWindowListener(this); 56 fCurrentWindow.getPartService().addPartListener(this); 57 IWorkbenchPage page= fCurrentWindow.getActivePage(); 58 if (page != null) { 59 IEditorPart part= page.getActiveEditor(); 60 checkToSetTextEditor(part); 61 } 62 } 63 } 64 65 /** 66 * @see IPartListener#partActivated(IWorkbenchPart) 67 */ 68 @Override partActivated(IWorkbenchPart part)69 public void partActivated(IWorkbenchPart part) { 70 checkToSetTextEditor(part); 71 } 72 73 /** 74 * @see IPartListener#partBroughtToTop(IWorkbenchPart) 75 */ 76 @Override partBroughtToTop(IWorkbenchPart part)77 public void partBroughtToTop(IWorkbenchPart part) { 78 } 79 80 /** 81 * @see IPartListener#partClosed(IWorkbenchPart) 82 */ 83 @Override partClosed(IWorkbenchPart part)84 public void partClosed(IWorkbenchPart part) { 85 if (part == getTextEditor()) { 86 cleanup(); 87 } 88 } 89 90 /** 91 * @see IPartListener#partDeactivated(IWorkbenchPart) 92 */ 93 @Override partDeactivated(IWorkbenchPart part)94 public void partDeactivated(IWorkbenchPart part) { 95 } 96 97 /** 98 * @see IPartListener#partOpened(IWorkbenchPart) 99 */ 100 @Override partOpened(IWorkbenchPart part)101 public void partOpened(IWorkbenchPart part) { 102 } 103 getMember()104 protected IMember getMember() { 105 return fMember; 106 } 107 setMember(IMember member)108 protected void setMember(IMember member) { 109 fMember = member; 110 } 111 checkToSetTextEditor(IWorkbenchPart part)112 protected void checkToSetTextEditor(IWorkbenchPart part) { 113 if (part instanceof ITextEditor) { 114 if (part instanceof JavaSnippetEditor) { 115 cleanup(); 116 } else { 117 setTextEditor((ITextEditor)part); 118 } 119 } 120 } 121 getCurrentMember(ITextSelection currentSelection)122 public IMember getCurrentMember(ITextSelection currentSelection) { 123 if (currentSelection == getCurrentSelection()) { 124 return getMember(); 125 } 126 setCurrentSelection(currentSelection); 127 ITextEditor editor= getTextEditor(); 128 if (editor == null) { 129 return null; 130 } 131 IEditorInput editorInput= editor.getEditorInput(); 132 IMember m= null; 133 try { 134 IClassFile classFile = editorInput.getAdapter(IClassFile.class); 135 if (classFile != null) { 136 IJavaElement e= classFile.getElementAt(currentSelection.getOffset()); 137 if (e instanceof IMember) { 138 m= (IMember)e; 139 } 140 } else { 141 IWorkingCopyManager manager= JavaUI.getWorkingCopyManager(); 142 ICompilationUnit unit= manager.getWorkingCopy(editorInput); 143 if (unit != null) { 144 synchronized (unit) { 145 unit.reconcile(ICompilationUnit.NO_AST /*don't create ast*/, false/*don't force problem detection*/, null/*use primary owner*/, null/*no progress monitor*/); 146 } 147 IJavaElement e = unit.getElementAt(currentSelection.getOffset()); 148 if (e instanceof IMember) { 149 m= (IMember)e; 150 } 151 } 152 } 153 154 } catch (JavaModelException jme) { 155 JDIDebugUIPlugin.log(jme); 156 } 157 158 setMember(m); 159 return m; 160 } 161 getTextEditor()162 protected ITextEditor getTextEditor() { 163 return fTextEditor; 164 } 165 setTextEditor(ITextEditor textEditor)166 protected void setTextEditor(ITextEditor textEditor) { 167 fTextEditor = textEditor; 168 } 169 getCurrentSelection()170 protected ISelection getCurrentSelection() { 171 return fCurrentSelection; 172 } 173 setCurrentSelection(ISelection currentSelection)174 protected void setCurrentSelection(ISelection currentSelection) { 175 fCurrentSelection = currentSelection; 176 } 177 178 /** 179 * @see IWindowListener#windowActivated(IWorkbenchWindow) 180 */ 181 @Override windowActivated(IWorkbenchWindow window)182 public void windowActivated(IWorkbenchWindow window) { 183 if (fCurrentWindow != null) { 184 fCurrentWindow.getPartService().removePartListener(this); 185 cleanup(); 186 } 187 fCurrentWindow= window; 188 fCurrentWindow.getPartService().addPartListener(this); 189 IWorkbenchPage page= window.getActivePage(); 190 if (page != null) { 191 checkToSetTextEditor(page.getActiveEditor()); 192 } 193 } 194 195 /** 196 * @see IWindowListener#windowClosed(IWorkbenchWindow) 197 */ 198 @Override windowClosed(IWorkbenchWindow window)199 public void windowClosed(IWorkbenchWindow window) { 200 if (fCurrentWindow == window) { 201 fCurrentWindow= null; 202 cleanup(); 203 } 204 } 205 206 /** 207 * @see IWindowListener#windowDeactivated(IWorkbenchWindow) 208 */ 209 @Override windowDeactivated(IWorkbenchWindow window)210 public void windowDeactivated(IWorkbenchWindow window) { 211 } 212 213 /** 214 * @see IWindowListener#windowOpened(IWorkbenchWindow) 215 */ 216 @Override windowOpened(IWorkbenchWindow window)217 public void windowOpened(IWorkbenchWindow window) { 218 } 219 cleanup()220 protected void cleanup() { 221 setTextEditor(null); 222 setCurrentSelection(null); 223 setMember(null); 224 } 225 } 226