Statistics
| Branch: | Tag: | Revision:

root / src / gr / grnet / pithos / web / client / FileList.java @ 4f5f3706

History | View | Annotate | Download (21.7 kB)

1 a57faaf0 Christos Stathis
/*
2 cae2a8db Christos Stathis
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
3 63366925 Christos Stathis
 *
4 63366925 Christos Stathis
 * Redistribution and use in source and binary forms, with or
5 63366925 Christos Stathis
 * without modification, are permitted provided that the following
6 63366925 Christos Stathis
 * conditions are met:
7 63366925 Christos Stathis
 *
8 63366925 Christos Stathis
 *   1. Redistributions of source code must retain the above
9 63366925 Christos Stathis
 *      copyright notice, this list of conditions and the following
10 63366925 Christos Stathis
 *      disclaimer.
11 63366925 Christos Stathis
 *
12 63366925 Christos Stathis
 *   2. Redistributions in binary form must reproduce the above
13 63366925 Christos Stathis
 *      copyright notice, this list of conditions and the following
14 63366925 Christos Stathis
 *      disclaimer in the documentation and/or other materials
15 63366925 Christos Stathis
 *      provided with the distribution.
16 63366925 Christos Stathis
 *
17 63366925 Christos Stathis
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 63366925 Christos Stathis
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 63366925 Christos Stathis
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 63366925 Christos Stathis
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 63366925 Christos Stathis
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 63366925 Christos Stathis
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 63366925 Christos Stathis
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 63366925 Christos Stathis
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 63366925 Christos Stathis
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 63366925 Christos Stathis
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 63366925 Christos Stathis
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 63366925 Christos Stathis
 * POSSIBILITY OF SUCH DAMAGE.
29 63366925 Christos Stathis
 *
30 63366925 Christos Stathis
 * The views and conclusions contained in the software and
31 63366925 Christos Stathis
 * documentation are those of the authors and should not be
32 63366925 Christos Stathis
 * interpreted as representing official policies, either expressed
33 63366925 Christos Stathis
 * or implied, of GRNET S.A.
34 a57faaf0 Christos Stathis
 */
35 a853017c Christos Stathis
36 a57faaf0 Christos Stathis
package gr.grnet.pithos.web.client;
37 a57faaf0 Christos Stathis
38 875a0179 Christos Stathis
import gr.grnet.pithos.web.client.foldertree.File;
39 875a0179 Christos Stathis
import gr.grnet.pithos.web.client.foldertree.Folder;
40 875a0179 Christos Stathis
import gr.grnet.pithos.web.client.foldertree.FolderTreeView;
41 a57faaf0 Christos Stathis
42 a57faaf0 Christos Stathis
import java.util.ArrayList;
43 a57faaf0 Christos Stathis
import java.util.Collections;
44 a57faaf0 Christos Stathis
import java.util.Comparator;
45 a57faaf0 Christos Stathis
import java.util.Iterator;
46 a57faaf0 Christos Stathis
import java.util.List;
47 3646552f Christos Stathis
import java.util.Set;
48 a57faaf0 Christos Stathis
49 31d3a729 Christos Stathis
import com.google.gwt.cell.client.Cell.Context;
50 a57faaf0 Christos Stathis
import com.google.gwt.cell.client.ImageResourceCell;
51 a57faaf0 Christos Stathis
import com.google.gwt.cell.client.SafeHtmlCell;
52 a57faaf0 Christos Stathis
import com.google.gwt.cell.client.TextCell;
53 a57faaf0 Christos Stathis
import com.google.gwt.cell.client.ValueUpdater;
54 a57faaf0 Christos Stathis
import com.google.gwt.core.client.GWT;
55 7811b9d1 Christos Stathis
import com.google.gwt.event.dom.client.ContextMenuEvent;
56 7811b9d1 Christos Stathis
import com.google.gwt.event.dom.client.ContextMenuHandler;
57 d02b08f2 Christos Stathis
import com.google.gwt.http.client.URL;
58 a57faaf0 Christos Stathis
import com.google.gwt.i18n.client.DateTimeFormat;
59 a57faaf0 Christos Stathis
import com.google.gwt.resources.client.ImageResource;
60 3264607e Christos Stathis
import com.google.gwt.resources.client.ClientBundle.Source;
61 3264607e Christos Stathis
import com.google.gwt.resources.client.ImageResource.ImageOptions;
62 3264607e Christos Stathis
import com.google.gwt.resources.client.ImageResource.RepeatStyle;
63 a57faaf0 Christos Stathis
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
64 a57faaf0 Christos Stathis
import com.google.gwt.safehtml.shared.SafeHtml;
65 a57faaf0 Christos Stathis
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
66 a57faaf0 Christos Stathis
import com.google.gwt.user.cellview.client.CellTable;
67 7811b9d1 Christos Stathis
import com.google.gwt.user.cellview.client.Column;
68 a2f617f8 Christos Stathis
import com.google.gwt.user.client.Command;
69 efb132b8 Christos Stathis
import com.google.gwt.user.client.DOM;
70 a57faaf0 Christos Stathis
import com.google.gwt.user.client.Event;
71 36c4da54 Christos Stathis
import com.google.gwt.user.client.Window;
72 a57faaf0 Christos Stathis
import com.google.gwt.user.client.ui.Composite;
73 a57faaf0 Christos Stathis
import com.google.gwt.user.client.ui.VerticalPanel;
74 a57faaf0 Christos Stathis
import com.google.gwt.view.client.ListDataProvider;
75 a57faaf0 Christos Stathis
import com.google.gwt.view.client.MultiSelectionModel;
76 a57faaf0 Christos Stathis
import com.google.gwt.view.client.ProvidesKey;
77 365865ed Christos Stathis
import com.google.gwt.view.client.SelectionChangeEvent;
78 a57faaf0 Christos Stathis
79 a57faaf0 Christos Stathis
/**
80 a57faaf0 Christos Stathis
 * A composite that displays the list of files in a particular folder.
81 a57faaf0 Christos Stathis
 */
82 a57faaf0 Christos Stathis
public class FileList extends Composite {
83 875a0179 Christos Stathis
84 875a0179 Christos Stathis
        ListDataProvider<File> provider = new ListDataProvider<File>();
85 875a0179 Christos Stathis
86 875a0179 Christos Stathis
    /**
87 875a0179 Christos Stathis
       * The styles applied to the table.
88 875a0179 Christos Stathis
       */
89 875a0179 Christos Stathis
    interface TableStyle extends CellTable.Style {
90 31d3a729 Christos Stathis
            String cellTableFirstColumnShared();
91 875a0179 Christos Stathis
    }
92 875a0179 Christos Stathis
93 f6445935 Christos Stathis
        interface TableResources extends CellTable.Resources {
94 7811b9d1 Christos Stathis
            @Override
95 969a4d94 Christos Stathis
                @Source({CellTable.Style.DEFAULT_CSS, "PithosCellTable.css"})
96 a57faaf0 Christos Stathis
            TableStyle cellTableStyle();
97 3264607e Christos Stathis
            
98 3264607e Christos Stathis
            @Source("share.png")
99 3264607e Christos Stathis
            @ImageOptions(repeatStyle = RepeatStyle.None)
100 3264607e Christos Stathis
            ImageResource cellTableSharedIcon();
101 875a0179 Christos Stathis
        }
102 a57faaf0 Christos Stathis
        
103 a57faaf0 Christos Stathis
        static interface Templates extends SafeHtmlTemplates {
104 a57faaf0 Christos Stathis
            Templates INSTANCE = GWT.create(Templates.class);
105 a57faaf0 Christos Stathis
106 a57faaf0 Christos Stathis
            @Template("<div id='dragHelper' style='border:1px solid black; background-color:#ffffff; color:black; width:150px;z-index:100'></div>")
107 a57faaf0 Christos Stathis
            SafeHtml outerHelper();
108 a57faaf0 Christos Stathis
109 a57faaf0 Christos Stathis
        @Template("<span id='{0}'>{0}</span>")
110 a57faaf0 Christos Stathis
        public SafeHtml filenameSpan(String filename);
111 a57faaf0 Christos Stathis
112 a57faaf0 Christos Stathis
        @Template("<a href='{0}' title='{1}' rel='lytebox[mnf]' onclick='myLytebox.start(this, false, false); return false;'>(view)</a>")
113 a57faaf0 Christos Stathis
        public SafeHtml viewLink(String link, String title);
114 a57faaf0 Christos Stathis
115 a57faaf0 Christos Stathis
        @Template("<table><tr><td rowspan='3'>{0}</td><td style='font-size:95%;' id='{1}'>{1}</td></tr><tr><td>{2}</td></tr></table>")
116 a57faaf0 Christos Stathis
        public SafeHtml rendelContactCell(String imageHtml, String name, String fileSize);
117 a57faaf0 Christos Stathis
118 a57faaf0 Christos Stathis
        @Template("<span id='{0}' class='{1}'>{2}</span>")
119 a57faaf0 Christos Stathis
        public SafeHtml spanWithIdAndClass(String id, String cssClass, String content);
120 875a0179 Christos Stathis
        }
121 a57faaf0 Christos Stathis
122 7811b9d1 Christos Stathis
        protected final DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a");
123 a57faaf0 Christos Stathis
124 a57faaf0 Christos Stathis
        /**
125 a57faaf0 Christos Stathis
         * Specifies that the images available for this composite will be the ones
126 a57faaf0 Christos Stathis
         * available in FileContextMenu.
127 a57faaf0 Christos Stathis
         */
128 7811b9d1 Christos Stathis
        public interface Images extends FolderTreeView.Images {
129 a57faaf0 Christos Stathis
130 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/blank.gif")
131 a57faaf0 Christos Stathis
                ImageResource blank();
132 a57faaf0 Christos Stathis
133 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/asc.png")
134 a57faaf0 Christos Stathis
                ImageResource asc();
135 a57faaf0 Christos Stathis
136 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/desc.png")
137 a57faaf0 Christos Stathis
                ImageResource desc();
138 a57faaf0 Christos Stathis
139 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/document_shared.png")
140 a57faaf0 Christos Stathis
                ImageResource documentShared();
141 a57faaf0 Christos Stathis
142 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/kcmfontinst.png")
143 a57faaf0 Christos Stathis
                ImageResource wordprocessor();
144 a57faaf0 Christos Stathis
145 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/log.png")
146 a57faaf0 Christos Stathis
                ImageResource spreadsheet();
147 a57faaf0 Christos Stathis
148 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/kpresenter_kpr.png")
149 a57faaf0 Christos Stathis
                ImageResource presentation();
150 a57faaf0 Christos Stathis
151 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/acroread.png")
152 a57faaf0 Christos Stathis
                ImageResource pdf();
153 a57faaf0 Christos Stathis
154 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/image.png")
155 a57faaf0 Christos Stathis
                ImageResource image();
156 a57faaf0 Christos Stathis
157 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/video2.png")
158 a57faaf0 Christos Stathis
                ImageResource video();
159 a57faaf0 Christos Stathis
160 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/knotify.png")
161 a57faaf0 Christos Stathis
                ImageResource audio();
162 a57faaf0 Christos Stathis
163 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/html.png")
164 a57faaf0 Christos Stathis
                ImageResource html();
165 a57faaf0 Christos Stathis
166 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/txt.png")
167 a57faaf0 Christos Stathis
                ImageResource txt();
168 a57faaf0 Christos Stathis
169 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/ark2.png")
170 a57faaf0 Christos Stathis
                ImageResource zip();
171 a57faaf0 Christos Stathis
172 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/kcmfontinst_shared.png")
173 a57faaf0 Christos Stathis
                ImageResource wordprocessorShared();
174 a57faaf0 Christos Stathis
175 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/log_shared.png")
176 a57faaf0 Christos Stathis
                ImageResource spreadsheetShared();
177 a57faaf0 Christos Stathis
178 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/kpresenter_kpr_shared.png")
179 a57faaf0 Christos Stathis
                ImageResource presentationShared();
180 a57faaf0 Christos Stathis
181 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/acroread_shared.png")
182 a57faaf0 Christos Stathis
                ImageResource pdfShared();
183 a57faaf0 Christos Stathis
184 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/image_shared.png")
185 a57faaf0 Christos Stathis
                ImageResource imageShared();
186 a57faaf0 Christos Stathis
187 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/video2_shared.png")
188 a57faaf0 Christos Stathis
                ImageResource videoShared();
189 a57faaf0 Christos Stathis
190 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/knotify_shared.png")
191 a57faaf0 Christos Stathis
                ImageResource audioShared();
192 a57faaf0 Christos Stathis
193 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/html_shared.png")
194 a57faaf0 Christos Stathis
                ImageResource htmlShared();
195 a57faaf0 Christos Stathis
196 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/txt_shared.png")
197 a57faaf0 Christos Stathis
                ImageResource txtShared();
198 a57faaf0 Christos Stathis
199 a57faaf0 Christos Stathis
                @Source("gr/grnet/pithos/resources/mimetypes/ark2_shared.png")
200 a57faaf0 Christos Stathis
                ImageResource zipShared();
201 a57faaf0 Christos Stathis
202 a57faaf0 Christos Stathis
        }
203 a57faaf0 Christos Stathis
        
204 a57faaf0 Christos Stathis
        /**
205 a57faaf0 Christos Stathis
         * The number of files in this folder.
206 a57faaf0 Christos Stathis
         */
207 a57faaf0 Christos Stathis
        int folderFileCount;
208 a57faaf0 Christos Stathis
209 a57faaf0 Christos Stathis
        /**
210 a57faaf0 Christos Stathis
         * Total folder size
211 a57faaf0 Christos Stathis
         */
212 a57faaf0 Christos Stathis
        long folderTotalSize;
213 a57faaf0 Christos Stathis
214 a57faaf0 Christos Stathis
        /**
215 a57faaf0 Christos Stathis
         * A cache of the files in the list.
216 a57faaf0 Christos Stathis
         */
217 875a0179 Christos Stathis
        private List<File> files;
218 a57faaf0 Christos Stathis
219 a57faaf0 Christos Stathis
        /**
220 a57faaf0 Christos Stathis
         * The widget's image bundle.
221 a57faaf0 Christos Stathis
         */
222 7811b9d1 Christos Stathis
        protected final Images images;
223 a57faaf0 Christos Stathis
        
224 7811b9d1 Christos Stathis
        protected CellTable<File> celltable;
225 875a0179 Christos Stathis
226 875a0179 Christos Stathis
        private final MultiSelectionModel<File> selectionModel;
227 875a0179 Christos Stathis
228 e2920e8d Christos Stathis
        Column<File, String> pathColumn;
229 e2920e8d Christos Stathis
230 7811b9d1 Christos Stathis
        protected final List<SortableHeader> allHeaders = new ArrayList<SortableHeader>();
231 875a0179 Christos Stathis
232 a57faaf0 Christos Stathis
        SortableHeader nameHeader;
233 875a0179 Christos Stathis
234 e2920e8d Christos Stathis
        SortableHeader pathHeader;
235 875a0179 Christos Stathis
236 7811b9d1 Christos Stathis
    protected Pithos app;
237 a7c43f26 Christos Stathis
238 875a0179 Christos Stathis
    /**
239 a57faaf0 Christos Stathis
         * Construct the file list widget. This entails setting up the widget
240 a57faaf0 Christos Stathis
         * layout, fetching the number of files in the current folder from the
241 a57faaf0 Christos Stathis
         * server and filling the local file cache of displayed files with data from
242 a57faaf0 Christos Stathis
         * the server, as well.
243 a57faaf0 Christos Stathis
         *
244 a57faaf0 Christos Stathis
         * @param _images
245 a57faaf0 Christos Stathis
         */
246 e2920e8d Christos Stathis
        public FileList(final Pithos _app, Images _images) {
247 a7c43f26 Christos Stathis
        app = _app;
248 a57faaf0 Christos Stathis
                images = _images;
249 875a0179 Christos Stathis
250 31d3a729 Christos Stathis
        final CellTable.Resources resources = GWT.create(TableResources.class);
251 875a0179 Christos Stathis
252 875a0179 Christos Stathis
        ProvidesKey<File> keyProvider = new ProvidesKey<File>(){
253 a57faaf0 Christos Stathis
254 a57faaf0 Christos Stathis
                        @Override
255 875a0179 Christos Stathis
                        public Object getKey(File item) {
256 a57faaf0 Christos Stathis
                                return item.getUri();
257 a57faaf0 Christos Stathis
                        }
258 a57faaf0 Christos Stathis
                };
259 875a0179 Christos Stathis
260 105b4e49 Christos Stathis
                celltable = new CellTable<File>(10, resources, keyProvider);
261 875a0179 Christos Stathis
        celltable.setWidth("100%");
262 875a0179 Christos Stathis
        celltable.setStyleName("pithos-List");
263 875a0179 Christos Stathis
264 f6445935 Christos Stathis
                Column<File, ImageResource> status = new Column<File, ImageResource>(new ImageResourceCell() {
265 875a0179 Christos Stathis
                    @Override
266 875a0179 Christos Stathis
                public boolean handlesSelection() {
267 875a0179 Christos Stathis
                    return false;
268 875a0179 Christos Stathis
                }
269 875a0179 Christos Stathis
                })
270 875a0179 Christos Stathis
        {
271 875a0179 Christos Stathis
                 @Override
272 875a0179 Christos Stathis
                 public ImageResource getValue(File entity) {
273 875a0179 Christos Stathis
                     return getFileIcon(entity);
274 875a0179 Christos Stathis
                 }
275 31d3a729 Christos Stathis
276 31d3a729 Christos Stathis
                        @Override
277 31d3a729 Christos Stathis
                        public String getCellStyleNames(Context context, File object) {
278 31d3a729 Christos Stathis
                                if (!object.getPermissions().isEmpty() && !object.isPublished())
279 31d3a729 Christos Stathis
                                        return ((TableStyle) resources.cellTableStyle()).cellTableFirstColumnShared();
280 31d3a729 Christos Stathis
                                return super.getCellStyleNames(context, object);
281 31d3a729 Christos Stathis
                        }
282 875a0179 Christos Stathis
            };
283 a57faaf0 Christos Stathis
            celltable.addColumn(status,"");
284 875a0179 Christos Stathis
285 f6445935 Christos Stathis
        final Column<File,SafeHtml> nameColumn = new Column<File,SafeHtml>(new SafeHtmlCell()) {
286 a57faaf0 Christos Stathis
287 a57faaf0 Christos Stathis
                        @Override
288 875a0179 Christos Stathis
                        public SafeHtml getValue(File object) {
289 a57faaf0 Christos Stathis
                                SafeHtmlBuilder sb = new SafeHtmlBuilder();
290 3586ad5e Christos Stathis
                                sb.append(Templates.INSTANCE.filenameSpan(object.getName()));
291 5d18aa82 Christos Stathis
                                if (object.getContentType() != null && (object.getContentType().endsWith("png") || object.getContentType().endsWith("gif") || object.getContentType().endsWith("jpeg"))) {
292 5d18aa82 Christos Stathis
                                sb.appendHtmlConstant("&nbsp;")
293 5d18aa82 Christos Stathis
                      .append(Templates.INSTANCE.viewLink(app.getApiPath() + object.getOwner() + object.getUri(), object.getName()));
294 5d18aa82 Christos Stathis
                                }
295 a57faaf0 Christos Stathis
                                
296 a57faaf0 Christos Stathis
                                return sb.toSafeHtml();
297 a57faaf0 Christos Stathis
                        }
298 a57faaf0 Christos Stathis
                        
299 a57faaf0 Christos Stathis
                };
300 7cca8bf1 Christos Stathis
        celltable.addColumn(nameColumn, nameHeader = new SortableHeader("Name", "name"));
301 a57faaf0 Christos Stathis
                allHeaders.add(nameHeader);
302 7cca8bf1 Christos Stathis
                nameHeader.setUpdater(new FileValueUpdater(nameHeader));
303 7cca8bf1 Christos Stathis
                nameHeader.setSorted(true);
304 7cca8bf1 Christos Stathis
                nameHeader.setReverseSort(true);
305 875a0179 Christos Stathis
306 a57faaf0 Christos Stathis
                celltable.redrawHeaders();
307 a57faaf0 Christos Stathis
                
308 e2920e8d Christos Stathis
                pathColumn = new Column<File, String>(new TextCell()) {
309 e2920e8d Christos Stathis
310 e2920e8d Christos Stathis
                        @Override
311 e2920e8d Christos Stathis
                        public String getValue(File f) {
312 e2920e8d Christos Stathis
                                String path;
313 e2920e8d Christos Stathis
                                if (!app.getSelectedTree().equals(app.mysharedTreeView)) {
314 e2920e8d Christos Stathis
                                        path = f.getParent().getPrefix();
315 e2920e8d Christos Stathis
                                        if (path.length() == 0)
316 e2920e8d Christos Stathis
                                                path = "/";
317 e2920e8d Christos Stathis
                                }
318 e2920e8d Christos Stathis
                                else {
319 e2920e8d Christos Stathis
                                        path = f.getPath();
320 e2920e8d Christos Stathis
                                        if (path.lastIndexOf("/") != -1)
321 e2920e8d Christos Stathis
                                                path = path.substring(0, path.lastIndexOf("/"));
322 e2920e8d Christos Stathis
                                        else
323 e2920e8d Christos Stathis
                                                path = "/";
324 e2920e8d Christos Stathis
                                }
325 e2920e8d Christos Stathis
                                return path;
326 e2920e8d Christos Stathis
                        }
327 e2920e8d Christos Stathis
                };
328 e2920e8d Christos Stathis
                pathHeader = new SortableHeader("Path", "path");
329 e2920e8d Christos Stathis
                celltable.addColumn(pathColumn, pathHeader);
330 e2920e8d Christos Stathis
                allHeaders.add(pathHeader);
331 e2920e8d Christos Stathis
                pathHeader.setUpdater(new FileValueUpdater(pathHeader));
332 e2920e8d Christos Stathis
                
333 bbdd34ef Christos Stathis
        Column<File,String> aColumn = new Column<File,String>(new TextCell()) {
334 a57faaf0 Christos Stathis
                        @Override
335 875a0179 Christos Stathis
                        public String getValue(File object) {
336 875a0179 Christos Stathis
                                return object.getSizeAsString();
337 875a0179 Christos Stathis
                        }
338 875a0179 Christos Stathis
                };
339 7cca8bf1 Christos Stathis
        SortableHeader aheader = new SortableHeader("Size", "size");
340 875a0179 Christos Stathis
        celltable.addColumn(aColumn, aheader);
341 a57faaf0 Christos Stathis
                allHeaders.add(aheader);
342 7cca8bf1 Christos Stathis
                aheader.setUpdater(new FileValueUpdater(aheader));
343 875a0179 Christos Stathis
344 f6445935 Christos Stathis
        aColumn = new Column<File,String>(new TextCell()) {
345 a57faaf0 Christos Stathis
                        @Override
346 875a0179 Christos Stathis
                        public String getValue(File object) {
347 f3c8bd5b Christos Stathis
                                return object.getLastModified() != null ? formatter.format(object.getLastModified()) : "";
348 875a0179 Christos Stathis
                        }
349 875a0179 Christos Stathis
                };
350 7cca8bf1 Christos Stathis
        aheader = new SortableHeader("Last Modified", "date");
351 875a0179 Christos Stathis
                celltable.addColumn(aColumn, aheader);
352 a57faaf0 Christos Stathis
                allHeaders.add(aheader);
353 7cca8bf1 Christos Stathis
                aheader.setUpdater(new FileValueUpdater(aheader));
354 a57faaf0 Christos Stathis
               
355 a57faaf0 Christos Stathis
                provider.addDataDisplay(celltable);
356 875a0179 Christos Stathis
357 a57faaf0 Christos Stathis
                VerticalPanel vp = new VerticalPanel();
358 a57faaf0 Christos Stathis
                vp.setWidth("100%");
359 d7be6c23 Christos Stathis
                vp.addStyleName("pithos-FileListContainer");
360 875a0179 Christos Stathis
361 875a0179 Christos Stathis
        vp.add(celltable);
362 875a0179 Christos Stathis
363 a57faaf0 Christos Stathis
                vp.setCellWidth(celltable, "100%");
364 63366925 Christos Stathis
        vp.addHandler(new ContextMenuHandler() {
365 63366925 Christos Stathis
            @Override
366 a2f617f8 Christos Stathis
            public void onContextMenu(final ContextMenuEvent event) {
367 a2f617f8 Christos Stathis
                    final TreeView tree = app.getSelectedTree();
368 5d18aa82 Christos Stathis
                    if (tree != null) {
369 a2f617f8 Christos Stathis
                        final int x = event.getNativeEvent().getClientX();
370 a2f617f8 Christos Stathis
                        final int y = event.getNativeEvent().getClientY();
371 a2f617f8 Christos Stathis
                        final Folder selectedFolder = app.getSelection();
372 a2f617f8 Christos Stathis
                        app.scheduleFolderHeadCommand(selectedFolder, new Command() {
373 a2f617f8 Christos Stathis
                                                
374 a2f617f8 Christos Stathis
                                                @Override
375 a2f617f8 Christos Stathis
                                                public void execute() {
376 a2f617f8 Christos Stathis
                                                        final List<File> selectedFiles = getSelectedFiles();
377 a2f617f8 Christos Stathis
                                                        Iterator<File> iter = selectedFiles.iterator();
378 a2f617f8 Christos Stathis
                                                        iterateFilesHeadCommand(iter, new Command() {
379 a2f617f8 Christos Stathis
                                                                
380 a2f617f8 Christos Stathis
                                                                @Override
381 a2f617f8 Christos Stathis
                                                                public void execute() {
382 a2f617f8 Christos Stathis
                                                        FileContextMenu contextMenu = new FileContextMenu(app, images, tree, selectedFolder, selectedFiles);
383 a2f617f8 Christos Stathis
                                                        contextMenu.setPopupPosition(x, y);
384 a2f617f8 Christos Stathis
                                                        contextMenu.show();
385 a2f617f8 Christos Stathis
                                                                }
386 a2f617f8 Christos Stathis
                                                        });
387 a2f617f8 Christos Stathis
                                                }
388 a2f617f8 Christos Stathis
                                        });
389 f1b24b82 Christos Stathis
                    }
390 63366925 Christos Stathis
            }
391 63366925 Christos Stathis
        }, ContextMenuEvent.getType());
392 a57faaf0 Christos Stathis
                initWidget(vp);
393 a57faaf0 Christos Stathis
394 875a0179 Christos Stathis
                selectionModel = new MultiSelectionModel<File>(keyProvider);
395 365865ed Christos Stathis
                selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
396 365865ed Christos Stathis
                        
397 365865ed Christos Stathis
                        @Override
398 365865ed Christos Stathis
                        public void onSelectionChange(SelectionChangeEvent event) {
399 365865ed Christos Stathis
                                app.showRelevantToolbarButtons();
400 365865ed Christos Stathis
                        }
401 365865ed Christos Stathis
                });
402 365865ed Christos Stathis
                
403 969a4d94 Christos Stathis
                celltable.setSelectionModel(selectionModel, PithosSelectionEventManager.<File> createDefaultManager());
404 a57faaf0 Christos Stathis
                
405 a57faaf0 Christos Stathis
                sinkEvents(Event.ONCONTEXTMENU);
406 efb132b8 Christos Stathis
                sinkEvents(Event.ONDBLCLICK);
407 749068ba Christos Stathis
                Pithos.preventIESelection();
408 a57faaf0 Christos Stathis
        }
409 8e61880b Christos Stathis
410 875a0179 Christos Stathis
        public List<File> getSelectedFiles() {
411 875a0179 Christos Stathis
        return new ArrayList<File>(selectionModel.getSelectedSet());
412 875a0179 Christos Stathis
        }
413 a57faaf0 Christos Stathis
        
414 efb132b8 Christos Stathis
        @Override
415 efb132b8 Christos Stathis
        public void onBrowserEvent(Event event) {
416 efb132b8 Christos Stathis
417 efb132b8 Christos Stathis
                if (DOM.eventGetType(event) == Event.ONDBLCLICK)
418 efb132b8 Christos Stathis
                        if (getSelectedFiles().size() == 1) {
419 efb132b8 Christos Stathis
                                File file = getSelectedFiles().get(0);
420 983f9ee2 Christos Stathis
                                Window.open(app.getApiPath() + file.getOwner() + file.getUri(), "_blank", "");
421 efb132b8 Christos Stathis
                                event.preventDefault();
422 efb132b8 Christos Stathis
                                return;
423 efb132b8 Christos Stathis
                        }
424 efb132b8 Christos Stathis
                super.onBrowserEvent(event);
425 efb132b8 Christos Stathis
        }
426 a57faaf0 Christos Stathis
427 a57faaf0 Christos Stathis
        /**
428 a57faaf0 Christos Stathis
         * Update the display of the file list.
429 a57faaf0 Christos Stathis
         */
430 ebead1b5 Christos Stathis
        void update() {
431 a57faaf0 Christos Stathis
                showCellTable();
432 a57faaf0 Christos Stathis
        }
433 a57faaf0 Christos Stathis
434 a57faaf0 Christos Stathis
        /**
435 a57faaf0 Christos Stathis
         * Return the proper icon based on the MIME type of the file.
436 a57faaf0 Christos Stathis
         *
437 a57faaf0 Christos Stathis
         * @param file
438 a57faaf0 Christos Stathis
         * @return the icon
439 a57faaf0 Christos Stathis
         */
440 7811b9d1 Christos Stathis
        protected ImageResource getFileIcon(File file) {
441 a57faaf0 Christos Stathis
                String mimetype = file.getContentType();
442 31d3a729 Christos Stathis
                boolean published = file.isPublished();
443 a57faaf0 Christos Stathis
                if (mimetype == null)
444 31d3a729 Christos Stathis
                        return published ? images.documentShared() : images.document();
445 a57faaf0 Christos Stathis
                mimetype = mimetype.toLowerCase();
446 a57faaf0 Christos Stathis
                if (mimetype.startsWith("application/pdf"))
447 31d3a729 Christos Stathis
                        return published ? images.pdfShared() : images.pdf();
448 a57faaf0 Christos Stathis
                else if (mimetype.endsWith("excel"))
449 31d3a729 Christos Stathis
                        return published ? images.spreadsheetShared() : images.spreadsheet();
450 a57faaf0 Christos Stathis
                else if (mimetype.endsWith("msword"))
451 31d3a729 Christos Stathis
                        return published ? images.wordprocessorShared() : images.wordprocessor();
452 a57faaf0 Christos Stathis
                else if (mimetype.endsWith("powerpoint"))
453 31d3a729 Christos Stathis
                        return published ? images.presentationShared() : images.presentation();
454 a57faaf0 Christos Stathis
                else if (mimetype.startsWith("application/zip") ||
455 a57faaf0 Christos Stathis
                                        mimetype.startsWith("application/gzip") ||
456 a57faaf0 Christos Stathis
                                        mimetype.startsWith("application/x-gzip") ||
457 a57faaf0 Christos Stathis
                                        mimetype.startsWith("application/x-tar") ||
458 a57faaf0 Christos Stathis
                                        mimetype.startsWith("application/x-gtar"))
459 31d3a729 Christos Stathis
                        return published ? images.zipShared() : images.zip();
460 a57faaf0 Christos Stathis
                else if (mimetype.startsWith("text/html"))
461 31d3a729 Christos Stathis
                        return published ? images.htmlShared() : images.html();
462 a57faaf0 Christos Stathis
                else if (mimetype.startsWith("text/plain"))
463 31d3a729 Christos Stathis
                        return published ? images.txtShared() : images.txt();
464 a57faaf0 Christos Stathis
                else if (mimetype.startsWith("image/"))
465 31d3a729 Christos Stathis
                        return published ? images.imageShared() : images.image();
466 a57faaf0 Christos Stathis
                else if (mimetype.startsWith("video/"))
467 31d3a729 Christos Stathis
                        return published ? images.videoShared() : images.video();
468 a57faaf0 Christos Stathis
                else if (mimetype.startsWith("audio/"))
469 31d3a729 Christos Stathis
                        return published ? images.audioShared() : images.audio();
470 31d3a729 Christos Stathis
                return published ? images.documentShared() : images.document();
471 a57faaf0 Christos Stathis
        }
472 a57faaf0 Christos Stathis
473 a57faaf0 Christos Stathis
        /**
474 a57faaf0 Christos Stathis
         * Fill the file cache with data.
475 a57faaf0 Christos Stathis
         */
476 875a0179 Christos Stathis
        public void setFiles(final List<File> _files) {
477 e2920e8d Christos Stathis
                if (!app.getSelectedTree().equals(app.mysharedTreeView)) {
478 e2920e8d Christos Stathis
                        if (celltable.getColumnIndex(pathColumn) != -1)
479 e2920e8d Christos Stathis
                                celltable.removeColumn(pathColumn);
480 e2920e8d Christos Stathis
                }
481 e2920e8d Christos Stathis
                else {
482 e2920e8d Christos Stathis
                        if (celltable.getColumnIndex(pathColumn) == -1)
483 e2920e8d Christos Stathis
                                celltable.insertColumn(2, pathColumn, pathHeader);
484 e2920e8d Christos Stathis
                }
485 875a0179 Christos Stathis
                files = new ArrayList<File>();
486 4a61d816 Christos Stathis
            for (File fres : _files) {
487 7b28ae07 Christos Stathis
                        files.add(fres);
488 4a61d816 Christos Stathis
            }
489 4a61d816 Christos Stathis
            
490 a57faaf0 Christos Stathis
                folderFileCount = files.size();
491 a57faaf0 Christos Stathis
                
492 7cca8bf1 Christos Stathis
                for (SortableHeader header : allHeaders) {
493 7cca8bf1 Christos Stathis
                        if (header.isSorted())
494 7cca8bf1 Christos Stathis
                                sortFiles(header.getProperty(), header.getReverseSort());
495 7cca8bf1 Christos Stathis
                }
496 7cca8bf1 Christos Stathis
                
497 4a61d816 Christos Stathis
                List<File> previousSelection = getSelectedFiles(); //Keep the previous selection
498 4a61d816 Christos Stathis
499 4a61d816 Christos Stathis
                provider.getList().clear();
500 875a0179 Christos Stathis
        provider.setList(files);
501 ef5b664d Christos Stathis
        selectionModel.clear();
502 4a61d816 Christos Stathis
            for (File f : files) {
503 4a61d816 Christos Stathis
                    if (previousSelection.contains(f))
504 4a61d816 Christos Stathis
                            selectionModel.setSelected(f, true);
505 4a61d816 Christos Stathis
            }
506 4a61d816 Christos Stathis
        
507 a19f758c Christos Stathis
        app.showFolderStatistics(folderFileCount);
508 ec9b0459 Christos Stathis
        celltable.setPageSize(folderFileCount);
509 875a0179 Christos Stathis
        }
510 a57faaf0 Christos Stathis
511 a57faaf0 Christos Stathis
        /**
512 a57faaf0 Christos Stathis
         * Does the list contains the requested filename
513 a57faaf0 Christos Stathis
         *
514 a57faaf0 Christos Stathis
         * @param fileName
515 a57faaf0 Christos Stathis
         * @return true/false
516 a57faaf0 Christos Stathis
         */
517 a57faaf0 Christos Stathis
        public boolean contains(String fileName) {
518 a57faaf0 Christos Stathis
                for (int i = 0; i < files.size(); i++)
519 a57faaf0 Christos Stathis
                        if (files.get(i).getName().equals(fileName))
520 a57faaf0 Christos Stathis
                                return true;
521 a57faaf0 Christos Stathis
                return false;
522 a57faaf0 Christos Stathis
        }
523 a57faaf0 Christos Stathis
524 a57faaf0 Christos Stathis
        public void clearSelectedRows() {
525 875a0179 Christos Stathis
                Iterator<File> it = selectionModel.getSelectedSet().iterator();
526 a57faaf0 Christos Stathis
                while(it.hasNext()){
527 a57faaf0 Christos Stathis
                        selectionModel.setSelected(it.next(),false);
528 a57faaf0 Christos Stathis
                }
529 a57faaf0 Christos Stathis
        }
530 a57faaf0 Christos Stathis
        
531 a57faaf0 Christos Stathis
        /**
532 a57faaf0 Christos Stathis
         *
533 a57faaf0 Christos Stathis
         */
534 a57faaf0 Christos Stathis
        public void selectAllRows() {
535 875a0179 Christos Stathis
                Iterator<File> it = provider.getList().iterator();
536 a57faaf0 Christos Stathis
                while(it.hasNext()){
537 a57faaf0 Christos Stathis
                        selectionModel.setSelected(it.next(),true);
538 a57faaf0 Christos Stathis
                }
539 a57faaf0 Christos Stathis
        }
540 a57faaf0 Christos Stathis
541 7811b9d1 Christos Stathis
        protected void sortFiles(final String sortingProperty, final boolean sortingType){
542 875a0179 Christos Stathis
                Collections.sort(files, new Comparator<File>() {
543 a57faaf0 Christos Stathis
544 a57faaf0 Christos Stathis
            @Override
545 875a0179 Christos Stathis
            public int compare(File arg0, File arg1) {
546 a57faaf0 Christos Stathis
                    if (sortingType){
547 a57faaf0 Christos Stathis
                            if (sortingProperty.equals("version")) {
548 875a0179 Christos Stathis
                                    return arg0.getVersion() - arg1.getVersion();
549 a57faaf0 Christos Stathis
                            } else if (sortingProperty.equals("owner")) {
550 a57faaf0 Christos Stathis
                                    return arg0.getOwner().compareTo(arg1.getOwner());
551 a57faaf0 Christos Stathis
                            } else if (sortingProperty.equals("date")) {
552 f3c8bd5b Christos Stathis
                                            if (arg0.getLastModified() != null && arg1.getLastModified() != null)
553 f3c8bd5b Christos Stathis
                                                    return arg0.getLastModified().compareTo(arg1.getLastModified());
554 f3c8bd5b Christos Stathis
                                            return 0;
555 a57faaf0 Christos Stathis
                            } else if (sortingProperty.equals("size")) {
556 875a0179 Christos Stathis
                                    return (int) (arg0.getBytes() - arg1.getBytes());
557 a57faaf0 Christos Stathis
                            } else if (sortingProperty.equals("name")) {
558 a57faaf0 Christos Stathis
                                    return arg0.getName().compareTo(arg1.getName());
559 a57faaf0 Christos Stathis
                            } else if (sortingProperty.equals("path")) {
560 a57faaf0 Christos Stathis
                                    return arg0.getUri().compareTo(arg1.getUri());
561 a57faaf0 Christos Stathis
                            } else {
562 a57faaf0 Christos Stathis
                                    return arg0.getName().compareTo(arg1.getName());
563 a57faaf0 Christos Stathis
                            }
564 a57faaf0 Christos Stathis
                    }
565 a57faaf0 Christos Stathis
                    else if (sortingProperty.equals("version")) {
566 a57faaf0 Christos Stathis
                            
567 875a0179 Christos Stathis
                            return arg1.getVersion() - arg0.getVersion();
568 a57faaf0 Christos Stathis
                    } else if (sortingProperty.equals("owner")) {
569 a57faaf0 Christos Stathis
                            
570 a57faaf0 Christos Stathis
                            return arg1.getOwner().compareTo(arg0.getOwner());
571 a57faaf0 Christos Stathis
                    } else if (sortingProperty.equals("date")) {
572 a57faaf0 Christos Stathis
                            
573 875a0179 Christos Stathis
                            return arg1.getLastModified().compareTo(arg0.getLastModified());
574 a57faaf0 Christos Stathis
                    } else if (sortingProperty.equals("size")) {
575 875a0179 Christos Stathis
                            return (int) (arg1.getBytes() - arg0.getBytes());
576 a57faaf0 Christos Stathis
                    } else if (sortingProperty.equals("name")) {
577 a57faaf0 Christos Stathis
                            
578 a57faaf0 Christos Stathis
                            return arg1.getName().compareTo(arg0.getName());
579 a57faaf0 Christos Stathis
                    } else if (sortingProperty.equals("path")) {
580 a57faaf0 Christos Stathis
                            
581 a57faaf0 Christos Stathis
                            return arg1.getUri().compareTo(arg0.getUri());
582 a57faaf0 Christos Stathis
                    } else {
583 a57faaf0 Christos Stathis
                            
584 a57faaf0 Christos Stathis
                            return arg1.getName().compareTo(arg0.getName());
585 a57faaf0 Christos Stathis
                    }
586 a57faaf0 Christos Stathis
            }
587 a57faaf0 Christos Stathis
588 a57faaf0 Christos Stathis
                });
589 a57faaf0 Christos Stathis
        }
590 a57faaf0 Christos Stathis
        
591 a57faaf0 Christos Stathis
        final class FileValueUpdater implements ValueUpdater<String>{
592 a57faaf0 Christos Stathis
                private SortableHeader header;
593 a57faaf0 Christos Stathis
                /**
594 a57faaf0 Christos Stathis
                 * 
595 a57faaf0 Christos Stathis
                 */
596 7cca8bf1 Christos Stathis
                public FileValueUpdater(SortableHeader header) {
597 a57faaf0 Christos Stathis
                        this.header=header;
598 a57faaf0 Christos Stathis
                }
599 a57faaf0 Christos Stathis
                @Override
600 ebead1b5 Christos Stathis
                public void update(String value) {
601 a57faaf0 Christos Stathis
                        header.setSorted(true);
602 a57faaf0 Christos Stathis
                        header.toggleReverseSort();
603 a57faaf0 Christos Stathis
604 a57faaf0 Christos Stathis
                for (SortableHeader otherHeader : allHeaders) {
605 a57faaf0 Christos Stathis
                  if (otherHeader != header) {
606 a57faaf0 Christos Stathis
                    otherHeader.setSorted(false);
607 a57faaf0 Christos Stathis
                    otherHeader.setReverseSort(true);
608 a57faaf0 Christos Stathis
                  }
609 a57faaf0 Christos Stathis
                }
610 a57faaf0 Christos Stathis
                celltable.redrawHeaders();
611 7cca8bf1 Christos Stathis
                sortFiles(header.getProperty(), header.getReverseSort());
612 ebead1b5 Christos Stathis
                FileList.this.update();                        
613 a57faaf0 Christos Stathis
                }
614 a57faaf0 Christos Stathis
                
615 a57faaf0 Christos Stathis
        }
616 a57faaf0 Christos Stathis
617 a57faaf0 Christos Stathis
        /**
618 a57faaf0 Christos Stathis
         * Shows the files in the cellTable 
619 875a0179 Christos Stathis
     */
620 a57faaf0 Christos Stathis
        private void showCellTable(){
621 a57faaf0 Christos Stathis
                provider.setList(files);
622 a57faaf0 Christos Stathis
                
623 a57faaf0 Christos Stathis
                provider.refresh();
624 a57faaf0 Christos Stathis
                
625 a57faaf0 Christos Stathis
                //celltable.redraw();
626 a57faaf0 Christos Stathis
                celltable.redrawHeaders();                
627 a57faaf0 Christos Stathis
        }
628 a2f617f8 Christos Stathis
        
629 a2f617f8 Christos Stathis
        void iterateFilesHeadCommand(final Iterator<File> iter, final Command callback) {
630 a2f617f8 Christos Stathis
                if (iter.hasNext()) {
631 a2f617f8 Christos Stathis
                        File f = iter.next();
632 a2f617f8 Christos Stathis
                        app.scheduleFileHeadCommand(f, new Command() {
633 a2f617f8 Christos Stathis
                                
634 a2f617f8 Christos Stathis
                                @Override
635 a2f617f8 Christos Stathis
                                public void execute() {
636 a2f617f8 Christos Stathis
                                        iterateFilesHeadCommand(iter, callback);
637 a2f617f8 Christos Stathis
                                }
638 a2f617f8 Christos Stathis
                        });
639 a2f617f8 Christos Stathis
                }
640 a2f617f8 Christos Stathis
                else if (callback != null)
641 a2f617f8 Christos Stathis
                        callback.execute();
642 a2f617f8 Christos Stathis
        }
643 3646552f Christos Stathis
644 3646552f Christos Stathis
        public void selectByUrl(List<String> selectedUrls) {
645 3646552f Christos Stathis
                Set<File> previous = selectionModel.getSelectedSet();
646 3646552f Christos Stathis
                for (File f : previous)
647 3646552f Christos Stathis
                        selectionModel.setSelected(f, false);
648 3646552f Christos Stathis
                
649 3646552f Christos Stathis
                int i = 0;
650 61e48609 Christos Stathis
                boolean scrolled = false;
651 3646552f Christos Stathis
                for (File f : files) {
652 3646552f Christos Stathis
                        if (selectedUrls.contains(app.getApiPath() + f.getOwner() + f.getUri())) {
653 3646552f Christos Stathis
                                selectionModel.setSelected(f, true);
654 61e48609 Christos Stathis
                                if (!scrolled) {
655 61e48609 Christos Stathis
                                        celltable.getRowElement(i).getCells().getItem(0).scrollIntoView();
656 61e48609 Christos Stathis
                                        scrolled = true;
657 61e48609 Christos Stathis
                                }
658 3646552f Christos Stathis
                        }
659 3646552f Christos Stathis
                        i++;
660 3646552f Christos Stathis
                }
661 3646552f Christos Stathis
        }
662 a57faaf0 Christos Stathis
}