Merge branch 'master' into uploadArea
[pithos-web-client] / src / gr / grnet / pithos / web / client / Pithos.java
index 0da97e6..d034e86 100644 (file)
@@ -34,6 +34,7 @@
  */
 package gr.grnet.pithos.web.client;
 
+import gr.grnet.pithos.web.client.PithosDisclosurePanel.Style;
 import gr.grnet.pithos.web.client.commands.UploadFileCommand;
 import gr.grnet.pithos.web.client.foldertree.AccountResource;
 import gr.grnet.pithos.web.client.foldertree.File;
@@ -82,7 +83,10 @@ import com.google.gwt.json.client.JSONObject;
 import com.google.gwt.json.client.JSONParser;
 import com.google.gwt.json.client.JSONString;
 import com.google.gwt.json.client.JSONValue;
+import com.google.gwt.resources.client.ClientBundle;
+import com.google.gwt.resources.client.CssResource;
 import com.google.gwt.resources.client.ImageResource;
+import com.google.gwt.resources.client.ClientBundle.Source;
 import com.google.gwt.resources.client.ImageResource.ImageOptions;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.Cookies;
@@ -92,6 +96,7 @@ import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.AbstractImagePrototype;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.HTML;
 import com.google.gwt.user.client.ui.HasHorizontalAlignment;
 import com.google.gwt.user.client.ui.HasVerticalAlignment;
@@ -114,6 +119,17 @@ public class Pithos implements EntryPoint, ResizeHandler {
 
        public static final Configuration config = GWT.create(Configuration.class);
        
+       public interface Style extends CssResource {
+               String commandAnchor();
+       }
+       
+       public interface Resources extends ClientBundle {
+               @Source("Pithos.css")
+               Style pithosCss();
+       }
+
+       public static Resources resources = GWT.create(Resources.class);
+       
        /**
         * Instantiate an application-level image bundle. This object will provide
         * programmatic access to all the images needed by widgets.
@@ -144,10 +160,14 @@ public class Pithos implements EntryPoint, ResizeHandler {
        mysharedTreeView.updateRoot();
     }
     
-    public void updateSharedFolder(Folder f, boolean showfiles) {
-       mysharedTreeView.updateFolder(f, showfiles);
+    public void updateSharedFolder(Folder f, boolean showfiles, Command callback) {
+       mysharedTreeView.updateFolder(f, showfiles, callback);
     }
     
+    public void updateSharedFolder(Folder f, boolean showfiles) {
+       updateSharedFolder(f, showfiles, null);
+    }
+
     public void updateOtherSharedFolder(Folder f, boolean showfiles) {
        otherSharedTreeView.updateFolder(f, showfiles);
     }
@@ -249,7 +269,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
 
     @SuppressWarnings("rawtypes") List<SingleSelectionModel> selectionModels = new ArrayList<SingleSelectionModel>();
     
-    Button upload;
+    public Button upload;
     
     private HTML numOfFiles;
     
@@ -264,6 +284,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
        }
 
     private void initialize() {
+       resources.pithosCss().ensureInjected();
        boolean bareContent = Window.Location.getParameter("noframe") != null;
        String contentWidth = bareContent ? "100%" : "75%";
 
@@ -359,11 +380,11 @@ public class Pithos implements EntryPoint, ResizeHandler {
         fileList = new FileList(this, images);
         inner.add(fileList);
 
+        inner.add(createUploadArea());
+        
         trees = new VerticalPanel();
         trees.setWidth("100%");
         
-        trees.add(folderTreeView);
-        
         // Add the left and right panels to the split panel.
         splitPanel.setLeftWidget(trees);
         splitPanel.setRightWidget(inner);
@@ -419,6 +440,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
                                                        trash = f;
                                                        break;
                                                }
+                                   trees.add(folderTreeView);
                                    folderTreeViewModel.initialize(account, new Command() {
                                                                
                                                                @Override
@@ -461,31 +483,32 @@ public class Pithos implements EntryPoint, ResizeHandler {
 
     public void applyPermissions(Folder f) {
        if (f != null) {
-               if (f.isInTrash())
+               if (f.isInTrash()) {
                        upload.setEnabled(false);
+                       hideUploadArea();
+               }
                else {
                        Boolean[] perms = f.getPermissions().get(username);
                        if (f.getOwner().equals(username) || (perms != null && perms[1] != null && perms[1])) {
                                upload.setEnabled(true);
+                               showUploadArea();
                        }
-                       else
+                       else {
                                upload.setEnabled(false);
+                               hideUploadArea();
+                       }
                }
        }
-       else
+       else {
                upload.setEnabled(false);
+               hideUploadArea();
+       }
        }
 
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public void deselectOthers(TreeView _selectedTree, SingleSelectionModel model) {
        selectedTree = _selectedTree;
        
-       for (Composite c : treeViews)
-               if (c.equals(selectedTree))
-                       c.addStyleName("cellTreeWidget-selectedTree");
-               else
-                       c.removeStyleName("cellTreeWidget-selectedTree");
-       
         for (SingleSelectionModel s : selectionModels)
             if (!s.equals(model) && s.getSelectedObject() != null)
                 s.setSelected(s.getSelectedObject(), false);
@@ -1045,10 +1068,11 @@ public class Pithos implements EntryPoint, ResizeHandler {
                groupTreeView.updateGroupNode(null);
        }
 
-       public void addGroup(String groupname) {
+       public Group addGroup(String groupname) {
                Group newGroup = new Group(groupname);
                account.addGroup(newGroup);
                groupTreeView.updateGroupNode(null);
+               return newGroup;
        }
 
        public void removeGroup(Group group) {
@@ -1094,6 +1118,7 @@ public class Pithos implements EntryPoint, ResizeHandler {
                        if (mysharedTreeSelectionModel.getSelectedObject() != null) {
                            deselectOthers(mysharedTreeView, mysharedTreeSelectionModel);
                            upload.setEnabled(false);
+                           hideUploadArea();
                            updateSharedFolder(mysharedTreeSelectionModel.getSelectedObject(), true);
                                        showRelevantToolbarButtons();
                        }
@@ -1126,7 +1151,6 @@ public class Pithos implements EntryPoint, ResizeHandler {
                    public void onSelectionChange(SelectionChangeEvent event) {
                        if (otherSharedTreeSelectionModel.getSelectedObject() != null) {
                            deselectOthers(otherSharedTreeView, otherSharedTreeSelectionModel);
-                           otherSharedTreeView.addStyleName("cellTreeWidget-selectedTree");
                            applyPermissions(otherSharedTreeSelectionModel.getSelectedObject());
                            updateOtherSharedFolder(otherSharedTreeSelectionModel.getSelectedObject(), true);
                                        showRelevantToolbarButtons();
@@ -1284,4 +1308,132 @@ public class Pithos implements EntryPoint, ResizeHandler {
        public boolean isMySharedSelected() {
                return getSelectedTree().equals(getMySharedTreeView());
        }
+       
+       private FlowPanel createUploadArea() {
+               FlowPanel area = new FlowPanel();
+               area.getElement().setId("container");
+               HTML list = new HTML();
+               list.getElement().setId("filelist");
+               area.add(list);
+               Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+                       
+                       @Override
+                       public void execute() {
+                               setupUploadArea(Pithos.this, getToken());
+                       }
+               });
+               
+               return area;
+       }
+       
+       native void setupUploadArea(Pithos app, String token) /*-{
+               $wnd.$("#container").pluploadQueue({
+                       // General settings
+                       runtimes : 'html5',
+                       unique_names : true,
+                       multiple_queues: true,
+                       drop_element: 'filelist',
+                       
+                       preinit: {
+                               Init: function(up, info) {
+                                       if ($wnd.console && $wnd.console.log)
+                                               $wnd.console.log("Init fired");
+                                       up.settings.file_data_name = "X-Object-Data";                           
+                               }
+                       },
+                       
+                       init: {
+                               FilesAdded: function(up, files) {
+                                       $wnd.$('#container').css('border', '');
+                                       var api = app.@gr.grnet.pithos.web.client.Pithos::getApiPath()();
+                                       var folder = app.@gr.grnet.pithos.web.client.Pithos::getUploadFolder()();
+                                       var owner = folder.@gr.grnet.pithos.web.client.foldertree.Folder::getOwner()();
+                                       var uri = folder.@gr.grnet.pithos.web.client.foldertree.Folder::getUri()();
+                                       var path = api + owner + uri;
+                                       for (var j=0; j<files.length; j++) {
+                                               files[j].folder = folder;
+                                               files[j].url = path + "/" + files[j].name + "?X-Auth-Token=" + encodeURIComponent(token);
+                                       }
+                                       up.start();
+                               },
+                               
+                               BeforeUpload: function(up, file) {
+                                       if ($wnd.console && $wnd.console.log)
+                                               $wnd.console.log('About to upload ' + file.url);
+                                       up.settings.url = file.url;
+                               },
+                               
+                               FileUploaded: function(up, file, response) {
+                                       if ($wnd.console && $wnd.console.log) {
+                                               $wnd.console.log('File ' + file.name + ' uploaded');
+                                               $wnd.console.log('Response: ' + response);
+                                       }
+                                       up.removeFile(file);
+                                       var folder = app.@gr.grnet.pithos.web.client.Pithos::getUploadFolder()();
+                                       if (folder == file.folder)
+                                               app.@gr.grnet.pithos.web.client.Pithos::updateUploadFolder()();
+                               },
+                               
+                               UploadComplete: function(up, files) {
+                                       if ($wnd.console && $wnd.console.log)
+                                               $wnd.console.log('All files finished');
+                               },
+                               
+                               Error: function(up, error) {
+                                       if ($wnd.console && $wnd.console.log)
+                                               $wnd.console.log("Error occured:" + error);
+                               }
+                       }
+               });
+               var uploader = $wnd.$("#container").pluploadQueue();
+               if (uploader.runtime != 'html5')
+                       $wnd.$("#container").hide();
+               else {
+                       if ($wnd.console && $wnd.console.log) {
+                               $wnd.console.log(uploader);
+                               $wnd.console.log($wnd.plupload);
+                       }
+                       $wnd.$('.plupload_header').hide();
+                       $wnd.$('.plupload_filelist_header').hide();
+                       $wnd.$('#container_filelist').css('overflow-y', 'auto');
+                       $wnd.$('.plupload_filelist_footer').hide();
+                       $wnd.document.getElementById('container').addEventListener('dragenter', function(event) {
+                               $wnd.$('#container').css('border', '3px inset');
+                       }, false);
+                       $wnd.document.getElementById('container').addEventListener('dragleave', function(event) {
+                               $wnd.$('#container').css('border', '');
+                       }, false);
+               }
+       }-*/;
+       
+       private Folder getUploadFolder() {
+               if (folderTreeView.equals(getSelectedTree()) || otherSharedTreeView.equals(getSelectedTree())) {
+                       return getSelection();
+               }
+               return null;
+       }
+       
+       private void updateUploadFolder() {
+               if (folderTreeView.equals(getSelectedTree()) || otherSharedTreeView.equals(getSelectedTree())) {
+                       Folder f = getSelection();
+                       if (getSelectedTree().equals(getFolderTreeView()))
+                               updateFolder(f, true, new Command() {
+                               
+                                       @Override
+                                       public void execute() {
+                                               updateStatistics();
+                                       }
+                               }, false);
+                       else
+                               updateOtherSharedFolder(f, true);
+               }
+       }
+
+       public native void hideUploadArea() /*-{
+               $wnd.$("#container").hide();
+       }-*/;
+
+       public native void showUploadArea() /*-{
+               $wnd.$("#container").show();
+       }-*/;
 }