Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelProvider.java')
-rw-r--r--bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelProvider.java77
1 files changed, 68 insertions, 9 deletions
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelProvider.java
index 311911027..368ef9150 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelProvider.java
@@ -14,6 +14,7 @@ import java.util.*;
import org.eclipse.compare.structuremergeviewer.IDiffContainer;
import org.eclipse.compare.structuremergeviewer.IDiffElement;
+import org.eclipse.core.resources.*;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.*;
@@ -45,7 +46,7 @@ import org.eclipse.ui.progress.UIJob;
* @see CompressedFoldersModelProvider
* @since 3.0
*/
-public abstract class SynchronizeModelProvider implements ISyncInfoSetChangeListener, ISynchronizeModelProvider {
+public abstract class SynchronizeModelProvider implements ISyncInfoSetChangeListener, ISynchronizeModelProvider, IResourceChangeListener {
// Flasg to indicate if tree control should be updated while
// building the model.
@@ -345,9 +346,7 @@ public abstract class SynchronizeModelProvider implements ISyncInfoSetChangeList
protected void removeFromViewer(IResource resource) {
ISynchronizeModelElement node = getModelObject(resource);
if (node == null) return;
- if (isConflicting(node)) {
- setParentConflict(node, false);
- }
+ calculateProperties(node);
clearModelObjects(node);
if (canUpdateViewer()) {
doRemove(node);
@@ -383,9 +382,7 @@ public abstract class SynchronizeModelProvider implements ISyncInfoSetChangeList
protected void addToViewer(ISynchronizeModelElement node) {
associateDiffNode(node);
node.addPropertyChangeListener(listener);
- if (isConflicting(node)) {
- setParentConflict(node, true);
- }
+ calculateProperties(node);
if (canUpdateViewer()) {
doAdd((SynchronizeModelElement)node.getParent(), node);
}
@@ -439,8 +436,30 @@ public abstract class SynchronizeModelProvider implements ISyncInfoSetChangeList
}
}
- protected void setParentConflict(ISynchronizeModelElement diffNode, boolean value) {
- diffNode.setPropertyToRoot(ISynchronizeModelElement.PROPAGATED_CONFLICT_PROPERTY, value);
+ protected void calculateProperties(ISynchronizeModelElement element) {
+ element.setPropertyToRoot(ISynchronizeModelElement.PROPAGATED_CONFLICT_PROPERTY, isConflicting(element));
+ IResource resource = element.getResource();
+ if(resource != null) {
+ try {
+ boolean error = false;
+ IMarker[] markers = resource.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO);
+ for (int i = 0; i < markers.length; i++) {
+ IMarker marker = markers[i];
+ Integer severity = (Integer)marker.getAttribute(IMarker.SEVERITY);
+ if(severity.intValue() == IMarker.SEVERITY_ERROR) {
+ error = true; break;
+ }
+ }
+ element.setPropertyToRoot(ISynchronizeModelElement.PROPAGATED_ERROR_MARKER_PROPERTY, error);
+ } catch (CoreException e) {
+ TeamUIPlugin.log(e);
+ }
+ }
+ updateParentLabels(element);
+ }
+
+ protected void setPropertyToRoot(ISynchronizeModelElement diffNode, String propertyName, boolean value) {
+ diffNode.setPropertyToRoot(propertyName, value);
updateParentLabels(diffNode);
}
@@ -451,4 +470,44 @@ public abstract class SynchronizeModelProvider implements ISyncInfoSetChangeList
updateLabel(diffNode);
}
}
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+ */
+ public void resourceChanged(final IResourceChangeEvent event) {
+ final Control ctrl = getViewer().getControl();
+ if (ctrl != null && !ctrl.isDisposed()) {
+ ctrl.getDisplay().syncExec(new Runnable() {
+ public void run() {
+ if (!ctrl.isDisposed()) {
+ BusyIndicator.showWhile(ctrl.getDisplay(), new Runnable() {
+ public void run() {
+ String[] markerTypes = getMarkerTypes();
+ boolean refreshNeeded = false;
+ for (int idx = 0; idx < markerTypes.length; idx++) {
+ IMarkerDelta[] markerDeltas = event.findMarkerDeltas(markerTypes[idx], true);
+ List changes = new ArrayList(markerDeltas.length);
+ for (int i = 0; idx < markerDeltas.length; idx++) {
+ IMarkerDelta delta = markerDeltas[i];
+ int kind = delta.getKind();
+ ISynchronizeModelElement element = getModelObject(delta.getResource());
+ if(element != null) {
+ calculateProperties(element);
+ }
+ }
+ }
+ firePendingLabelUpdates();
+ }
+ });
+ }
+ }
+ });
+ }
+ }
+
+
+ protected String[] getMarkerTypes() {
+ return new String[] {IMarker.PROBLEM};
+ }
} \ No newline at end of file

Back to the top