Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 123978
Collapse All | Expand All

(-)ui/org/eclipse/jdt/internal/ui/packageview/WorkingSetAwareContentProvider.java (+2 lines)
Lines 220-225 Link Here
220
			toRefresh.add(newValue);
220
			toRefresh.add(newValue);
221
		} else if (IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE.equals(property)) {
221
		} else if (IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE.equals(property)) {
222
			toRefresh.add(newValue);
222
			toRefresh.add(newValue);
223
		} else if (WorkingSetModel.CHANGE_WORKING_SET_TEAM_DECORATION.equals(property)) {
224
			toRefresh.add(newValue);
223
		}
225
		}
224
		postRefresh(toRefresh, true);
226
		postRefresh(toRefresh, true);
225
	}
227
	}
(-)ui/org/eclipse/jdt/internal/ui/workingsets/WorkingSetModel.java (-1 / +129 lines)
Lines 19-28 Link Here
19
import java.util.List;
19
import java.util.List;
20
import java.util.Map;
20
import java.util.Map;
21
21
22
import org.eclipse.core.runtime.CoreException;
22
import org.eclipse.core.runtime.IAdaptable;
23
import org.eclipse.core.runtime.IAdaptable;
23
import org.eclipse.core.runtime.ListenerList;
24
import org.eclipse.core.runtime.ListenerList;
24
25
25
import org.eclipse.core.resources.IResource;
26
import org.eclipse.core.resources.IResource;
27
import org.eclipse.core.resources.IResourceChangeEvent;
28
import org.eclipse.core.resources.IResourceChangeListener;
29
import org.eclipse.core.resources.IResourceDelta;
30
import org.eclipse.core.resources.ResourcesPlugin;
26
31
27
import org.eclipse.jface.util.IPropertyChangeListener;
32
import org.eclipse.jface.util.IPropertyChangeListener;
28
import org.eclipse.jface.util.PropertyChangeEvent;
33
import org.eclipse.jface.util.PropertyChangeEvent;
Lines 35-45 Link Here
35
import org.eclipse.ui.IWorkingSetUpdater;
40
import org.eclipse.ui.IWorkingSetUpdater;
36
import org.eclipse.ui.PlatformUI;
41
import org.eclipse.ui.PlatformUI;
37
42
43
import org.eclipse.team.ui.mapping.ITeamStateChangeEvent;
44
import org.eclipse.team.ui.mapping.ITeamStateChangeListener;
45
import org.eclipse.team.ui.mapping.ITeamStateDescription;
46
import org.eclipse.team.ui.mapping.ITeamStateProvider;
47
import org.eclipse.team.ui.mapping.SynchronizationStateTester;
48
38
import org.eclipse.jdt.internal.corext.Assert;
49
import org.eclipse.jdt.internal.corext.Assert;
39
50
40
public class WorkingSetModel {
51
public class WorkingSetModel {
41
52
42
	public static final String CHANGE_WORKING_SET_MODEL_CONTENT= "workingSetModelChanged"; //$NON-NLS-1$
53
	public static final String CHANGE_WORKING_SET_MODEL_CONTENT= "workingSetModelChanged"; //$NON-NLS-1$
54
	
55
	public static final String CHANGE_WORKING_SET_TEAM_DECORATION= "workingSetTamDecorationChanged"; //$NON-NLS-1$
43
56
44
	public static final IElementComparer COMPARER= new WorkingSetComparar();
57
	public static final IElementComparer COMPARER= new WorkingSetComparar();
45
58
Lines 57-62 Link Here
57
	private ElementMapper fElementMapper= new ElementMapper();
70
	private ElementMapper fElementMapper= new ElementMapper();
58
71
59
	private boolean fConfigured;
72
	private boolean fConfigured;
73
	
74
	private SynchronizationStateTester fSyncStateTester;
75
	private ITeamStateChangeListener fTeamListener;
76
	private IResourceChangeListener fResourceListener;
77
	private Map fTeamState = new HashMap();
60
78
61
	private static class WorkingSetComparar implements IElementComparer {
79
	private static class WorkingSetComparar implements IElementComparer {
62
		public boolean equals(Object o1, Object o2) {
80
		public boolean equals(Object o1, Object o2) {
Lines 248-256 Link Here
248
		};
266
		};
249
		PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(fWorkingSetManagerListener);
267
		PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(fWorkingSetManagerListener);
250
		fLocalWorkingSetManager.addPropertyChangeListener(fWorkingSetManagerListener);
268
		fLocalWorkingSetManager.addPropertyChangeListener(fWorkingSetManagerListener);
269
		fSyncStateTester = new SynchronizationStateTester() {
270
			public void elementDecorated(Object element, ITeamStateDescription description) {
271
				if (element instanceof IWorkingSet) {
272
					IWorkingSet set = (IWorkingSet) element;
273
					// Record the state that was decorated so we will avoid
274
					// unnecessary label updates
275
					fTeamState.put(set, description);
276
				}
277
				super.elementDecorated(element, description);
278
			}
279
		};
280
		fTeamListener = new ITeamStateChangeListener() {
281
			public void teamStateChanged(ITeamStateChangeEvent event) {
282
				handeTeamStateChange(event);
283
			}
284
		};
285
		fResourceListener = new IResourceChangeListener() {
286
			public void resourceChanged(IResourceChangeEvent event) {
287
				handleResourceChange(event.getDelta());
288
			}
289
		};
290
		fSyncStateTester.getTeamStateProvider().addDecoratedStateChangeListener(fTeamListener);
291
		ResourcesPlugin.getWorkspace().addResourceChangeListener(fResourceListener, IResourceChangeEvent.POST_CHANGE);
251
	}
292
	}
252
293
253
	public void dispose() {
294
	public void dispose() {
295
		fSyncStateTester.getTeamStateProvider().removeDecoratedStateChangeListener(fTeamListener);
296
		ResourcesPlugin.getWorkspace().removeResourceChangeListener(fResourceListener);
254
		if (fWorkingSetManagerListener != null) {
297
		if (fWorkingSetManagerListener != null) {
255
			PlatformUI.getWorkbench().getWorkingSetManager().removePropertyChangeListener(fWorkingSetManagerListener);
298
			PlatformUI.getWorkbench().getWorkingSetManager().removePropertyChangeListener(fWorkingSetManagerListener);
256
			fLocalWorkingSetManager.removePropertyChangeListener(fWorkingSetManagerListener);
299
			fLocalWorkingSetManager.removePropertyChangeListener(fWorkingSetManagerListener);
Lines 349-354 Link Here
349
392
350
	public void setActiveWorkingSets(IWorkingSet[] workingSets) {
393
	public void setActiveWorkingSets(IWorkingSet[] workingSets) {
351
		fActiveWorkingSets= new ArrayList(Arrays.asList(workingSets));
394
		fActiveWorkingSets= new ArrayList(Arrays.asList(workingSets));
395
		fTeamState.clear();
352
		fElementMapper.rebuild(getActiveWorkingSets());
396
		fElementMapper.rebuild(getActiveWorkingSets());
353
		fOthersWorkingSetUpdater.updateElements();
397
		fOthersWorkingSetUpdater.updateElements();
354
		fireEvent(new PropertyChangeEvent(this, CHANGE_WORKING_SET_MODEL_CONTENT, null, null));
398
		fireEvent(new PropertyChangeEvent(this, CHANGE_WORKING_SET_MODEL_CONTENT, null, null));
Lines 436-439 Link Here
436
	public boolean isActiveWorkingSet(IWorkingSet changedWorkingSet) {
480
	public boolean isActiveWorkingSet(IWorkingSet changedWorkingSet) {
437
		return fActiveWorkingSets.contains(changedWorkingSet);
481
		return fActiveWorkingSets.contains(changedWorkingSet);
438
	}
482
	}
439
}
483
	
484
	protected void handeTeamStateChange(ITeamStateChangeEvent event) {
485
		for (Iterator iter = fActiveWorkingSets.iterator(); iter.hasNext();) {
486
			IWorkingSet set = (IWorkingSet) iter.next();
487
			if (hasPotentialChanges(event, set) && hasRealChanges(set))
488
				fireEvent(new PropertyChangeEvent(WorkingSetModel.this, CHANGE_WORKING_SET_TEAM_DECORATION, null, null));
489
		}
490
	}
491
492
	protected void handleResourceChange(IResourceDelta delta) {
493
		for (Iterator iter = fActiveWorkingSets.iterator(); iter.hasNext();) {
494
			IWorkingSet set = (IWorkingSet) iter.next();
495
			if (hasPotentialChanges(delta, set) && hasRealChanges(set)) {
496
				fireEvent(new PropertyChangeEvent(WorkingSetModel.this, CHANGE_WORKING_SET_TEAM_DECORATION, null, null));
497
			}
498
		}
499
	}
500
501
	private boolean hasRealChanges(IWorkingSet set) {
502
		try {
503
			ITeamStateProvider decoratedStateProvider = fSyncStateTester.getTeamStateProvider();
504
			if (decoratedStateProvider.isDecorationEnabled(set)) {
505
				ITeamStateDescription desc = decoratedStateProvider.getStateDescription(set, 
506
						ITeamStateProvider.USE_DECORATED_STATE_MASK, null /* use decorated properties */, null /* no progress */);
507
				ITeamStateDescription oldDesc = (ITeamStateDescription)fTeamState.get(set);
508
				if (oldDesc == desc)
509
					return false;
510
				boolean changed = (oldDesc == null && desc != null) 
511
					|| (desc == null && oldDesc != null)
512
					|| (!desc.equals(oldDesc));
513
				if (desc == null) {
514
					fTeamState.remove(set);
515
				} else {
516
					fTeamState.put(set, desc);
517
				}
518
				return changed;
519
			} else {
520
				if (fTeamState.containsKey(set)) {
521
					fTeamState.remove(set);
522
					return true;
523
				}
524
			}
525
		} catch (CoreException e) {
526
			// TODO Auto-generated catch block
527
			e.printStackTrace();
528
		}
529
		return false;
530
	}
531
	
532
	private boolean hasPotentialChanges(IResourceDelta delta, IWorkingSet set) {
533
		IAdaptable[] elements = set.getElements();
534
		for (int i = 0; i < elements.length; i++) {
535
			IAdaptable adaptable = elements[i];
536
			IResource resource = (IResource)adaptable.getAdapter(IResource.class);
537
			if (resource != null) {
538
				IResourceDelta memberDelta = delta.findMember(resource.getFullPath());
539
				if (isChangeOfInterest(memberDelta)) {
540
					return true;
541
				}
542
			}
543
		}
544
		return false;
545
	}
546
547
	private boolean isChangeOfInterest(IResourceDelta memberDelta) {
548
		if (memberDelta != null 
549
				&& (memberDelta.getKind() & (IResourceDelta.ADDED | IResourceDelta.REMOVED | IResourceDelta.CHANGED)) > 0) {
550
			// TODO: Should exclude marker and sync deltas (and possibly others)
551
			return true;
552
		}
553
		return false;
554
	}
555
	
556
	private boolean hasPotentialChanges(ITeamStateChangeEvent event, IWorkingSet set) {
557
		IAdaptable[] elements = set.getElements();
558
		for (int i = 0; i < elements.length; i++) {
559
			IAdaptable adaptable = elements[i];
560
			IResource resource = (IResource)adaptable.getAdapter(IResource.class);
561
			if (resource != null && event.hasChange(resource)) {
562
				return true;
563
			}
564
		}
565
		return false;
566
	}
567
}

Return to bug 123978