Started implementation of new folder command
[pithos] / web_client / src / gr / grnet / pithos / web / client / foldertree / FolderTreeViewModel.java
index fcf9655..53320f3 100644 (file)
@@ -1,19 +1,54 @@
 /*
- * Copyright (c) 2011 Greek Research and Technology Network
+ * Copyright 2011 GRNET S.A. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above
+ *      copyright notice, this list of conditions and the following
+ *      disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above
+ *      copyright notice, this list of conditions and the following
+ *      disclaimer in the documentation and/or other materials
+ *      provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and
+ * documentation are those of the authors and should not be
+ * interpreted as representing official policies, either expressed
+ * or implied, of GRNET S.A.
  */
 
 package gr.grnet.pithos.web.client.foldertree;
 
+import com.google.gwt.cell.client.AbstractCell;
+import com.google.gwt.cell.client.Cell;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+import com.google.gwt.event.dom.client.ContextMenuEvent;
+import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
+import com.google.gwt.user.client.ui.AbstractImagePrototype;
 import com.google.gwt.view.client.ListDataProvider;
-import com.google.gwt.view.client.SelectionChangeEvent;
-import com.google.gwt.view.client.SelectionChangeEvent.Handler;
 import com.google.gwt.view.client.SingleSelectionModel;
 import com.google.gwt.view.client.TreeViewModel;
+import gr.grnet.pithos.web.client.FolderContextMenu;
 import gr.grnet.pithos.web.client.GSS;
-import gr.grnet.pithos.web.client.foldertree.FolderTreeView.FolderCell;
+import gr.grnet.pithos.web.client.foldertree.FolderTreeView.Templates;
 import gr.grnet.pithos.web.client.rest.GetRequest;
 import gr.grnet.pithos.web.client.rest.RestException;
 import java.util.Iterator;
@@ -21,24 +56,33 @@ import java.util.Set;
 
 public class FolderTreeViewModel implements TreeViewModel {
 
-    private SingleSelectionModel<Folder> selectionModel = new SingleSelectionModel<Folder>();
+    private Cell<Folder> folderCell = new AbstractCell<Folder>(ContextMenuEvent.getType().getName()) {
 
-    private ListDataProvider<Folder> rootDataProvider = new ListDataProvider<Folder>();
+       @Override
+        public void render(Context context, Folder folder, SafeHtmlBuilder safeHtmlBuilder) {
+            String html = AbstractImagePrototype.create(FolderTreeView.images.folderYellow()).getHTML();
+            safeHtmlBuilder.appendHtmlConstant(html);
+            safeHtmlBuilder.append(Templates.INSTANCE.nameSpan(folder.getName()));
+        }
 
-    public FolderTreeViewModel() {
-        Handler selectionHandler = new SelectionChangeEvent.Handler() {
-            @Override
-            public void onSelectionChange(SelectionChangeEvent event) {
-                NodeInfo<Folder> nodeInfo = (NodeInfo<Folder>) getNodeInfo(selectionModel.getSelectedObject());
-                if(nodeInfo == null || nodeInfo.getValueUpdater() == null) {
-//                    GSS.get().showFileList(selectionModel.getSelectedObject());
-                }
-                else
-                    nodeInfo.getValueUpdater().update(selectionModel.getSelectedObject());
-                GSS.get().setCurrentSelection(selectionModel.getSelectedObject());
+        @Override
+        public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, Folder folder, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater<Folder> valueUpdater) {
+            if (event.getType().equals(ContextMenuEvent.getType().getName())) {
+                Folder target = (Folder) context.getKey();
+                FolderTreeViewModel.this.selectionModel.setSelected(target, true);
+                FolderContextMenu menu = new FolderContextMenu(FolderTreeView.images, target);
+                menu.setPopupPosition(event.getClientX(), event.getClientY());
+                menu.show();
             }
-        };
-        selectionModel.addSelectionChangeHandler(selectionHandler);
+        }
+    };
+
+    private ListDataProvider<Folder> rootDataProvider = new ListDataProvider<Folder>();
+
+    private SingleSelectionModel<Folder> selectionModel;
+
+    public FolderTreeViewModel(SingleSelectionModel<Folder> selectionModel) {
+        this.selectionModel = selectionModel;
     }
 
     @Override
@@ -46,7 +90,7 @@ public class FolderTreeViewModel implements TreeViewModel {
         if (value == null) {
             Folder f = new Folder("Loading ...");
             rootDataProvider.getList().add(f);
-            return new DefaultNodeInfo<Folder>(rootDataProvider, new FolderCell(), selectionModel, null);
+            return new DefaultNodeInfo<Folder>(rootDataProvider, folderCell, selectionModel, null);
         }
         else {
             final Folder f = (Folder) value;
@@ -73,10 +117,11 @@ public class FolderTreeViewModel implements TreeViewModel {
                                 GSS.get().displayError("System error fetching folder: " + t.getMessage());
                         }
                     };
+                    getFolder.setHeader("X-Auth-Token", app.getToken());
                     Scheduler.get().scheduleDeferred(getFolder);
                 }
             });
-            return new DefaultNodeInfo<Folder>(dataProvider, new FolderCell(), selectionModel, null);
+            return new DefaultNodeInfo<Folder>(dataProvider, folderCell, selectionModel, null);
         }
     }
 
@@ -110,11 +155,14 @@ public class FolderTreeViewModel implements TreeViewModel {
                         GSS.get().displayError("System error fetching folder: " + t.getMessage());
                 }
             };
+            getFolder.setHeader("X-Auth-Token", app.getToken());
             Scheduler.get().scheduleDeferred(getFolder);
         }
         else {
             dataProvider.getList().clear();
             dataProvider.getList().addAll(folders);
+            if (dataProvider.equals(rootDataProvider))
+                selectionModel.setSelected(dataProvider.getList().get(0), true);
         }
     }
 
@@ -122,4 +170,8 @@ public class FolderTreeViewModel implements TreeViewModel {
         Iterator<Folder> iter = account.getContainers().iterator();
         fetchFolder(iter, rootDataProvider, account.getContainers());
     }
+
+    public Folder getSelection() {
+        return selectionModel.getSelectedObject();
+    }
 }