X-Git-Url: https://code.grnet.gr/git/pithos-web-client/blobdiff_plain/b651e67fa99e17cd3c4ff8426abf527f204d0629..46d2ccd20da74d1790c4fd5bc25c67cd2364dcf3:/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java diff --git a/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java b/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java index 63d24d2..9531dcf 100644 --- a/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java +++ b/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 GRNET S.A. All rights reserved. + * Copyright 2011-2013 GRNET S.A. All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following @@ -34,329 +34,301 @@ */ package gr.grnet.pithos.web.client; -import com.google.gwt.core.client.Scheduler; -import com.google.gwt.event.dom.client.KeyDownEvent; -import com.google.gwt.user.client.Event; -import gr.grnet.pithos.web.client.foldertree.Folder; -import gr.grnet.pithos.web.client.foldertree.Resource; -import gr.grnet.pithos.web.client.rest.PostCommand; -import gr.grnet.pithos.web.client.rest.PutRequest; -import gr.grnet.pithos.web.client.rest.RestException; -import gr.grnet.pithos.web.client.rest.resource.RestResourceWrapper; - import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; 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.event.dom.client.*; +import com.google.gwt.http.client.Response; import com.google.gwt.i18n.client.DateTimeFormat; -import com.google.gwt.user.client.DeferredCommand; +import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Event.NativePreviewEvent; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.CheckBox; -import com.google.gwt.user.client.ui.DecoratedTabPanel; -import com.google.gwt.user.client.ui.DialogBox; -import com.google.gwt.user.client.ui.FlexTable; -import com.google.gwt.user.client.ui.HasHorizontalAlignment; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.TabPanel; -import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.*; +import gr.grnet.pithos.web.client.foldertree.Folder; +import gr.grnet.pithos.web.client.rest.PutRequest; +import gr.grnet.pithos.web.client.rest.RestException; /** * The 'Folder properties' dialog box implementation. */ public class FolderPropertiesDialog extends DialogBox { - private GSS app; - - private CheckBox readForAll; + protected Pithos app; - /** - * The widget that holds the folderName of the folder. - */ - private TextBox folderName = new TextBox(); + /** + * The widget that holds the folderName of the folder. + */ + TextBox folderName = new TextBox(); - /** - * A flag that denotes whether the dialog will be used to create or modify a - * folder. - */ - private final boolean create; + /** + * A flag that denotes whether the dialog will be used to create or modify a + * folder. + */ + private final boolean create; - final Folder folder; + final Folder folder; - final TabPanel inner; + final VerticalPanel inner; - /** - * The widget's constructor. - */ - public FolderPropertiesDialog(GSS app, boolean _create, Folder selected) { + /** + * The widget's constructor. + */ + public FolderPropertiesDialog(final Pithos app, boolean _create, Folder selected) { this.app = app; - setAnimationEnabled(true); - - // Enable IE selection for the dialog (must disable it upon closing it) - app.enableIESelection(); - - create = _create; - - folder = selected; - - // Use this opportunity to set the dialog's caption. - if (create) - setText("Create folder"); - else - setText("Folder properties"); - - // Outer contains inner and buttons - VerticalPanel outer = new VerticalPanel(); - // Inner contains generalPanel and permPanel - inner = new DecoratedTabPanel(); - inner.setAnimationEnabled(true); - VerticalPanel generalPanel = new VerticalPanel(); - VerticalPanel permPanel = new VerticalPanel(); - final HorizontalPanel permForAll = new HorizontalPanel(); - final HorizontalPanel pathPanel = new HorizontalPanel(); - HorizontalPanel buttons = new HorizontalPanel(); - HorizontalPanel permButtons = new HorizontalPanel(); - - inner.add(generalPanel, "General"); - if (!create) - inner.add(permPanel, "Sharing"); - inner.selectTab(0); - - FlexTable generalTable = new FlexTable(); - generalTable.setText(0, 0, "Name"); - generalTable.setText(1, 0, "Parent"); - generalTable.setText(2, 0, "Creator"); - generalTable.setText(3, 0, "Last modified"); - folderName.setText(create ? "" : folder.getName()); - generalTable.setWidget(0, 1, folderName); - - if (create) - generalTable.setText(1, 1, folder.getName()); - else - generalTable.setText(1, 1, folder.getPrefix()); - generalTable.setText(2, 1, ""); - DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a"); - if(folder.getLastModified() != null) - generalTable.setText(3, 1, formatter.format(folder.getLastModified())); - generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels"); - generalTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels"); - generalTable.getFlexCellFormatter().setStyleName(2, 0, "props-labels"); - generalTable.getFlexCellFormatter().setStyleName(3, 0, "props-labels"); - generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values"); - generalTable.getFlexCellFormatter().setStyleName(1, 1, "props-values"); - generalTable.getFlexCellFormatter().setStyleName(2, 1, "props-values"); - generalTable.getFlexCellFormatter().setStyleName(3, 1, "props-values"); - generalTable.setCellSpacing(4); - - // Create the 'Create/Update' button, along with a listener that hides the dialog - // when the button is clicked and quits the application. - String okLabel; - if (create) - okLabel = "Create"; - else - okLabel = "Update"; - Button ok = new Button(okLabel, new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - createOrUpdateFolder(); - closeDialog(); - } - }); - buttons.add(ok); - buttons.setCellHorizontalAlignment(ok, HasHorizontalAlignment.ALIGN_CENTER); - // Create the 'Cancel' button, along with a listener that hides the - // dialog - // when the button is clicked. - Button cancel = new Button("Cancel", new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - closeDialog(); - } - }); - buttons.add(cancel); - buttons.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER); - buttons.setSpacing(8); - buttons.addStyleName("pithos-TabPanelBottom"); - - generalPanel.add(generalTable); - - - outer.add(inner); - outer.add(buttons); - outer.setCellHorizontalAlignment(buttons, HasHorizontalAlignment.ALIGN_CENTER); - outer.addStyleName("pithos-TabPanelBottom"); - - setWidget(outer); - - /*if (create) - folderName.setFocus(true); - else - ok.setFocus(true);*/ - } - - @Override - public void center() { - super.center(); - folderName.setFocus(true); - } - - @Override - protected void onPreviewNativeEvent(NativePreviewEvent preview) { - super.onPreviewNativeEvent(preview); - - NativeEvent evt = preview.getNativeEvent(); - if (evt.getType().equals(KeyDownEvent.getType().getName())) - // 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: - closeDialog(); - createOrUpdateFolder(); - break; - case KeyCodes.KEY_ESCAPE: - closeDialog(); - break; - } - } - - - /** - * Enables IE selection prevention and hides the dialog - * (we disable the prevention on creation of the dialog) - */ - public void closeDialog() { - app.preventIESelection(); - hide(); - } - - /** - * Generate an RPC request to create a new folder. - */ - private void createFolder() { - String name = folderName.getText(); - String prefix = folder.getPrefix(); - String path = app.getApiPath() + app.getUsername() + "/" + folder.getContainer() + "/" + (prefix.length() == 0 ? "" : prefix + "/") + name; - PutRequest createFolder = new PutRequest(path) { + Anchor close = new Anchor("close"); + close.addStyleName("close"); + close.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + hide(); + } + }); + + setGlassEnabled(true); + setStyleName("pithos-DialogBox"); + + // Enable IE selection for the dialog (must disable it upon closing it) + Pithos.enableIESelection(); + + create = _create; + + folder = selected; + + // Use this opportunity to set the dialog's caption. + if(create) { + setText("Create folder"); + } + else { + setText("Folder properties"); + } + + // Outer contains inner and buttons + VerticalPanel outer = new VerticalPanel(); + outer.add(close); + // Inner contains generalPanel and permPanel + inner = new VerticalPanel(); + inner.addStyleName("inner"); + + VerticalPanel generalPanel = new VerticalPanel(); + FlexTable generalTable = new FlexTable(); + generalTable.setText(0, 0, "Name"); + generalTable.setText(1, 0, "Parent"); + generalTable.setText(2, 0, "Creator"); + generalTable.setText(3, 0, "Last modified"); + + folderName.setText(create ? "" : folder.getName()); + folderName.setReadOnly(folder.isContainer() && !create); + generalTable.setWidget(0, 1, folderName); + + final Label folderNameNote = new Label("Please note that slashes ('/') are not allowed in folder names.", true); + folderNameNote.setVisible(false); + folderNameNote.setStylePrimaryName("gss-readForAllNote"); + generalTable.setWidget(0, 2, folderNameNote); + + if(create) { + generalTable.setText(1, 1, folder.getName()); + } + else { + generalTable.setText(1, 1, folder.getParent().getName()); + } + if(create) { + generalTable.setText(2, 1, app.getCurrentUserDisplayNameOrID()); + } + else { + final String ownerID = folder.getOwnerID(); + final String displayName = app.getDisplayNameForUserID(ownerID); + final String ownerDisplayName; + if(displayName == null) { + // FIXME: Get the actual display name and do not use the id + ownerDisplayName = ownerID; + } + else { + ownerDisplayName = displayName; + } + generalTable.setText(2, 1, ownerDisplayName); + } + DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a"); + if(folder.getLastModified() != null) { + generalTable.setText(3, 1, formatter.format(folder.getLastModified())); + } + generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels"); + generalTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels"); + generalTable.getFlexCellFormatter().setStyleName(2, 0, "props-labels"); + generalTable.getFlexCellFormatter().setStyleName(3, 0, "props-labels"); + generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values"); + generalTable.getFlexCellFormatter().setStyleName(1, 1, "props-values"); + generalTable.getFlexCellFormatter().setStyleName(2, 1, "props-values"); + generalTable.getFlexCellFormatter().setStyleName(3, 1, "props-values"); + generalTable.setCellSpacing(4); + generalPanel.add(generalTable); + inner.add(generalPanel); + + outer.add(inner); + + // Create the 'Create/Update' button, along with a listener that hides the dialog + // when the button is clicked and quits the application. + String okLabel; + if(create) { + okLabel = "Create"; + } + else { + okLabel = "Update"; + } + final Button ok = new Button(okLabel, new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + createOrUpdateFolder(); + closeDialog(); + } + }); + ok.addStyleName("button"); + outer.add(ok); + outer.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER); + + folderName.addChangeHandler(new ChangeHandler() { + + @Override + public void onChange(ChangeEvent event) { + if(folderName.getText().contains("/")) { + folderNameNote.setVisible(true); + ok.setEnabled(false); + } + else { + folderNameNote.setVisible(false); + ok.setEnabled(true); + } + } + }); + + setWidget(outer); + } + + @Override + public void center() { + super.center(); + folderName.setFocus(true); + } + + @Override + protected void onPreviewNativeEvent(NativePreviewEvent preview) { + super.onPreviewNativeEvent(preview); + + NativeEvent evt = preview.getNativeEvent(); + if(evt.getType().equals(KeyDownEvent.getType().getName())) + // 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: + createOrUpdateFolder(); + closeDialog(); + break; + case KeyCodes.KEY_ESCAPE: + closeDialog(); + break; + } + } + } + + + /** + * Enables IE selection prevention and hides the dialog + * (we disable the prevention on creation of the dialog) + */ + public void closeDialog() { + Pithos.preventIESelection(); + hide(); + } + + /** + * Generate an RPC request to create a new folder. + */ + private void createFolder() { + String name = folderName.getText().trim(); + if(name.length() == 0) { + return; + } + String path = folder.getUri() + "/" + name; + PutRequest createFolder = new PutRequest(app.getApiPath(), folder.getOwnerID(), path) { @Override public void onSuccess(Resource result) { - app.updateFolder(folder); + app.updateFolder(folder, true, new Command() { + + @Override + public void execute() { + app.updateStatistics(); + } + }, true); } @Override public void onError(Throwable t) { - GWT.log("", t); - if (t instanceof RestException) { - app.displayError("Unable to create folder:" + ((RestException) t).getHttpStatusText()); - } - else - app.displayError("System error creating folder:" + t.getMessage()); + GWT.log("", t); + app.setError(t); + if(t instanceof RestException) { + app.displayError("Unable to create folder:" + ((RestException) t).getHttpStatusText()); + } + else { + app.displayError("System error creating folder:" + t.getMessage()); + } + } + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); } }; - createFolder.setHeader("X-Auth-Token", "0000"); + createFolder.setHeader("X-Auth-Token", app.getUserToken()); createFolder.setHeader("Accept", "*/*"); createFolder.setHeader("Content-Length", "0"); - createFolder.setHeader("Content-Type", "application/folder"); + createFolder.setHeader("Content-Type", "application/directory"); Scheduler.get().scheduleDeferred(createFolder); - } - - /** - * Upon closing the dialog by clicking OK or pressing ENTER this method does - * the actual work of modifying folder properties or creating a new Folder - * depending on the value of the create field - */ - private void createOrUpdateFolder() { - if (create) - createFolder(); - else - updateFolder(); - - } - - private void updateFolder() { -// permList.updatePermissionsAccordingToInput(); -// Set perms = permList.getPermissions(); -// JSONObject json = new JSONObject(); -// if(!folder.getName().equals(folderName.getText())) -// json.put("name", new JSONString(folderName.getText())); -// //only update the read for all perm if the user is the owner -// if (readForAll.getValue() != folder.isReadForAll()) -// if (folder.getOwner().equals(app.getCurrentUserResource().getUsername())) -// json.put("readForAll", JSONBoolean.getInstance(readForAll.getValue())); -// if (permList.hasChanges()) { -// JSONArray perma = new JSONArray(); -// int i=0; -// for(PermissionHolder p : perms){ -// JSONObject po = new JSONObject(); -// if(p.getUser() != null) -// po.put("user", new JSONString(p.getUser())); -// if(p.getGroup() != null) -// po.put("group", new JSONString(p.getGroup())); -// po.put("read", JSONBoolean.getInstance(p.isRead())); -// po.put("write", JSONBoolean.getInstance(p.isWrite())); -// po.put("modifyACL", JSONBoolean.getInstance(p.isModifyACL())); -// perma.set(i,po); -// i++; -// } -// json.put("permissions", perma); -// GWT.log(json.toString(), null); -// } -// PostCommand ep = new PostCommand(folder.getUri()+"?update=", json.toString(), 200){ -// -// @Override -// public void onComplete() { -// //TODO:CELLTREE -// -// if(getPostBody() != null && !"".equals(getPostBody().trim())){ -// -// -// FolderResource fres = ((RestResourceWrapper) app.getTreeView().getSelection()).getResource(); -// String initialPath = fres.getUri(); -// String newPath = getPostBody().trim(); -// fres.setUri(newPath); -// ((RestResourceWrapper) app.getTreeView().getSelection()).getResource().setUri(newPath); -// ((RestResourceWrapper) app.getTreeView().getSelection()).setUri(newPath); -// app.getTreeView().updateNodeChildren(fres.getParentURI()); -// if (permList.hasChanges()) { -// app.getTreeView().updateMySharedNode(); -// } -// /* -// if(folderItem.getParentItem() != null && ((DnDTreeItem)folderItem.getParentItem()).getFolderResource() != null){ -// ((DnDTreeItem)folderItem.getParentItem()).getFolderResource().removeSubfolderPath(initialPath); -// ((DnDTreeItem)folderItem.getParentItem()).getFolderResource().getSubfolderPaths().add(newPath); -// }*/ -// } -// //app.getFolders().updateFolder( (DnDTreeItem) app.getFolders().getCurrent()); -// -// app.get().showFileList(true); -// } -// -// @Override -// public void onError(Throwable t) { -// GWT.log("", t); -// if(t instanceof RestException){ -// int statusCode = ((RestException)t).getHttpStatusCode(); -// if(statusCode == 405) -// app.displayError("You don't have the necessary permissions or" + -// " a folder with same name already exists"); -// else if(statusCode == 404) -// app.displayError("Resource not found, or user specified in sharing does not exist"); -// else -// app.displayError("Unable to update folder: "+((RestException)t).getHttpStatusText()); -// } -// else -// app.displayError("System error moifying file: "+t.getMessage()); -// //TODO:CELLTREE -// //app.getFolders().updateFolder( (DnDTreeItem) app.getFolders().getCurrent()); -// } -// }; -// DeferredCommand.addCommand(ep); - } - - public void selectTab(int _tab) { - inner.selectTab(_tab); - } + } + + /** + * Upon closing the dialog by clicking OK or pressing ENTER this method does + * the actual work of modifying folder properties or creating a new Folder + * depending on the value of the create field + */ + protected void createOrUpdateFolder() { + if(create) { + createFolder(); + } + else { + updateFolder(); + } + + } + + private void updateFolder() { + final String newName = folderName.getText().trim(); + if(newName.length() == 0) { + return; + } + if(!folder.isContainer() && !folder.getName().equals(newName)) { + final String path = folder.getParent().getUri() + "/" + newName; + app.copyFolder(folder, folder.getOwnerID(), path, true, new Command() { + + @Override + public void execute() { + app.updateFolder(folder.getParent(), false, new Command() { + + @Override + public void execute() { + app.updateMySharedRoot(); + } + }, true); + } + }); + } + else { + app.updateFolder(folder.getParent(), false, new Command() { + + @Override + public void execute() { + app.updateMySharedRoot(); + } + }, true); + } + } }