| /** |
| * |
| */ |
| package org.eclipse.epf.diagramming.base.commands; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import org.eclipse.core.commands.ExecutionException; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.emf.common.command.Command; |
| import org.eclipse.emf.common.command.CompoundCommand; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.emf.edit.command.CopyCommand.Helper; |
| import org.eclipse.emf.transaction.Transaction; |
| import org.eclipse.emf.transaction.TransactionalEditingDomain; |
| import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain; |
| import org.eclipse.epf.diagramming.base.persistence.DiagramFileCreatorEx; |
| import org.eclipse.epf.diagramming.base.persistence.DiagramService; |
| import org.eclipse.epf.diagramming.base.persistence.IDiagramService; |
| import org.eclipse.epf.diagramming.base.util.DiagramEditorUtil; |
| import org.eclipse.epf.library.edit.command.INestedCommandProvider; |
| import org.eclipse.epf.library.edit.process.command.ActivityDropCommand; |
| import org.eclipse.epf.library.edit.process.command.OBSDropCommand; |
| import org.eclipse.epf.library.edit.process.command.PBSDropCommand; |
| import org.eclipse.epf.library.edit.process.command.WBSDropCommand; |
| import org.eclipse.epf.library.edit.ui.IActionTypeProvider; |
| import org.eclipse.epf.uma.Activity; |
| import org.eclipse.epf.uma.TaskDescriptor; |
| import org.eclipse.gmf.runtime.common.core.command.CommandResult; |
| import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand; |
| import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory; |
| import org.eclipse.gmf.runtime.notation.Diagram; |
| import org.eclipse.swt.widgets.Display; |
| |
| /** |
| * @author Shashidhar Kannoori |
| * |
| */ |
| public class NestedCommandProvider implements INestedCommandProvider { |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.epf.library.edit.command.INestedCommandProvider#createNestedCommand(org.eclipse.emf.common.command.Command) |
| */ |
| public Command createNestedCommand(Command command) { |
| |
| if(command instanceof ActivityDropCommand){ |
| ActivityDropCommand dropcommand = (ActivityDropCommand)command; |
| if(dropcommand.getActivityHandler() == null) return null; |
| if(IActionTypeProvider.COPY != dropcommand.getType()) |
| return null; |
| // TODO : Handle for deepcopy and copying different diagrams. |
| // if(IActionTypeProvider.DEEP_COPY == dropcommand.getType() |
| // &&!dropcommand.getActivityHandler().getDeepCopies().isEmpty()){ |
| // List list = dropcommand.getActivityHandler().getDeepCopies(); |
| // for (Iterator iter = list.iterator(); iter.hasNext();) { |
| // Activity copyAct = (Activity) iter.next(); |
| // Activity origAct = (Activity)dropcommand.getActivityHandler() |
| // .getDeepCopyToOriginalMap().get(copyAct); |
| // } |
| // } |
| |
| Helper copiedHelper = dropcommand.getActivityHandler().getCopyHelper(); |
| Set keys = copiedHelper.keySet(); |
| |
| InternalTransactionalEditingDomain editingDomain = (InternalTransactionalEditingDomain)GMFEditingDomainFactory.INSTANCE |
| .createEditingDomain(); |
| Resource resource = getResource(dropcommand, editingDomain); |
| CompoundCommand compoundCommand = new CompoundCommand(CompoundCommand.MERGE_COMMAND_ALL); |
| |
| for (Iterator iter = keys.iterator(); iter.hasNext();) { |
| EObject key = (EObject) iter.next(); |
| EObject entry = (EObject)copiedHelper.get(key); |
| if(entry instanceof Activity && key instanceof Activity){ |
| Activity act = (Activity)entry; |
| //TODO: Handle different diagrams. |
| Diagram diagram = IDiagramService.eInstance.getDiagram((Activity)key, DiagramService.AD_kind, |
| false, new NullProgressMonitor()); |
| if(diagram != null){ |
| DiagramCopyCommand dcc = new DiagramCopyCommand(editingDomain, |
| diagram, (Activity)key, act, resource, copiedHelper); |
| compoundCommand.append(dcc); |
| } |
| } |
| } |
| if(!compoundCommand.isEmpty()){ |
| return compoundCommand; |
| } |
| } |
| |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.epf.library.edit.command.INestedCommandProvider#createRelatedObjects(java.util.Collection, org.eclipse.emf.common.command.Command) |
| */ |
| public Command createRelatedObjects(Collection createdElements, |
| Command createCommand) { |
| if(createCommand instanceof WBSDropCommand |
| || createCommand instanceof OBSDropCommand |
| || createCommand instanceof PBSDropCommand){ |
| Collection taskCollection = new ArrayList(); |
| for (Iterator iter = taskCollection.iterator(); iter.hasNext();) { |
| Object e = (Object) iter.next(); |
| if(e instanceof TaskDescriptor){ |
| taskCollection.add(e); |
| } |
| } |
| if(taskCollection != null){ |
| // InternalTransactionalEditingDomain domain = |
| // (InternalTransactionalEditingDomain)GMFEditingDomainFactory.getInstance().createEditingDomain(); |
| //return new CopyNodeCommand() |
| } |
| } |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.epf.library.edit.command.INestedCommandProvider#removeRelatedObjects(java.util.Collection, org.eclipse.emf.common.command.Command) |
| */ |
| public Command removeRelatedObjects(Collection deletedElements, |
| Command deleteCommand) { |
| // TODO Auto-generated method stub |
| return null; |
| } |
| |
| private Resource getResource(ActivityDropCommand dropcommand, |
| InternalTransactionalEditingDomain editingDomain){ |
| |
| Map options = new HashMap(); |
| options.put(Transaction.OPTION_NO_NOTIFICATIONS, Boolean.TRUE); |
| Activity p = dropcommand.getActivity(); |
| IFile file = DiagramEditorUtil.getFile(DiagramEditorUtil.default_file_name, |
| p, DiagramFileCreatorEx.getInstance()); |
| if(file == null){ |
| file = DiagramEditorUtil.createNewDiagramFile(DiagramFileCreatorEx.getInstance(), |
| p, Display.getCurrent().getActiveShell(), |
| new NullProgressMonitor()); |
| } |
| ResourceSet resourceSet = editingDomain.getResourceSet(); |
| final Resource diagramResource = resourceSet |
| .createResource(URI.createPlatformResourceURI(file |
| .getFullPath().toString())); |
| //affectedFiles.add(file); |
| //editingDomain.startTransaction(false, options); |
| return diagramResource; |
| } |
| |
| private class UpdateResource extends AbstractTransactionalCommand { |
| |
| private Helper copyHelper; |
| private Resource resource; |
| |
| public UpdateResource(TransactionalEditingDomain |
| domain, String label, List affectedFiles, Helper copyHelper, Map options, |
| Resource resource){ |
| super(domain, label, options, affectedFiles); |
| this.copyHelper = copyHelper; |
| this.resource = resource; |
| } |
| |
| protected CommandResult doExecuteWithResult(IProgressMonitor monitor, |
| IAdaptable info) throws ExecutionException { |
| |
| |
| // Need to move this code to different place. |
| Set xKeys = copyHelper.keySet(); |
| for (Iterator iter = xKeys.iterator(); iter.hasNext();) { |
| EObject element = (EObject) iter.next(); |
| EObject copy = (EObject)copyHelper.get(element); |
| if(element instanceof Diagram || element instanceof org.eclipse.uml2.uml.Activity){ |
| resource.getContents().add(((Diagram)copy).getElement()); |
| resource.getContents().add(copy); |
| } |
| } |
| try{ |
| resource.save(Collections.EMPTY_MAP); |
| }catch(Exception e){ |
| e.printStackTrace(); |
| } |
| return CommandResult.newOKCommandResult(); |
| } |
| |
| }; |
| |
| } |