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