/******************************************************************************* * Copyright (c) 2008, 2012 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.eef.runtime.impl.components; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.BasicDiagnostic; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent; import org.eclipse.emf.eef.runtime.api.notify.IPropertiesEditionEvent; import org.eclipse.emf.eef.runtime.api.notify.IPropertiesEditionListener; import org.eclipse.emf.eef.runtime.api.parts.IPropertiesEditionPart; import org.eclipse.emf.eef.runtime.context.PropertiesEditingContext; import org.eclipse.emf.eef.runtime.impl.parts.NullCompositePropertiesEditionPart; import org.eclipse.emf.eef.runtime.impl.utils.EEFRuntimeMessages; import org.eclipse.emf.eef.runtime.impl.utils.StringTools; /** * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> * @author <a href="mailto:mikael.barbero@obeo.fr">Mikaƫl Barbero</a> */ public class ComposedPropertiesEditionComponent implements IPropertiesEditionComponent { /** * List of managed components */ protected List<IPropertiesEditionComponent> subComponents; /** * List of this component listeners */ private List<IPropertiesEditionListener> listeners; /** * The current editingContext */ private PropertiesEditingContext editingContext; /** * Default constructor */ public ComposedPropertiesEditionComponent(PropertiesEditingContext editingContext, String mode) { this.editingContext = editingContext; this.subComponents = new ArrayList<IPropertiesEditionComponent>(); this.listeners = new ArrayList<IPropertiesEditionListener>(); } /** * Parameterized constructor * * @param subComponents * list of the managed components */ public ComposedPropertiesEditionComponent(List<IPropertiesEditionComponent> subComponents) { this.subComponents = subComponents; this.listeners = new ArrayList<IPropertiesEditionListener>(); for (IPropertiesEditionComponent component : subComponents) { listeners.add(component); component.addListener(this); } } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#setLiveEditingDomain(org.eclipse.emf.edit.domain.EditingDomain) */ public void setLiveEditingDomain(EditingDomain editingDomain) { for (IPropertiesEditionComponent component : subComponents) { component.setLiveEditingDomain(editingDomain); } } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#partsList() */ public String[] partsList() { List<String> partsList = new ArrayList<String>(); for (IPropertiesEditionComponent component : subComponents) { String[] partsList2 = component.partsList(); for (int i = 0; i < partsList2.length; i++) { String string = partsList2[i]; if (!partsList.contains(string)) partsList.add(string); } } String[] result = new String[partsList.size()]; int i = 0; for (String nextPart : partsList) { result[i++] = nextPart; } return result; } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#initPart(java.lang.Object, * int, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.resource.ResourceSet) */ public void initPart(Object key, int kind, EObject element, ResourceSet allResource) { for (IPropertiesEditionComponent component : subComponents) { component.initPart(key, kind, element, allResource); } } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#initPart(java.lang.Object, * int, org.eclipse.emf.ecore.EObject) */ public void initPart(Object key, int kind, EObject element) { this.initPart(key, kind, element, element.eResource().getResourceSet()); } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#getPropertiesEditionPart(java.lang.String, * java.lang.String) */ public IPropertiesEditionPart getPropertiesEditionPart(int kind, String key) { for (IPropertiesEditionComponent component : subComponents) { IPropertiesEditionPart propertiesEditionPart = component.getPropertiesEditionPart(kind, key); if (propertiesEditionPart != null && !(propertiesEditionPart instanceof NullCompositePropertiesEditionPart)) return propertiesEditionPart; } return new NullCompositePropertiesEditionPart(this); } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#getEditingContext() */ public PropertiesEditingContext getEditingContext() { return editingContext; } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.notify.IPropertiesEditionListener#firePropertiesChanged(org.eclipse.emf.eef.runtime.api.notify.IPropertiesEditionEvent) */ public void firePropertiesChanged(IPropertiesEditionEvent event) { event.addHolder(this); for (IPropertiesEditionListener listener : listeners) { if (!event.hold(listener)) listener.firePropertiesChanged(event); } } public void delayedFirePropertiesChanged(IPropertiesEditionEvent event) { for (IPropertiesEditionComponent propertiesEditionComponent : subComponents) { if (!event.hold(propertiesEditionComponent)) propertiesEditionComponent.delayedFirePropertiesChanged(event); } } public void activate() { for (IPropertiesEditionComponent propertiesEditionComponent : subComponents) { propertiesEditionComponent.activate(); } } public void deactivate() { for (IPropertiesEditionComponent propertiesEditionComponent : subComponents) { propertiesEditionComponent.deactivate(); } } /** * Add a new component of the managed components * * @param component * the component to add */ public void addSubComponent(IPropertiesEditionComponent component) { if (subComponents != null && listeners != null) { subComponents.add(component); listeners.add(component); component.addListener(this); } } /** * Remove a component from the managed components * * @param component * the component to removed */ public void removeSubComponent(IPropertiesEditionComponent component) { if (subComponents != null && listeners != null) { component.removeListener(this); subComponents.remove(component); listeners.remove(component); } } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#addListener(org.eclipse.emf.eef.runtime.api.notify.IPropertiesEditionListener) */ public void addListener(IPropertiesEditionListener listener) { if (listeners == null) listeners = new ArrayList<IPropertiesEditionListener>(); listeners.add(listener); } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#removeListener(org.eclipse.emf.eef.runtime.api.notify.IPropertiesEditionListener) */ public void removeListener(IPropertiesEditionListener listener) { if (listeners != null) listeners.remove(listener); } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#validateValue(org.eclipse.emf.eef.runtime.api.notify.IPropertiesEditionEvent) */ public Diagnostic validateValue(IPropertiesEditionEvent event) { BasicDiagnostic diagnostic = new BasicDiagnostic(Diagnostic.OK, EEFRuntimeMessages.ComposedPropertiesEditionComponent_eef_validation_diagnostic, 0, EEFRuntimeMessages.ComposedPropertiesEditionComponent_no_problem, null); for (IPropertiesEditionComponent component : subComponents) { Diagnostic validateValue = component.validateValue(event); if (validateValue != null) diagnostic.add(validateValue); } diagnostic.recomputeSeverity(); return diagnostic; } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#validate() */ public Diagnostic validate() { BasicDiagnostic diagnostic = new BasicDiagnostic(Diagnostic.OK, EEFRuntimeMessages.ComposedPropertiesEditionComponent_eef_validation_diagnostic, Status.OK, EEFRuntimeMessages.ComposedPropertiesEditionComponent_no_problem, null); for (IPropertiesEditionComponent component : subComponents) { diagnostic.getChildren().add(component.validate()); } return diagnostic; } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#dispose() */ public void dispose() { for (IPropertiesEditionComponent component : subComponents) { component.dispose(); } } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#mustBeComposed(java.lang.Object, * int) Very strange case ... shouldn't be invoke ... */ public boolean mustBeComposed(Object key, int kind) { for (IPropertiesEditionComponent component : subComponents) { if (!component.mustBeComposed(key, kind)) return false; } return true; } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#isRequired(java.lang.Object, * int) */ public boolean isRequired(Object key, int kind) { for (IPropertiesEditionComponent component : subComponents) { if (component.isRequired(key, kind)) return true; } return false; } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#getHelpContent(java.lang.String, * int) */ public String getHelpContent(Object key, int kind) { for (IPropertiesEditionComponent component : subComponents) { if (component.getHelpContent(key, kind) != StringTools.EMPTY_STRING) return component.getHelpContent(key, kind); } return null; } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#translatePart(java.lang.String) */ public Object translatePart(String key) { for (IPropertiesEditionComponent component : subComponents) { if (component.translatePart(key) != null) return component.translatePart(key); } return null; } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#setPropertiesEditionPart(java.lang.Object, * int, org.eclipse.emf.eef.runtime.api.parts.IPropertiesEditionPart) */ public void setPropertiesEditionPart(Object key, int kind, IPropertiesEditionPart propertiesEditionPart) { for (IPropertiesEditionComponent component : subComponents) { component.setPropertiesEditionPart(key, kind, propertiesEditionPart); } } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#getTabText(java.lang.Object) */ public String getTabText(String key) { for (IPropertiesEditionComponent component : subComponents) { IPropertiesEditionPart part = component.getPropertiesEditionPart(0, key); if (part != null) return part.getTitle(); } return key; } /** * {@inheritDoc} * * @see org.eclipse.emf.eef.runtime.api.component.IPropertiesEditionComponent#associatedFeature(java.lang.Object) */ public EStructuralFeature associatedFeature(Object editorKey) { for (IPropertiesEditionComponent component : subComponents) { EStructuralFeature associatedFeature = component.associatedFeature(editorKey); if (associatedFeature != null) return associatedFeature; } return null; } }