Use separate progress bars next to each file, in order to better track the progress...
[pithos] / src / gr / ebs / gss / client / FileUploadGearsDialog.java
index ac2f86c..fad3190 100644 (file)
@@ -18,7 +18,9 @@
  */\r
 package gr.ebs.gss.client;\r
 \r
+import gr.ebs.gss.client.rest.PostCommand;\r
 import gr.ebs.gss.client.rest.RestCommand;\r
+import gr.ebs.gss.client.rest.RestException;\r
 import gr.ebs.gss.client.rest.resource.FileResource;\r
 import gr.ebs.gss.client.rest.resource.FolderResource;\r
 \r
@@ -35,14 +37,15 @@ import com.google.gwt.gears.client.httprequest.HttpRequest;
 import com.google.gwt.gears.client.httprequest.ProgressEvent;\r
 import com.google.gwt.gears.client.httprequest.ProgressHandler;\r
 import com.google.gwt.gears.client.httprequest.RequestCallback;\r
+import com.google.gwt.json.client.JSONObject;\r
+import com.google.gwt.json.client.JSONString;\r
 import com.google.gwt.user.client.Command;\r
 import com.google.gwt.user.client.DeferredCommand;\r
 import com.google.gwt.user.client.ui.Button;\r
 import com.google.gwt.user.client.ui.ClickListener;\r
-import com.google.gwt.user.client.ui.Grid;\r
+import com.google.gwt.user.client.ui.FlexTable;\r
 import com.google.gwt.user.client.ui.HasHorizontalAlignment;\r
 import com.google.gwt.user.client.ui.HorizontalPanel;\r
-import com.google.gwt.user.client.ui.TextBox;\r
 import com.google.gwt.user.client.ui.VerticalPanel;\r
 import com.google.gwt.user.client.ui.Widget;\r
 \r
@@ -53,9 +56,27 @@ public class FileUploadGearsDialog extends FileUploadDialog implements Updateabl
 \r
        private final Factory factory = Factory.getInstance();\r
 \r
+       /**\r
+        * The array of files to upload.\r
+        */\r
+       private File[] fileObjects;\r
+\r
+       /**\r
+        * A list of files to upload, created from files array. Used to signal\r
+        * finished state when empty.\r
+        */\r
        private List<File> selectedFiles = new ArrayList<File>();\r
 \r
-       private TextBox selected;\r
+       /**\r
+        * The list of progress bars for individual files.\r
+        */\r
+       private List<ProgressBar> progressBars = new ArrayList<ProgressBar>();\r
+\r
+       private Button browse;\r
+\r
+       private Button submit;\r
+\r
+       private FlexTable generalTable;\r
 \r
        /**\r
         * The widget's constructor.\r
@@ -69,21 +90,13 @@ public class FileUploadGearsDialog extends FileUploadDialog implements Updateabl
                // Add an informative label with the folder name.\r
                Object selection = GSS.get().getFolders().getCurrent().getUserObject();\r
                folder = (FolderResource) selection;\r
-               filenameLabel.setText("");\r
-               filenameLabel.setVisible(false);\r
-               filenameLabel.setStyleName("props-labels");\r
-\r
-               final Button browse = new Button("Browse...");\r
 \r
-               selected = new TextBox();\r
-               selected.setEnabled(false);\r
+               browse = new Button("Browse...");\r
 \r
                HorizontalPanel fileUploadPanel = new HorizontalPanel();\r
-               fileUploadPanel.add(filenameLabel);\r
-               fileUploadPanel.add(selected);\r
                fileUploadPanel.add(browse);\r
 \r
-               Grid generalTable = new Grid(2, 2);\r
+               generalTable = new FlexTable();\r
                generalTable.setText(0, 0, "Folder");\r
                generalTable.setText(1, 0, "File");\r
                generalTable.setText(0, 1, folder.getName());\r
@@ -99,26 +112,10 @@ public class FileUploadGearsDialog extends FileUploadDialog implements Updateabl
                // Create a panel to hold the buttons.\r
                HorizontalPanel buttons = new HorizontalPanel();\r
 \r
-               // Create the 'upload' button, along with a listener that submits the\r
-               // form.\r
-               final Button submit = new Button("Upload");\r
+               submit = new Button("Upload");\r
                submit.addClickListener(new ClickListener() {\r
 \r
                        public void onClick(Widget sender) {\r
-                               GSS app = GSS.get();\r
-                               if (selectedFiles.size() == 0) {\r
-                                       app.displayError("You must select a file!");\r
-                                       hide();\r
-                                       return;\r
-                               }\r
-                               for(File file: selectedFiles)\r
-                                       if (!canContinue(file)) {\r
-                                               app.displayError("The specified file name already exists in this folder");\r
-                                               hide();\r
-                                               return;\r
-                                       }\r
-                               submit.setEnabled(false);\r
-                               browse.setVisible(false);\r
                                prepareAndSubmit();\r
                        }\r
                });\r
@@ -144,8 +141,17 @@ public class FileUploadGearsDialog extends FileUploadDialog implements Updateabl
                                desktop.openFiles(new OpenFilesHandler() {\r
 \r
                                        public void onOpenFiles(OpenFilesEvent event) {\r
-                                               selectedFiles.addAll(Arrays.asList(event.getFiles()));\r
-                                               selected.setText(selectedFiles.get(0).getName());\r
+                                               fileObjects = event.getFiles();\r
+                                               selectedFiles.addAll(Arrays.asList(fileObjects));\r
+                                               for (int i = 0; i< selectedFiles.size(); i++) {\r
+                                                       generalTable.setText(i+1, 0, "File");\r
+                                                       generalTable.setText(i+1, 1, selectedFiles.get(i).getName());\r
+                                                       ProgressBar progress = new ProgressBar(20, 0);\r
+                                                       generalTable.setWidget(i+1, 2, progress);\r
+                                                       progressBars.add(progress);\r
+                                                       generalTable.getCellFormatter().setStyleName(i+1, 0, "props-labels");\r
+                                                       generalTable.getCellFormatter().setStyleName(i+1, 1, "props-values");\r
+                                               }\r
                                                submit.setEnabled(true);\r
                                        }\r
                                });\r
@@ -153,11 +159,7 @@ public class FileUploadGearsDialog extends FileUploadDialog implements Updateabl
                });\r
 \r
                panel.add(buttons);\r
-               progressBar = new ProgressBar(50, ProgressBar.SHOW_TIME_REMAINING);\r
-               panel.add(progressBar);\r
-               progressBar.setVisible(false);\r
                panel.setCellHorizontalAlignment(buttons, HasHorizontalAlignment.ALIGN_CENTER);\r
-               panel.setCellHorizontalAlignment(progressBar, HasHorizontalAlignment.ALIGN_CENTER);\r
                panel.addStyleName("gss-DialogBox");\r
                addStyleName("gss-DialogBox");\r
                setWidget(panel);\r
@@ -177,7 +179,22 @@ public class FileUploadGearsDialog extends FileUploadDialog implements Updateabl
        }\r
 \r
        @Override\r
-       public void prepareAndSubmit(){\r
+       public void prepareAndSubmit() {\r
+               GSS app = GSS.get();\r
+               if (selectedFiles.size() == 0) {\r
+                       app.displayError("You must select a file!");\r
+                       hide();\r
+                       return;\r
+               }\r
+               for(File file: selectedFiles)\r
+                       if (!canContinue(file)) {\r
+                               app.displayError("The file name " + file.getName() +\r
+                                                       " already exists in this folder");\r
+                               hide();\r
+                               return;\r
+                       }\r
+               submit.setEnabled(false);\r
+               browse.setVisible(false);\r
                final String fname = getFilename(selectedFiles.get(0).getName());\r
                if (getFileForName(fname) == null) {\r
                        // We are going to create a file, so we check to see if there is a\r
@@ -198,7 +215,7 @@ public class FileUploadGearsDialog extends FileUploadDialog implements Updateabl
 \r
                                        @Override\r
                                        public void cancel() {\r
-                                               FileUploadGearsDialog.this.hide();\r
+                                               hide();\r
                                        }\r
 \r
                                        @Override\r
@@ -209,15 +226,14 @@ public class FileUploadGearsDialog extends FileUploadDialog implements Updateabl
                                };\r
                                confirm.center();\r
                        }\r
-               }\r
-               else {\r
+               } else {\r
                        // We are going to update an existing file, so show a confirmation dialog.\r
                        ConfirmationDialog confirm = new ConfirmationDialog("Are you sure " +\r
                                        "you want to update " + fname + "?", "Update"){\r
 \r
                                @Override\r
                                public void cancel() {\r
-                                       FileUploadGearsDialog.this.hide();\r
+                                       hide();\r
                                }\r
 \r
                                @Override\r
@@ -230,40 +246,70 @@ public class FileUploadGearsDialog extends FileUploadDialog implements Updateabl
                }\r
        }\r
 \r
+       private void updateTrashedFile(String newName, FileResource trashedFile) {\r
+               JSONObject json = new JSONObject();\r
+               json.put("name", new JSONString(newName));\r
+               PostCommand cf = new PostCommand(trashedFile.getUri() + "?update=", json.toString(), 200) {\r
+\r
+                       @Override\r
+                       public void onComplete() {\r
+                               uploadFiles();\r
+                       }\r
+\r
+                       @Override\r
+                       public void onError(Throwable t) {\r
+                               GWT.log("", t);\r
+                               if (t instanceof RestException) {\r
+                                       int statusCode = ((RestException) t).getHttpStatusCode();\r
+                                       if (statusCode == 405)\r
+                                               GSS.get().displayError("You don't have the necessary permissions");\r
+                                       else if (statusCode == 404)\r
+                                               GSS.get().displayError("User in permissions does not exist");\r
+                                       else if (statusCode == 409)\r
+                                               GSS.get().displayError("A file with the same name already exists");\r
+                                       else if (statusCode == 413)\r
+                                               GSS.get().displayError("Your quota has been exceeded");\r
+                                       else\r
+                                               GSS.get().displayError("Unable to modify file:" +((RestException)t).getHttpStatusText());\r
+                               } else\r
+                                       GSS.get().displayError("System error modifying file:" + t.getMessage());\r
+                       }\r
+\r
+               };\r
+               DeferredCommand.addCommand(cf);\r
+       }\r
+\r
        /**\r
         * Schedule the PUT requests to upload the files.\r
         */\r
        private void uploadFiles() {\r
-               for (final File file: selectedFiles)\r
+               for (int i = 0; i< fileObjects.length; i++) {\r
+                       final int index = i;\r
                        DeferredCommand.addCommand(new Command() {\r
                                public void execute() {\r
-                                       doPut(file);\r
+                                       doPut(fileObjects[index], index);\r
                                }\r
                        });\r
+               }\r
        }\r
 \r
        /**\r
         * Perform the HTTP PUT requests to upload the specified file.\r
         */\r
-       protected void doPut(final File file) {\r
+       protected void doPut(final File file, final int index) {\r
                GSS app = GSS.get();\r
                HttpRequest request = factory.createHttpRequest();\r
                String method = "PUT";\r
 \r
-               fileNameToUse = getFilename(file.getName());\r
-               selected.setVisible(false);\r
-               filenameLabel.setText(fileNameToUse);\r
-               filenameLabel.setVisible(true);\r
-               progressBar.setVisible(true);\r
-\r
                String path;\r
-               FileResource selectedResource = getFileForName(fileNameToUse);\r
+               String filename = getFilename(file.getName());\r
+               FileResource selectedResource = getFileForName(filename);\r
                if (selectedResource == null ) {\r
                        // We are going to create a file.\r
                        path = folder.getUri();\r
                        if (!path.endsWith("/"))\r
                                path = path + "/";\r
-                       path = path + encodeComponent(fileNameToUse);\r
+                       path = path + encodeComponent(filename);\r
                } else\r
                        path = selectedResource.getUri();\r
 \r
@@ -295,7 +341,7 @@ public class FileUploadGearsDialog extends FileUploadDialog implements Updateabl
                request.getUpload().setProgressHandler(new ProgressHandler() {\r
                        public void onProgress(ProgressEvent event) {\r
                                double pcnt = (double) event.getLoaded() / event.getTotal();\r
-                               progressBar.setProgress((int) Math.floor(pcnt * 100));\r
+                               progressBars.get(index).setProgress((int) Math.floor(pcnt * 100));\r
                        }\r
                });\r
                request.send(file.getBlob());\r