/*
- * Copyright 2011 GRNET S.A. All rights reserved.
+ * Copyright 2011-2013 GRNET S.A. All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
package gr.grnet.pithos.web.client;
-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 java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
+import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.cell.client.ImageResourceCell;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.event.dom.client.ContextMenuHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.resources.client.ImageResource;
+import com.google.gwt.resources.client.ImageResource.ImageOptions;
+import com.google.gwt.resources.client.ImageResource.RepeatStyle;
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.Column;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
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 gr.grnet.pithos.web.client.foldertree.File;
+import gr.grnet.pithos.web.client.foldertree.Folder;
+import gr.grnet.pithos.web.client.foldertree.FolderTreeView;
+
+import java.util.*;
/**
* A composite that displays the list of files in a particular folder.
* The styles applied to the table.
*/
interface TableStyle extends CellTable.Style {
+ String cellTableFirstColumnShared();
}
interface TableResources extends CellTable.Resources {
@Override
@Source({CellTable.Style.DEFAULT_CSS, "PithosCellTable.css"})
TableStyle cellTableStyle();
+
+ @Source("share.png")
+ @ImageOptions(repeatStyle = RepeatStyle.None)
+ ImageResource cellTableSharedIcon();
}
static interface Templates extends SafeHtmlTemplates {
private final MultiSelectionModel<File> selectionModel;
+ Column<File, String> pathColumn;
+
protected final List<SortableHeader> allHeaders = new ArrayList<SortableHeader>();
SortableHeader nameHeader;
- FolderTreeView treeView;
+ SortableHeader pathHeader;
protected Pithos app;
*
* @param _images
*/
- public FileList(final Pithos _app, Images _images, FolderTreeView _treeView) {
+ public FileList(final Pithos _app, Images _images) {
app = _app;
images = _images;
- this.treeView = _treeView;
- CellTable.Resources resources = GWT.create(TableResources.class);
+ final CellTable.Resources resources = GWT.create(TableResources.class);
ProvidesKey<File> keyProvider = new ProvidesKey<File>(){
public ImageResource getValue(File entity) {
return getFileIcon(entity);
}
+
+ @Override
+ public String getCellStyleNames(Context context, File object) {
+ if (!object.getPermissions().isEmpty() && !object.isPublished())
+ return ((TableStyle) resources.cellTableStyle()).cellTableFirstColumnShared();
+ return super.getCellStyleNames(context, object);
+ }
};
celltable.addColumn(status,"");
@Override
public SafeHtml getValue(File object) {
SafeHtmlBuilder sb = new SafeHtmlBuilder();
- sb.append(Templates.INSTANCE.filenameSpan(object.getName()));
- if (object.getContentType().endsWith("png") || object.getContentType().endsWith("gif") || object.getContentType().endsWith("jpeg")) {
+ sb.append(Templates.INSTANCE.filenameSpan(object.getName()));
+ if (object.getContentType() != null && (object.getContentType().endsWith("png") || object.getContentType().endsWith("gif") || object.getContentType().endsWith("jpeg"))) {
sb.appendHtmlConstant(" ")
- .append(Templates.INSTANCE.viewLink(app.getApiPath() + object.getOwner() + object.getUri() + "?X-Auth-Token=" + app.getToken(), object.getName()));
+ .append(Templates.INSTANCE.viewLink(Pithos.getFileViewURL(object), object.getName()));
}
return sb.toSafeHtml();
}
};
- celltable.addColumn(nameColumn, nameHeader = new SortableHeader("Name"));
+ celltable.addColumn(nameColumn, nameHeader = new SortableHeader("Name", "name"));
allHeaders.add(nameHeader);
- nameHeader.setUpdater(new FileValueUpdater(nameHeader, "name"));
+ nameHeader.setUpdater(new FileValueUpdater(nameHeader));
+ nameHeader.setSorted(true);
+ nameHeader.setReverseSort(true);
celltable.redrawHeaders();
+ pathColumn = new Column<File, String>(new TextCell()) {
+
+ @Override
+ public String getValue(File f) {
+ String path;
+ if (!app.getSelectedTree().equals(app.mysharedTreeView)) {
+ path = f.getParent().getPrefix();
+ if (path.length() == 0)
+ path = "/";
+ }
+ else {
+ path = f.getPath();
+ if (path.lastIndexOf("/") != -1)
+ path = path.substring(0, path.lastIndexOf("/"));
+ else
+ path = "/";
+ }
+ return path;
+ }
+ };
+ pathHeader = new SortableHeader("Path", "path");
+ celltable.addColumn(pathColumn, pathHeader);
+ allHeaders.add(pathHeader);
+ pathHeader.setUpdater(new FileValueUpdater(pathHeader));
+
Column<File,String> aColumn = new Column<File,String>(new TextCell()) {
@Override
public String getValue(File object) {
- // TODO Auto-generated method stub
return object.getSizeAsString();
}
};
- SortableHeader aheader = new SortableHeader("Size");
+ SortableHeader aheader = new SortableHeader("Size", "size");
celltable.addColumn(aColumn, aheader);
allHeaders.add(aheader);
- aheader.setUpdater(new FileValueUpdater(aheader, "size"));
+ aheader.setUpdater(new FileValueUpdater(aheader));
aColumn = new Column<File,String>(new TextCell()) {
@Override
return object.getLastModified() != null ? formatter.format(object.getLastModified()) : "";
}
};
- aheader = new SortableHeader("Last Modified");
+ aheader = new SortableHeader("Last Modified", "date");
celltable.addColumn(aColumn, aheader);
allHeaders.add(aheader);
- aheader.setUpdater(new FileValueUpdater(aheader, "date"));
+ aheader.setUpdater(new FileValueUpdater(aheader));
provider.addDataDisplay(celltable);
vp.setCellWidth(celltable, "100%");
vp.addHandler(new ContextMenuHandler() {
@Override
- public void onContextMenu(ContextMenuEvent event) {
- 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();
+ public void onContextMenu(final ContextMenuEvent event) {
+ final TreeView tree = app.getSelectedTree();
+ if (tree != null) {
+ final int x = event.getNativeEvent().getClientX();
+ final int y = event.getNativeEvent().getClientY();
+ final Folder selectedFolder = app.getSelection();
+ app.scheduleFolderHeadCommand(selectedFolder, new Command() {
+
+ @Override
+ public void execute() {
+ final List<File> selectedFiles = getSelectedFiles();
+ Iterator<File> iter = selectedFiles.iterator();
+ iterateFilesHeadCommand(iter, new Command() {
+
+ @Override
+ public void execute() {
+ FileContextMenu contextMenu = new FileContextMenu(app, images, tree, selectedFolder, selectedFiles);
+ contextMenu.setPopupPosition(x, y);
+ contextMenu.show();
+ }
+ });
+ }
+ });
}
}
}, ContextMenuEvent.getType());
initWidget(vp);
selectionModel = new MultiSelectionModel<File>(keyProvider);
-
+ selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
+
+ @Override
+ public void onSelectionChange(SelectionChangeEvent event) {
+ app.showRelevantToolbarButtons();
+ }
+ });
+
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();
}
return new ArrayList<File>(selectionModel.getSelectedSet());
}
-// @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);
-// contextMenu.show();
-// event.preventDefault();
-// event.cancelBubble(true);
-// }
-// return;
-// }
-// if (DOM.eventGetType(event) == Event.ONCONTEXTMENU && getSelectedFiles().size() != 0) {
-// GWT.log("*****GOING TO SHOW CONTEXT MENU ****", null);
-// contextMenu = new FileContextMenu(images, false, false);
-// contextMenu = contextMenu.onEvent(event);
-// event.cancelBubble(true);
-// event.preventDefault();
-// } else if (DOM.eventGetType(event) == Event.ONCONTEXTMENU && getSelectedFiles().size() == 0) {
-// contextMenu = new FileContextMenu(images, false, true);
-// 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);
-// }
+ @Override
+ public void onBrowserEvent(Event event) {
+
+ if (DOM.eventGetType(event) == Event.ONDBLCLICK)
+ if (getSelectedFiles().size() == 1) {
+ File file = getSelectedFiles().get(0);
+ Window.open(Pithos.getFileViewURL(file), "_blank", "");
+ event.preventDefault();
+ return;
+ }
+ super.onBrowserEvent(event);
+ }
/**
* Update the display of the file list.
*/
- void update(@SuppressWarnings("unused") boolean sort) {
+ void update() {
showCellTable();
}
*/
protected ImageResource getFileIcon(File file) {
String mimetype = file.getContentType();
- boolean shared = file.isShared();
+ boolean published = file.isPublished();
if (mimetype == null)
- return shared ? images.documentShared() : images.document();
+ return published ? images.documentShared() : images.document();
mimetype = mimetype.toLowerCase();
if (mimetype.startsWith("application/pdf"))
- return shared ? images.pdfShared() : images.pdf();
+ return published ? images.pdfShared() : images.pdf();
else if (mimetype.endsWith("excel"))
- return shared ? images.spreadsheetShared() : images.spreadsheet();
+ return published ? images.spreadsheetShared() : images.spreadsheet();
else if (mimetype.endsWith("msword"))
- return shared ? images.wordprocessorShared() : images.wordprocessor();
+ return published ? images.wordprocessorShared() : images.wordprocessor();
else if (mimetype.endsWith("powerpoint"))
- return shared ? images.presentationShared() : images.presentation();
+ return published ? images.presentationShared() : images.presentation();
else if (mimetype.startsWith("application/zip") ||
mimetype.startsWith("application/gzip") ||
mimetype.startsWith("application/x-gzip") ||
mimetype.startsWith("application/x-tar") ||
mimetype.startsWith("application/x-gtar"))
- return shared ? images.zipShared() : images.zip();
+ return published ? images.zipShared() : images.zip();
else if (mimetype.startsWith("text/html"))
- return shared ? images.htmlShared() : images.html();
+ return published ? images.htmlShared() : images.html();
else if (mimetype.startsWith("text/plain"))
- return shared ? images.txtShared() : images.txt();
+ return published ? images.txtShared() : images.txt();
else if (mimetype.startsWith("image/"))
- return shared ? images.imageShared() : images.image();
+ return published ? images.imageShared() : images.image();
else if (mimetype.startsWith("video/"))
- return shared ? images.videoShared() : images.video();
+ return published ? images.videoShared() : images.video();
else if (mimetype.startsWith("audio/"))
- return shared ? images.audioShared() : images.audio();
- return shared ? images.documentShared() : images.document();
+ return published ? images.audioShared() : images.audio();
+ return published ? images.documentShared() : images.document();
}
/**
* Fill the file cache with data.
*/
public void setFiles(final List<File> _files) {
+ if (!app.getSelectedTree().equals(app.mysharedTreeView)) {
+ if (celltable.getColumnIndex(pathColumn) != -1)
+ celltable.removeColumn(pathColumn);
+ }
+ else {
+ if (celltable.getColumnIndex(pathColumn) == -1)
+ celltable.insertColumn(2, pathColumn, pathHeader);
+ }
files = new ArrayList<File>();
- for (File fres : _files)
+ for (File fres : _files) {
files.add(fres);
- Collections.sort(files, new Comparator<File>() {
-
- @Override
- public int compare(File arg0, File arg1) {
- return arg0.getName().compareTo(arg1.getName());
- }
-
- });
+ }
+
folderFileCount = files.size();
- nameHeader.setSorted(true);
- nameHeader.toggleReverseSort();
- for (SortableHeader otherHeader : allHeaders) {
- if (otherHeader != nameHeader) {
- otherHeader.setSorted(false);
- otherHeader.setReverseSort(true);
- }
- }
+ for (SortableHeader header : allHeaders) {
+ if (header.isSorted())
+ sortFiles(header.getProperty(), header.getReverseSort());
+ }
+
+ List<File> previousSelection = getSelectedFiles(); //Keep the previous selection
+ provider.getList().clear();
provider.setList(files);
selectionModel.clear();
+ for (File f : files) {
+ if (previousSelection.contains(f))
+ selectionModel.setSelected(f, true);
+ }
+
app.showFolderStatistics(folderFileCount);
celltable.setPageSize(folderFileCount);
}
if (sortingProperty.equals("version")) {
return arg0.getVersion() - arg1.getVersion();
} else if (sortingProperty.equals("owner")) {
- return arg0.getOwner().compareTo(arg1.getOwner());
+ return arg0.getOwnerID().compareTo(arg1.getOwnerID());
} else if (sortingProperty.equals("date")) {
if (arg0.getLastModified() != null && arg1.getLastModified() != null)
return arg0.getLastModified().compareTo(arg1.getLastModified());
return arg1.getVersion() - arg0.getVersion();
} else if (sortingProperty.equals("owner")) {
- return arg1.getOwner().compareTo(arg0.getOwner());
+ return arg1.getOwnerID().compareTo(arg0.getOwnerID());
} else if (sortingProperty.equals("date")) {
return arg1.getLastModified().compareTo(arg0.getLastModified());
}
final class FileValueUpdater implements ValueUpdater<String>{
- private String property;
private SortableHeader header;
/**
*
*/
- public FileValueUpdater(SortableHeader header,String property) {
- this.property=property;
+ public FileValueUpdater(SortableHeader header) {
this.header=header;
}
@Override
- public void update(@SuppressWarnings("unused") String value) {
+ public void update(String value) {
header.setSorted(true);
header.toggleReverseSort();
}
}
celltable.redrawHeaders();
- sortFiles(property, header.getReverseSort());
- FileList.this.update(true);
+ sortFiles(header.getProperty(), header.getReverseSort());
+ FileList.this.update();
}
}
//celltable.redraw();
celltable.redrawHeaders();
}
+
+ void iterateFilesHeadCommand(final Iterator<File> iter, final Command callback) {
+ if (iter.hasNext()) {
+ File f = iter.next();
+ app.scheduleFileHeadCommand(f, new Command() {
+
+ @Override
+ public void execute() {
+ iterateFilesHeadCommand(iter, callback);
+ }
+ });
+ }
+ else if (callback != null)
+ callback.execute();
+ }
+
+ public void selectByUrl(List<String> selectedUrls) {
+ Set<File> previous = selectionModel.getSelectedSet();
+ for (File f : previous)
+ selectionModel.setSelected(f, false);
+
+ int i = 0;
+ boolean scrolled = false;
+ for (File f : files) {
+ if (selectedUrls.contains(Pithos.getStorageAPIURL() + f.getOwnerID() + f.getUri())) {
+ selectionModel.setSelected(f, true);
+ if (!scrolled) {
+ celltable.getRowElement(i).getCells().getItem(0).scrollIntoView();
+ scrolled = true;
+ }
+ }
+ i++;
+ }
+ }
}