Allow to edit filename of staged images
By double-click on the filename it turns into an edit box that allows
to change the filename. This is e.g. useful if an image is pasted and
a filename should be assigned.
Change-Id: Iceb76d439945e26d9185bb2654626c30b79b7beb
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
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 30ac8b0..62cb40c 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
@@ -14,8 +14,17 @@
package com.googlesource.gerrit.plugins.imagare.client;
+import static com.google.gwt.event.dom.client.KeyCodes.KEY_ENTER;
+import static com.google.gwt.event.dom.client.KeyCodes.KEY_ESCAPE;
+
+import com.google.gwt.event.dom.client.BlurEvent;
+import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.DoubleClickEvent;
+import com.google.gwt.event.dom.client.DoubleClickHandler;
+import com.google.gwt.event.dom.client.KeyDownEvent;
+import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
@@ -27,6 +36,7 @@
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
+import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
public class UploadStagePanel extends VerticalPanel {
@@ -106,7 +116,7 @@
private class ImagePreview extends VerticalPanel {
final String project;
final String dataUrl;
- final String fileName;
+ String fileName;
private final Image img;
private final Image deleteIcon;
@@ -119,9 +129,7 @@
setStyleName("imagare-stage-image-preview-panel");
- Label fileNameLabel = new Label(fileName != null ? fileName : "img.png");
- fileNameLabel.setStyleName("imagare-stage-image-title");
- add(fileNameLabel);
+ addFileName();
img = new Image(dataUrl);
img.setStyleName("imagare-stage-image-preview");
@@ -207,5 +215,84 @@
deleteIconHideTimer = null;
}
}
+
+ private void addFileName() {
+ final Label fileNameLabel = new Label(fileName != null ? fileName : "img.png");
+ fileNameLabel.setStyleName("imagare-stage-image-title");
+ add(fileNameLabel);
+
+ fileNameLabel.addDoubleClickHandler(new DoubleClickHandler() {
+ @Override
+ public void onDoubleClick(DoubleClickEvent event) {
+ fileNameLabel.setVisible(false);
+ FileNameEditPanel fileNameEditPanel = new FileNameEditPanel(ImagePreview.this, fileNameLabel);
+ insert(fileNameEditPanel, getWidgetIndex(fileNameLabel));
+ fileNameEditPanel.focusAndSelectAll();
+ }
+ });
+ }
+
+ private class FileNameEditPanel extends HorizontalPanel {
+ private final ImagePreview imagePreview;
+ private final Label fileNameLabel;
+ private final TextBox fileNameBox;
+ private final String name;
+ private final String extension;
+
+ FileNameEditPanel(ImagePreview imagePreview, Label fileNameLabel) {
+ this.imagePreview = imagePreview;
+ this.fileNameLabel = fileNameLabel;
+ int pos = imagePreview.fileName.lastIndexOf('.');
+ if (pos != -1) {
+ this.name = imagePreview.fileName.substring(0, pos);
+ this.extension = imagePreview.fileName.substring(pos);
+ } else {
+ this.name = imagePreview.fileName;
+ this.extension = "";
+ }
+
+ setStyleName("imagare-stage-edit-panel");
+ fileNameBox = new TextBox();
+ fileNameBox.setStyleName("imagare-stage-input");
+ fileNameBox.setValue(name);
+ add(fileNameBox);
+ add(new Label(extension));
+
+ fileNameBox.addBlurHandler(new BlurHandler() {
+ @Override
+ public void onBlur(BlurEvent event) {
+ saveChanges();
+ }
+ });
+
+ fileNameBox.addKeyDownHandler(new KeyDownHandler() {
+ @Override
+ public void onKeyDown(KeyDownEvent event) {
+ if (event.getNativeKeyCode() == KEY_ESCAPE) {
+ discardChanges();
+ } else if (event.getNativeKeyCode() == KEY_ENTER) {
+ saveChanges();
+ }
+ }
+ });
+ }
+
+ private void saveChanges() {
+ imagePreview.fileName = fileNameBox.getValue() + extension;
+ fileNameLabel.setText(fileNameBox.getValue() + extension);
+ fileNameLabel.setVisible(true);
+ removeFromParent();
+ }
+
+ private void discardChanges() {
+ fileNameLabel.setVisible(true);
+ removeFromParent();
+ }
+
+ void focusAndSelectAll() {
+ fileNameBox.setFocus(true);
+ fileNameBox.selectAll();
+ }
+ }
}
}
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 e015e5b..b7b5141 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
@@ -69,6 +69,15 @@
font-weight: bold;
}
+.imagare-stage-edit-panel td {
+ vertical-align: middle !important;
+}
+
+.imagare-stage-input {
+ margin-top: 10px;
+ font-size: 12px;
+}
+
.imagare-stage-image-preview {
max-width: 150px;
max-height: 100px;