From d166f6032ea983c2f4b639dd6e728d26c7afd712 Mon Sep 17 00:00:00 2001
From: Christian W. Damus
Date: Sat, 3 Dec 2016 11:10:18 -0500
Subject: Bug 508629: [Label Provider Service] Label providers do not notify
Fix gaps in the propagation of label updates from EMF item provider
adapters through label-providers that delegate to them and the
label-provider service that delegates to those, in turn.
Add JUnit tests covering various affected label providers, including
a new tests plug-in for the Properties UI in the Infra layer.
https://bugs.eclipse.org/bugs/show_bug.cgi?id=508629
(🍒-picked from streams/2.0-maintenance)
Change-Id: I2e0301db72064fe6899c4d92252d93d9051943f0
---
.../providers/PropertiesHeaderLabelProvider.java | 15 +++++++++++++-
.../META-INF/MANIFEST.MF | 2 +-
.../pom.xml | 2 +-
.../service/ExtensibleLabelProvider.java | 24 ++++++++++++++--------
4 files changed, 32 insertions(+), 11 deletions(-)
(limited to 'plugins/infra')
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/src/org/eclipse/papyrus/infra/properties/ui/providers/PropertiesHeaderLabelProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/src/org/eclipse/papyrus/infra/properties/ui/providers/PropertiesHeaderLabelProvider.java
index e65df2d93d1..7e0911868f8 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/src/org/eclipse/papyrus/infra/properties/ui/providers/PropertiesHeaderLabelProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/src/org/eclipse/papyrus/infra/properties/ui/providers/PropertiesHeaderLabelProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2013 CEA LIST.
+ * Copyright (c) 2013, 2016 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -8,11 +8,14 @@
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 508629
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.ui.providers;
import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
import org.eclipse.papyrus.infra.services.labelprovider.service.impl.LabelProviderServiceImpl;
import org.eclipse.swt.graphics.Image;
@@ -28,6 +31,8 @@ public class PropertiesHeaderLabelProvider extends LabelProvider {
private final ILabelProvider delegate;
+ private final ILabelProviderListener forwardingListener;
+
/**
* The {@link LabelProviderService} Context
*/
@@ -36,6 +41,9 @@ public class PropertiesHeaderLabelProvider extends LabelProvider {
public PropertiesHeaderLabelProvider() {
LabelProviderService labelProviderService = new LabelProviderServiceImpl();
delegate = labelProviderService.getLabelProvider(PROPERTIES_HEADER_CONTEXT);
+
+ forwardingListener = this::forwardLabelChange;
+ delegate.addListener(forwardingListener);
}
@Override
@@ -48,8 +56,13 @@ public class PropertiesHeaderLabelProvider extends LabelProvider {
return delegate.getImage(element);
}
+ private void forwardLabelChange(LabelProviderChangedEvent event) {
+ fireLabelProviderChanged(new LabelProviderChangedEvent(this, event.getElements()));
+ }
+
@Override
public void dispose() {
+ delegate.removeListener(forwardingListener);
delegate.dispose();
}
}
diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/META-INF/MANIFEST.MF b/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/META-INF/MANIFEST.MF
index 7413d92567b..bc36c706660 100644
--- a/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/META-INF/MANIFEST.MF
+++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/META-INF/MANIFEST.MF
@@ -6,7 +6,7 @@ Require-Bundle: org.eclipse.ui;bundle-version="[3.107.0,4.0.0)";visibility:=reex
org.eclipse.papyrus.infra.core;bundle-version="[2.0.0,3.0.0)";visibility:=reexport
Bundle-Vendor: Eclipse Modeling Project
Bundle-ActivationPolicy: lazy
-Bundle-Version: 1.2.0.qualifier
+Bundle-Version: 1.2.1.qualifier
Bundle-Localization: plugin
Bundle-Name: LabelProvider service
Bundle-Activator: org.eclipse.papyrus.infra.services.labelprovider.Activator
diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/pom.xml b/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/pom.xml
index d36e9be6d87..e2adf9ca84d 100644
--- a/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/pom.xml
+++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/pom.xml
@@ -7,6 +7,6 @@
0.0.1-SNAPSHOT
org.eclipse.papyrus.infra.services.labelprovider
- 1.2.0-SNAPSHOT
+ 1.2.1-SNAPSHOT
eclipse-plugin
diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/src/org/eclipse/papyrus/infra/services/labelprovider/service/ExtensibleLabelProvider.java b/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/src/org/eclipse/papyrus/infra/services/labelprovider/service/ExtensibleLabelProvider.java
index 673412d45d0..38859883936 100644
--- a/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/src/org/eclipse/papyrus/infra/services/labelprovider/service/ExtensibleLabelProvider.java
+++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.labelprovider/src/org/eclipse/papyrus/infra/services/labelprovider/service/ExtensibleLabelProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2012, 2013 CEA LIST.
+ * Copyright (c) 2012, 2016 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -10,15 +10,15 @@
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
* Christian W. Damus (CEA) - Workspace-independent model validation view (CDO)
* Mickael ADAM (ALL4TEC) - Bug 500219 - implementation of IStyledLabelProvider
+ * Christian W. Damus - bug 508629
*****************************************************************************/
package org.eclipse.papyrus.infra.services.labelprovider.service;
-import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
-import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
+import java.util.concurrent.CopyOnWriteArrayList;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.IColorProvider;
@@ -28,6 +28,7 @@ import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.papyrus.infra.services.labelprovider.Activator;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
@@ -43,14 +44,14 @@ import org.eclipse.swt.graphics.Image;
*/
public class ExtensibleLabelProvider implements ILabelProvider, IQualifierLabelProvider, ILabelProviderListener, IColorProvider, IFontProvider, IStyledLabelProvider {
- private final Set listeners;
+ private final CopyOnWriteArrayList listeners;
private final SortedMap> providers;
private final ILabelProvider defaultProvider;
public ExtensibleLabelProvider() {
- listeners = new LinkedHashSet();
+ listeners = new CopyOnWriteArrayList();
providers = new TreeMap>();
defaultProvider = new LabelProvider();
@@ -58,7 +59,7 @@ public class ExtensibleLabelProvider implements ILabelProvider, IQualifierLabelP
@Override
public void addListener(ILabelProviderListener listener) {
- listeners.add(listener);
+ listeners.addIfAbsent(listener);
}
@Override
@@ -187,8 +188,15 @@ public class ExtensibleLabelProvider implements ILabelProvider, IQualifierLabelP
*/
@Override
public void labelProviderChanged(LabelProviderChangedEvent event) {
- for (ILabelProviderListener listener : listeners) {
- listener.labelProviderChanged(event);
+ if (!listeners.isEmpty()) {
+ LabelProviderChangedEvent myEvent = new LabelProviderChangedEvent(this, event.getElements());
+ for (ILabelProviderListener listener : listeners) {
+ try {
+ listener.labelProviderChanged(myEvent);
+ } catch (Exception e) {
+ Activator.log.error("Uncaught exception in label provider listener", e); //$NON-NLS-1$
+ }
+ }
}
}
--
cgit v1.2.3