Allow deletion of single images from staging area

The delete icon is taken from the Tango Icon Library [1].

[1] http://tango.freedesktop.org/Tango_Icon_Library

Change-Id: I114e5e48ef80452ca1b20ca08a9325f32c1cee28
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/Resources.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/Resources.java
index da2ac9a..1a627db 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/Resources.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/Resources.java
@@ -21,4 +21,7 @@
 
   @Source("info.png")
   public ImageResource info();
+
+  @Source("delete.png")
+  public ImageResource delete();
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadStagePanel.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadStagePanel.java
index e58dfd3..4b27f74 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadStagePanel.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/UploadStagePanel.java
@@ -20,6 +20,7 @@
 import com.google.gwt.event.dom.client.MouseOutHandler;
 import com.google.gwt.event.dom.client.MouseOverEvent;
 import com.google.gwt.event.dom.client.MouseOverHandler;
+import com.google.gwt.user.client.Timer;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.HorizontalPanel;
@@ -107,6 +108,10 @@
     final String dataUrl;
     final String fileName;
 
+    private final Image img;
+    private final Image deleteIcon;
+    private Timer deleteIconHideTimer;
+
     ImagePreview(String project, final String dataUrl, String fileName) {
       this.project = project;
       this.dataUrl = dataUrl;
@@ -114,21 +119,33 @@
 
       setStyleName("imagare-stage-image-preview-panel");
 
-      Image img = new Image(dataUrl);
+      img = new Image(dataUrl);
       img.setStyleName("imagare-stage-image-preview");
       add(img);
 
+      deleteIcon = new Image(ImagarePlugin.RESOURCES.delete());
+      deleteIcon.setStyleName("imagare-delete-icon");
+      deleteIcon.setTitle("Delete Image");
+      deleteIcon.setVisible(false);
+      add(deleteIcon);
+
       img.addMouseOverHandler(new MouseOverHandler() {
         @Override
         public void onMouseOver(MouseOverEvent event) {
           if (!popup.isVisible()) {
-            Image img = new Image(dataUrl);
-            img.setStyleName("imagare-image-popup");
-            popup.add(img);
+            Image previewImg = new Image(dataUrl);
+            previewImg.setStyleName("imagare-image-popup");
+            popup.add(previewImg);
 
             popup.center();
             popup.setVisible(true);
           }
+
+          cancelHideDeleteIcon();
+          deleteIcon.getElement().setAttribute("style",
+              deleteIcon.getElement().getAttribute("style")
+                  + "position: absolute; top: " + img.getAbsoluteTop() + "px;");
+          deleteIcon.setVisible(true);
         }
       });
       img.addMouseOutHandler(new MouseOutHandler() {
@@ -136,6 +153,31 @@
         public void onMouseOut(MouseOutEvent event) {
           popup.setVisible(false);
           popup.clear();
+          hideDeleteIcon();
+        }
+      });
+
+      deleteIcon.addMouseOverHandler(new MouseOverHandler() {
+        @Override
+        public void onMouseOver(MouseOverEvent event) {
+          cancelHideDeleteIcon();
+        }
+      });
+
+      deleteIcon.addMouseOutHandler(new MouseOutHandler() {
+        @Override
+        public void onMouseOut(MouseOutEvent event) {
+          hideDeleteIcon();
+        }
+      });
+
+      deleteIcon.addClickHandler(new ClickHandler() {
+        @Override
+        public void onClick(ClickEvent event) {
+          stagedImagesPanel.remove(ImagePreview.this);
+          UploadStagePanel.this.setVisible(stagedImagesPanel.getWidgetCount() != 0);
+          popup.setVisible(false);
+          popup.clear();
         }
       });
 
@@ -148,5 +190,22 @@
       projectLabel.setStyleName("imagare-stage-label");
       add(projectLabel);
     }
+
+    private void hideDeleteIcon() {
+      deleteIconHideTimer = new Timer() {
+        @Override
+        public void run() {
+          deleteIcon.setVisible(false);
+        }
+      };
+      deleteIconHideTimer.schedule(20);
+    }
+
+    private void cancelHideDeleteIcon() {
+      if (deleteIconHideTimer != null) {
+        deleteIconHideTimer.cancel();
+        deleteIconHideTimer = null;
+      }
+    }
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/delete.png b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/delete.png
new file mode 100644
index 0000000..ea03150
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/delete.png
Binary files differ
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/public/imagare.css b/src/main/java/com/googlesource/gerrit/plugins/imagare/public/imagare.css
index a57d5f2..64ac11a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/public/imagare.css
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/public/imagare.css
@@ -84,3 +84,11 @@
   margin-top: 10px;
   margin-bottom: 10px;
 }
+
+.imagare-delete-icon {
+  z-index: 100;
+  width: 16px;
+  height: 16px;
+  background-color: #FFF !important;
+  border: 1px solid #B3B2B2;
+}