Bring Folder/Share dialog onpar with File/Share dialog
[pithos-web-client] / src / gr / grnet / pithos / web / client / FolderPermissionsDialog.java
index 7c45fea..ecb5765 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
- * Copyright 2011 GRNET S.A. All rights reserved.\r
+ * Copyright 2011-2013 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
  */\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
@@ -55,13 +45,13 @@ import com.google.gwt.http.client.Response;
 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
+import com.google.gwt.user.client.ui.*;\r
+import gr.grnet.pithos.web.client.foldertree.Folder;\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.Map;\r
 \r
 /**\r
  * The 'Folder properties' dialog box implementation.\r
@@ -70,283 +60,263 @@ public class FolderPermissionsDialog extends DialogBox {
 \r
     protected Pithos app;\r
 \r
-       /**\r
-        * The widget that holds the folderName of the folder.\r
-        */\r
-       Label folderName = new Label();\r
+    /**\r
+     * The widget that holds the folderName of the folder.\r
+     */\r
+    Label folderName = new Label();\r
 \r
-       protected PermissionsList permList;\r
+    protected PermissionsList permList;\r
 \r
-       final Folder folder;\r
+    final Folder folder;\r
 \r
-       final VerticalPanel inner;\r
+    final VerticalPanel inner;\r
 \r
-       /**\r
-        * The widget's constructor.\r
-        */\r
-       public FolderPermissionsDialog(final Pithos app, Folder selected) {\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(ClickEvent event) {\r
-                               hide();\r
-                       }\r
-               });\r
+        Anchor close = new Anchor("close");\r
+        close.addStyleName("close");\r
+        close.addClickHandler(new ClickHandler() {\r
+\r
+            @Override\r
+            public void onClick(ClickEvent event) {\r
+                hide();\r
+            }\r
+        });\r
 \r
-               setAnimationEnabled(true);\r
-               setGlassEnabled(true);\r
-               setStyleName("pithos-DialogBox");\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
+        // Enable IE selection for the dialog (must disable it upon closing it)\r
+        Pithos.enableIESelection();\r
 \r
-               folder = selected;\r
+        folder = selected;\r
 \r
-               setText("Folder permissions");\r
+        setText(Const.TXT_SHARE_FOLDER);\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
+        // 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
+        folderName.setText(folder.getName());\r
 \r
-               folderName.setText(folder.getName());\r
+        final HorizontalPanel privateInfoPanel = new HorizontalPanel();\r
+        privateInfoPanel.setSpacing(8);\r
+        final Label privateInfoTitle = new  InlineHTML("<b>Private sharing</b>");\r
+        final Label privateInfoText = new Label("Only people explicitly granted permission can access. Sign-in required.", true);\r
+        privateInfoPanel.add(privateInfoTitle);\r
+        privateInfoPanel.add(privateInfoText);\r
+        inner.add(privateInfoPanel);\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
+        FileShareDialog.PrivateSharingImages images = GWT.create(FileShareDialog.PrivateSharingImages.class);\r
+\r
+        permList = new PermissionsList(app, images, folder.getPermissions(), folder.getOwnerID(), false, new Command() {\r
+            @Override\r
+            public void execute() {\r
+                updateMetadataForPrivateSharing();\r
+            }\r
+        });\r
+\r
         permPanel.add(permList);\r
 \r
-        if (!permsReadonly) {\r
-            HorizontalPanel permButtons = new HorizontalPanel();\r
-            Button add = new Button("Add Group", new ClickHandler() {\r
+        HorizontalPanel permButtons = new HorizontalPanel();\r
+        Button addUser = new Button("Add User", new ClickHandler() {\r
+            @Override\r
+            public void onClick(ClickEvent event) {\r
+                PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, true);\r
+                dlg.center();\r
+                permList.updatePermissionTable();\r
+            }\r
+        });\r
+        addUser.addStyleName("button");\r
+        permButtons.add(addUser);\r
+        permButtons.setCellHorizontalAlignment(addUser, HasHorizontalAlignment.ALIGN_CENTER);\r
+\r
+        final boolean haveGroups = app.getAccount().getGroups().size() > 0;\r
+        if(haveGroups) {\r
+            Button addGroup = new Button("Add Group", new ClickHandler() {\r
                 @Override\r
                 public void onClick(ClickEvent event) {\r
                     PermissionsAddDialog dlg = new PermissionsAddDialog(app, app.getAccount().getGroups(), permList, false);\r
                     dlg.center();\r
+                    permList.updatePermissionTable();\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(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
+            addGroup.addStyleName("button");\r
+            permButtons.add(addGroup);\r
+            permButtons.setCellHorizontalAlignment(addGroup, HasHorizontalAlignment.ALIGN_CENTER);\r
         }\r
 \r
+        permButtons.setSpacing(8);\r
+        permPanel.add(permButtons);\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(ClickEvent event) {\r
-                               updateFolder();\r
-                               closeDialog();\r
-                       }\r
-               });\r
-               ok.addStyleName("button");\r
-               outer.add(ok);\r
+        final Button ok = new Button("OK", new ClickHandler() {\r
+            @Override\r
+            public void onClick(ClickEvent event) {\r
+                closeDialog();\r
+            }\r
+        });\r
+        ok.addStyleName("button");\r
+\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
+    }\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
+        {\r
+            switch(evt.getKeyCode()) {\r
+                case KeyCodes.KEY_ENTER:\r
+                    updateMetadataForPrivateSharing();\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(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
+                    break;\r
+                case KeyCodes.KEY_ESCAPE:\r
+                    closeDialog();\r
+                    break;\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
+     * 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
-                               @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\r
-            updateMetadata(folder.getUri() + "?update=", perms);\r
-       }\r
+    private void updateMetadataForPrivateSharing() {\r
+        final Map<String, Boolean[]> perms = (permList.hasChanges() ? permList.getPermissions() : null);\r
+        updateMetadataForPrivateSharing(\r
+            folder.getUri() + Const.QUESTION_MARK_UPDATE_EQ,\r
+            perms\r
+        );\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
+    private void updateMetadataForPrivateSharing(final String path, final Map<String, Boolean[]> newPermissions) {\r
+        if(newPermissions != null) {\r
+            PostRequest updateFolder = new PostRequest(app.getApiPath(), folder.getOwnerID(), path) {\r
                 @Override\r
                 public void onSuccess(Resource result) {\r
                     app.updateFolder(folder.getParent(), false, new Command() {\r
-                                               \r
-                                               @Override\r
-                                               public void execute() {\r
-                                                       app.updateMySharedRoot();\r
-                                               }\r
-                                       });\r
+                        @Override\r
+                        public void execute() {\r
+                            app.updateMySharedRoot();\r
+                        }\r
+                    }, true);\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
+                    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
+                            PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getOwnerID(), path1) {\r
                                 @Override\r
                                 public void onSuccess(Resource result) {\r
-                                       updateMetadata(path, newPermissions);\r
+                                    updateMetadataForPrivateSharing(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.setError(_t);\r
+                                    if(_t instanceof RestException) {\r
                                         app.displayError("Unable to update folder: " + ((RestException) _t).getHttpStatusText());\r
                                     }\r
-                                    else\r
+                                    else {\r
                                         app.displayError("System error modifying folder: " + _t.getMessage());\r
+                                    }\r
                                 }\r
 \r
-                                               @Override\r
-                                               protected void onUnauthorized(Response response) {\r
-                                                       app.sessionExpired();\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("X-Auth-Token", app.getUserToken());\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 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("Εrror modifying folder: " + t.getMessage());\r
+                        }\r
+                    }\r
+                    else {\r
+                        app.displayError("System error 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
+                @Override\r
+                protected void onUnauthorized(Response response) {\r
+                    app.sessionExpired();\r
+                }\r
             };\r
-            updateFolder.setHeader("X-Auth-Token", app.getToken());\r
+            updateFolder.setHeader("X-Auth-Token", app.getUserToken());\r
             String readPermHeader = "read=";\r
             String writePermHeader = "write=";\r
-            for (String u : newPermissions.keySet()) {\r
+            for(String u : newPermissions.keySet()) {\r
                 Boolean[] p = newPermissions.get(u);\r
-                if (p[0] != null && p[0])\r
+                if(p[0] != null && p[0]) {\r
                     readPermHeader += u + ",";\r
-                if (p[1] != null && p[1])\r
+                }\r
+                if(p[1] != null && p[1]) {\r
                     writePermHeader += u + ",";\r
+                }\r
             }\r
-            if (readPermHeader.endsWith("="))\r
+            if(readPermHeader.endsWith("=")) {\r
                 readPermHeader = "";\r
-            else if (readPermHeader.endsWith(","))\r
+            }\r
+            else if(readPermHeader.endsWith(",")) {\r
                 readPermHeader = readPermHeader.substring(0, readPermHeader.length() - 1);\r
-            if (writePermHeader.endsWith("="))\r
+            }\r
+            if(writePermHeader.endsWith("=")) {\r
                 writePermHeader = "";\r
-            else if (writePermHeader.endsWith(","))\r
+            }\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
+            }\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
+            }\r
+            else {\r
+                permHeader = URL.encodePathSegment(permHeader);\r
+            }\r
             updateFolder.setHeader("X-Object-Sharing", permHeader);\r
             Scheduler.get().scheduleDeferred(updateFolder);\r
         }\r
-        else\r
+        else {\r
             app.updateFolder(folder.getParent(), false, new Command() {\r
-                               \r
-                               @Override\r
-                               public void execute() {\r
-                                       app.updateMySharedRoot();\r
-                               }\r
-                       });\r
+                @Override\r
+                public void execute() {\r
+                    app.updateMySharedRoot();\r
+                }\r
+            }, true);\r
+        }\r
     }\r
 }\r