View | Details | Raw Unified | Return to bug 165434 | Differences between
and this patch

Collapse All | Expand All

(-)ui/org/eclipse/jdt/internal/ui/compare/JavaStructureDiffViewer.java (-14 / +153 lines)
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
}

Return to bug 165434