Double-click on a file downloads it
[pithos] / web_client / src / gr / grnet / pithos / web / client / FileList.java
index 3e7a96b..2566f24 100644 (file)
 
 package gr.grnet.pithos.web.client;
 
-import com.google.gwt.event.dom.client.ContextMenuEvent;
-import com.google.gwt.event.dom.client.ContextMenuHandler;
-import static com.google.gwt.query.client.GQuery.$;
-
-import gr.grnet.pithos.web.client.commands.UploadFileCommand;
 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.rest.resource.FileResource;
-import gwtquery.plugins.draggable.client.DraggableOptions;
-import gwtquery.plugins.draggable.client.StopDragException;
-import gwtquery.plugins.draggable.client.DraggableOptions.DragFunction;
-import gwtquery.plugins.draggable.client.DraggableOptions.RevertOption;
-import gwtquery.plugins.draggable.client.events.DragContext;
-import gwtquery.plugins.draggable.client.events.DragStartEvent;
-import gwtquery.plugins.draggable.client.events.DragStopEvent;
-import gwtquery.plugins.draggable.client.events.DragStartEvent.DragStartEventHandler;
-import gwtquery.plugins.draggable.client.events.DragStopEvent.DragStopEventHandler;
-import gwtquery.plugins.droppable.client.gwt.DragAndDropCellTable;
-import gwtquery.plugins.droppable.client.gwt.DragAndDropColumn;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -67,28 +50,24 @@ import com.google.gwt.cell.client.SafeHtmlCell;
 import com.google.gwt.cell.client.TextCell;
 import com.google.gwt.cell.client.ValueUpdater;
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.Style.Cursor;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.ContextMenuEvent;
+import com.google.gwt.event.dom.client.ContextMenuHandler;
 import com.google.gwt.i18n.client.DateTimeFormat;
-import com.google.gwt.resources.client.ClientBundle;
 import com.google.gwt.resources.client.ImageResource;
 import com.google.gwt.safehtml.client.SafeHtmlTemplates;
+import com.google.gwt.safehtml.client.SafeHtmlTemplates.Template;
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.user.cellview.client.CellTable;
-import com.google.gwt.user.cellview.client.GssSimplePager;
+import com.google.gwt.user.cellview.client.Column;
+import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.ui.AbstractImagePrototype;
-import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.view.client.ListDataProvider;
 import com.google.gwt.view.client.MultiSelectionModel;
 import com.google.gwt.view.client.ProvidesKey;
-import com.google.gwt.view.client.SelectionChangeEvent;
-import com.google.gwt.view.client.SelectionChangeEvent.Handler;
 
 /**
  * A composite that displays the list of files in a particular folder.
@@ -103,8 +82,9 @@ public class FileList extends Composite {
     interface TableStyle extends CellTable.Style {
     }
 
-       interface TableResources extends DragAndDropCellTable.Resources {
-           @Source({CellTable.Style.DEFAULT_CSS, "GssCellTable.css"})
+       interface TableResources extends CellTable.Resources {
+           @Override
+               @Source({CellTable.Style.DEFAULT_CSS, "PithosCellTable.css"})
            TableStyle cellTableStyle();
        }
        
@@ -127,22 +107,13 @@ public class FileList extends Composite {
         public SafeHtml spanWithIdAndClass(String id, String cssClass, String content);
        }
 
-    private String showingStats = "";
-
-       private int startIndex = 0;
-
-       /**
-        * A constant that denotes the completion of an IncrementalCommand.
-        */
-       public static final boolean DONE = false;
-
-       private final DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a");
+       protected final DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a");
 
        /**
         * Specifies that the images available for this composite will be the ones
         * available in FileContextMenu.
         */
-       public interface Images extends ClientBundle,FileContextMenu.Images, CellTreeView.Images {
+       public interface Images extends FolderTreeView.Images {
 
                @Source("gr/grnet/pithos/resources/blank.gif")
                ImageResource blank();
@@ -236,27 +207,19 @@ public class FileList extends Composite {
        /**
         * The widget's image bundle.
         */
-       private final Images images;
+       protected final Images images;
        
-       private DragAndDropCellTable<File> celltable;
+       protected CellTable<File> celltable;
 
        private final MultiSelectionModel<File> selectionModel;
 
-       private final List<SortableHeader> allHeaders = new ArrayList<SortableHeader>();
+       protected final List<SortableHeader> allHeaders = new ArrayList<SortableHeader>();
 
        SortableHeader nameHeader;
 
-       GssSimplePager pagerBottom;
-
-       GssSimplePager pagerTop;
-
-       Button uploadButtonBottom;
-
-       Button uploadButtonTop;
-
     FolderTreeView treeView;
 
-    private Pithos app;
+    protected Pithos app;
 
     /**
         * Construct the file list widget. This entails setting up the widget
@@ -271,7 +234,7 @@ public class FileList extends Composite {
                images = _images;
         this.treeView = _treeView;
 
-        DragAndDropCellTable.Resources resources = GWT.create(TableResources.class);
+        CellTable.Resources resources = GWT.create(TableResources.class);
 
         ProvidesKey<File> keyProvider = new ProvidesKey<File>(){
 
@@ -281,11 +244,11 @@ public class FileList extends Composite {
                        }
                };
 
-               celltable = new DragAndDropCellTable<File>(Pithos.VISIBLE_FILE_COUNT, resources, keyProvider);
+               celltable = new CellTable<File>(10, resources, keyProvider);
         celltable.setWidth("100%");
         celltable.setStyleName("pithos-List");
 
-               DragAndDropColumn<File, ImageResource> status = new DragAndDropColumn<File, ImageResource>(new ImageResourceCell() {
+               Column<File, ImageResource> status = new Column<File, ImageResource>(new ImageResourceCell() {
                    @Override
                public boolean handlesSelection() {
                    return false;
@@ -298,9 +261,8 @@ public class FileList extends Composite {
                 }
            };
            celltable.addColumn(status,"");
-           initDragOperation(status);
 
-        final DragAndDropColumn<File,SafeHtml> nameColumn = new DragAndDropColumn<File,SafeHtml>(new SafeHtmlCell()) {
+        final Column<File,SafeHtml> nameColumn = new Column<File,SafeHtml>(new SafeHtmlCell()) {
 
                        @Override
                        public SafeHtml getValue(File object) {
@@ -308,73 +270,35 @@ public class FileList extends Composite {
                 sb.append(Templates.INSTANCE.filenameSpan(object.getName()));
                                if (object.getContentType().endsWith("png") || object.getContentType().endsWith("gif") || object.getContentType().endsWith("jpeg")) {
                                sb.appendHtmlConstant("&nbsp;")
-                      .append(Templates.INSTANCE.viewLink(object.getUri(), object.getOwner() + " : " + object.getPath() + object.getName()));
+                      .append(Templates.INSTANCE.viewLink(app.getApiPath() + object.getOwner() + object.getUri() + "?X-Auth-Token=" + app.getToken(), object.getName()));
                                }
                                
                                return sb.toSafeHtml();
                        }
                        
                };
-        initDragOperation(nameColumn);
         celltable.addColumn(nameColumn, nameHeader = new SortableHeader("Name"));
                allHeaders.add(nameHeader);
                nameHeader.setUpdater(new FileValueUpdater(nameHeader, "name"));
 
                celltable.redrawHeaders();
                
-           DragAndDropColumn<File,String> aColumn = new DragAndDropColumn<File, String>(new TextCell()) {
-                       @Override
-                       public String getValue(File object) {
-                               return object.getOwner();
-                       }
-               };
-        SortableHeader aheader = new SortableHeader("Owner");
-               celltable.addColumn(aColumn, aheader);
-               initDragOperation(aColumn);
-               allHeaders.add(aheader);
-        aheader.setUpdater(new FileValueUpdater(aheader, "owner"));
-
-        aColumn = new DragAndDropColumn<File,String>(new TextCell()) {
-                       @Override
-                       public String getValue(File object) {
-                               return object.getPath();
-                       }
-               };
-        aheader = new SortableHeader("Path");
-               celltable.addColumn(aColumn, aheader);
-               initDragOperation(aColumn);
-               allHeaders.add(aheader);
-               aheader.setUpdater(new FileValueUpdater(aheader, "path"));
-
-        aColumn = new DragAndDropColumn<File,String>(new TextCell()) {
-                       @Override
-                       public String getValue(File object) {
-                       return String.valueOf(object.getVersion());
-                       }
-               };
-        aheader = new SortableHeader("Version");
-               celltable.addColumn(aColumn, aheader);
-               initDragOperation(aColumn);
-               allHeaders.add(aheader);
-               aheader.setUpdater(new FileValueUpdater(aheader, "version"));
-
-        aColumn = new DragAndDropColumn<File,String>(new TextCell()) {
+        Column<File,String> aColumn = new Column<File,String>(new TextCell()) {
                        @Override
                        public String getValue(File object) {
                                // TODO Auto-generated method stub
                                return object.getSizeAsString();
                        }
                };
-        aheader = new SortableHeader("Size");
+        SortableHeader aheader = new SortableHeader("Size");
         celltable.addColumn(aColumn, aheader);
-               initDragOperation(aColumn);
                allHeaders.add(aheader);
                aheader.setUpdater(new FileValueUpdater(aheader, "size"));
 
-        aColumn = new DragAndDropColumn<File,String>(new TextCell()) {
+        aColumn = new Column<File,String>(new TextCell()) {
                        @Override
                        public String getValue(File object) {
-                               return formatter.format(object.getLastModified());
+                               return object.getLastModified() != null ? formatter.format(object.getLastModified()) : "";
                        }
                };
         aheader = new SortableHeader("Last Modified");
@@ -384,106 +308,40 @@ public class FileList extends Composite {
               
                provider.addDataDisplay(celltable);
 
-               celltable.addDragStopHandler(new DragStopEventHandler() {
-
-               @Override
-                   public void onDragStop(DragStopEvent event) {
-                           GWT.log("DRAG STOPPED");
-                   }
-           });
-               celltable.addDragStartHandler(new DragStartEventHandler() {
-
-                   public void onDragStart(DragStartEvent event) {
-                       FileResource value = event.getDraggableData();
-                       
-                       com.google.gwt.dom.client.Element helper = event.getHelper();
-                       SafeHtmlBuilder sb = new SafeHtmlBuilder();
-                       sb.appendHtmlConstant("<b>");
-                       DisplayHelper.log(value.getName());
-                       if(getSelectedFiles().size()==1)
-                               sb.appendEscaped(value.getName());
-                       else
-                               sb.appendEscaped(getSelectedFiles().size()+" files");
-                       sb.appendHtmlConstant("</b>");
-                       helper.setInnerHTML(sb.toSafeHtml().asString());
-                   }
-               });
-
                VerticalPanel vp = new VerticalPanel();
                vp.setWidth("100%");
-
-               pagerTop = new GssSimplePager(GssSimplePager.TextLocation.CENTER);
-        pagerTop.setVisible(false);
-               pagerTop.setDisplay(celltable);
-               uploadButtonTop = new Button("<span id='topMenu.file.upload'>" + AbstractImagePrototype.create(images.fileUpdate()).getHTML() + "&nbsp;Upload</span>");
-               uploadButtonTop.addClickHandler(new ClickHandler() {
-                       
-                       @Override
-                       public void onClick(ClickEvent event) {
-                               new UploadFileCommand(app, null, treeView.getSelection()).execute();
-                       }
-               });
-               HorizontalPanel topPanel = new HorizontalPanel();
-               topPanel.add(pagerTop);
-               topPanel.add(uploadButtonTop);
-               vp.add(topPanel);
+               vp.addStyleName("pithos-FileListContainer");
 
         vp.add(celltable);
 
-               pagerBottom = new GssSimplePager(GssSimplePager.TextLocation.CENTER);
-        pagerBottom.setVisible(false);
-               pagerBottom.setDisplay(celltable);
-               uploadButtonBottom=new Button("<span id='topMenu.file.upload'>" + AbstractImagePrototype.create(images.fileUpdate()).getHTML() + "&nbsp;Upload</span>");
-               uploadButtonBottom.addClickHandler(new ClickHandler() {
-                       
-                       @Override
-                       public void onClick(ClickEvent event) {
-                               new UploadFileCommand(app, null, treeView.getSelection()).execute();
-                       }
-               });
-        HorizontalPanel bottomPanel = new HorizontalPanel();
-        bottomPanel.add(pagerBottom);
-               bottomPanel.add(uploadButtonBottom);
-
-               vp.add(bottomPanel);
                vp.setCellWidth(celltable, "100%");
         vp.addHandler(new ContextMenuHandler() {
             @Override
             public void onContextMenu(ContextMenuEvent event) {
-                Folder selectedFolder = treeView.getSelection();
-                if (!selectedFolder.isTrash()) {
-                    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, tree, selectedFolder, getSelectedFiles());
+                       int x = event.getNativeEvent().getClientX();
+                       int y = event.getNativeEvent().getClientY();
+                       contextMenu.setPopupPosition(x, y);
+                       contextMenu.show();
+               }
             }
         }, ContextMenuEvent.getType());
                initWidget(vp);
 
                selectionModel = new MultiSelectionModel<File>(keyProvider);
 
-                Handler selectionHandler = new SelectionChangeEvent.Handler() {
-             @Override 
-             public void onSelectionChange(SelectionChangeEvent event) {
-                if(getSelectedFiles().size() == 1)
-                        app.setCurrentSelection(getSelectedFiles().get(0));
-                else
-                        app.setCurrentSelection(getSelectedFiles());
-             }
-         };
-         selectionModel.addSelectionChangeHandler(selectionHandler);
-         
-               celltable.setSelectionModel(selectionModel, GSSSelectionEventManager.<File> createDefaultManager());
-               celltable.setPageSize(Pithos.VISIBLE_FILE_COUNT);
+               celltable.setSelectionModel(selectionModel, PithosSelectionEventManager.<File> createDefaultManager());
+//             celltable.setPageSize(Pithos.VISIBLE_FILE_COUNT);
                
                sinkEvents(Event.ONCONTEXTMENU);
 //             sinkEvents(Event.ONMOUSEUP);
 //             sinkEvents(Event.ONMOUSEDOWN);
 //             sinkEvents(Event.ONCLICK);
 //             sinkEvents(Event.ONKEYDOWN);
-//             sinkEvents(Event.ONDBLCLICK);
+               sinkEvents(Event.ONDBLCLICK);
                Pithos.preventIESelection();
        }
 
@@ -491,37 +349,9 @@ public class FileList extends Composite {
         return new ArrayList<File>(selectionModel.getSelectedSet());
        }
        
-       private void initDragOperation(DragAndDropColumn<?, ?> column) {
-        // retrieve draggableOptions on the column
-               DraggableOptions draggableOptions = column.getDraggableOptions();
-               // use template to construct the helper. The content of the div will be set
-               // after
-               draggableOptions.setHelper($(Templates.INSTANCE.outerHelper().asString()));
-               //draggableOptions.setZIndex(100);
-               // opacity of the helper
-               draggableOptions.setAppendTo("body");
-               //draggableOptions.setOpacity((float) 0.8);
-               draggableOptions.setContainment("document");
-               // cursor to use during the drag operation
-               draggableOptions.setCursor(Cursor.MOVE);
-               // set the revert option
-               draggableOptions.setRevert(RevertOption.ON_INVALID_DROP);
-               // prevents dragging when user click on the category drop-down list
-               draggableOptions.setCancel("select");
-           draggableOptions.setOnBeforeDragStart(new DragFunction() {
-                       @Override
-                       public void f(DragContext context) {
-                       File value = context.getDraggableData();
-                               if (!selectionModel.isSelected(value)) {
-                       throw new StopDragException();
-                   }
-                       }
-               });
-    }
-       
-//     @Override
-//     public void onBrowserEvent(Event event) {
-//
+       @Override
+       public void onBrowserEvent(Event event) {
+
 //             if (files == null || files.size() == 0) {
 //                     if (DOM.eventGetType(event) == Event.ONCONTEXTMENU && getSelectedFiles().size() == 0) {
 //                             contextMenu = new FileContextMenu(images, false, true);
@@ -542,44 +372,22 @@ public class FileList extends Composite {
 //                     contextMenu = contextMenu.onEmptyEvent(event);
 //                     event.cancelBubble(true);
 //                     event.preventDefault();
-//             } else if (DOM.eventGetType(event) == Event.ONDBLCLICK)
-//                     if (getSelectedFiles().size() == 1) {
-//                             Pithos app = app;
-//                             File file = getSelectedFiles().get(0);
-//                             Window.open(file.getUri(), "_blank", "");
-//                             event.preventDefault();
-//                             return;
-//                     }
-//             super.onBrowserEvent(event);
-//     }
+//             } else 
+               if (DOM.eventGetType(event) == Event.ONDBLCLICK)
+                       if (getSelectedFiles().size() == 1) {
+                               File file = getSelectedFiles().get(0);
+                               Window.open(app.getApiPath() + file.getOwner() + file.getUri() + "?X-Auth-Token=" + app.getToken(), "_blank", "");
+                               event.preventDefault();
+                               return;
+                       }
+               super.onBrowserEvent(event);
+       }
 
        /**
         * Update the display of the file list.
         */
-       void update(boolean sort) {
-               int count = folderFileCount;
-               int max = startIndex + Pithos.VISIBLE_FILE_COUNT;
-               if (max > count)
-                       max = count;
-               folderTotalSize = 0;
-               
-               for(File f : files){
-                       folderTotalSize += f.getBytes();
-               }
-               if (folderFileCount == 0) {
-                       showingStats = "no files";
-               } else if (folderFileCount < Pithos.VISIBLE_FILE_COUNT) {
-                       if (folderFileCount == 1)
-                               showingStats = "1 file";
-                       else
-                               showingStats = folderFileCount + " files";
-                       showingStats += " (" + FileResource.getFileSizeAsString(folderTotalSize) + ")";
-               } else {
-                       showingStats = "" + (startIndex + 1) + " - " + max + " of " + count + " files" + " (" + FileResource.getFileSizeAsString(folderTotalSize) + ")";
-               }
+       void update(@SuppressWarnings("unused") boolean sort) {
                showCellTable();
-               updateCurrentlyShowingStats();
-
        }
 
        /**
@@ -588,7 +396,7 @@ public class FileList extends Composite {
         * @param file
         * @return the icon
         */
-       private ImageResource getFileIcon(File file) {
+       protected ImageResource getFileIcon(File file) {
                String mimetype = file.getContentType();
                boolean shared = file.isShared();
                if (mimetype == null)
@@ -622,20 +430,12 @@ public class FileList extends Composite {
        }
 
        /**
-        * Update status panel with currently showing file stats.
-        */
-       public void updateCurrentlyShowingStats() {
-               app.getStatusPanel().updateCurrentlyShowing(showingStats);
-       }
-       
-       /**
         * Fill the file cache with data.
         */
        public void setFiles(final List<File> _files) {
                files = new ArrayList<File>();
        for (File fres : _files)
-               if (!fres.isInTrash())
-                               files.add(fres);
+                       files.add(fres);
                Collections.sort(files, new Comparator<File>() {
 
                        @Override
@@ -655,18 +455,10 @@ public class FileList extends Composite {
                }
            }
 
-        if(files.size() > Pithos.VISIBLE_FILE_COUNT){
-            pagerBottom.setVisible(true);
-            pagerTop.setVisible(true);
-        }
-        else{
-            pagerTop.setVisible(false);
-            pagerBottom.setVisible(false);
-        }
-        Folder selectedItem = treeView.getSelection();
-
         provider.setList(files);
         selectionModel.clear();
+        app.showFolderStatistics(folderFileCount);
+        celltable.setPageSize(folderFileCount);
        }
 
        /**
@@ -699,20 +491,20 @@ public class FileList extends Composite {
                }
        }
 
-       private void sortFiles(final String sortingProperty, final boolean sortingType){
+       protected void sortFiles(final String sortingProperty, final boolean sortingType){
                Collections.sort(files, new Comparator<File>() {
 
             @Override
             public int compare(File arg0, File arg1) {
-                    AbstractImagePrototype descPrototype = AbstractImagePrototype.create(images.desc());
-                    AbstractImagePrototype ascPrototype = AbstractImagePrototype.create(images.asc());
                     if (sortingType){
                             if (sortingProperty.equals("version")) {
                                     return arg0.getVersion() - arg1.getVersion();
                             } else if (sortingProperty.equals("owner")) {
                                     return arg0.getOwner().compareTo(arg1.getOwner());
                             } else if (sortingProperty.equals("date")) {
-                                    return arg0.getLastModified().compareTo(arg1.getLastModified());
+                                       if (arg0.getLastModified() != null && arg1.getLastModified() != null)
+                                               return arg0.getLastModified().compareTo(arg1.getLastModified());
+                                       return 0;
                             } else if (sortingProperty.equals("size")) {
                                     return (int) (arg0.getBytes() - arg1.getBytes());
                             } else if (sortingProperty.equals("name")) {
@@ -760,7 +552,7 @@ public class FileList extends Composite {
                        this.header=header;
                }
                @Override
-               public void update(String value) {
+               public void update(@SuppressWarnings("unused") String value) {
                        header.setSorted(true);
                        header.toggleReverseSort();
 
@@ -781,14 +573,6 @@ public class FileList extends Composite {
         * Shows the files in the cellTable 
      */
        private void showCellTable(){
-               if(files.size()> Pithos.VISIBLE_FILE_COUNT){
-                       pagerBottom.setVisible(true);
-                       pagerTop.setVisible(true);
-               }
-               else{
-                       pagerTop.setVisible(false);
-                       pagerBottom.setVisible(false);
-               }
                provider.setList(files);
                
                provider.refresh();
@@ -796,14 +580,4 @@ public class FileList extends Composite {
                //celltable.redraw();
                celltable.redrawHeaders();              
        }
-
-    public void showTrash() {
-        uploadButtonBottom.setVisible(false);
-        uploadButtonTop.setVisible(false);
-    }
-
-    public void showFiles() {
-        uploadButtonBottom.setVisible(true);
-        uploadButtonTop.setVisible(true);
-    }
 }