content: package oscfg.diagram.edit.policies;
  
  import java.util.Iterator;
  
  import org.eclipse.emf.ecore.EAnnotation;
  import org.eclipse.gef.commands.Command;
  import org.eclipse.gef.commands.CompoundCommand;
  import org.eclipse.gmf.runtime.common.core.command.ICompositeCommand;
  import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
  import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
  import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
  import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand;
  import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
  import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;
  import org.eclipse.gmf.runtime.notation.Edge;
  import org.eclipse.gmf.runtime.notation.Node;
  import org.eclipse.gmf.runtime.notation.View;
  
  import oscfg.diagram.edit.parts.BaseTaskCollectMessageEditPart;
  import oscfg.diagram.edit.parts.BaseTaskEnterExitMutexEditPart;
  import oscfg.diagram.edit.parts.CallbackFunctionEditPart;
  import oscfg.diagram.edit.parts.CooperativeGroupEditPart;
  import oscfg.diagram.edit.parts.HWCounterDisable_callbackEditPart;
  import oscfg.diagram.edit.parts.HWCounterEditPart;
  import oscfg.diagram.edit.parts.HWCounterEnable_callbackEditPart;
  import oscfg.diagram.edit.parts.HWCounterGet_callbackEditPart;
  import oscfg.diagram.edit.parts.HWCounterSet_callbackEditPart;
  import oscfg.diagram.edit.parts.ISREditPart;
  import oscfg.diagram.edit.parts.InterruptSourceEditPart;
  import oscfg.diagram.edit.parts.InterruptSourceSourceISREditPart;
  import oscfg.diagram.edit.parts.MessageEditPart;
  import oscfg.diagram.edit.parts.MessageNotifiesEditPart;
  import oscfg.diagram.edit.parts.ModuleModuleObjectsEditPart;
  import oscfg.diagram.edit.parts.MutexEditPart;
  import oscfg.diagram.edit.parts.PosterPostMessageEditPart;
  import oscfg.diagram.edit.parts.SWTimerActivatesEditPart;
  import oscfg.diagram.edit.parts.SWTimerTimer_callbackEditPart;
  import oscfg.diagram.edit.parts.TaskEditPart;
  import oscfg.diagram.part.OscfgVisualIDRegistry;
  import oscfg.diagram.providers.OscfgElementTypes;
  
  /**
   * @generated
   */
  public class ModuleItemSemanticEditPolicy extends
  		OscfgBaseItemSemanticEditPolicy {
  
  	/**
  	 * @generated
  	 */
  	public ModuleItemSemanticEditPolicy() {
  		super(OscfgElementTypes.Module_3009);
  	}
  
  	/**
  	 * @generated
  	 */
  	protected Command getDestroyElementCommand(DestroyElementRequest req) {
  		View view = (View) getHost().getModel();
  		CompositeTransactionalCommand cmd = new CompositeTransactionalCommand(
  				getEditingDomain(), null);
  		cmd.setTransactionNestingEnabled(false);
  		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
  		if (annotation == null) {
  			// there are indirectly referenced children, need extra commands: false
  			addDestroyChildNodesCommand(cmd);
  			addDestroyShortcutsCommand(cmd, view);
  			// delete host element
  			cmd.add(new DestroyElementCommand(req));
  		} else {
  			cmd.add(new DeleteCommand(getEditingDomain(), view));
  		}
  		return getGEFWrapper(cmd.reduce());
  	}
  
  	/**
  	 * @generated
  	 */
  	private void addDestroyChildNodesCommand(ICompositeCommand cmd) {
  		View view = (View) getHost().getModel();
  		for (Iterator<?> nit = view.getChildren().iterator(); nit.hasNext();) {
  			Node node = (Node) nit.next();
  			switch (OscfgVisualIDRegistry.getVisualID(node)) {
  			case ModuleModuleObjectsEditPart.VISUAL_ID:
  				for (Iterator<?> cit = node.getChildren().iterator(); cit
  						.hasNext();) {
  					Node cnode = (Node) cit.next();
  					switch (OscfgVisualIDRegistry.getVisualID(cnode)) {
  					case TaskEditPart.VISUAL_ID:
  						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it
  								.hasNext();) {
  							Edge incomingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == SWTimerActivatesEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == MessageNotifiesEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  						}
  						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it
  								.hasNext();) {
  							Edge outgoingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == BaseTaskCollectMessageEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == PosterPostMessageEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == BaseTaskEnterExitMutexEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  						}
  						cmd.add(new DestroyElementCommand(
  								new DestroyElementRequest(getEditingDomain(),
  										cnode.getElement(), false))); // directlyOwned: true
  						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
  						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
  						break;
  					case ISREditPart.VISUAL_ID:
  						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it
  								.hasNext();) {
  							Edge incomingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == InterruptSourceSourceISREditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  						}
  						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it
  								.hasNext();) {
  							Edge outgoingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == BaseTaskCollectMessageEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == PosterPostMessageEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == BaseTaskEnterExitMutexEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  						}
  						cmd.add(new DestroyElementCommand(
  								new DestroyElementRequest(getEditingDomain(),
  										cnode.getElement(), false))); // directlyOwned: true
  						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
  						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
  						break;
  					case MutexEditPart.VISUAL_ID:
  						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it
  								.hasNext();) {
  							Edge incomingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == BaseTaskEnterExitMutexEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  						}
  						cmd.add(new DestroyElementCommand(
  								new DestroyElementRequest(getEditingDomain(),
  										cnode.getElement(), false))); // directlyOwned: true
  						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
  						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
  						break;
  					case MessageEditPart.VISUAL_ID:
  						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it
  								.hasNext();) {
  							Edge incomingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == BaseTaskCollectMessageEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == PosterPostMessageEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  						}
  						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it
  								.hasNext();) {
  							Edge outgoingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == MessageNotifiesEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  						}
  						cmd.add(new DestroyElementCommand(
  								new DestroyElementRequest(getEditingDomain(),
  										cnode.getElement(), false))); // directlyOwned: true
  						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
  						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
  						break;
  					case HWCounterEditPart.VISUAL_ID:
  						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it
  								.hasNext();) {
  							Edge outgoingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == HWCounterEnable_callbackEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == HWCounterDisable_callbackEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == HWCounterGet_callbackEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == HWCounterSet_callbackEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  						}
  						cmd.add(new DestroyElementCommand(
  								new DestroyElementRequest(getEditingDomain(),
  										cnode.getElement(), false))); // directlyOwned: true
  						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
  						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
  						break;
  					case CallbackFunctionEditPart.VISUAL_ID:
  						for (Iterator<?> it = cnode.getTargetEdges().iterator(); it
  								.hasNext();) {
  							Edge incomingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == SWTimerTimer_callbackEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == HWCounterEnable_callbackEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == HWCounterDisable_callbackEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == HWCounterGet_callbackEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  							if (OscfgVisualIDRegistry.getVisualID(incomingLink) == HWCounterSet_callbackEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										incomingLink.getSource().getElement(),
  										null, incomingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										incomingLink));
  								continue;
  							}
  						}
  						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it
  								.hasNext();) {
  							Edge outgoingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == PosterPostMessageEditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  						}
  						cmd.add(new DestroyElementCommand(
  								new DestroyElementRequest(getEditingDomain(),
  										cnode.getElement(), false))); // directlyOwned: true
  						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
  						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
  						break;
  					case InterruptSourceEditPart.VISUAL_ID:
  						for (Iterator<?> it = cnode.getSourceEdges().iterator(); it
  								.hasNext();) {
  							Edge outgoingLink = (Edge) it.next();
  							if (OscfgVisualIDRegistry.getVisualID(outgoingLink) == InterruptSourceSourceISREditPart.VISUAL_ID) {
  								DestroyReferenceRequest r = new DestroyReferenceRequest(
  										outgoingLink.getSource().getElement(),
  										null, outgoingLink.getTarget()
  												.getElement(), false);
  								cmd.add(new DestroyReferenceCommand(r));
  								cmd.add(new DeleteCommand(getEditingDomain(),
  										outgoingLink));
  								continue;
  							}
  						}
  						cmd.add(new DestroyElementCommand(
  								new DestroyElementRequest(getEditingDomain(),
  										cnode.getElement(), false))); // directlyOwned: true
  						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
  						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
  						break;
  					case CooperativeGroupEditPart.VISUAL_ID:
  						cmd.add(new DestroyElementCommand(
  								new DestroyElementRequest(getEditingDomain(),
  										cnode.getElement(), false))); // directlyOwned: true
  						// don't need explicit deletion of cnode as parent's view deletion would clean child views as well 
  						// cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), cnode));
  						break;
  					}
  				}
  				break;
  			}
  		}
  	}
  
  }
  