feature[TW19120]: Add Auto-Save to XComboDam and XIntegerDam

Change-Id: I028a90b7fd5dfd46cbda6eb91518d9ef17d6fba1
diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/WidgetOption.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/WidgetOption.java
index 2b2bc7a..cb4f765 100644
--- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/WidgetOption.java
+++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/WidgetOption.java
@@ -22,6 +22,9 @@
    REQUIRED_FOR_TRANSITION,
    NOT_REQUIRED_FOR_TRANSITION,
 
+   AUTO_SAVE,
+   NOT_AUTO_SAVE,
+
    REQUIRED_FOR_COMPLETION,
    NOT_REQUIRED_FOR_COMPLETION,
 
diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/WidgetOptionHandler.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/WidgetOptionHandler.java
index 37b7034..f2ea877 100644
--- a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/WidgetOptionHandler.java
+++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/workdef/WidgetOptionHandler.java
@@ -62,6 +62,10 @@
          options.remove(WidgetOption.REQUIRED_FOR_TRANSITION);
       } else if (xOption == WidgetOption.REQUIRED_FOR_TRANSITION) {
          options.remove(WidgetOption.NOT_REQUIRED_FOR_TRANSITION);
+      } else if (xOption == WidgetOption.AUTO_SAVE) {
+         options.remove(WidgetOption.NOT_AUTO_SAVE);
+      } else if (xOption == WidgetOption.NOT_AUTO_SAVE) {
+         options.remove(WidgetOption.AUTO_SAVE);
       } else if (xOption == WidgetOption.NOT_ENABLED) {
          options.remove(WidgetOption.ENABLED);
       } else if (xOption == WidgetOption.ENABLED) {
diff --git a/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/workdef/WidgetOptionTest.java b/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/workdef/WidgetOptionTest.java
index ecd3f84..7a2a8a2 100644
--- a/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/workdef/WidgetOptionTest.java
+++ b/plugins/org.eclipse.osee.ats.core.test/src/org/eclipse/osee/ats/core/workdef/WidgetOptionTest.java
@@ -26,7 +26,7 @@
 
    @Test
    public void testValues() {
-      Assert.assertEquals(32, WidgetOption.values().length);
+      Assert.assertEquals(34, WidgetOption.values().length);
    }
 
    @Test
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboDam.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboDam.java
index de2eac4..95bd7a9 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboDam.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XComboDam.java
@@ -26,6 +26,7 @@
 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.internal.Activator;
+import org.eclipse.swt.widgets.Composite;
 
 /**
  * @author Donald G. Dunne
@@ -45,6 +46,25 @@
    }
 
    @Override
+   protected void createControls(Composite parent, int horizontalSpan) {
+      super.createControls(parent, horizontalSpan);
+      if (isAutoSave()) {
+         addXModifiedListener(new XModifiedListener() {
+
+            @Override
+            public void widgetModified(XWidget widget) {
+               if (artifact != null && artifact.isValid()) {
+                  saveToArtifact();
+                  if (artifact.isDirty()) {
+                     artifact.persist("XComboDam Auto-Save");
+                  }
+               }
+            }
+         });
+      }
+   }
+
+   @Override
    public AttributeTypeToken getAttributeType() {
       return attributeType;
    }
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XIntegerDam.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XIntegerDam.java
index be1a8a1..f9a09a6 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XIntegerDam.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XIntegerDam.java
@@ -21,6 +21,9 @@
 import org.eclipse.osee.framework.logging.OseeLog;
 import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
 import org.eclipse.osee.framework.ui.skynet.internal.Activator;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.widgets.Composite;
 
 /**
  * @author Donald G. Dunne
@@ -36,6 +39,26 @@
    }
 
    @Override
+   protected void createControls(Composite parent, int horizontalSpan) {
+      super.createControls(parent, horizontalSpan);
+      if (isAutoSave()) {
+         getStyledText().addFocusListener(new FocusAdapter() {
+
+            @Override
+            public void focusLost(FocusEvent e) {
+               if (artifact != null && artifact.isValid()) {
+                  saveToArtifact();
+                  if (artifact.isDirty()) {
+                     artifact.persist("XIntegerDam Auto-Save");
+                  }
+               }
+            }
+
+         });
+      }
+   }
+
+   @Override
    public Artifact getArtifact() {
       return artifact;
    }
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOption.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOption.java
index 29dce90..a9520ce 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOption.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOption.java
@@ -22,6 +22,8 @@
 public enum XOption {
    NONE("", ""),
 
+   AUTO_SAVE("autoSave", "true"),
+   NOT_AUTO_SAVE("autoSave", "false"),
    REQUIRED("required", "true"),
    NOT_REQUIRED("required", "false"),
    REQUIRED_FOR_COMPLETION("requiredForCompletion", "true"),
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOptionHandler.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOptionHandler.java
index e45dd6c..f6a9582 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOptionHandler.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XOptionHandler.java
@@ -54,6 +54,12 @@
          case REQUIRED:
             xOptions.remove(XOption.NOT_REQUIRED);
             break;
+         case AUTO_SAVE:
+            xOptions.remove(XOption.NOT_AUTO_SAVE);
+            break;
+         case NOT_AUTO_SAVE:
+            xOptions.remove(XOption.AUTO_SAVE);
+            break;
          case NOT_REQUIRED_FOR_COMPLETION:
             xOptions.remove(XOption.REQUIRED_FOR_COMPLETION);
             break;
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java
index 2a913c2..4eeb25f 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/XWidget.java
@@ -69,6 +69,7 @@
    private ArtifactTypeId artifactType;
    private String id;
    protected Object defaultValueObj;
+   private boolean autoSave = false;
 
    public XWidget(String label) {
       this.label = label;
@@ -454,4 +455,12 @@
    public void setDefaultValueObj(Object defaultValueObj) {
       this.defaultValueObj = defaultValueObj;
    }
+
+   public boolean isAutoSave() {
+      return autoSave;
+   }
+
+   public void setAutoSave(boolean autoSave) {
+      this.autoSave = autoSave;
+   }
 }
\ 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/SwtXWidgetRenderer.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/SwtXWidgetRenderer.java
index 8630f4f..7d60f37 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/SwtXWidgetRenderer.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/util/SwtXWidgetRenderer.java
@@ -129,6 +129,7 @@
       xWidget.setRequiredEntry(xWidgetLayoutData.isRequired());
       xWidget.setEditable(xWidgetLayoutData.getXOptionHandler().contains(XOption.EDITABLE) && isEditable);
       xWidget.setNoSelect(xWidgetLayoutData.getXOptionHandler().contains(XOption.NO_SELECT));
+      xWidget.setAutoSave(xWidgetLayoutData.getXOptionHandler().contains(XOption.AUTO_SAVE));
 
       xWidget.setArtifactType(xWidgetLayoutData.getArtifactType());