/* * Copyright (c) 2006 Eclipse.org * * 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 - initial API and implementation */ package org.eclipse.gmf.internal.bridge.wizards.pages.simple; import java.util.Iterator; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.gmf.internal.bridge.wizards.WizardUtil; import org.eclipse.gmf.internal.bridge.wizards.pages.simple.ResolvedItem.Resolution; import org.eclipse.gmf.internal.common.IncrementalNamesDispenser; import org.eclipse.gmf.internal.common.NamesDispenser; import org.eclipse.gmf.tooldef.AbstractTool; import org.eclipse.gmf.tooldef.CreationTool; import org.eclipse.gmf.tooldef.GMFToolFactory; import org.eclipse.gmf.tooldef.GMFToolPackage; import org.eclipse.gmf.tooldef.Palette; import org.eclipse.gmf.tooldef.ToolGroup; import org.eclipse.gmf.tooldef.ToolRegistry; /** * @author dstadnik */ public class ToolDefBuilder { protected final ToolRegistry existingToolRegistry; protected GMFToolFactory gmfToolFactory = GMFToolPackage.eINSTANCE.getGMFToolFactory(); protected NamesDispenser namesDispenser = new IncrementalNamesDispenser(); protected ToolRegistry toolRegistry; protected ToolGroup group; public ToolDefBuilder(ToolRegistry existingToolRegistry) { this.existingToolRegistry = existingToolRegistry; } public static CreationTool getCreationTool(Iterator<EObject> source, EObject domainElement) { String name = WizardUtil.getCapName(domainElement); if (name == null) { return null; } return getCreationTool(source, name); } public static CreationTool getCreationTool(Iterator<EObject> source, String domainObjectName) { while (source.hasNext()) { Object next = source.next(); if (next instanceof CreationTool && domainObjectName.equals(((CreationTool) next).getTitle())) { return (CreationTool) next; } } return null; } protected String getUniqueName(String semanticPart) { return namesDispenser.get(semanticPart); } protected String getUniqueName(String semanticPart, String suffixPart) { return namesDispenser.get(semanticPart, suffixPart); } protected void addExistingName(String name) { if (name != null) { namesDispenser.add(name); } } protected void addExistingNames(ToolRegistry toolRegistry) { for (Iterator<EObject> it = toolRegistry.eAllContents(); it.hasNext();) { EObject next = it.next(); if (next instanceof AbstractTool) { addExistingName(((AbstractTool) next).getTitle()); } } } @SuppressWarnings("unchecked") public ToolRegistry process(ResolvedItem item) { if (existingToolRegistry == null) { toolRegistry = gmfToolFactory.createToolRegistry(); } else { toolRegistry = existingToolRegistry; addExistingNames(existingToolRegistry); } if (item != null) { EPackage ePackage = (EPackage) item.getDomainRef(); Palette palette = toolRegistry.getPalette(); if (palette == null) { palette = gmfToolFactory.createPalette(); palette.setTitle(getUniqueName(ePackage.getName(), Messages.ToolDefBuilder1)); toolRegistry.setPalette(palette); } group = null; for (Object tool : palette.getTools()) { if (tool instanceof ToolGroup) { group = (ToolGroup) tool; break; } } if (group == null) { group = gmfToolFactory.createToolGroup(); group.setTitle(getUniqueName(ePackage.getName())); palette.getTools().add(group); } for (ResolvedItem child : item.getChildren()) { processContents(child); } } return toolRegistry; } protected void processContents(ResolvedItem item) { if (!item.isDisabled() && (item.getResolution() == Resolution.NODE || item.getResolution() == Resolution.LINK)) { String baseName = null; if (item.getDomainRef() instanceof EClass) { baseName = WizardUtil.getCapName((EClass) item.getDomainRef()); } else if (item.getDomainRef() instanceof EReference) { baseName = WizardUtil.getCapName((EReference) item.getDomainRef()); } if (baseName != null && baseName.length() > 0) { addCreationTool(baseName); } } for (ResolvedItem child : item.getChildren()) { processContents(child); } } @SuppressWarnings("unchecked") protected CreationTool addCreationTool(String baseName) { CreationTool tool = gmfToolFactory.createCreationTool(); tool.setTitle(getUniqueName(baseName)); tool.setDescription(Messages.bind(Messages.ToolDefBuilder0, baseName)); tool.setSmallIcon(gmfToolFactory.createDefaultImage()); tool.setLargeIcon(gmfToolFactory.createDefaultImage()); group.getTools().add(tool); return tool; } }