| /*******************************************************************************
|
| * Copyright (c) 2011, 2019 Mia-Software and others.
|
| * All rights reserved. This program and the accompanying materials
|
| * are made available under the terms of the Eclipse Public License v2.0
|
| * which accompanies this distribution, and is available at
|
| * http://www.eclipse.org/legal/epl-v20.html
|
| *
|
| * Contributors:
|
| * Fabien Giquel (Mia-Software) - initial API and implementation
|
| * Nicolas Bros (Mia-Software) - Bug 338437 - compositeEditors extension point cannot be used to register user types
|
| * Nicolas Guyomar (Mia-Software) - Bug 338826 - CompositeEditorFactoriesRegistry.getCompositeEditorFactory() should be parameterized
|
| * Nicolas Guyomar (Mia-Software) - Bug 339554 - org.eclipse.modisco.facet.widgets.celleditors API cleaning
|
| * Nicolas Bros (Mia-Software) - Bug 341369 - CompositeEditorFactoriesRegistry : inverted type comparison
|
| * Gregoire Dupe (Mia-Software) - Bug 369987 - [Restructuring][Table] Switch to the new customization and facet framework
|
| *******************************************************************************/ |
| package org.eclipse.modisco.facet.widgets.celleditors.internal.composite.registries;
|
|
|
| import java.util.ArrayList;
|
| import java.util.List;
|
|
|
| import org.eclipse.core.runtime.CoreException;
|
| import org.eclipse.core.runtime.IConfigurationElement;
|
| import org.eclipse.modisco.facet.util.core.Logger;
|
| import org.eclipse.modisco.facet.util.core.internal.exported.AbstractRegistry;
|
| import org.eclipse.modisco.facet.widgets.celleditors.ICompositeEditorFactory;
|
| import org.eclipse.modisco.facet.widgets.celleditors.internal.Activator;
|
|
|
| /**
|
| * Registry for composite editors extension point
|
| */
|
| public class CompositeEditorFactoriesRegistry extends AbstractRegistry
|
| implements org.eclipse.modisco.facet.widgets.celleditors.core.composite.registry.ICompositeEditorFactoriesRegistry {
|
|
|
| private static final String CLASS_ATTRIBUTE = "class"; //$NON-NLS-1$
|
|
|
| private static final String EXTENSION_POINT_NAMESPACE = "org.eclipse.modisco.facet.widgets.celleditors"; //$NON-NLS-1$
|
| private static final String EXTENSION_POINT_NAME = "compositeEditorFactories"; //$NON-NLS-1$
|
| private final List<ICompositeEditorFactory<?>> compositeFactories;
|
|
|
| public CompositeEditorFactoriesRegistry() {
|
| this.compositeFactories = new ArrayList<ICompositeEditorFactory<?>>();
|
| initialize();
|
| }
|
|
|
| public boolean hasCompositeEditorFactory(final Class<?> type) {
|
| return getCompositeEditorFactory(type) != null;
|
| }
|
|
|
| public <T> ICompositeEditorFactory<T> getCompositeEditorFactory(final Class<T> type) {
|
| if (this.compositeFactories == null) {
|
| initialize();
|
| }
|
|
|
| final Class<?> objectType;
|
| if (type == byte.class) {
|
| objectType = Byte.class;
|
| } else if (type == short.class) {
|
| objectType = Short.class;
|
| } else if (type == int.class) {
|
| objectType = Integer.class;
|
| } else if (type == long.class) {
|
| objectType = Long.class;
|
| } else if (type == float.class) {
|
| objectType = Float.class;
|
| } else if (type == double.class) {
|
| objectType = Double.class;
|
| } else if (type == boolean.class) {
|
| objectType = Boolean.class;
|
| } else if (type == char.class) {
|
| objectType = Character.class;
|
| } else {
|
| objectType = type;
|
| }
|
|
|
| // choose the factory with the most "precise" type (lowest in the inheritance hierarchy)
|
| Class<?> mostPreciseType = null;
|
| ICompositeEditorFactory<T> mostPreciseFactory = null;
|
| for (ICompositeEditorFactory<?> factory : this.compositeFactories) {
|
| Class<?> handledType = factory.getHandledType();
|
| if (handledType != null && handledType.isAssignableFrom(objectType)) {
|
| if (mostPreciseType == null || mostPreciseType.isAssignableFrom(handledType)) {
|
| mostPreciseType = handledType;
|
| mostPreciseFactory = castMostPreciseFactory(factory);
|
| }
|
| }
|
| }
|
| return mostPreciseFactory;
|
| }
|
|
|
| // Only here to isolate the suppress warning
|
| @SuppressWarnings("unchecked")
|
| private <T> ICompositeEditorFactory<T> castMostPreciseFactory(final ICompositeEditorFactory<?> factory) {
|
| ICompositeEditorFactory<T> mostPreciseFactory;
|
| mostPreciseFactory = (ICompositeEditorFactory<T>) factory;
|
| return mostPreciseFactory;
|
| }
|
|
|
| @Override
|
| protected String getExtensionPointNamespace() {
|
| return CompositeEditorFactoriesRegistry.EXTENSION_POINT_NAMESPACE;
|
| }
|
|
|
| @Override
|
| protected String getExtensionPointName() {
|
| return CompositeEditorFactoriesRegistry.EXTENSION_POINT_NAME;
|
| }
|
|
|
| @Override
|
| protected void handleRootElement(final IConfigurationElement configurationElement) {
|
| ICompositeEditorFactory<?> factory;
|
| try {
|
| factory = (ICompositeEditorFactory<?>) configurationElement
|
| .createExecutableExtension(CompositeEditorFactoriesRegistry.CLASS_ATTRIBUTE);
|
| this.compositeFactories.add(factory);
|
| } catch (CoreException e) {
|
| Logger.logError(
|
| e,
|
| "A problem occured when instantiating a composite editor factory", Activator.getDefault()); //$NON-NLS-1$
|
| }
|
| }
|
| }
|