Merge branch 'master' of https://code.grnet.gr/git/pithos
authorSofia Papagiannaki <papagian@gmail.com>
Thu, 15 Sep 2011 15:47:46 +0000 (18:47 +0300)
committerSofia Papagiannaki <papagian@gmail.com>
Thu, 15 Sep 2011 15:47:46 +0000 (18:47 +0300)
15 files changed:
web_client/src/gr/grnet/pithos/web/client/FileContextMenu.java
web_client/src/gr/grnet/pithos/web/client/FileList.java
web_client/src/gr/grnet/pithos/web/client/FileUploadDialog.java
web_client/src/gr/grnet/pithos/web/client/FolderContextMenu.java
web_client/src/gr/grnet/pithos/web/client/FolderPropertiesDialog.java
web_client/src/gr/grnet/pithos/web/client/PermissionsList.java
web_client/src/gr/grnet/pithos/web/client/Pithos.java
web_client/src/gr/grnet/pithos/web/client/TreeView.java [new file with mode: 0644]
web_client/src/gr/grnet/pithos/web/client/commands/EmptyTrashCommand.java
web_client/src/gr/grnet/pithos/web/client/foldertree/AccountResource.java
web_client/src/gr/grnet/pithos/web/client/foldertree/FolderTreeView.java
web_client/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeView.java
web_client/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java
web_client/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeView.java
web_client/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java

index 675410b..6c52a1c 100644 (file)
@@ -187,38 +187,47 @@ public class FileContextMenu extends PopupPanel {
                images = newImages;
         MenuBar contextMenu = new MenuBar(true);
 
+        Boolean[] permissions = selectedFolder.getPermissions().get(app.getUsername());
+       boolean canWrite = selectedFolder.getOwner().equals(app.getUsername()) || (permissions!= null && permissions[1] != null && permissions[1]);
+
         if (!selectedFolder.isInTrash()) {
-               if (app.getClipboard().hasFiles()) {
+               if (canWrite && app.getClipboard().hasFiles()) {
                    pasteItem = new MenuItem("<span>" + AbstractImagePrototype.create(images.paste()).getHTML() + "&nbsp;Paste</span>", true, new PasteCommand(app, this, selectedFolder));
                    contextMenu.addItem(pasteItem);
                }
 
-               MenuItem upload = new MenuItem("<span>" + AbstractImagePrototype.create(images.fileUpdate()).getHTML() + "&nbsp;Upload</span>", true, new UploadFileCommand(app, this, selectedFolder));
-               contextMenu.addItem(upload);
-
-                       cutItem = new MenuItem("<span id='fileContextMenu.cut'>" + AbstractImagePrototype.create(newImages.cut()).getHTML() + "&nbsp;Cut</span>", true, new CutCommand(app, this, selectedFiles));
-            contextMenu.addItem(cutItem);
+               if (canWrite) {
+                       MenuItem upload = new MenuItem("<span>" + AbstractImagePrototype.create(images.fileUpdate()).getHTML() + "&nbsp;Upload</span>", true, new UploadFileCommand(app, this, selectedFolder));
+                       contextMenu.addItem(upload);
+       
+                               cutItem = new MenuItem("<span id='fileContextMenu.cut'>" + AbstractImagePrototype.create(newImages.cut()).getHTML() + "&nbsp;Cut</span>", true, new CutCommand(app, this, selectedFiles));
+                   contextMenu.addItem(cutItem);
+               }
 
                        copyItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.copy()).getHTML() + "&nbsp;Copy</span>", true, new CopyCommand(app, this, selectedFiles));
             contextMenu.addItem(copyItem);
 
-                       trashItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.emptyTrash()).getHTML() + "&nbsp;Move to Trash</span>", true, new ToTrashCommand(app, this, selectedFiles));
-            contextMenu.addItem(trashItem);
+            if (canWrite) {
+                               trashItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.emptyTrash()).getHTML() + "&nbsp;Move to Trash</span>", true, new ToTrashCommand(app, this, selectedFiles));
+                   contextMenu.addItem(trashItem);
+            }
         }
         else {
                        MenuItem restore = new MenuItem("<span>" + AbstractImagePrototype.create(images.versions()).getHTML() + "&nbsp;Restore</span>", true, new RestoreTrashCommand(app, this, selectedFiles));
                        contextMenu.addItem(restore);
         }
 
-               deleteItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.delete()).getHTML() + "&nbsp;Delete</span>", true, new DeleteCommand(app, this, selectedFiles, MessagePanel.images));
-        contextMenu.addItem(deleteItem);
+        if (canWrite) {
+                       deleteItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.delete()).getHTML() + "&nbsp;Delete</span>", true, new DeleteCommand(app, this, selectedFiles, MessagePanel.images));
+               contextMenu.addItem(deleteItem);
+        }
 
 //      MenuItem refresh = new MenuItem("<span>" + AbstractImagePrototype.create(images.refresh()).getHTML() + "&nbsp;Refresh</span>", true, new RefreshCommand(this, images));
 //      contextMenu.addItem(refresh);
 //                     sharingItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.sharing()).getHTML() + "&nbsp;Sharing</span>", true, new PropertiesCommand(this, images, 1));
 //            contextMenu.addItem(sharingItem);
         if (!selectedFolder.isInTrash()) {
-               if (selectedFiles.size() == 1)
+               if (canWrite && selectedFiles.size() == 1)
                        contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.viewText()).getHTML() + "&nbsp;Properties</span>", true, new PropertiesCommand(app, this, selectedFiles, images, 0)));
 
             if (!selectedFiles.isEmpty())
index 12ef1fd..fb28e0f 100644 (file)
@@ -314,12 +314,15 @@ public class FileList extends Composite {
         vp.addHandler(new ContextMenuHandler() {
             @Override
             public void onContextMenu(ContextMenuEvent event) {
-                Folder selectedFolder = treeView.getSelection();
-                FileContextMenu contextMenu = new FileContextMenu(app, images, selectedFolder, getSelectedFiles(), false);
-                int x = event.getNativeEvent().getClientX();
-                int y = event.getNativeEvent().getClientY();
-                contextMenu.setPopupPosition(x, y);
-                contextMenu.show();
+               TreeView tree = app.getSelectedTree();
+               if (tree != null && (tree.equals(app.getFolderTreeView()) || tree.equals(app.getOtherSharedTreeView()))) {
+                       Folder selectedFolder = app.getSelection();
+                       FileContextMenu contextMenu = new FileContextMenu(app, images, selectedFolder, getSelectedFiles(), false);
+                       int x = event.getNativeEvent().getClientX();
+                       int y = event.getNativeEvent().getClientY();
+                       contextMenu.setPopupPosition(x, y);
+                       contextMenu.show();
+               }
             }
         }, ContextMenuEvent.getType());
                initWidget(vp);
index 3026d4c..e6f8a2f 100644 (file)
@@ -171,7 +171,10 @@ public class FileUploadDialog extends DialogBox {
                                        GWT.log(results, null);
                                        app.displayError(results);
                                }
-                app.updateFolder(folder, true, null);
+                               if (app.getSelectedTree().equals(app.getFolderTreeView()))
+                                       app.updateFolder(folder, true, null);
+                               else
+                                       app.updateOtherSharedFolder(folder, true);
                                hide();
                        }
                });
@@ -206,7 +209,7 @@ public class FileUploadDialog extends DialogBox {
             return;
         }
         final String fname = getFilename(upload.getFilename());
-        String apath = app.getApiPath() + app.getUsername() + folder.getUri() + "/" + fname;
+        String apath = app.getApiPath() + folder.getOwner() + folder.getUri() + "/" + fname;
         form.setAction(apath);
         submit.setEnabled(false);
         upload.setVisible(false);
index e5c5f8e..4743787 100644 (file)
@@ -82,33 +82,40 @@ public class FolderContextMenu extends PopupPanel {
                images = newImages;
         MenuBar contextMenu = new MenuBar(true);
 
-        if (!folder.isInTrash()) {
-               MenuItem newFolder = new MenuItem("<span id = 'folderContextMenu.newFolder'>" + AbstractImagePrototype.create(newImages.folderNew()).getHTML() + "&nbsp;New Folder</span>", true, new NewFolderCommand(app, this, folder, images));
-               contextMenu.addItem(newFolder);
+        Boolean[] permissions = folder.getPermissions().get(app.getUsername());
+       boolean canWrite = folder.getOwner().equals(app.getUsername()) || (permissions!= null && permissions[1] != null && permissions[1]);
 
-               if (!folder.isContainer()) {
-                   MenuItem cut = new MenuItem("<span id = 'folderContextMenu.cut'>" + AbstractImagePrototype.create(newImages.cut()).getHTML() + "&nbsp;Cut</span>", true, new CutCommand(app, this, folder));
-                   contextMenu.addItem(cut);
-               }
+        if (!folder.isInTrash()) {
+               if (canWrite) {
+                       MenuItem newFolder = new MenuItem("<span id = 'folderContextMenu.newFolder'>" + AbstractImagePrototype.create(newImages.folderNew()).getHTML() + "&nbsp;New Folder</span>", true, new NewFolderCommand(app, this, folder, images));
+                       contextMenu.addItem(newFolder);
+
+                       if (!folder.isContainer()) {
+                           MenuItem cut = new MenuItem("<span id = 'folderContextMenu.cut'>" + AbstractImagePrototype.create(newImages.cut()).getHTML() + "&nbsp;Cut</span>", true, new CutCommand(app, this, folder));
+                           contextMenu.addItem(cut);
+                       }
+               }
 
                MenuItem copy = new MenuItem("<span id = 'folderContextMenu.copy'>" + AbstractImagePrototype.create(newImages.copy()).getHTML() + "&nbsp;Copy</span>", true, new CopyCommand(app, this, folder));
                contextMenu.addItem(copy);
        
-               if (!app.getClipboard().isEmpty()) {
-                   pasteItem = new MenuItem("<span id = 'folderContextMenu.paste'>" + AbstractImagePrototype.create(newImages.paste()).getHTML() + "&nbsp;Paste</span>", true, new PasteCommand(app, this, folder));
-                   contextMenu.addItem(pasteItem);
-               }
-
-                   if (!folder.isContainer()) {
-                       MenuItem moveToTrash = new MenuItem("<span id = 'folderContextMenu.moveToTrash'>" + AbstractImagePrototype.create(newImages.emptyTrash()).getHTML() + "&nbsp;Move to Trash</span>", true, new ToTrashCommand(app, this, folder));
-                       contextMenu.addItem(moveToTrash);
-               
-                       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, newImages, 0));
-                       contextMenu.addItem(properties);
-                   }
+               if (canWrite) {
+                       if (!app.getClipboard().isEmpty()) {
+                           pasteItem = new MenuItem("<span id = 'folderContextMenu.paste'>" + AbstractImagePrototype.create(newImages.paste()).getHTML() + "&nbsp;Paste</span>", true, new PasteCommand(app, this, folder));
+                           contextMenu.addItem(pasteItem);
+                       }
+
+                           if (!folder.isContainer()) {
+                               MenuItem moveToTrash = new MenuItem("<span id = 'folderContextMenu.moveToTrash'>" + AbstractImagePrototype.create(newImages.emptyTrash()).getHTML() + "&nbsp;Move to Trash</span>", true, new ToTrashCommand(app, this, folder));
+                               contextMenu.addItem(moveToTrash);
+                       
+                               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, newImages, 0));
+                               contextMenu.addItem(properties);
+                           }
+               }
         }
         else {
                if (!folder.isTrash()) {
index a1e0015..e6789cf 100644 (file)
@@ -49,6 +49,7 @@ import com.google.gwt.dom.client.NativeEvent;
 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.http.client.Response;\r
 import com.google.gwt.i18n.client.DateTimeFormat;\r
 import com.google.gwt.user.client.Event.NativePreviewEvent;\r
 import com.google.gwt.user.client.ui.Button;\r
@@ -340,7 +341,7 @@ public class FolderPropertiesDialog extends DialogBox {
             updateMetadata(folder.getUri() + "?update=", perms);\r
        }\r
 \r
-       protected void updateMetadata(String path, Map<String, Boolean[]> newPermissions) {\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
@@ -351,7 +352,34 @@ public class FolderPropertiesDialog extends DialogBox {
                 @Override\r
                 public void onError(Throwable t) {\r
                     GWT.log("", t);\r
-                    app.displayError("System error modifying folder: " + t.getMessage());\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(), app.getUsername(), 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
+                                    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
+                            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
+                    }\r
+                    else\r
+                       app.displayError("System error modifying folder: " + t.getMessage());\r
                 }\r
             };\r
             updateFolder.setHeader("X-Auth-Token", app.getToken());\r
index 39aaad2..45ab6c7 100644 (file)
@@ -141,6 +141,7 @@ public class PermissionsList extends Composite {
                     public void onValueChange(ValueChangeEvent<Boolean> booleanValueChangeEvent) {
                         Boolean[] ps = permissions.get(user);
                         ps[0] = booleanValueChangeEvent.getValue();
+                        hasChanges = true;
                     }
                 });
                 write.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@@ -148,6 +149,7 @@ public class PermissionsList extends Composite {
                     public void onValueChange(ValueChangeEvent<Boolean> booleanValueChangeEvent) {
                         Boolean[] ps = permissions.get(user);
                         ps[1] = booleanValueChangeEvent.getValue();
+                        hasChanges = true;
                     }
                 });
                 PushButton removeButton = new PushButton(AbstractImagePrototype.create(images.delete()).createImage(), new ClickHandler() {
index a58e95c..efeb5a3 100644 (file)
@@ -240,17 +240,17 @@ public class Pithos implements EntryPoint, ResizeHandler {
      */
     private String token;
 
-    protected SingleSelectionModel<Folder> folderTreeSelectionModel;
-    protected FolderTreeViewModel folderTreeViewModel;
-    protected FolderTreeView folderTreeView;
+    SingleSelectionModel<Folder> folderTreeSelectionModel;
+    FolderTreeViewModel folderTreeViewModel;
+    FolderTreeView folderTreeView;
 
-    protected SingleSelectionModel<Folder> mysharedTreeSelectionModel;
+    SingleSelectionModel<Folder> mysharedTreeSelectionModel;
     private MysharedTreeViewModel mysharedTreeViewModel;
-    private MysharedTreeView mysharedTreeView;
+    MysharedTreeView mysharedTreeView;
 
     protected SingleSelectionModel<Folder> otherSharedTreeSelectionModel;
     private OtherSharedTreeViewModel otherSharedTreeViewModel;
-    private OtherSharedTreeView otherSharedTreeView;
+    OtherSharedTreeView otherSharedTreeView;
 
     protected SingleSelectionModel<Tag> tagTreeSelectionModel;
     private TagTreeViewModel tagTreeViewModel;
@@ -259,12 +259,15 @@ public class Pithos implements EntryPoint, ResizeHandler {
     private GroupTreeViewModel groupTreeViewModel;
     private GroupTreeView groupTreeView;
 
+    private TreeView selectedTree;
     protected AccountResource account;
     
     private Folder trash;
 
     @SuppressWarnings("rawtypes")
        private List<SingleSelectionModel> selectionModels = new ArrayList<SingleSelectionModel>();
+    
+    Button upload;
 
        @Override
        public void onModuleLoad() {
@@ -294,15 +297,6 @@ public class Pithos implements EntryPoint, ResizeHandler {
         rightside.addStyleName("pithos-rightSide");
         rightside.setSpacing(5);
 
-        PushButton parentButton = new PushButton(new Image(images.asc()), new ClickHandler() {
-            @Override
-            public void onClick(@SuppressWarnings("unused") ClickEvent event) {
-
-            }
-        });
-        parentButton.addStyleName("pithos-parentButton");
-        rightside.add(parentButton);
-
         HTML folderStatistics = new HTML("5 Files (size: 1.1GB)");
         folderStatistics.addStyleName("pithos-folderStatistics");
         rightside.add(folderStatistics);
@@ -316,7 +310,8 @@ public class Pithos implements EntryPoint, ResizeHandler {
             @Override
             public void onSelectionChange(@SuppressWarnings("unused") SelectionChangeEvent event) {
                 if (folderTreeSelectionModel.getSelectedObject() != null) {
-                    deselectOthers(folderTreeSelectionModel);
+                    deselectOthers(folderTreeView, folderTreeSelectionModel);
+                    applyPermissions(folderTreeSelectionModel.getSelectedObject());
                     Folder f = folderTreeSelectionModel.getSelectedObject();
                     updateFolder(f, true, null);
                 }
@@ -335,7 +330,8 @@ public class Pithos implements EntryPoint, ResizeHandler {
             @Override
             public void onSelectionChange(@SuppressWarnings("unused") SelectionChangeEvent event) {
                 if (mysharedTreeSelectionModel.getSelectedObject() != null) {
-                    deselectOthers(mysharedTreeSelectionModel);
+                    deselectOthers(mysharedTreeView, mysharedTreeSelectionModel);
+                    upload.setEnabled(false);
                     updateSharedFolder(mysharedTreeSelectionModel.getSelectedObject(), true);
                 }
             }
@@ -349,7 +345,8 @@ public class Pithos implements EntryPoint, ResizeHandler {
             @Override
             public void onSelectionChange(@SuppressWarnings("unused") SelectionChangeEvent event) {
                 if (otherSharedTreeSelectionModel.getSelectedObject() != null) {
-                    deselectOthers(otherSharedTreeSelectionModel);
+                    deselectOthers(otherSharedTreeView, otherSharedTreeSelectionModel);
+                    applyPermissions(otherSharedTreeSelectionModel.getSelectedObject());
                     updateOtherSharedFolder(otherSharedTreeSelectionModel.getSelectedObject(), true);
                 }
             }
@@ -358,30 +355,15 @@ public class Pithos implements EntryPoint, ResizeHandler {
         otherSharedTreeViewModel = new OtherSharedTreeViewModel(this, otherSharedTreeSelectionModel);
         otherSharedTreeView = new OtherSharedTreeView(otherSharedTreeViewModel);
 
-        tagTreeSelectionModel = new SingleSelectionModel<Tag>();
-        tagTreeSelectionModel.addSelectionChangeHandler(new Handler() {
-            @Override
-            public void onSelectionChange(@SuppressWarnings("unused") SelectionChangeEvent event) {
-                if (tagTreeSelectionModel.getSelectedObject() != null) {
-                    deselectOthers(tagTreeSelectionModel);
-                    Tag t = tagTreeSelectionModel.getSelectedObject();
-                    updateTag(t);
-                }
-            }
-        });
-        selectionModels.add(tagTreeSelectionModel);
-        tagTreeViewModel = new TagTreeViewModel(this, tagTreeSelectionModel);
-        tagTreeView = new TagTreeView(tagTreeViewModel);
-
         groupTreeViewModel = new GroupTreeViewModel(this);
         groupTreeView = new GroupTreeView(groupTreeViewModel);
 
         VerticalPanel trees = new VerticalPanel();
 
-        Button upload = new Button("Upload File", new ClickHandler() {
+        upload = new Button("Upload File", new ClickHandler() {
             @Override
             public void onClick(@SuppressWarnings("unused") ClickEvent event) {
-                new UploadFileCommand(Pithos.this, null, folderTreeView.getSelection()).execute();
+                new UploadFileCommand(Pithos.this, null, getSelection()).execute();
             }
         });
         upload.addStyleName("pithos-uploadButton");
@@ -436,8 +418,26 @@ public class Pithos implements EntryPoint, ResizeHandler {
         });
     }
 
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-       public void deselectOthers(SingleSelectionModel model) {
+    public void applyPermissions(Folder f) {
+       if (f != null) {
+               if (f.isInTrash())
+                       upload.setEnabled(false);
+               else {
+                       Boolean[] perms = f.getPermissions().get(username);
+                       if (f.getOwner().equals(username) || (perms != null && perms[1] != null && perms[1])) {
+                               upload.setEnabled(true);
+                       }
+                       else
+                               upload.setEnabled(false);
+               }
+       }
+       else
+               upload.setEnabled(false);
+       }
+
+       @SuppressWarnings({ "rawtypes", "unchecked" })
+       public void deselectOthers(TreeView _selectedTree, SingleSelectionModel model) {
+       selectedTree = _selectedTree;
         for (SingleSelectionModel s : selectionModels)
             if (!s.equals(model))
                 s.setSelected(s.getSelectedObject(), false);
@@ -512,7 +512,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
         */
        protected void authenticateUser() {
                Configuration conf = (Configuration) GWT.create(Configuration.class);
-        Window.Location.assign(Window.Location.getHost() + conf.loginUrl() + "?next=" + Window.Location.getHref());
+        Window.Location.assign(conf.loginUrl() + "?next=" + Window.Location.getHref());
        }
 
        protected void fetchAccount() {
@@ -939,4 +939,12 @@ public class Pithos implements EntryPoint, ResizeHandler {
                account.removeGroup(group);
                updateGroupsNode();
        }
+
+       public TreeView getSelectedTree() {
+               return selectedTree;
+       }
+       
+       public Folder getSelection() {
+               return selectedTree.getSelection();
+       }
 }
diff --git a/web_client/src/gr/grnet/pithos/web/client/TreeView.java b/web_client/src/gr/grnet/pithos/web/client/TreeView.java
new file mode 100644 (file)
index 0000000..0d4bad5
--- /dev/null
@@ -0,0 +1,7 @@
+package gr.grnet.pithos.web.client;
+
+import gr.grnet.pithos.web.client.foldertree.Folder;
+
+public interface TreeView {
+       public Folder getSelection();
+}
index 6bf19a9..fcc0ced 100644 (file)
  */
 package gr.grnet.pithos.web.client.commands;
 
+import java.util.Iterator;
+
 import gr.grnet.pithos.web.client.Pithos;
+import gr.grnet.pithos.web.client.foldertree.File;
+import gr.grnet.pithos.web.client.foldertree.Folder;
+import gr.grnet.pithos.web.client.foldertree.Resource;
+import gr.grnet.pithos.web.client.rest.DeleteRequest;
+import gr.grnet.pithos.web.client.rest.RestException;
 
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.ui.PopupPanel;
 
@@ -46,7 +55,7 @@ import com.google.gwt.user.client.ui.PopupPanel;
 public class EmptyTrashCommand implements Command{
        private PopupPanel containerPanel;
 
-    private Pithos app;
+    Pithos app;
 
        public EmptyTrashCommand(Pithos _app, PopupPanel _containerPanel){
         app = _app;
@@ -57,5 +66,98 @@ public class EmptyTrashCommand implements Command{
        public void execute() {
                if (containerPanel != null)
                        containerPanel.hide();
+               
+               final Folder trash = app.getAccount().getTrash();
+               if (trash != null) {
+                       Iterator<File> iter = trash.getFiles().iterator();
+                       deleteFile(iter, new Command() {
+                               
+                               @Override
+                               public void execute() {
+                                       Iterator<Folder> iter2 = trash.getSubfolders().iterator();
+                                       deleteSubfolder(iter2, new Command() {
+                                               
+                                               @Override
+                                               public void execute() {
+                                                       app.updateTrash(true, null);
+                                               }
+                                       });
+                               }
+                       });
+               }
+       }
+
+       protected void deleteSubfolder(final Iterator<Folder> iter2, final Command callback) {
+               if (iter2.hasNext()) {
+                       final Folder f = iter2.next();
+                       Iterator<File> iter3 = f.getFiles().iterator();
+                       deleteFile(iter3, new Command() {
+                               
+                               @Override
+                               public void execute() {
+                                       Iterator<Folder> iter4 = f.getSubfolders().iterator();
+                                       deleteSubfolder(iter4, new Command() {
+                                               
+                                               @Override
+                                               public void execute() {
+                                                       String path = f.getUri();
+                                                       DeleteRequest deleteF = new DeleteRequest(app.getApiPath(), f.getOwner(), path) {
+                                                               
+                                                               @Override
+                                                               public void onSuccess(Resource result) {
+                                                                       deleteSubfolder(iter2, callback);
+                                                               }
+                                                               
+                                                               @Override
+                                                               public void onError(Throwable t) {
+                                                                       GWT.log("", t);
+                                                                       if (t instanceof RestException) {
+                                                                               app.displayError("Unable to delete file:" + ((RestException) t).getHttpStatusText());
+                                                                       }
+                                                                       else
+                                                                               app.displayError("System error deleting file:" + t.getMessage());
+                                                               }
+                                                       };
+                                                       deleteF.setHeader("X-Auth-Token", app.getToken());
+                                                       Scheduler.get().scheduleDeferred(deleteF);
+                                               }
+                                       });
+                               }
+                       });
+               }
+               else {
+                       if (callback != null)
+                               callback.execute();
+               }
+       }
+
+       void deleteFile(final Iterator<File> iter, final Command callback) {
+               if (iter.hasNext()) {
+                       File f = iter.next();
+                       String path = f.getUri();
+                       DeleteRequest deleteF = new DeleteRequest(app.getApiPath(), f.getOwner(), path) {
+                               
+                               @Override
+                               public void onSuccess(Resource result) {
+                                       deleteFile(iter, callback);
+                               }
+                               
+                               @Override
+                               public void onError(Throwable t) {
+                                       GWT.log("", t);
+                                       if (t instanceof RestException) {
+                                               app.displayError("Unable to delete file:" + ((RestException) t).getHttpStatusText());
+                                       }
+                                       else
+                                               app.displayError("System error deleting file:" + t.getMessage());
+                               }
+                       };
+                       deleteF.setHeader("X-Auth-Token", app.getToken());
+                       Scheduler.get().scheduleDeferred(deleteF);
+               }
+               else {
+                       if (callback != null)
+                               callback.execute();
+               }
        }
 }
index de26365..18d781c 100644 (file)
@@ -239,4 +239,12 @@ public class AccountResource extends Resource {
        public void removeGroup(Group group) {
                groups.remove(group);
        }
+
+       public Folder getTrash() {
+               for (Folder c : containers) {
+                       if (c.getName().equals(Pithos.TRASH_CONTAINER))
+                               return c;
+               }
+               return null;
+       }
 }
index 76cba0a..9893285 100644 (file)
@@ -47,8 +47,9 @@ import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.Tree;
 import gr.grnet.pithos.web.client.FolderContextMenu;
+import gr.grnet.pithos.web.client.TreeView;
 
-public class FolderTreeView extends Composite {
+public class FolderTreeView extends Composite implements TreeView {
 
     public void updateChildren(Folder folder) {
         TreeNode root = ((CellTree) getWidget()).getRootTreeNode();
@@ -57,17 +58,17 @@ public class FolderTreeView extends Composite {
 
     private void updateChildren(TreeNode node, Folder folder) {
         for (int i=0; i<node.getChildCount(); i++) {
-            if (node.isChildOpen(i)) {
-                if (folder.equals(node.getChildValue(i))) {
-                    node.setChildOpen(i, false, true);
-                    node.setChildOpen(i, true, true);
-                }
-                else {
+            if (folder.equals(node.getChildValue(i))) {
+                node.setChildOpen(i, false, true);
+                node.setChildOpen(i, true, true);
+            }
+            else {
+                if (node.isChildOpen(i)) {
                     TreeNode n = node.setChildOpen(i, true);
                     updateChildren(n, folder);
                 }
             }
-        }
+       }
     }
 
     static interface BasicResources extends CellTree.Resources {
index 5537cc7..78d864e 100644 (file)
@@ -36,6 +36,7 @@
 package gr.grnet.pithos.web.client.mysharedtree;
 
 import gr.grnet.pithos.web.client.FolderContextMenu;
+import gr.grnet.pithos.web.client.TreeView;
 import gr.grnet.pithos.web.client.foldertree.Folder;
 
 import com.google.gwt.core.client.GWT;
@@ -49,7 +50,7 @@ import com.google.gwt.user.cellview.client.TreeNode;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.Tree;
 
-public class MysharedTreeView extends Composite {
+public class MysharedTreeView extends Composite implements TreeView {
 
     public void updateChildren(Folder folder) {
         TreeNode root = ((CellTree) getWidget()).getRootTreeNode();
index ee736fb..1c0eba1 100644 (file)
@@ -72,7 +72,7 @@ public class MysharedTreeViewModel implements TreeViewModel {
 
     protected Pithos app;
 
-    private Cell<Folder> folderCell = new AbstractCell<Folder>(ContextMenuEvent.getType().getName()) {
+    private Cell<Folder> folderCell = new AbstractCell<Folder>() {
 
        @Override
         public void render(@SuppressWarnings("unused") Context context, Folder folder, SafeHtmlBuilder safeHtmlBuilder) {
@@ -116,7 +116,8 @@ public class MysharedTreeViewModel implements TreeViewModel {
                 @Override
                 public void onSelectionChange(@SuppressWarnings("unused") SelectionChangeEvent event) {
                     if (selectionModel2.getSelectedObject() != null) {
-                       app.deselectOthers(selectionModel2);
+                       app.deselectOthers(app.getMySharedTreeView(), selectionModel2);
+                       app.applyPermissions(null);
                        fetchSharedFiles();
                     }
                 }
index 531510e..4da4b28 100644 (file)
@@ -36,6 +36,7 @@
 package gr.grnet.pithos.web.client.othersharedtree;
 
 import gr.grnet.pithos.web.client.FolderContextMenu;
+import gr.grnet.pithos.web.client.TreeView;
 import gr.grnet.pithos.web.client.foldertree.Folder;
 
 import com.google.gwt.core.client.GWT;
@@ -49,7 +50,7 @@ import com.google.gwt.user.cellview.client.TreeNode;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.Tree;
 
-public class OtherSharedTreeView extends Composite {
+public class OtherSharedTreeView extends Composite implements TreeView {
 
     public void updateChildren(Folder folder) {
         TreeNode root = ((CellTree) getWidget()).getRootTreeNode();
index 89eb4c1..e97dac8 100644 (file)
@@ -118,7 +118,8 @@ public class OtherSharedTreeViewModel implements TreeViewModel {
                 @Override
                 public void onSelectionChange(@SuppressWarnings("unused") SelectionChangeEvent event) {
                     if (selectionModel2.getSelectedObject() != null) {
-                       app.deselectOthers(selectionModel2);
+                       app.deselectOthers(app.getOtherSharedTreeView(), selectionModel2);
+                       app.applyPermissions(null);
                        app.showFiles(new HashSet<File>());
                     }
                 }
@@ -149,7 +150,8 @@ public class OtherSharedTreeViewModel implements TreeViewModel {
                        @Override
                        public void onSelectionChange(@SuppressWarnings("unused") SelectionChangeEvent event) {
                            if (selectionModel3.getSelectedObject() != null) {
-                               app.deselectOthers(selectionModel3);
+                               app.deselectOthers(app.getOtherSharedTreeView(), selectionModel3);
+                               app.applyPermissions(null);
                                String username = selectionModel3.getSelectedObject();
                                fetchSharedFiles(username, userDataProviderMap.get(username));
                            }