[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() {