/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.attribute.editor; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.jboss.tools.common.meta.XAttribute; import org.jboss.tools.common.meta.action.XAttributeData; import org.jboss.tools.common.meta.key.WizardKeys; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.util.extension.ExtensionPointUtil; import org.jboss.tools.common.model.ui.ModelUIPlugin; import org.jboss.tools.common.model.ui.widgets.DefaultSettings; import org.jboss.tools.common.model.ui.widgets.IWidgetSettings; public class PropertyEditorFactory { public static final String ATTRIBUTE_EDITOR_EXT_POINT = "org.jboss.tools.common.model.ui.attributeEditor"; //$NON-NLS-1$ private static Map<String,Class<?>> classes = new HashMap<String,Class<?>>(); public PropertyEditorFactory() {} public static PropertyEditor createPropertyEditor(Object adapter, XAttribute attribute, XModelObject modelObject) { return createPropertyEditor(adapter, attribute, attribute.isRequired()); } public static PropertyEditor createPropertyEditor(Object adapter, XAttribute attribute, XAttributeData attributeData) { return createPropertyEditor(adapter, attribute, attributeData.getMandatoryFlag()); } private static PropertyEditor createPropertyEditor(Object adapter, XAttribute attribute, boolean required) { return createPropertyEditor(adapter, attribute, required, DefaultSettings.getDefault()); } public static PropertyEditor createPropertyEditor(Object adapter, XAttribute attribute, XModelObject modelObject, IWidgetSettings settings) { return createPropertyEditor(adapter, attribute, attribute.isRequired(), settings); } public static PropertyEditor createPropertyEditor(Object adapter, XAttribute attribute, XAttributeData attributeData, IWidgetSettings settings) { return createPropertyEditor(adapter, attribute, attributeData.getMandatoryFlag(), settings); } private static PropertyEditor createPropertyEditor(Object adapter, XAttribute attribute, boolean required, IWidgetSettings settings) { PropertyEditor propertyEditor=null; try { propertyEditor = (PropertyEditor)getEditorClass(attribute).newInstance(); propertyEditor.setSettings(settings); } catch (IllegalAccessException e) { ModelUIPlugin.getPluginLog().logError(e); } catch (InstantiationException e) { ModelUIPlugin.getPluginLog().logError(e); } if (propertyEditor == null) { propertyEditor = new StringEditor(settings); } String labelText = WizardKeys.getAttributeDisplayName(attribute, true); String editorName = attribute.getEditor().getName(); if(!"CheckBox".equals(editorName) && !"ListRadio".equals(editorName)) { //$NON-NLS-1$ //$NON-NLS-2$ //Note: If later there appear more cases of editors that do not need ':' //it will be better to add a property to extension point for field editors. labelText += ":"; //$NON-NLS-1$ } if(required) labelText += "*"; //$NON-NLS-1$ propertyEditor.setLabelText(labelText); propertyEditor.setInput(adapter); return propertyEditor; } private static Class<?> getEditorClass(XAttribute attribute) { return getEditorClass(attribute.getEditor().getName()); } static Set<String> defaultEditorIds = new HashSet<String>(); private static Class<?> getEditorClass(String id) { Class<?> c = classes.get(id); if(c != null) return c; c = StringEditor.class; try { c = ExtensionPointUtil.findClassByElementId(ATTRIBUTE_EDITOR_EXT_POINT, id).getClass(); } catch (CoreException e) { if(!defaultEditorIds.contains(id)) { defaultEditorIds.add(id); ModelUIPlugin.getPluginLog().logInfo("PropertyEditorFactory: Default editor used for " + id); //$NON-NLS-1$ } } classes.put(id, c); return c; } }