Merge the web_client_signed branch. Now the Web client communicates solely through...
[pithos] / gss / src / gr / ebs / gss / client / SearchResults.java
1 /*\r
2  * Copyright 2007, 2008, 2009 Electronic Business Systems Ltd.\r
3  *\r
4  * This file is part of GSS.\r
5  *\r
6  * GSS is free software: you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation, either version 3 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * GSS is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with GSS.  If not, see <http://www.gnu.org/licenses/>.\r
18  */\r
19 package gr.ebs.gss.client;\r
20 \r
21 import gr.ebs.gss.client.dnd.DnDFocusPanel;\r
22 import gr.ebs.gss.client.rest.ExecuteGet;\r
23 import gr.ebs.gss.client.rest.ExecuteMultipleHead;\r
24 import gr.ebs.gss.client.rest.resource.FileResource;\r
25 import gr.ebs.gss.client.rest.resource.SearchResource;\r
26 import gr.ebs.gss.client.rest.resource.UserResource;\r
27 \r
28 import java.util.ArrayList;\r
29 import java.util.Collections;\r
30 import java.util.Comparator;\r
31 import java.util.List;\r
32 \r
33 import com.google.gwt.core.client.GWT;\r
34 import com.google.gwt.http.client.URL;\r
35 import com.google.gwt.i18n.client.DateTimeFormat;\r
36 import com.google.gwt.user.client.DOM;\r
37 import com.google.gwt.user.client.DeferredCommand;\r
38 import com.google.gwt.user.client.Event;\r
39 import com.google.gwt.user.client.IncrementalCommand;\r
40 import com.google.gwt.user.client.ui.AbstractImagePrototype;\r
41 import com.google.gwt.user.client.ui.ClickListener;\r
42 import com.google.gwt.user.client.ui.Composite;\r
43 import com.google.gwt.user.client.ui.Grid;\r
44 import com.google.gwt.user.client.ui.HTML;\r
45 import com.google.gwt.user.client.ui.HasHorizontalAlignment;\r
46 import com.google.gwt.user.client.ui.HorizontalPanel;\r
47 import com.google.gwt.user.client.ui.SourcesTableEvents;\r
48 import com.google.gwt.user.client.ui.TableListener;\r
49 import com.google.gwt.user.client.ui.VerticalPanel;\r
50 import com.google.gwt.user.client.ui.Widget;\r
51 \r
52 /**\r
53  * A composite that displays a list of search results for a particular query on\r
54  * files.\r
55  */\r
56 public class SearchResults extends Composite implements TableListener, ClickListener {\r
57 \r
58         private HTML prevButton = new HTML("<a href='javascript:;'>&lt; Previous</a>", true);\r
59 \r
60         private HTML nextButton = new HTML("<a href='javascript:;'>Next &gt;</a>", true);\r
61 \r
62         private int startIndex = 0;\r
63 \r
64         /**\r
65          * A constant that denotes the completion of an IncrementalCommand.\r
66          */\r
67         public static final boolean DONE = false;\r
68 \r
69         private boolean clickControl = false;\r
70 \r
71         private boolean clickShift = false;\r
72 \r
73         private int firstShift = -1;\r
74 \r
75         private ArrayList<Integer> selectedRows = new ArrayList<Integer>();\r
76 \r
77         /**\r
78          * The context menu for the selected file.\r
79          */\r
80         final DnDFocusPanel contextMenu;\r
81 \r
82         /**\r
83          * Specifies that the images available for this composite will be the ones\r
84          * available in FileContextMenu.\r
85          */\r
86         public interface Images extends FileContextMenu.Images, Folders.Images {\r
87 \r
88                 @Resource("gr/ebs/gss/resources/blank.gif")\r
89                 AbstractImagePrototype blank();\r
90 \r
91                 @Resource("gr/ebs/gss/resources/asc.png")\r
92                 AbstractImagePrototype asc();\r
93 \r
94                 @Resource("gr/ebs/gss/resources/desc.png")\r
95                 AbstractImagePrototype desc();\r
96         }\r
97 \r
98         /**\r
99          * A label with the number of files in this folder.\r
100          */\r
101         private HTML countLabel = new HTML();\r
102 \r
103         /**\r
104          * The table widget with the file list.\r
105          */\r
106         private Grid table;// = new Grid(GSS.VISIBLE_FILE_COUNT + 1, 8);\r
107 \r
108         /**\r
109          * The navigation bar for paginating the results.\r
110          */\r
111         private HorizontalPanel navBar = new HorizontalPanel();\r
112 \r
113         /**\r
114          * The number of files in this folder.\r
115          */\r
116         int folderFileCount;\r
117 \r
118         /**\r
119          * A cache of the files in the list.\r
120          */\r
121         private List<FileResource> files;\r
122 \r
123 \r
124         /**\r
125          * The widget's image bundle.\r
126          */\r
127         private final Images images;\r
128 \r
129         private String sortingProperty = "name";\r
130 \r
131         private boolean sortingType = true;\r
132 \r
133         private HTML nameLabel;\r
134 \r
135         private HTML versionLabel;\r
136 \r
137         private HTML sizeLabel;\r
138 \r
139         private HTML dateLabel;\r
140 \r
141         private HTML ownerLabel;\r
142 \r
143         private HTML pathLabel;\r
144 \r
145         private HTML searchResults = new HTML("Results for search:");\r
146 \r
147         /**\r
148          * Construct the file list widget. This entails setting up the widget\r
149          * layout, fetching the number of files in the current folder from the\r
150          * server and filling the local file cache of displayed files with data from\r
151          * the server, as well.\r
152          *\r
153          * @param _images\r
154          */\r
155         public SearchResults(final Images _images) {\r
156                 images = _images;\r
157                 table = new Grid(GSS.VISIBLE_FILE_COUNT + 1, 8){\r
158                         public void onBrowserEvent(Event event) {\r
159                                 if (files == null || files.size() == 0)\r
160                                         return;\r
161                                 if (DOM.eventGetType(event) == Event.ONCONTEXTMENU && selectedRows.size() != 0) {\r
162                                         FileContextMenu fm = new FileContextMenu(images, false);\r
163                                         fm.onClick(contextMenu);\r
164                                 }\r
165                                 if (DOM.eventGetType(event) == Event.ONCLICK) {\r
166                                         if (DOM.eventGetCtrlKey(event))\r
167                                                 clickControl = true;\r
168                                         else\r
169                                                 clickControl = false;\r
170                                         if (DOM.eventGetShiftKey(event)) {\r
171                                                 clickShift = true;\r
172                                                 if (selectedRows.size() == 1)\r
173                                                         firstShift = selectedRows.get(0) - startIndex;\r
174                                                 //event.preventDefault();\r
175                                         } else {\r
176                                                 clickShift = false;\r
177                                                 firstShift = -1;\r
178                                                 //event.preventDefault();\r
179                                         }\r
180                                 }\r
181 \r
182                                 super.onBrowserEvent(event);\r
183                         }\r
184                 };\r
185                 prevButton.addClickListener(this);\r
186                 nextButton.addClickListener(this);\r
187 \r
188                 contextMenu = new DnDFocusPanel(new HTML(images.fileContextMenu().getHTML()));\r
189                 contextMenu.addClickListener(new FileContextMenu(images, false));\r
190                 GSS.get().getDragController().makeDraggable(contextMenu);\r
191 \r
192                 // Setup the table.\r
193                 table.setCellSpacing(0);\r
194                 table.setCellPadding(2);\r
195                 table.setWidth("100%");\r
196 \r
197                 // Hook up events.\r
198                 table.addTableListener(this);\r
199 \r
200                 // Create the 'navigation' bar at the upper-right.\r
201                 final HorizontalPanel innerNavBar = new HorizontalPanel();\r
202                 innerNavBar.setStyleName("gss-ListNavBar");\r
203                 innerNavBar.setSpacing(8);\r
204                 innerNavBar.add(prevButton);\r
205                 innerNavBar.add(countLabel);\r
206                 innerNavBar.add(nextButton);\r
207                 navBar.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);\r
208                 navBar.add(innerNavBar);\r
209                 navBar.setWidth("100%");\r
210                 VerticalPanel vp = new VerticalPanel();\r
211                 vp.add(searchResults);\r
212                 searchResults.addStyleName("gss-searchlabel");\r
213                 vp.add(table);\r
214                 initWidget(vp);\r
215                 table.setStyleName("gss-List");\r
216                 initTable();\r
217                 DeferredCommand.addCommand(new IncrementalCommand() {\r
218 \r
219                         public boolean execute() {\r
220                                 return fetchRootFolder();\r
221                         }\r
222                 });\r
223                 table.sinkEvents(Event.ONCONTEXTMENU);\r
224                 table.sinkEvents(Event.ONMOUSEUP);\r
225                 table.sinkEvents(Event.ONCLICK);\r
226                 table.sinkEvents(Event.ONKEYDOWN);\r
227                 preventIESelection();\r
228         }\r
229 \r
230         public void onClick(Widget sender) {\r
231                 if (sender == nextButton) {\r
232                         // Move forward a page.\r
233                         clearSelectedRows();\r
234                         startIndex += GSS.VISIBLE_FILE_COUNT;\r
235                         if (startIndex >= folderFileCount)\r
236                                 startIndex -= GSS.VISIBLE_FILE_COUNT;\r
237                         else\r
238                                 update();\r
239                 } else if (sender == prevButton) {\r
240                         clearSelectedRows();\r
241                         // Move back a page.\r
242                         startIndex -= GSS.VISIBLE_FILE_COUNT;\r
243                         if (startIndex < 0)\r
244                                 startIndex = 0;\r
245                         else\r
246                                 update();\r
247                 }\r
248         }\r
249 \r
250 \r
251 \r
252         /**\r
253          * Retrieve the root folder for the current user.\r
254          *\r
255          * @return true if the retrieval was successful\r
256          */\r
257         protected boolean fetchRootFolder() {\r
258                 UserResource user = GSS.get().getCurrentUserResource();\r
259                 if (user == null)\r
260                         return !DONE;\r
261                 updateFileCache("");\r
262                 return DONE;\r
263         }\r
264 \r
265         /*\r
266          * (non-Javadoc)\r
267          *\r
268          * @see com.google.gwt.user.client.ui.TableListener#onCellClicked(com.google.gwt.user.client.ui.SourcesTableEvents,\r
269          *      int, int)\r
270          */\r
271         public void onCellClicked(@SuppressWarnings("unused") SourcesTableEvents sender, int row, @SuppressWarnings("unused") int cell) {\r
272                 // Select the row that was clicked (-1 to account for header row).\r
273                 if (row > folderFileCount)\r
274                         return;\r
275                 if (clickShift) {\r
276                         GWT.log("ROW is:" + row + " fs:" + firstShift, null);\r
277                         if (firstShift == -1)\r
278                                 firstShift = row;\r
279                         else if (row > firstShift) {\r
280                                 clearSelectedRows();\r
281                                 for (int i = firstShift; i < row; i++) {\r
282                                         selectedRows.add(startIndex + i);\r
283                                         styleRow(i, true);\r
284                                 }\r
285                                 GSS.get().setCurrentSelection(getSelectedFiles());\r
286                                 //contextMenu.setFiles(getSelectedFiles());\r
287                                 table.setWidget(row, 0, contextMenu);\r
288                         } else if (row != -1 && row == firstShift) {\r
289                                 selectedRows.add(row);\r
290                                 selectedRows.add(row - 1);\r
291                                 styleRow(row, true);\r
292                                 styleRow(row - 1, true);\r
293                         } else if (row < firstShift) {\r
294                                 GWT.log("ROW is:" + row + " fs:" + firstShift, null);\r
295                                 clearSelectedRows();\r
296 \r
297                                 for (int i = firstShift; i >= row - 1; i--) {\r
298                                         selectedRows.add(startIndex + i);\r
299                                         styleRow(i, true);\r
300                                 }\r
301                                 GSS.get().setCurrentSelection(getSelectedFiles());\r
302                                 table.setWidget(row, 0, contextMenu);\r
303                                 //contextMenu.setFiles(getSelectedFiles());\r
304                         }\r
305 \r
306                 } else if (row > 0)\r
307                         selectRow(row - 1);\r
308 \r
309         }\r
310 \r
311         /**\r
312          * Initializes the table so that it contains enough rows for a full page of\r
313          * files.\r
314          */\r
315         private void initTable() {\r
316 \r
317                 nameLabel = new HTML("Name");\r
318                 nameLabel.addClickListener(new ClickListener() {\r
319 \r
320                         public void onClick(Widget sender) {\r
321                                 sortFiles("name");\r
322                                 update();\r
323 \r
324                         }\r
325 \r
326                 });\r
327                 versionLabel = new HTML("Version");\r
328                 versionLabel.addClickListener(new ClickListener() {\r
329 \r
330                         public void onClick(Widget sender) {\r
331                                 sortFiles("version");\r
332                                 update();\r
333 \r
334                         }\r
335 \r
336                 });\r
337                 sizeLabel = new HTML("Size");\r
338                 sizeLabel.addClickListener(new ClickListener() {\r
339 \r
340                         public void onClick(Widget sender) {\r
341                                 sortFiles("size");\r
342                                 update();\r
343 \r
344                         }\r
345 \r
346                 });\r
347                 dateLabel = new HTML("Date");\r
348                 dateLabel.addClickListener(new ClickListener() {\r
349 \r
350                         public void onClick(Widget sender) {\r
351                                 sortFiles("date");\r
352                                 update();\r
353 \r
354                         }\r
355 \r
356                 });\r
357                 ownerLabel = new HTML("Owner");\r
358                 ownerLabel.addClickListener(new ClickListener() {\r
359 \r
360                         public void onClick(Widget sender) {\r
361                                 sortFiles("owner");\r
362                                 update();\r
363 \r
364                         }\r
365 \r
366                 });\r
367 \r
368                 pathLabel = new HTML("Path");\r
369                 pathLabel.addClickListener(new ClickListener() {\r
370 \r
371                         public void onClick(Widget sender) {\r
372                                 sortFiles("path");\r
373                                 update();\r
374 \r
375                         }\r
376 \r
377                 });\r
378                 // Create the header row.\r
379                 table.setText(0, 0, "");\r
380                 // table.setText(0, 1, "Name");\r
381                 table.setWidget(0, 1, nameLabel);\r
382                 table.setWidget(0, 2, ownerLabel);\r
383                 // table.setText(0, 3, "Version");\r
384                 table.setWidget(0, 3, pathLabel);\r
385                 table.setWidget(0, 4, versionLabel);\r
386                 // table.setText(0, 4, "Size");\r
387                 table.setWidget(0, 5, sizeLabel);\r
388                 // table.setText(0, 5, "Date");\r
389                 table.setWidget(0, 6, dateLabel);\r
390                 table.setWidget(0, 7, navBar);\r
391                 table.getRowFormatter().setStyleName(0, "gss-ListHeader");\r
392 \r
393                 // Initialize the rest of the rows.\r
394                 for (int i = 1; i < GSS.VISIBLE_FILE_COUNT + 1; ++i) {\r
395                         table.setText(i, 0, "");\r
396                         table.setText(i, 1, "");\r
397                         table.setText(i, 2, "");\r
398                         table.setText(i, 3, "");\r
399                         table.setText(i, 4, "");\r
400                         table.setText(i, 5, "");\r
401                         table.setText(i, 6, "");\r
402                         table.getCellFormatter().setWordWrap(i, 0, false);\r
403                         table.getCellFormatter().setWordWrap(i, 1, false);\r
404                         table.getCellFormatter().setWordWrap(i, 2, false);\r
405                         table.getCellFormatter().setWordWrap(i, 3, false);\r
406                         table.getCellFormatter().setWordWrap(i, 4, false);\r
407                         table.getCellFormatter().setWordWrap(i, 5, false);\r
408                         table.getCellFormatter().setWordWrap(i, 6, false);\r
409                         // table.getFlexCellFormatter().setColSpan(i, 5, 2);\r
410                 }\r
411                 prevButton.setVisible(false);\r
412                 nextButton.setVisible(false);\r
413 \r
414         }\r
415 \r
416         /**\r
417          * Selects the given row (relative to the current page).\r
418          *\r
419          * @param row the row to be selected\r
420          */\r
421         private void selectRow(final int row) {\r
422                 if (row < folderFileCount) {\r
423                         if (clickControl)\r
424                                 if (selectedRows.contains(row)) {\r
425                                         int i = selectedRows.indexOf(startIndex + row);\r
426                                         selectedRows.remove(i);\r
427                                         styleRow(row, false);\r
428                                 } else {\r
429                                         for (int r : selectedRows) {\r
430                                                 int prow = r - startIndex;\r
431                                                 table.setWidget(prow + 1, 0, images.document().createImage());\r
432                                         }\r
433                                         selectedRows.add(startIndex + row);\r
434                                         styleRow(row, true);\r
435 \r
436                                 }\r
437                         else {\r
438                                 clearSelectedRows();\r
439                                 selectedRows.add(startIndex + row);\r
440                                 styleRow(row, true);\r
441                         }\r
442                         if (selectedRows.size() == 1)\r
443                                 GSS.get().setCurrentSelection(files.get(selectedRows.get(0)));\r
444                         else\r
445                                 GSS.get().setCurrentSelection(getSelectedFiles());\r
446                         //contextMenu.setFiles(getSelectedFiles());\r
447                         table.setWidget(row + 1, 0, contextMenu);\r
448 \r
449                 }\r
450                 /*if (row < folderFileCount) {\r
451 \r
452                         styleRow(selectedRow, false);\r
453                         styleRow(row, true);\r
454 \r
455                         previous = selectedRow;\r
456                         selectedRow = row;\r
457                         GSS.get().setCurrentSelection(files.get(selectedRow));\r
458 \r
459                         if (previous >= 0)\r
460                                 table.setWidget(previous + 1, 0, images.document().createImage());\r
461                         table.setWidget(selectedRow + 1, 0, contextMenu);\r
462                 }\r
463                 */\r
464         }\r
465 \r
466         public List<FileResource> getSelectedFiles() {\r
467                 List<FileResource> result = new ArrayList();\r
468                 for (int i : selectedRows)\r
469                         result.add(files.get(i));\r
470                 return result;\r
471         }\r
472 \r
473         /**\r
474          * Make the specified row look like selected or not, according to the\r
475          * <code>selected</code> flag.\r
476          *\r
477          * @param row\r
478          * @param selected\r
479          */\r
480         void styleRow(final int row, final boolean selected) {\r
481                 if (row != -1 && row >= 0)\r
482                         if (selected)\r
483                                 table.getRowFormatter().addStyleName(row + 1, "gss-SelectedRow");\r
484                         else\r
485                                 table.getRowFormatter().removeStyleName(row + 1, "gss-SelectedRow");\r
486         }\r
487 \r
488         /**\r
489          * Update the display of the file list.\r
490          */\r
491         void update() {\r
492                 int count = folderFileCount;\r
493                 int max = startIndex + GSS.VISIBLE_FILE_COUNT;\r
494                 if (max > count)\r
495                         max = count;\r
496 \r
497                 if (folderFileCount == 0) {\r
498                         countLabel.setText("no files");\r
499                         prevButton.setVisible(false);\r
500                         nextButton.setVisible(false);\r
501                 } else if (folderFileCount < GSS.VISIBLE_FILE_COUNT) {\r
502                         countLabel.setText(folderFileCount + " files");\r
503                         prevButton.setVisible(false);\r
504                         nextButton.setVisible(false);\r
505                 } else {\r
506                         countLabel.setText("" + (startIndex + 1) + " - " + max + " of " + count + " files");\r
507                         prevButton.setVisible(startIndex != 0);\r
508                         nextButton.setVisible(startIndex + GSS.VISIBLE_FILE_COUNT < count);\r
509                 }\r
510                 // Show the selected files.\r
511                 int i = 1;\r
512                 for (; i < GSS.VISIBLE_FILE_COUNT + 1; ++i) {\r
513                         // Don't read past the end.\r
514                         // if (i > folderFileCount)\r
515                         // break;\r
516                         if (startIndex + i > folderFileCount)\r
517                                 break;\r
518                         // Add a new row to the table, then set each of its columns to the\r
519                         // proper values.\r
520                         table.setWidget(i, 0, images.document().createImage());\r
521                         FileResource fileHeader = files.get(startIndex + i - 1);\r
522                         table.getRowFormatter().addStyleName(i, "gss-fileRow");\r
523                         table.setHTML(i, 1, fileHeader.getName());\r
524                         table.setText(i, 2, fileHeader.getOwner());\r
525                         table.setText(i, 3, fileHeader.getPath());\r
526                         table.setText(i, 4, String.valueOf(fileHeader.getVersion()));\r
527                         table.setText(i, 5, String.valueOf(fileHeader.getFileSizeAsString()));\r
528                         final DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy");\r
529                         table.setText(i, 6, formatter.format(fileHeader.getCreationDate()));\r
530 \r
531                 }\r
532 \r
533                 // Clear any remaining slots.\r
534                 for (; i < GSS.VISIBLE_FILE_COUNT + 1; ++i) {\r
535                         table.setHTML(i, 0, "&nbsp;");\r
536                         table.setHTML(i, 1, "&nbsp;");\r
537                         table.setHTML(i, 2, "&nbsp;");\r
538                         table.setHTML(i, 3, "&nbsp;");\r
539                         table.setHTML(i, 4, "&nbsp;");\r
540                         table.setHTML(i, 5, "&nbsp;");\r
541                         table.setHTML(i, 6, "&nbsp;");\r
542                         table.setHTML(i, 7, "&nbsp;");\r
543                 }\r
544 \r
545                 // Reset the selected line.\r
546                 // styleRow(selectedRow, false);\r
547                 // selectedRow = -1;\r
548 \r
549         }\r
550 \r
551         /**\r
552          * Adjust the height of the table by adding and removing rows as necessary.\r
553          *\r
554          * @param newHeight the new height to reach\r
555          */\r
556         void resizeTableHeight(final int newHeight) {\r
557                 GWT.log("Panel: " + newHeight + ", parent: " + table.getParent().getOffsetHeight(), null);\r
558                 // Fill the rest with empty slots.\r
559                 if (newHeight > table.getOffsetHeight())\r
560                         while (newHeight > table.getOffsetHeight()) {\r
561                                 // table.setHTML(table.getRowCount(), 5, "&nbsp;");\r
562                                 table.resizeRows(table.getRowCount() + 1);\r
563                                 GWT.log("Table: " + table.getOffsetHeight() + ", rows: " + table.getRowCount(), null);\r
564                         }\r
565                 else\r
566                         while (newHeight < table.getOffsetHeight()) {\r
567                                 // table.setHTML(table.getRowCount(), 5, "&nbsp;");\r
568                                 table.resizeRows(table.getRowCount() - 1);\r
569                                 GWT.log("Table: " + table.getOffsetHeight() + ", rows: " + table.getRowCount(), null);\r
570                         }\r
571         }\r
572 \r
573         /**\r
574          * Update the file cache with data from the server.\r
575          *\r
576          * @param userId the ID of the current user\r
577          */\r
578         public void updateFileCache( String query) {\r
579                 clearSelectedRows();\r
580                 sortingProperty = "name";\r
581                 sortingType = true;\r
582                 startIndex = 0;\r
583                 GSS.get().showLoadingIndicator();\r
584                 if (query == null || query.trim().equals("")) {\r
585                         searchResults.setHTML("You must specify a query");\r
586                         setFiles(new ArrayList());\r
587                         update();\r
588                         GSS.get().hideLoadingIndicator();\r
589                 } else{\r
590                         searchResults.setHTML("Search results for " + query);\r
591                         ExecuteGet<SearchResource> eg = new ExecuteGet<SearchResource>(SearchResource.class, GSS.GSS_REST_PATH+"search/"+URL.encodeComponent(query)){\r
592 \r
593                                 @Override\r
594                                 public void onComplete() {\r
595                                         SearchResource s = getResult();\r
596                                         ExecuteMultipleHead<FileResource> ef = new ExecuteMultipleHead<FileResource>(FileResource.class, s.getFiles().toArray(new String[0])){\r
597 \r
598                                                 @Override\r
599                                                 public void onComplete() {\r
600                                                         setFiles(getResult());\r
601                                                         update();\r
602                                                 }\r
603 \r
604                                                 public void onError(String p, Throwable throwable) {\r
605                                                         // TODO Auto-generated method stub\r
606 \r
607                                                 }\r
608 \r
609 \r
610                                                 public void onError(Throwable t) {\r
611                                                         // TODO Auto-generated method stub\r
612 \r
613                                                 }\r
614 \r
615                                         };\r
616                                         DeferredCommand.addCommand(ef);\r
617                                 }\r
618 \r
619                                 public void onError(Throwable t) {\r
620                                         GSS.get().displayError("Unable to perform search:"+t.getMessage());\r
621                                         updateFileCache("");\r
622                                 }\r
623 \r
624                         };\r
625                         DeferredCommand.addCommand(eg);\r
626                 }\r
627                 /*\r
628                         service.searchFiles(userId, query, new AsyncCallback() {\r
629 \r
630                         public void onSuccess(final Object result) {\r
631                                 final List<FileResource> f = (List<FileResource>) result;\r
632                                 // GWT.log(f[0].toString(), null);\r
633                                 setFiles(f);\r
634                                 update();\r
635                                 GSS.get().hideLoadingIndicator();\r
636                         }\r
637 \r
638                         public void onFailure(final Throwable caught) {\r
639                                 GWT.log("", caught);\r
640                                 GSS.get().hideLoadingIndicator();\r
641                                 if (caught instanceof RpcException)\r
642                                         GSS.get().displayError("An error occurred while " + "communicating with the server: " + caught.getMessage());\r
643                                 else\r
644                                         GSS.get().displayError(caught.getMessage());\r
645                         }\r
646 \r
647                 });\r
648                 */\r
649         }\r
650 \r
651         /**\r
652          * Fill the file cache with data.\r
653          *\r
654          * @param _files\r
655          * @param filePaths the files to set\r
656          */\r
657         void setFiles(final List<FileResource> _files) {\r
658                 files = _files;\r
659                 Collections.sort(files, new Comparator<FileResource>() {\r
660 \r
661                         public int compare(FileResource arg0, FileResource arg1) {\r
662                                 return arg0.getName().compareTo(arg1.getName());\r
663 \r
664                         }\r
665 \r
666                 });\r
667                 folderFileCount = files.size();\r
668                 GWT.log("File count:" + folderFileCount, null);\r
669         }\r
670 \r
671         private void sortFiles(final String sortProperty) {\r
672                 if (sortProperty.equals(sortingProperty))\r
673                         sortingType = !sortingType;\r
674                 else {\r
675                         sortingProperty = sortProperty;\r
676                         sortingType = true;\r
677                 }\r
678                 clearLabels();\r
679                 clearSelectedRows();\r
680                 if (files == null || files.size() == 0)\r
681                         return;\r
682                 Collections.sort(files, new Comparator<FileResource>() {\r
683 \r
684                         public int compare(FileResource arg0, FileResource arg1) {\r
685                                 if (sortingType)\r
686                                         if (sortProperty.equals("version")) {\r
687                                                 versionLabel.setHTML("Version&nbsp;" + images.desc().getHTML());\r
688                                                 return new Integer(arg0.getVersion()).compareTo(new Integer(arg1.getVersion()));\r
689                                         } else if (sortProperty.equals("owner")) {\r
690                                                 ownerLabel.setHTML("Owner&nbsp;" + images.desc().getHTML());\r
691                                                 GWT.log(arg0.getOwner() + "/" + arg1.getOwner(), null);\r
692                                                 return arg0.getOwner().compareTo(arg1.getOwner());\r
693                                         } else if (sortProperty.equals("date")) {\r
694                                                 dateLabel.setHTML("Date&nbsp;" + images.desc().getHTML());\r
695                                                 return arg0.getCreationDate().compareTo(arg1.getCreationDate());\r
696                                         } else if (sortProperty.equals("size")) {\r
697                                                 sizeLabel.setHTML("Size&nbsp;" + images.desc().getHTML());\r
698                                                 return new Long(arg0.getContentLength()).compareTo(new Long(arg1.getContentLength()));\r
699                                         } else if (sortProperty.equals("name")) {\r
700                                                 nameLabel.setHTML("Name&nbsp;" + images.desc().getHTML());\r
701                                                 return arg0.getName().compareTo(arg1.getName());\r
702                                         } else if (sortProperty.equals("path")) {\r
703                                                 pathLabel.setHTML("Path&nbsp;" + images.desc().getHTML());\r
704                                                 return arg0.getPath().compareTo(arg1.getPath());\r
705                                         } else {\r
706                                                 nameLabel.setHTML("Name&nbsp;" + images.desc().getHTML());\r
707                                                 return arg0.getName().compareTo(arg1.getName());\r
708                                         }\r
709                                 else if (sortProperty.equals("version")) {\r
710                                         versionLabel.setHTML("Version&nbsp;" + images.asc().getHTML());\r
711                                         return new Integer(arg1.getVersion()).compareTo(new Integer(arg0.getVersion()));\r
712                                 } else if (sortProperty.equals("owner")) {\r
713                                         ownerLabel.setHTML("Owner&nbsp;" + images.asc().getHTML());\r
714                                         return arg1.getOwner().compareTo(arg0.getOwner());\r
715                                 } else if (sortProperty.equals("date")) {\r
716                                         dateLabel.setHTML("Date&nbsp;" + images.asc().getHTML());\r
717                                         return arg1.getCreationDate().compareTo(arg0.getCreationDate());\r
718                                 } else if (sortProperty.equals("size")) {\r
719                                         sizeLabel.setHTML("Size&nbsp;" + images.asc().getHTML());\r
720                                         return new Long(arg1.getContentLength()).compareTo(new Long(arg0.getContentLength()));\r
721                                 } else if (sortProperty.equals("name")) {\r
722                                         nameLabel.setHTML("Name&nbsp;" + images.asc().getHTML());\r
723                                         return arg1.getName().compareTo(arg0.getName());\r
724                                 } else if (sortProperty.equals("path")) {\r
725                                         pathLabel.setHTML("Path&nbsp;" + images.asc().getHTML());\r
726                                         return arg1.getPath().compareTo(arg0.getPath());\r
727                                 } else {\r
728                                         nameLabel.setHTML("Name&nbsp;" + images.asc().getHTML());\r
729                                         return arg1.getName().compareTo(arg0.getName());\r
730                                 }\r
731                         }\r
732 \r
733                 });\r
734         }\r
735 \r
736         private void clearLabels() {\r
737                 nameLabel.setText("Name");\r
738                 versionLabel.setText("Version");\r
739                 sizeLabel.setText("Size");\r
740                 dateLabel.setText("Date");\r
741                 ownerLabel.setText("Owner");\r
742                 pathLabel.setText("Path");\r
743         }\r
744 \r
745         /**\r
746          * Retrieve the table.\r
747          *\r
748          * @return the table\r
749          */\r
750         Grid getTable() {\r
751                 return table;\r
752         }\r
753 \r
754         /**\r
755          * Does the list contains the requested filename\r
756          *\r
757          * @param fileName\r
758          * @return true/false\r
759          */\r
760         public boolean contains(String fileName) {\r
761                 for (int i = 0; i < files.size(); i++)\r
762                         if (files.get(i).getName().equals(fileName))\r
763                                 return true;\r
764                 return false;\r
765         }\r
766 \r
767         public void clearSelectedRows() {\r
768                 for (int r : selectedRows) {\r
769                         int row = r - startIndex;\r
770                         styleRow(row, false);\r
771                         table.setWidget(row + 1, 0, images.document().createImage());\r
772                 }\r
773                 selectedRows.clear();\r
774                 Object sel = GSS.get().getCurrentSelection();\r
775                 if (sel instanceof FileResource || sel instanceof List)\r
776                         GSS.get().setCurrentSelection(null);\r
777         }\r
778 \r
779         public static native void preventIESelection() /*-{\r
780              $doc.body.onselectstart = function () { return false; };\r
781          }-*/;\r
782 \r
783         public static native void enableIESelection() /*-{\r
784          if ($doc.body.onselectstart != null)\r
785              $doc.body.onselectstart = null;\r
786          }-*/;\r
787 \r
788         /**\r
789          *\r
790          */\r
791         public void selectAllRows() {\r
792                 clearSelectedRows();\r
793                 int count = folderFileCount;\r
794                 if (count == 0)\r
795                         return;\r
796                 int max = startIndex + GSS.VISIBLE_FILE_COUNT;\r
797                 if (max > count)\r
798                         max = count;\r
799                 int i = 1;\r
800                 for (; i < GSS.VISIBLE_FILE_COUNT + 1; ++i) {\r
801                         // Don't read past the end.\r
802                         // if (i > folderFileCount)\r
803                         // break;\r
804                         if (startIndex + i > folderFileCount)\r
805                                 break;\r
806                         selectedRows.add(startIndex + i - 1);\r
807                         styleRow(i - 1, true);\r
808                 }\r
809                 GSS.get().setCurrentSelection(getSelectedFiles());\r
810                 //contextMenu.setFiles(getSelectedFiles());\r
811                 table.setWidget(i - 1, 0, contextMenu);\r
812 \r
813         }\r
814 \r
815 }\r