[Preferences] Add notification priority to
PreferenceSetService.ChangeListener

Change-Id: I7268d351219251db99d9ed5d229669df5064850a
diff --git a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/PreferenceSetService.java b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/PreferenceSetService.java
index 0709245..8c0adc2 100644
--- a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/PreferenceSetService.java
+++ b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/PreferenceSetService.java
@@ -26,7 +26,7 @@
 public interface PreferenceSetService {
 	
 	
-	interface ChangeEvent {
+	static interface ChangeEvent {
 		
 		
 		boolean contains(String qualifier);
@@ -38,10 +38,18 @@
 		
 	}
 	
-	interface ChangeListener {
+	static interface ChangeListener {
+		
+		static final byte PRIORITY_HIGHEST= 10;
+		static final byte PRIORITY_DEFAULT= 5;
+		static final byte PRIORITY_LOWEST= 0;
 		
 		
-		void preferenceChanged(ChangeEvent event);
+		default byte getNotificationPriority() {
+			return PRIORITY_DEFAULT;
+		}
+		
+		void onPreferenceChanged(ChangeEvent event);
 		
 	}
 	
diff --git a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/util/PreferenceObjectController.java b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/util/PreferenceObjectController.java
index a1f8c6c..30abbd7 100644
--- a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/util/PreferenceObjectController.java
+++ b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/ecommons/preferences/core/util/PreferenceObjectController.java
@@ -74,7 +74,12 @@
 	
 	
 	@Override
-	public final void preferenceChanged(final ChangeEvent event) {
+	public byte getNotificationPriority() {
+		return PRIORITY_HIGHEST - 1;
+	}
+	
+	@Override
+	public final void onPreferenceChanged(final ChangeEvent event) {
 		if (this.state == UPTODATE && isUpdateRequired(event)) {
 			disposeObject();
 		}
diff --git a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/ECommonsPreferencesCorePlugin.java b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/ECommonsPreferencesCorePlugin.java
index 5384b04..417c3ed 100644
--- a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/ECommonsPreferencesCorePlugin.java
+++ b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/ECommonsPreferencesCorePlugin.java
@@ -61,7 +61,7 @@
 	
 	private final List<Disposable> disposables= new ArrayList<>();
 	
-	private DefaultPreferenceSetService defaultPreferenceSetService;
+	private PreferenceSetServiceImpl defaultPreferenceSetService;
 	
 	
 	public ECommonsPreferencesCorePlugin() {
@@ -75,7 +75,7 @@
 		synchronized (this) {
 			this.started= true;
 			
-			this.defaultPreferenceSetService= new DefaultPreferenceSetService();
+			this.defaultPreferenceSetService= new PreferenceSetServiceImpl();
 			addStoppingListener(this.defaultPreferenceSetService);
 		}
 	}
diff --git a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/DefaultPreferenceSetService.java b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/PreferenceSetServiceImpl.java
similarity index 93%
rename from ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/DefaultPreferenceSetService.java
rename to ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/PreferenceSetServiceImpl.java
index 93790d3..88d3e58 100644
--- a/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/DefaultPreferenceSetService.java
+++ b/ecommons/org.eclipse.statet.ecommons.preferences.core/src/org/eclipse/statet/internal/ecommons/preferences/core/PreferenceSetServiceImpl.java
@@ -50,7 +50,7 @@
 
 
 @NonNullByDefault
-public final class DefaultPreferenceSetService implements PreferenceSetService, ISchedulingRule, Disposable {
+public final class PreferenceSetServiceImpl implements PreferenceSetService, ISchedulingRule, Disposable {
 	
 	
 	private static final int MS_NS= 1000 * 1000;
@@ -65,6 +65,7 @@
 	private static class ChangeListenerItem {
 		
 		
+		private final byte notificationPriority;
 		private final ChangeListener listener;
 		
 		private final ImList<IScopeContext> contexts;
@@ -74,6 +75,7 @@
 		
 		public ChangeListenerItem(final ChangeListener listener,
 				final ImList<IScopeContext> contexts, final ImSet<String> qualifiers) {
+			this.notificationPriority= listener.getNotificationPriority();
 			this.listener= listener;
 			this.contexts= contexts;
 			this.qualifiers= qualifiers;
@@ -260,14 +262,14 @@
 			
 			setSystem(true);
 			setPriority(SHORT);
-			setRule(DefaultPreferenceSetService.this);
+			setRule(PreferenceSetServiceImpl.this);
 		}
 		
 		
 		@Override
 		protected IStatus run(final IProgressMonitor monitor) {
 			if (this.pauseKey != null) {
-				synchronized (DefaultPreferenceSetService.this) {
+				synchronized (PreferenceSetServiceImpl.this) {
 					if (!removePause(this.pauseKey)) {
 						return Status.OK_STATUS;
 					}
@@ -299,7 +301,7 @@
 	private final Event processEvent= new Event();
 	
 	
-	public DefaultPreferenceSetService() {
+	public PreferenceSetServiceImpl() {
 	}
 	
 	
@@ -420,15 +422,19 @@
 		
 		LISTENER: synchronized (this.listeners) {
 			final ChangeListenerItem item= new ChangeListenerItem(listener, contexts, qualifiers);
-			final ImList<ChangeListenerItem> l= this.listeners.toList();
-			for (int i= 0; i < l.size(); i++) {
-				final ChangeListenerItem iItem= l.get(i);
-				if (iItem.getListener() == listener) {
-					this.listeners.set(i, item);
+			final ImList<ChangeListenerItem> items= this.listeners.toList();
+			int index= 0;
+			for (; index < items.size(); index++) {
+				final ChangeListenerItem indexItem= items.get(index);
+				if (indexItem.getListener() == listener) {
+					this.listeners.set(index, item);
 					break LISTENER;
 				}
+				if (indexItem.notificationPriority < item.notificationPriority) {
+					break;
+				}
 			}
-			this.listeners.add(item);
+			this.listeners.add(index, item);
 		}
 		
 		for (final IScopeContext context : contexts) {
@@ -501,7 +507,7 @@
 				}
 				
 				if (!event.isEmpty()) {
-					listener.getListener().preferenceChanged(event);
+					listener.getListener().onPreferenceChanged(event);
 					
 					event.reset();
 				}
diff --git a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/preferences/ui/PreferenceSetUIListener.java b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/preferences/ui/PreferenceSetUIListener.java
index 3ad140f..ccebb08 100644
--- a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/preferences/ui/PreferenceSetUIListener.java
+++ b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/preferences/ui/PreferenceSetUIListener.java
@@ -37,7 +37,7 @@
 		final PreferenceSetUIListener uiListener= new PreferenceSetUIListener(prefAccess, control) {
 			@Override
 			protected void handlePreferenceChanged(final ChangeEvent event) {
-				listener.preferenceChanged(event);
+				listener.onPreferenceChanged(event);
 			}
 		};
 		uiListener.subscribe(qualifiers);
@@ -75,7 +75,7 @@
 	}
 	
 	@Override
-	public void preferenceChanged(final ChangeEvent event) {
+	public void onPreferenceChanged(final ChangeEvent event) {
 		UIAccess.getDisplay().syncExec(new Runnable() {
 			@Override
 			public void run() {