/******************************************************************************* * Copyright (c) 2006-2013 The RCP Company 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: * The RCP Company - initial API and implementation *******************************************************************************/ package com.rcpcompany.uibindings.internal.compositeform; import java.util.Collection; import java.util.Comparator; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.eclipse.emf.common.notify.NotificationChain; import org.eclipse.emf.common.util.ECollections; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.EObjectImpl; import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList; import org.eclipse.emf.ecore.util.InternalEList; import com.rcpcompany.uibindings.compositeform.ICompositeForm; import com.rcpcompany.uibindings.compositeform.ICompositeFormDescriptor; import com.rcpcompany.uibindings.compositeform.ICompositeFormFactory; import com.rcpcompany.uibindings.compositeform.ICompositeFormManager; import com.rcpcompany.uibindings.compositeform.ICompositeFormPackage; import com.rcpcompany.uibindings.compositeform.ICompositeFormPartDescriptor; import com.rcpcompany.uibindings.compositeform.ICompositeFormPartFactory; import com.rcpcompany.uibindings.internal.InternalConstants; import com.rcpcompany.uibindings.utils.IFormCreator; import com.rcpcompany.utils.extensionpoints.CEObjectHolder; import com.rcpcompany.utils.extensionpoints.CEResourceHolder; import com.rcpcompany.utils.logging.LogUtils; /** * <!-- begin-user-doc --> * * The manager of composite forms. * * <!-- end-user-doc --> * <p> * The following features are implemented: * <ul> * <li>{@link com.rcpcompany.uibindings.internal.compositeform.CompositeFormManagerImpl#getForms * <em>Forms</em>}</li> * </ul> * </p> * * @generated */ public class CompositeFormManagerImpl extends EObjectImpl implements ICompositeFormManager { private static ICompositeFormManager MANAGER = null; public static ICompositeFormManager getManager() { if (MANAGER == null) { MANAGER = ICompositeFormFactory.eINSTANCE.createCompositeFormManager(); } return MANAGER; } /** * Creates the composite form for the specified ID. * * @param form the form that will contain the composite form * @param id the ID of the composite form * @return the sub form */ public static ICompositeForm createForm(IFormCreator form, String id) { for (final ICompositeFormDescriptor fd : getManager().getForms()) { if (fd.getId().equals(id)) { final ICompositeForm cform = ICompositeFormFactory.eINSTANCE.createCompositeForm(); cform.setFormCreator(form); cform.setDescriptor(fd); cform.create(); return cform; } } return null; } /** * The cached value of the '{@link #getForms() <em>Forms</em>}' containment reference list. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getForms() * @generated * @ordered */ protected EList<ICompositeFormDescriptor> forms; /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated NOT */ protected CompositeFormManagerImpl() { super(); extensionReader(); } private void extensionReader() { final IExtensionRegistry registry = Platform.getExtensionRegistry(); CE: for (final IConfigurationElement ce : registry .getConfigurationElementsFor(InternalConstants.COMPOSITE_FORMS_EXTENSION_POINT)) { final String elementName = ce.getName(); String attr; if (elementName.equals(InternalConstants.FORM_TAG)) { final String id = ce.getAttribute(InternalConstants.ID_TAG); if (id == null || id.length() == 0) { LogUtils.error(ce, InternalConstants.ID_TAG + " must be specified. Ignored"); //$NON-NLS-1$ continue CE; } for (final ICompositeFormDescriptor f : getForms()) { if (f.getId().equals(id)) { LogUtils.error(ce, "Duplicate declaration of form '" + id + "'. Ignored."); continue CE; } } final ICompositeFormDescriptor form = ICompositeFormFactory.eINSTANCE.createCompositeFormDescriptor(); form.setId(id); getForms().add(form); } else if (elementName.equals(InternalConstants.PART_TAG)) { final String id = ce.getAttribute(InternalConstants.FORM_ID_TAG); if (id == null || id.length() == 0) { LogUtils.error(ce, InternalConstants.FORM_ID_TAG + " must be specified. Ignored"); //$NON-NLS-1$ continue CE; } ICompositeFormDescriptor form = null; for (final ICompositeFormDescriptor f : getForms()) { if (f.getId().equals(id)) { form = f; break; } } if (form == null) { LogUtils.error(ce, InternalConstants.FORM_ID_TAG + " must be a declared form. Ignored"); //$NON-NLS-1$ continue CE; } final ICompositeFormPartDescriptor part = ICompositeFormFactory.eINSTANCE .createCompositeFormPartDescriptor(); attr = ce.getAttribute(InternalConstants.TITLE_TAG); if (attr == null || attr.length() == 0) { LogUtils.error(ce, InternalConstants.TITLE_TAG + " must be specified. Ignored"); //$NON-NLS-1$ continue CE; } part.setTitle(attr); part.setImage(new CEResourceHolder(ce)); part.setFactory(new CEObjectHolder<ICompositeFormPartFactory>(ce, InternalConstants.FACTORY_TAG)); final String priority = ce.getAttribute(InternalConstants.PRIORITY_TAG); if (priority != null && priority.length() > 0) { try { part.setPriority(Integer.parseInt(priority)); } catch (final NumberFormatException ex) { LogUtils.error(ce, ex); continue; } } else { part.setPriority(1000); } form.getParts().add(part); } else { LogUtils.error(ce, "Unknown tag: '" + ce.getName() + "'"); } } /* * Sort the parts of the forms */ final Comparator<ICompositeFormPartDescriptor> comparator = new Comparator<ICompositeFormPartDescriptor>() { @Override public int compare(ICompositeFormPartDescriptor o1, ICompositeFormPartDescriptor o2) { return o2.getPriority() - o1.getPriority(); } }; for (final ICompositeFormDescriptor form : getForms()) { ECollections.sort(form.getParts(), comparator); } } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override protected EClass eStaticClass() { return ICompositeFormPackage.Literals.COMPOSITE_FORM_MANAGER; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public EList<ICompositeFormDescriptor> getForms() { if (forms == null) { forms = new EObjectContainmentWithInverseEList<ICompositeFormDescriptor>(ICompositeFormDescriptor.class, this, ICompositeFormPackage.COMPOSITE_FORM_MANAGER__FORMS, ICompositeFormPackage.COMPOSITE_FORM_DESCRIPTOR__MANAGER); } return forms; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @SuppressWarnings("unchecked") @Override public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) { switch (featureID) { case ICompositeFormPackage.COMPOSITE_FORM_MANAGER__FORMS: return ((InternalEList<InternalEObject>) (InternalEList<?>) getForms()).basicAdd(otherEnd, msgs); } return super.eInverseAdd(otherEnd, featureID, msgs); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) { switch (featureID) { case ICompositeFormPackage.COMPOSITE_FORM_MANAGER__FORMS: return ((InternalEList<?>) getForms()).basicRemove(otherEnd, msgs); } return super.eInverseRemove(otherEnd, featureID, msgs); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public Object eGet(int featureID, boolean resolve, boolean coreType) { switch (featureID) { case ICompositeFormPackage.COMPOSITE_FORM_MANAGER__FORMS: return getForms(); } return super.eGet(featureID, resolve, coreType); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @SuppressWarnings("unchecked") @Override public void eSet(int featureID, Object newValue) { switch (featureID) { case ICompositeFormPackage.COMPOSITE_FORM_MANAGER__FORMS: getForms().clear(); getForms().addAll((Collection<? extends ICompositeFormDescriptor>) newValue); return; } super.eSet(featureID, newValue); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public void eUnset(int featureID) { switch (featureID) { case ICompositeFormPackage.COMPOSITE_FORM_MANAGER__FORMS: getForms().clear(); return; } super.eUnset(featureID); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated */ @Override public boolean eIsSet(int featureID) { switch (featureID) { case ICompositeFormPackage.COMPOSITE_FORM_MANAGER__FORMS: return forms != null && !forms.isEmpty(); } return super.eIsSet(featureID); } } // CompositeFormManagerImpl