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