|
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 |
} |