/*
* Copyright (c) 2007 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:
* Dmitry Stadnik (Borland) - initial API and implementation
*/
package org.eclipse.gmf.internal.bridge.naming.gen;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage;
import org.eclipse.gmf.codegen.gmfgen.GenChildContainer;
import org.eclipse.gmf.codegen.gmfgen.GenCommonBase;
import org.eclipse.gmf.codegen.gmfgen.GenCompartment;
import org.eclipse.gmf.codegen.gmfgen.GenContainerBase;
import org.eclipse.gmf.codegen.gmfgen.GenDiagram;
import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator;
import org.eclipse.gmf.codegen.gmfgen.GenLabel;
import org.eclipse.gmf.codegen.gmfgen.GenLink;
import org.eclipse.gmf.codegen.gmfgen.GenNode;
import org.eclipse.gmf.codegen.gmfgen.MetamodelType;
import org.eclipse.gmf.codegen.gmfgen.SpecializationType;
import org.eclipse.gmf.internal.bridge.naming.ClassGenNamingStrategy;
import org.eclipse.gmf.internal.bridge.naming.DefaultGenNamingStrategy;
import org.eclipse.gmf.internal.bridge.naming.DesignGenNamingStrategy;
import org.eclipse.gmf.internal.bridge.naming.GenNamingStrategy;
import org.eclipse.gmf.internal.common.IncrementalNamesDispenser;
import org.eclipse.gmf.internal.common.NamesDispenser;
/**
* @author dstadnik
*/
public class GenNamingMediatorImpl implements GenNamingMediator {
public enum Mode {
COLLECT_NAMES,
DISPENSE_NAMES
}
private final GMFGenPackage M = GMFGenPackage.eINSTANCE;
private Mode mode;
private NamesDispenser dispenser;
private GenNamingStrategy viewFactory;
private GenNamingStrategy editPart;
private GenNamingStrategy itemSemanticPolicy;
private GenNamingStrategy canonicalPolicy;
private GenNamingStrategy nodeGraphicalPolicy;
private GenNamingStrategy editHelper;
private GenNamingStrategy editHelperAdvice;
private GenNamingStrategy linkCreateCommand;
private GenNamingStrategy nodeCreateCommand;
private GenNamingStrategy linkReorientCommand;
public GenNamingMediatorImpl() {
this(new IncrementalNamesDispenser());
}
public GenNamingMediatorImpl(NamesDispenser dispenser) {
this.dispenser = dispenser;
mode = Mode.DISPENSE_NAMES;
setViewFactory(createNamingStrategy(GenCommonBase.NOTATION_VIEW_FACTORY_SUFFIX));
setEditPart(createNamingStrategy(GenCommonBase.EDIT_PART_SUFFIX));
setItemSemanticPolicy(createNamingStrategy(GenCommonBase.ITEM_SEMANTIC_EDIT_POLICY_SUFFIX));
setCanonicalPolicy(createNamingStrategy(GenChildContainer.CANONICAL_EDIT_POLICY_SUFFIX));
setNodeGraphicalPolicy(createNamingStrategy(GenNode.GRAPHICAL_NODE_EDIT_POLICY_SUFFIX));
setEditHelper(createNamingStrategy(MetamodelType.EDIT_HELPER_SUFFIX));
setEditHelperAdvice(createNamingStrategy(SpecializationType.EDIT_HELPER_ADVICE_SUFFIX));
setLinkCreateCommand(createNamingStrategy(GenLink.CREATE_COMMAND_SUFFIX));
setNodeCreateCommand(createNamingStrategy(GenNode.CREATE_COMMAND_SUFFIX));
setLinkReorientCommand(createNamingStrategy(GenLink.REORIENT_COMMAND_SUFFIX));
}
protected GenNamingStrategy createNamingStrategy(String suffixPart) {
// prefix stack
GenNamingStrategy pns = new DefaultGenNamingStrategy(null, null, null, null);
pns = new DesignGenNamingStrategy(null, null, pns, null);
pns = new ClassGenNamingStrategy(null, null, pns, null);
// primary stack
GenNamingStrategy ns = new DefaultGenNamingStrategy(suffixPart, dispenser, null, pns);
ns = new DesignGenNamingStrategy(suffixPart, dispenser, ns, pns);
ns = new ClassGenNamingStrategy(suffixPart, dispenser, ns, pns);
return ns;
}
public void reset() {
if (dispenser != null) {
dispenser.clear();
}
}
public final Mode getMode() {
return mode;
}
public void setMode(Mode mode) {
this.mode = mode;
}
protected void feedName(EObject element, EAttribute feature, GenNamingStrategy strategy, EObject refElement) {
switch (getMode()) {
case COLLECT_NAMES:
if (element.eIsSet(feature)) {
dispenser.add((String) element.eGet(feature));
}
break;
case DISPENSE_NAMES:
if (!element.eIsSet(feature)) {
element.eSet(feature, getName(refElement, strategy));
}
break;
}
}
protected void feedName(EObject element, EAttribute feature, GenNamingStrategy strategy) {
feedName(element, feature, strategy, element);
}
public void feed(GenDiagram element) {
dispenser.add(element.getBaseExternalNodeLabelEditPartClassName());
dispenser.add(element.getBaseItemSemanticEditPolicyClassName());
dispenser.add(element.getBaseGraphicalNodeEditPolicyClassName());
dispenser.add(element.getBaseEditHelperClassName());
feedContainer(element);
}
public void feed(GenNode element) {
feedContainer(element);
feedName(element, M.getGenNode_GraphicalNodeEditPolicyClassName(), getNodeGraphicalPolicy());
feedName(element, M.getGenNode_CreateCommandClassName(), getNodeCreateCommand());
}
public void feed(GenCompartment element) {
feedContainer(element);
}
public void feed(GenLink element) {
feedCommon(element);
feedName(element, M.getGenLink_CreateCommandClassName(), getLinkCreateCommand());
feedName(element, M.getGenLink_ReorientCommandClassName(), getLinkReorientCommand());
}
public void feed(GenLabel element) {
feedCommon(element);
}
protected void feedContainer(GenContainerBase element) {
feedCommon(element);
feedName(element, M.getGenContainerBase_CanonicalEditPolicyClassName(), getCanonicalPolicy());
}
protected void feedCommon(GenCommonBase element) {
feedName(element, M.getGenCommonBase_EditPartClassName(), getEditPart());
feedName(element, M.getGenCommonBase_ItemSemanticEditPolicyClassName(), getItemSemanticPolicy());
if (element.getElementType() instanceof MetamodelType) {
MetamodelType type = (MetamodelType) element.getElementType();
feedName(type, M.getMetamodelType_EditHelperClassName(), getEditHelper(), element);
// } else if (element.getElementType() instanceof SpecializationType) {
// /*
// * Uncoment once we generate anything reasonable in the advice's body;
// * otherwise no reason to generate empty class
// */
// SpecializationType type = (SpecializationType) element.getElementType();
// feedName(type, M.getSpecializationType_EditHelperAdviceClassName(), getEditHelperAdvice(), element);
}
}
protected String getName(EObject element, GenNamingStrategy strategy) {
if (element instanceof GenDiagram) {
return strategy.get((GenDiagram) element);
} else if (element instanceof GenNode) {
return strategy.get((GenNode) element);
} else if (element instanceof GenCompartment) {
return strategy.get((GenCompartment) element);
} else if (element instanceof GenLink) {
return strategy.get((GenLink) element);
} else if (element instanceof GenLabel) {
return strategy.get((GenLabel) element);
}
throw new IllegalArgumentException();
}
public void traverse(GenEditorGenerator gen) {
GenDiagram diagram = gen.getDiagram();
feed(diagram);
for (GenNode node : diagram.getTopLevelNodes()) {
feed(node);
for (GenLabel label : node.getLabels()) {
feed(label);
}
}
for (GenNode node : diagram.getChildNodes()) {
feed(node);
for (GenLabel label : node.getLabels()) {
feed(label);
}
}
for (GenCompartment node : diagram.getCompartments()) {
feed(node);
}
for (GenLink link : diagram.getLinks()) {
feed(link);
for (GenLabel label : link.getLabels()) {
feed(label);
}
}
}
public GenNamingStrategy getViewFactory() {
return viewFactory;
}
public void setViewFactory(GenNamingStrategy viewFactory) {
this.viewFactory = viewFactory;
}
public GenNamingStrategy getEditPart() {
return editPart;
}
public void setEditPart(GenNamingStrategy editPart) {
this.editPart = editPart;
}
public GenNamingStrategy getItemSemanticPolicy() {
return itemSemanticPolicy;
}
public void setItemSemanticPolicy(GenNamingStrategy itemSemanticPolicy) {
this.itemSemanticPolicy = itemSemanticPolicy;
}
public GenNamingStrategy getCanonicalPolicy() {
return canonicalPolicy;
}
public void setCanonicalPolicy(GenNamingStrategy canonicalPolicy) {
this.canonicalPolicy = canonicalPolicy;
}
public GenNamingStrategy getNodeGraphicalPolicy() {
return nodeGraphicalPolicy;
}
public void setNodeGraphicalPolicy(GenNamingStrategy nodeGraphicalPolicy) {
this.nodeGraphicalPolicy = nodeGraphicalPolicy;
}
public GenNamingStrategy getEditHelper() {
return editHelper;
}
public void setEditHelper(GenNamingStrategy editHelper) {
this.editHelper = editHelper;
}
public GenNamingStrategy getEditHelperAdvice() {
return editHelperAdvice;
}
public void setEditHelperAdvice(GenNamingStrategy editHelperAdvice) {
this.editHelperAdvice = editHelperAdvice;
}
public GenNamingStrategy getLinkCreateCommand() {
return linkCreateCommand;
}
public void setLinkCreateCommand(GenNamingStrategy linkCreateCommand) {
this.linkCreateCommand = linkCreateCommand;
}
public GenNamingStrategy getNodeCreateCommand() {
return nodeCreateCommand;
}
public void setNodeCreateCommand(GenNamingStrategy nodeCreateCommand) {
this.nodeCreateCommand = nodeCreateCommand;
}
public GenNamingStrategy getLinkReorientCommand() {
return linkReorientCommand;
}
public void setLinkReorientCommand(GenNamingStrategy linkReorientCommand) {
this.linkReorientCommand = linkReorientCommand;
}
}