/******************************************************************************* * Copyright (c) 2003, 2005 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jst.j2ee.internal.webservice.adapter; import java.util.Iterator; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.jst.j2ee.internal.webservice.command.CommandAddElement; import org.eclipse.jst.j2ee.internal.webservice.command.CommandRemoveElement; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.Text; import org.eclipse.wst.common.componentcore.ArtifactEdit; public class AdapterElement extends AdapterImpl implements ModifyListener { private ArtifactEdit artifactEdit; private EObject parent_; private EClass childEClass_; private EStructuralFeature childFeature_; private boolean childNillable_; private EStructuralFeature[] features_; private boolean[] featuresNillable_; private Text[] featuresTexts_; private AdapterText[] featuresAdapters_; public AdapterElement(ArtifactEdit anArtifactEdit, EClass childEClass, EStructuralFeature childFeature, boolean childNillable, EStructuralFeature[] features, boolean[] featuresNillable, Text[] featuresTexts) { super(); artifactEdit = anArtifactEdit; parent_ = null; childEClass_ = childEClass; childFeature_ = childFeature; childNillable_ = childNillable; features_ = features; featuresNillable_ = featuresNillable; featuresTexts_ = featuresTexts; addModifyListener(); featuresAdapters_ = new AdapterText[features_.length]; newAdapters(null); } public AdapterElement(ArtifactEdit anArtifactEdit, EObject parent, EClass childEClass, EStructuralFeature childFeature, boolean childNillable, EStructuralFeature[] features, boolean[] featuresNillable, Text[] featuresTexts) { this(anArtifactEdit, childEClass, childFeature, childNillable, features, featuresNillable, featuresTexts); adapt(parent); } private void newAdapters(EObject eObject) { if (eObject == null) for (int i = 0; i < featuresAdapters_.length; i++) featuresAdapters_[i] = new AdapterText(artifactEdit, features_[i], featuresTexts_[i], featuresNillable_[i]); else for (int i = 0; i < featuresAdapters_.length; i++) featuresAdapters_[i] = new AdapterText(artifactEdit, eObject, features_[i], featuresTexts_[i], featuresNillable_[i]); } private void addModifyListener() { for (int i = 0; i < featuresTexts_.length; i++) featuresTexts_[i].addModifyListener(this); } @Override public void notifyChanged(Notification msg) { int type = msg.getEventType(); if ((type == Notification.SET || type == Notification.UNSET) && msg.getFeature() == childFeature_) { EObject child = (EObject) parent_.eGet(childFeature_); if (child == null && !childNillable_) child = setChild(); for (int i = 0; i < featuresAdapters_.length; i++) featuresAdapters_[i].adapt(child); } } public void modifyText(ModifyEvent e) { boolean isTextsNull = isTextsNull(); EObject child = (EObject) parent_.eGet(childFeature_); boolean childCanBeRemoved = true; if (child != null) { Iterator allfeatures = childEClass_.getEAllStructuralFeatures().iterator(); while (allfeatures.hasNext()) { EStructuralFeature thisFeature = (EStructuralFeature) allfeatures.next(); if (!adaptingFeature(thisFeature) && child.eIsSet(thisFeature)) { childCanBeRemoved = false; break; } } } if (isTextsNull && child != null && childNillable_ && childCanBeRemoved) { disposeAdapters(); parent_.eAdapters().remove(this); CommandRemoveElement command = new CommandRemoveElement(null, null, parent_, childFeature_); artifactEdit.getContentModelRoot().eResource().setModified(true); artifactEdit.getCommandStack().execute(command); parent_.eAdapters().add(this); newAdapters(null); } else if (!isTextsNull && child == null) { disposeAdapters(); parent_.eAdapters().remove(this); child = createChild(); for (int i = 0; i < features_.length; i++) { String text = featuresTexts_[i].getText(); if (text != null && text.length() > 0) child.eSet(features_[i], text); } CommandAddElement command = new CommandAddElement(null, null, parent_, childFeature_, child); artifactEdit.getContentModelRoot().eResource().setModified(true); artifactEdit.getCommandStack().execute(command); parent_.eAdapters().add(this); newAdapters(child); } } private boolean isTextsNull() { for (int i = 0; i < featuresTexts_.length; i++) { String text = featuresTexts_[i].getText(); if (text != null && text.length() > 0) return false; } return true; } public void adapt(EObject eObject) { if (parent_ != null) parent_.eAdapters().remove(this); parent_ = eObject; EObject child = null; if (parent_ != null) { parent_.eAdapters().add(this); child = (EObject) parent_.eGet(childFeature_); if (child == null && !childNillable_) child = setChild(); } removeModifyListener(); for (int i = 0; i < featuresAdapters_.length; i++) featuresAdapters_[i].adapt(child); addModifyListener(); } private EObject setChild() { EObject child = createChild(); parent_.eAdapters().remove(this); parent_.eSet(childFeature_, child); parent_.eAdapters().add(this); return child; } private EObject createChild() { EFactory childFactory = childEClass_.getEPackage().getEFactoryInstance(); EObject child = childFactory.create(childEClass_); for (int i = 0; i < features_.length; i++) { if (!featuresNillable_[i]) child.eSet(features_[i], ""); //$NON-NLS-1$ } return child; } public void dispose() { if (parent_ != null) parent_.eAdapters().remove(this); disposeAdapters(); removeModifyListener(); } private void disposeAdapters() { for (int i = 0; i < featuresAdapters_.length; i++) featuresAdapters_[i].dispose(); } private void removeModifyListener() { for (int i = 0; i < featuresTexts_.length; i++) if (featuresTexts_[i] != null && !featuresTexts_[i].isDisposed()) featuresTexts_[i].removeModifyListener(this); } private boolean adaptingFeature(EStructuralFeature feature) { if (features_ == null) return false; for (int i = 0; i < features_.length; i++) { if (feature == features_[i]) { return true; } } return false; } }