//------------------------------------------------------------------------------ // Copyright (c) 2005, 2007 IBM 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: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.diagram.ad.commands; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import org.eclipse.emf.common.util.WrappedException; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNode2EditPart; import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeEditPart; import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeName2EditPart; import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeNameEditPart; import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode2EditPart; import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode3EditPart; import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeEditPart; import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName2EditPart; import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName3EditPart; import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeNameEditPart; import org.eclipse.epf.diagram.core.DiagramCorePlugin; import org.eclipse.epf.diagram.core.bridge.BridgeHelper; import org.eclipse.epf.diagram.model.util.TxUtil; import org.eclipse.epf.library.edit.command.IResourceAwareCommand; import org.eclipse.gmf.runtime.notation.View; /** * @author Phong Nguyen Le * @since 1.2 */ public class SetTypeCommand extends org.eclipse.emf.common.command.AbstractCommand implements IResourceAwareCommand { private Map<EModelElement, String> elementToNewTypeMap = new HashMap<EModelElement, String>(); private Map<EModelElement, String> elementToOldTypeMap; private Map<View, String> viewToNewTypeMap = new HashMap<View, String>(); private Map<View, String> viewToOldTypeMap; public Collection<Resource> getModifiedResources() { HashSet<Resource> modifiedResources = new HashSet<Resource>(); for (EModelElement e : elementToNewTypeMap.keySet()) { Resource resource = e.eResource(); if(resource != null) { modifiedResources.add(resource); } } return modifiedResources; } public void execute() { if(elementToOldTypeMap == null) { elementToOldTypeMap = new HashMap<EModelElement, String>(); } else { elementToOldTypeMap.clear(); } for (Map.Entry<EModelElement, String> entry : elementToNewTypeMap.entrySet()) { final EModelElement e = entry.getKey(); final String type = entry.getValue(); try { String oldType = BridgeHelper.getEAnnotationDetail(e, BridgeHelper.UMA_TYPE); TxUtil.runInTransaction(e, new Runnable() { public void run() { BridgeHelper.addEAnnotationType(e, type); } }); elementToOldTypeMap.put(e, oldType); } catch (Exception ex) { DiagramCorePlugin.getDefault().getLogger().logError(ex); throw new WrappedException(ex); } } if(!viewToNewTypeMap.isEmpty()) { if(viewToOldTypeMap == null) { viewToOldTypeMap = new HashMap<View, String>(); } else { viewToOldTypeMap.clear(); } for (Map.Entry<View, String> entry : viewToNewTypeMap.entrySet()) { final View view = entry.getKey(); final String newType = entry.getValue(); final String oldType = view.getType(); try { TxUtil.runInTransaction(view, new Runnable() { public void run() { String newNameType = String.valueOf(getViewNameType(Integer.parseInt(newType))); String oldNameType = String.valueOf(getViewNameType(Integer.parseInt(oldType))); view.setType(newType); // set new type for node names // for (Iterator iterator = view.getChildren().iterator(); iterator .hasNext();) { View child = (View) iterator.next(); if(child.getType().equals(oldNameType)) { child.setType(newNameType); } } } }); viewToOldTypeMap.put(view, oldType); } catch (Exception e) { DiagramCorePlugin.getDefault().getLogger().logError(e); throw new WrappedException(e); } } } } @Override public void undo() { if (elementToOldTypeMap != null && !elementToOldTypeMap.isEmpty()) { for (Map.Entry<EModelElement, String> entry : elementToOldTypeMap .entrySet()) { final EModelElement e = entry.getKey(); final String type = entry.getValue(); try { TxUtil.runInTransaction(e, new Runnable() { public void run() { BridgeHelper.addEAnnotationType(e, type); } }); } catch (Exception ex) { DiagramCorePlugin.getDefault().getLogger().logError(ex); throw new WrappedException(ex); } } elementToOldTypeMap.clear(); } if(viewToOldTypeMap != null && !viewToOldTypeMap.isEmpty()) { for (Map.Entry<View, String> entry : viewToOldTypeMap.entrySet()) { final View view = entry.getKey(); final String oldType = entry.getValue(); try { TxUtil.runInTransaction(view, new Runnable() { public void run() { String newNameType = String.valueOf(getViewNameType(Integer.parseInt(view.getType()))); String oldNameType = String.valueOf(getViewNameType(Integer.parseInt(oldType))); view.setType(oldType); // restore old type for node names // for (Iterator iterator = view.getChildren().iterator(); iterator .hasNext();) { View child = (View) iterator.next(); if(child.getType().equals(newNameType)) { child.setType(oldNameType); } } } }); } catch (Exception e) { DiagramCorePlugin.getDefault().getLogger().logError(e); throw new WrappedException(e); } } viewToOldTypeMap.clear(); } } public void redo() { execute(); } @Override protected boolean prepare() { return !elementToNewTypeMap.isEmpty(); } public void prepare(View view, EModelElement e, String type) { elementToNewTypeMap.put(e, type); int viewType = getViewType(type); if(viewType != -1) { viewToNewTypeMap .put(view, String.valueOf(viewType)); } } @Override public void dispose() { if(elementToNewTypeMap != null) { elementToNewTypeMap.clear(); } if(elementToOldTypeMap != null) { elementToOldTypeMap.clear(); } if(viewToNewTypeMap != null) { viewToNewTypeMap.clear(); } if(viewToOldTypeMap != null) { viewToOldTypeMap.clear(); } } public static int getViewType(String elementType) { if(BridgeHelper.UMA_ACTIVITY.equals(elementType)) { return StructuredActivityNodeEditPart.VISUAL_ID; } else if(BridgeHelper.UMA_PHASE.equals(elementType)) { return StructuredActivityNode2EditPart.VISUAL_ID; } else if(BridgeHelper.UMA_ITERATION.equals(elementType)) { return StructuredActivityNode3EditPart.VISUAL_ID; } else if(BridgeHelper.UMA_MILESTONE.equals(elementType)) { return ActivityParameterNode2EditPart.VISUAL_ID; } else if(BridgeHelper.UMA_TASK_DESCRIPTOR.equals(elementType)) { return ActivityParameterNodeEditPart.VISUAL_ID; } return -1; } public static int getViewNameType(int viewType) { switch(viewType) { case StructuredActivityNodeEditPart.VISUAL_ID: return StructuredActivityNodeNameEditPart.VISUAL_ID; case StructuredActivityNode2EditPart.VISUAL_ID: return StructuredActivityNodeName2EditPart.VISUAL_ID; case StructuredActivityNode3EditPart.VISUAL_ID: return StructuredActivityNodeName3EditPart.VISUAL_ID; case ActivityParameterNodeEditPart.VISUAL_ID: return ActivityParameterNodeNameEditPart.VISUAL_ID; case ActivityParameterNode2EditPart.VISUAL_ID: return ActivityParameterNodeName2EditPart.VISUAL_ID; } return -1; } }