X-Git-Url: https://code.grnet.gr/git/pithos/blobdiff_plain/62f168b275b92a0032dcb5f0c016107f7cfb016b..a60ea262c06cc5c4c53873d4835f3ba012aa4b28:/src/gr/ebs/gss/client/FileUploadDialog.java diff --git a/src/gr/ebs/gss/client/FileUploadDialog.java b/src/gr/ebs/gss/client/FileUploadDialog.java index 825066b..3868328 100644 --- a/src/gr/ebs/gss/client/FileUploadDialog.java +++ b/src/gr/ebs/gss/client/FileUploadDialog.java @@ -1,532 +1,530 @@ -/* - * Copyright 2007, 2008, 2009 Electronic Business Systems Ltd. - * - * This file is part of GSS. - * - * GSS is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GSS is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GSS. If not, see . - */ -package gr.ebs.gss.client; - -import gr.ebs.gss.client.rest.GetCommand; -import gr.ebs.gss.client.rest.PostCommand; -import gr.ebs.gss.client.rest.RestCommand; -import gr.ebs.gss.client.rest.RestException; -import gr.ebs.gss.client.rest.resource.FileResource; -import gr.ebs.gss.client.rest.resource.FolderResource; -import gr.ebs.gss.client.rest.resource.UploadStatusResource; - -import java.util.ArrayList; -import java.util.List; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.NativeEvent; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.event.dom.client.KeyCodes; -import com.google.gwt.http.client.URL; -import com.google.gwt.json.client.JSONObject; -import com.google.gwt.json.client.JSONString; -import com.google.gwt.user.client.DeferredCommand; -import com.google.gwt.user.client.Timer; -import com.google.gwt.user.client.Event.NativePreviewEvent; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.DialogBox; -import com.google.gwt.user.client.ui.FileUpload; -import com.google.gwt.user.client.ui.FormPanel; -import com.google.gwt.user.client.ui.Grid; -import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.HasHorizontalAlignment; -import com.google.gwt.user.client.ui.Hidden; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.VerticalPanel; -import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent; -import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler; -import com.google.gwt.user.client.ui.FormPanel.SubmitEvent; -import com.google.gwt.user.client.ui.FormPanel.SubmitHandler; - -/** - * The 'File upload' dialog box implementation. - */ -public class FileUploadDialog extends DialogBox implements Updateable { - - protected int prgBarInterval = 1500; - - private ProgressBar progressBar; - - protected RepeatingTimer repeater = new RepeatingTimer(this, prgBarInterval); - - public static final boolean DONE = true; - - /** - * The Form element that performs the file upload. - */ - private final FormPanel form = new FormPanel(); - - private final FileUpload upload = new FileUpload(); - - protected final Label filenameLabel = new Label(""); - - protected List files; - - protected boolean cancelEvent = false; - - protected String fileNameToUse; - - protected FolderResource folder; - - /** - * The widget's constructor. - */ - public FileUploadDialog() { - // Set the dialog's caption. - setText("File upload"); - setAnimationEnabled(true); - // Since we're going to add a FileUpload widget, we'll need to set the - // form to use the POST method, and multipart MIME encoding. - form.setEncoding(FormPanel.ENCODING_MULTIPART); - form.setMethod(FormPanel.METHOD_POST); - - // Create a panel to hold all of the form widgets. - VerticalPanel panel = new VerticalPanel(); - form.setWidget(panel); - final HTML info = new HTML("You may select a file to upload. Install" + - " Google " + - "Gears
for uploading multiple files simultaneously."); - info.addStyleName("gss-uploadNote"); - panel.add(info); - final Hidden date = new Hidden("Date", ""); - panel.add(date); - final Hidden auth = new Hidden("Authorization", ""); - panel.add(auth); - // Add an informative label with the folder name. - Object selection = GSS.get().getFolders().getCurrent().getUserObject(); - folder = (FolderResource) selection; - upload.setName("file"); - filenameLabel.setText(""); - filenameLabel.setVisible(false); - filenameLabel.setStyleName("props-labels"); - HorizontalPanel fileUloadPanel = new HorizontalPanel(); - fileUloadPanel.add(filenameLabel); - fileUloadPanel.add(upload); - Grid generalTable = new Grid(2, 2); - generalTable.setText(0, 0, "Folder"); - generalTable.setText(1, 0, "File"); - generalTable.setText(0, 1, folder.getName()); - generalTable.setWidget(1, 1, fileUloadPanel); - generalTable.getCellFormatter().setStyleName(0, 0, "props-labels"); - generalTable.getCellFormatter().setStyleName(1, 0, "props-labels"); - generalTable.getCellFormatter().setStyleName(0, 1, "props-values"); - generalTable.getCellFormatter().setStyleName(1, 1, "props-values"); - generalTable.setCellSpacing(4); - - panel.add(generalTable); - - // Create a panel to hold the buttons. - HorizontalPanel buttons = new HorizontalPanel(); - - // Create the 'upload' button, along with a listener that submits the - // form. - final Button submit = new Button("Upload", new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - prepareAndSubmit(); - } - }); - buttons.add(submit); - buttons.setCellHorizontalAlignment(submit, HasHorizontalAlignment.ALIGN_CENTER); - // Create the 'Cancel' button, along with a listener that hides the - // dialog when the button is clicked. - final Button cancel = new Button("Cancel", new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - repeater.finish(); - hide(); - } - }); - buttons.add(cancel); - buttons.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER); - buttons.setSpacing(8); - buttons.addStyleName("gss-DialogBox"); - - // Add an event handler to the form. - form.addSubmitHandler(new SubmitHandler() { - - @Override - public void onSubmit(SubmitEvent event) { - GSS app = GSS.get(); - // This event is fired just before the form is submitted. We can - // take this opportunity to perform validation. - if (upload.getFilename().length() == 0) { - app.displayError("You must select a file!"); - event.cancel(); - hide(); - } else { - - canContinue(); - GWT.log("Cancel:" + cancelEvent, null); - if (cancelEvent) { - cancelEvent = false; - app.displayError("The specified file name already exists in this folder"); - event.cancel(); - hide(); - } else { - - fileNameToUse = getFilename(upload.getFilename()); - String apath; - FileResource selectedFile = getFileForName(fileNameToUse); - if (selectedFile == null ) { - //we are going to create a file - apath = folder.getUri(); - if (!apath.endsWith("/")) - apath = apath + "/"; - apath = apath + encodeComponent(fileNameToUse); - } else - apath = selectedFile.getUri(); - form.setAction(apath); - String dateString = RestCommand.getDate(); - String resource = apath.substring(app.getApiPath().length() - 1, apath.length()); - String sig = RestCommand.calculateSig("POST", dateString, resource, RestCommand.base64decode(app.getToken())); - date.setValue(dateString); - auth.setValue(app.getCurrentUserResource().getUsername() + " " + sig); - GWT.log("FolderPATH:" + folder.getUri(), null); - submit.setEnabled(false); - upload.setVisible(false); - filenameLabel.setText(fileNameToUse); - filenameLabel.setVisible(true); - repeater.start(); - progressBar.setVisible(true); - } - } - - } - }); - form.addSubmitCompleteHandler(new SubmitCompleteHandler() { - - @Override - public void onSubmitComplete(SubmitCompleteEvent event) { - // When the form submission is successfully completed, this - // event is fired. Assuming the service returned a response - // of type text/html, we can get the result text here (see - // the FormPanel documentation for further explanation). - String results = event.getResults(); - - // Unfortunately the results are never empty, even in - // the absense of errors, so we have to check for '
'.
-				if (!results.equalsIgnoreCase("
")) {
-					GWT.log(results, null);
-					GSS.get().displayError(results);
-				}
-				progressBar.setProgress(100);
-				cancelUpload();
-				GSS.get().showFileList(true);
-				GSS.get().getStatusPanel().updateStats();
-
-			}
-		});
-
-
-		panel.add(buttons);
-		progressBar = new ProgressBar(50, ProgressBar.SHOW_TIME_REMAINING);
-		panel.add(progressBar);
-		progressBar.setVisible(false);
-		panel.setCellHorizontalAlignment(buttons, HasHorizontalAlignment.ALIGN_CENTER);
-		panel.setCellHorizontalAlignment(progressBar, HasHorizontalAlignment.ALIGN_CENTER);
-		panel.addStyleName("gss-DialogBox");
-		addStyleName("gss-DialogBox");
-		setWidget(form);
-	}
-
-	@Override
-	protected void onPreviewNativeEvent(NativePreviewEvent preview) {
-		super.onPreviewNativeEvent(preview);
-
-		NativeEvent evt = preview.getNativeEvent();
-		if (evt.getType().equals("keydown"))
-			// Use the popup's key preview hooks to close the dialog when either
-			// enter or escape is pressed.
-			switch (evt.getKeyCode()) {
-				case KeyCodes.KEY_ENTER:
-					prepareAndSubmit();
-					break;
-				case KeyCodes.KEY_ESCAPE:
-					cancelUpload();
-					break;
-			}
-	}
-
-
-
-	/**
-	 * Cancels the file upload.
-	 */
-	private void cancelUpload() {
-		repeater.finish();
-		hide();
-	}
-
-	/**
-	 * Make any last minute checks and start the upload.
-	 */
-	public void prepareAndSubmit() {
-		final String fname = getFilename(upload.getFilename());
-		if (getFileForName(fname) == null) {
-			//we are going to create a file, so we check to see if there is a trashed file with the same name
-			FileResource same = null;
-			for (FileResource fres : folder.getFiles())
-				if (fres.isDeleted() && fres.getName().equals(fname))
-					same = fres;
-			if (same == null)
-				form.submit();
-			else {
-				final FileResource sameFile = same;
-				GWT.log("Same deleted file", null);
-				ConfirmationDialog confirm = new ConfirmationDialog("A file with " +
-						"the same name exists in the trash. If you continue,
the trashed " + - "file '" + fname + "' will be renamed automatically for you.", "Continue") { - - @Override - public void cancel() { - FileUploadDialog.this.hide(); - } - - @Override - public void confirm() { - updateTrashedFile(getBackupFilename(fname), sameFile); - } - - }; - confirm.center(); - } - } - else { - // We are going to update an existing file, so show a confirmation dialog. - ConfirmationDialog confirm = new ConfirmationDialog("Are you sure " + - "you want to update " + fname + "?", "Update") { - - @Override - public void cancel() { - FileUploadDialog.this.hide(); - } - - @Override - public void confirm() { - form.submit(); - } - - }; - confirm.center(); - } - } - - /** - * Returns the file name from a potential full path argument. Apparently IE - * insists on sending the full path name of a file when uploading, forcing - * us to trim the extra path info. Since this is only observed on Windows we - * get to check for a single path separator value. - * - * @param name the potentially full path name of a file - * @return the file name without extra path information - */ - protected String getFilename(String name) { - int pathSepIndex = name.lastIndexOf("\\"); - if (pathSepIndex == -1) { - pathSepIndex = name.lastIndexOf("/"); - if (pathSepIndex == -1) - return name; - } - return name.substring(pathSepIndex + 1); - } - - /** - * Check whether the file name exists in selected folder. - * - * @return - */ - private boolean canContinue() { - if (files == null) - return false; - String fileName = getFilename(upload.getFilename()); - if (getFileForName(fileName) == null) { - // For file creation, check to see if the file already exists. - GWT.log("filename to upload:" + fileName, null); - for (FileResource dto : files) { - GWT.log("Check:" + dto.getName() + "/" + fileName, null); - if (!dto.isDeleted() && dto.getName().equals(fileName)) { - cancelEvent = true; - return true; - } - } - } - return true; - } - - class RepeatingTimer extends Timer { - - private Updateable updateable; - - private int interval = 1500; - - private boolean running = true; - - RepeatingTimer(Updateable _updateable, int _interval) { - updateable = _updateable; - interval = _interval; - } - - @Override - public void run() { - updateable.update(); - } - - public void start() { - running = true; - - scheduleRepeating(interval); - } - - public void finish() { - running = false; - cancel(); - } - - public int getInterval() { - return interval; - } - - public void setInterval(int anInterval) { - if (interval != anInterval) { - interval = anInterval; - if (running) { - finish(); - start(); - } - } - } - } - - /* (non-Javadoc) - * @see gr.ebs.gss.client.Updateable#update() - */ - public void update() { - String apath = folder.getUri(); - if (!apath.endsWith("/")) - apath = apath + "/"; - apath = apath + encodeComponent(fileNameToUse) + "?progress=" + encodeComponent(fileNameToUse); - GetCommand eg = new GetCommand(UploadStatusResource.class, apath, false, null) { - - @Override - public void onComplete() { - UploadStatusResource res = getResult(); - progressBar.setProgress(res.percent()); - } - - @Override - public void onError(Throwable t) { - GWT.log("", t); - } - - }; - DeferredCommand.addCommand(eg); - } - - protected String getBackupFilename(String filename) { - List filesInSameFolder = new ArrayList(); - for (FileResource deleted : folder.getFiles()) - if (deleted.isDeleted()) - filesInSameFolder.add(deleted); - int i = 1; - for (FileResource same : filesInSameFolder) - if (same.getName().startsWith(filename)) { - String toCheck = same.getName().substring(filename.length(), same.getName().length()); - if (toCheck.startsWith(" ")) { - int test = -1; - try { - test = Integer.valueOf(toCheck.replace(" ", "")); - } catch (NumberFormatException e) { - // Do nothing since string is not a number. - } - if (test >= i) - i = test + 1; - } - } - - return filename + " " + i; - } - - /** - * Rename the conflicting trashed file with the supplied new name. - */ - private void updateTrashedFile(String newName, FileResource trashedFile) { - JSONObject json = new JSONObject(); - json.put("name", new JSONString(newName)); - PostCommand cf = new PostCommand(trashedFile.getUri() + "?update=", json.toString(), 200) { - - @Override - public void onComplete() { - form.submit(); - } - - @Override - public void onError(Throwable t) { - GSS app = GSS.get(); - GWT.log("", t); - if (t instanceof RestException) { - int statusCode = ((RestException) t).getHttpStatusCode(); - if (statusCode == 405) - app.displayError("You don't have the necessary permissions"); - else if (statusCode == 404) - app.displayError("User in permissions does not exist"); - else if (statusCode == 409) - app.displayError("A file with the same name already exists"); - else if (statusCode == 413) - app.displayError("Your quota has been exceeded"); - else - app.displayError("Unable to modify file:" + ((RestException) t).getHttpStatusText()); - } else - app.displayError("System error modifying file:" + t.getMessage()); - } - - }; - DeferredCommand.addCommand(cf); - } - - protected FileResource getFileForName(String name){ - for (FileResource f : folder.getFiles()) - if (!f.isDeleted() && f.getName().equals(name)) - return f; - return null; - } - - - /** - * Same as URL.encodeComponent, but also - * encode apostrophe since browsers aren't consistent about it - * (FF encodes, IE does not). - */ - private String encodeComponent(String decodedURLComponent) { - String retv = URL.encodeComponent(decodedURLComponent); - retv = retv.replaceAll("'", "%27"); - return retv; - } - - /** - * Modify the files. - * - * @param newFiles the files to set - */ - public void setFiles(List newFiles) { - files = newFiles; - } -} +/* + * Copyright 2007, 2008, 2009 Electronic Business Systems Ltd. + * + * This file is part of GSS. + * + * GSS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GSS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GSS. If not, see . + */ +package gr.ebs.gss.client; + +import gr.ebs.gss.client.rest.GetCommand; +import gr.ebs.gss.client.rest.PostCommand; +import gr.ebs.gss.client.rest.RestCommand; +import gr.ebs.gss.client.rest.RestException; +import gr.ebs.gss.client.rest.resource.FileResource; +import gr.ebs.gss.client.rest.resource.FolderResource; +import gr.ebs.gss.client.rest.resource.UploadStatusResource; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.NativeEvent; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.KeyCodes; +import com.google.gwt.http.client.URL; +import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONString; +import com.google.gwt.user.client.DeferredCommand; +import com.google.gwt.user.client.Event.NativePreviewEvent; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.DialogBox; +import com.google.gwt.user.client.ui.FileUpload; +import com.google.gwt.user.client.ui.FormPanel; +import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent; +import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler; +import com.google.gwt.user.client.ui.FormPanel.SubmitEvent; +import com.google.gwt.user.client.ui.FormPanel.SubmitHandler; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.Hidden; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.VerticalPanel; + +/** + * The 'File upload' dialog box implementation. + */ +public class FileUploadDialog extends DialogBox implements Updateable { + + protected int prgBarInterval = 1500; + + private ProgressBar progressBar; + + protected RepeatingTimer repeater = new RepeatingTimer(this, prgBarInterval); + + public static final boolean DONE = true; + + /** + * The Form element that performs the file upload. + */ + private final FormPanel form = new FormPanel(); + + private final FileUpload upload = new FileUpload(); + + protected final Label filenameLabel = new Label(""); + + protected List files; + + protected boolean cancelEvent = false; + + protected String fileNameToUse; + + protected FolderResource folder; + + /** + * The widget's constructor. + */ + public FileUploadDialog() { + // Set the dialog's caption. + setText("File upload"); + setAnimationEnabled(true); + // Since we're going to add a FileUpload widget, we'll need to set the + // form to use the POST method, and multipart MIME encoding. + form.setEncoding(FormPanel.ENCODING_MULTIPART); + form.setMethod(FormPanel.METHOD_POST); + + // Create a panel to hold all of the form widgets. + VerticalPanel panel = new VerticalPanel(); + form.setWidget(panel); + final HTML info = new HTML("You may select a file to upload. Install" + + " Google " + + "Gears
for uploading multiple files simultaneously."); + info.addStyleName("gss-uploadNote"); + panel.add(info); + final Hidden date = new Hidden("Date", ""); + panel.add(date); + final Hidden auth = new Hidden("Authorization", ""); + panel.add(auth); + // Add an informative label with the folder name. + Object selection = GSS.get().getFolders().getCurrent().getUserObject(); + folder = (FolderResource) selection; + upload.setName("file"); + filenameLabel.setText(""); + filenameLabel.setVisible(false); + filenameLabel.setStyleName("props-labels"); + HorizontalPanel fileUloadPanel = new HorizontalPanel(); + fileUloadPanel.add(filenameLabel); + fileUloadPanel.add(upload); + Grid generalTable = new Grid(2, 2); + generalTable.setText(0, 0, "Folder"); + generalTable.setText(1, 0, "File"); + generalTable.setText(0, 1, folder.getName()); + generalTable.setWidget(1, 1, fileUloadPanel); + generalTable.getCellFormatter().setStyleName(0, 0, "props-labels"); + generalTable.getCellFormatter().setStyleName(1, 0, "props-labels"); + generalTable.getCellFormatter().setStyleName(0, 1, "props-values"); + generalTable.getCellFormatter().setStyleName(1, 1, "props-values"); + generalTable.setCellSpacing(4); + + panel.add(generalTable); + + // Create a panel to hold the buttons. + HorizontalPanel buttons = new HorizontalPanel(); + + // Create the 'upload' button, along with a listener that submits the + // form. + final Button submit = new Button("Upload", new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + prepareAndSubmit(); + } + }); + buttons.add(submit); + buttons.setCellHorizontalAlignment(submit, HasHorizontalAlignment.ALIGN_CENTER); + // Create the 'Cancel' button, along with a listener that hides the + // dialog when the button is clicked. + final Button cancel = new Button("Cancel", new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + repeater.finish(); + hide(); + } + }); + buttons.add(cancel); + buttons.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER); + buttons.setSpacing(8); + buttons.addStyleName("gss-DialogBox"); + + // Add an event handler to the form. + form.addSubmitHandler(new SubmitHandler() { + + @Override + public void onSubmit(SubmitEvent event) { + GSS app = GSS.get(); + // This event is fired just before the form is submitted. We can + // take this opportunity to perform validation. + if (upload.getFilename().length() == 0) { + app.displayError("You must select a file!"); + event.cancel(); + hide(); + } else { + + canContinue(); + GWT.log("Cancel:" + cancelEvent, null); + if (cancelEvent) { + cancelEvent = false; + app.displayError("The specified file name already exists in this folder"); + event.cancel(); + hide(); + } else { + + fileNameToUse = getFilename(upload.getFilename()); + String apath; + FileResource selectedFile = getFileForName(fileNameToUse); + if (selectedFile == null ) { + //we are going to create a file + apath = folder.getUri(); + if (!apath.endsWith("/")) + apath = apath + "/"; + apath = apath + encodeComponent(fileNameToUse); + } else + apath = selectedFile.getUri(); + form.setAction(apath); + String dateString = RestCommand.getDate(); + String resource = apath.substring(app.getApiPath().length() - 1, apath.length()); + String sig = RestCommand.calculateSig("POST", dateString, resource, RestCommand.base64decode(app.getToken())); + date.setValue(dateString); + auth.setValue(app.getCurrentUserResource().getUsername() + " " + sig); + GWT.log("FolderPATH:" + folder.getUri(), null); + submit.setEnabled(false); + upload.setVisible(false); + filenameLabel.setText(fileNameToUse); + filenameLabel.setVisible(true); + repeater.start(); + progressBar.setVisible(true); + } + } + + } + }); + form.addSubmitCompleteHandler(new SubmitCompleteHandler() { + + @Override + public void onSubmitComplete(SubmitCompleteEvent event) { + // When the form submission is successfully completed, this + // event is fired. Assuming the service returned a response + // of type text/html, we can get the result text here (see + // the FormPanel documentation for further explanation). + String results = event.getResults(); + + // Unfortunately the results are never empty, even in + // the absense of errors, so we have to check for '
'.
+				if (!results.equalsIgnoreCase("
")) {
+					GWT.log(results, null);
+					GSS.get().displayError(results);
+				}
+				progressBar.setProgress(100);
+				cancelUpload();
+				GSS.get().showFileList(true);
+				GSS.get().getStatusPanel().updateStats();
+
+			}
+		});
+
+
+		panel.add(buttons);
+		progressBar = new ProgressBar(50, ProgressBar.SHOW_TIME_REMAINING);
+		panel.add(progressBar);
+		progressBar.setVisible(false);
+		panel.setCellHorizontalAlignment(buttons, HasHorizontalAlignment.ALIGN_CENTER);
+		panel.setCellHorizontalAlignment(progressBar, HasHorizontalAlignment.ALIGN_CENTER);
+		panel.addStyleName("gss-DialogBox");
+		addStyleName("gss-DialogBox");
+		setWidget(form);
+	}
+
+	@Override
+	protected void onPreviewNativeEvent(NativePreviewEvent preview) {
+		super.onPreviewNativeEvent(preview);
+
+		NativeEvent evt = preview.getNativeEvent();
+		if (evt.getType().equals("keydown"))
+			// Use the popup's key preview hooks to close the dialog when either
+			// enter or escape is pressed.
+			switch (evt.getKeyCode()) {
+				case KeyCodes.KEY_ENTER:
+					prepareAndSubmit();
+					break;
+				case KeyCodes.KEY_ESCAPE:
+					cancelUpload();
+					break;
+			}
+	}
+
+
+
+	/**
+	 * Cancels the file upload.
+	 */
+	private void cancelUpload() {
+		repeater.finish();
+		hide();
+	}
+
+	/**
+	 * Make any last minute checks and start the upload.
+	 */
+	public void prepareAndSubmit() {
+		final String fname = getFilename(upload.getFilename());
+		if (getFileForName(fname) == null) {
+			//we are going to create a file, so we check to see if there is a trashed file with the same name
+			FileResource same = null;
+			for (FileResource fres : folder.getFiles())
+				if (fres.isDeleted() && fres.getName().equals(fname))
+					same = fres;
+			if (same == null)
+				form.submit();
+			else {
+				final FileResource sameFile = same;
+				GWT.log("Same deleted file", null);
+				ConfirmationDialog confirm = new ConfirmationDialog("A file with " +
+						"the same name exists in the trash. If you continue,
the trashed " + + "file '" + fname + "' will be renamed automatically for you.", "Continue") { + + @Override + public void cancel() { + FileUploadDialog.this.hide(); + } + + @Override + public void confirm() { + updateTrashedFile(getBackupFilename(fname), sameFile); + } + + }; + confirm.center(); + } + } + else { + // We are going to update an existing file, so show a confirmation dialog. + ConfirmationDialog confirm = new ConfirmationDialog("Are you sure " + + "you want to update " + fname + "?", "Update") { + + @Override + public void cancel() { + FileUploadDialog.this.hide(); + } + + @Override + public void confirm() { + form.submit(); + } + + }; + confirm.center(); + } + } + + /** + * Returns the file name from a potential full path argument. Apparently IE + * insists on sending the full path name of a file when uploading, forcing + * us to trim the extra path info. Since this is only observed on Windows we + * get to check for a single path separator value. + * + * @param name the potentially full path name of a file + * @return the file name without extra path information + */ + protected String getFilename(String name) { + int pathSepIndex = name.lastIndexOf("\\"); + if (pathSepIndex == -1) { + pathSepIndex = name.lastIndexOf("/"); + if (pathSepIndex == -1) + return name; + } + return name.substring(pathSepIndex + 1); + } + + /** + * Check whether the file name exists in selected folder. + * + * @return + */ + private boolean canContinue() { + if (files == null) + return false; + String fileName = getFilename(upload.getFilename()); + if (getFileForName(fileName) == null) { + // For file creation, check to see if the file already exists. + GWT.log("filename to upload:" + fileName, null); + for (FileResource dto : files) { + GWT.log("Check:" + dto.getName() + "/" + fileName, null); + if (!dto.isDeleted() && dto.getName().equals(fileName)) { + cancelEvent = true; + return true; + } + } + } + return true; + } + + class RepeatingTimer extends Timer { + + private Updateable updateable; + + private int interval = 1500; + + private boolean running = true; + + RepeatingTimer(Updateable _updateable, int _interval) { + updateable = _updateable; + interval = _interval; + } + + @Override + public void run() { + updateable.update(); + } + + public void start() { + running = true; + + scheduleRepeating(interval); + } + + public void finish() { + running = false; + cancel(); + } + + public int getInterval() { + return interval; + } + + public void setInterval(int anInterval) { + if (interval != anInterval) { + interval = anInterval; + if (running) { + finish(); + start(); + } + } + } + } + + @Override + public void update() { + String apath = folder.getUri(); + if (!apath.endsWith("/")) + apath = apath + "/"; + apath = apath + encodeComponent(fileNameToUse) + "?progress=" + encodeComponent(fileNameToUse); + GetCommand eg = new GetCommand(UploadStatusResource.class, apath, false, null) { + + @Override + public void onComplete() { + UploadStatusResource res = getResult(); + progressBar.setProgress(res.percent()); + } + + @Override + public void onError(Throwable t) { + GWT.log("", t); + } + + }; + DeferredCommand.addCommand(eg); + } + + protected String getBackupFilename(String filename) { + List filesInSameFolder = new ArrayList(); + for (FileResource deleted : folder.getFiles()) + if (deleted.isDeleted()) + filesInSameFolder.add(deleted); + int i = 1; + for (FileResource same : filesInSameFolder) + if (same.getName().startsWith(filename)) { + String toCheck = same.getName().substring(filename.length(), same.getName().length()); + if (toCheck.startsWith(" ")) { + int test = -1; + try { + test = Integer.valueOf(toCheck.replace(" ", "")); + } catch (NumberFormatException e) { + // Do nothing since string is not a number. + } + if (test >= i) + i = test + 1; + } + } + + return filename + " " + i; + } + + /** + * Rename the conflicting trashed file with the supplied new name. + */ + private void updateTrashedFile(String newName, FileResource trashedFile) { + JSONObject json = new JSONObject(); + json.put("name", new JSONString(newName)); + PostCommand cf = new PostCommand(trashedFile.getUri() + "?update=", json.toString(), 200) { + + @Override + public void onComplete() { + form.submit(); + } + + @Override + public void onError(Throwable t) { + GSS app = GSS.get(); + GWT.log("", t); + if (t instanceof RestException) { + int statusCode = ((RestException) t).getHttpStatusCode(); + if (statusCode == 405) + app.displayError("You don't have the necessary permissions"); + else if (statusCode == 404) + app.displayError("User in permissions does not exist"); + else if (statusCode == 409) + app.displayError("A file with the same name already exists"); + else if (statusCode == 413) + app.displayError("Your quota has been exceeded"); + else + app.displayError("Unable to modify file:" + ((RestException) t).getHttpStatusText()); + } else + app.displayError("System error modifying file:" + t.getMessage()); + } + + }; + DeferredCommand.addCommand(cf); + } + + protected FileResource getFileForName(String name){ + for (FileResource f : folder.getFiles()) + if (!f.isDeleted() && f.getName().equals(name)) + return f; + return null; + } + + + /** + * Same as URL.encodeComponent, but also + * encode apostrophe since browsers aren't consistent about it + * (FF encodes, IE does not). + */ + private String encodeComponent(String decodedURLComponent) { + String retv = URL.encodeComponent(decodedURLComponent); + retv = retv.replaceAll("'", "%27"); + return retv; + } + + /** + * Modify the files. + * + * @param newFiles the files to set + */ + public void setFiles(List newFiles) { + files = newFiles; + } +}