Lines 1-5
Link Here
|
1 |
/******************************************************************************* |
1 |
/******************************************************************************* |
2 |
* Copyright (c) 2000, 2008 IBM Corporation and others. |
2 |
* Copyright (c) 2000, 2009 IBM Corporation and others. |
3 |
* All rights reserved. This program and the accompanying materials |
3 |
* All rights reserved. This program and the accompanying materials |
4 |
* are made available under the terms of the Eclipse Public License v1.0 |
4 |
* are made available under the terms of the Eclipse Public License v1.0 |
5 |
* which accompanies this distribution, and is available at |
5 |
* which accompanies this distribution, and is available at |
Lines 10-18
Link Here
|
10 |
*******************************************************************************/ |
10 |
*******************************************************************************/ |
11 |
package org.eclipse.jdt.internal.ui.compare; |
11 |
package org.eclipse.jdt.internal.ui.compare; |
12 |
|
12 |
|
|
|
13 |
import java.util.HashSet; |
13 |
import java.util.Map; |
14 |
import java.util.Map; |
14 |
import java.util.ResourceBundle; |
15 |
import java.util.ResourceBundle; |
|
|
16 |
import java.util.Set; |
15 |
|
17 |
|
|
|
18 |
import org.eclipse.swt.events.DisposeEvent; |
16 |
import org.eclipse.swt.widgets.Composite; |
19 |
import org.eclipse.swt.widgets.Composite; |
17 |
import org.eclipse.swt.widgets.Control; |
20 |
import org.eclipse.swt.widgets.Control; |
18 |
import org.eclipse.swt.widgets.ToolBar; |
21 |
import org.eclipse.swt.widgets.ToolBar; |
Lines 29-34
Link Here
|
29 |
|
32 |
|
30 |
import org.eclipse.compare.CompareConfiguration; |
33 |
import org.eclipse.compare.CompareConfiguration; |
31 |
import org.eclipse.compare.CompareViewerPane; |
34 |
import org.eclipse.compare.CompareViewerPane; |
|
|
35 |
import org.eclipse.compare.IContentChangeNotifier; |
32 |
import org.eclipse.compare.IResourceProvider; |
36 |
import org.eclipse.compare.IResourceProvider; |
33 |
import org.eclipse.compare.ITypedElement; |
37 |
import org.eclipse.compare.ITypedElement; |
34 |
import org.eclipse.compare.structuremergeviewer.DiffNode; |
38 |
import org.eclipse.compare.structuremergeviewer.DiffNode; |
Lines 37-48
Link Here
|
37 |
import org.eclipse.compare.structuremergeviewer.IDiffContainer; |
41 |
import org.eclipse.compare.structuremergeviewer.IDiffContainer; |
38 |
import org.eclipse.compare.structuremergeviewer.StructureDiffViewer; |
42 |
import org.eclipse.compare.structuremergeviewer.StructureDiffViewer; |
39 |
|
43 |
|
|
|
44 |
import org.eclipse.jdt.core.ElementChangedEvent; |
45 |
import org.eclipse.jdt.core.ICompilationUnit; |
46 |
import org.eclipse.jdt.core.IElementChangedListener; |
40 |
import org.eclipse.jdt.core.IJavaElement; |
47 |
import org.eclipse.jdt.core.IJavaElement; |
|
|
48 |
import org.eclipse.jdt.core.IJavaElementDelta; |
41 |
import org.eclipse.jdt.core.IJavaProject; |
49 |
import org.eclipse.jdt.core.IJavaProject; |
42 |
import org.eclipse.jdt.core.JavaCore; |
50 |
import org.eclipse.jdt.core.JavaCore; |
43 |
|
51 |
|
|
|
52 |
import org.eclipse.jdt.internal.corext.util.JavaModelUtil; |
53 |
|
44 |
// XXX: StructuredDiffViewer should allow subclassing, see: https://bugs.eclipse.org/bugs/show_bug.cgi?id=258907 |
54 |
// XXX: StructuredDiffViewer should allow subclassing, see: https://bugs.eclipse.org/bugs/show_bug.cgi?id=258907 |
45 |
class JavaStructureDiffViewer extends StructureDiffViewer { |
55 |
class JavaStructureDiffViewer extends StructureDiffViewer implements IElementChangedListener { |
46 |
|
56 |
|
47 |
/** |
57 |
/** |
48 |
* Toggles a boolean property of an <code>CompareConfiguration</code>. |
58 |
* Toggles a boolean property of an <code>CompareConfiguration</code>. |
Lines 91-96
Link Here
|
91 |
super(parent, configuration); |
101 |
super(parent, configuration); |
92 |
fStructureCreator= new JavaStructureCreator(); |
102 |
fStructureCreator= new JavaStructureCreator(); |
93 |
setStructureCreator(fStructureCreator); |
103 |
setStructureCreator(fStructureCreator); |
|
|
104 |
JavaCore.addElementChangedListener(this); |
94 |
} |
105 |
} |
95 |
|
106 |
|
96 |
/** |
107 |
/** |
Lines 150-164
Link Here
|
150 |
} |
161 |
} |
151 |
|
162 |
|
152 |
private Map getCompilerOptions(ITypedElement input) { |
163 |
private Map getCompilerOptions(ITypedElement input) { |
153 |
if (input instanceof IResourceProvider) { |
164 |
IJavaElement element= findJavaElement(input); |
154 |
IResource resource= ((IResourceProvider) input).getResource(); |
165 |
if (element != null) { |
|
|
166 |
IJavaProject javaProject= element.getJavaProject(); |
167 |
if (javaProject != null) |
168 |
return javaProject.getOptions(true); |
169 |
} |
170 |
return null; |
171 |
} |
172 |
|
173 |
/* |
174 |
* @see org.eclipse.compare.structuremergeviewer.StructureDiffViewer#handleDispose(org.eclipse.swt.events.DisposeEvent) |
175 |
* @since 3.5 |
176 |
*/ |
177 |
protected void handleDispose(DisposeEvent event) { |
178 |
JavaCore.removeElementChangedListener(this); |
179 |
super.handleDispose(event); |
180 |
} |
181 |
|
182 |
private IJavaElement findJavaElement(ITypedElement element) { |
183 |
if (element instanceof IResourceProvider) { |
184 |
IResource resource= ((IResourceProvider)element).getResource(); |
155 |
if (resource != null) { |
185 |
if (resource != null) { |
156 |
IJavaElement element= JavaCore.create(resource); |
186 |
return JavaCore.create(resource); |
157 |
if (element != null) { |
|
|
158 |
IJavaProject javaProject= element.getJavaProject(); |
159 |
if (javaProject != null) |
160 |
return javaProject.getOptions(true); |
161 |
} |
162 |
} |
187 |
} |
163 |
} |
188 |
} |
164 |
return null; |
189 |
return null; |
Lines 191-199
Link Here
|
191 |
} |
216 |
} |
192 |
|
217 |
|
193 |
/** |
218 |
/** |
194 |
* Tracks property changes of the configuration object. |
219 |
* Tracks property changes of the configuration object. Clients may override to track their own |
195 |
* Clients may override to track their own property changes. |
220 |
* property changes. In this case they must call the inherited method. |
196 |
* In this case they must call the inherited method. |
221 |
* |
|
|
222 |
* @param event the property change event |
197 |
*/ |
223 |
*/ |
198 |
protected void propertyChange(PropertyChangeEvent event) { |
224 |
protected void propertyChange(PropertyChangeEvent event) { |
199 |
if (event.getProperty().equals(SMART)) |
225 |
if (event.getProperty().equals(SMART)) |
Lines 218-221
Link Here
|
218 |
tb.getParent().layout(true); |
244 |
tb.getParent().layout(true); |
219 |
} |
245 |
} |
220 |
} |
246 |
} |
221 |
} |
247 |
|
|
|
248 |
/* |
249 |
* @see org.eclipse.jdt.core.IElementChangedListener#elementChanged(org.eclipse.jdt.core.ElementChangedEvent) |
250 |
* @since 3.5 |
251 |
*/ |
252 |
public void elementChanged(ElementChangedEvent event) { |
253 |
ITypedElement[] elements= findAffectedElement(event); |
254 |
for (int i= 0; i < elements.length; i++) { |
255 |
ITypedElement e= elements[i]; |
256 |
if (e == null || !(e instanceof IContentChangeNotifier)) |
257 |
continue; |
258 |
contentChanged((IContentChangeNotifier)e); |
259 |
} |
260 |
} |
261 |
|
262 |
/** |
263 |
* Tells which elements of the comparison are affected by the change. |
264 |
* |
265 |
* @param event element changed event |
266 |
* @return array of typed elements affected by the event. May return an empty array. |
267 |
* @since 3.5 |
268 |
*/ |
269 |
private ITypedElement[] findAffectedElement(ElementChangedEvent event) { |
270 |
Object input= getInput(); |
271 |
if (!(input instanceof ICompareInput)) |
272 |
return new ITypedElement[0]; |
273 |
|
274 |
Set affectedElements= new HashSet(); |
275 |
ICompareInput ci= (ICompareInput)input; |
276 |
IJavaElementDelta delta= event.getDelta(); |
277 |
addAffectedElement(ci.getAncestor(), delta, affectedElements); |
278 |
addAffectedElement(ci.getLeft(), delta, affectedElements); |
279 |
addAffectedElement(ci.getRight(), delta, affectedElements); |
280 |
|
281 |
return (ITypedElement[])affectedElements.toArray(new ITypedElement[affectedElements.size()]); |
282 |
} |
283 |
|
284 |
/** |
285 |
* Tests whether the given element is affected by the change and if so, adds it to given set. |
286 |
* |
287 |
* @param element the element to test |
288 |
* @param delta the Java element delta |
289 |
* @param affectedElements the set of affected elements |
290 |
* @since 3.5 |
291 |
*/ |
292 |
private void addAffectedElement(ITypedElement element, IJavaElementDelta delta, Set affectedElements) { |
293 |
IJavaElement javaElement= findJavaElement(element); |
294 |
if (isEditable(javaElement) && findJavaElementDelta(javaElement, delta) != null) |
295 |
affectedElements.add(element); |
296 |
} |
297 |
|
298 |
/** |
299 |
* Tells whether the given Java element can be edited. |
300 |
* |
301 |
* @param javaElement the element to test |
302 |
* @return <code>true</code> if the element can be edited, <code>false</code> otherwise |
303 |
* @since 3.5 |
304 |
*/ |
305 |
private boolean isEditable(IJavaElement javaElement) { |
306 |
return (javaElement instanceof ICompilationUnit) && JavaModelUtil.isEditable((ICompilationUnit)javaElement); |
307 |
} |
308 |
|
309 |
/* |
310 |
* This is a copy of the internal JavaOutlinePage.ElementChangedListener#isPossibleStructuralChange method. |
311 |
* @see org.eclipse.jdt.internal.ui.javaeditor.JavaOutlinePage.ElementChangedListener#isPossibleStructuralChange(IJavaElementDelta) |
312 |
* @since 3.5 |
313 |
*/ |
314 |
private boolean isPossibleStructuralChange(IJavaElementDelta cuDelta) { |
315 |
if (cuDelta.getKind() != IJavaElementDelta.CHANGED) { |
316 |
return true; // add or remove |
317 |
} |
318 |
int flags= cuDelta.getFlags(); |
319 |
if ((flags & IJavaElementDelta.F_CHILDREN) != 0) { |
320 |
return true; |
321 |
} |
322 |
return (flags & (IJavaElementDelta.F_CONTENT | IJavaElementDelta.F_FINE_GRAINED)) == IJavaElementDelta.F_CONTENT; |
323 |
} |
324 |
|
325 |
/* |
326 |
* This is a copy of the internal JavaOutlinePage.ElementChangedListener#findElement method. |
327 |
* @see org.eclipse.jdt.internal.ui.javaeditor.JavaOutlinePage.ElementChangedListener#findElement(IJavaElement, IJavaElementDelta) |
328 |
* @since 3.5 |
329 |
*/ |
330 |
protected IJavaElementDelta findJavaElementDelta(IJavaElement unit, IJavaElementDelta delta) { |
331 |
|
332 |
if (delta == null || unit == null) |
333 |
return null; |
334 |
|
335 |
IJavaElement element= delta.getElement(); |
336 |
|
337 |
if (unit.equals(element)) { |
338 |
if (isPossibleStructuralChange(delta)) { |
339 |
return delta; |
340 |
} |
341 |
return null; |
342 |
} |
343 |
|
344 |
|
345 |
if (element.getElementType() > IJavaElement.CLASS_FILE) |
346 |
return null; |
347 |
|
348 |
IJavaElementDelta[] children= delta.getAffectedChildren(); |
349 |
if (children == null || children.length == 0) |
350 |
return null; |
351 |
|
352 |
for (int i= 0; i < children.length; i++) { |
353 |
IJavaElementDelta d= findJavaElementDelta(unit, children[i]); |
354 |
if (d != null) |
355 |
return d; |
356 |
} |
357 |
|
358 |
return null; |
359 |
} |
360 |
} |