More changes for the new left pane
[pithos-web-client] / src / gr / grnet / pithos / web / client / mysharedtree / MysharedTreeViewModel.java
index 5a34d98..e5595ce 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 GRNET S.A. All rights reserved.
+ * Copyright 2011-2012 GRNET S.A. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or
  * without modification, are permitted provided that the following
@@ -37,12 +37,15 @@ package gr.grnet.pithos.web.client.mysharedtree;
 
 import gr.grnet.pithos.web.client.FolderContextMenu;
 import gr.grnet.pithos.web.client.Pithos;
+import gr.grnet.pithos.web.client.foldertree.AccountResource;
 import gr.grnet.pithos.web.client.foldertree.File;
 import gr.grnet.pithos.web.client.foldertree.Folder;
+import gr.grnet.pithos.web.client.foldertree.FolderTreeView;
 import gr.grnet.pithos.web.client.mysharedtree.MysharedTreeView.Templates;
 import gr.grnet.pithos.web.client.rest.GetRequest;
 import gr.grnet.pithos.web.client.rest.RestException;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -57,6 +60,8 @@ import com.google.gwt.cell.client.ValueUpdater;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.event.dom.client.ContextMenuEvent;
+import com.google.gwt.http.client.Response;
+import com.google.gwt.http.client.URL;
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.text.shared.SafeHtmlRenderer;
@@ -72,22 +77,30 @@ 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(Context context, Folder folder, SafeHtmlBuilder safeHtmlBuilder) {
             String html = AbstractImagePrototype.create(MysharedTreeView.images.folderYellow()).getHTML();
-            safeHtmlBuilder.appendHtmlConstant(html);
+            safeHtmlBuilder.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
             safeHtmlBuilder.append(Templates.INSTANCE.nameSpan(folder.getName()));
         }
 
         @Override
-        public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater<Folder> valueUpdater) {
+        public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, final Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater<Folder> valueUpdater) {
             if (event.getType().equals(ContextMenuEvent.getType().getName())) {
+               final int x = event.getClientX();
+               final int y = event.getClientY();
                 MysharedTreeViewModel.this.selectionModel.setSelected(folder, true);
-                FolderContextMenu menu = new FolderContextMenu(app, MysharedTreeView.images, folder);
-                menu.setPopupPosition(event.getClientX(), event.getClientY());
-                menu.show();
+                app.scheduleFolderHeadCommand(folder, new Command() {
+                                       
+                                       @Override
+                                       public void execute() {
+                               FolderContextMenu menu = new FolderContextMenu(app, MysharedTreeView.images, app.getSelectedTree(), folder);
+                               menu.setPopupPosition(x, y);
+                               menu.show();
+                                       }
+                               });
             }
         }
     };
@@ -96,9 +109,7 @@ public class MysharedTreeViewModel implements TreeViewModel {
 
     private Map<Folder, ListDataProvider<Folder>> dataProviderMap = new HashMap<Folder, ListDataProvider<Folder>>();
     
-    protected Set<File> sharedFiles = new HashSet<File>();
-
-    private SingleSelectionModel<Folder> selectionModel;
+    protected SingleSelectionModel<Folder> selectionModel;
 
     public MysharedTreeViewModel(Pithos _app, SingleSelectionModel<Folder> selectionModel) {
         app = _app;
@@ -108,126 +119,103 @@ public class MysharedTreeViewModel implements TreeViewModel {
     @Override
     public <T> NodeInfo<?> getNodeInfo(T value) {
         if (value == null) {
-            ListDataProvider<String> rootDataProvider = new ListDataProvider<String>();
-            rootDataProvider.getList().add("My Shared");
-            final SingleSelectionModel<String> selectionModel2 = new SingleSelectionModel<String>();
-            selectionModel2.addSelectionChangeHandler(new Handler() {
-
-                @Override
-                public void onSelectionChange(SelectionChangeEvent event) {
-                    if (selectionModel2.getSelectedObject() != null) {
-                       app.deselectOthers(selectionModel2);
-                       fetchSharedFiles();
-                       app.showFiles(sharedFiles);
-                    }
-                }
-            });
-            app.addSelectionModel(selectionModel2);
-            return new DefaultNodeInfo<String>(rootDataProvider, new TextCell(new SafeHtmlRenderer<String>() {
-                @Override
-                public SafeHtml render(String object) {
-                    SafeHtmlBuilder builder = new SafeHtmlBuilder();
-                    render(object, builder);
-                    return builder.toSafeHtml();
-                }
-
-                @Override
-                public void render(String object, SafeHtmlBuilder builder) {
-                    String html = AbstractImagePrototype.create(MysharedTreeView.images.myShared()).getHTML();
-                    builder.appendHtmlConstant(html);
-                    builder.append(MysharedTreeView.Templates.INSTANCE.nameSpan(object));
-                }
-            }),  selectionModel2, null);
-        }
-        else if (value instanceof String) {
-               fetchSharedContainers();
+               fetchSharedContainers(null);
             return new DefaultNodeInfo<Folder>(firstLevelDataProvider, folderCell, selectionModel, null);
         }
-        else {
-            final Folder f = (Folder) value;
-            if (dataProviderMap.get(f) == null) {
-                dataProviderMap.put(f, new ListDataProvider<Folder>());
-            }
-            final ListDataProvider<Folder> dataProvider = dataProviderMap.get(f);
-            fetchFolder(f, dataProvider, false);
-            return new DefaultNodeInfo<Folder>(dataProvider, folderCell, selectionModel, null);
+        final Folder f = (Folder) value;
+        if (dataProviderMap.get(f) == null) {
+            dataProviderMap.put(f, new ListDataProvider<Folder>());
         }
+        final ListDataProvider<Folder> dataProvider = dataProviderMap.get(f);
+        fetchFolder(f, dataProvider, false);
+        return new DefaultNodeInfo<Folder>(dataProvider, folderCell, selectionModel, null);
     }
 
-       protected void fetchSharedFiles() {
-       final List<Folder> containers = app.getAccount().getContainers();
-       final ListDataProvider<Folder> tempProvider = new ListDataProvider<Folder>();
-       Iterator<Folder> iter = containers.iterator();
-       fetchFolder(iter, tempProvider, new Command() {
-                       
-                       @Override
-                       public void execute() {
-                               firstLevelDataProvider.getList().clear();
-                               firstLevelDataProvider.getList().addAll(tempProvider.getList());
-                               app.showFiles(sharedFiles);
-                       }
-               });
-       }
+       private void fetchSharedContainers(final Command callback) {
+        String path = "?format=json&shared=";
+        GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(AccountResource.class, app.getApiPath(), app.getUsername(), path) {
+            @Override
+            public void onSuccess(final AccountResource _result) {
+               Iterator<Folder> iter = _result.getContainers().listIterator();
+               fetchFolder(iter, new Command() {
+                                       
+                                       @Override
+                                       public void execute() {
+                                               firstLevelDataProvider.getList().clear();
+                               Folder t = null;
+                               for (Folder c : _result.getContainers()) {
+                                       if (c.isHome())
+                                               firstLevelDataProvider.getList().add(0, c); //Pithos is always first
+                                       else if (!c.isTrash())
+                                               firstLevelDataProvider.getList().add(c);
+                               }
+                                               if (callback != null)
+                                                       callback.execute();
+                                       }
+                               });
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                GWT.log("Error getting account", t);
+                               app.setError(t);
+                if (t instanceof RestException)
+                    app.displayError("Error getting account: " + ((RestException) t).getHttpStatusText());
+                else
+                    app.displayError("System error fetching user data: " + t.getMessage());
+            }
 
-       private void fetchSharedContainers() {
-       final List<Folder> containers = app.getAccount().getContainers();
-       final ListDataProvider<Folder> tempProvider = new ListDataProvider<Folder>();
-       Iterator<Folder> iter = containers.iterator();
-       fetchFolder(iter, tempProvider, new Command() {
-                       
                        @Override
-                       public void execute() {
-                               firstLevelDataProvider.getList().clear();
-                               firstLevelDataProvider.getList().addAll(tempProvider.getList());
+                       protected void onUnauthorized(Response response) {
+                               app.sessionExpired();
                        }
-               });
+        };
+        getAccount.setHeader("X-Auth-Token", app.getToken());
+        Scheduler.get().scheduleDeferred(getAccount);
        }
 
        @Override
     public boolean isLeaf(Object o) {
-        if (o instanceof Folder) {
+               if (o == null)
+                       return false;
+               else if (o instanceof Folder) {
             Folder f = (Folder) o;
             return f.getSubfolders().isEmpty();
         }
-        return false;
+               else {
+                       return firstLevelDataProvider.getList().isEmpty();
+               }
     }
+       
+       private native void log(String msg) /*-{
+               $wnd.console.log(msg);
+       }-*/;
 
-    protected void fetchFolder(final Iterator<Folder> iter, final ListDataProvider<Folder> dataProvider, final Command callback) {
+    protected void fetchFolder(final Iterator<Folder> iter, final Command callback) {
         if (iter.hasNext()) {
             final Folder f = iter.next();
 
-            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
-            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), app.getUsername(), path, f) {
+            String path = "/" + f.getContainer() + "?format=json&shared=&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
+            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwner(), path, f) {
                 @Override
-                public void onSuccess(Folder result) {
-                       if (!result.isShared()) {
-                               for (File file : result.getFiles()) {
-                                       if (file.isShared())
-                                               sharedFiles.add(file);
-                               }
-                               Iterator<Folder> iter2 = result.getSubfolders().iterator();
-                               fetchFolder(iter2, dataProvider, new Command() {
-                                                       
-                                                       @Override
-                                                       public void execute() {
-                                           fetchFolder(iter, dataProvider, callback);
-                                                       }
-                                               });
-                       }
-                       else {
-                               dataProvider.getList().add(result);
-                           fetchFolder(iter, dataProvider, callback);
-                       }
+                public void onSuccess(Folder _result) {
+                    fetchFolder(iter, callback);
                 }
 
                 @Override
                 public void onError(Throwable t) {
                     GWT.log("Error getting folder", t);
+                                       app.setError(t);
                     if (t instanceof RestException)
                         app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
                     else
                         app.displayError("System error fetching folder: " + t.getMessage());
                 }
+
+                               @Override
+                               protected void onUnauthorized(Response response) {
+                                       app.sessionExpired();
+                               }
             };
             getFolder.setHeader("X-Auth-Token", app.getToken());
             Scheduler.get().scheduleDeferred(getFolder);
@@ -249,18 +237,18 @@ public class MysharedTreeViewModel implements TreeViewModel {
     }
 
     public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles) {
-        String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
-        GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), app.getUsername(), path, f) {
+        String path = "/" + f.getContainer() + "?format=json&shared=&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
+        GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwner(), path, f) {
             @Override
-            public void onSuccess(final Folder result) {
+            public void onSuccess(final Folder _result) {
                 if (showfiles)
-                    app.showFiles(result);
-                Iterator<Folder> iter = result.getSubfolders().iterator();
-                fetchFolder(iter, dataProvider, new Command() {
+                    app.showFiles(_result);
+                Iterator<Folder> iter = new ArrayList<Folder>(_result.getSubfolders()).listIterator();
+                fetchFolder(iter, new Command() {
                     @Override
                     public void execute() {
                         dataProvider.getList().clear();
-                               dataProvider.getList().addAll(result.getSubfolders());
+                               dataProvider.getList().addAll(_result.getSubfolders());
                         app.getMySharedTreeView().updateChildren(f);
                     }
                 });
@@ -269,13 +257,23 @@ public class MysharedTreeViewModel implements TreeViewModel {
             @Override
             public void onError(Throwable t) {
                 GWT.log("Error getting folder", t);
+                               app.setError(t);
                 if (t instanceof RestException)
                     app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
                 else
                     app.displayError("System error fetching folder: " + t.getMessage());
             }
+
+                       @Override
+                       protected void onUnauthorized(Response response) {
+                               app.sessionExpired();
+                       }
         };
         getFolder.setHeader("X-Auth-Token", app.getToken());
         Scheduler.get().scheduleDeferred(getFolder);
     }
+
+       public void initialize(Command callback) {
+               fetchSharedContainers(callback);
+       }
 }