X-Git-Url: https://code.grnet.gr/git/pithos-web-client/blobdiff_plain/a2f617f89274e5bd069ee9e7cb99d37c80b8212c..e663b3a74fb5c88b9479bfcd3db170115725b877:/src/gr/grnet/pithos/web/client/FileList.java diff --git a/src/gr/grnet/pithos/web/client/FileList.java b/src/gr/grnet/pithos/web/client/FileList.java index b725943..2a9068d 100644 --- a/src/gr/grnet/pithos/web/client/FileList.java +++ b/src/gr/grnet/pithos/web/client/FileList.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2012 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 @@ -35,16 +35,7 @@ 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; @@ -52,9 +43,10 @@ import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ContextMenuEvent; import com.google.gwt.event.dom.client.ContextMenuHandler; -import com.google.gwt.http.client.URL; 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.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; @@ -70,6 +62,11 @@ 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. @@ -82,12 +79,17 @@ public class FileList extends Composite { * 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 { @@ -215,11 +217,13 @@ public class FileList extends Composite { private final MultiSelectionModel selectionModel; + Column pathColumn; + protected final List allHeaders = new ArrayList(); SortableHeader nameHeader; - FolderTreeView treeView; + SortableHeader pathHeader; protected Pithos app; @@ -231,12 +235,11 @@ public class FileList extends Composite { * * @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 keyProvider = new ProvidesKey(){ @@ -261,6 +264,13 @@ public class FileList extends Composite { 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,""); @@ -269,33 +279,59 @@ public class FileList extends Composite { @Override public SafeHtml getValue(File object) { SafeHtmlBuilder sb = new SafeHtmlBuilder(); - sb.append(Templates.INSTANCE.filenameSpan(object.getName())); + 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(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 aColumn = new Column(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(new TextCell()) { @Override @@ -303,10 +339,10 @@ public class FileList extends Composite { 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); @@ -321,7 +357,7 @@ public class FileList extends Composite { @Override public void onContextMenu(final ContextMenuEvent event) { final TreeView tree = app.getSelectedTree(); - if (tree != null && (tree.equals(app.getFolderTreeView()) || tree.equals(app.getOtherSharedTreeView()))) { + if (tree != null) { final int x = event.getNativeEvent().getClientX(); final int y = event.getNativeEvent().getClientY(); final Folder selectedFolder = app.getSelection(); @@ -357,13 +393,8 @@ public class FileList extends Composite { }); celltable.setSelectionModel(selectionModel, PithosSelectionEventManager. 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); Pithos.preventIESelection(); } @@ -375,31 +406,10 @@ public class FileList extends Composite { @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) { File file = getSelectedFiles().get(0); - Window.open(app.getApiPath() + file.getOwner() + file.getUri() + "?X-Auth-Token=" + URL.encodeQueryString(app.getToken()), "_blank", ""); + Window.open(Pithos.getFileViewURL(file), "_blank", ""); event.preventDefault(); return; } @@ -421,66 +431,71 @@ public class FileList extends Composite { */ 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 _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(); - for (File fres : _files) + for (File fres : _files) { files.add(fres); - Collections.sort(files, new Comparator() { - - @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 previousSelection = getSelectedFiles(); //Keep the previous selection - provider.getList().clear(); + 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); } @@ -524,7 +539,7 @@ public class FileList extends Composite { 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()); @@ -544,7 +559,7 @@ public class FileList extends Composite { 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()); @@ -566,13 +581,11 @@ public class FileList extends Composite { } final class FileValueUpdater implements ValueUpdater{ - private String property; private SortableHeader header; /** * */ - public FileValueUpdater(SortableHeader header,String property) { - this.property=property; + public FileValueUpdater(SortableHeader header) { this.header=header; } @Override @@ -587,7 +600,7 @@ public class FileList extends Composite { } } celltable.redrawHeaders(); - sortFiles(property, header.getReverseSort()); + sortFiles(header.getProperty(), header.getReverseSort()); FileList.this.update(); } @@ -619,4 +632,23 @@ public class FileList extends Composite { else if (callback != null) callback.execute(); } + + public void selectByUrl(List selectedUrls) { + Set 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++; + } + } }