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