feature: Add shading to Resource History

Change-Id: I55dcc4160509f8526e85c880e3ad8f5cad2c2921
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewer.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewer.java
index c3d8935..8181e56 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewer.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewer.java
@@ -17,6 +17,7 @@
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
 import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
 import org.eclipse.osee.framework.ui.skynet.render.PresentationType;
 import org.eclipse.osee.framework.ui.skynet.render.RendererManager;
@@ -55,7 +56,7 @@
          for (TreeItem item : items) {
             Artifact artifact = null;
             if (item.getData() instanceof IAdaptable) {
-               artifact = (Artifact) ((IAdaptable) item.getData()).getAdapter(Artifact.class);
+               artifact = ((IAdaptable) item.getData()).getAdapter(Artifact.class);
 
                if (artifact != null) {
                   arts.add(artifact);
@@ -106,4 +107,12 @@
       return xHistoryViewer;
    }
 
+   public boolean isSortByTransaction() {
+      CustomizeData generateCustDataFromTable =
+         xHistoryViewer.getXViewer().getCustomizeMgr().generateCustDataFromTable();
+      return generateCustDataFromTable.getSortingData().getSortingIds().contains(
+         HistoryXViewerFactory.transaction.getId());
+
+   }
+
 }
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewerFactory.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewerFactory.java
index 4dc33aa..9a0e963 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewerFactory.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/HistoryXViewerFactory.java
@@ -23,7 +23,7 @@
  */
 public class HistoryXViewerFactory extends SkynetXViewerFactory {
    public final static XViewerColumn transaction = new XViewerColumn("framework.history.transaction", "Transaction",
-      70, SWT.LEFT, true, SortDataType.Integer, false, null);
+      90, SWT.LEFT, true, SortDataType.Integer, false, null);
    public final static XViewerColumn gamma = new XViewerColumn("framework.history.gamma", "Gamma", 60, SWT.LEFT, false,
       SortDataType.Integer, false, null);
    public final static XViewerColumn itemType = new XViewerColumn("framework.history.itemType", "Item Type", 150,
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryLabelProvider.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryLabelProvider.java
index 7cb1975..1faf5e1 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryLabelProvider.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryLabelProvider.java
@@ -21,18 +21,22 @@
 import org.eclipse.osee.framework.skynet.core.change.RelationChange;
 import org.eclipse.osee.framework.ui.skynet.ArtifactImageManager;
 import org.eclipse.osee.framework.ui.skynet.FrameworkImage;
+import org.eclipse.osee.framework.ui.swt.Displays;
 import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Image;
 
 /**
  * @author Jeff C. Phillips
  */
 public class XHistoryLabelProvider extends XViewerLabelProvider {
-   private final HistoryXViewer changeXViewer;
 
-   public XHistoryLabelProvider(HistoryXViewer changeXViewer) {
-      super(changeXViewer);
-      this.changeXViewer = changeXViewer;
+   private final HistoryXViewer historyXViewer;
+   private static Color lightGreyColor;
+
+   public XHistoryLabelProvider(HistoryXViewer historyXViewer) {
+      super(historyXViewer);
+      this.historyXViewer = historyXViewer;
    }
 
    @Override
@@ -116,7 +120,7 @@
    }
 
    public HistoryXViewer getTreeViewer() {
-      return changeXViewer;
+      return historyXViewer;
    }
 
    @Override
@@ -138,4 +142,23 @@
       return null;
    }
 
+   @Override
+   public Color getBackground(Object element, int columnIndex) {
+      if (historyXViewer.isSortByTransaction()) {
+         Change change = (Change) element;
+         long transactionId = change.getTxDelta().getEndTx().getId();
+         if (historyXViewer.getXHisotryViewer().isShaded(transactionId)) {
+            return getLightGreyColor();
+         }
+      }
+      return super.getBackground(element, columnIndex);
+   }
+
+   private Color getLightGreyColor() {
+      if (lightGreyColor == null) {
+         lightGreyColor = Displays.getColor(234, 234, 234);
+      }
+      return lightGreyColor;
+   }
+
 }
diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryWidget.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryWidget.java
index f6874b5..0bc0bec 100644
--- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryWidget.java
+++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/widgets/xHistory/XHistoryWidget.java
@@ -13,7 +13,10 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Set;
+import java.util.TreeSet;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
@@ -73,6 +76,7 @@
    private Artifact artifact;
    private ToolBar toolBar;
    private Composite rightComp;
+   private final Set<Long> shadedTransactions = new HashSet<>();
 
    public XHistoryWidget() {
       super("History");
@@ -186,7 +190,7 @@
    }
 
    protected void onRefresh() {
-      // Can be overridden by clients 
+      // Can be overridden by clients
    }
 
    public void loadTable() {
@@ -284,6 +288,7 @@
                            extraInfoLabel.setText(infoLabel);
                         }
                         if (Widgets.isAccessible(xHistoryViewer.getControl())) {
+                           calculateShading(changes);
                            xHistoryViewer.setInput(changes);
                         }
                      } else {
@@ -292,6 +297,7 @@
                         }
                      }
                   }
+
                });
             } catch (OseeCoreException ex) {
                OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex);
@@ -301,6 +307,39 @@
       };
       Jobs.startJob(job);
    }
+
+   private void calculateShading(Collection<Change> changes) {
+      shadedTransactions.clear();
+      try {
+         Set<Long> transactionIds = new TreeSet<>();
+         for (Change change : changes) {
+            long transId = change.getTxDelta().getEndTx().getId();
+            transactionIds.add(transId);
+         }
+
+         /**
+          * Loop through sorted transactionIds and store every other one in shadedTransactions collection. This allows
+          * isShaded method to quickly return true or false for transactionId.
+          */
+         boolean shade = false;
+         for (Long transId : transactionIds) {
+            if (shade) {
+               shadedTransactions.add(transId);
+            }
+            shade = !shade;
+         }
+      } catch (Exception ex) {
+         // do nothing
+      }
+   }
+
+   /**
+    * @return true if transactionId line should be shaded, false otherwise
+    */
+   public boolean isShaded(Long transactionId) {
+      return shadedTransactions.contains(transactionId);
+   }
+
    public class HistoryDragAndDrop extends SkynetDragAndDrop {
 
       public HistoryDragAndDrop(Tree tree, String viewId) {
@@ -321,7 +360,7 @@
             for (Object object : selection.toArray()) {
 
                if (object instanceof IAdaptable) {
-                  Artifact artifact = (Artifact) ((IAdaptable) object).getAdapter(Artifact.class);
+                  Artifact artifact = ((IAdaptable) object).getAdapter(Artifact.class);
 
                   if (artifact != null) {
                      artifacts.add(artifact);