FolderPropertiesDialog is broken into two dialogs
authorChristos Stathis <chstath@ebs.gr>
Fri, 27 Jan 2012 14:15:27 +0000 (16:15 +0200)
committerChristos Stathis <chstath@ebs.gr>
Fri, 27 Jan 2012 14:15:27 +0000 (16:15 +0200)
src/gr/grnet/pithos/web/client/FolderContextMenu.java
src/gr/grnet/pithos/web/client/FolderPermissionsDialog.java [new file with mode: 0644]
src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java
src/gr/grnet/pithos/web/client/ToolsMenu.java
src/gr/grnet/pithos/web/client/commands/PropertiesCommand.java

index 238fca0..17ded09 100644 (file)
@@ -134,8 +134,8 @@ public class FolderContextMenu extends PopupPanel {
                                MenuItem delete = new MenuItem("<span id = 'folderContextMenu.delete'>" + AbstractImagePrototype.create(newImages.delete()).getHTML() + "&nbsp;Delete</span>", true, new DeleteCommand(app, this, folder, MessagePanel.images));
                                contextMenu.addItem(delete);
                        
-                               MenuItem properties = new MenuItem("<span id = 'folderContextMenu.properties'>" + AbstractImagePrototype.create(newImages.viewText()).getHTML() + "&nbsp;Properties</span>", true, new PropertiesCommand(app, this, folder, 0));
-                               contextMenu.addItem(properties);
+                               contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.viewText()).getHTML() + "&nbsp;Properties</span>", true, new PropertiesCommand(app, this, folder, PropertiesCommand.PROPERTIES)));
+                               contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.sharing()).getHTML() + "&nbsp;Sharing</span>", true, new PropertiesCommand(app, this, folder, PropertiesCommand.PERMISSIONS)));
                            }
                }
         }
diff --git a/src/gr/grnet/pithos/web/client/FolderPermissionsDialog.java b/src/gr/grnet/pithos/web/client/FolderPermissionsDialog.java
new file mode 100644 (file)
index 0000000..6b172e6
--- /dev/null
@@ -0,0 +1,352 @@
+/*\r
+ * Copyright 2011 GRNET S.A. All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or\r
+ * without modification, are permitted provided that the following\r
+ * conditions are met:\r
+ *\r
+ *   1. Redistributions of source code must retain the above\r
+ *      copyright notice, this list of conditions and the following\r
+ *      disclaimer.\r
+ *\r
+ *   2. Redistributions in binary form must reproduce the above\r
+ *      copyright notice, this list of conditions and the following\r
+ *      disclaimer in the documentation and/or other materials\r
+ *      provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS\r
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR\r
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\r
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\r
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+ * The views and conclusions contained in the software and\r
+ * documentation are those of the authors and should not be\r
+ * interpreted as representing official policies, either expressed\r
+ * or implied, of GRNET S.A.\r
+ */\r
+package gr.grnet.pithos.web.client;\r
+\r
+import gr.grnet.pithos.web.client.foldertree.File;\r
+import gr.grnet.pithos.web.client.foldertree.Folder;\r
+import gr.grnet.pithos.web.client.foldertree.Resource;\r
+import gr.grnet.pithos.web.client.rest.PostRequest;\r
+import gr.grnet.pithos.web.client.rest.PutRequest;\r
+import gr.grnet.pithos.web.client.rest.RestException;\r
+\r
+import java.util.Iterator;\r
+import java.util.Map;\r
+\r
+import com.google.gwt.core.client.GWT;\r
+import com.google.gwt.core.client.Scheduler;\r
+import com.google.gwt.dom.client.NativeEvent;\r
+import com.google.gwt.event.dom.client.ClickEvent;\r
+import com.google.gwt.event.dom.client.ClickHandler;\r
+import com.google.gwt.event.dom.client.KeyCodes;\r
+import com.google.gwt.event.dom.client.KeyDownEvent;\r
+import com.google.gwt.http.client.Response;\r
+import com.google.gwt.http.client.URL;\r
+import com.google.gwt.user.client.Command;\r
+import com.google.gwt.user.client.Event.NativePreviewEvent;\r
+import com.google.gwt.user.client.ui.Anchor;\r
+import com.google.gwt.user.client.ui.Button;\r
+import com.google.gwt.user.client.ui.DialogBox;\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.Label;\r
+import com.google.gwt.user.client.ui.VerticalPanel;\r
+\r
+/**\r
+ * The 'Folder properties' dialog box implementation.\r
+ */\r
+public class FolderPermissionsDialog extends DialogBox {\r
+\r
+    protected Pithos app;\r
+\r
+       /**\r
+        * The widget that holds the folderName of the folder.\r
+        */\r
+       Label folderName = new Label();\r
+\r
+       protected PermissionsList permList;\r
+\r
+       final Folder folder;\r
+\r
+       final VerticalPanel inner;\r
+\r
+       /**\r
+        * The widget's constructor.\r
+        */\r
+       public FolderPermissionsDialog(final Pithos app, Folder selected) {\r
+        this.app = app;\r
+               Anchor close = new Anchor();\r
+               close.addStyleName("close");\r
+               close.addClickHandler(new ClickHandler() {\r
+                       \r
+                       @Override\r
+                       public void onClick(@SuppressWarnings("unused") ClickEvent event) {\r
+                               hide();\r
+                       }\r
+               });\r
+\r
+               setAnimationEnabled(true);\r
+               setGlassEnabled(true);\r
+               setStyleName("pithos-DialogBox");\r
+\r
+               // Enable IE selection for the dialog (must disable it upon closing it)\r
+               Pithos.enableIESelection();\r
+\r
+               folder = selected;\r
+\r
+               setText("Folder permissions");\r
+\r
+               // Outer contains inner and buttons\r
+               VerticalPanel outer = new VerticalPanel();\r
+               outer.add(close);\r
+               // Inner contains generalPanel and permPanel\r
+               inner = new VerticalPanel();\r
+               inner.addStyleName("inner");\r
+\r
+\r
+               folderName.setText(folder.getName());\r
+\r
+        VerticalPanel permPanel = new VerticalPanel();\r
+        FilePermissionsDialog.Images images = GWT.create(FilePermissionsDialog.Images.class);\r
+        boolean permsReadonly = folder.getInheritedPermissionsFrom() != null || folder.existChildrenPermissions();\r
+        permList = new PermissionsList(images, folder.getPermissions(), folder.getOwner(), permsReadonly);\r
+        permPanel.add(permList);\r
+\r
+        if (!permsReadonly) {\r
+            HorizontalPanel permButtons = new HorizontalPanel();\r
+            Button add = new Button("Add Group", new ClickHandler() {\r
+                @Override\r
+                public void onClick(@SuppressWarnings("unused") ClickEvent event) {\r
+                    PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, false);\r
+                    dlg.center();\r
+                }\r
+            });\r
+            add.addStyleName("button");\r
+            permButtons.add(add);\r
+            permButtons.setCellHorizontalAlignment(add, HasHorizontalAlignment.ALIGN_CENTER);\r
+\r
+            Button addUser = new Button("Add User", new ClickHandler() {\r
+                @Override\r
+                public void onClick(@SuppressWarnings("unused") ClickEvent event) {\r
+                    PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, true);\r
+                    dlg.center();\r
+                }\r
+            });\r
+            addUser.addStyleName("button");\r
+            permButtons.add(addUser);\r
+            permButtons.setCellHorizontalAlignment(addUser, HasHorizontalAlignment.ALIGN_CENTER);\r
+            permButtons.setSpacing(8);\r
+            permPanel.add(permButtons);\r
+        }\r
+\r
+        inner.add(permPanel);\r
+\r
+        outer.add(inner);\r
+\r
+               // Create the 'Create/Update' button, along with a listener that hides the dialog\r
+               // when the button is clicked and quits the application.\r
+               String okLabel = "Update";\r
+               final Button ok = new Button(okLabel, new ClickHandler() {\r
+                       @Override\r
+                       public void onClick(@SuppressWarnings("unused") ClickEvent event) {\r
+                               updateFolder();\r
+                               closeDialog();\r
+                       }\r
+               });\r
+               ok.addStyleName("button");\r
+               outer.add(ok);\r
+        outer.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER);\r
+\r
+        setWidget(outer);\r
+       }\r
+\r
+       @Override\r
+       protected void onPreviewNativeEvent(NativePreviewEvent preview) {\r
+               super.onPreviewNativeEvent(preview);\r
+\r
+               NativeEvent evt = preview.getNativeEvent();\r
+               if (evt.getType().equals(KeyDownEvent.getType().getName()))\r
+                       // Use the popup's key preview hooks to close the dialog when either\r
+                       // enter or escape is pressed.\r
+                       switch (evt.getKeyCode()) {\r
+                               case KeyCodes.KEY_ENTER:\r
+                                       updateFolder();\r
+                    closeDialog();\r
+                                       break;\r
+                               case KeyCodes.KEY_ESCAPE:\r
+                                       closeDialog();\r
+                                       break;\r
+                       }\r
+       }\r
+\r
+\r
+       /**\r
+        * Enables IE selection prevention and hides the dialog\r
+        * (we disable the prevention on creation of the dialog)\r
+        */\r
+       public void closeDialog() {\r
+               Pithos.preventIESelection();\r
+               hide();\r
+       }\r
+\r
+       void updateFolder() {\r
+        final Map<String, Boolean[]> perms = (permList.hasChanges() ? permList.getPermissions() : null);\r
+        final String newName = folderName.getText().trim();\r
+        if (!folder.isContainer() && !folder.getName().equals(newName)) {\r
+            final String path = folder.getParent().getUri() + "/" + newName;\r
+            PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getParent().getOwner(), path) {\r
+                @Override\r
+                public void onSuccess(@SuppressWarnings("unused") Resource result) {\r
+                    Iterator<File> iter = folder.getFiles().iterator();\r
+                    app.copyFiles(iter, folder.getParent().getOwner(), folder.getParent().getUri() + "/" + newName, new Command() {\r
+                        @Override\r
+                        public void execute() {\r
+                            Iterator<Folder> iterf = folder.getSubfolders().iterator();\r
+                            app.copySubfolders(iterf, folder.getParent().getOwner(), folder.getParent().getUri() + "/" + newName, new Command() {\r
+                                @Override\r
+                                public void execute() {\r
+                                    app.deleteFolder(folder);\r
+                                    updateMetadata(path + "?update=", perms);\r
+                                }\r
+                            });\r
+                        }\r
+                    });\r
+                }\r
+\r
+                @Override\r
+                public void onError(Throwable t) {\r
+                    GWT.log("", t);\r
+                                       app.setError(t);\r
+                    if(t instanceof RestException){\r
+                        app.displayError("Unable to update folder: " + ((RestException) t).getHttpStatusText());\r
+                    }\r
+                    else\r
+                        app.displayError("System error modifying folder: " + t.getMessage());\r
+                }\r
+\r
+                               @Override\r
+                               protected void onUnauthorized(@SuppressWarnings("unused") Response response) {\r
+                                       app.sessionExpired();\r
+                               }\r
+            };\r
+            newFolder.setHeader("X-Auth-Token", app.getToken());\r
+            newFolder.setHeader("Content-Type", "application/folder");\r
+            newFolder.setHeader("Accept", "*/*");\r
+            newFolder.setHeader("Content-Length", "0");\r
+            Scheduler.get().scheduleDeferred(newFolder);\r
+        }\r
+        else\r
+            updateMetadata(folder.getUri() + "?update=", perms);\r
+       }\r
+\r
+       protected void updateMetadata(final String path, final Map<String, Boolean[]> newPermissions) {\r
+        if (newPermissions != null) {\r
+            PostRequest updateFolder = new PostRequest(app.getApiPath(), folder.getOwner(), path) {\r
+                @Override\r
+                public void onSuccess(@SuppressWarnings("unused") Resource result) {\r
+                    app.updateFolder(folder.getParent(), false, new Command() {\r
+                                               \r
+                                               @Override\r
+                                               public void execute() {\r
+                                                       app.updateMySharedRoot();\r
+                                               }\r
+                                       });\r
+                }\r
+\r
+                @Override\r
+                public void onError(Throwable t) {\r
+                    GWT.log("", t);\r
+                                       app.setError(t);\r
+                    if (t instanceof RestException) {\r
+                       if (((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) { //Probably a virtual folder\r
+                            final String path1 = folder.getUri();\r
+                            PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getOwner(), path1) {\r
+                                @Override\r
+                                public void onSuccess(@SuppressWarnings("unused") Resource result) {\r
+                                       updateMetadata(path, newPermissions);\r
+                                }\r
+\r
+                                @Override\r
+                                public void onError(Throwable _t) {\r
+                                    GWT.log("", _t);\r
+                                                       app.setError(_t);\r
+                                    if(_t instanceof RestException){\r
+                                        app.displayError("Unable to update folder: " + ((RestException) _t).getHttpStatusText());\r
+                                    }\r
+                                    else\r
+                                        app.displayError("System error modifying folder: " + _t.getMessage());\r
+                                }\r
+\r
+                                               @Override\r
+                                               protected void onUnauthorized(@SuppressWarnings("unused") Response response) {\r
+                                                       app.sessionExpired();\r
+                                               }\r
+                            };\r
+                            newFolder.setHeader("X-Auth-Token", app.getToken());\r
+                            newFolder.setHeader("Content-Type", "application/folder");\r
+                            newFolder.setHeader("Accept", "*/*");\r
+                            newFolder.setHeader("Content-Length", "0");\r
+                            Scheduler.get().scheduleDeferred(newFolder);\r
+                       }\r
+                       else if (((RestException) t).getHttpStatusCode() == Response.SC_CONFLICT) {\r
+                               app.displayError("Cannot set permissions. Probably subfolders or files already have permissions set");\r
+                       }\r
+                       else\r
+                               app.displayError("Wrror modifying folder: " + t.getMessage());\r
+                    }\r
+                    else\r
+                       app.displayError("System error modifying folder: " + t.getMessage());\r
+                }\r
+\r
+                               @Override\r
+                               protected void onUnauthorized(@SuppressWarnings("unused") Response response) {\r
+                                       app.sessionExpired();\r
+                               }\r
+            };\r
+            updateFolder.setHeader("X-Auth-Token", app.getToken());\r
+            String readPermHeader = "read=";\r
+            String writePermHeader = "write=";\r
+            for (String u : newPermissions.keySet()) {\r
+                Boolean[] p = newPermissions.get(u);\r
+                if (p[0] != null && p[0])\r
+                    readPermHeader += u + ",";\r
+                if (p[1] != null && p[1])\r
+                    writePermHeader += u + ",";\r
+            }\r
+            if (readPermHeader.endsWith("="))\r
+                readPermHeader = "";\r
+            else if (readPermHeader.endsWith(","))\r
+                readPermHeader = readPermHeader.substring(0, readPermHeader.length() - 1);\r
+            if (writePermHeader.endsWith("="))\r
+                writePermHeader = "";\r
+            else if (writePermHeader.endsWith(","))\r
+                writePermHeader = writePermHeader.substring(0, writePermHeader.length() - 1);\r
+            String permHeader = readPermHeader +  ((readPermHeader.length()  > 0 && writePermHeader.length() > 0) ?  ";" : "") + writePermHeader;\r
+            if (permHeader.length() == 0)\r
+                permHeader = "~";\r
+            else\r
+               permHeader = URL.encodePathSegment(permHeader);\r
+            updateFolder.setHeader("X-Object-Sharing", permHeader);\r
+            Scheduler.get().scheduleDeferred(updateFolder);\r
+        }\r
+        else\r
+            app.updateFolder(folder.getParent(), false, new Command() {\r
+                               \r
+                               @Override\r
+                               public void execute() {\r
+                                       app.updateMySharedRoot();\r
+                               }\r
+                       });\r
+    }\r
+}\r
index c97fbd1..045a517 100644 (file)
  */\r
 package gr.grnet.pithos.web.client;\r
 \r
-import com.google.gwt.core.client.Scheduler;\r
-import com.google.gwt.event.dom.client.KeyDownEvent;\r
-import com.google.gwt.user.client.Command;\r
 import gr.grnet.pithos.web.client.foldertree.File;\r
 import gr.grnet.pithos.web.client.foldertree.Folder;\r
 import gr.grnet.pithos.web.client.foldertree.Resource;\r
-import gr.grnet.pithos.web.client.rest.PostRequest;\r
 import gr.grnet.pithos.web.client.rest.PutRequest;\r
 import gr.grnet.pithos.web.client.rest.RestException;\r
 \r
+import java.util.Iterator;\r
+\r
 import com.google.gwt.core.client.GWT;\r
+import com.google.gwt.core.client.Scheduler;\r
 import com.google.gwt.dom.client.NativeEvent;\r
 import com.google.gwt.event.dom.client.ChangeEvent;\r
 import com.google.gwt.event.dom.client.ChangeHandler;\r
 import com.google.gwt.event.dom.client.ClickEvent;\r
 import com.google.gwt.event.dom.client.ClickHandler;\r
 import com.google.gwt.event.dom.client.KeyCodes;\r
+import com.google.gwt.event.dom.client.KeyDownEvent;\r
 import com.google.gwt.http.client.Response;\r
-import com.google.gwt.http.client.URL;\r
 import com.google.gwt.i18n.client.DateTimeFormat;\r
+import com.google.gwt.user.client.Command;\r
 import com.google.gwt.user.client.Event.NativePreviewEvent;\r
 import com.google.gwt.user.client.ui.Anchor;\r
 import com.google.gwt.user.client.ui.Button;\r
-import com.google.gwt.user.client.ui.DecoratedTabPanel;\r
 import com.google.gwt.user.client.ui.DialogBox;\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.Label;\r
-import com.google.gwt.user.client.ui.TabPanel;\r
 import com.google.gwt.user.client.ui.TextBox;\r
 import com.google.gwt.user.client.ui.VerticalPanel;\r
-import java.util.Iterator;\r
-import java.util.Map;\r
 \r
 /**\r
  * The 'Folder properties' dialog box implementation.\r
@@ -87,11 +82,9 @@ public class FolderPropertiesDialog extends DialogBox {
         */\r
        private final boolean create;\r
 \r
-       protected PermissionsList permList;\r
-\r
        final Folder folder;\r
 \r
-       final TabPanel inner;\r
+       final VerticalPanel inner;\r
 \r
        /**\r
         * The widget's constructor.\r
@@ -103,7 +96,7 @@ public class FolderPropertiesDialog extends DialogBox {
                close.addClickHandler(new ClickHandler() {\r
                        \r
                        @Override\r
-                       public void onClick(ClickEvent event) {\r
+                       public void onClick(@SuppressWarnings("unused") ClickEvent event) {\r
                                hide();\r
                        }\r
                });\r
@@ -129,10 +122,8 @@ public class FolderPropertiesDialog extends DialogBox {
                VerticalPanel outer = new VerticalPanel();\r
                outer.add(close);\r
                // Inner contains generalPanel and permPanel\r
-               inner = new DecoratedTabPanel();\r
-               inner.setAnimationEnabled(true);\r
+               inner = new VerticalPanel();\r
                inner.addStyleName("inner");\r
-               inner.getDeckPanel().addStyleName("pithos-TabPanelBottom");\r
 \r
                VerticalPanel generalPanel = new VerticalPanel();\r
         FlexTable generalTable = new FlexTable();\r
@@ -168,44 +159,7 @@ public class FolderPropertiesDialog extends DialogBox {
         generalTable.getFlexCellFormatter().setStyleName(3, 1, "props-values");\r
         generalTable.setCellSpacing(4);\r
         generalPanel.add(generalTable);\r
-        inner.add(generalPanel, "General");\r
-\r
-        VerticalPanel permPanel = new VerticalPanel();\r
-        FilePermissionsDialog.Images images = GWT.create(FilePermissionsDialog.Images.class);\r
-        boolean permsReadonly = folder.getInheritedPermissionsFrom() != null || folder.existChildrenPermissions();\r
-        permList = new PermissionsList(images, folder.getPermissions(), folder.getOwner(), permsReadonly);\r
-        permPanel.add(permList);\r
-\r
-        if (!permsReadonly) {\r
-            HorizontalPanel permButtons = new HorizontalPanel();\r
-            Button add = new Button("Add Group", new ClickHandler() {\r
-                @Override\r
-                public void onClick(@SuppressWarnings("unused") ClickEvent event) {\r
-                    PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, false);\r
-                    dlg.center();\r
-                }\r
-            });\r
-            add.addStyleName("button");\r
-            permButtons.add(add);\r
-            permButtons.setCellHorizontalAlignment(add, HasHorizontalAlignment.ALIGN_CENTER);\r
-\r
-            Button addUser = new Button("Add User", new ClickHandler() {\r
-                @Override\r
-                public void onClick(@SuppressWarnings("unused") ClickEvent event) {\r
-                    PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, true);\r
-                    dlg.center();\r
-                }\r
-            });\r
-            addUser.addStyleName("button");\r
-            permButtons.add(addUser);\r
-            permButtons.setCellHorizontalAlignment(addUser, HasHorizontalAlignment.ALIGN_CENTER);\r
-            permButtons.setSpacing(8);\r
-            permPanel.add(permButtons);\r
-        }\r
-\r
-        if (!create)\r
-            inner.add(permPanel, "Sharing");\r
-        inner.selectTab(0);\r
+        inner.add(generalPanel);\r
 \r
         outer.add(inner);\r
 \r
@@ -310,7 +264,7 @@ public class FolderPropertiesDialog extends DialogBox {
             }\r
 \r
                        @Override\r
-                       protected void onUnauthorized(Response response) {\r
+                       protected void onUnauthorized(@SuppressWarnings("unused") Response response) {\r
                                app.sessionExpired();\r
                        }\r
        };\r
@@ -335,7 +289,6 @@ public class FolderPropertiesDialog extends DialogBox {
        }\r
 \r
        private void updateFolder() {\r
-        final Map<String, Boolean[]> perms = (permList.hasChanges() ? permList.getPermissions() : null);\r
         final String newName = folderName.getText().trim();\r
         if (!folder.isContainer() && !folder.getName().equals(newName)) {\r
             final String path = folder.getParent().getUri() + "/" + newName;\r
@@ -351,7 +304,13 @@ public class FolderPropertiesDialog extends DialogBox {
                                 @Override\r
                                 public void execute() {\r
                                     app.deleteFolder(folder);\r
-                                    updateMetadata(path + "?update=", perms);\r
+                                    app.updateFolder(folder.getParent(), false, new Command() {\r
+                                               \r
+                                               @Override\r
+                                               public void execute() {\r
+                                                       app.updateMySharedRoot();\r
+                                               }\r
+                                       });\r
                                 }\r
                             });\r
                         }\r
@@ -370,7 +329,7 @@ public class FolderPropertiesDialog extends DialogBox {
                 }\r
 \r
                                @Override\r
-                               protected void onUnauthorized(Response response) {\r
+                               protected void onUnauthorized(@SuppressWarnings("unused") Response response) {\r
                                        app.sessionExpired();\r
                                }\r
             };\r
@@ -381,110 +340,12 @@ public class FolderPropertiesDialog extends DialogBox {
             Scheduler.get().scheduleDeferred(newFolder);\r
         }\r
         else\r
-            updateMetadata(folder.getUri() + "?update=", perms);\r
-       }\r
-\r
-       protected void updateMetadata(final String path, final Map<String, Boolean[]> newPermissions) {\r
-        if (newPermissions != null) {\r
-            PostRequest updateFolder = new PostRequest(app.getApiPath(), folder.getOwner(), path) {\r
-                @Override\r
-                public void onSuccess(@SuppressWarnings("unused") Resource result) {\r
-                    app.updateFolder(folder.getParent(), false, new Command() {\r
-                                               \r
-                                               @Override\r
-                                               public void execute() {\r
-                                                       app.updateMySharedRoot();\r
-                                               }\r
-                                       });\r
-                }\r
-\r
-                @Override\r
-                public void onError(Throwable t) {\r
-                    GWT.log("", t);\r
-                                       app.setError(t);\r
-                    if (t instanceof RestException) {\r
-                       if (((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) { //Probably a virtual folder\r
-                            final String path1 = folder.getUri();\r
-                            PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getOwner(), path1) {\r
-                                @Override\r
-                                public void onSuccess(@SuppressWarnings("unused") Resource result) {\r
-                                       updateMetadata(path, newPermissions);\r
-                                }\r
-\r
-                                @Override\r
-                                public void onError(Throwable _t) {\r
-                                    GWT.log("", _t);\r
-                                                       app.setError(_t);\r
-                                    if(_t instanceof RestException){\r
-                                        app.displayError("Unable to update folder: " + ((RestException) _t).getHttpStatusText());\r
-                                    }\r
-                                    else\r
-                                        app.displayError("System error modifying folder: " + _t.getMessage());\r
-                                }\r
-\r
-                                               @Override\r
-                                               protected void onUnauthorized(Response response) {\r
-                                                       app.sessionExpired();\r
-                                               }\r
-                            };\r
-                            newFolder.setHeader("X-Auth-Token", app.getToken());\r
-                            newFolder.setHeader("Content-Type", "application/folder");\r
-                            newFolder.setHeader("Accept", "*/*");\r
-                            newFolder.setHeader("Content-Length", "0");\r
-                            Scheduler.get().scheduleDeferred(newFolder);\r
-                       }\r
-                       else if (((RestException) t).getHttpStatusCode() == Response.SC_CONFLICT) {\r
-                               app.displayError("Cannot set permissions. Probably subfolders or files already have permissions set");\r
-                       }\r
-                       else\r
-                               app.displayError("Wrror modifying folder: " + t.getMessage());\r
-                    }\r
-                    else\r
-                       app.displayError("System error modifying folder: " + t.getMessage());\r
-                }\r
-\r
-                               @Override\r
-                               protected void onUnauthorized(Response response) {\r
-                                       app.sessionExpired();\r
-                               }\r
-            };\r
-            updateFolder.setHeader("X-Auth-Token", app.getToken());\r
-            String readPermHeader = "read=";\r
-            String writePermHeader = "write=";\r
-            for (String u : newPermissions.keySet()) {\r
-                Boolean[] p = newPermissions.get(u);\r
-                if (p[0] != null && p[0])\r
-                    readPermHeader += u + ",";\r
-                if (p[1] != null && p[1])\r
-                    writePermHeader += u + ",";\r
-            }\r
-            if (readPermHeader.endsWith("="))\r
-                readPermHeader = "";\r
-            else if (readPermHeader.endsWith(","))\r
-                readPermHeader = readPermHeader.substring(0, readPermHeader.length() - 1);\r
-            if (writePermHeader.endsWith("="))\r
-                writePermHeader = "";\r
-            else if (writePermHeader.endsWith(","))\r
-                writePermHeader = writePermHeader.substring(0, writePermHeader.length() - 1);\r
-            String permHeader = readPermHeader +  ((readPermHeader.length()  > 0 && writePermHeader.length() > 0) ?  ";" : "") + writePermHeader;\r
-            if (permHeader.length() == 0)\r
-                permHeader = "~";\r
-            else\r
-               permHeader = URL.encodePathSegment(permHeader);\r
-            updateFolder.setHeader("X-Object-Sharing", permHeader);\r
-            Scheduler.get().scheduleDeferred(updateFolder);\r
-        }\r
-        else\r
             app.updateFolder(folder.getParent(), false, new Command() {\r
-                               \r
-                               @Override\r
-                               public void execute() {\r
-                                       app.updateMySharedRoot();\r
-                               }\r
-                       });\r
-    }\r
-\r
-       public void selectTab(int _tab) {\r
-               inner.selectTab(_tab);\r
+                       \r
+                       @Override\r
+                       public void execute() {\r
+                               app.updateMySharedRoot();\r
+                       }\r
+               });\r
        }\r
 }\r
index 6d2076a..4e530cc 100644 (file)
@@ -173,8 +173,10 @@ public class ToolsMenu extends PopupPanel {
                                                contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.group()).getHTML() + "&nbsp;Sharing</span>", true, new PropertiesCommand(app, this, files, PropertiesCommand.PERMISSIONS)));
                                                contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.versions()).getHTML() + "&nbsp;Versions</span>", true, new PropertiesCommand(app, this, files, PropertiesCommand.VERSIONS)));
                                        }
-                                       else if (!folder.isContainer())
-                                               contextMenu.addItem(new MenuItem("<span id = 'folderContextMenu.properties'>" + AbstractImagePrototype.create(newImages.viewText()).getHTML() + "&nbsp;Folder properties</span>", true, new PropertiesCommand(app, this, folder, 0)));
+                                       else if (!folder.isContainer()) {
+                                               contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.viewText()).getHTML() + "&nbsp;Folder properties</span>", true, new PropertiesCommand(app, this, folder, PropertiesCommand.PROPERTIES)));
+                                               contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.sharing()).getHTML() + "&nbsp;Folder sharing</span>", true, new PropertiesCommand(app, this, folder, PropertiesCommand.PERMISSIONS)));
+                                       }
                                    }
                                if (files != null && !files.isEmpty()) {
                                            contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.download()).getHTML() + "&nbsp;Download</span>", true, new Command() {
index a24944c..fd4eda9 100644 (file)
@@ -38,6 +38,7 @@ import gr.grnet.pithos.web.client.FilePermissionsDialog;
 import gr.grnet.pithos.web.client.FilePropertiesDialog;
 import gr.grnet.pithos.web.client.FileVersionsDialog;
 import gr.grnet.pithos.web.client.FilesPropertiesDialog;
+import gr.grnet.pithos.web.client.FolderPermissionsDialog;
 import gr.grnet.pithos.web.client.FolderPropertiesDialog;
 import gr.grnet.pithos.web.client.Pithos;
 import gr.grnet.pithos.web.client.foldertree.File;
@@ -85,9 +86,18 @@ public class PropertiesCommand implements Command {
 
         if (resource instanceof Folder) {
             Folder folder = (Folder) resource;
-            FolderPropertiesDialog dlg = new FolderPropertiesDialog(app, false, folder);
-            dlg.selectTab(tabToShow);
-            dlg.center();
+            switch (tabToShow) {
+                               case PROPERTIES:
+                                       FolderPropertiesDialog dlg = new FolderPropertiesDialog(app, false, folder);
+                                       dlg.center();
+                                       break;
+                               case PERMISSIONS:
+                                       FolderPermissionsDialog dlg1 = new FolderPermissionsDialog(app, folder);
+                                       dlg1.center();
+                                       break;
+                               default:
+                                       break;
+                       }
         }
         else if (resource instanceof List) {
             @SuppressWarnings("unchecked")