diff options
author | donald.g.dunne | 2016-09-15 23:20:35 +0000 |
---|---|---|
committer | donald.g.dunne | 2016-09-15 23:20:35 +0000 |
commit | cabbc7b4f78f370a035995636d1b2f398c2b26d0 (patch) | |
tree | b7d842c7f4bb86632844767bb6ec44632ff0f960 | |
parent | 609367bb5f89ce6aa669530a4403a1522e67a822 (diff) | |
download | org.eclipse.osee-cabbc7b4f78f370a035995636d1b2f398c2b26d0.tar.gz org.eclipse.osee-cabbc7b4f78f370a035995636d1b2f398c2b26d0.tar.xz org.eclipse.osee-cabbc7b4f78f370a035995636d1b2f398c2b26d0.zip |
feature: Add New Action to Members tab menu
Change-Id: I41bcb12fe84bb63729c3a78a6c0daabaed5e4006
9 files changed, 189 insertions, 12 deletions
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionJob.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionJob.java index b625f2d0f6e..42a8654250d 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionJob.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionJob.java @@ -45,6 +45,7 @@ public class NewActionJob extends Job { private final Set<IAtsActionableItem> actionableItems; private final NewActionWizard wizard; private final INewActionListener newActionListener; + private boolean openOnComplete = true; public NewActionJob(String title, String desc, ChangeType changeType, String priority, Date needByDate, boolean validationRequired, Set<IAtsActionableItem> actionableItems, NewActionWizard wizard, INewActionListener newActionListener) { super("Creating New Action"); @@ -82,10 +83,12 @@ public class NewActionJob extends Job { } changes.execute(); - // Because this is a job, it will automatically kill any popups that are created during. - // Thus, if multiple teams were selected to create, don't popup on openAction or dialog - // will exception out when it is killed at the end of this job. - AtsUtil.openATSAction(actionArt, AtsOpenOption.OpenAll); + if (openOnComplete) { + // Because this is a job, it will automatically kill any popups that are created during. + // Thus, if multiple teams were selected to create, don't popup on openAction or dialog + // will exception out when it is killed at the end of this job. + AtsUtil.openATSAction(actionArt, AtsOpenOption.OpenAll); + } } catch (Exception ex) { OseeLog.log(Activator.class, Level.SEVERE, ex); return new Status(IStatus.ERROR, Activator.PLUGIN_ID, -1, ex.getMessage(), ex); @@ -101,4 +104,12 @@ public class NewActionJob extends Job { return actionArt; } + public boolean isOpenOnComplete() { + return openOnComplete; + } + + public void setOpenOnComplete(boolean openOnComplete) { + this.openOnComplete = openOnComplete; + } + } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionWizard.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionWizard.java index 9aefa481814..87434b0573d 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionWizard.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/actions/wizard/NewActionWizard.java @@ -46,6 +46,7 @@ public class NewActionWizard extends Wizard implements INewWizard { private String initialDescription; private NewActionJob job = null; private INewActionListener newActionListener; + private boolean openOnComplete = true;; @Override public boolean performFinish() { @@ -58,6 +59,7 @@ public class NewActionWizard extends Wizard implements INewWizard { job = new NewActionJob(getTitle(), getDescription(), getChangeType(), getPriority(), getNeedBy(), getValidation(), getSelectedIAtsActionableItems(), this, newActionListener); job.setUser(true); + job.setOpenOnComplete(openOnComplete); job.setPriority(Job.LONG); job.schedule(); } catch (OseeCoreException ex) { @@ -170,4 +172,8 @@ public class NewActionWizard extends Wizard implements INewWizard { this.newActionListener = newActionListener; } + public void setOpenOnComplete(boolean openOnComplete) { + this.openOnComplete = openOnComplete; + } + } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/AgileUtilClient.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/AgileUtilClient.java index 4f9c8337af7..f6b7ee78b1e 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/AgileUtilClient.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/AgileUtilClient.java @@ -13,6 +13,7 @@ package org.eclipse.osee.ats.agile; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import org.eclipse.osee.ats.api.data.AtsArtifactTypes; import org.eclipse.osee.ats.api.data.AtsRelationTypes; import org.eclipse.osee.ats.core.client.workflow.AbstractWorkflowArtifact; import org.eclipse.osee.framework.skynet.core.artifact.Artifact; @@ -40,6 +41,10 @@ public class AgileUtilClient { return backlogArt.getRelatedArtifactsCount(AtsRelationTypes.AgileTeamToBacklog_AgileTeam) == 1; } + public static boolean isSprint(Artifact artifact) { + return artifact.isOfType(AtsArtifactTypes.AgileSprint); + } + public static Collection<Artifact> getRelatedSprints(Artifact awa) { Set<Artifact> sprints = new HashSet<>(); for (Artifact sprintArt : awa.getRelatedArtifacts(AtsRelationTypes.AgileSprintToItem_Sprint)) { diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/SprintMemberProvider.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/SprintMemberProvider.java index 3534b0e2065..3820aa91a0a 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/SprintMemberProvider.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/agile/SprintMemberProvider.java @@ -117,4 +117,14 @@ public class SprintMemberProvider extends AbstractMemberProvider { AtsClientService.get().getSprintItemsCache().decache(getArtifact()); } + @Override + public boolean isBacklog() { + return false; + } + + @Override + public boolean isSprint() { + return true; + } + } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/IMemberProvider.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/IMemberProvider.java index 0738da1c2fb..bdad9cf7383 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/IMemberProvider.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/IMemberProvider.java @@ -13,7 +13,6 @@ package org.eclipse.osee.ats.editor; import java.util.List; import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.nebula.widgets.xviewer.IXViewerFactory; -import org.eclipse.osee.framework.core.data.IArtifactType; import org.eclipse.osee.framework.core.data.IRelationTypeSide; import org.eclipse.osee.framework.core.util.Result; import org.eclipse.osee.framework.skynet.core.artifact.Artifact; @@ -52,4 +51,8 @@ public interface IMemberProvider { void deCacheAndReload(boolean pend, IJobChangeListener listener); + boolean isBacklog(); + + boolean isSprint(); + } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/WfeMembersTab.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/WfeMembersTab.java index 517d96b2dbf..aad0de3c618 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/WfeMembersTab.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/WfeMembersTab.java @@ -47,6 +47,7 @@ import org.eclipse.osee.ats.core.client.artifact.SprintArtifact; import org.eclipse.osee.ats.core.client.config.AtsBulkLoad; import org.eclipse.osee.ats.core.client.task.TaskArtifact; import org.eclipse.osee.ats.core.client.workflow.AbstractWorkflowArtifact; +import org.eclipse.osee.ats.goal.NewActionToGoalAction; import org.eclipse.osee.ats.goal.RemoveFromCollectorAction; import org.eclipse.osee.ats.goal.RemoveFromCollectorAction.RemovedFromCollectorHandler; import org.eclipse.osee.ats.goal.SetCollectorOrderAction; @@ -633,6 +634,7 @@ public class WfeMembersTab extends FormPage implements IWorldEditor, ISelectedAt } Action setCollectorOrderAction, removeFromCollectorAction; + private NewActionToGoalAction newActionToGoalAction; private void createActions() { setCollectorOrderAction = new SetCollectorOrderAction(provider, (CollectorArtifact) editor.getAwa(), this); @@ -648,6 +650,7 @@ public class WfeMembersTab extends FormPage implements IWorldEditor, ISelectedAt }; removeFromCollectorAction = new RemoveFromCollectorAction(provider, (CollectorArtifact) editor.getAwa(), this, handler); + newActionToGoalAction = new NewActionToGoalAction(provider, (CollectorArtifact) editor.getAwa(), this); } @Override @@ -655,6 +658,8 @@ public class WfeMembersTab extends FormPage implements IWorldEditor, ISelectedAt MenuManager mm = worldComposite.getXViewer().getMenuManager(); mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, setCollectorOrderAction); mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, removeFromCollectorAction); + newActionToGoalAction.refreshText(); + mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, newActionToGoalAction); mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, new Separator()); } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/GoalMemberProvider.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/GoalMemberProvider.java index 8f78ce369f9..bce5a83b80f 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/GoalMemberProvider.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/GoalMemberProvider.java @@ -15,13 +15,11 @@ import org.eclipse.nebula.widgets.xviewer.IXViewerFactory; import org.eclipse.osee.ats.AtsImage; import org.eclipse.osee.ats.agile.AgileUtilClient; import org.eclipse.osee.ats.agile.BacklogXViewerFactory; -import org.eclipse.osee.ats.api.data.AtsArtifactTypes; import org.eclipse.osee.ats.api.data.AtsRelationTypes; import org.eclipse.osee.ats.api.workflow.IAtsGoal; import org.eclipse.osee.ats.artifact.GoalManager; import org.eclipse.osee.ats.core.client.artifact.GoalArtifact; import org.eclipse.osee.ats.internal.AtsClientService; -import org.eclipse.osee.framework.core.data.IArtifactType; import org.eclipse.osee.framework.core.data.IRelationTypeSide; import org.eclipse.osee.framework.core.util.Result; import org.eclipse.osee.framework.skynet.core.artifact.Artifact; @@ -113,11 +111,17 @@ public class GoalMemberProvider extends AbstractMemberProvider { return Result.TrueResult; } - private boolean isBacklog() { + @Override + public boolean isBacklog() { return AgileUtilClient.isBacklog(getArtifact()); } @Override + public boolean isSprint() { + return false; + } + + @Override public void deCacheArtifact() { AtsClientService.get().getGoalMembersCache().decache(getArtifact()); } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/NewActionToGoalAction.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/NewActionToGoalAction.java new file mode 100644 index 00000000000..45607d50de7 --- /dev/null +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/NewActionToGoalAction.java @@ -0,0 +1,131 @@ +/******************************************************************************* + * Copyright (c) 2016 Boeing. + * 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: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.ats.goal; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.osee.ats.AtsImage; +import org.eclipse.osee.ats.actions.wizard.NewActionWizard; +import org.eclipse.osee.ats.api.ai.IAtsActionableItem; +import org.eclipse.osee.ats.api.data.AtsArtifactTypes; +import org.eclipse.osee.ats.api.data.AtsRelationTypes; +import org.eclipse.osee.ats.api.util.IAtsChangeSet; +import org.eclipse.osee.ats.api.workflow.IAtsAction; +import org.eclipse.osee.ats.api.workflow.IAtsTeamWorkflow; +import org.eclipse.osee.ats.api.workflow.NewActionAdapter; +import org.eclipse.osee.ats.core.client.actions.ISelectedAtsArtifacts; +import org.eclipse.osee.ats.core.client.artifact.CollectorArtifact; +import org.eclipse.osee.ats.core.client.artifact.GoalArtifact; +import org.eclipse.osee.ats.core.client.artifact.SprintArtifact; +import org.eclipse.osee.ats.editor.IMemberProvider; +import org.eclipse.osee.ats.internal.Activator; +import org.eclipse.osee.ats.internal.AtsClientService; +import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; +import org.eclipse.osee.framework.logging.OseeLevel; +import org.eclipse.osee.framework.logging.OseeLog; +import org.eclipse.osee.framework.skynet.core.artifact.Artifact; +import org.eclipse.osee.framework.ui.swt.ImageManager; +import org.eclipse.ui.PlatformUI; + +/** + * @author Donald G. Dunne + */ +public class NewActionToGoalAction extends Action { + + private final CollectorArtifact collectorArt; + private final ISelectedAtsArtifacts selectedAtsArtifacts; + private final IMemberProvider memberProvider; + + public static interface RemovedFromCollectorHandler { + void removedFromCollector(Collection<? extends Artifact> removed); + } + + public NewActionToGoalAction(IMemberProvider memberProvider, CollectorArtifact collectorArt, ISelectedAtsArtifacts selectedAtsArtifacts) { + super("Create New Action At This Location"); + this.memberProvider = memberProvider; + this.collectorArt = collectorArt; + this.selectedAtsArtifacts = selectedAtsArtifacts; + } + + @Override + public ImageDescriptor getImageDescriptor() { + return ImageManager.getImageDescriptor(AtsImage.NEW_ACTION); + } + + @Override + public void run() { + try { + Collection<? extends Artifact> selected = selectedAtsArtifacts.getSelectedAtsArtifacts(); + final Artifact dropTarget = selected.isEmpty() ? null : selected.iterator().next(); + List<IAtsActionableItem> ais = new LinkedList<>(); + if (memberProvider.isBacklog() || memberProvider.isSprint()) { + Artifact agileTeam = null; + if (memberProvider.isBacklog()) { + agileTeam = collectorArt.getRelatedArtifact(AtsRelationTypes.AgileTeamToBacklog_AgileTeam); + } else { + agileTeam = collectorArt.getRelatedArtifact(AtsRelationTypes.AgileTeamToSprint_AgileTeam); + } + List<Artifact> atsTeams = agileTeam.getRelatedArtifacts(AtsRelationTypes.AgileTeamToAtsTeam_AtsTeam); + for (Artifact atsTeam : atsTeams) { + for (Artifact ai : atsTeam.getRelatedArtifacts(AtsRelationTypes.TeamActionableItem_ActionableItem)) { + ais.add(AtsClientService.get().getConfigItemFactory().getActionableItem(ai)); + } + } + } + NewActionWizard wizard = new NewActionWizard(); + if (!ais.isEmpty()) { + wizard.setInitialAias(ais); + } + wizard.setNewActionListener(new NewActionAdapter() { + + @Override + public void teamCreated(IAtsAction action, IAtsTeamWorkflow teamWf, IAtsChangeSet changes) throws OseeCoreException { + List<Artifact> related = collectorArt.getRelatedArtifacts(memberProvider.getMemberRelationTypeSide()); + if (!related.contains(teamWf.getStoreObject())) { + changes.relate(collectorArt, memberProvider.getMemberRelationTypeSide(), teamWf.getStoreObject()); + } + if (dropTarget != null) { + collectorArt.setRelationOrder(memberProvider.getMemberRelationTypeSide(), dropTarget, false, + (Artifact) teamWf.getStoreObject()); + if (collectorArt.isOfType(AtsArtifactTypes.Goal)) { + AtsClientService.get().getGoalMembersCache().decache((GoalArtifact) collectorArt); + } else if (memberProvider.isSprint()) { + AtsClientService.get().getSprintItemsCache().decache((SprintArtifact) collectorArt); + } + } + + changes.add(collectorArt); + } + + }); + wizard.setOpenOnComplete(false); + WizardDialog dialog = + new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard); + dialog.create(); + dialog.open(); + } catch (OseeCoreException ex) { + OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex); + } + } + + @Override + public String getText() { + return selectedAtsArtifacts.getSelectedWorkflowArtifacts().isEmpty() ? "Create New Action at End" : "Create New Action At This Location"; + } + + public void refreshText() { + setText(getText()); + } +} diff --git a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Artifact.java b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Artifact.java index 66cb2702fb7..5d703fce644 100644 --- a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Artifact.java +++ b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/Artifact.java @@ -1306,11 +1306,13 @@ public class Artifact extends FullyNamedIdentity<String> implements IArtifact, A List<Artifact> currentOrder = getRelatedArtifacts(relationEnumeration, Artifact.class); // target artifact doesn't exist if (!currentOrder.contains(targetArtifact)) { - // add to end of list if not already in list - if (!currentOrder.contains(itemToAdd)) { - currentOrder.add(itemToAdd); - } + throw new OseeStateException("Could not set Relation Order: target not in list"); + } + // add to end of list if not already in list + if (!currentOrder.contains(itemToAdd)) { + currentOrder.add(itemToAdd); } + boolean result = Collections.moveItem(currentOrder, itemToAdd, targetArtifact, insertAfterTarget); if (!result) { throw new OseeStateException("Could not set Relation Order"); |