package org.eclipse.uml2.diagram.common.stereo; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.commands.UnexecutableCommand; import org.eclipse.gmf.runtime.common.core.command.CommandResult; import org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction; import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy; import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand; import org.eclipse.gmf.runtime.emf.type.core.requests.AbstractEditCommandRequest; import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.uml2.diagram.common.Messages; import org.eclipse.uml2.uml.Profile; import org.eclipse.uml2.uml.ProfileApplication; public class ApplyProfileAction extends DiagramAction { protected static final String EMPTY_NAME = Messages.ApplyProfileAction_empty_name; protected org.eclipse.uml2.uml.Package myPackage; private Profile myProfile; public ApplyProfileAction(IWorkbenchPage workbenchPage, org.eclipse.uml2.uml.Package package_, Profile profile) { super(workbenchPage); myPackage = package_; myProfile = profile; } @Override protected Request createTargetRequest() { return null; } @Override protected boolean isSelectionListener() { return true; } @Override protected Command getCommand() { DiagramEditPart packageEditPart = getDiagramEditPart(); if (packageEditPart == null) { return UnexecutableCommand.INSTANCE; } TransactionalEditingDomain editingDomain = packageEditPart.getEditingDomain(); IEditCommandRequest request = new AbstractEditCommandRequest(editingDomain) { public Object getEditHelperContext() { // TODO Auto-generated method stub return null; } }; boolean toApply = !isProfileAppliedTo(myPackage, myProfile); if (toApply) { return new ICommandProxy(getApplyProfileCommand(request)); } return new ICommandProxy(new UnapplyProfileCommand(Messages.ApplyProfileAction_unapply_profile_command, myPackage, myProfile, request)); } protected ApplyProfileCommand getApplyProfileCommand(IEditCommandRequest request) { return new ApplyProfileCommand(Messages.ApplyProfileAction_apply_profile_command, myPackage, myProfile, request); } @Override public boolean isEnabled() { return getPackageEditPart() != null; } @Override public void refresh() { super.refresh(); setText(calculateText()); setChecked(calculateChecked()); } protected String calculateText() { String name = myProfile.getLabel(); return name != null ? name : EMPTY_NAME; } protected boolean calculateChecked() { return isProfileAppliedTo(myPackage, myProfile); } private DiagramEditPart getPackageEditPart() { for (Object next : getSelectedObjects()) { if (next instanceof DiagramEditPart) { DiagramEditPart packageEditPart = (DiagramEditPart) next; return packageEditPart; } } return null; } private boolean isProfileAppliedTo(org.eclipse.uml2.uml.Package package_, Profile profile) { ProfileApplication profileApplication = package_.getProfileApplication(profile); return profileApplication != null && profileApplication.getAppliedDefinition() == profile.getDefinition(); } protected class ApplyProfileCommand extends EditElementCommand { org.eclipse.uml2.uml.Package myPackage; private Profile myProfile; protected ApplyProfileCommand(String label, org.eclipse.uml2.uml.Package package_, Profile profile, IEditCommandRequest request) { super(label, package_, request); myPackage = package_; myProfile = profile; } @Override protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { myPackage.applyProfile(myProfile); return CommandResult.newOKCommandResult(myProfile); } } private class UnapplyProfileCommand extends EditElementCommand { org.eclipse.uml2.uml.Package myPackage; private Profile myProfile; protected UnapplyProfileCommand(String label, org.eclipse.uml2.uml.Package package_, Profile profile, IEditCommandRequest request) { super(label, package_, request); myPackage = package_; myProfile = profile; } @Override protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { myPackage.unapplyProfile(myProfile); return CommandResult.newOKCommandResult(myProfile); } } }