feature[TW18823]: Create generic read-only XList to show related items

Change-Id: I8263b345440d0b4562b82302f604bdeddf2efcf8
Signed-off-by: bhawana.mishra <bhawana.mishra@boeing.com>
diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/IAtsWidgetDefinition.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/IAtsWidgetDefinition.java
index cf4026d..5a6b2ca 100644
--- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/IAtsWidgetDefinition.java
+++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/IAtsWidgetDefinition.java
@@ -15,6 +15,7 @@
 
 import java.util.Map;
 import org.eclipse.osee.framework.core.data.AttributeTypeToken;
+import org.eclipse.osee.framework.core.data.RelationTypeSide;
 
 /**
  * @author Donald G. Dunne
@@ -61,4 +62,6 @@
 
    Map<String, Object> getParameters();
 
+   RelationTypeSide getRelationTypeSide();
+
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/model/WidgetDefinition.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/model/WidgetDefinition.java
index 10465e1..eedb20f 100644
--- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/model/WidgetDefinition.java
+++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/model/WidgetDefinition.java
@@ -20,6 +20,7 @@
 import org.eclipse.osee.ats.api.workdef.WidgetOption;
 import org.eclipse.osee.ats.api.workdef.WidgetOptionHandler;
 import org.eclipse.osee.framework.core.data.AttributeTypeToken;
+import org.eclipse.osee.framework.core.data.RelationTypeSide;
 import org.eclipse.osee.framework.jdk.core.util.Conditions;
 
 /**
@@ -27,31 +28,40 @@
  */
 public class WidgetDefinition extends LayoutItem implements IAtsWidgetDefinition {
 
-   private AttributeTypeToken attributeType;
+   private final AttributeTypeToken attributeType;
+   private final Map<String, Object> parameters = new HashMap<String, Object>();
+   private final RelationTypeSide relationTypeSide;
+   private final WidgetOptionHandler options = new WidgetOptionHandler();
+
    private String toolTip;
    private String description;
    private int height;
    private String xWidgetName;
    private String defaultValue;
-   private final WidgetOptionHandler options = new WidgetOptionHandler();
    private Double min;
    private Double max;
-   private final Map<String, Object> parameters = new HashMap<String, Object>();
 
    public WidgetDefinition(String name) {
-      super(name);
+      this(name, "");
+   }
+
+   public WidgetDefinition(String name, AttributeTypeToken attributeType, String xWidgetName, WidgetOption... widgetOptions) {
+      this(name, RelationTypeSide.SENTINEL, attributeType, xWidgetName, widgetOptions);
    }
 
    public WidgetDefinition(String name, String xWidgetName, WidgetOption... widgetOptions) {
-      this(name, AttributeTypeToken.SENTINEL, xWidgetName, widgetOptions);
+      this(name, RelationTypeSide.SENTINEL, AttributeTypeToken.SENTINEL, xWidgetName, widgetOptions);
    }
 
-   public WidgetDefinition(String name, AttributeTypeToken attrType, String xWidgetName, WidgetOption... widgetOptions) {
-      this(name);
-      Conditions.assertNotNull(attrType, "attribute type can not be null for WidgetDefinition [%s]", name);
-      if (attrType.isValid()) {
-         setAttributeType(attrType);
-      }
+   public WidgetDefinition(String name, RelationTypeSide relationTypeSide, String xWidgetName, WidgetOption... widgetOptions) {
+      this(name, relationTypeSide, AttributeTypeToken.SENTINEL, xWidgetName, widgetOptions);
+   }
+
+   public WidgetDefinition(String name, RelationTypeSide relationTypeSide, AttributeTypeToken attributeType, String xWidgetName, WidgetOption... widgetOptions) {
+      super(name);
+      this.relationTypeSide = relationTypeSide;
+      Conditions.assertNotNull(attributeType, "attribute type can not be null for WidgetDefinition [%s]", name);
+      this.attributeType = attributeType;
       this.xWidgetName = xWidgetName;
       for (WidgetOption opt : widgetOptions) {
          options.add(opt);
@@ -59,7 +69,7 @@
    }
 
    public WidgetDefinition(AttributeTypeToken attrType, String xWidgetName, WidgetOption... widgetOptions) {
-      this(attrType.getUnqualifiedName(), attrType, xWidgetName, widgetOptions);
+      this(attrType.getUnqualifiedName(), RelationTypeSide.SENTINEL, attrType, xWidgetName, widgetOptions);
    }
 
    @Override
@@ -123,7 +133,7 @@
    @Override
    public String toString() {
       return String.format("[%s][%s]", getName(),
-         getAttributeType() == null ? "" : getAttributeType().toStringWithId());
+         getAttributeType().isValid() ? getAttributeType().toStringWithId() : "");
    }
 
    @Override
@@ -147,16 +157,17 @@
       return max;
    }
 
-   public void setAttributeType(AttributeTypeToken attributeTypeTok) {
-      this.attributeType = attributeTypeTok;
-   }
-
    @Override
    public AttributeTypeToken getAttributeType() {
       return attributeType;
    }
 
    @Override
+   public RelationTypeSide getRelationTypeSide() {
+      return relationTypeSide;
+   }
+
+   @Override
    public void addParameter(String key, Object obj) {
       parameters.put(key, obj);
    }
diff --git a/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/workdef/WidgetDefinitionTest.java b/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/workdef/WidgetDefinitionTest.java
index db1febb..990c1ca 100644
--- a/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/workdef/WidgetDefinitionTest.java
+++ b/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/workdef/WidgetDefinitionTest.java
@@ -15,7 +15,6 @@
 
 import org.eclipse.osee.ats.api.workdef.WidgetOption;
 import org.eclipse.osee.ats.api.workdef.model.WidgetDefinition;
-import org.eclipse.osee.framework.core.data.AttributeTypeToken;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -41,14 +40,6 @@
    }
 
    @Test
-   public void testGetSetAttribute() {
-      WidgetDefinition item = new WidgetDefinition("review");
-      Assert.assertEquals(null, item.getAttributeType());
-      item.setAttributeType(AttributeTypeToken.valueOf(123L, "desc"));
-      Assert.assertEquals("desc", item.getAttributeType().getName());
-   }
-
-   @Test
    public void testGetSetTooltip() {
       WidgetDefinition item = new WidgetDefinition("review");
       Assert.assertEquals(null, item.getToolTip());
@@ -59,7 +50,7 @@
    @Test
    public void testGetSetWidgetname() {
       WidgetDefinition item = new WidgetDefinition("review");
-      Assert.assertEquals(null, item.getXWidgetName());
+      Assert.assertEquals("", item.getXWidgetName());
       item.setXWidgetName("desc");
       Assert.assertEquals("desc", item.getXWidgetName());
    }
diff --git a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workdef/internal/workdefs/WorkDefTeamDemoTest.java b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workdef/internal/workdefs/WorkDefTeamDemoTest.java
index dc7fd3d..462d093 100644
--- a/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workdef/internal/workdefs/WorkDefTeamDemoTest.java
+++ b/plugins/org.eclipse.osee.ats.core/src/org/eclipse/osee/ats/core/workdef/internal/workdefs/WorkDefTeamDemoTest.java
@@ -14,8 +14,10 @@
 package org.eclipse.osee.ats.core.workdef.internal.workdefs;
 
 import static org.eclipse.osee.ats.api.workdef.WidgetOption.FILL_VERTICALLY;
+import static org.eclipse.osee.ats.api.workdef.WidgetOption.NO_SELECT;
 import static org.eclipse.osee.ats.api.workdef.WidgetOption.REQUIRED_FOR_TRANSITION;
 import org.eclipse.osee.ats.api.data.AtsAttributeTypes;
+import org.eclipse.osee.ats.api.data.AtsRelationTypes;
 import org.eclipse.osee.ats.api.demo.DemoWorkDefinitions;
 import org.eclipse.osee.ats.api.workdef.StateColor;
 import org.eclipse.osee.ats.api.workdef.StateToken;
@@ -65,6 +67,7 @@
                new WidgetDefinition(AtsAttributeTypes.Priority, "XComboDam(1,2,3,4,5)"), //
                new WidgetDefinition(AtsAttributeTypes.NeedBy, "XDateDam") //
             ), //
+            new WidgetDefinition("Related Tasks", AtsRelationTypes.TeamWfToTask_Task, "XListRelationWidget", NO_SELECT), //
             new WidgetDefinition(AtsAttributeTypes.ValidationRequired, "XComboBooleanDam"), //
             new WidgetDefinition(AtsAttributeTypes.WorkPackage, "XTextDam"));
 
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 9b2c429..a8768c9 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
@@ -47,7 +47,6 @@
 import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
 import org.eclipse.osee.framework.ui.skynet.artifact.editor.parts.AttributeFormPart;
 import org.eclipse.osee.framework.ui.skynet.widgets.ArtifactStoredWidget;
-import org.eclipse.osee.framework.ui.skynet.widgets.AttributeWidget;
 import org.eclipse.osee.framework.ui.skynet.widgets.XLabelValue;
 import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
 import org.eclipse.osee.framework.ui.skynet.widgets.XText;
@@ -469,9 +468,9 @@
       super.refresh();
       try {
          for (XWidget xWidget : allXWidgets) {
-            if (xWidget instanceof AttributeWidget) {
-               // Reload with with current artifact/attribute value
-               ((AttributeWidget) xWidget).reSet();
+            if (xWidget instanceof ArtifactStoredWidget) {
+               // Reload with with current artifact/attribute/relation
+               ((ArtifactStoredWidget) xWidget).reSet();
             } else {
                xWidget.refresh();
             }
diff --git a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workdef/WidgetPageUtil.java b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workdef/WidgetPageUtil.java
index 18bc80f..98a150b 100644
--- a/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workdef/WidgetPageUtil.java
+++ b/plugins/org.eclipse.osee.ats.ide/src/org/eclipse/osee/ats/ide/workdef/WidgetPageUtil.java
@@ -157,6 +157,7 @@
             data.setStoreName(widgetDef.getAttributeType().getName());
             data.setStoreId(widgetDef.getAttributeType().getId());
          }
+         data.setRelationTypeSide(widgetDef.getRelationTypeSide());
          data.setToolTip(widgetDef.getToolTip());
          data.setId(widgetDef.getName());
          data.setXWidgetName(widgetDef.getXWidgetName());
diff --git a/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/RelationTypeSide.java b/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/RelationTypeSide.java
index 3dd3816..0ec4f5e 100644
--- a/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/RelationTypeSide.java
+++ b/plugins/org.eclipse.osee.framework.core/src/org/eclipse/osee/framework/core/data/RelationTypeSide.java
@@ -23,6 +23,9 @@
  */
 public class RelationTypeSide extends NamedIdBase implements RelationTypeToken {
 
+   public static final RelationTypeSide SENTINEL =
+      new RelationTypeSide(RelationTypeToken.SENTINEL, RelationSide.SIDE_A);
+
    private final RelationTypeToken type;
    private final RelationSide side;
    private RelationTypeSide opposite;
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/ArtifactStoredWidget.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/ArtifactStoredWidget.java
index 52f3ba1..3c72abe 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/ArtifactStoredWidget.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/ArtifactStoredWidget.java
@@ -17,8 +17,8 @@
 import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
 
 /**
- * Used by XWidgets that perform external data storage
- * 
+ * Used by XWidgets that perform data binding using OSEE artifacts
+ *
  * @author Roberto E. Escobar
  */
 public interface ArtifactStoredWidget {
@@ -31,16 +31,22 @@
    /**
     * Save data changes to artifact
     */
-   public void saveToArtifact();
+   void saveToArtifact();
 
    /**
     * Revert changes to widget data back to what was in artifact
     */
-   public void revert();
+   void revert();
 
    /**
     * Return true if storage data different than widget data
     */
-   public Result isDirty();
+   Result isDirty();
 
-}
+   /**
+    * Reload widget from current attribute value
+    */
+   default void reSet() {
+      // if necessary reload the bound data
+   }
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/AttributeWidget.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/AttributeWidget.java
index 6decc47..78dcd18 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/AttributeWidget.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/AttributeWidget.java
@@ -17,7 +17,7 @@
 import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
 
 /**
- * Used by XWidgets that perform external data storage
+ * Used by XWidgets that perform data binding using OSEE attributes
  *
  * @author Roberto E. Escobar
  */
@@ -26,16 +26,10 @@
    /**
     * Set attributeType used as storage for this widget
     */
-   public void setAttributeType(Artifact artifact, AttributeTypeToken attributeTypeToken);
+   void setAttributeType(Artifact artifact, AttributeTypeToken attributeTypeToken);
 
    /**
-    * Get attributeType used as storage for this widget
+    * Get attributeType used for data binding for this widget
     */
-   public AttributeTypeToken getAttributeType();
-
-   /**
-    * Reload widget from current attr value
-    */
-   public void reSet();
-
-}
+   AttributeTypeToken getAttributeType();
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/RelationWidget.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/RelationWidget.java
new file mode 100644
index 0000000..e776fe4
--- /dev/null
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/RelationWidget.java
@@ -0,0 +1,30 @@
+/*********************************************************************
+ * 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.framework.ui.skynet.widgets;
+
+import org.eclipse.osee.framework.core.data.RelationTypeSide;
+
+/**
+ * Used by XWidgets that perform data binding using OSEE relations
+ *
+ * @author Ryan D. Brooks
+ */
+public interface RelationWidget extends ArtifactStoredWidget {
+
+   /**
+    * Get relationTypeSide used for data binding for this widget
+    */
+   RelationTypeSide getRelationTypeSide();
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XList.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XList.java
index 7c5394a..02dcf38 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XList.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XList.java
@@ -179,7 +179,7 @@
       if (grabHorizontal) {
          gridData5.grabExcessHorizontalSpace = true;
       }
-      int listHeight = listList.getItemHeight() * 6;
+      int listHeight = listList.getItemHeight() * 3;
       Rectangle trim = listList.computeTrim(0, 0, 0, listHeight);
       gridData5.heightHint = trim.height;
       gridData5.grabExcessVerticalSpace = true;
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListRelationWidget.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListRelationWidget.java
new file mode 100644
index 0000000..d1dea35
--- /dev/null
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XListRelationWidget.java
@@ -0,0 +1,82 @@
+package org.eclipse.osee.framework.ui.skynet.widgets;
+/*********************************************************************
+ * 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
+ **********************************************************************/
+
+import java.util.Collection;
+import org.eclipse.osee.framework.core.data.ArtifactToken;
+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.skynet.core.artifact.Artifact;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Currently supports read-only usage of relations, but is designed to support editing also
+ *
+ * @author Bhawana Mishra
+ */
+public class XListRelationWidget extends XList implements RelationWidget {
+
+   public static final String WIDGET_ID = XListRelationWidget.class.getSimpleName();
+
+   private final RelationTypeSide relationTypeSide;
+   private final Artifact artifact;
+
+   public XListRelationWidget(Artifact artifact, String displayLabel, RelationTypeSide relationTypeSide) {
+      super(displayLabel);
+      this.relationTypeSide = relationTypeSide;
+      this.artifact = artifact;
+   }
+
+   @Override
+   protected void createControls(Composite parent, int horizontalSpan) {
+      super.createControls(parent, horizontalSpan);
+      reSet();
+   }
+
+   private Collection<String> getRelateditems() {
+      return Collections.transform(artifact.getRelatedArtifacts(relationTypeSide), ArtifactToken::getName);
+   }
+
+   @Override
+   public Artifact getArtifact() {
+      return artifact;
+   }
+
+   @Override
+   public void saveToArtifact() {
+      // TODO: implement if relation editing is added to this widget
+   }
+
+   @Override
+   public void revert() {
+      // TODO: implement if relation editing is added to this widget
+   }
+
+   @Override
+   public Result isDirty() {
+      return Result.FalseResult;
+   }
+
+   @Override
+   public RelationTypeSide getRelationTypeSide() {
+      return relationTypeSide;
+      //      This will not be called automatically since RelationWidget is new.  Need to handle this case in org.eclipse.osee.ats.ide.editor.tab.workflow.section.WfeWorkflowSection.refresh().  Please test that if relation is deleted/added in ArtifactEditor, the WorkflowEditor refreshes correctly.
+   }
+
+   @Override
+   public void reSet() {
+      add(getRelateditems());
+      updateListWidget();
+   }
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/FrameworkXWidgetProvider.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/FrameworkXWidgetProvider.java
index 01d632e..b85e9e8 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/FrameworkXWidgetProvider.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/FrameworkXWidgetProvider.java
@@ -75,11 +75,13 @@
 import org.eclipse.osee.framework.ui.skynet.widgets.XListDam;
 import org.eclipse.osee.framework.ui.skynet.widgets.XListDropViewWithSave;
 import org.eclipse.osee.framework.ui.skynet.widgets.XListDropViewer;
+import org.eclipse.osee.framework.ui.skynet.widgets.XListRelationWidget;
 import org.eclipse.osee.framework.ui.skynet.widgets.XLong;
 import org.eclipse.osee.framework.ui.skynet.widgets.XLongDam;
 import org.eclipse.osee.framework.ui.skynet.widgets.XMembersCombo;
 import org.eclipse.osee.framework.ui.skynet.widgets.XMembersList;
 import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
+import org.eclipse.osee.framework.ui.skynet.widgets.XOptionHandler;
 import org.eclipse.osee.framework.ui.skynet.widgets.XRadioButton;
 import org.eclipse.osee.framework.ui.skynet.widgets.XRadioButtons;
 import org.eclipse.osee.framework.ui.skynet.widgets.XSelectFromMultiChoiceBranch;
@@ -150,8 +152,10 @@
             }
          }
 
+         XOptionHandler options = xWidgetLayoutData.getXOptionHandler();
          if (xWidget == null) {
             // Otherwise, use default widget creation
+
             if (xWidgetName.equals("XText")) {
                xWidget = new XText(name);
                if (Strings.isValid(xWidgetLayoutData.getDefaultValue())) {
@@ -159,10 +163,6 @@
                }
             } else if (xWidgetName.equals("XSelectFromMultiChoiceBranch")) {
                XSelectFromMultiChoiceBranch multiBranchSelect = new XSelectFromMultiChoiceBranch(name);
-               int maxSelectionRequired = 1;
-               if (xWidgetLayoutData.getXOptionHandler().contains(XOption.MULTI_SELECT)) {
-                  maxSelectionRequired = Integer.MAX_VALUE;
-               }
                try {
                   List<? extends IOseeBranch> branches =
                      BranchManager.getBranches(BranchArchivedState.ALL, BranchType.WORKING, BranchType.BASELINE);
@@ -190,7 +190,7 @@
                if (values.length > 0) {
                   XRadioButtons radio = new XRadioButtons(name, "");
 
-                  if (xWidgetLayoutData.getXOptionHandler().contains(XOption.SORTED)) {
+                  if (options.contains(XOption.SORTED)) {
                      Arrays.sort(values);
                   }
 
@@ -253,22 +253,22 @@
                }
             } else if (xWidgetName.equals("XCheckBox")) {
                XCheckBox checkBox = new XCheckBox(name);
-               checkBox.setLabelAfter(xWidgetLayoutData.getXOptionHandler().contains(XOption.LABEL_AFTER));
+               checkBox.setLabelAfter(options.contains(XOption.LABEL_AFTER));
                if (Strings.isValid(xWidgetLayoutData.getDefaultValue())) {
                   checkBox.set(Boolean.valueOf(xWidgetLayoutData.getDefaultValue()));
                }
                xWidget = checkBox;
             } else if (xWidgetName.equals("XCheckBoxDam")) {
                XCheckBoxDam checkBox = new XCheckBoxDam(name);
-               checkBox.setLabelAfter(xWidgetLayoutData.getXOptionHandler().contains(XOption.LABEL_AFTER));
+               checkBox.setLabelAfter(options.contains(XOption.LABEL_AFTER));
                xWidget = checkBox;
             } else if (xWidgetName.equals("XCheckBoxThreeState")) {
                XCheckBoxThreeState checkBox = new XCheckBoxThreeState(name);
-               checkBox.setLabelAfter(xWidgetLayoutData.getXOptionHandler().contains(XOption.LABEL_AFTER));
+               checkBox.setLabelAfter(options.contains(XOption.LABEL_AFTER));
                xWidget = checkBox;
             } else if (xWidgetName.equals("XCheckBoxThreeStateDam")) {
                XCheckBoxThreeStateDam checkBox = new XCheckBoxThreeStateDam(name);
-               checkBox.setLabelAfter(xWidgetLayoutData.getXOptionHandler().contains(XOption.LABEL_AFTER));
+               checkBox.setLabelAfter(options.contains(XOption.LABEL_AFTER));
                xWidget = checkBox;
             } else if (xWidgetName.startsWith("XComboDam")) {
                if (xWidgetLayoutData.getDynamicXWidgetLayout() != null) {
@@ -278,10 +278,10 @@
                      xWidget = new XComboDam(name);
                      XComboDam combo = new XComboDam(name);
                      combo.setDataStrings(values);
-                     if (xWidgetLayoutData.getXOptionHandler().contains(XOption.NO_DEFAULT_VALUE)) {
+                     if (options.contains(XOption.NO_DEFAULT_VALUE)) {
                         combo.setDefaultSelectionAllowed(false);
                      }
-                     if (xWidgetLayoutData.getXOptionHandler().contains(XOption.ADD_DEFAULT_VALUE)) {
+                     if (options.contains(XOption.ADD_DEFAULT_VALUE)) {
                         combo.setDefaultSelectionAllowed(true);
                      }
                      xWidget = combo;
@@ -322,10 +322,10 @@
                      combo.set("");
                   }
                }
-               if (xWidgetLayoutData.getXOptionHandler().contains(XOption.NO_DEFAULT_VALUE)) {
+               if (options.contains(XOption.NO_DEFAULT_VALUE)) {
                   combo.setDefaultSelectionAllowed(false);
                }
-               if (xWidgetLayoutData.getXOptionHandler().contains(XOption.ADD_DEFAULT_VALUE)) {
+               if (options.contains(XOption.ADD_DEFAULT_VALUE)) {
                   combo.setDefaultSelectionAllowed(true);
                }
             } else if (xWidgetName.startsWith("XComboViewer")) {
@@ -336,15 +336,15 @@
                if (values.length > 0) {
                   XCombo combo = new XCombo(name);
 
-                  if (xWidgetLayoutData.getXOptionHandler().contains(XOption.SORTED)) {
+                  if (options.contains(XOption.SORTED)) {
                      Arrays.sort(values);
                   }
                   combo.setDataStrings(values);
 
-                  if (xWidgetLayoutData.getXOptionHandler().contains(XOption.NO_DEFAULT_VALUE)) {
+                  if (options.contains(XOption.NO_DEFAULT_VALUE)) {
                      combo.setDefaultSelectionAllowed(false);
                   }
-                  if (xWidgetLayoutData.getXOptionHandler().contains(XOption.ADD_DEFAULT_VALUE)) {
+                  if (options.contains(XOption.ADD_DEFAULT_VALUE)) {
                      combo.setDefaultSelectionAllowed(true);
                   }
                   xWidget = combo;
@@ -375,6 +375,8 @@
                } else {
                   xWidget = new XListDropViewer(name);
                }
+            } else if (xWidgetName.equals(XListRelationWidget.WIDGET_ID)) {
+               return new XListRelationWidget(artifact, xWidgetName, xWidgetLayoutData.getRelationTypeSide());
             } else if (xWidgetName.startsWith("XList")) {
                String values[] =
                   xWidgetLayoutData.getDynamicXWidgetLayout().getOptionResolver().getWidgetOptions(xWidgetLayoutData);
@@ -391,7 +393,7 @@
                }
             } else if (xWidgetName.startsWith("XArtifactList")) {
                XArtifactList artifactList = new XArtifactList(name);
-               artifactList.setMultiSelect(xWidgetLayoutData.getXOptionHandler().contains(XOption.MULTI_SELECT));
+               artifactList.setMultiSelect(options.contains(XOption.MULTI_SELECT));
                xWidget = artifactList;
             } else if (xWidgetName.equals(XBranchSelectWidgetDam.WIDGET_ID)) {
                xWidget = new XBranchSelectWidgetDam();
@@ -467,7 +469,7 @@
             ((XText) xWidget).addXTextSpellModifyDictionary(new SkynetSpellModifyDictionary());
          }
 
-         if (xWidget != null && xWidgetLayoutData.getXOptionHandler().contains(XOption.NO_LABEL)) {
+         if (xWidget != null && options.contains(XOption.NO_LABEL)) {
             xWidget.setDisplayLabel(false);
          }
          if (artifact != null) {
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/XWidgetRendererItem.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/XWidgetRendererItem.java
index 971fd78..2c10c71 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/XWidgetRendererItem.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/XWidgetRendererItem.java
@@ -16,6 +16,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import org.eclipse.osee.framework.core.data.ArtifactTypeId;
+import org.eclipse.osee.framework.core.data.RelationTypeSide;
 import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
 import org.eclipse.osee.framework.ui.skynet.widgets.XOption;
 import org.eclipse.osee.framework.ui.skynet.widgets.XOptionHandler;
@@ -29,13 +30,14 @@
    private static final FrameworkXWidgetProvider xWidgetFactory = FrameworkXWidgetProvider.getInstance();
    private static final String UNKNOWN = "Unknown";
    private static final int DEFAULT_HEIGHT = 9999;
+   private final Map<String, Object> parameters = new HashMap<String, Object>();
+   private final XOptionHandler xOptionHandler = new XOptionHandler();
 
    private String name = "Unknown";
    private String id = "";
    private String storeName = "";
    private Long storeId = -1L;
    private String xWidgetName = UNKNOWN;
-
    private XWidget xWidget;
    private int beginComposite = 0; // If >0, indicates new child composite with columns == value
    private int beginGroupComposite = 0; // If >0, indicates new child composite with columns == value
@@ -46,12 +48,11 @@
    private SwtXWidgetRenderer dynamicXWidgetLayout;
    private String defaultValue;
    private String keyedBranchName;
-   private final XOptionHandler xOptionHandler = new XOptionHandler();
    private Artifact artifact;
    private Object object;
    private String doubleClickText;
    private ArtifactTypeId artifactType;
-   private final Map<String, Object> parameters = new HashMap<String, Object>();
+   private RelationTypeSide relationTypeSide;
 
    public XWidgetRendererItem(SwtXWidgetRenderer dynamicXWidgetLayout, XOption... xOption) {
       this.dynamicXWidgetLayout = dynamicXWidgetLayout;
@@ -275,6 +276,14 @@
       return doubleClickText;
    }
 
+   public RelationTypeSide getRelationTypeSide() {
+      return relationTypeSide;
+   }
+
+   public void setRelationTypeSide(RelationTypeSide relationTypeSide) {
+      this.relationTypeSide = relationTypeSide;
+   }
+
    /**
     * @return artifactType that may or may not be the storage artifact type. Can be used by any widget and only the
     * widget knows what to do with this value.