﻿/*
 * Copyright (c) 2007, 2009 Borland Software Corporation
 * 
 * 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:
 *    bblajer (Borland) - initial API and implementation
 */

«IMPORT 'http://www.eclipse.org/gmf/2009/GenModel'»
«EXTENSION xpt::GenModelUtils»

/**
 * EMF command to remove a link. Used by Reconnect*Commands and by ComponentEditPolicies.
 */
«DEFINE domainModelRemoveCommand(edgeVar : String) FOR gmfgen::GenLink-»
«EXPAND xpt::Common::generatedMemberComment»
private org.eclipse.emf.common.command.Command createDomainModelRemoveCommand(org.eclipse.emf.transaction.TransactionalEditingDomain editingDomain) {
	«EXPAND domainModelRemoveCommand('editingDomain', edgeVar) FOR modelFacet-»
}
«ENDDEFINE»

«DEFINE domainModelRemoveCommand(domainVar : String, edgeVar : String) FOR gmfgen::LinkModelFacet-»
return org.eclipse.emf.common.command.UnexecutableCommand.INSTANCE;
«ENDDEFINE»

«DEFINE domainModelRemoveCommand(domainVar : String, edgeVar : String) FOR gmfgen::TypeLinkModelFacet-»
«EXPAND deleteCommand(domainVar, edgeVar)-»
«ENDDEFINE»

«DEFINE domainModelRemoveCommand(domainVar : String, nodeVar : String) FOR gmfgen::TypeModelFacet-»
«EXPAND deleteCommand(domainVar, nodeVar)-»
«ENDDEFINE»

«DEFINE deleteCommand(domainVar : String, elementVar : String) FOR gmfgen::TypeModelFacet-»
return org.eclipse.gmf.runtime.lite.commands.DestroyElementCommand.create(«domainVar», «elementVar».getElement());
«ENDDEFINE»

«DEFINE domainModelRemoveCommand(domainVar : String, edgeVar : String) FOR gmfgen::FeatureLinkModelFacet-»
«IF isContains(metaFeature)-»
org.eclipse.emf.common.command.CompoundCommand result = new org.eclipse.emf.common.command.CompoundCommand();
result.append(«EXPAND xpt::commands::Common::unplugFeatureCommand(domainVar, edgeVar + '.getSource().getElement()', edgeVar + '.getTarget().getElement()') FOR metaFeature»);
result.append(new org.eclipse.emf.edit.command.AddCommand(«domainVar», «EXPAND xpt::commands::Common::getPhantomContainmentResource FOR edgeVar».getContents(), «edgeVar».getTarget().getElement()));
return result;
«ELSE-»
return «EXPAND xpt::commands::Common::unplugFeatureCommand(domainVar, edgeVar + '.getSource().getElement()', edgeVar + '.getTarget().getElement()') FOR metaFeature»;
«ENDIF-»
«ENDDEFINE»

«DEFINE domainModelRemoveCommand(nodeVar : String) FOR gmfgen::GenNode-»
«EXPAND xpt::Common::generatedMemberComment»
private org.eclipse.emf.common.command.Command createDomainModelRemoveCommand(org.eclipse.emf.transaction.TransactionalEditingDomain editingDomain) {
	«EXPAND domainModelRemoveCommand('editingDomain', nodeVar) FOR modelFacet-»
}
«ENDDEFINE»
