From 41bfa30a421f1051ef38c4946eb31ecd253b2226 Mon Sep 17 00:00:00 2001
From: Steffen Pingel
Date: Thu, 27 Jun 2013 17:25:00 +0200
Subject: 408511: [api] add support for contributing UI and branding at runtime
Change-Id: I33c608dad60ee5d979e2ddd5c5cde4c386519610
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=408511
---
.../schema/repositoryConnectorContributor.exsd | 33 ++--
.../util/RepositoryConnectorExtensionReader.java | 7 +
.../core/spi/RepositoryConnectorBranding.java | 106 ++++++++++++
.../core/spi/RepositoryConnectorDescriptor.java | 1 +
org.eclipse.mylyn.tasks.tests/plugin.xml | 13 ++
.../core/RepositoryConnectorContributorTest.java | 27 +++
.../support/MockRepositoryConnectorAdapter.java | 74 +++++++++
.../testdata/icons/mock-overlay.gif | Bin 0 -> 169 bytes
.../testdata/icons/mock-repository.gif | Bin 0 -> 224 bytes
.../util/RepositoryConnectorUiExtensionReader.java | 181 +++++++++++++++++++++
.../tasks/ui/util/TasksUiExtensionReader.java | 66 +-------
11 files changed, 433 insertions(+), 75 deletions(-)
create mode 100644 org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/spi/RepositoryConnectorBranding.java
create mode 100644 org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/support/MockRepositoryConnectorAdapter.java
create mode 100644 org.eclipse.mylyn.tasks.tests/testdata/icons/mock-overlay.gif
create mode 100644 org.eclipse.mylyn.tasks.tests/testdata/icons/mock-repository.gif
create mode 100644 org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/RepositoryConnectorUiExtensionReader.java
diff --git a/org.eclipse.mylyn.tasks.core/schema/repositoryConnectorContributor.exsd b/org.eclipse.mylyn.tasks.core/schema/repositoryConnectorContributor.exsd
index 1009f3f5e..6c8388663 100644
--- a/org.eclipse.mylyn.tasks.core/schema/repositoryConnectorContributor.exsd
+++ b/org.eclipse.mylyn.tasks.core/schema/repositoryConnectorContributor.exsd
@@ -17,9 +17,9 @@
-
+
-
+
@@ -49,13 +49,13 @@
-
+
The class that contributes connector descriptors.
-
+
@@ -76,27 +76,28 @@
- [Enter extension point usage example here.]
+ <extension
+ point="org.eclipse.mylyn.tasks.core.repositoryConnectorContributor">
+ <contributor
+ class="MyRepositoryConnectorContributor">
+ </contributor>
+ </extension>
-
-
-
-
-
- [Enter API information here.]
-
-
+
-
+
- [Enter information about supplied implementation of this extension point.]
+ Copyright (c) 2013 Tasktop Technologies and others.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Eclipse Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/epl-v10.html
-
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/util/RepositoryConnectorExtensionReader.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/util/RepositoryConnectorExtensionReader.java
index 2137fbf98..3523a502a 100644
--- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/util/RepositoryConnectorExtensionReader.java
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/util/RepositoryConnectorExtensionReader.java
@@ -208,6 +208,8 @@ public class RepositoryConnectorExtensionReader {
private final List factories = new ArrayList();
+ private final List descriptors = new ArrayList();
+
private MultiStatus result;
public RepositoryConnectorExtensionReader(TaskListExternalizer taskListExternalizer,
@@ -267,6 +269,7 @@ public class RepositoryConnectorExtensionReader {
factories.add(new ConnectorFactory(descriptor, element.getContributor().getName()));
}
}
+ RepositoryConnectorExtensionReader.this.descriptors.addAll(descriptors);
}
@Override
@@ -380,6 +383,10 @@ public class RepositoryConnectorExtensionReader {
list.add(descriptor);
}
+ public List getDescriptors() {
+ return new ArrayList(descriptors);
+ }
+
public Set getDisabledContributors() {
return new HashSet(disabledContributors);
}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/spi/RepositoryConnectorBranding.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/spi/RepositoryConnectorBranding.java
new file mode 100644
index 000000000..64f659a8a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/spi/RepositoryConnectorBranding.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Tasktop Technologies and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.core.spi;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+
+/**
+ * Specifies branding for a connector that is registered as runtime using {@link RepositoryConnectorContributor}. The
+ * branding extension is obtained by adapting an {@link AbstractRepositoryConnector} instance to
+ * {@link RepositoryConnectorBranding}.
+ *
+ * To contribute branding clients need to register an {@link IAdapterFactory} for the type
+ * {@link AbstractRepositoryConnector}.
+ *
+ * Example plugin.xml
:
+ *
+ *
+ *
+ * <extension
+ * point="org.eclipse.core.runtime.adapters">
+ * <factory
+ * adaptableType="org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector"
+ * class="MyRepositoryConnectorAdapter">
+ * <adapter
+ * type="org.eclipse.mylyn.tasks.core.spi.RepositoryConnectorBranding">
+ * </adapter>
+ * </factory>
+ * </extension>
+ *
+ *
+ *
+ *
+ * MyRepositoryConnector
needs to return an instance of {@link RepositoryConnectorBranding} for the
+ * appropriate connector instance:
+ *
+ *
+ * public class MyRepositoryConnectorAdapter implements IAdapterFactory {
+ *
+ * @Override
+ * public Object getAdapter(Object adaptableObject, Class adapterType) {
+ * if (adaptableObject instanceof MyRepositoryConnector) {
+ * if (adapterType == RepositoryConnectorBranding.class) {
+ * return new RepositoryConnectorBranding() {
+ * @Override
+ * public InputStream getOverlayImageData() throws IOException {
+ * return getResource(this, "repository-overlay.gif");
+ * }
+ *
+ * @Override
+ * public InputStream getBrandingImageData() throws IOException {
+ * return CommonTestUtil.getResource(this, "repository.gif");
+ * }
+ * };
+ * }
+ * }
+ * return null;
+ * }
+ * }
+ *
+ *
+ *
+ *
+ * @since 3.10
+ * @see RepositoryConnectorContributor
+ * @see RepositoryConnectorDescriptor
+ */
+public abstract class RepositoryConnectorBranding {
+
+ /**
+ * Returns an input stream with the image data for a 16x16 branding icon. This is typically shown in the UI when
+ * selecting connectors. Supported file formats are GIF and PNG.
+ *
+ * @return input stream for image data
+ * @throws IOException
+ * thrown if opening of the stream fails
+ */
+ @NonNull
+ public abstract InputStream getBrandingImageData() throws IOException;
+
+ /**
+ * Returns an input stream with the image data for a 7x8 overlay branding icon. This is typically a very small
+ * version of the branding icon that is used for overlays over repository icons. Supported file formats are GIF and
+ * PNG.
+ *
+ * @return input stream for image data
+ * @throws IOException
+ * thrown if opening of the stream fails
+ */
+ @NonNull
+ public abstract InputStream getOverlayImageData() throws IOException;
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/spi/RepositoryConnectorDescriptor.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/spi/RepositoryConnectorDescriptor.java
index a0151d122..c1c532662 100644
--- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/spi/RepositoryConnectorDescriptor.java
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/spi/RepositoryConnectorDescriptor.java
@@ -21,6 +21,7 @@ import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator;
* A descriptor for an {@link AbstractRepositoryConnector} instance.
*
* @since 3.10
+ * @see RepositoryConnectorBranding
*/
public abstract class RepositoryConnectorDescriptor {
diff --git a/org.eclipse.mylyn.tasks.tests/plugin.xml b/org.eclipse.mylyn.tasks.tests/plugin.xml
index 25485ebd8..a2c0b0b6c 100644
--- a/org.eclipse.mylyn.tasks.tests/plugin.xml
+++ b/org.eclipse.mylyn.tasks.tests/plugin.xml
@@ -213,5 +213,18 @@
class="org.eclipse.mylyn.tasks.tests.support.MockRepositoryConnectorContributor">
+
+
+
+
+
+
+
+
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/RepositoryConnectorContributorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/RepositoryConnectorContributorTest.java
index 80a92345b..4c6e19b89 100644
--- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/RepositoryConnectorContributorTest.java
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/RepositoryConnectorContributorTest.java
@@ -13,9 +13,14 @@ package org.eclipse.mylyn.tasks.tests.core;
import junit.framework.TestCase;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.support.MockRepositoryConnectorAdapter.DynamicMockRepositoryConnectorUi;
import org.eclipse.mylyn.tasks.tests.support.MockRepositoryConnectorDescriptor.DynamicMockRepositoryConnector;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.graphics.Image;
import org.junit.Test;
public class RepositoryConnectorContributorTest extends TestCase {
@@ -28,4 +33,26 @@ public class RepositoryConnectorContributorTest extends TestCase {
assertEquals(DynamicMockRepositoryConnector.CONNECTOR_KIND, connector.getConnectorKind());
}
+ @Test
+ public void testConnectorUiContributed() {
+ AbstractRepositoryConnectorUi connector = TasksUi.getRepositoryConnectorUi(DynamicMockRepositoryConnector.CONNECTOR_KIND);
+ assertNotNull("Expected connector UI contributed by MockRepositoryConnectorAdapter", connector);
+ assertEquals(DynamicMockRepositoryConnectorUi.class, connector.getClass());
+ assertEquals(DynamicMockRepositoryConnector.CONNECTOR_KIND, connector.getConnectorKind());
+ }
+
+ @Test
+ public void testMockBrandingIcon() {
+ Image brandingImage = TasksUiPlugin.getDefault().getBrandingIcon(DynamicMockRepositoryConnector.CONNECTOR_KIND);
+ assertNotNull("Expected branding image contributed by MockRepositoryConnectorAdapter", brandingImage);
+ }
+
+ @Test
+ public void testMockOverlayIcon() {
+ ImageDescriptor overlay = TasksUiPlugin.getDefault().getOverlayIcon(
+ DynamicMockRepositoryConnector.CONNECTOR_KIND);
+ assertNotNull("Expected overlay image contributed by MockRepositoryConnectorAdapter", overlay);
+ assertEquals(8, overlay.getImageData().height);
+ }
+
}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/support/MockRepositoryConnectorAdapter.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/support/MockRepositoryConnectorAdapter.java
new file mode 100644
index 000000000..0956f155d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/support/MockRepositoryConnectorAdapter.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Tasktop Technologies and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests.support;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.spi.RepositoryConnectorBranding;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+
+public class MockRepositoryConnectorAdapter implements IAdapterFactory {
+
+ public final static class DynamicMockRepositoryConnectorUi extends MockRepositoryConnectorUi {
+
+ private final AbstractRepositoryConnector connector;
+
+ DynamicMockRepositoryConnectorUi(AbstractRepositoryConnector connector) {
+ this.connector = connector;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return connector.getConnectorKind();
+ }
+
+ }
+
+ private static final Class>[] ADAPTER_LIST = new Class>[] { AbstractRepositoryConnector.class };
+
+ @Override
+ public Object getAdapter(Object adaptableObject, @SuppressWarnings("rawtypes")
+ Class adapterType) {
+ if (adaptableObject instanceof MockRepositoryConnector) {
+ final AbstractRepositoryConnector connector = (AbstractRepositoryConnector) adaptableObject;
+ if (adapterType == AbstractRepositoryConnectorUi.class) {
+ return new DynamicMockRepositoryConnectorUi(connector);
+ } else if (adapterType == RepositoryConnectorBranding.class) {
+ return new RepositoryConnectorBranding() {
+ @Override
+ public InputStream getOverlayImageData() throws IOException {
+ return CommonTestUtil.getResource(this, "testdata/icons/mock-overlay.gif");
+ }
+
+ @Override
+ public InputStream getBrandingImageData() throws IOException {
+ return CommonTestUtil.getResource(this, "testdata/icons/mock-repository.gif");
+ }
+ };
+ }
+ }
+ return null;
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public Class[] getAdapterList() {
+ return ADAPTER_LIST;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/icons/mock-overlay.gif b/org.eclipse.mylyn.tasks.tests/testdata/icons/mock-overlay.gif
new file mode 100644
index 000000000..5494ff788
Binary files /dev/null and b/org.eclipse.mylyn.tasks.tests/testdata/icons/mock-overlay.gif differ
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/icons/mock-repository.gif b/org.eclipse.mylyn.tasks.tests/testdata/icons/mock-repository.gif
new file mode 100644
index 000000000..1dcbaaff9
Binary files /dev/null and b/org.eclipse.mylyn.tasks.tests/testdata/icons/mock-repository.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/RepositoryConnectorUiExtensionReader.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/RepositoryConnectorUiExtensionReader.java
new file mode 100644
index 000000000..46595385e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/RepositoryConnectorUiExtensionReader.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Tasktop Technologies and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.util;
+
+import java.io.InputStream;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.spi.RepositoryConnectorBranding;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+public class RepositoryConnectorUiExtensionReader {
+
+ private static final String EXTENSION_REPOSITORIES = "org.eclipse.mylyn.tasks.ui.repositories"; //$NON-NLS-1$
+
+ public static final String ELMNT_REPOSITORY_UI = "connectorUi"; //$NON-NLS-1$
+
+ private static final String ATTR_BRANDING_ICON = "brandingIcon"; //$NON-NLS-1$
+
+ private static final String ATTR_OVERLAY_ICON = "overlayIcon"; //$NON-NLS-1$
+
+ private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+
+ private final IExtensionRegistry registry;
+
+ /**
+ * Plug-in ids of connector extensions that failed to load.
+ */
+ private final Set disabledContributors;
+
+ public RepositoryConnectorUiExtensionReader(IExtensionRegistry registry, Set disabledContributors) {
+ Assert.isNotNull(registry);
+ Assert.isNotNull(disabledContributors);
+ this.registry = registry;
+ this.disabledContributors = disabledContributors;
+ }
+
+ private boolean isDisabled(IConfigurationElement element) {
+ return disabledContributors.contains(element.getContributor().getName());
+ }
+
+ public void registerConnectorUis() {
+ registerFromExtensionPoint();
+ registerFromAdaptable();
+ }
+
+ private void registerFromAdaptable() {
+ for (AbstractRepositoryConnector connector : TasksUi.getRepositoryManager().getRepositoryConnectors()) {
+ if (TasksUiPlugin.getConnectorUi(connector.getConnectorKind()) == null) {
+ registerFromAdaptable(connector);
+ }
+ }
+ }
+
+ private void registerFromAdaptable(final AbstractRepositoryConnector connector) {
+ SafeRunner.run(new ISafeRunnable() {
+ @Override
+ public void run() throws Exception {
+ AbstractRepositoryConnectorUi connectorUi = (AbstractRepositoryConnectorUi) Platform.getAdapterManager()
+ .loadAdapter(connector, AbstractRepositoryConnectorUi.class.getName());
+ if (connectorUi != null) {
+ TasksUiPlugin.getDefault().addRepositoryConnectorUi(connectorUi);
+ }
+
+ RepositoryConnectorBranding branding = (RepositoryConnectorBranding) Platform.getAdapterManager()
+ .loadAdapter(connector, RepositoryConnectorBranding.class.getName());
+ if (branding != null) {
+ InputStream brandingImageData = branding.getBrandingImageData();
+ if (brandingImageData != null) {
+ TasksUiPlugin.getDefault().addBrandingIcon(connector.getConnectorKind(),
+ getImage(brandingImageData));
+ }
+ InputStream overlayImageData = branding.getOverlayImageData();
+ if (overlayImageData != null) {
+ TasksUiPlugin.getDefault().addOverlayIcon(connector.getConnectorKind(),
+ getImageDescriptor(overlayImageData));
+ }
+ }
+ }
+
+ private ImageDescriptor getImageDescriptor(InputStream in) {
+ return ImageDescriptor.createFromImageData(new ImageData(in));
+ }
+
+ private Image getImage(InputStream in) {
+ return CommonImages.getImage(getImageDescriptor(in));
+ }
+
+ @Override
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ "Loading of connector ui for kind ''{0}'' failed.", connector.getConnectorKind()), e)); //$NON-NLS-1$
+ }
+ });
+ }
+
+ private void registerFromExtensionPoint() {
+ IExtensionPoint repositoriesExtensionPoint = registry.getExtensionPoint(EXTENSION_REPOSITORIES);
+ IExtension[] repositoryExtensions = repositoriesExtensionPoint.getExtensions();
+ for (IExtension repositoryExtension : repositoryExtensions) {
+ IConfigurationElement[] elements = repositoryExtension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (!isDisabled(element)) {
+ if (element.getName().equals(ELMNT_REPOSITORY_UI)) {
+ registerRepositoryConnectorUi(element);
+ }
+ }
+ }
+ }
+ }
+
+ private void registerRepositoryConnectorUi(IConfigurationElement element) {
+ try {
+ Object connectorUiObject = element.createExecutableExtension(ATTR_CLASS);
+ if (connectorUiObject instanceof AbstractRepositoryConnectorUi) {
+ AbstractRepositoryConnectorUi connectorUi = (AbstractRepositoryConnectorUi) connectorUiObject;
+ if (TasksUiPlugin.getConnector(connectorUi.getConnectorKind()) != null) {
+ TasksUiPlugin.getDefault().addRepositoryConnectorUi(connectorUi);
+
+ String iconPath = element.getAttribute(ATTR_BRANDING_ICON);
+ if (iconPath != null) {
+ ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(
+ element.getContributor().getName(), iconPath);
+ if (descriptor != null) {
+ TasksUiPlugin.getDefault().addBrandingIcon(connectorUi.getConnectorKind(),
+ CommonImages.getImage(descriptor));
+ }
+ }
+ String overlayIconPath = element.getAttribute(ATTR_OVERLAY_ICON);
+ if (overlayIconPath != null) {
+ ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(
+ element.getContributor().getName(), overlayIconPath);
+ if (descriptor != null) {
+ TasksUiPlugin.getDefault().addOverlayIcon(connectorUi.getConnectorKind(), descriptor);
+ }
+ }
+ } else {
+ StatusHandler.log(new Status(
+ IStatus.ERROR,
+ TasksUiPlugin.ID_PLUGIN,
+ NLS.bind(
+ "Ignoring connector ui for kind ''{0}'' without corresponding core contributed by ''{1}''.", connectorUi.getConnectorKind(), element.getContributor().getName()))); //$NON-NLS-1$
+ }
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load connector ui " //$NON-NLS-1$
+ + connectorUiObject.getClass().getCanonicalName()));
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load connector ui", e)); //$NON-NLS-1$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java
index ff0245a31..ed07f17e1 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java
@@ -23,7 +23,6 @@ import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.commons.ui.CommonImages;
import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
import org.eclipse.mylyn.internal.tasks.core.activity.DefaultTaskActivityMonitor;
@@ -38,7 +37,7 @@ import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector;
import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
import org.eclipse.mylyn.tasks.core.activity.AbstractTaskActivityMonitor;
import org.eclipse.mylyn.tasks.core.context.AbstractTaskContextStore;
-import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.core.spi.RepositoryConnectorDescriptor;
import org.eclipse.mylyn.tasks.ui.AbstractTaskRepositoryLinkProvider;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory;
@@ -87,10 +86,6 @@ public class TasksUiExtensionReader {
public static final String ELMNT_REPOSITORY_UI = "connectorUi"; //$NON-NLS-1$
- public static final String ATTR_BRANDING_ICON = "brandingIcon"; //$NON-NLS-1$
-
- public static final String ATTR_OVERLAY_ICON = "overlayIcon"; //$NON-NLS-1$
-
public static final String ELMNT_TYPE = "type"; //$NON-NLS-1$
public static final String ELMNT_QUERY_PAGE = "queryPage"; //$NON-NLS-1$
@@ -136,6 +131,8 @@ public class TasksUiExtensionReader {
*/
private static Set disabledContributors = new HashSet();
+ private static Set descriptors = new HashSet();
+
public static void initStartupExtensions(TaskListExternalizer taskListExternalizer,
TaskRepositoryManager repositoryManager) {
if (!coreExtensionsRead) {
@@ -146,6 +143,7 @@ public class TasksUiExtensionReader {
RepositoryConnectorExtensionReader reader = new RepositoryConnectorExtensionReader(taskListExternalizer,
repositoryManager);
reader.registerConnectors(repositoriesExtensionPoint);
+ descriptors.addAll(reader.getDescriptors());
disabledContributors.addAll(reader.getDisabledContributors());
IExtensionPoint templatesExtensionPoint = registry.getExtensionPoint(EXTENSION_TEMPLATES);
@@ -193,18 +191,9 @@ public class TasksUiExtensionReader {
public static void initWorkbenchUiExtensions() {
IExtensionRegistry registry = Platform.getExtensionRegistry();
- IExtensionPoint repositoriesExtensionPoint = registry.getExtensionPoint(EXTENSION_REPOSITORIES);
- IExtension[] repositoryExtensions = repositoriesExtensionPoint.getExtensions();
- for (IExtension repositoryExtension : repositoryExtensions) {
- IConfigurationElement[] elements = repositoryExtension.getConfigurationElements();
- for (IConfigurationElement element : elements) {
- if (!isDisabled(element)) {
- if (element.getName().equals(ELMNT_REPOSITORY_UI)) {
- readRepositoryConnectorUi(element);
- }
- }
- }
- }
+ RepositoryConnectorUiExtensionReader reader = new RepositoryConnectorUiExtensionReader(registry,
+ disabledContributors);
+ reader.registerConnectorUis();
IExtensionPoint linkProvidersExtensionPoint = registry.getExtensionPoint(EXTENSION_REPOSITORY_LINKS_PROVIDERS);
IExtension[] linkProvidersExtensions = linkProvidersExtensionPoint.getExtensions();
@@ -329,47 +318,6 @@ public class TasksUiExtensionReader {
}
}
- private static void readRepositoryConnectorUi(IConfigurationElement element) {
- try {
- Object connectorUiObject = element.createExecutableExtension(ATTR_CLASS);
- if (connectorUiObject instanceof AbstractRepositoryConnectorUi) {
- AbstractRepositoryConnectorUi connectorUi = (AbstractRepositoryConnectorUi) connectorUiObject;
- if (TasksUiPlugin.getConnector(connectorUi.getConnectorKind()) != null) {
- TasksUiPlugin.getDefault().addRepositoryConnectorUi(connectorUi);
-
- String iconPath = element.getAttribute(ATTR_BRANDING_ICON);
- if (iconPath != null) {
- ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(
- element.getContributor().getName(), iconPath);
- if (descriptor != null) {
- TasksUiPlugin.getDefault().addBrandingIcon(connectorUi.getConnectorKind(),
- CommonImages.getImage(descriptor));
- }
- }
- String overlayIconPath = element.getAttribute(ATTR_OVERLAY_ICON);
- if (overlayIconPath != null) {
- ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(
- element.getContributor().getName(), overlayIconPath);
- if (descriptor != null) {
- TasksUiPlugin.getDefault().addOverlayIcon(connectorUi.getConnectorKind(), descriptor);
- }
- }
- } else {
- StatusHandler.log(new Status(
- IStatus.ERROR,
- TasksUiPlugin.ID_PLUGIN,
- NLS.bind(
- "Ignoring connector ui for kind ''{0}'' without corresponding core contributed by ''{1}''.", connectorUi.getConnectorKind(), element.getContributor().getName()))); //$NON-NLS-1$
- }
- } else {
- StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load connector ui " //$NON-NLS-1$
- + connectorUiObject.getClass().getCanonicalName()));
- }
- } catch (Throwable e) {
- StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load connector ui", e)); //$NON-NLS-1$
- }
- }
-
private static void readRepositoryTemplate(IConfigurationElement element) {
boolean anonymous = false;
boolean addAuto = false;
--
cgit v1.2.3