feature[TW19451]: Confirm transition validation

Change-Id: I38b3f144b22c2d39650601503fa33bc0b63d4d1d
diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsCoreXWidgetValidatorProvider.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsCoreXWidgetValidatorProvider.java
index e04c716..436edbe 100644
--- a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsCoreXWidgetValidatorProvider.java
+++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsCoreXWidgetValidatorProvider.java
@@ -36,6 +36,7 @@
       atsValidators.add(new AtsXListValidator());
       atsValidators.add(new AtsXWidgetAttrValidator());
       atsValidators.add(new AtsXPointsAttrValidator());
+      atsValidators.add(new AtsXHyperlinkLabelValueSelectionDamValidator());
    }
 
    @Override
diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXHyperlinkLabelValueSelectionDamValidator.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXHyperlinkLabelValueSelectionDamValidator.java
new file mode 100644
index 0000000..a1a6266
--- /dev/null
+++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/validator/AtsXHyperlinkLabelValueSelectionDamValidator.java
@@ -0,0 +1,39 @@
+/*********************************************************************
+ * Copyright (c) 2021 Boeing
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ **********************************************************************/
+
+package org.eclipse.osee.ats.core.validator;
+
+import org.eclipse.osee.ats.api.AtsApi;
+import org.eclipse.osee.ats.api.IAtsWorkItem;
+import org.eclipse.osee.ats.api.util.IValueProvider;
+import org.eclipse.osee.ats.api.workdef.IAtsStateDefinition;
+import org.eclipse.osee.ats.api.workdef.IAtsWidgetDefinition;
+import org.eclipse.osee.ats.api.workdef.WidgetResult;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class AtsXHyperlinkLabelValueSelectionDamValidator extends AtsXWidgetValidator {
+
+   @Override
+   public WidgetResult validateTransition(IAtsWorkItem workItem, IValueProvider provider, IAtsWidgetDefinition widgetDef, IAtsStateDefinition fromStateDef, IAtsStateDefinition toStateDef, AtsApi atsApi) {
+      WidgetResult result = WidgetResult.Success;
+      if ("XHyperlinkLabelValueSelectionDam".equals(widgetDef.getXWidgetName())) {
+         result = validateWidgetIsRequired(provider, widgetDef, fromStateDef, toStateDef);
+         if (!result.isSuccess()) {
+            return result;
+         }
+      }
+      return result;
+   }
+}
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/editor/tab/workflow/section/WfeWorkflowSection.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/editor/tab/workflow/section/WfeWorkflowSection.java
index ffff8f2..f44bda0 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/editor/tab/workflow/section/WfeWorkflowSection.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/editor/tab/workflow/section/WfeWorkflowSection.java
@@ -88,7 +88,6 @@
       isEditable = WorkflowManagerCore.isEditable(AtsApiService.get().getUserService().getCurrentUser(), sma,
          page.getStateDefinition(), AtsApiService.get().getUserService());
       isGlobalEditable = !sma.isReadOnly() && sma.isAccessControlWrite();
-      // parent.setBackground(Displays.getSystemColor(SWT.COLOR_CYAN));
    }
 
    public boolean isCurrentState() {
@@ -104,7 +103,6 @@
       try {
          refreshStateTitle();
          section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-         // section.setBackground(Displays.getSystemColor(SWT.COLOR_MAGENTA));
 
          boolean isCurrentSectionExpanded = isCurrentSectionExpanded(statePage);
          createSection(section);
@@ -177,7 +175,6 @@
       // Create Page
       Composite workComp = toolkit.createContainer(comp, 1);
       workComp.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING));
-      // workComp.setBackground(Displays.getSystemColor(SWT.COLOR_GREEN));
 
       if (sma.getWorkDefinition().isShowStateMetrics()) {
          createMetricsHeader(workComp);
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/AtsWidgetProvider.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/AtsWidgetProvider.java
index af5f09f..7c3a81ce 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/AtsWidgetProvider.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/AtsWidgetProvider.java
@@ -89,6 +89,8 @@
          toReturn = new XStateSearchCombo();
       } else if (widgetName.equals(XFoundInVersionWidget.WIDGET_ID)) {
          toReturn = new XFoundInVersionWidget(name);
+      } else if (widgetName.equals(XTargetedVersionWidget.WIDGET_ID)) {
+         toReturn = new XTargetedVersionWidget(name);
       } else if (widgetName.equals(XIntroducedInVersionWidget.WIDGET_ID)) {
          toReturn = new XIntroducedInVersionWidget(name);
       } else if (widgetName.equals(XCommitManager.WIDGET_NAME)) {
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XFoundInVersionWidget.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XFoundInVersionWidget.java
index d4eb332..8fab991 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XFoundInVersionWidget.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XFoundInVersionWidget.java
@@ -13,106 +13,20 @@
 
 package org.eclipse.osee.ats.ide.util.widgets;
 
-import java.util.Collection;
-import java.util.HashSet;
 import org.eclipse.osee.ats.api.data.AtsRelationTypes;
-import org.eclipse.osee.ats.api.util.IAtsChangeSet;
-import org.eclipse.osee.ats.api.version.Version;
-import org.eclipse.osee.ats.ide.column.FoundInVersionColumnUI;
-import org.eclipse.osee.ats.ide.internal.Activator;
-import org.eclipse.osee.ats.ide.internal.AtsApiService;
-import org.eclipse.osee.ats.ide.workflow.teamwf.TeamWorkFlowArtifact;
 import org.eclipse.osee.framework.core.data.RelationTypeSide;
-import org.eclipse.osee.framework.core.util.Result;
-import org.eclipse.osee.framework.jdk.core.util.Collections;
-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.skynet.widgets.ArtifactWidget;
 
 /**
  * @author Jeremy A. Midvidy
+ * @author Donald G. Dunne
  */
-public class XFoundInVersionWidget extends XHyperlabelVersionSelection implements ArtifactWidget {
+public class XFoundInVersionWidget extends XHyperlabelVersionSelection {
 
    public static final String WIDGET_ID = XFoundInVersionWidget.class.getSimpleName();
    public static RelationTypeSide FOUND_VERSION_RELATION = AtsRelationTypes.TeamWorkflowToFoundInVersion_Version;
-   public Collection<Version> selectedVersions = new HashSet<>();
-   private Artifact artifact;
 
    public XFoundInVersionWidget(String label) {
-      super(label);
-   }
-
-   public XFoundInVersionWidget() {
-      this("Found In Version");
-   }
-
-   private RelationTypeSide getRelation() {
-      return FOUND_VERSION_RELATION;
-   }
-
-   @Override
-   public String getCurrentValue() {
-      selectedVersions = (Collections.castAll(getArtifact().getRelatedArtifacts(getRelation())));
-      return Collections.toString(",", selectedVersions);
-   }
-
-   @Override
-   public boolean handleClear() {
-      selectedVersions.clear();
-      IAtsChangeSet changes = AtsApiService.get().createChangeSet("Update Found-In-Version");
-      changes.unrelateAll(getArtifact(), getRelation());
-      changes.executeIfNeeded();
-      notifyXModifiedListeners();
-      return true;
-   }
-
-   @Override
-   public boolean handleSelection() {
-      try {
-         if (FoundInVersionColumnUI.getInstance().promptChangeVersion((TeamWorkFlowArtifact) getArtifact())) {
-            notifyXModifiedListeners();
-            refresh();
-            return true;
-         }
-         return false;
-      } catch (Exception ex) {
-         OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex);
-      }
-      return false;
-   }
-
-   @Override
-   public boolean isEmpty() {
-      return selectedVersions.isEmpty();
-   }
-
-   @Override
-   public void setArtifact(Artifact art) {
-      if (art instanceof TeamWorkFlowArtifact) {
-         this.artifact = art;
-      }
-   }
-
-   @Override
-   public Artifact getArtifact() {
-      return this.artifact;
-   }
-
-   @Override
-   public void revert() {
-      //
-   }
-
-   @Override
-   public void saveToArtifact() {
-      //
-   }
-
-   @Override
-   public Result isDirty() {
-      return Result.FalseResult;
+      super("Found In Version", FOUND_VERSION_RELATION);
    }
 
 }
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XHyperlabelVersionSelection.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XHyperlabelVersionSelection.java
index b4c71bc..c970d89 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XHyperlabelVersionSelection.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XHyperlabelVersionSelection.java
@@ -15,36 +15,48 @@
 
 import java.util.Collection;
 import java.util.HashSet;
+import org.eclipse.osee.ats.api.AtsApi;
 import org.eclipse.osee.ats.api.team.IAtsTeamDefinition;
+import org.eclipse.osee.ats.api.util.IAtsChangeSet;
 import org.eclipse.osee.ats.api.version.IAtsVersion;
 import org.eclipse.osee.ats.api.version.Version;
+import org.eclipse.osee.ats.api.workflow.IAtsTeamWorkflow;
 import org.eclipse.osee.ats.ide.internal.Activator;
-import org.eclipse.osee.ats.ide.util.widgets.dialog.VersionTreeDialog;
-import org.eclipse.osee.ats.ide.world.WorldEditor;
-import org.eclipse.osee.framework.core.enums.Active;
+import org.eclipse.osee.ats.ide.internal.AtsApiService;
+import org.eclipse.osee.ats.ide.util.widgets.dialog.VersionListDialog;
+import org.eclipse.osee.ats.ide.workflow.teamwf.TeamWorkFlowArtifact;
+import org.eclipse.osee.framework.core.data.RelationTypeSide;
+import org.eclipse.osee.framework.core.data.TransactionToken;
+import org.eclipse.osee.framework.core.util.Result;
 import org.eclipse.osee.framework.jdk.core.util.Collections;
 import org.eclipse.osee.framework.logging.OseeLevel;
 import org.eclipse.osee.framework.logging.OseeLog;
-import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlinkLabelCmdValueSelection;
+import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
+import org.eclipse.osee.framework.ui.skynet.widgets.ArtifactWidget;
+import org.eclipse.osee.framework.ui.skynet.widgets.XHyperlinkLabelValueSelection;
+import org.eclipse.osee.framework.ui.swt.Widgets;
 
 /**
+ * Single version selection dialog that persists upon selection. Clear and Close button shown by default to un-select.
+ *
  * @author Megumi Telles
+ * @author Donald G. Dunne
  */
-public class XHyperlabelVersionSelection extends XHyperlinkLabelCmdValueSelection {
+public abstract class XHyperlabelVersionSelection extends XHyperlinkLabelValueSelection implements ArtifactWidget {
 
    public static final String WIDGET_ID = XHyperlabelVersionSelection.class.getSimpleName();
    Collection<Version> selectedVersions = new HashSet<>();
    Collection<IAtsVersion> versions;
-   VersionTreeDialog dialog = null;
-   IAtsTeamDefinition teamDef;
+   VersionListDialog dialog = null;
+   private Artifact artifact;
+   private final RelationTypeSide relType;
+   protected AtsApi atsApi;
+   protected boolean removeAllAllowed = true;
 
-   public XHyperlabelVersionSelection(String label) {
-      super(label, true, WorldEditor.TITLE_MAX_LENGTH);
-   }
-
-   public XHyperlabelVersionSelection(String label, IAtsTeamDefinition teamDef) {
-      super(label, true, WorldEditor.TITLE_MAX_LENGTH);
-      this.teamDef = teamDef;
+   public XHyperlabelVersionSelection(String label, RelationTypeSide relType) {
+      super(label);
+      this.relType = relType;
+      atsApi = AtsApiService.get();
    }
 
    public Collection<Version> getSelectedVersions() {
@@ -58,9 +70,24 @@
 
    @Override
    public String getCurrentValue() {
+      if (getArtifact() != null) {
+         selectedVersions = (Collections.castAll(getArtifact().getRelatedArtifacts(relType)));
+      }
+      if (selectedVersions.isEmpty()) {
+         return "Not Set";
+      }
       return Collections.toString(",", selectedVersions);
    }
 
+   public boolean handleClear() {
+      selectedVersions.clear();
+      IAtsChangeSet changes = AtsApiService.get().createChangeSet("Update Found-In-Version");
+      changes.unrelateAll(getArtifact(), relType);
+      changes.executeIfNeeded();
+      notifyXModifiedListeners();
+      return true;
+   }
+
    public void setSelectedVersions(Collection<Version> selectedVersions) {
       this.selectedVersions = selectedVersions;
       refresh();
@@ -68,27 +95,22 @@
    }
 
    @Override
-   public boolean handleClear() {
-      selectedVersions.clear();
-      notifyXModifiedListeners();
-      return true;
-   }
-
-   @Override
    public boolean handleSelection() {
       try {
          if (versions == null) {
-            dialog = new VersionTreeDialog(Active.Both);
+            dialog = new VersionListDialog("Select Version", "Select Version", getSelectableVersions());
          } else {
-            dialog = new VersionTreeDialog(Active.Both, versions);
+            dialog = new VersionListDialog("Select Version", "Select Version", getSelectableVersions());
          }
+         dialog.setRemoveAllAllowed(removeAllAllowed);
          int result = dialog.open();
          if (result == 0) {
-            selectedVersions.clear();
-            for (Object obj : dialog.getResultVersions()) {
-               selectedVersions.add((Version) obj);
+            IAtsChangeSet changes = AtsApiService.get().createChangeSet("Update Found-In-Version");
+            changes.setRelation(getArtifact(), relType, dialog.getSelectedFirst());
+            TransactionToken transaction = changes.executeIfNeeded();
+            if (transaction.isValid()) {
+               notifyXModifiedListeners();
             }
-            notifyXModifiedListeners();
          }
          return true;
       } catch (Exception ex) {
@@ -97,6 +119,17 @@
       return false;
    }
 
+   private Collection<IAtsVersion> getSelectableVersions() {
+      if (artifact instanceof IAtsTeamWorkflow) {
+         IAtsTeamDefinition teamDefHoldingVersion = atsApi.getTeamDefinitionService().getTeamDefHoldingVersions(
+            ((IAtsTeamWorkflow) artifact).getTeamDefinition());
+         if (teamDefHoldingVersion != null) {
+            return atsApi.getTeamDefinitionService().getVersions(teamDefHoldingVersion);
+         }
+      }
+      return java.util.Collections.emptyList();
+   }
+
    public void setVersions(Collection<IAtsVersion> versions) {
       this.versions = versions;
       if (dialog != null) {
@@ -109,4 +142,51 @@
       return selectedVersions.isEmpty();
    }
 
+   public void setEnableHyperLink() {
+      if (Widgets.isAccessible(labelHyperlink)) {
+         labelHyperlink.setEnabled(true);
+      }
+   }
+
+   public void setDisableHyperLink() {
+      if (Widgets.isAccessible(labelHyperlink)) {
+         labelHyperlink.setEnabled(false);
+      }
+   }
+
+   @Override
+   public void setArtifact(Artifact art) {
+      if (art instanceof TeamWorkFlowArtifact) {
+         this.artifact = art;
+      }
+   }
+
+   @Override
+   public Artifact getArtifact() {
+      return this.artifact;
+   }
+
+   @Override
+   public void revert() {
+      //
+   }
+
+   @Override
+   public void saveToArtifact() {
+      //
+   }
+
+   @Override
+   public Result isDirty() {
+      return Result.FalseResult;
+   }
+
+   public boolean isRemoveAllAllowed() {
+      return removeAllAllowed;
+   }
+
+   public void setRemoveAllAllowed(boolean removeAllAllowed) {
+      this.removeAllAllowed = removeAllAllowed;
+   }
+
 }
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XIntroducedInVersionWidget.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XIntroducedInVersionWidget.java
index d34da92..45bd173 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XIntroducedInVersionWidget.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XIntroducedInVersionWidget.java
@@ -13,107 +13,24 @@
 
 package org.eclipse.osee.ats.ide.util.widgets;
 
-import java.util.Collection;
-import java.util.HashSet;
 import org.eclipse.osee.ats.api.data.AtsRelationTypes;
-import org.eclipse.osee.ats.api.util.IAtsChangeSet;
-import org.eclipse.osee.ats.api.version.Version;
-import org.eclipse.osee.ats.ide.column.IntroducedInVersionColumnUI;
-import org.eclipse.osee.ats.ide.internal.Activator;
-import org.eclipse.osee.ats.ide.internal.AtsApiService;
-import org.eclipse.osee.ats.ide.workflow.teamwf.TeamWorkFlowArtifact;
 import org.eclipse.osee.framework.core.data.RelationTypeSide;
-import org.eclipse.osee.framework.core.util.Result;
-import org.eclipse.osee.framework.jdk.core.util.Collections;
-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.skynet.widgets.ArtifactWidget;
 
 /**
  * @author Donald G. Dunne
  */
-public class XIntroducedInVersionWidget extends XHyperlabelVersionSelection implements ArtifactWidget {
+public class XIntroducedInVersionWidget extends XHyperlabelVersionSelection {
 
    public static final String WIDGET_ID = XIntroducedInVersionWidget.class.getSimpleName();
    public static RelationTypeSide INTRODUCED_VERSION_RELATION =
       AtsRelationTypes.TeamWorkflowToIntroducedInVersion_Version;
-   public Collection<Version> selectedVersions = new HashSet<>();
-   private Artifact artifact;
-
-   public XIntroducedInVersionWidget(String label) {
-      super(label);
-   }
 
    public XIntroducedInVersionWidget() {
       this("Introduced In Version");
    }
 
-   private RelationTypeSide getRelation() {
-      return INTRODUCED_VERSION_RELATION;
-   }
-
-   @Override
-   public String getCurrentValue() {
-      selectedVersions = (Collections.castAll(getArtifact().getRelatedArtifacts(getRelation())));
-      return Collections.toString(",", selectedVersions);
-   }
-
-   @Override
-   public boolean handleClear() {
-      selectedVersions.clear();
-      IAtsChangeSet changes = AtsApiService.get().createChangeSet("Update Introduced-In-Version");
-      changes.unrelateAll(getArtifact(), getRelation());
-      changes.executeIfNeeded();
-      notifyXModifiedListeners();
-      return true;
-   }
-
-   @Override
-   public boolean handleSelection() {
-      try {
-         if (IntroducedInVersionColumnUI.getInstance().promptChangeVersion((TeamWorkFlowArtifact) getArtifact())) {
-            notifyXModifiedListeners();
-            refresh();
-            return true;
-         }
-         return false;
-      } catch (Exception ex) {
-         OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex);
-      }
-      return false;
-   }
-
-   @Override
-   public boolean isEmpty() {
-      return selectedVersions.isEmpty();
-   }
-
-   @Override
-   public void setArtifact(Artifact art) {
-      if (art instanceof TeamWorkFlowArtifact) {
-         this.artifact = art;
-      }
-   }
-
-   @Override
-   public Artifact getArtifact() {
-      return this.artifact;
-   }
-
-   @Override
-   public void revert() {
-      //
-   }
-
-   @Override
-   public void saveToArtifact() {
-      //
-   }
-
-   @Override
-   public Result isDirty() {
-      return Result.FalseResult;
+   public XIntroducedInVersionWidget(String label) {
+      super(label, INTRODUCED_VERSION_RELATION);
    }
 
 }
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XTargetedVersionWidget.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XTargetedVersionWidget.java
new file mode 100644
index 0000000..9c1a807
--- /dev/null
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/XTargetedVersionWidget.java
@@ -0,0 +1,35 @@
+/*********************************************************************
+ * Copyright (c) 2021 Boeing
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ **********************************************************************/
+
+package org.eclipse.osee.ats.ide.util.widgets;
+
+import org.eclipse.osee.ats.api.data.AtsRelationTypes;
+import org.eclipse.osee.framework.core.data.RelationTypeSide;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XTargetedVersionWidget extends XHyperlabelVersionSelection {
+
+   public static final String WIDGET_ID = XTargetedVersionWidget.class.getSimpleName();
+   public static RelationTypeSide TARGETED_VERSION_RELATION = AtsRelationTypes.TeamWorkflowTargetedForVersion_Version;
+
+   public XTargetedVersionWidget() {
+      this("Targeted Version");
+   }
+
+   public XTargetedVersionWidget(String label) {
+      super(label, TARGETED_VERSION_RELATION);
+   }
+
+}
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/dialog/VersionListDialog.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/dialog/VersionListDialog.java
index 2f9b10b..0206eda 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/dialog/VersionListDialog.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/util/widgets/dialog/VersionListDialog.java
@@ -24,6 +24,7 @@
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 
@@ -34,6 +35,8 @@
 
    XCheckBox showReleased = new XCheckBox("Show Released Versions");
    private final Collection<IAtsVersion> verArts;
+   private boolean removeAllAllowed = false;
+   private boolean removeAllSelected = false;
 
    public VersionListDialog(String title, String message, Collection<IAtsVersion> verArts) {
       super(title, message, new VersionContentProvider(false), new VersionLabelProvider(),
@@ -44,13 +47,27 @@
 
    @Override
    protected Control createDialogArea(Composite container) {
-      Control control = super.createDialogArea(container);
+      Composite composite = new Composite(container, SWT.None);
+      composite.setLayout(new GridLayout(1, false));
+      composite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
 
-      Composite comp = new Composite(control.getParent(), SWT.NONE);
-      comp.setLayout(new GridLayout(2, false));
-      comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+      if (removeAllAllowed) {
+         final Button button = new Button(composite, SWT.PUSH);
+         button.setText("Un-Set and Close");
+         button.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+               removeAllSelected = true;
+               close();
+            }
+         });
+      }
 
-      showReleased.createWidgets(comp, 2);
+      Composite checkComp = new Composite(composite, SWT.NONE);
+      checkComp.setLayout(new GridLayout(2, false));
+      checkComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+      showReleased.createWidgets(checkComp, 2);
       showReleased.set(false);
       showReleased.addSelectionListener(new SelectionAdapter() {
          @Override
@@ -63,9 +80,19 @@
          };
       });
 
+      Control control = super.createDialogArea(composite);
+
       return control;
    }
 
+   public boolean isRemoveAllSelected() {
+      if (!removeAllAllowed) {
+         return false;
+      } else {
+         return removeAllSelected;
+      }
+   }
+
    public static class VersionContentProvider extends ArrayTreeContentProvider {
 
       boolean showReleased = false;
@@ -99,4 +126,12 @@
          this.showReleased = showReleased;
       }
    }
+
+   public boolean isRemoveAllAllowed() {
+      return removeAllAllowed;
+   }
+
+   public void setRemoveAllAllowed(boolean removeAllAllowed) {
+      this.removeAllAllowed = removeAllAllowed;
+   }
 }
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/AbstractWorkflowArtifact.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/AbstractWorkflowArtifact.java
index f89c421..3b39089 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/AbstractWorkflowArtifact.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workflow/AbstractWorkflowArtifact.java
@@ -472,6 +472,7 @@
       return getWorkTypes().contains(workType);
    }
 
+   @Override
    public void setTags(List<String> tags) {
       throw new UnsupportedOperationException();
    }
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/EnumSingletonSelectionDialog.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/EnumSingletonSelectionDialog.java
index 7d82ae2..731946d 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/EnumSingletonSelectionDialog.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/artifact/EnumSingletonSelectionDialog.java
@@ -26,13 +26,13 @@
 import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
 import org.eclipse.osee.framework.skynet.core.attribute.AttributeTypeManager;
 import org.eclipse.osee.framework.ui.plugin.util.StringLabelProvider;
-import org.eclipse.osee.framework.ui.skynet.widgets.XCheckBox;
-import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
-import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
 import org.eclipse.osee.framework.ui.swt.Displays;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.ui.dialogs.ListDialog;
@@ -42,7 +42,7 @@
  */
 public class EnumSingletonSelectionDialog extends ListDialog {
 
-   private boolean isRemoveAllAllowed = true;
+   private boolean removeAllAllowed = true;
    private boolean removeAllSelected = false;
 
    public EnumSingletonSelectionDialog(AttributeTypeToken attributeType, Collection<? extends Artifact> artifacts) {
@@ -57,43 +57,50 @@
          for (EnumToken enumTok : validEnumValues) {
             options.add(enumTok.getName());
          }
-         isRemoveAllAllowed = AttributeTypeManager.checkIfRemovalAllowed(attributeType, artifacts);
+         removeAllAllowed = AttributeTypeManager.checkIfRemovalAllowed(attributeType, artifacts);
 
       } catch (OseeCoreException ex) {
          options.add(ex.getLocalizedMessage());
       }
       setInput(options);
       setTitle("Select Option (Singleton)");
-      setMessage("Select option or Remove All.");
+      if (removeAllAllowed) {
+         setMessage("OR Select Option");
+      } else {
+         setMessage("Select Option");
+      }
       setContentProvider(new ArrayContentProvider());
       setLabelProvider(new StringLabelProvider());
    }
 
    @Override
    protected Control createDialogArea(Composite container) {
-      Control control = super.createDialogArea(container);
 
-      Composite composite = new Composite(container, SWT.None);
-      composite.setLayout(new GridLayout(2, false));
-      composite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+      Control control = null;
+      if (removeAllAllowed) {
+         Composite composite = new Composite(container, SWT.None);
+         composite.setLayout(new GridLayout(1, false));
+         composite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
 
-      final XCheckBox checkBox = new XCheckBox("Remove All");
-      checkBox.setEditable(isRemoveAllAllowed);
-      checkBox.setVerticalLabel(false);
-      checkBox.createWidgets(composite, 2);
-      checkBox.addXModifiedListener(new XModifiedListener() {
-
-         @Override
-         public void widgetModified(XWidget widget) {
-            removeAllSelected = checkBox.isChecked();
-         }
-      });
-
+         final Button button = new Button(composite, SWT.PUSH);
+         button.setText("Remove All and Close");
+         button.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+               removeAllSelected = true;
+               close();
+            }
+         });
+         super.createDialogArea(composite);
+         control = composite;
+      } else {
+         control = super.createDialogArea(container);
+      }
       return control;
    }
 
    public boolean isRemoveAllSelected() {
-      if (!isRemoveAllAllowed) {
+      if (!removeAllAllowed) {
          return false;
       } else {
          return removeAllSelected;
@@ -101,9 +108,20 @@
    }
 
    public String getSelectedOption() {
+      if (removeAllSelected) {
+         return "";
+      }
       if (getResult().length == 0) {
          return "";
       }
       return (String) getResult()[0];
    }
+
+   public boolean isRemoveAllAllowed() {
+      return removeAllAllowed;
+   }
+
+   public void setRemoveAllAllowed(boolean removeAllAllowed) {
+      this.removeAllAllowed = removeAllAllowed;
+   }
 }
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelection.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelection.java
index 5819bb8..b51ae3a 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelection.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelection.java
@@ -18,6 +18,7 @@
 import org.eclipse.osee.framework.ui.swt.ALayout;
 import org.eclipse.osee.framework.ui.swt.Widgets;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
@@ -75,7 +76,7 @@
          labelHyperlink.addListener(SWT.MouseUp, new Listener() {
             @Override
             public void handleEvent(Event event) {
-               if (handleSelection()) {
+               if (event.button == 1 && handleSelection()) {
                   refresh();
                   notifyXModifiedListeners();
                }
@@ -147,4 +148,16 @@
       this.includeColon = includeColon;
    }
 
+   public void addLabelWidgetListener(MouseListener listener) {
+      if (Widgets.isAccessible(labelHyperlink)) {
+         labelHyperlink.addMouseListener(listener);
+      }
+   }
+
+   public void addLabelMouseListener(MouseListener listener) {
+      if (Widgets.isAccessible(labelHyperlink)) {
+         labelHyperlink.addMouseListener(listener);
+      }
+   }
+
 }
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelectionDam.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelectionDam.java
index ae8abea..3441c30 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelectionDam.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XHyperlinkLabelValueSelectionDam.java
@@ -22,8 +22,6 @@
 import org.eclipse.osee.framework.jdk.core.util.DateUtil;
 import org.eclipse.osee.framework.jdk.core.util.Strings;
 import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
-import org.eclipse.osee.framework.skynet.core.validation.IOseeValidator;
-import org.eclipse.osee.framework.skynet.core.validation.OseeValidator;
 import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactPromptChange;
 import org.eclipse.osee.framework.ui.skynet.internal.Activator;
 
@@ -38,6 +36,7 @@
 
    protected Artifact artifact;
    protected AttributeTypeToken attributeType;
+   public static String NOT_SET = "Not Set";
 
    public XHyperlinkLabelValueSelectionDam() {
       super("");
@@ -61,7 +60,7 @@
       }
       String value = artifact.getAttributesToString(attributeType);
       if (Strings.isInValid(value)) {
-         value = "No Set";
+         value = NOT_SET;
       }
       return value;
    }
@@ -114,9 +113,15 @@
       IStatus status = super.isValid();
       if (status.isOK()) {
          try {
-            if (getArtifact() != null && getAttributeType() != null && Strings.isValid(getCurrentValue())) {
-               status = OseeValidator.getInstance().validate(IOseeValidator.SHORT, getArtifact(), getAttributeType(),
-                  getCurrentValue());
+            if (getArtifact() != null && getAttributeType() != null) {
+               String currValue = getCurrentValue();
+               if (NOT_SET.equals(currValue)) {
+                  currValue = "";
+               }
+               if (isRequiredEntry() && Strings.isInValid(currValue)) {
+                  status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+                     String.format("Must select [%s]", getAttributeType().getUnqualifiedName()));
+               }
             }
          } catch (OseeCoreException ex) {
             status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Error getting Artifact", ex);
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/FilteredCheckboxTreeDialog.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/FilteredCheckboxTreeDialog.java
index 4006acf..9c521f7 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/FilteredCheckboxTreeDialog.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/FilteredCheckboxTreeDialog.java
@@ -136,7 +136,7 @@
          SWT.CHECK | (multiSelect ? SWT.MULTI : SWT.NONE) | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER,
          patternFilter);
       GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-      gd.heightHint = 500;
+      gd.heightHint = 350;
       treeViewer.getViewer().getTree().setLayoutData(gd);
       treeViewer.getViewer().setContentProvider(contentProvider);
       treeViewer.getViewer().setLabelProvider(labelProvider);
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/FilteredTreeDialog.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/FilteredTreeDialog.java
index 9ab71cc..6c626ee 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/FilteredTreeDialog.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/dialog/FilteredTreeDialog.java
@@ -131,7 +131,7 @@
          (multiSelect ? SWT.MULTI : SWT.NONE) | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, patternFilter,
          true);
       GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-      gd.heightHint = 500;
+      gd.heightHint = 350;
       treeViewer.getViewer().getTree().setLayoutData(gd);
       treeViewer.getViewer().setContentProvider(contentProvider);
       treeViewer.getViewer().setLabelProvider(labelProvider);