diff options
author | ytanguy | 2010-07-01 22:03:22 +0000 |
---|---|---|
committer | ytanguy | 2010-07-01 22:03:22 +0000 |
commit | 8635dc717f7d6caecb4fb197c181e554fd347e69 (patch) | |
tree | 0ac664cd41cb37a4c467588f4fa0291cb000515d /plugins/developer/org.eclipse.papyrus.def | |
parent | 02b20845d129490ec306a7f0a31e8bb311312507 (diff) | |
download | org.eclipse.papyrus-8635dc717f7d6caecb4fb197c181e554fd347e69.tar.gz org.eclipse.papyrus-8635dc717f7d6caecb4fb197c181e554fd347e69.tar.xz org.eclipse.papyrus-8635dc717f7d6caecb4fb197c181e554fd347e69.zip |
NEW - bug 318563: [Generative Tools] Modify generation of too large method xxxItemSemanticEditPolicy::addDestroyChildNodesCommand
https://bugs.eclipse.org/bugs/show_bug.cgi?id=318563
Diffstat (limited to 'plugins/developer/org.eclipse.papyrus.def')
-rw-r--r-- | plugins/developer/org.eclipse.papyrus.def/dynamic-templates3.5/codegen/xpt/diagram/editpolicies/NodeItemSemanticEditPolicy.xpt | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/plugins/developer/org.eclipse.papyrus.def/dynamic-templates3.5/codegen/xpt/diagram/editpolicies/NodeItemSemanticEditPolicy.xpt b/plugins/developer/org.eclipse.papyrus.def/dynamic-templates3.5/codegen/xpt/diagram/editpolicies/NodeItemSemanticEditPolicy.xpt new file mode 100644 index 00000000000..0198af1f479 --- /dev/null +++ b/plugins/developer/org.eclipse.papyrus.def/dynamic-templates3.5/codegen/xpt/diagram/editpolicies/NodeItemSemanticEditPolicy.xpt @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2007, 2010 Borland Software 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: + * Alexander Shatalin (Borland) - initial API and implementation + * Artem Tikhomirov (Borland) - [257632] do not rely on EditPart presence for element deletion + */ + +«REM» + This template should be called only for non-design nodes (modelFacet != null) + because *ItemSemanticEditPolicy responsible for dealing with semantic model + elements and meaningless (should not be generated) for pure design nodes. +«ENDREM» + +«IMPORT 'http://www.eclipse.org/gmf/2009/GenModel'» + +«EXTENSION xpt::diagram::editpolicies::Utils» + +«DEFINE NodeItemSemanticEditPolicy FOR gmfgen::GenNode-» + «EXPAND xpt::Common::copyright FOR getDiagram().editorGen-» +package «getDiagram().editPoliciesPackageName»; + +«EXPAND xpt::Common::generatedClassComment» +public class «itemSemanticEditPolicyClassName» extends «getDiagram().getBaseItemSemanticEditPolicyQualifiedClassName()» { + + «EXPAND xpt::diagram::editpolicies::BaseItemSemanticEditPolicy::defaultConstructor-» + + «EXPAND xpt::diagram::editpolicies::childContainerCreateCommand::childContainerCreateCommand FOR childNodes->asSequence()-» + + «EXPAND getDestroyElementCommand-» + «IF hasChildrenOrCompartments(self)-» + «EXPAND addDestroyChildNodesCommand-» + «ENDIF-» + «EXPAND xpt::diagram::editpolicies::linkCommands::linkCommands-» + + «EXPAND additions-» +} +«ENDDEFINE» + +«DEFINE getDestroyElementCommand FOR gmfgen::GenNode-» +«EXPAND xpt::Common::generatedMemberComment» +protected org.eclipse.gef.commands.Command getDestroyElementCommand(org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest req) { + org.eclipse.gmf.runtime.notation.View view = (org.eclipse.gmf.runtime.notation.View) getHost().getModel(); + org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand cmd = new org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand(getEditingDomain(), null); + cmd.setTransactionNestingEnabled(false); + «EXPAND destroyEdges('view')-» + org.eclipse.emf.ecore.EAnnotation annotation = view.getEAnnotation("Shortcut");«EXPAND xpt::Common::nonNLS» + if (annotation == null) { + // there are indirectly referenced children, need extra commands: «childNodes->union(compartments.childNodes->asBag())->exists(not isDirectlyOwned(self))» +«IF hasChildrenOrCompartments(self)-» + addDestroyChildNodesCommand(cmd); +«ENDIF-» + addDestroyShortcutsCommand(cmd, view); + // delete host element + cmd.add(new org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand(req)); + } else {«REM»Here, we may play smart and don't generate else for non-toplevel nodes(which can't be shortcuts). Is it worth doing?«ENDREM» + cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), view)); + } + return getGEFWrapper(cmd.reduce()); +} +«ENDDEFINE» + +«DEFINE addDestroyChildNodesCommand FOR gmfgen::GenNode-» + + «EXPAND xpt::Common::generatedMemberComment» + protected void addDestroyChildNodesCommand(org.eclipse.gmf.runtime.common.core.command.ICompositeCommand cmd) { + org.eclipse.gmf.runtime.notation.View view = (org.eclipse.gmf.runtime.notation.View) getHost().getModel(); + for («EXPAND CodeStyle::G('java.util.Iterator', '?' /*FIXME Refactor once Notation model is Java5*/)» nit = view.getChildren().iterator(); nit.hasNext();) { + org.eclipse.gmf.runtime.notation.Node node = (org.eclipse.gmf.runtime.notation.Node) nit.next(); + switch («EXPAND xpt::editor::VisualIDRegistry::getVisualIDMethodCall FOR getDiagram()»(node)) { + «EXPAND destroyChildNodes('node', self) FOREACH childNodes-» + «IF compartments->notEmpty()»«FOREACH compartments AS compartment-» + «EXPAND xpt::Common::caseVisualID FOR compartment» + for («EXPAND CodeStyle::G('java.util.Iterator', '?' /*FIXME Refactor once Notation model is Java5*/)» cit = node.getChildren().iterator(); cit.hasNext();) { + org.eclipse.gmf.runtime.notation.Node cnode = (org.eclipse.gmf.runtime.notation.Node) cit.next(); + switch («EXPAND xpt::editor::VisualIDRegistry::getVisualIDMethodCall FOR getDiagram()»(cnode)) { + «EXPAND destroyChildNodes('cnode', self) FOREACH compartment.childNodes-» + } + } + break; + «ENDFOREACH»«ENDIF-» + } + } + } +«ENDDEFINE» + +«DEFINE destroyChildNodes(nodeVar : String, gmfgen::GenNode genNode) FOR gmfgen::GenChildNode-» +«EXPAND xpt::Common::caseVisualID» + «EXPAND destroyEdges(nodeVar)-» + cmd.add(new org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand(new org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest(getEditingDomain(), «nodeVar».getElement(), false))); // directlyOwned: «self.isDirectlyOwned(genNode)» + // don't need explicit deletion of «nodeVar» as parent's view deletion would clean child views as well + // cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), «nodeVar»)); + break; +«ENDDEFINE» + +// @param view - Notation element for the passed node +// assumes 'cmd' to point to composite command +«DEFINE destroyEdges(String view) FOR gmfgen::GenNode-» +«REM» + XXX: Though semantic editpolicy is supposed to create commands that operate with semantic elements only, + old code used to delegate child/link deletion to respective editparts, which in turn led to semantic commands + being combined with notational commands (BaseItemSemanticEditPolicy#addDeleteViewCommand()). + --- + Use DiagramUpdater.get[Incoming|Outgoing]View instead, to clean links that are not present on a diagram + (but don't forget to clean corresponding Edge, if any) +«ENDREM-» + +«REM» + +// This part is commented for Papyrus +// Some Papyrus diagrams with lots of elements are reaching the 65K Java limit for method size. +// The following change is not supposed to modify the method behavior, just propose a slight more +// compact code to avoid size limit. + +«IF genIncomingLinks->notEmpty()-» + for («EXPAND CodeStyle::G('java.util.Iterator', '?' /*FIXME Refactor once Notation model is Java5*/)» it = «view».getTargetEdges().iterator(); it.hasNext();) { + org.eclipse.gmf.runtime.notation.Edge incomingLink = (org.eclipse.gmf.runtime.notation.Edge) it.next(); +«FOREACH genIncomingLinks AS il-» + if («EXPAND xpt::editor::VisualIDRegistry::getVisualIDMethodCall FOR getDiagram()»(incomingLink) == «EXPAND xpt::editor::VisualIDRegistry::visualID FOR il») { + «EXPAND impl::diagram::commands::DeleteLinkCommand::newRequest('r', 'incomingLink') FOR il-» + cmd.add(«EXPAND impl::diagram::commands::DeleteLinkCommand::newInstance('r') FOR il»); + cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), incomingLink)); + continue; + } +«ENDFOREACH-» + } +«ENDIF-» +«IF genOutgoingLinks->notEmpty()-» + for («EXPAND CodeStyle::G('java.util.Iterator', '?' /*FIXME Refactor once Notation model is Java5*/)» it = «view».getSourceEdges().iterator(); it.hasNext();) { + org.eclipse.gmf.runtime.notation.Edge outgoingLink = (org.eclipse.gmf.runtime.notation.Edge) it.next(); +«FOREACH genOutgoingLinks AS ol-» + if («EXPAND xpt::editor::VisualIDRegistry::getVisualIDMethodCall FOR getDiagram()»(outgoingLink) == «EXPAND xpt::editor::VisualIDRegistry::visualID FOR ol») { + «EXPAND impl::diagram::commands::DeleteLinkCommand::newRequest('r', 'outgoingLink') FOR ol-» + cmd.add(«EXPAND impl::diagram::commands::DeleteLinkCommand::newInstance('r') FOR ol»); + cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), outgoingLink)); + continue; + } +«ENDFOREACH-» + } +«ENDIF-» +«ENDREM-» + +«IF genIncomingLinks->notEmpty()-» + for («EXPAND CodeStyle::G('java.util.Iterator', '?' /*FIXME Refactor once Notation model is Java5*/)» it = «view».getTargetEdges().iterator(); it.hasNext();) { + org.eclipse.gmf.runtime.notation.Edge incomingLink = (org.eclipse.gmf.runtime.notation.Edge) it.next(); + switch(«EXPAND xpt::editor::VisualIDRegistry::getVisualIDMethodCall FOR getDiagram()»(incomingLink)) { +«IF genIncomingLinks->select(l | l.modelFacet.oclIsKindOf(gmfgen::FeatureLinkModelFacet))->notEmpty()-» +«FOREACH genIncomingLinks->select(l | l.modelFacet.oclIsKindOf(gmfgen::FeatureLinkModelFacet)) AS il-» + case «EXPAND xpt::editor::VisualIDRegistry::visualID FOR il»: +«ENDFOREACH-» + org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest destroyRefReq = new org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest(incomingLink.getSource().getElement(), null, incomingLink.getTarget().getElement(), false); + cmd.add(new org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand(destroyRefReq)); + cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), incomingLink)); + break; +«ENDIF-» +«IF genIncomingLinks->select(l | l.modelFacet.oclIsKindOf(gmfgen::TypeLinkModelFacet))->notEmpty()-» +«FOREACH genIncomingLinks->select(l | l.modelFacet.oclIsKindOf(gmfgen::TypeLinkModelFacet)) AS il-» + case «EXPAND xpt::editor::VisualIDRegistry::visualID FOR il»: +«ENDFOREACH-» + org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest destroyEltReq = new org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest(incomingLink.getElement(), false); + cmd.add(new org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand(destroyEltReq)); + cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), incomingLink)); + break; +«ENDIF-» + } + } +«ENDIF-» + +«IF genOutgoingLinks->notEmpty()-» + for («EXPAND CodeStyle::G('java.util.Iterator', '?' /*FIXME Refactor once Notation model is Java5*/)» it = «view».getSourceEdges().iterator(); it.hasNext();) { + org.eclipse.gmf.runtime.notation.Edge outgoingLink = (org.eclipse.gmf.runtime.notation.Edge) it.next(); + switch(«EXPAND xpt::editor::VisualIDRegistry::getVisualIDMethodCall FOR getDiagram()»(outgoingLink)) { +«IF genOutgoingLinks->select(l | l.modelFacet.oclIsKindOf(gmfgen::FeatureLinkModelFacet))->notEmpty()-» +«FOREACH genOutgoingLinks->select(l | l.modelFacet.oclIsKindOf(gmfgen::FeatureLinkModelFacet)) AS ol-» + case «EXPAND xpt::editor::VisualIDRegistry::visualID FOR ol»: +«ENDFOREACH-» + org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest destroyRefReq = new org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest(outgoingLink.getSource().getElement(), null, outgoingLink.getTarget().getElement(), false); + cmd.add(new org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand(destroyRefReq)); + cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), outgoingLink)); + break; +«ENDIF-» +«IF genOutgoingLinks->select(l | l.modelFacet.oclIsKindOf(gmfgen::TypeLinkModelFacet))->notEmpty()-» +«FOREACH genOutgoingLinks->select(l | l.modelFacet.oclIsKindOf(gmfgen::TypeLinkModelFacet)) AS ol-» + case «EXPAND xpt::editor::VisualIDRegistry::visualID FOR ol»: +«ENDFOREACH-» + org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest destroyEltReq = new org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest(outgoingLink.getElement(), false); + cmd.add(new org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand(destroyEltReq)); + cmd.add(new org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand(getEditingDomain(), outgoingLink)); + break; +«ENDIF-» + } + } +«ENDIF-» +«ENDDEFINE» + +«DEFINE additions FOR gmfgen::GenNode»«ENDDEFINE» |